diff --git a/package-lock.json b/package-lock.json index e7a22db162..dfbdc27155 100644 --- a/package-lock.json +++ b/package-lock.json @@ -127,14 +127,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "app.territoiresentransitions.react/node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "app.territoiresentransitions.react/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", "dev": true, @@ -2029,8 +2021,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "engines": { "node": ">=6.9.0" } @@ -2120,12 +2113,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "license": "MIT", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -2134,15 +2128,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -2170,8 +2165,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "license": "MIT", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -2222,10 +2218,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2259,8 +2256,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "engines": { "node": ">=6.9.0" } @@ -2281,11 +2279,12 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -2340,8 +2339,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } @@ -2383,8 +2383,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2393,10 +2394,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "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.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2406,12 +2408,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2421,12 +2424,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "dev": true, - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2623,10 +2626,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2636,10 +2640,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2669,10 +2674,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2768,10 +2774,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2795,10 +2802,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2808,12 +2816,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -2824,12 +2833,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -2839,10 +2849,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2852,10 +2863,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2865,11 +2877,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2879,11 +2892,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -2894,16 +2908,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@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.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -2915,11 +2929,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2929,10 +2944,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2942,11 +2958,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2956,10 +2973,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2969,10 +2987,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -2983,11 +3002,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2997,10 +3017,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -3025,10 +3046,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -3038,12 +3061,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3053,10 +3077,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -3067,10 +3092,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3080,10 +3106,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -3094,10 +3121,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3107,11 +3135,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3121,11 +3150,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -3136,12 +3166,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -3152,11 +3183,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3180,10 +3212,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3193,10 +3226,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -3207,10 +3241,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -3221,14 +3256,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -3238,11 +3273,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -3252,10 +3288,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -3266,10 +3303,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -3281,10 +3319,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3294,11 +3333,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3308,12 +3348,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -3324,10 +3365,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3407,10 +3449,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -3421,10 +3464,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3434,14 +3478,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -3452,10 +3497,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3465,10 +3511,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -3479,10 +3526,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3492,10 +3540,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3505,10 +3554,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3518,13 +3568,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", + "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -3534,10 +3585,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3547,11 +3599,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3561,11 +3614,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3575,11 +3629,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3589,23 +3644,25 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.20", - "license": "MIT", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", "dependencies": { - "@babel/compat-data": "^7.22.20", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/compat-data": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@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.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@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", @@ -3617,59 +3674,58 @@ "@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.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -3727,14 +3783,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.0", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -3891,8 +3948,9 @@ "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "license": "MIT", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -3912,12 +3970,13 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "license": "MIT", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -3943,8 +4002,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.5", - "license": "MIT", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -4615,6 +4675,14 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@hookform/resolvers": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz", + "integrity": "sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", "license": "Apache-2.0", @@ -7274,166 +7342,1594 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@storybook/addon-styling-webpack": { - "version": "0.0.5", + "node_modules/@storybook/addon-actions": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.17.tgz", + "integrity": "sha512-TBphs4v6LRfyTpFo/WINF0TkMaE3rrNog7wW5mbz6n0j8o53kDN4o9ZEcygSL5zQX43CAaghQTeDCss7ueG7ZQ==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/node-logger": "^7.0.12" + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" }, - "peerDependencies": { - "webpack": "^5.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/babel-plugin-require-context-hook": { - "version": "1.0.1", + "node_modules/@storybook/addon-actions/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", "dev": true, - "license": "MIT" + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } }, - "node_modules/@storybook/builder-webpack5": { - "version": "7.6.1", + "node_modules/@storybook/addon-actions/node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.17.tgz", + "integrity": "sha512-7dize7x8+37PH77kmt69b0xSaeDqOcZ4fpzW6+hk53hIaCVU26eGs4+j+743Xva31eOgZWNLupUhOpUDc6SqZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/core": "^7.23.2", - "@storybook/channels": "7.6.1", - "@storybook/client-logger": "7.6.1", - "@storybook/core-common": "7.6.1", - "@storybook/core-events": "7.6.1", - "@storybook/core-webpack": "7.6.1", - "@storybook/node-logger": "7.6.1", - "@storybook/preview": "7.6.1", - "@storybook/preview-api": "7.6.1", - "@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", - "constants-browserify": "^1.0.0", - "css-loader": "^6.7.1", - "es-module-lexer": "^1.4.1", - "express": "^4.17.3", - "fork-ts-checker-webpack-plugin": "^8.0.0", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-controls": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.17.tgz", + "integrity": "sha512-zR0aLaUF7FtV/nMRyfniFbCls/e0DAAoXACuOAUAwNAv0lbIS8AyZZiHSmKucCvziUQ6WceeCC7+du3C+9y0rQ==", + "dev": true, + "dependencies": { + "@storybook/blocks": "7.6.17", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.17.tgz", + "integrity": "sha512-FKa4Mdy7nhgvEVZJHpMkHriDzpVHbohn87zv9NCL+Ctjs1iAmzGwxEm0culszyDS1HN2ToVoY0h8CSi2RSSZqA==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.3.1", + "@mdx-js/react": "^2.1.5", + "@storybook/blocks": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/components": "7.6.17", + "@storybook/csf-plugin": "7.6.17", + "@storybook/csf-tools": "7.6.17", + "@storybook/global": "^5.0.0", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.6.17", + "@storybook/postinstall": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/react-dom-shim": "7.6.17", + "@storybook/theming": "7.6.17", + "@storybook/types": "7.6.17", "fs-extra": "^11.1.0", - "html-webpack-plugin": "^5.5.0", - "magic-string": "^0.30.5", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "semver": "^7.3.7", - "style-loader": "^3.3.1", - "swc-loader": "^0.2.3", - "terser-webpack-plugin": "^5.3.1", - "ts-dedent": "^2.0.0", - "url": "^0.11.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "webpack": "5", - "webpack-dev-middleware": "^6.1.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.5.0" + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/builder-webpack5/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@storybook/addon-docs/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, - "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/builder-webpack5/node_modules/magic-string": { - "version": "0.30.5", + "node_modules/@storybook/addon-docs/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@storybook/global": "^5.0.0" }, - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/builder-webpack5/node_modules/semver": { - "version": "7.5.4", + "node_modules/@storybook/addon-docs/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "ts-dedent": "^2.0.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/csf-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz", + "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==", + "dev": true, + "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.17", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/builder-webpack5/node_modules/yallist": { - "version": "4.0.0", + "node_modules/@storybook/addon-docs/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", "dev": true, - "license": "ISC" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } }, - "node_modules/@storybook/channels": { - "version": "7.6.1", + "node_modules/@storybook/addon-docs/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.6.1", - "@storybook/core-events": "7.6.1", + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/client-logger": { - "version": "7.6.1", + "node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.17.tgz", + "integrity": "sha512-32Sa/G+WnvaPiQ1Wvjjw5UM9rr2c4GDohwCcWVv3/LJuiFPqNS6zglAtmnsrlIBnUwRBMLMh/ekCTdqMiUmfDw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/global": "^5.0.0" + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-client": { - "version": "7.6.1", + "node_modules/@storybook/addon-essentials": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.17.tgz", + "integrity": "sha512-qlSpamxuYfT2taF953nC9QijGF2pSbg1ewMNpdwLTj16PTZvR/d8NCDMTJujI1bDwM2m18u8Yc43ibh5LEmxCw==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "7.6.17", + "@storybook/addon-backgrounds": "7.6.17", + "@storybook/addon-controls": "7.6.17", + "@storybook/addon-docs": "7.6.17", + "@storybook/addon-highlight": "7.6.17", + "@storybook/addon-measure": "7.6.17", + "@storybook/addon-outline": "7.6.17", + "@storybook/addon-toolbars": "7.6.17", + "@storybook/addon-viewport": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/manager-api": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/preview-api": "7.6.17", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.6.1", - "@storybook/preview-api": "7.6.1" + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-common": { - "version": "7.6.1", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/core-events": "7.6.1", - "@storybook/node-logger": "7.6.1", - "@storybook/types": "7.6.1", + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.17.tgz", + "integrity": "sha512-R1yBPUUqGn+60aJakn8q+5Zt34E/gU3n3VmgPdryP0LJUdZ5q1/RZShoVDV+yYQ40htMH6oaCv3OyyPzFAGJ6A==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-measure": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.17.tgz", + "integrity": "sha512-O5vnHZNkduvZ95jf1UssbOl6ivIxzl5tv+4EpScPYId7w700bxWsJH+QX7ip6KlrCf2o3iUhmPe8bm05ghG2KA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-outline": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.17.tgz", + "integrity": "sha512-9o9JXDsYjNaDgz/cY5+jv694+aik/1aiRGGvsCv68e1p/ob0glkGKav4lnJe2VJqD+gCmaARoD8GOJlhoQl8JQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-styling-webpack": { + "version": "0.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/node-logger": "^7.0.12" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.17.tgz", + "integrity": "sha512-UMrchbUHiyWrh6WuGnpy34Jqzkx/63B+MSgb3CW7YsQaXz64kE0Rol0TNSznnB+mYXplcqH+ndI4r4kFsmgwDg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.17.tgz", + "integrity": "sha512-sA0QCcf4QAMixWvn8uvRYPfkKCSl6JajJaAspoPqXSxHEpK7uwOlpg3kqFU5XJJPXD0X957M+ONgNvBzYqSpEw==", + "dev": true, + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/babel-plugin-require-context-hook": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/blocks": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.17.tgz", + "integrity": "sha512-PsNVoe0bX1mMn4Kk3nbKZ0ItDZZ0YJnYAFJ6toAbsyBAbgzg1sce88sQinzvbn58/RT9MPKeWMPB45ZS7ggiNg==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/components": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/docs-tools": "7.6.17", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/theming": "7.6.17", + "@storybook/types": "7.6.17", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.8", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "tocbot": "^4.20.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/docs-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.17.tgz", + "integrity": "sha512-bYrLoj06adqklyLkEwD32C0Ww6t+9ZVvrJHiVT42bIhTRpFiFPAetl1a9KPHtFLnfduh4n2IxIr1jv32ThPDTA==", + "dev": true, + "dependencies": { + "@storybook/core-common": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/types": "7.6.17", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/blocks/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/blocks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/blocks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-manager": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.17.tgz", + "integrity": "sha512-Sj8hcDYiPCCMfeLzus37czl0zdrAxAz4IyYam2jBjVymrIrcDAFyL1OCZvnq33ft179QYQWhUs9qwzVmlR/ZWg==", + "dev": true, + "dependencies": { + "@fal-works/esbuild-plugin-global-externals": "^2.1.2", + "@storybook/core-common": "7.6.17", + "@storybook/manager": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@types/ejs": "^3.1.1", + "@types/find-cache-dir": "^3.2.1", + "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", + "browser-assert": "^1.2.1", + "ejs": "^3.1.8", + "esbuild": "^0.18.0", + "esbuild-plugin-alias": "^0.2.1", + "express": "^4.17.3", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "process": "^0.11.10", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/builder-manager/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/builder-manager/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-manager/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-webpack5": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@storybook/channels": "7.6.1", + "@storybook/client-logger": "7.6.1", + "@storybook/core-common": "7.6.1", + "@storybook/core-events": "7.6.1", + "@storybook/core-webpack": "7.6.1", + "@storybook/node-logger": "7.6.1", + "@storybook/preview": "7.6.1", + "@storybook/preview-api": "7.6.1", + "@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", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.4.1", + "express": "^4.17.3", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "swc-loader": "^0.2.3", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/magic-string": { + "version": "0.30.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@storybook/channels": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.6.1", + "@storybook/core-events": "7.6.1", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.17.tgz", + "integrity": "sha512-1sCo+nCqyR+nKfTcEidVu8XzNoECC7Y1l+uW38/r7s2f/TdDorXaIGAVrpjbSaXSoQpx5DxYJVaKCcQuOgqwcA==", + "dev": true, + "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.17", + "@storybook/core-common": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/core-server": "7.6.17", + "@storybook/csf-tools": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/telemetry": "7.6.17", + "@storybook/types": "7.6.17", + "@types/semver": "^7.3.4", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "express": "^4.17.3", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "get-npm-tarball-url": "^2.0.3", + "get-port": "^5.1.1", + "giget": "^1.0.0", + "globby": "^11.0.2", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "ora": "^5.4.1", + "prettier": "^2.8.0", + "prompts": "^2.4.0", + "puppeteer-core": "^2.1.1", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "strip-json-comments": "^3.0.1", + "tempy": "^1.0.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "bin": { + "getstorybook": "bin/index.js", + "sb": "bin/index.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/csf-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz", + "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==", + "dev": true, + "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.17", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/cli/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/cli/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@storybook/client-logger": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.17.tgz", + "integrity": "sha512-JuTmf2u3C4fCnjO7o3dqRgrq3ozNYfWlrRP8xuIdvT7niMap7a396hJtSKqS10FxCgKFcMAOsRgrCalH1dWxUg==", + "dev": true, + "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.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/cross-spawn": "^6.0.2", + "cross-spawn": "^7.0.3", + "globby": "^11.0.2", + "jscodeshift": "^0.15.1", + "lodash": "^4.17.21", + "prettier": "^2.8.0", + "recast": "^0.23.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@storybook/csf-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz", + "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==", + "dev": true, + "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.17", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/components": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.17.tgz", + "integrity": "sha512-lbh7GynMidA+CZcJnstVku6Nhs+YkqjYaZ+mKPugvlVhGVWv0DaaeQFVuZ8cJtUGJ/5FFU4Y+n+gylYUHkGBMA==", + "dev": true, + "dependencies": { + "@radix-ui/react-select": "^1.2.2", + "@radix-ui/react-toolbar": "^1.0.4", + "@storybook/client-logger": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/theming": "7.6.17", + "@storybook/types": "7.6.17", + "memoizerific": "^1.11.3", + "use-resize-observer": "^9.1.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/components/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/components/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/components/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/components/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-client": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/client-logger": "7.6.1", + "@storybook/preview-api": "7.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-common": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-events": "7.6.1", + "@storybook/node-logger": "7.6.1", + "@storybook/types": "7.6.1", "@types/find-cache-dir": "^3.2.1", "@types/node": "^18.0.0", "@types/node-fetch": "^2.6.4", @@ -7463,7 +8959,1051 @@ "node_modules/@storybook/core-common/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, - "license": "MIT", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/core-common/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/core-common/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-events": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.17.tgz", + "integrity": "sha512-KWGhTTaL1Q14FolcoKKZgytlPJUbH6sbJ1Ptj/84EYWFewcnEgVs0Zlnh1VStRZg+Rd1WC1V4yVd/bbDzxrvQA==", + "dev": true, + "dependencies": { + "@aw-web-design/x-default-browser": "1.4.126", + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-manager": "7.6.17", + "@storybook/channels": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/csf-tools": "7.6.17", + "@storybook/docs-mdx": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/manager": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/telemetry": "7.6.17", + "@storybook/types": "7.6.17", + "@types/detect-port": "^1.3.0", + "@types/node": "^18.0.0", + "@types/pretty-hrtime": "^1.0.0", + "@types/semver": "^7.3.4", + "better-opn": "^3.0.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "compression": "^1.7.4", + "detect-port": "^1.3.0", + "express": "^4.17.3", + "fs-extra": "^11.1.0", + "globby": "^11.0.2", + "ip": "^2.0.1", + "lodash": "^4.17.21", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/csf-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz", + "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==", + "dev": true, + "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.17", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/core-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/core-server/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-server/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/core-server/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/core-server/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-server/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@storybook/core-webpack": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-common": "7.6.1", + "@storybook/node-logger": "7.6.1", + "@storybook/types": "7.6.1", + "@types/node": "^18.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.17.tgz", + "integrity": "sha512-xTHv9BUh3bkDVCvcbmdfVF0/e96BdrEgqPJ3G3RmKbSzWLOkQ2U9yiPfHzT0KJWPhVwj12fjfZp0zunu+pcS6Q==", + "dev": true, + "dependencies": { + "@storybook/csf-tools": "7.6.17", + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-plugin/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-plugin/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-plugin/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-plugin/node_modules/@storybook/csf-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz", + "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==", + "dev": true, + "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.17", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-plugin/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-tools": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "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.1", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/docs-mdx": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/docs-tools": { + "version": "7.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-common": "7.6.1", + "@storybook/preview-api": "7.6.1", + "@storybook/types": "7.6.1", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/manager": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.17.tgz", + "integrity": "sha512-A1LDDIqMpwRzq/dqkbbiza0QI04o4ZHCl2a3UMDZUV/+QLc2nsr2DAaLk4CVL4/cIc5zGqmIcaOTvprx2YKVBw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.17.tgz", + "integrity": "sha512-IJIV1Yc6yw1dhCY4tReHCfBnUKDqEBnMyHp3mbXpsaHxnxJZrXO45WjRAZIKlQKhl/Ge1CrnznmHRCmYgqmrWg==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/router": "7.6.17", + "@storybook/theming": "7.6.17", + "@storybook/types": "7.6.17", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "store2": "^2.14.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/mdx2-csf": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/nextjs": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.6.17.tgz", + "integrity": "sha512-bD9x6HzH/fxiFnghOQfDM60tNUNxFNVVCZi6OvTRxVVz/5xdqbVnYVOuaJeUSLuUnGs7ALYfx8+2OTJQ9NrwRA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.2", + "@babel/runtime": "^7.23.2", + "@storybook/addon-actions": "7.6.17", + "@storybook/builder-webpack5": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/preset-react-webpack": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/react": "7.6.17", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "css-loader": "^6.7.3", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "image-size": "^1.0.0", + "loader-utils": "^3.2.1", + "node-polyfill-webpack-plugin": "^2.0.1", + "pnp-webpack-plugin": "^1.7.0", + "postcss": "^8.4.21", + "postcss-loader": "^7.0.2", + "resolve-url-loader": "^5.0.0", + "sass-loader": "^12.4.0", + "semver": "^7.3.5", + "sharp": "^0.32.6", + "style-loader": "^3.3.1", + "styled-jsx": "5.1.1", + "ts-dedent": "^2.0.0", + "tsconfig-paths": "^4.0.0", + "tsconfig-paths-webpack-plugin": "^4.0.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@next/font": "^13.0.0|| ^14.0.0", + "next": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@next/font": { + "optional": true + }, + "typescript": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/builder-webpack5": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.17.tgz", + "integrity": "sha512-GMaBd8/RzivuAmWrYSt9Rga3j8WLcu5LCMYiPVs+XKXsKAC8lTkV0WRWh8Nk6wTmfzsRQ2acwFjSG5oE4ClZKA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/core-webpack": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/preview": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@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", + "express": "^4.17.3", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "swc-loader": "^0.2.3", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-client": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.17.tgz", + "integrity": "sha512-LuDbADK+DPNAOOCXOlvY09hdGVueXlDetsdOJ/DgYnSa9QSWv9Uv+F8QcEgR3QckZJbPlztKJIVLgP2n/Xkijw==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/preview-api": "7.6.17" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-webpack": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.17.tgz", + "integrity": "sha512-PyGrFhRM8sTONGwwLWLqBQ1HO+LBnVZ+5TOQO7ejQfdV2FWyNOzjBXm2e5jL/C6XlqiEhmL5pyHEyDBaQJQ3KA==", + "dev": true, + "dependencies": { + "@storybook/core-common": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/node": "^18.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/docs-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.17.tgz", + "integrity": "sha512-bYrLoj06adqklyLkEwD32C0Ww6t+9ZVvrJHiVT42bIhTRpFiFPAetl1a9KPHtFLnfduh4n2IxIr1jv32ThPDTA==", + "dev": true, + "dependencies": { + "@storybook/core-common": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/types": "7.6.17", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/preset-react-webpack": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.17.tgz", + "integrity": "sha512-gn/LvIbll9loOkzwbFlxzOZGmJ6t1vF2/gfi+p/N/AifDYe8+LVM1QV4KRVKt6UEJwsQd79lKf7vPH92AQaKKQ==", + "dev": true, + "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.17", + "@storybook/docs-tools": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/react": "7.6.17", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "babel-plugin-add-react-displayname": "^0.0.5", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.5", + "react-docgen": "^7.0.0", + "react-refresh": "^0.14.0", + "semver": "^7.3.7", + "webpack": "5" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "^7.22.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/preview": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.17.tgz", + "integrity": "sha512-LvkMYK/y6alGjwRVNDIKL1lFlbyZ0H0c8iAbcQkiMoaFiujMQyVswMDKlWcj42Upfr/B1igydiruomc+eUt0mw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/react": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.17.tgz", + "integrity": "sha512-lVqzQSU03rRJWYW+gK2gq6mSo3/qtnVICY8B8oP7gc36jVu4ksDIu45bTfukM618ODkUZy0vZe6T4engK3azjA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-client": "7.6.17", + "@storybook/docs-tools": "7.6.17", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "7.6.17", + "@storybook/react-dom-shim": "7.6.17", + "@storybook/types": "7.6.17", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^18.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/react-dom-shim": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.17.tgz", + "integrity": "sha512-32Sa/G+WnvaPiQ1Wvjjw5UM9rr2c4GDohwCcWVv3/LJuiFPqNS6zglAtmnsrlIBnUwRBMLMh/ekCTdqMiUmfDw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7474,10 +10014,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@storybook/core-common/node_modules/chalk": { + "node_modules/@storybook/nextjs/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@storybook/nextjs/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7489,18 +10036,182 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/core-common/node_modules/has-flag": { + "node_modules/@storybook/nextjs/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@storybook/nextjs/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@storybook/core-common/node_modules/supports-color": { + "node_modules/@storybook/nextjs/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@storybook/nextjs/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@storybook/nextjs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/nextjs/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/nextjs/node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/@storybook/nextjs/node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/nextjs/node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@storybook/nextjs/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/nextjs/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/nextjs/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@storybook/nextjs/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7508,55 +10219,120 @@ "node": ">=8" } }, - "node_modules/@storybook/core-events": { + "node_modules/@storybook/nextjs/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/nextjs/node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@storybook/nextjs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@storybook/node-logger": { "version": "7.6.1", "dev": true, "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/postinstall": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.17.tgz", + "integrity": "sha512-WaWqB8o9vUc9aaVls+povQSVirf1Xd1LZcVhUKfAocAF3mzYUsnJsVqvnbjRj/F96UFVihOyDt9Zjl/9OvrCvQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-create-react-app": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preset-create-react-app/-/preset-create-react-app-7.6.17.tgz", + "integrity": "sha512-iLjIKBG7UK/iac7wdm3JJcoHss3wKUuHuMJ/cc10UGJdBe1kEJnkcnab/whPhWo3E59wXBLkCXoh9BwiOP8sbw==", + "dev": true, "dependencies": { - "ts-dedent": "^2.0.0" + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.1", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@storybook/types": "7.6.17", + "@types/babel__core": "^7.1.7", + "@types/semver": "^7.3.4", + "pnp-webpack-plugin": "^1.7.0", + "semver": "^7.3.5" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@babel/core": "*", + "react-scripts": ">=5.0.0" } }, - "node_modules/@storybook/core-webpack": { - "version": "7.6.1", + "node_modules/@storybook/preset-create-react-app/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/core-common": "7.6.1", - "@storybook/node-logger": "7.6.1", - "@storybook/types": "7.6.1", - "@types/node": "^18.0.0", - "ts-dedent": "^2.0.0" + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf": { - "version": "0.1.2", + "node_modules/@storybook/preset-create-react-app/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", "dev": true, - "license": "MIT", "dependencies": { - "type-fest": "^2.19.0" + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-tools": { - "version": "7.6.1", + "node_modules/@storybook/preset-create-react-app/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", "dev": true, - "license": "MIT", "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.1", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", "ts-dedent": "^2.0.0" }, "funding": { @@ -7564,48 +10340,55 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/docs-mdx": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/docs-tools": { - "version": "7.6.1", + "node_modules/@storybook/preset-create-react-app/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", "dev": true, - "license": "MIT", "dependencies": { - "@storybook/core-common": "7.6.1", - "@storybook/preview-api": "7.6.1", - "@storybook/types": "7.6.1", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/mdx2-csf": { - "version": "1.1.0", + "node_modules/@storybook/preset-create-react-app/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT" + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@storybook/node-logger": { - "version": "7.6.1", + "node_modules/@storybook/preset-create-react-app/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, + "node_modules/@storybook/preset-create-react-app/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@storybook/preset-react-webpack": { "version": "7.6.1", "dev": true, @@ -7833,6 +10616,232 @@ } } }, + "node_modules/@storybook/router": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.17.tgz", + "integrity": "sha512-GnyC0j6Wi5hT4qRhSyT8NPtJfGmf82uZw97LQRWeyYu5gWEshUdM7aj40XlNiScd5cZDp0owO1idduVF2k2l2A==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "memoizerific": "^1.11.3", + "qs": "^6.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/router/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.17.tgz", + "integrity": "sha512-WOcOAmmengYnGInH98Px44F47DSpLyk20BM+Z/IIQDzfttGOLlxNqBBG1XTEhNRn+AYuk4aZ2JEed2lCjVIxcA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-common": "7.6.17", + "@storybook/csf-tools": "7.6.17", + "chalk": "^4.1.0", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^11.1.0", + "read-pkg-up": "^7.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/core-common": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.17.tgz", + "integrity": "sha512-me2TP3Q9/qzqCLoDHUSsUF+VS1MHxfHbTVF6vAz0D/COTxzsxLpu9TxTbzJoBCxse6XRb6wWI1RgF1mIcjic7g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.17", + "@storybook/node-logger": "7.6.17", + "@storybook/types": "7.6.17", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/csf-tools": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.17.tgz", + "integrity": "sha512-dAQtam0EBPeTJYcQPLxXgz4L9JFqD+HWbLFG9CmNIhMMjticrB0mpk1EFIS6vPXk/VsVWpBgMLD7dZlD6YMKcQ==", + "dev": true, + "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.17", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/node-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.17.tgz", + "integrity": "sha512-w59MQuXhhUNrUVmVkXhMwIg2nvFWjdDczLTwYLorhfsE36CWeUOY5QCZWQy0Qf/h+jz8Uo7Evy64qn18v9C4wA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/telemetry/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@storybook/telemetry/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@storybook/telemetry/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/telemetry/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@storybook/test-runner": { "version": "0.14.1", "dev": true, @@ -7881,6 +10890,39 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/@storybook/theming": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.17.tgz", + "integrity": "sha512-ZbaBt3KAbmBtfjNqgMY7wPMBshhSJlhodyMNQypv+95xLD/R+Az6aBYbpVAOygLaUQaQk4ar7H/Ww6lFIoiFbA==", + "dev": true, + "dependencies": { + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@storybook/client-logger": "7.6.17", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/theming/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, "node_modules/@storybook/types": { "version": "7.6.1", "dev": true, @@ -7904,15 +10946,17 @@ } }, "node_modules/@supabase/gotrue-js": { - "version": "2.54.0", - "license": "MIT", + "version": "2.62.2", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.62.2.tgz", + "integrity": "sha512-AP6e6W9rQXFTEJ7sTTNYQrNf0LCcnt1hUW+RIgUK+Uh3jbWvcIST7wAlYyNZiMlS9+PYyymWQ+Ykz/rOYSO0+A==", "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "node_modules/@supabase/node-fetch": { - "version": "2.6.14", - "license": "MIT", + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7921,39 +10965,55 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "1.8.4", - "license": "MIT", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.9.2.tgz", + "integrity": "sha512-I6yHo8CC9cxhOo6DouDMy9uOfW7hjdsnCxZiaJuIVZm1dBGTFiQPgfMa9zXCamEWzNyWRjZvupAUuX+tqcl5Sw==", "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "node_modules/@supabase/realtime-js": { - "version": "2.8.0", - "license": "MIT", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.9.3.tgz", + "integrity": "sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ==", "dependencies": { "@supabase/node-fetch": "^2.6.14", "@types/phoenix": "^1.5.4", - "@types/websocket": "^1.0.3", - "websocket": "^1.0.34" + "@types/ws": "^8.5.10", + "ws": "^8.14.2" + } + }, + "node_modules/@supabase/ssr": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@supabase/ssr/-/ssr-0.1.0.tgz", + "integrity": "sha512-bIVrkqjAK5G3KjkIMKYKtAOlCgRRplEWjrlyRyXSOYtgDieiOhk2ZyNAPsEOa1By9OZVxuX5eAW1fitdnuxayw==", + "dependencies": { + "cookie": "^0.5.0", + "ramda": "^0.29.0" + }, + "peerDependencies": { + "@supabase/supabase-js": "^2.33.1" } }, "node_modules/@supabase/storage-js": { - "version": "2.5.4", - "license": "MIT", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.5.tgz", + "integrity": "sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==", "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "node_modules/@supabase/supabase-js": { - "version": "2.37.0", - "license": "MIT", + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.40.0.tgz", + "integrity": "sha512-XF8OrsA13DYBL074sHH4M0NhXJCWhQ0R5JbVeVUytZ0coPMS9krRdzxl+0c4z4LLjqbm/Wdz0UYlTYM9MgnDag==", "dependencies": { - "@supabase/functions-js": "^2.1.5", - "@supabase/gotrue-js": "^2.54.0", - "@supabase/node-fetch": "^2.6.14", - "@supabase/postgrest-js": "^1.8.4", - "@supabase/realtime-js": "^2.8.0", - "@supabase/storage-js": "^2.5.4" + "@supabase/functions-js": "2.1.5", + "@supabase/gotrue-js": "2.62.2", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.9.2", + "@supabase/realtime-js": "2.9.3", + "@supabase/storage-js": "2.5.5" } }, "node_modules/@surma/rollup-plugin-off-main-thread": { @@ -8559,6 +11619,10 @@ "resolved": "app.territoiresentransitions.react", "link": true }, + "node_modules/@tet/auth": { + "resolved": "packages/auth", + "link": true + }, "node_modules/@tet/site": { "resolved": "packages/site", "link": true @@ -9194,8 +12258,9 @@ } }, "node_modules/@types/ws": { - "version": "8.5.6", - "license": "MIT", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } @@ -9873,6 +12938,18 @@ "version": "2.0.6", "license": "BSD-3-Clause" }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -10365,6 +13442,23 @@ "version": "2.0.6", "license": "MIT" }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/assert": { "version": "2.1.0", "dev": true, @@ -10802,11 +13896,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "license": "MIT", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { @@ -10814,21 +13909,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.4", - "license": "MIT", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.32.2" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "license": "MIT", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -11030,6 +14127,12 @@ "version": "3.7.2", "license": "MIT" }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, "node_modules/body-parser": { "version": "1.20.1", "license": "MIT", @@ -11147,6 +14250,12 @@ "unload": "2.2.0" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, "node_modules/browser-assert": { "version": "1.2.1", "dev": true @@ -11161,6 +14270,116 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/browserify-zlib": { "version": "0.1.4", "dev": true, @@ -11175,7 +14394,9 @@ "license": "MIT" }, "node_modules/browserslist": { - "version": "4.22.1", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -11190,11 +14411,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -11251,6 +14471,12 @@ "node": ">=0.10" } }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, "node_modules/buffers": { "version": "0.1.1", "engines": { @@ -11278,6 +14504,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, "node_modules/busboy": { "version": "1.6.0", "dependencies": { @@ -11383,7 +14615,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001542", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "funding": [ { "type": "opencollective", @@ -11397,8 +14631,7 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -11575,6 +14808,16 @@ "node": ">=8" } }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "license": "MIT" @@ -12089,6 +15332,12 @@ "node": ">=0.8" } }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, "node_modules/constants-browserify": { "version": "1.0.0", "dev": true, @@ -12237,10 +15486,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.0", - "license": "MIT", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -12295,6 +15545,49 @@ "node": ">= 10" } }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "node_modules/create-jest": { "version": "29.7.0", "dev": true, @@ -12381,6 +15674,28 @@ "node": ">= 8" } }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "license": "MIT", @@ -13253,6 +16568,16 @@ "node": ">=6" } }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/destroy": { "version": "1.2.0", "license": "MIT", @@ -13447,6 +16772,23 @@ "readable-stream": "^3.1.1" } }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/dir-glob": { "version": "3.0.1", "license": "MIT", @@ -13516,6 +16858,18 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/domelementtype": { "version": "2.3.0", "funding": [ @@ -13704,8 +17058,30 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.537", - "license": "ISC" + "version": "1.4.715", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", + "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==" + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "node_modules/emittery": { "version": "0.13.1", @@ -15601,6 +18977,15 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "license": "MIT" @@ -15612,6 +18997,16 @@ "node": ">=0.8.x" } }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "node_modules/exceljs": { "version": "4.3.0", "license": "MIT", @@ -15863,7 +19258,6 @@ }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "dev": true, "license": "MIT", "engines": { "node": ">= 4.9.1" @@ -15928,6 +19322,11 @@ "dev": true, "license": "MIT" }, + "node_modules/fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "license": "MIT", @@ -16006,6 +19405,15 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "license": "MIT", @@ -17054,6 +20462,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasha": { "version": "5.2.2", "dev": true, @@ -17250,6 +20681,17 @@ "value-equal": "^1.0.1" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "license": "BSD-3-Clause", @@ -17505,6 +20947,12 @@ } } }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "license": "MIT", @@ -17582,6 +21030,21 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dev": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/immediate": { "version": "3.0.6", "license": "MIT" @@ -17756,9 +21219,10 @@ } }, "node_modules/ip": { - "version": "2.0.0", - "dev": true, - "license": "MIT" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", + "dev": true }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -21090,6 +24554,114 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jscodeshift": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", + "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.23.3", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } + } + }, + "node_modules/jscodeshift/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/jscodeshift/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "node_modules/jsdom": { "version": "16.7.0", "license": "MIT", @@ -21777,6 +25349,17 @@ "remove-accents": "0.4.2" } }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/mdast-util-definitions": { "version": "4.0.0", "dev": true, @@ -26229,6 +29812,25 @@ "version": "0.2.0", "license": "MIT" }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/mime": { "version": "1.6.0", "license": "MIT", @@ -26346,6 +29948,12 @@ "version": "1.0.1", "license": "ISC" }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, "node_modules/minimatch": { "version": "3.1.2", "license": "ISC", @@ -26940,6 +30548,94 @@ "version": "0.4.0", "license": "MIT" }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.22.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^4.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/node-preload": { "version": "0.2.1", "dev": true, @@ -26952,8 +30648,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -27565,6 +31262,12 @@ "node": ">=8" } }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, "node_modules/os-homedir": { "version": "1.0.2", "dev": true, @@ -27667,6 +31370,23 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/parse-entities": { "version": "4.0.1", "license": "MIT", @@ -27805,6 +31525,22 @@ "node": "*" } }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/peek-stream": { "version": "1.1.3", "dev": true, @@ -29128,11 +32864,19 @@ "version": "4.2.0", "license": "MIT" }, + "node_modules/posthog-js": { + "version": "1.116.6", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.116.6.tgz", + "integrity": "sha512-rvt8HxzJD4c2B/xsUa4jle8ApdqljeBI2Qqjp4XJMohQf18DXRyM6b96H5/UMs8jxYuZG14Er0h/kEIWeU6Fmw==", + "dependencies": { + "fflate": "^0.4.8", + "preact": "^10.19.3" + } + }, "node_modules/preact": { - "version": "10.18.1", - "dev": true, - "license": "MIT", - "peer": true, + "version": "10.20.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", + "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -29342,6 +33086,26 @@ "version": "1.9.0", "license": "MIT" }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "license": "MIT", @@ -29502,10 +33266,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/querystringify": { "version": "2.2.0", "license": "MIT" }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ @@ -29537,7 +33319,6 @@ }, "node_modules/ramda": { "version": "0.29.0", - "dev": true, "license": "MIT", "funding": { "type": "opencollective", @@ -29551,6 +33332,16 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "license": "MIT", @@ -29947,6 +33738,21 @@ "version": "2.0.4", "license": "MIT" }, + "node_modules/react-hook-form": { + "version": "7.51.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.1.tgz", + "integrity": "sha512-ifnBjl+kW0ksINHd+8C/Gp6a4eZOdWyvRv0UBaByShwU8JbVx5hTcTWEcd5VdybvmPTATkVVXk9npXArHmo56w==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-icons": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", @@ -30612,6 +34418,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.1.tgz", "integrity": "sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==", + "peer": true, "dependencies": { "prop-types": "^15.7.2" }, @@ -33692,6 +37499,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/rollup": { "version": "2.79.1", "license": "MIT", @@ -34085,6 +37902,19 @@ "version": "1.2.0", "license": "ISC" }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "dev": true, @@ -34628,6 +38458,45 @@ "dev": true, "license": "(MIT OR GPL-3.0)" }, + "node_modules/storybook": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.17.tgz", + "integrity": "sha512-8+EIo91bwmeFWPg1eysrxXlhIYv3OsXrznTr4+4Eq0NikqAoq6oBhtlN5K2RGS2lBVF537eN+9jTCNbR+WrzDA==", + "dev": true, + "dependencies": { + "@storybook/cli": "7.6.17" + }, + "bin": { + "sb": "index.js", + "storybook": "index.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, "node_modules/stream-shift": { "version": "1.0.1", "dev": true, @@ -35634,6 +39503,18 @@ "version": "1.1.0", "license": "MIT" }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tiny-invariant": { "version": "1.3.1", "license": "MIT" @@ -36143,6 +40024,12 @@ "fsevents": "~2.3.3" } }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "license": "Apache-2.0", @@ -36865,6 +40752,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -38271,6 +42164,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "2.0.4", "license": "MIT", @@ -38304,7 +42205,7 @@ "node": "20" }, "peerDependencies": { - "@supabase/supabase-js": "^2.39.0" + "@supabase/supabase-js": "^2.39.3" } }, "packages/api/node_modules/@eslint/eslintrc": { @@ -38750,6 +42651,480 @@ "dev": true, "license": "ISC" }, + "packages/auth": { + "name": "@tet/auth", + "version": "0.1.0", + "license": "ISC", + "dependencies": { + "@floating-ui/react": "^0.25.2", + "@hookform/resolvers": "^3.3.4", + "@supabase/ssr": "^0.1.0", + "@supabase/supabase-js": "^2.39.3", + "@tet/ui": "^1.0.0", + "@zxcvbn-ts/core": "^3.0.4", + "@zxcvbn-ts/language-common": "^3.0.4", + "@zxcvbn-ts/language-fr": "^3.0.2", + "classnames": "^2.3.2", + "encoding": "^0.1.13", + "next": "^14.0.4", + "posthog-js": "^1.108.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.51.1", + "swr": "^2.2.0", + "tailwindcss": "^3.3.3", + "zod": "^3.22.4" + }, + "devDependencies": { + "@storybook/addon-essentials": "^7.6.1", + "@storybook/addon-styling-webpack": "^0.0.5", + "@storybook/nextjs": "^7.6.1", + "@storybook/preset-create-react-app": "^7.6.1", + "@storybook/react": "^7.6.1", + "@types/react": "^18.2.24", + "@types/react-dom": "^18.2.7", + "autoprefixer": "^10.4.14", + "eslint": "8.46.0", + "eslint-config-next": "^14.0.4", + "eslint-plugin-jsx-expressions": "^1.3.2", + "eslint-plugin-storybook": "^0.6.15", + "postcss": "^8.4.27", + "prettier": "3.0.1", + "storybook": "^7.6.1", + "typescript": "^5.2.2" + }, + "engines": { + "node": "20" + } + }, + "packages/auth/node_modules/@floating-ui/react": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.25.4.tgz", + "integrity": "sha512-lWRQ/UiTvSIBxohn0/2HFHEmnmOVRjl7j6XcRJuLH0ls6f/9AyHMWVzkAJFuwx0n9gaEeCmg9VccCSCJzbEJig==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.2", + "@floating-ui/utils": "^0.1.1", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "packages/auth/node_modules/@next/eslint-plugin-next": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz", + "integrity": "sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "packages/auth/node_modules/@storybook/csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "packages/auth/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/auth/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/auth/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/auth/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "packages/auth/node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "packages/auth/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/auth/node_modules/@zxcvbn-ts/core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/core/-/core-3.0.4.tgz", + "integrity": "sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==", + "dependencies": { + "fastest-levenshtein": "1.0.16" + } + }, + "packages/auth/node_modules/@zxcvbn-ts/language-common": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-common/-/language-common-3.0.4.tgz", + "integrity": "sha512-viSNNnRYtc7ULXzxrQIVUNwHAPSXRtoIwy/Tq4XQQdIknBzw4vz36lQLF6mvhMlTIlpjoN/Z1GFu/fwiAlUSsw==" + }, + "packages/auth/node_modules/@zxcvbn-ts/language-fr": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@zxcvbn-ts/language-fr/-/language-fr-3.0.2.tgz", + "integrity": "sha512-Tj9jS/Z8mNBAD21pn8Mp4O86CPrwImysO1fM3DG+fsfk8W79/MDzqpFDBHiqpu69Uo3LPPctMHEEteakFWt4Qg==" + }, + "packages/auth/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/auth/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "packages/auth/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/auth/node_modules/eslint": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/auth/node_modules/eslint-config-next": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.4.tgz", + "integrity": "sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.1.4", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/auth/node_modules/eslint-plugin-storybook": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz", + "integrity": "sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.45.0", + "requireindex": "^1.1.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": "12.x || 14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "packages/auth/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "packages/auth/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/auth/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "packages/auth/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "packages/auth/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/auth/node_modules/prettier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "packages/auth/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/auth/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/auth/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/auth/node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/auth/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "packages/site": { "name": "@tet/site", "version": "0.1.0", @@ -39460,7 +43835,6 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "react-number-format": "^5.3.1", "remixicon": "^4.0.1" }, "devDependencies": { @@ -39506,7 +43880,8 @@ "@gouvfr/dsfr": "^1.10.2", "classnames": "^2.3.2", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-number-format": "^5.3.1" } }, "packages/ui/node_modules/@babel/compat-data": { @@ -39554,14 +43929,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "packages/ui/node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "packages/ui/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", "dev": true, diff --git a/package.json b/package.json index 19f24ae480..aa3321ebdf 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,11 @@ "supabase": "1.88.0" }, "scripts": { - "dev": "concurrently --names \"api,ui,app,site\" -c \"bgMagenta.bold,bgBlue.bold,bgGreen.bold,bgYellow.bold\" \"npm run dev -w @tet/api\" \"npm run dev -w @tet/ui\" \"npm run dev -w @tet/app\" \"npm run dev -w @tet/site -- -p 3001\"", - "dev:app": "concurrently --names \"api,ui,app\" -c \"bgMagenta.bold,bgBlue.bold,bgGreen.bold\" \"npm run dev -w @tet/api\" \"npm run dev -w @tet/ui\" \"npm run dev -w @tet/app\"", + "dev": "concurrently --names \"api,ui,app,site,auth\" -c \"bgMagenta.bold,bgBlue.bold,bgGreen.bold,bgYellow.bold,bgCyan.bold\" \"npm run dev -w @tet/api\" \"npm run dev -w @tet/ui\" \"npm run dev -w @tet/app\" \"npm run dev -w @tet/site -- -p 3001\" \"npm run dev -w @tet/site -- -p 3003\"", + "dev:app": "concurrently --names \"api,ui,app,auth\" -c \"bgMagenta.bold,bgBlue.bold,bgGreen.bold,bgCyan.bold\" \"npm run dev -w @tet/api\" \"npm run dev -w @tet/ui\" \"npm run dev -w @tet/app\" \"npm run dev -w @tet/auth -- -p 3003\"", "dev:site": "concurrently --names \"api,ui,site\" -c \"bgMagenta.bold,bgBlue.bold,bgYellow.bold\" \"npm run dev -w @tet/api\" \"npm run dev -w @tet/ui\" \"npm run dev -w @tet/site -- -p 3001\"", "build": "if [ \"$SCALINGO_BUILD\" = \"site\" ]; then npm run build:site; else npm run build:app; fi", + "build:auth": "npm run build -w @tet/api -w @tet/ui -w @tet/auth", "build:app": "npm run build -w @tet/api -w @tet/ui -w @tet/app", "build:site": "npm run build -w @tet/api -w @tet/ui -w @tet/site", "start": "if [ \"$SCALINGO_BUILD\" = \"site\" ]; then npm start -w @tet/site; else npm start -w @tet/app; fi" diff --git a/packages/api/package.json b/packages/api/package.json index 1854fa381e..d2d222c31a 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -37,6 +37,6 @@ "license": "ISC", "description": "", "peerDependencies": { - "@supabase/supabase-js": "^2.39.0" + "@supabase/supabase-js": "^2.39.3" } } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index e658f53ff8..04450a9867 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,5 +1,7 @@ export * from './typeUtils'; export type {Database, Json} from './database.types'; export {unaccent} from './utils/unaccent'; +export * from './utils/authTokens'; +export * from './utils/pathUtils'; export * as Indicateurs from './indicateurs'; export * as CollectiviteEngagee from './collectiviteEngagees'; diff --git a/packages/api/src/utils/authTokens.ts b/packages/api/src/utils/authTokens.ts new file mode 100644 index 0000000000..3a11780e41 --- /dev/null +++ b/packages/api/src/utils/authTokens.ts @@ -0,0 +1,59 @@ +/* + * Fonctions pour enlever ou ajouter les cookies qui permettent de partager + * l'authentification entre les sous-domaines. + + * Ref: https://github.com/orgs/supabase/discussions/5742#discussioncomment-4050444 +*/ +import {Session, SupabaseClient} from '@supabase/supabase-js'; + +export const ACCESS_TOKEN = 'tet-access-token'; +export const REFRESH_TOKEN = 'tet-refresh-token'; + +/** Enlève les tokens */ +const EXPIRED = new Date(0).toUTCString(); +const formatExpiredToken = (name: string, domain: string) => + `${name}=; Domain=${domain}; path=/; expires=${EXPIRED}; SameSite=Lax; secure`; +export const clearAuthTokens = (domain: string) => { + document.cookie = formatExpiredToken(ACCESS_TOKEN, domain); + document.cookie = formatExpiredToken(REFRESH_TOKEN, domain); +}; + +/** Crée les tokens à partir de la session */ +const MAX_AGE = 60 * 60 * 24 * 365; +export const formatAuthToken = ( + name: string, + value: string, + domain: string, + maxAge: number = MAX_AGE +) => + `${name}=${value}; Domain=${domain}; path=/; max-age=${maxAge}; SameSite=Lax; secure`; + +/** Crée et ajoute les tokens */ +export const setAuthTokens = (session: Session, domain: string) => { + document.cookie = formatAuthToken(ACCESS_TOKEN, session.access_token, domain); + document.cookie = formatAuthToken( + REFRESH_TOKEN, + session.refresh_token, + domain + ); +}; + +/** Restaure la session depuis les tokens */ +export const restoreSessionFromAuthTokens = async ( + supabase: SupabaseClient +) => { + // recherche les cookies + const cookies = document.cookie + .split(/\s*;\s*/) + .map(cookie => cookie.split('=')); + const accessTokenCookie = cookies.find(x => x[0] === ACCESS_TOKEN); + const refreshTokenCookie = cookies.find(x => x[0] === REFRESH_TOKEN); + + if (accessTokenCookie && refreshTokenCookie) { + return supabase.auth.setSession({ + access_token: accessTokenCookie[1], + refresh_token: refreshTokenCookie[1], + }); + } + return null; +}; diff --git a/packages/api/src/utils/pathUtils.test.ts b/packages/api/src/utils/pathUtils.test.ts new file mode 100644 index 0000000000..1c81c18d8d --- /dev/null +++ b/packages/api/src/utils/pathUtils.test.ts @@ -0,0 +1,31 @@ +import {getAuthBaseUrl} from './pathUtils'; +import {assert} from 'chai'; + +describe('getAuthBaseUrl', () => { + it("donne l'url de l'auth. en mode dev", () => { + assert.equal(getAuthBaseUrl('localhost'), 'http://localhost:3003'); + }); + + it("donne l'url de l'auth. en mode preprod domaine tet", () => { + assert.equal( + getAuthBaseUrl('preprod-app.tet.fr'), + 'https://preprod-auth.tet.fr' + ); + }); + + it("donne l'url de l'auth. en mode preprod domaine koyeb", () => { + assert.equal( + getAuthBaseUrl('preprod-app-tet.koyeb.app'), + 'https://preprod-auth-tet.koyeb.app' + ); + assert.equal( + getAuthBaseUrl('test-app-branch-tet.koyeb.app'), + 'https://preprod-auth-tet.koyeb.app' + ); + }); + + it("donne l'url de l'auth. en mode prod domaine tet", () => { + assert.equal(getAuthBaseUrl('app.tet.fr'), 'https://auth.tet.fr'); + assert.equal(getAuthBaseUrl('tet.fr'), 'https://auth.tet.fr'); + }); +}); diff --git a/packages/api/src/utils/pathUtils.ts b/packages/api/src/utils/pathUtils.ts new file mode 100644 index 0000000000..21a800887d --- /dev/null +++ b/packages/api/src/utils/pathUtils.ts @@ -0,0 +1,66 @@ +/** + * Extrait le domaine racine + * - transforme `app.territoiresentransitions.fr` en `territoiresentransitions.fr` + * - garde `territoiresentransitions.fr` inchangé + * - garde `localhost` inchangé + */ +export const getRootDomain = (hostname: string) => { + const parts = hostname.split('.'); + return parts.length > 2 ? parts.toSpliced(0, 1).join('.') : hostname; +}; + +/** + * URL DES MODULES SUIVANT L'ENVIRONNEMENT + * + * DEV + * domain=localhost + port distinct (app=3000, site=3001, panier=3002, + * auth=3003) + * + * PREPROD dans le domaine TeT domain=territoiresentransitions.fr + sous-domaine + * distinct (preprod-app, preprod-site, preprod-panier, preprod-auth) + * + * PREPROD dans le domaine koyeb (pour permettre l'authent. depuis les app de + * test) domain=koyeb.app + sous-domaine distinct (preprod-app-tet, + * test-app--tet, preprod-site-tet, preprod-panier-tet, preprod-auth-tet) + * + * PROD (domaine TeT) domain=territoiresentransitions.fr + sous-domaine distinct + * (app, panier, auth) ou pas de sous-domaine (ou wwww) pour le + * site + */ +/** Donne l'URL du module d'authentification */ +const DEV_SITE_PORT = 3003; // port pour le mode dev +export const getAuthBaseUrl = (hostname: string) => { + const domain = getRootDomain(hostname); + if (domain === 'localhost') { + return `http://localhost:${DEV_SITE_PORT}`; + } + + const subdomain = + hostname.includes('preprod') || domain === 'koyeb.app' + ? domain === 'koyeb.app' + ? 'preprod-auth-tet' + : 'preprod-auth' + : 'auth'; + return `https://${subdomain}.${domain}`; +}; + +/** + * Donne les URLs des pages d'authentification + * @param hostname URL de la page courante pour pouvoir déterminer les chemins. + * @param redirect_to URL de la page vers laquelle rediriger après l'authentification. + * @returns + */ +export const getAuthPaths = (hostname: string, redirect_to: string) => { + const base = getAuthBaseUrl(hostname); + const params = new URLSearchParams({redirect_to}); + return { + base, + login: `${base}/login?${params}`, + signUp: `${base}/signup?${params}`, + resetPwd: `${base}/recover?${params}`, + }; +}; + +/** Donne l'url de la page "rejoindre une collectivité" */ +export const getRejoindreCollectivitePath = (hostname: string) => + `${getAuthBaseUrl(hostname)}/rejoindre-une-collectivite`; diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 9e83cd6fa6..5e8c0e2e16 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "target": "es2021", + "target": "esnext", "sourceMap": true, "declaration": true, "declarationMap": true, diff --git a/packages/auth/.env.sample b/packages/auth/.env.sample new file mode 100644 index 0000000000..cfdbb855c7 --- /dev/null +++ b/packages/auth/.env.sample @@ -0,0 +1,2 @@ +NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000 +NEXT_PUBLIC_SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY} diff --git a/packages/auth/.eslintrc.js b/packages/auth/.eslintrc.js new file mode 100644 index 0000000000..63735c06ca --- /dev/null +++ b/packages/auth/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ['next/core-web-vitals'], + plugins: ['jsx-expressions'], + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + tsconfigRootDir: __dirname, + project: ['./tsconfig.json'], + }, + rules: { + 'jsx-expressions/strict-logical-expressions': 'warn', + 'react/no-unescaped-entities': 'off', + }, +}; diff --git a/packages/auth/.gitignore b/packages/auth/.gitignore new file mode 100644 index 0000000000..0d7ef35602 --- /dev/null +++ b/packages/auth/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +certificates \ No newline at end of file diff --git a/packages/auth/.prettierrc.js b/packages/auth/.prettierrc.js new file mode 100644 index 0000000000..a3417f5ac9 --- /dev/null +++ b/packages/auth/.prettierrc.js @@ -0,0 +1,6 @@ +module.exports = { + bracketSpacing: false, + singleQuote: true, + arrowParens: 'avoid', + endOfLine: 'auto', +}; diff --git a/packages/auth/.storybook/main.js b/packages/auth/.storybook/main.js new file mode 100644 index 0000000000..944f2f94ad --- /dev/null +++ b/packages/auth/.storybook/main.js @@ -0,0 +1,58 @@ +/** + * Configuration générale du storybook + */ + +const path = require('path'); +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); + +module.exports = { + // pattern de recherche des stories + stories: ['../**/*.stories.tsx'], + + // extensions chargées + addons: [ + // les extensions les plus utilisées (Actions, Controls, Docs...) + '@storybook/addon-essentials', + // pour faire fonctionner tailwind dans le storybook + { + name: '@storybook/addon-styling-webpack', + options: { + rules: [ + { + test: /\.css$/, + use: [ + require.resolve('style-loader'), + { + loader: require.resolve('css-loader'), + options: {importLoaders: 1}, + }, + require.resolve('postcss-loader'), + ], + }, + ], + }, + }, + ], + + // ajoute les alias de chemins d'import définis dans la config TS + webpackFinal: config => { + config.resolve.plugins = config.resolve.plugins || []; + config.resolve.plugins.push( + new TsconfigPathsPlugin({ + configFile: path.resolve(__dirname, '../tsconfig.json'), + }), + ); + + return config; + }, + + framework: '@storybook/nextjs', + + docs: { + autodocs: true, + }, + core: { + builder: 'webpack5', + disableTelemetry: true, + }, +}; diff --git a/packages/auth/.storybook/preview.css b/packages/auth/.storybook/preview.css new file mode 100644 index 0000000000..d215b20a55 --- /dev/null +++ b/packages/auth/.storybook/preview.css @@ -0,0 +1,4 @@ +/** retire le souligné dsfr sous les liens dans la doc générée par le sb */ +.sbdocs [href] { + background-image: none; +} diff --git a/packages/auth/.storybook/preview.js b/packages/auth/.storybook/preview.js new file mode 100644 index 0000000000..ff49993201 --- /dev/null +++ b/packages/auth/.storybook/preview.js @@ -0,0 +1,5 @@ +// charge les styles globaux +import '../app/global.css'; + +// surcharge les styles pour la zone de prévisualisation +import './preview.css'; diff --git a/packages/auth/README.md b/packages/auth/README.md new file mode 100644 index 0000000000..bb30f88bc8 --- /dev/null +++ b/packages/auth/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/packages/auth/app/error/page.tsx b/packages/auth/app/error/page.tsx new file mode 100644 index 0000000000..b8cbf93080 --- /dev/null +++ b/packages/auth/app/error/page.tsx @@ -0,0 +1,15 @@ +'use client'; + +import {Alert} from '@tet/ui'; + +const ErrorPage = () => { + return ( + + ); +}; + +export default ErrorPage; diff --git a/packages/auth/app/global.css b/packages/auth/app/global.css new file mode 100644 index 0000000000..b09e638e95 --- /dev/null +++ b/packages/auth/app/global.css @@ -0,0 +1,2 @@ +/* feuille de styles globale fournie par le module partagé */ +@import '@tet/ui/dist/global.css'; diff --git a/packages/auth/app/layout.tsx b/packages/auth/app/layout.tsx new file mode 100644 index 0000000000..aa52b775fc --- /dev/null +++ b/packages/auth/app/layout.tsx @@ -0,0 +1,44 @@ +import './global.css'; +import PHProvider from 'providers/posthog'; +import Header from '@components/Layout/Header'; + +export const metadata = { + title: 'Territoires en Transitions', + description: + 'Initiez des actions impactantes et valorisez le chemin déjà parcouru', + lang: 'fr', + icons: { + icon: '/favicon.ico', + other: [ + { + rel: 'icon', + url: '/favicon-32x32.png', + type: 'image/png', + sizes: '32x32', + }, + { + rel: 'icon', + url: '/favicon-16x16.png', + type: 'image/png', + sizes: '16x16', + }, + ], + }, +}; + +export default function RootLayout({children}: {children: React.ReactNode}) { + return ( + + + +
+
+
+
{children}
+
+
+ +
+ + ); +} diff --git a/packages/auth/app/login/page.tsx b/packages/auth/app/login/page.tsx new file mode 100644 index 0000000000..5298a0564e --- /dev/null +++ b/packages/auth/app/login/page.tsx @@ -0,0 +1,41 @@ +// modale floating-ui ne pouvant s'afficher que côté client... +'use client'; + +import {useSearchParams} from 'next/navigation'; +import {LoginModal} from '@components/Login/LoginModal'; +import {useLoginState} from './useLoginState'; + +/** + * Affiche la page d'authentification + * + * Après authentification, si les searchParams de l'url contiennent + * `redirect_to`, l'utilisateur est redirigé sur la page voulue, et à défaut sur + * l'app. + */ +const LoginPage = () => { + // détermine l'url vers laquelle rediriger après un login réussi + const searchParams = useSearchParams(); + const redirectTo = searchParams.get('redirect_to') || '/'; + const defaultView = searchParams.get('view'); + const defaultValues = { + email: searchParams.get('email'), + otp: searchParams.get('otp'), + }; + + const state = useLoginState({ + redirectTo, + defaultView, + defaultValues, + }); + + return ( + {}} + {...state} + /> + ); +}; + +export default LoginPage; diff --git a/packages/auth/app/login/useLoginState.tsx b/packages/auth/app/login/useLoginState.tsx new file mode 100644 index 0000000000..7ebae7aeca --- /dev/null +++ b/packages/auth/app/login/useLoginState.tsx @@ -0,0 +1,238 @@ +import {useState} from 'react'; +import {useRouter} from 'next/navigation'; +import {supabase} from 'src/clientAPI'; +import {getRootDomain, setAuthTokens} from '@tet/api'; +import { + Credentials, + LoginView, + isValidLoginView, + LoginData, +} from '@components/Login'; +import {VerifyOTPData, ResendFunction} from '@components/VerifyOTP'; +import {useGetPasswordStrength} from '@components/PasswordStrengthMeter/useGetPasswordStrength'; + +/** + * Gère l'appel à la fonction de login et la redirection après un login réussi + */ +export const useLoginState = ({ + redirectTo, + defaultView, + defaultValues, +}: { + redirectTo: string; + defaultView: string | null; + defaultValues: { + email: string | null; + otp: string | null; + }; +}) => { + const router = useRouter(); + + const getPasswordStrength = useGetPasswordStrength(); + + const [view, setView] = useState( + isValidLoginView(defaultView) ? (defaultView as LoginView) : 'etape1', + ); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + const onCancel = () => router.back(); + + const onSubmit = async (formData: LoginData) => { + // réinitialise les erreurs + setError(null); + + // connexion par lien + if (view === 'etape1' && !(formData as Credentials).password) { + const {email} = formData; + if (!email) return; + + // demande l'envoi du lien OTP de connexion + setIsLoading(true); + const {error} = await supabase.auth.signInWithOtp({ + email, + options: {shouldCreateUser: false, emailRedirectTo: redirectTo}, + }); + setIsLoading(false); + + if (error) { + setError("L'envoi du lien de connexion a échoué"); + return; + } + + // indique que le mail a été envoyé + setView('msg_lien_envoye'); + return; + } + + // connexion par mot de passe + if (view === 'etape1' && (formData as Credentials).password) { + const {email, password} = formData as Credentials; + if (!email || !password) return; + + setIsLoading(true); + const {data, error} = await supabase.auth.signInWithPassword({ + email, + password, + }); + setIsLoading(false); + + if (error) { + setError("L'email ou le mot de passe ne correspondent pas"); + return; + } + const session = data.session; + if (session) { + // enregistre les coookies de session + setAuthTokens(session, getRootDomain(document.location.hostname)); + // et redirige sur la page voulue une fois authentifié + router.push(redirectTo); + } + + return; + } + + // vérification du jeton OTP pour la connexion par lien + if (view === 'verify') { + const email = defaultValues?.email || formData?.email; + const otp = defaultValues?.otp || (formData as VerifyOTPData)?.otp; + if (!otp || !email) { + return; + } + + // vérifie le compte + setIsLoading(true); + const {data, error} = await supabase.auth.verifyOtp({ + email, + type: 'magiclink', + token: otp, + }); + setIsLoading(false); + + // sort si il y a une erreur + if (error || !data.session) { + setError('La vérification du compte a échouée'); + return; + } + + // enregistre les tokens dans le domaine racine pour pouvoir les partager entre les sous-domaines + setAuthTokens(data.session, getDomain()); + + // redirige + router.push(redirectTo); + } + + // vérification du jeton OTP pour le changement de mot de passe + if (view === 'recover') { + const email = defaultValues?.email || formData?.email; + const otp = defaultValues?.otp || (formData as VerifyOTPData)?.otp; + if (!otp || !email) { + return; + } + + // vérifie le compte + setIsLoading(true); + const {data, error} = await supabase.auth.verifyOtp({ + email, + type: 'recovery', + token: otp, + }); + setIsLoading(false); + + // sort si il y a une erreur + if (error || !data.session) { + setError('La vérification du compte a échouée'); + return; + } + + // enregistre les tokens dans le domaine racine pour pouvoir les partager entre les sous-domaines + setAuthTokens(data.session, getDomain()); + + // redirige + setView('reset_mdp'); + } + + // demande de réinitialisation + if (view === 'mdp_oublie') { + const {email} = formData; + if (!email) return; + + // demande la réinit. du mot de passe + setIsLoading(true); + const {error} = await supabase.auth.resetPasswordForEmail(email, { + redirectTo, + }); + setIsLoading(false); + + if (error) { + setError("L'envoi du lien de réinitialisation a échoué"); + return; + } + + // indique que le mail a été envoyé + setView('msg_init_mdp'); + return; + } + + // réinitialisation du mot de passe + if (view === 'reset_mdp') { + const {password} = formData as Credentials; + setIsLoading(true); + const {error} = await supabase.auth.updateUser({password}); + setIsLoading(false); + + if (error) { + setError('La réinitialisation du mot de passe a échoué'); + return; + } + + router.push(redirectTo); + } + }; + + // rappelle la fonction nécessaire si l'utilisateur demande le renvoi d'un email + const onResend: ResendFunction = async ({type, email}) => { + if (type && email) { + // réinitialise les erreurs + setError(null); + + setIsLoading(true); + let ret; + if (type === 'login') { + ret = await supabase.auth.signInWithOtp({ + email, + options: {shouldCreateUser: false, emailRedirectTo: redirectTo}, + }); + } else if (type === 'reset_password') { + ret = await supabase.auth.resetPasswordForEmail(email, { + redirectTo, + }); + } + setIsLoading(false); + if (ret?.error) { + console.error(ret?.error); + setError("L'envoi du message a échoué"); + } + return; + } + }; + + return { + onCancel, + onSubmit, + onResend, + view, + setView, + error, + setError, + isLoading, + setIsLoading, + getPasswordStrength, + }; +}; + +// détermine le domaine racine depuis l'url courante car il est nécessaire +// pour le partage des tokens entre sous-domaines +const getDomain = () => + document.location.hostname.split('.').toSpliced(0, 1).join('.') || + 'localhost'; diff --git a/packages/auth/app/page.tsx b/packages/auth/app/page.tsx new file mode 100644 index 0000000000..86c4190711 --- /dev/null +++ b/packages/auth/app/page.tsx @@ -0,0 +1,18 @@ +'use client'; + +import React, {useEffect} from 'react'; +import {useRouter} from 'next/navigation'; +import TrackPageView from '@components/TrackPageView/index'; + +const Page = () => { + const router = useRouter(); + + useEffect(() => { + router.push('/login'); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ; +}; + +export default Page; diff --git a/packages/auth/app/signup/page.tsx b/packages/auth/app/signup/page.tsx new file mode 100644 index 0000000000..2f5d4e9e03 --- /dev/null +++ b/packages/auth/app/signup/page.tsx @@ -0,0 +1,39 @@ +'use client'; + +import {useState} from 'react'; +import {useSearchParams} from 'next/navigation'; +import {SignupModal} from '@components/Signup'; +import {useCollectivites} from './useCollectivites'; +import {useSignupState} from './useSignupState'; + +/** + * Affiche la page de création de compte + * + * Après authentification, si les searchParams de l'url contiennent + * `redirect_to`, l'utilisateur est redirigé sur la page voulue, et à défaut sur + * l'app. + */ +const SignupPage = () => { + const [filter, setFilter] = useState(''); + const {data: collectivites} = useCollectivites(filter); + + const searchParams = useSearchParams(); + const defaultView = searchParams.get('view'); + const defaultValues = { + email: searchParams.get('email'), + otp: searchParams.get('otp'), + }; + const redirectTo = searchParams.get('redirect_to') || '/'; + const state = useSignupState({redirectTo, defaultView, defaultValues}); + + return ( + + ); +}; + +export default SignupPage; diff --git a/packages/auth/app/signup/useCollectivites.ts b/packages/auth/app/signup/useCollectivites.ts new file mode 100644 index 0000000000..780d32bfa1 --- /dev/null +++ b/packages/auth/app/signup/useCollectivites.ts @@ -0,0 +1,23 @@ +import useSWR from 'swr'; +import {NonNullableFields, Views} from '@tet/api'; +import {supabase} from 'src/clientAPI'; + +/** Charge la liste des collectivités */ +const getCollectivites = async (nom?: string) => { + const query = supabase + .from('collectivite_card') + .select('value: collectivite_id, label: nom'); + + if (nom) { + query.ilike('nom', `%${nom}%`); + } else { + query.limit(15); + } + + const {data} = await query; + + return (data || []) as Array<{value: number; label: string}>; +}; + +export const useCollectivites = (nom?: string) => + useSWR(['signup-collectivite', nom], () => getCollectivites(nom)); diff --git a/packages/auth/app/signup/useSignupState.tsx b/packages/auth/app/signup/useSignupState.tsx new file mode 100644 index 0000000000..37ec28ddfc --- /dev/null +++ b/packages/auth/app/signup/useSignupState.tsx @@ -0,0 +1,194 @@ +import {useState} from 'react'; +import {useRouter} from 'next/navigation'; +import {supabase} from 'src/clientAPI'; +import {getRootDomain, setAuthTokens} from '@tet/api'; +import {useGetPasswordStrength} from '@components/PasswordStrengthMeter/useGetPasswordStrength'; +import { + SignupData, + SignupDataStep1, + SignupDataStep2, + SignupDataStep3, + SignupView, + isValidSignupView, +} from '@components/Signup'; +import {ResendFunction} from '@components/VerifyOTP'; + +/** + * Gère l'appel à la fonction de signup et la redirection + */ +export const useSignupState = ({ + redirectTo, + defaultView, + defaultValues, +}: { + redirectTo: string; + defaultView: string | null; + defaultValues: { + email: string | null; + otp: string | null; + }; +}) => { + const router = useRouter(); + + const getPasswordStrength = useGetPasswordStrength(); + + const [view, setView] = useState( + isValidSignupView(defaultView) ? (defaultView as SignupView) : 'etape1', + ); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + const onCancel = () => router.back(); + + const onSubmit = async (formData: SignupData) => { + // réinitialise les erreurs + setError(null); + + // ETAPE 1 + if (view === 'etape1') { + const {email, password} = formData as SignupDataStep1; + if (!email || isLoading) return; + + // fait l'appel approprié suivant qu'un mdp est spécifié ou non + setIsLoading(true); + const {error} = await (password + ? supabase.auth.signUp({ + email, + password, + options: {emailRedirectTo: redirectTo}, + }) + : supabase.auth.signInWithOtp({ + email, + options: {shouldCreateUser: true, emailRedirectTo: redirectTo}, + })); + setIsLoading(false); + + // sort si il y a une erreur + if (error) { + console.error(error.status, error.name, error.message); + setError( + error.message === 'User already registered' + ? 'Utilisateur déjà enregistré' + : `Le compte n'a pas pu être créé`, + ); + return; + } + + // demande la saisie du code reçu par mail + setView(password ? 'etape2' : 'msg_lien_envoye'); + } + + // ETAPE 2 + if (view === 'etape2') { + const email = defaultValues?.email || formData?.email; + const otp = defaultValues?.otp || (formData as SignupDataStep2)?.otp; + if (!otp || !email) { + return; + } + + // vérifie le compte + setIsLoading(true); + const {data, error} = await supabase.auth.verifyOtp({ + email, + type: 'signup', + token: otp, + }); + setIsLoading(false); + + // sort si il y a une erreur + if (error || !data.session) { + setError('La vérification du compte a échouée'); + return; + } + + // le partage des tokens entre sous-domaines nécessite le nom du domaine racine. + const domain = getRootDomain(document.location.hostname); + + // enregistre les tokens dans le domaine racine pour pouvoir les partager entre les sous-domaines + setAuthTokens(data.session, domain); + + // demande la saisie des DCP et l'acceptation des CGU + setView('etape3'); + } + + // ETAPE 3 + if (view === 'etape3') { + // enregistre les DCP + const {data} = await supabase.auth.getSession(); + const user_id = data.session?.user?.id; + if (user_id) { + const email = defaultValues?.email || formData?.email; + const {telephone, prenom, nom} = formData as SignupDataStep3; + + if (!email) return; + + const {error} = await supabase.from('dcp').insert([ + { + email, + telephone, + prenom, + nom, + user_id, + }, + ]); + // et l'acceptation des CGU + const {error: error2} = await supabase.rpc('accepter_cgu'); + + if (error || error2) { + setError('Une erreur est survenue. Veuillez contacter le support.'); + return; + } + + // et redirige + document.location.replace(redirectTo); + } else { + setError('Une erreur est survenue. Veuillez contacter le support.'); + return; + } + } + }; + + // rappelle la fonction nécessaire si l'utilisateur demande le renvoi d'un email + const onResend: ResendFunction = async ({type, email}) => { + if (type && email) { + // réinitialise les erreurs + setError(null); + + setIsLoading(true); + let ret; + if (type === 'signup') { + ret = await supabase.auth.resend({ + type, + email, + options: { + emailRedirectTo: redirectTo, + }, + }); + } else if (type === 'login') { + ret = await supabase.auth.signInWithOtp({ + email, + options: {shouldCreateUser: true, emailRedirectTo: redirectTo}, + }); + } + setIsLoading(false); + if (ret?.error) { + console.error(ret?.error); + setError("L'envoi du message a échoué"); + } + return; + } + }; + + return { + onCancel, + onSubmit, + onResend, + view, + setView, + error, + setError, + isLoading, + setIsLoading, + getPasswordStrength, + }; +}; diff --git a/packages/auth/components/Layout/Header.tsx b/packages/auth/components/Layout/Header.tsx new file mode 100644 index 0000000000..c5093b68e4 --- /dev/null +++ b/packages/auth/components/Layout/Header.tsx @@ -0,0 +1,10 @@ +'use client'; + +import {HeaderTeT} from '@tet/ui'; + +// wrapper du Header avec le use client +const Header = () => { + return ; +}; + +export default Header; diff --git a/packages/auth/components/Login/ForgottenPassword.tsx b/packages/auth/components/Login/ForgottenPassword.tsx new file mode 100644 index 0000000000..43572ff0ea --- /dev/null +++ b/packages/auth/components/Login/ForgottenPassword.tsx @@ -0,0 +1,110 @@ +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import { + Button, + Input, + Field, + FieldMessage, + ModalFooter, + ModalFooterOKCancel, + ModalFooterSection, +} from '@tet/ui'; +import {LoginPropsWithState} from './type'; + +/** Gestionnaire d'état pour le formulaire */ +const useForgottenPassword = (email: string) => { + const validationSchema = z.object({ + email: z.string().email({message: 'Un email valide est requis'}), + }); + + return useForm({ + reValidateMode: 'onChange', + resolver: zodResolver(validationSchema), + defaultValues: { + email: email || '', + }, + }); +}; + +/** Demande de réinitialisation du mot de passe */ +export const ForgottenPassword = (props: LoginPropsWithState) => { + const { + formState, + error, + isLoading, + setView, + onSubmit, + onCancel, + onOpenChatbox, + } = props; + const {email, setEmail} = formState; + const form = useForgottenPassword(email); + const { + handleSubmit, + register, + formState: {isValid, errors}, + } = form; + + const onSubmitForm = (data: {email: string}) => { + // enregistre les données car on a besoin de l'email pour vérifier l'otp à + // l'étape suivante, dans le cas où l'utilisateur saisi directement le code + // OTP plutôt que de cliquer sur le lien + setEmail(data.email); + // envoi les données + onSubmit(data); + }; + + return ( +
+ + + + + {onOpenChatbox && ( + + )} + {!!error && ( + + )} + + + + + + + + ); +}; diff --git a/packages/auth/components/Login/Login.stories.tsx b/packages/auth/components/Login/Login.stories.tsx new file mode 100644 index 0000000000..6ad41e123d --- /dev/null +++ b/packages/auth/components/Login/Login.stories.tsx @@ -0,0 +1,68 @@ +import {useState} from 'react'; +import {Meta, StoryObj} from '@storybook/react'; +import {action} from '@storybook/addon-actions'; +import {Login} from './Login'; +import {LoginView} from './type'; + +const meta: Meta = { + component: Login, + args: { + onCancel: action('onCancel'), + onSubmit: action('onSubmit'), + onOpenChatbox: action('onOpenChatbox'), + getPasswordStrength: (...args) => { + action('getPasswordStrength')(...args); + return null; + }, + defaultValues: {email: 'yolo@dodo.com', otp: ''}, + }, + render: props => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const [view, setView] = useState(props.view || 'etape1'); + const onSetView: typeof setView = (...args) => { + action('setView')(...args); + setView(...args); + }; + return ; + }, +}; + +export default meta; + +type Story = StoryObj; + +export const SansMotDePasse: Story = { + args: {}, +}; + +export const MsgLienEnvoye: Story = { + args: {view: 'msg_lien_envoye'}, +}; + +export const AvecErreur: Story = { + args: {error: 'Une erreur est survenue...'}, +}; + +export const AvecMotDePasse: Story = { + args: {withPassword: true}, +}; + +export const AvecMotDePasseEtErreur: Story = { + args: {withPassword: true, error: 'Une erreur est survenue...'}, +}; + +export const MotDePasseOublie: Story = { + args: {view: 'mdp_oublie'}, +}; + +export const MsgInitMdp: Story = { + args: {view: 'msg_init_mdp'}, +}; + +export const Recover: Story = { + args: {view: 'recover'}, +}; + +export const ReinitMotDePasse: Story = { + args: {view: 'reset_mdp'}, +}; diff --git a/packages/auth/components/Login/Login.tsx b/packages/auth/components/Login/Login.tsx new file mode 100644 index 0000000000..187bbd9fb8 --- /dev/null +++ b/packages/auth/components/Login/Login.tsx @@ -0,0 +1,73 @@ +import {LoginProps} from './type'; +import {MailSendMessage} from './MailSendMessage'; +import {ResetPassword} from './ResetPassword'; +import {VerifyOTP} from '../VerifyOTP'; +import {ResendMessage} from '../ResendMessage'; +import {LoginTabs} from './LoginTabs'; +import {useFormState} from './useFormState'; +import {ForgottenPassword} from './ForgottenPassword'; + +/** + * Affiche le panneau d'authentification et le formulaire "mot de passe oublié" + */ +export const Login = (props: LoginProps) => { + const {view, onResend, isLoading} = props; + const formState = useFormState(props); + + // affiche les onglets connexion sans/avec mot de passe + if (view === 'etape1') { + return ; + } + + if (view === 'mdp_oublie') { + return ; + } + + if (view === 'recover') { + return ; + } + + if (view === 'reset_mdp') { + return ; + } + + if (view === 'verify') { + return ; + } + + if (view === 'msg_lien_envoye') { + return ( + <> + + + + ); + } + + if (view === 'msg_init_mdp') { + return ( + <> + + + + ); + } +}; diff --git a/packages/auth/components/Login/LoginModal.tsx b/packages/auth/components/Login/LoginModal.tsx new file mode 100644 index 0000000000..5807343b65 --- /dev/null +++ b/packages/auth/components/Login/LoginModal.tsx @@ -0,0 +1,44 @@ +import {useState} from 'react'; +import {Modal} from '@tet/ui'; +import {LoginProps, LoginView} from './type'; +import {Login} from './Login'; + +/** + * Encapsule le panneau d'authentification dans une modale + */ +export const LoginModal = (props: LoginProps) => { + const [isOpen, setIsOpen] = useState(true); + const {view, onCancel} = props; + + const onClose = () => { + setIsOpen(false); + onCancel(); + }; + + return ( + onClose()} />} + /> + ); +}; + +// la modale est en format "md" pour ces contenus +const mdDialog: LoginView[] = [ + 'msg_init_mdp', + 'msg_lien_envoye', + 'verify', + 'reset_mdp', +]; + +// retourne le titre approprié de la modale en fonction de son contenu +const getTitle = (view: LoginView) => { + if (view === 'etape1') return 'Se connecter'; + if (view === 'mdp_oublie') return 'Mot de passe oublié ?'; + if (view === 'reset_mdp') return 'Choisissez votre nouveau mot de passe'; +}; diff --git a/packages/auth/components/Login/LoginTabs.tsx b/packages/auth/components/Login/LoginTabs.tsx new file mode 100644 index 0000000000..2834b56235 --- /dev/null +++ b/packages/auth/components/Login/LoginTabs.tsx @@ -0,0 +1,157 @@ +import {useState} from 'react'; +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import { + Button, + Input, + Field, + FieldMessage, + ModalFooterOKCancel, + Tab, + Tabs, +} from '@tet/ui'; +import {Credentials, LoginPropsWithState} from './type'; + +/** Gestionnaire d'état pour le formulaire de l'étape 1 */ +const useLoginForm = (isPasswordless: boolean, email: string) => { + const validationSchema = z.object({ + email: z.string().email({message: 'Un email valide est requis'}), + password: z + .string() + .refine(value => (isPasswordless ? true : value.length >= 8), { + message: 'Le mot de passe doit comporter au moins 8 caractères', + }), + }); + + return useForm({ + reValidateMode: 'onChange', + resolver: zodResolver(validationSchema), + defaultValues: { + password: '', + email: email || '', + }, + }); +}; + +/** + * Affiche l'étape 1 du panneau de connexion + * (saisir un email et éventuellement un mot de passe) + */ +export const LoginTabs = (props: LoginPropsWithState) => { + const {formState: signupState, withPassword} = props; + const {email} = signupState; + const [isPasswordless, setIsPasswordless] = useState(!withPassword); + const form = useLoginForm(isPasswordless, email); + + return ( + { + if (activeTab === 0) { + // reset le champ mdp qui peut être rempli quand on passe d'un onglet à l'autre + form.setValue('password', ''); + setIsPasswordless(true); + } else { + setIsPasswordless(false); + } + }} + > + + + + + + + + ); +}; + +/** + * Affiche le formulaire pour l'étape 1 la connnexion + */ +const SignupStep1Form = ( + props: LoginPropsWithState & { + form: ReturnType; + isPasswordless?: boolean; + }, +) => { + const { + error, + isLoading, + isPasswordless, + setView, + onSubmit, + onCancel, + form, + formState: {setEmail}, + } = props; + const { + handleSubmit, + register, + formState: {isValid, errors}, + } = form; + + const onSubmitForm = (data: Credentials) => { + // enregistre les données car on a besoin de l'email pour vérifier l'otp à + // l'étape suivante, dans le cas où l'utilisateur saisi directement le code + // OTP plutôt que de cliquer sur le lien contenu dans le mail + setEmail(data.email); + // envoi les données + onSubmit(data); + }; + + return ( +
+ + + + {!isPasswordless && ( + <> + + + + + + )} + {!!error && ( + + )} + + + ); +}; diff --git a/packages/auth/components/Login/MailSend.tsx b/packages/auth/components/Login/MailSend.tsx new file mode 100644 index 0000000000..c31d44bdbe --- /dev/null +++ b/packages/auth/components/Login/MailSend.tsx @@ -0,0 +1,65 @@ +type MailSendProps = { + className?: string; +}; + +const MailSend = ({className}: MailSendProps) => ( + + + + + + + + + + + + + + +); + +export default MailSend; diff --git a/packages/auth/components/Login/MailSendMessage.tsx b/packages/auth/components/Login/MailSendMessage.tsx new file mode 100644 index 0000000000..5a43c9fd3c --- /dev/null +++ b/packages/auth/components/Login/MailSendMessage.tsx @@ -0,0 +1,23 @@ +import MailSend from './MailSend'; + +/** Affiche un message suite à l'envoi du mail de connexion ou de + * réinitialisation du mot de passe */ +export const MailSendMessage = ({ + message1, + message2, + 'data-test': dataTest, +}: { + message1: string; + message2: string; + 'data-test'?: string; +}) => { + return ( +
+ +

+ {message1}{' '} + {message2} +

+
+ ); +}; diff --git a/packages/auth/components/Login/ResetPassword.tsx b/packages/auth/components/Login/ResetPassword.tsx new file mode 100644 index 0000000000..59065991e1 --- /dev/null +++ b/packages/auth/components/Login/ResetPassword.tsx @@ -0,0 +1,68 @@ +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import {Input, Field, FieldMessage, ModalFooterOKCancel} from '@tet/ui'; +import {LoginPropsWithState} from './type'; +import {PasswordStrengthMeter} from '@components/PasswordStrengthMeter'; + +/** Gestionnaire d'état pour le formulaire */ +const useResetPassword = (email: string) => { + const validationSchema = z.object({ + password: z.string().refine(value => value.length >= 8, { + message: 'Le mot de passe doit comporter au moins 8 caractères', + }), + }); + + return useForm({ + reValidateMode: 'onChange', + resolver: zodResolver(validationSchema), + defaultValues: { + email: email || '', + password: '', + }, + }); +}; + +/** Réinitialisation du mot de passe après validation du jeton OTP */ +export const ResetPassword = (props: LoginPropsWithState) => { + const { + error, + isLoading, + onCancel, + onSubmit, + getPasswordStrength, + defaultValues, + } = props; + const { + handleSubmit, + register, + watch, + formState: {isValid}, + } = useResetPassword(defaultValues?.email || ''); + + const password = watch('password'); + const res = getPasswordStrength(password, [defaultValues?.email || '']); + + return ( +
+ + + {!!res && } + + {!!error && ( + + )} + + + ); +}; diff --git a/packages/auth/components/Login/SessionProvider.tsx b/packages/auth/components/Login/SessionProvider.tsx new file mode 100644 index 0000000000..4c658a5893 --- /dev/null +++ b/packages/auth/components/Login/SessionProvider.tsx @@ -0,0 +1,57 @@ +import {ReactNode, createContext, useEffect, useState} from 'react'; +import {Session, SupabaseClient} from '@supabase/supabase-js'; +import {clearAuthTokens, setAuthTokens} from '@tet/api'; + +const SessionContext = createContext(null); + +type SessionProviderProps = { + children: ReactNode; + /** Nom du domaine principal auquel les cookies de session sont rattachés */ + domain: string; + /** Client sur lequel écouter les événements d'authentification */ + supabase: SupabaseClient; +}; + +/** + * Ecoute les événements d'authentification et fourni les informations de session. + */ +export const SessionProvider = ({ + children, + domain, + supabase, +}: SessionProviderProps) => { + const [currentSession, setCurrentSession] = useState(null); + + // enregistre l'écouteur d'événements + useEffect(() => { + const { + data: {subscription}, + } = supabase.auth.onAuthStateChange((event, session) => { + // efface la session et les cookies à la déconnexion + if (event === 'SIGNED_OUT') { + setCurrentSession(null); + clearAuthTokens(domain); + } + // enregistre la session et les cookies lors de la connexion + else if ( + session && + (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED') + ) { + setCurrentSession(session); + setAuthTokens(session, domain); + } + }); + + // supprime l'écouteur qd le compo est démonté + return () => { + subscription.unsubscribe(); + }; + }, [supabase.auth, domain]); + + // expose la session + return ( + + {children} + + ); +}; diff --git a/packages/auth/components/Login/index.ts b/packages/auth/components/Login/index.ts new file mode 100644 index 0000000000..d7b590f3dd --- /dev/null +++ b/packages/auth/components/Login/index.ts @@ -0,0 +1,4 @@ +export * from './Login'; +export * from './LoginModal'; +export * from './SessionProvider'; +export * from './type'; diff --git a/packages/auth/components/Login/type.ts b/packages/auth/components/Login/type.ts new file mode 100644 index 0000000000..5391b88d4b --- /dev/null +++ b/packages/auth/components/Login/type.ts @@ -0,0 +1,50 @@ +import {ZxcvbnResult} from '@zxcvbn-ts/core'; +import {ResendFunction, VerifyOTPData} from '@components/VerifyOTP'; +import {FormState} from './useFormState'; + +const ValidLoginView = [ + 'etape1', + 'mdp_oublie', + 'msg_lien_envoye', + 'msg_init_mdp', + 'verify', + 'recover', + 'reset_mdp', +] as const; +export const isValidLoginView = (view: string | null) => + ValidLoginView.includes(view as LoginView); +export type LoginView = (typeof ValidLoginView)[number]; + +export type Credentials = {email: string; password?: string}; + +export type LoginData = Credentials | VerifyOTPData; + +export type LoginProps = { + /** Vue courante */ + view: LoginView; + /** Permet de passer d'une vue à une autre */ + setView: (view: LoginView) => void; + /** Valeurs par défaut pour initialiser les formulaires */ + defaultValues: {email: string | null; otp: string | null}; + /** Erreur à afficher */ + error: string | null; + /** Indique qu'un appel réseau est en cours */ + isLoading?: boolean; + /** Indique que l'option "avec mot de passe" est activée */ + withPassword?: boolean; + /** Fonction appelée à l'envoi du formulaire */ + onSubmit: (formData: LoginData) => void; + /** Fonction appelée à l'annulation du formulaire */ + onCancel: () => void; + /** Fonction appelée pour renvoyer l'email contenant le code */ + onResend: ResendFunction; + /** Fonction appelée lors du clic sur le bouton "contactez le support" */ + onOpenChatbox?: () => void; + /** Pour contrôler la robustesse des mots de passe */ + getPasswordStrength: ( + password: string, + otherValues: string[], + ) => ZxcvbnResult | null; +}; + +export type LoginPropsWithState = LoginProps & {formState: FormState}; diff --git a/packages/auth/components/Login/useFormState.tsx b/packages/auth/components/Login/useFormState.tsx new file mode 100644 index 0000000000..a2daf40341 --- /dev/null +++ b/packages/auth/components/Login/useFormState.tsx @@ -0,0 +1,21 @@ +import {useState} from 'react'; + +/** + * Gère l'état du formulaire de connexion et de création de compte + * (pour partarger l'email entre plusieurs étapes de la modale) + */ +export const useFormState = (props: { + defaultValues?: {email?: string | null}; +}) => { + const {defaultValues} = props; + + // données collectées dans les formulaires + const [email, setEmail] = useState(defaultValues?.email || ''); + + return { + email, + setEmail, + }; +}; + +export type FormState = ReturnType; diff --git a/packages/auth/components/PasswordStrengthMeter/PasswordStrengthMeter.stories.tsx b/packages/auth/components/PasswordStrengthMeter/PasswordStrengthMeter.stories.tsx new file mode 100644 index 0000000000..5ad369b7d0 --- /dev/null +++ b/packages/auth/components/PasswordStrengthMeter/PasswordStrengthMeter.stories.tsx @@ -0,0 +1,38 @@ +import {Meta, StoryObj} from '@storybook/react'; +import {ZxcvbnResult} from '@zxcvbn-ts/core'; +import {PasswordStrengthMeter} from './PasswordStrengthMeter'; + +const meta: Meta = { + component: PasswordStrengthMeter, +}; + +export default meta; + +const feedback = { + warning: + 'Les lignes droites de touches de votre clavier sont faciles à deviner', + suggestions: [ + 'Évitez les séquences de caractères courantes.', + "Évitez les substitutions de lettres prévisibles comme '@' pour 'a'.", + ], +}; + +export const Nul = () => ( + +); + +export const Faible = () => ( + +); + +export const Passable = () => ( + +); + +export const Bon = () => ( + +); + +export const Robuste = () => ( + +); diff --git a/packages/auth/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx b/packages/auth/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx new file mode 100644 index 0000000000..285791fdcf --- /dev/null +++ b/packages/auth/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx @@ -0,0 +1,72 @@ +import {ZxcvbnResult} from '@zxcvbn-ts/core'; + +// libellés et couleurs en fonction du niveau de robustesse du mdp +const DEFAULT_LABEL = 'Faible'; +const labelsByScore = [ + DEFAULT_LABEL, + DEFAULT_LABEL, + 'Passable', + 'Bon', + 'Robuste', +]; + +const DEFAULT_BG_COLOR = 'bg-error-1'; +const bgColorsByScore = [ + DEFAULT_BG_COLOR, + DEFAULT_BG_COLOR, + 'bg-warning-1', + 'bg-warning-3', + 'bg-success', +]; + +const DEFAULT_TEXT_COLOR = 'text-error-1'; +const textColorsByScore = [ + DEFAULT_TEXT_COLOR, + DEFAULT_TEXT_COLOR, + 'text-warning-1', + 'text-grey-7', + 'text-success', +]; + +/** + * Affiche un indicateur de robustesse du mot de passe + */ +export const PasswordStrengthMeter = ({ + strength, + className, +}: { + /** Résultat du contrôle de robustesse tel que fourni par zxcvbn */ + strength: ZxcvbnResult; + /** Styles appliqués au container */ + className?: string; +}) => { + if (!strength) return; + + const {score, feedback} = strength; + const {warning, suggestions} = feedback || {}; + const label = labelsByScore[score] || DEFAULT_LABEL; + const bgColor = bgColorsByScore[score] || DEFAULT_BG_COLOR; + const textColor = textColorsByScore[score] || DEFAULT_TEXT_COLOR; + + return ( +
+
+
+
+ + {warning ? : null} + {suggestions?.length ? ( +
    + {suggestions.map(s => ( +
  • {s}
  • + ))} +
+ ) : null} +
+ ); +}; diff --git a/packages/auth/components/PasswordStrengthMeter/index.ts b/packages/auth/components/PasswordStrengthMeter/index.ts new file mode 100644 index 0000000000..5595451306 --- /dev/null +++ b/packages/auth/components/PasswordStrengthMeter/index.ts @@ -0,0 +1 @@ +export * from './PasswordStrengthMeter'; diff --git a/packages/auth/components/PasswordStrengthMeter/useGetPasswordStrength.ts b/packages/auth/components/PasswordStrengthMeter/useGetPasswordStrength.ts new file mode 100644 index 0000000000..a83b32e862 --- /dev/null +++ b/packages/auth/components/PasswordStrengthMeter/useGetPasswordStrength.ts @@ -0,0 +1,60 @@ +'use client'; + +import {zxcvbn, zxcvbnOptions} from '@zxcvbn-ts/core'; +import {useEffect} from 'react'; + +// certains mots spécifiques du site qui vont faire baisser le score du mdp +const UNSAFE_WORDS = ['ademe', 'tet', 'territoire', 'transition']; + +/** + * Charge les options et expose la fonction permettant de contrôler la + * robustesse des mots de passe. + */ +export const useGetPasswordStrength = () => { + useEffect(() => { + loadOptions(); + }, []); + + return getPasswordStrength; +}; + +/** + * Charge de manière asynchrone les options de la bibliothèque de contrôle de + * robustesse des mots de passe. + */ +const loadOptions = async () => { + const zxcvbnCommonPackage = await import('@zxcvbn-ts/language-common'); + const zxcvbnFrPackage = await import('@zxcvbn-ts/language-fr'); + + // options pour le calcul de robustesse + const options = { + // les traductions des messages d'aide + translations: zxcvbnFrPackage.translations, + // les dispositions de clavier standard + graphs: zxcvbnCommonPackage.adjacencyGraphs, + // les dictionnaires de noms communs + dictionary: { + ...zxcvbnCommonPackage.dictionary, + ...zxcvbnFrPackage.dictionary, + }, + // recommended + useLevenshteinDistance: true, + }; + zxcvbnOptions.setOptions(options); +}; + +/** + * Détermine la robustesse du mot de passe + */ +const getPasswordStrength = ( + /** mot de passe */ + password: string, + /** autres valeurs à éviter dans le mdp */ + otherValues: string[], +) => { + if (!password) return null; + // pour éviter les mdp trop faciles à deviner les autres valeurs du formulaire + // (comme l'email) doivent également être prises en compte + const userInputs = [...otherValues, ...UNSAFE_WORDS]; + return zxcvbn(password, userInputs); +}; diff --git a/packages/auth/components/ResendMessage/ResendMessage.stories.tsx b/packages/auth/components/ResendMessage/ResendMessage.stories.tsx new file mode 100644 index 0000000000..9dd058d1d0 --- /dev/null +++ b/packages/auth/components/ResendMessage/ResendMessage.stories.tsx @@ -0,0 +1,31 @@ +import {Meta, StoryObj} from '@storybook/react'; +import {action} from '@storybook/addon-actions'; +import {ResendMessage} from './ResendMessage'; + +const meta: Meta = { + component: ResendMessage, + args: { + email: 'yolo@dodo.com', + type: 'login', + onResend: action('onResend'), + }, +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; + +export const Opened: Story = { + args: { + isOpened: true, + }, +}; + +export const Loading: Story = { + args: { + isOpened: true, + isLoading: true, + }, +}; diff --git a/packages/auth/components/ResendMessage/ResendMessage.tsx b/packages/auth/components/ResendMessage/ResendMessage.tsx new file mode 100644 index 0000000000..d09e96b68e --- /dev/null +++ b/packages/auth/components/ResendMessage/ResendMessage.tsx @@ -0,0 +1,72 @@ +import {useState} from 'react'; +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import {Button, Input} from '@tet/ui'; +import {ResendFunction, VerifyType} from '../VerifyOTP'; + +type ResendMessageProps = { + /** Adresse par défaut à laquelle renvoyer le message */ + email: string; + /** Indique un chargement un cours */ + isLoading: boolean | undefined; + /** Indique que le champ de saisie de l'email et le bouton "envoyer" sont visible */ + isOpened?: boolean; + /** Appelée pour renvoyer le message */ + onResend: ResendFunction; + /** Type de vérification */ + type: VerifyType; +}; + +/** + * Invite à ré-essayer d'envoyer un message pour la connexion, la validation + * d'email d'un nouveau compte ou la réninitialisation d'un mot de passe. + */ +export const ResendMessage = (props: ResendMessageProps) => { + const {email, isLoading, isOpened = false, onResend, type} = props; + const validationSchema = z.object({ + email: z.string().email({message: 'Un email valide est requis'}), + }); + + const {register, watch, formState} = useForm({ + resolver: zodResolver(validationSchema), + defaultValues: {email}, + }); + const emailValue = watch('email'); + + const [opened, setOpened] = useState(isOpened); + + return ( +
+ + + {opened && ( +
+

+ Vérifiez le dossier spam de votre messagerie ou essayez à + nouveau d'envoyer le message à l'adresse : +

+ { + onResend({type, email: emailValue}); + setOpened(false); + }, + }, + }} + /> +
+ )} +
+ ); +}; diff --git a/packages/auth/components/ResendMessage/index.ts b/packages/auth/components/ResendMessage/index.ts new file mode 100644 index 0000000000..aa43981e1e --- /dev/null +++ b/packages/auth/components/ResendMessage/index.ts @@ -0,0 +1 @@ +export * from './ResendMessage'; diff --git a/packages/auth/components/Signup/Signup.stories.tsx b/packages/auth/components/Signup/Signup.stories.tsx new file mode 100644 index 0000000000..b10398a15b --- /dev/null +++ b/packages/auth/components/Signup/Signup.stories.tsx @@ -0,0 +1,75 @@ +import {useState} from 'react'; +import {Meta, StoryObj} from '@storybook/react'; +import {action} from '@storybook/addon-actions'; +import {Signup} from './Signup'; +import {SignupView} from './type'; + +const meta: Meta = { + component: Signup, + args: { + defaultValues: { + email: 'yolo@dodo.com', + }, + collectivites: [ + {value: 1270, label: 'Grenoble'}, + {value: 5460, label: '#Collectivité Test'}, + ], + onSubmit: action('onSubmit'), + onCancel: action('onCancel'), + onFilterCollectivites: action('onFilterCollectivites'), + getPasswordStrength: (...args) => { + action('getPasswordStrength')(...args); + return null; + }, + }, + render: props => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const [view, setView] = useState(props.view || 'etape1'); + const onSetView: typeof setView = (...args) => { + action('setView')(...args); + setView(...args); + }; + return ; + }, +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; + +export const Etape1AvecMdp: Story = { + args: { + view: 'etape1', + withPassword: true, + }, +}; + +export const Etape2: Story = { + args: { + view: 'etape2', + }, +}; + +export const Etape2Erreur: Story = { + args: {view: 'etape2', error: "Message d'erreur"}, +}; + +export const Etape3: Story = { + args: {view: 'etape3'}, +}; + +export const Etape3Erreur: Story = { + args: {view: 'etape3', error: "Message d'erreur"}, +}; + +export const Etape4: Story = { + args: {view: 'etape4'}, +}; + +export const Etape4Erreur: Story = { + args: {view: 'etape4', error: "Message d'erreur"}, +}; diff --git a/packages/auth/components/Signup/Signup.tsx b/packages/auth/components/Signup/Signup.tsx new file mode 100644 index 0000000000..041b350592 --- /dev/null +++ b/packages/auth/components/Signup/Signup.tsx @@ -0,0 +1,50 @@ +import {MailSendMessage} from '@components/Login/MailSendMessage'; +import {useFormState} from '@components/Login/useFormState'; +import {SignupProps} from './type'; +import {SignupStep1} from './SignupStep1'; +import {SignupStep2} from './SignupStep2'; +import {SignupStep3} from './SignupStep3'; +import {SignupStep4} from './SignupStep4'; +import {ResendMessage} from '../ResendMessage'; + +/** + * Affiche le panneau création de compte + */ +export const Signup = (props: SignupProps) => { + const {view, onResend, isLoading} = props; + const formState = useFormState(props); + + if (view === 'etape1') { + return ; + } + + if (view === 'etape2') { + return ; + } + + if (view === 'etape3') { + return ; + } + + if (view === 'etape4') { + return ; + } + + if (view === 'msg_lien_envoye') { + return ( + <> + + + + ); + } +}; diff --git a/packages/auth/components/Signup/SignupModal.tsx b/packages/auth/components/Signup/SignupModal.tsx new file mode 100644 index 0000000000..90cf5706b9 --- /dev/null +++ b/packages/auth/components/Signup/SignupModal.tsx @@ -0,0 +1,40 @@ +import {useState} from 'react'; +import {Modal} from '@tet/ui'; +import {SignupProps, SignupView} from './type'; +import {Signup} from './Signup'; + +/** + * Encapsule le panneau de création de compte dans une modale + */ +export const SignupModal = (props: SignupProps) => { + const [isOpen, setIsOpen] = useState(true); + const {view, onCancel} = props; + + const onClose = () => { + setIsOpen(false); + onCancel(); + }; + + return ( + onClose()} />} + /> + ); +}; + +// la modale est en format "md" pour ces contenus +const mdDialog: SignupView[] = ['msg_lien_envoye', 'etape2']; + +// retourne le titre approprié de la modale en fonction de son contenu +const getTitle = (view: SignupView) => { + if (view === 'etape1') return 'Créer un compte'; + if (view === 'etape3') + return 'Il nous manque quelques informations sur vous !'; +}; diff --git a/packages/auth/components/Signup/SignupStep1.tsx b/packages/auth/components/Signup/SignupStep1.tsx new file mode 100644 index 0000000000..7b984a08ea --- /dev/null +++ b/packages/auth/components/Signup/SignupStep1.tsx @@ -0,0 +1,147 @@ +import {useState} from 'react'; +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import { + Input, + Field, + FieldMessage, + ModalFooterOKCancel, + Tab, + Tabs, +} from '@tet/ui'; +import {SignupDataStep1, SignupPropsWithState} from './type'; +import {PasswordStrengthMeter} from '@components/PasswordStrengthMeter'; + +/** Gestionnaire d'état pour le formulaire de l'étape 1 */ +const useSignupStep1 = (isPasswordless: boolean, email: string) => { + const validationSchema = z.object({ + email: z.string().email({message: 'Un email valide est requis'}), + password: z + .string() + .refine(value => (isPasswordless ? true : value.length >= 8), { + message: 'Le mot de passe doit comporter au moins 8 caractères', + }), + }); + return useForm({ + reValidateMode: 'onChange', + resolver: zodResolver(validationSchema), + defaultValues: { + password: '', + email: email || '', + }, + }); +}; + +/** + * Affiche l'étape 1 du panneau de création de compte + * (saisir un email et éventuellement un mot de passe) + */ +export const SignupStep1 = (props: SignupPropsWithState) => { + const {formState, withPassword} = props; + const {email} = formState; + const [isPasswordless, setIsPasswordless] = useState(!withPassword); + const form = useSignupStep1(isPasswordless, email); + + return ( + { + if (activeTab === 0) { + // reset le champ mdp qui peut être rempli quand on passe d'un onglet à l'autre + form.setValue('password', ''); + setIsPasswordless(true); + } else { + setIsPasswordless(false); + } + }} + > + + + + + + + + ); +}; + +/** + * Affiche le formulaire pour l'étape 1 de la création de compte + */ +const SignupStep1Form = ( + props: SignupPropsWithState & { + form: ReturnType; + isPasswordless?: boolean; + }, +) => { + const { + error, + isLoading, + isPasswordless, + onSubmit, + onCancel, + getPasswordStrength, + form, + formState: {setEmail}, + } = props; + const { + handleSubmit, + register, + watch, + formState: {isValid, errors}, + } = form; + + const onSubmitForm = (data: SignupDataStep1) => { + // enregistre les données car on a besoin de l'email pour vérifier l'otp à + // l'étape suivante, dans le cas où l'utilisateur saisi directement le code + // OTP plutôt que de cliquer sur le lien + setEmail(data.email); + // envoi les données + onSubmit(data); + }; + + const email = watch('email'); + const password = watch('password'); + const res = isPasswordless ? null : getPasswordStrength(password, [email]); + + return ( +
+ + + + {!isPasswordless && ( + + + {!!res && } + + )} + {!!error && ( + + )} + + + ); +}; diff --git a/packages/auth/components/Signup/SignupStep2.tsx b/packages/auth/components/Signup/SignupStep2.tsx new file mode 100644 index 0000000000..104c72e9f3 --- /dev/null +++ b/packages/auth/components/Signup/SignupStep2.tsx @@ -0,0 +1,32 @@ +import {SignupPropsWithState} from './type'; +import {VerifyOTP} from '@components/VerifyOTP/VerifyOTP'; + +/** + * Affiche l'étape 2 du panneau de création de compte + */ +export const SignupStep2 = (props: SignupPropsWithState) => { + const { + defaultValues, + isLoading, + error, + onCancel, + onSubmit, + onResend, + formState: {email}, + } = props; + + return ( + + ); +}; diff --git a/packages/auth/components/Signup/SignupStep3.tsx b/packages/auth/components/Signup/SignupStep3.tsx new file mode 100644 index 0000000000..68ad49a0a3 --- /dev/null +++ b/packages/auth/components/Signup/SignupStep3.tsx @@ -0,0 +1,117 @@ +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import { + Button, + Checkbox, + Input, + validateTel, + Field, + FieldMessage, + FormSectionGrid, + ModalFooterOKCancel, +} from '@tet/ui'; +import {SignupDataStep3, SignupPropsWithState} from './type'; + +const URL_CGU = 'https://territoiresentransitions.fr/cgu'; +const URL_DCP = 'https://www.ademe.fr/donnees-personnelles/'; + +/** Gestionnaire d'état pour le formulaire de l'étape 3 */ +const useSignupStep3 = () => { + const validationSchema = z.object({ + nom: z.string().min(1, 'Champ requis'), + prenom: z.string().min(1, 'Champ requis'), + telephone: z.string().refine(validateTel), + cgu_acceptees: z.boolean().refine(value => !!value, { + message: "Vous devez accepter le cadre d'utilisation de la plateforme", + }), + }); + + return useForm({ + resolver: zodResolver(validationSchema), + }); +}; + +/** + * Affiche l'étape 3 du panneau de création de compte + */ +export const SignupStep3 = (props: SignupPropsWithState) => { + const { + handleSubmit, + register, + formState: {isValid, errors}, + } = useSignupStep3(); + + const { + isLoading, + error, + onSubmit, + formState: {email}, + } = props; + + const onSubmitForm = handleSubmit(data => { + onSubmit({...(data as SignupDataStep3), email}); + }); + + return ( +
+ + + + + + + + + + + +
+ + + | + + + } + {...register('cgu_acceptees')} + /> + {!!error && ( + + )} + + + ); +}; diff --git a/packages/auth/components/Signup/SignupStep4.tsx b/packages/auth/components/Signup/SignupStep4.tsx new file mode 100644 index 0000000000..f9f67e97e9 --- /dev/null +++ b/packages/auth/components/Signup/SignupStep4.tsx @@ -0,0 +1,186 @@ +import {Controller, useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import {ModalFooterOKCancel} from '@tet/ui'; +import {Field, FieldMessage} from '@tet/ui'; +import {Input} from '@tet/ui'; +import {FormSectionGrid} from '@tet/ui'; +import {Checkbox} from '@tet/ui'; +import {Select, SelectMultiple} from '@tet/ui'; +import {Enums} from '@tet/api'; +import {SignupDataStep4, SignupPropsWithState} from './type'; + +const ROLES: Array<{value: Enums<'membre_fonction'>; label: string}> = [ + {value: 'politique', label: 'Équipe politique'}, + {value: 'technique', label: 'Directions et services techniques'}, + {value: 'partenaire', label: 'Partenaire'}, + {value: 'conseiller', label: "Bureau d'études"}, +]; + +const REFERENTIELS = [ + {value: 'cae', label: 'Climat Air Énergie'}, + {value: 'eci', label: 'Économie Circulaire'}, +]; + +/** Gestionnaire d'état pour le formulaire de l'étape 4 */ +const useSignupStep4 = () => { + const validationSchema = z.object({ + collectivite_id: z.number({ + invalid_type_error: 'Sélectionnez une collectivité', + }), + referent: z.boolean().optional(), + champ_intervention: z.array(z.string()), + role: z.string({invalid_type_error: 'Sélectionnez un rôle'}), + poste: z.string().optional(), + }); + + return useForm({ + resolver: zodResolver(validationSchema), + }); +}; + +/** + * Affiche l'étape 4 du panneau de création de compte + */ +export const SignupStep4 = (props: SignupPropsWithState) => { + const { + collectivites, + defaultValues, + onFilterCollectivites, + isLoading, + error, + onCancel, + onSubmit, + formState: {email}, + } = props; + + const { + handleSubmit, + register, + setValue, + control, + watch, + formState: {isValid, errors}, + } = useSignupStep4(); + + const onSubmitForm = handleSubmit(data => { + onSubmit({...(data as SignupDataStep4), email}); + }); + + const referent = watch('referent'); + + return ( +
+ + + { + return ( + { + setValue( + field.name, + field.value === value ? null : (value as string), + { + shouldValidate: true, + }, + ); + }} + /> + )} + /> + + + + + + + {referent && ( + + ( + { + setValue(field.name, values, { + shouldValidate: true, + }); + }} + /> + )} + /> + + )} + + {!!error && ( + + )} + + + ); +}; diff --git a/packages/auth/components/Signup/index.ts b/packages/auth/components/Signup/index.ts new file mode 100644 index 0000000000..7ca30b5bde --- /dev/null +++ b/packages/auth/components/Signup/index.ts @@ -0,0 +1,3 @@ +export * from './Signup'; +export * from './SignupModal'; +export * from './type'; diff --git a/packages/auth/components/Signup/type.ts b/packages/auth/components/Signup/type.ts new file mode 100644 index 0000000000..98b0626436 --- /dev/null +++ b/packages/auth/components/Signup/type.ts @@ -0,0 +1,76 @@ +import {ZxcvbnResult} from '@zxcvbn-ts/core'; +import {Enums} from '@tet/api'; +import {ResendFunction, VerifyOTPData} from '@components/VerifyOTP'; +import {FormState} from '@components/Login/useFormState'; + +const ValidSignupView = [ + 'etape1', + 'etape2', + 'etape3', + 'etape4', + 'msg_lien_envoye', +] as const; +export const isValidSignupView = (view: string | null) => + ValidSignupView.includes(view as SignupView); +export type SignupView = (typeof ValidSignupView)[number]; + +export type SignupDataStep1 = { + email: string; + password: string; +}; + +export type SignupDataStep2 = VerifyOTPData; + +export type SignupDataStep3 = { + email: string; + nom: string; + prenom: string; + telephone: string; + cgu_acceptees: boolean; +}; + +export type SignupDataStep4 = { + email: string; + collectivite_id?: number; + collectivite_engagee?: boolean; + role?: Enums<'membre_fonction'>; + poste?: string; +}; + +export type SignupData = + | SignupDataStep1 + | SignupDataStep2 + | SignupDataStep3 + | SignupDataStep4; + +export type SignupProps = { + /** Vue courante */ + view: SignupView; + /** Permet de passer d'une vue à une autre */ + setView: (view: SignupView) => void; + /** Valeurs par défaut du formulaire (étape 1) */ + defaultValues?: {email: string | null; otp?: string | null}; + /** Erreur à afficher */ + error: string | null; + /** Indique qu'un appel réseau est en cours */ + isLoading?: boolean; + /** Indique que l'option "avec mot de passe" est activée */ + withPassword?: boolean; + /** Liste de collectivités auxquelles le compte peut être rattaché */ + collectivites: Array<{value: number; label: string}>; + /** Appelé pour filtrer la liste des collectivités */ + onFilterCollectivites: (value: string) => void; + /** Appelé à l'envoi du formulaire */ + onSubmit: (data: SignupData) => void; + /** Appelé à l'annulation du formulaire */ + onCancel: () => void; + /** Fonction appelée pour renvoyer l'email contenant le code */ + onResend: ResendFunction; + /** Pour contrôler la robustesse des mots de passe */ + getPasswordStrength: ( + password: string, + otherValues: string[], + ) => ZxcvbnResult | null; +}; + +export type SignupPropsWithState = SignupProps & {formState: FormState}; diff --git a/packages/auth/components/TrackPageView/index.tsx b/packages/auth/components/TrackPageView/index.tsx new file mode 100644 index 0000000000..3c0a897b55 --- /dev/null +++ b/packages/auth/components/TrackPageView/index.tsx @@ -0,0 +1,31 @@ +'use client'; + +import {useEffect} from 'react'; +import {usePostHog} from 'posthog-js/react'; + +//import {PageName} from '@tet/ui'; +type PageName = string; // TODO: supprimer et réactiver l'import précédent quand il sera mergé dans develop + +/** + * Envoi une page view à PostHog lors du rendering. + * + * Note : en dev quand le mode strict est activé, + * on envoie deux événementsà la suite. + * https://react.dev/reference/react/StrictMode + * + * @param pageName + * @constructor + */ +export default function TrackPageView({pageName}: {pageName: PageName}): null { + const posthog = usePostHog(); + + useEffect(() => { + if (posthog) { + posthog.capture('$pageview', { + $current_url: pageName, + }); + } + }, [posthog, pageName]); + + return null; +} diff --git a/packages/auth/components/VerifyOTP/VerifyOTP.stories.tsx b/packages/auth/components/VerifyOTP/VerifyOTP.stories.tsx new file mode 100644 index 0000000000..1052927ee1 --- /dev/null +++ b/packages/auth/components/VerifyOTP/VerifyOTP.stories.tsx @@ -0,0 +1,52 @@ +import {Meta, StoryObj} from '@storybook/react'; +import {action} from '@storybook/addon-actions'; +import {VerifyOTP} from './VerifyOTP'; + +const meta: Meta = { + component: VerifyOTP, + args: { + onCancel: action('onCancel'), + onSubmit: action('onSubmit'), + onResend: action('onResend'), + defaultValues: {email: 'yolo@dodo.com', otp: ''}, + }, +}; + +export default meta; + +type Story = StoryObj; + +export const TypeLogin: Story = { + args: {type: 'login'}, +}; + +export const TypeSignup: Story = { + args: {type: 'signup'}, +}; + +export const TypeResetPassword: Story = { + args: {type: 'reset_password'}, +}; + +export const PreRempli: Story = { + args: { + type: 'reset_password', + defaultValues: {email: 'yolo@dodo.com', otp: '123456'}, + }, +}; + +export const IsLoading: Story = { + args: { + type: 'reset_password', + isLoading: true, + defaultValues: {email: 'yolo@dodo.com', otp: '123456'}, + }, +}; + +export const AvecErreur: Story = { + args: { + type: 'reset_password', + defaultValues: {email: 'yolo@dodo.com', otp: '123456'}, + error: "Message d'erreur", + }, +}; diff --git a/packages/auth/components/VerifyOTP/VerifyOTP.tsx b/packages/auth/components/VerifyOTP/VerifyOTP.tsx new file mode 100644 index 0000000000..817bf39f92 --- /dev/null +++ b/packages/auth/components/VerifyOTP/VerifyOTP.tsx @@ -0,0 +1,109 @@ +import {useForm} from 'react-hook-form'; +import {zodResolver} from '@hookform/resolvers/zod'; +import {z} from 'zod'; +import {Input, validateOTP, FieldMessage, ModalFooterOKCancel} from '@tet/ui'; +import {MailSendMessage} from '@components/Login/MailSendMessage'; +import {ResendMessage} from '@components/ResendMessage'; + +export type VerifyOTPData = { + email: string; + otp: string; +}; + +export type VerifyType = 'signup' | 'login' | 'reset_password'; + +export type ResendFunction = (args: {type: VerifyType; email: string}) => void; + +type VerifyOTPProps = { + /** Type d'usage (fait varier le message affiché) */ + type: VerifyType; + /** Valeurs par défaut pour initialiser les formulaires */ + defaultValues: {email: string | null; otp?: string | null}; + /** Erreur à afficher */ + error: string | null; + /** Indique qu'un appel réseau est en cours */ + isLoading?: boolean; + /** Fonction appelée à l'envoi du formulaire */ + onSubmit?: (formData: VerifyOTPData) => void; + /** Fonction appelée à l'annulation du formulaire */ + onCancel: () => void; + /** Fonction appelée pour renvoyer l'email contenant le code */ + onResend: ResendFunction; +}; + +const messageByType: Record = { + login: 'Pour vous connecter', + signup: 'Pour activer votre compte', + reset_password: 'Pour changer de mot de passe', +}; + +/** Gestionnaire d'état pour le formulaire de vérification du jeton OTP */ +const useVerifyOTP = (email: string, otp: string) => { + const validationSchema = z.object({ + otp: z.string().refine(validateOTP), + }); + + return useForm({ + resolver: zodResolver(validationSchema), + defaultValues: { + email: email || '', + otp: otp || '', + }, + }); +}; + +/** + * Affiche le panneau de vérification du jeton OTP + */ +export const VerifyOTP = (props: VerifyOTPProps) => { + const {type, defaultValues, isLoading, error, onCancel, onSubmit, onResend} = + props; + const { + handleSubmit, + register, + formState: {isValid}, + } = useVerifyOTP(defaultValues?.email || '', defaultValues?.otp || ''); + + const onSubmitForm = handleSubmit((data: VerifyOTPData) => { + const otp = validateOTP(data.otp); + if (otp && defaultValues.email) { + onSubmit?.({email: defaultValues.email, otp}); + } + }); + + return ( +
+ + + {!!error && ( + + )} + + ) + } + /> + + ); +}; diff --git a/packages/auth/components/VerifyOTP/index.ts b/packages/auth/components/VerifyOTP/index.ts new file mode 100644 index 0000000000..df663d90e2 --- /dev/null +++ b/packages/auth/components/VerifyOTP/index.ts @@ -0,0 +1 @@ +export * from './VerifyOTP'; diff --git a/packages/auth/middleware.ts b/packages/auth/middleware.ts new file mode 100644 index 0000000000..4c308d5499 --- /dev/null +++ b/packages/auth/middleware.ts @@ -0,0 +1,91 @@ +import {NextRequest, NextResponse} from 'next/server'; + +/** + * Middleware pour ajouter à chaque requête les en-têtes CSP + * + * Ref: https://nextjs.org/docs/app/building-your-application/configuring/content-security-policy + * + */ +export function middleware(request: NextRequest) { + // génère un id à chaque requête + const nonce = Buffer.from(crypto.randomUUID()).toString('base64'); + + // on autorise 'unsafe-eval' et 'unsafe-inline' en mode dev. pour que les pages + // ne soient pas bloquées par le chargement des sources-map + // Ref: https://github.com/vercel/next.js/issues/14221 + const scriptSrc = + process.env.NODE_ENV === 'production' + ? // https://github.com/vercel/next.js/discussions/54152 + // ? `'self' 'nonce-${nonce}'` + `'self' 'unsafe-inline'` // TODO: supprimer cette ligne et rétablir la précédente + : `'self' 'unsafe-eval' 'unsafe-inline'`; + + // on autorise les styles `unsafe-inline` à cause notamment d'un problème avec le commposant next/image + // Ref: https://github.com/vercel/next.js/issues/45184 + const styleSrc = `'self' 'unsafe-inline'`; + + // options de la politique de sécurité + const cspHeader = ` + default-src 'self'; + script-src ${scriptSrc} *.posthog.com; + style-src ${styleSrc}; + img-src 'self' blob: data:; + font-src 'self'; + object-src 'none'; + connect-src 'self' + ${process.env.NEXT_PUBLIC_SUPABASE_URL!} + ${process.env.NEXT_PUBLIC_SUPABASE_URL!.replace('http', 'ws')} + ws://${request.nextUrl.host} + *.posthog.com; + base-uri 'self'; + form-action 'self'; + frame-ancestors 'none'; + frame-src 'none'; + block-all-mixed-content; + upgrade-insecure-requests; +`; + + // supprime les retours à la ligne et les espaces en trop + const contentSecurityPolicyHeaderValue = cspHeader + .replace(/\s{2,}/g, ' ') + .trim(); + + // crée et complète l'objet `Headers` + const requestHeaders = new Headers(request.headers); + requestHeaders.set('x-nonce', nonce); + requestHeaders.set( + 'Content-Security-Policy', + contentSecurityPolicyHeaderValue, + ); + + // ajoute les en-têtes à la réponse + const response = NextResponse.next({request: {headers: requestHeaders}}); + response.headers.set( + 'Content-Security-Policy', + contentSecurityPolicyHeaderValue, + ); + + return response; +} + +/** + * Evite que le middleware soit appliqué à certaines routes + */ +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + { + source: '/((?!api|_next/static|_next/image|favicon.ico).*)', + missing: [ + {type: 'header', key: 'next-router-prefetch'}, + {type: 'header', key: 'purpose', value: 'prefetch'}, + ], + }, + ], +}; diff --git a/packages/auth/next.config.mjs b/packages/auth/next.config.mjs new file mode 100644 index 0000000000..67e8c962ff --- /dev/null +++ b/packages/auth/next.config.mjs @@ -0,0 +1,45 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // active le mode strict pour détecter les problèmes en dev + reactStrictMode: true, + // active la minification + swcMinify: true, + experimental: { + // permet le chargement de nivo + esmExternals: 'loose', + }, + // surcharge la config webpack + webpack: config => { + // pour le chargement des fontes au format woff2 + config.module.rules.push({ + test: /\.woff2$/, + type: 'asset/resource', + }); + + return config; + }, + // en-têtes http + headers: async () => [ + { + source: '/(.*)', // pour toutes les routes + headers: [ + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security + { + key: 'Strict-Transport-Security', + value: 'max-age=63072000; includeSubDomains; preload', + }, + ], + }, + ], + // Reverse Proxy vers PostHog : https://posthog.com/docs/advanced/proxy/nextjs + async rewrites() { + return [ + { + source: "/ingest/:path*", + destination: "https://eu.posthog.com/:path*", + }, + ]; + }, +}; + +export default nextConfig; diff --git a/packages/auth/package.json b/packages/auth/package.json new file mode 100644 index 0000000000..dbae6b644d --- /dev/null +++ b/packages/auth/package.json @@ -0,0 +1,58 @@ +{ + "name": "@tet/auth", + "version": "0.1.0", + "private": true, + "engines": { + "node": "20" + }, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start -p $PORT", + "lint": "next lint --format stylish", + "storybook": "storybook dev -p 6008", + "format": "prettier --write \"**/*.{js,ts,jsx,tsx}\"" + }, + "dependencies": { + "@floating-ui/react": "^0.25.2", + "@hookform/resolvers": "^3.3.4", + "@supabase/ssr": "^0.1.0", + "@supabase/supabase-js": "^2.39.3", + "@tet/ui": "^1.0.0", + "@zxcvbn-ts/core": "^3.0.4", + "@zxcvbn-ts/language-common": "^3.0.4", + "@zxcvbn-ts/language-fr": "^3.0.2", + "classnames": "^2.3.2", + "encoding": "^0.1.13", + "next": "^14.0.4", + "posthog-js": "^1.108.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.51.1", + "swr": "^2.2.0", + "tailwindcss": "^3.3.3", + "zod": "^3.22.4" + }, + "devDependencies": { + "@storybook/addon-essentials": "^7.6.1", + "@storybook/addon-styling-webpack": "^0.0.5", + "@storybook/preset-create-react-app": "^7.6.1", + "@storybook/react": "^7.6.1", + "@storybook/nextjs": "^7.6.1", + "@types/react": "^18.2.24", + "@types/react-dom": "^18.2.7", + "autoprefixer": "^10.4.14", + "eslint": "8.46.0", + "eslint-config-next": "^14.0.4", + "eslint-plugin-jsx-expressions": "^1.3.2", + "eslint-plugin-storybook": "^0.6.15", + "postcss": "^8.4.27", + "prettier": "3.0.1", + "storybook": "^7.6.1", + "typescript": "^5.2.2" + }, + "description": "Module d'authentification pour Territoires en Transitions", + "main": ".prettierrc.js", + "author": "", + "license": "ISC" +} diff --git a/packages/auth/postcss.config.js b/packages/auth/postcss.config.js new file mode 100644 index 0000000000..33ad091d26 --- /dev/null +++ b/packages/auth/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/auth/providers/posthog.tsx b/packages/auth/providers/posthog.tsx new file mode 100644 index 0000000000..49c08b786e --- /dev/null +++ b/packages/auth/providers/posthog.tsx @@ -0,0 +1,38 @@ +'use client'; + +import posthog from 'posthog-js'; +import {PostHogProvider} from 'posthog-js/react'; + +if (typeof window !== 'undefined') { + const is_dev = process.env.NODE_ENV === 'development'; + const key = process.env.NEXT_PUBLIC_POSTHOG_KEY; + const host = process.env.NEXT_PUBLIC_POSTHOG_HOST; + + if (is_dev && (!key || !host)) { + console.warn( + `Le tracking PostHog n'est pas configuré, les variables d'env sont absentes.`, + ); + } else { + if (!key) throw `La variable NEXT_PUBLIC_POSTHOG_KEY n'est pas définie`; + if (!host) throw `La variable NEXT_PUBLIC_POSTHOG_HOST n'est pas définie`; + + // en mode dev, on envoie les données à PostHog, sinon on passe par le `rewrites` de `next.config.mjs` + const apiHost = is_dev ? host : `${window.location.origin}/ingest`; + + posthog.init(key, { + api_host: apiHost, + ui_host: host, + capture_pageview: false, // on utilise PostHogPageView pour capturer les `page views` + + loaded: posthog => { + if (process.env.NODE_ENV === 'development') posthog.debug(); + }, + }); + } +} + +const PHProvider = ({children}: {children: React.ReactNode}) => { + return {children}; +}; + +export default PHProvider; diff --git a/packages/auth/public/favicon-16x16.png b/packages/auth/public/favicon-16x16.png new file mode 100644 index 0000000000..27d850c017 Binary files /dev/null and b/packages/auth/public/favicon-16x16.png differ diff --git a/packages/auth/public/favicon-32x32.png b/packages/auth/public/favicon-32x32.png new file mode 100644 index 0000000000..3cb163a21a Binary files /dev/null and b/packages/auth/public/favicon-32x32.png differ diff --git a/packages/auth/public/favicon.ico b/packages/auth/public/favicon.ico new file mode 100644 index 0000000000..1d01df9752 Binary files /dev/null and b/packages/auth/public/favicon.ico differ diff --git a/packages/auth/src/clientAPI.ts b/packages/auth/src/clientAPI.ts new file mode 100644 index 0000000000..e2b6218e9f --- /dev/null +++ b/packages/auth/src/clientAPI.ts @@ -0,0 +1,3 @@ +import {createClient} from 'src/supabase/client'; + +export const supabase = createClient(); diff --git a/packages/auth/src/supabase/actions.ts b/packages/auth/src/supabase/actions.ts new file mode 100644 index 0000000000..ee4bd571c9 --- /dev/null +++ b/packages/auth/src/supabase/actions.ts @@ -0,0 +1,32 @@ +import {type CookieOptions, createServerClient} from '@supabase/ssr'; +import {cookies} from 'next/headers'; +import {NextRequest, NextResponse} from 'next/server'; +import {Database} from '@tet/api'; + +/** + * Pour accéder à supabase depuis les Server Actions et les Route Handlers + */ +export function createClient( + cookieStore: NextRequest['cookies'] | ReturnType, + responseCookies?: NextResponse['cookies'], +) { + return createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + get(name: string) { + return cookieStore.get(name)?.value; + }, + set(name: string, value: string, options: CookieOptions) { + cookieStore.set({name, value, ...options}); + responseCookies?.set({name, value, ...options}); + }, + remove(name: string, options: CookieOptions) { + cookieStore.set({name, value: '', ...options}); + responseCookies?.set({name, value: '', ...options}); + }, + }, + }, + ); +} diff --git a/packages/auth/src/supabase/client.ts b/packages/auth/src/supabase/client.ts new file mode 100644 index 0000000000..5895d8ef8c --- /dev/null +++ b/packages/auth/src/supabase/client.ts @@ -0,0 +1,12 @@ +import {createBrowserClient} from '@supabase/ssr'; +import {Database} from '@tet/api'; + +/** + * Pour accéder à supabase depuis les composants client + */ +export function createClient() { + return createBrowserClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + ); +} diff --git a/packages/auth/src/supabase/server.ts b/packages/auth/src/supabase/server.ts new file mode 100644 index 0000000000..7a6afa63f0 --- /dev/null +++ b/packages/auth/src/supabase/server.ts @@ -0,0 +1,21 @@ +import {createServerClient} from '@supabase/ssr'; +import {cookies} from 'next/headers'; +import {Database} from '@tet/api'; + +/** + * Pour accéder à supabase depuis les composants serveur + */ +export function createClient(cookieStore: ReturnType) + { + return createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + get(name: string) { + return cookieStore.get(name)?.value; + }, + }, + }, + ); + } diff --git a/packages/auth/src/utils/constants.ts b/packages/auth/src/utils/constants.ts new file mode 100644 index 0000000000..1606573fca --- /dev/null +++ b/packages/auth/src/utils/constants.ts @@ -0,0 +1,2 @@ +export const SITE_BASE_URL = 'https://territoiresentransitions.fr'; +export const APP_BASE_URL = 'https://app.territoiresentransitions.fr'; diff --git a/packages/auth/tailwind.config.ts b/packages/auth/tailwind.config.ts new file mode 100644 index 0000000000..b1183cbfb4 --- /dev/null +++ b/packages/auth/tailwind.config.ts @@ -0,0 +1,13 @@ +import {Config} from 'tailwindcss'; +import {preset} from '@tet/ui'; + +export default { + presets: [preset as Config], + content: [ + '../ui/src/**/*.{js,ts,jsx,tsx,mdx}', + './app/*.{js,ts,jsx,tsx,mdx}', + './app/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + ], + plugins: [], +} satisfies Config; diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json new file mode 100644 index 0000000000..712021e156 --- /dev/null +++ b/packages/auth/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "baseUrl": ".", + "paths": { + "@components/*": ["components/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/supabase/config.toml b/supabase/config.toml index d8e6d14681..d69f3ca992 100644 --- a/supabase/config.toml +++ b/supabase/config.toml @@ -56,7 +56,19 @@ enable_signup = true # addresses. If disabled, only the new email is required to confirm. double_confirm_changes = true # If enabled, users need to confirm their email address before signing in. -enable_confirmations = false +enable_confirmations = true + +[auth.email.template.magic_link] +subject = "Connectez-vous à Territoires en Transitions" +content_path = "./supabase/templates/magic_link.html" + +[auth.email.template.confirmation] +subject = "Connectez-vous à Territoires en Transitions" +content_path = "./supabase/templates/confirmation.html" + +[auth.email.template.recovery] +subject = "Réinitialiser votre mot de passe sur Territoires en Transitions" +content_path = "./supabase/templates/recovery.html" # Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, # `discord`, `facebook`, `github`, `gitlab`, `google`, `twitch`, `twitter`, `slack`, `spotify`. diff --git a/supabase/templates/README.md b/supabase/templates/README.md new file mode 100644 index 0000000000..62c21614c9 --- /dev/null +++ b/supabase/templates/README.md @@ -0,0 +1,26 @@ +# Modèles d'emails + +Ce répertoire contient les modèles des emails utilisés pour l'authentification. + +## Développement + +Ces modèles ne servent que pour les développement et doivent être déclarés dans le fichier `supabase/config.toml`. Par exemple de la manière suivante : +``` +[auth.email.template.magic_link] +subject = "Connectez-vous à Territoires en Transitions" +content_path = "./supabase/templates/magic_link.html" +``` + +Pour que la modification du fichier de config ou d'un modèle soit prise en compte il faut arrêter et relancer les containers supabase ainsi : + +``` +supabase stop +supabase start +``` + +Pour accéder aux emails "envoyés" en développement il faut ouvrir la webapp Inbucket. +Pour obtenir son url utiliser `supabase status` (donne actuellement la valeur `http://127.0.0.1:54324`). L'url est aussi affichée après avoir redémarré avec `supabase start`. + +## Déploiement en production + +En production les modèles doivent être recopiés depuis le [dashboard](https://supabase.com/dashboard/projects) de l'instance supabase. diff --git a/supabase/templates/confirmation.html b/supabase/templates/confirmation.html new file mode 100644 index 0000000000..3892056a68 --- /dev/null +++ b/supabase/templates/confirmation.html @@ -0,0 +1,23 @@ +

Territoires en Transitions

+ +

Une création de compte a été demandée pour l'adresse {{.Email}}

+ +

Si vous n'êtes pas à l'origine de cette demande veuillez ignorer ce message.

+ +

Sinon, suivez le lien ci-dessous

+

+ Valider mon inscription +

+

+ et entrez le code suivant : {{ .Token }} pour valider votre inscription. +

+ +

À bientôt sur la plateforme !

+

+ L’équipe Territoires en Transitions
contact@territoiresentransitions.fr +

diff --git a/supabase/templates/magic_link.html b/supabase/templates/magic_link.html new file mode 100644 index 0000000000..42fc5b366b --- /dev/null +++ b/supabase/templates/magic_link.html @@ -0,0 +1,24 @@ +

Territoires en Transitions

+ +

Une connexion a été demandée pour l'adresse {{.Email}}

+ +

Si vous n'êtes pas à l'origine de cette demande veuillez ignorer ce message.

+ +

Sinon, suivez le lien ci-dessous

+

+ Me connecter +

+

+ et entrez le code suivant : {{ .Token }} pour vous connecter. +

+ +

À bientôt sur la plateforme !

+

+ L’équipe Territoires en Transitions
contact@territoiresentransitions.fr +

+ \ No newline at end of file diff --git a/supabase/templates/recovery.html b/supabase/templates/recovery.html new file mode 100644 index 0000000000..93a7c8d9cc --- /dev/null +++ b/supabase/templates/recovery.html @@ -0,0 +1,29 @@ +

Territoires en Transitions

+ +

+ Nous avons reçu une demande de changement de mot de passe pour le compte + {{.Email}} +

+ +

+ Si vous n'êtes pas à l'origine de cette demande veuillez ignorer ce message. +

+ +

Sinon, suivez le lien ci-dessous

+

+ Réinitialiser mon mot de passe +

+

+ et entrez le code suivant : {{ .Token }} avant de pouvoir choisir un nouveau mot de passe. +

+ +

À bientôt sur la plateforme !

+

+ L’équipe Territoires en Transitions
contact@territoiresentransitions.fr +