From f5eb117845b3e5281843f7a64598ba3a7330b037 Mon Sep 17 00:00:00 2001 From: xWyvernPx Date: Mon, 9 Oct 2023 22:05:32 +0700 Subject: [PATCH] HK-52 AWS S3 integrated --- .prettierrc | 2 +- package.json | 3 + pnpm-lock.yaml | 1225 ++++++++++++++++- src/base/hooks/useAwsS3.ts | 58 + src/data/@mk/mock/Role.ts | 26 + .../customer/components/AddCustomerModal.tsx | 383 +----- .../form/CustomerManipulateForm.tsx | 400 ++++++ src/modules/customer/hook/useCustomerData.ts | 80 ++ src/modules/customer/hook/useCustomerForm.ts | 115 ++ src/modules/customer/service/customer.api.ts | 47 + .../kitchen/components/AddKitchenModal.tsx | 91 ++ src/modules/kitchen/pages/KitchenListPage.tsx | 17 +- src/types/@mk/common/baseEntity.ts | 12 +- src/types/@mk/entity/customer.ts | 14 +- src/types/@mk/entity/role.ts | 2 +- src/types/@mk/entity/user.ts | 8 +- 16 files changed, 2113 insertions(+), 370 deletions(-) create mode 100644 src/base/hooks/useAwsS3.ts create mode 100644 src/data/@mk/mock/Role.ts create mode 100644 src/modules/customer/components/form/CustomerManipulateForm.tsx create mode 100644 src/modules/customer/hook/useCustomerData.ts create mode 100644 src/modules/customer/hook/useCustomerForm.ts create mode 100644 src/modules/customer/service/customer.api.ts create mode 100644 src/modules/kitchen/components/AddKitchenModal.tsx diff --git a/.prettierrc b/.prettierrc index 920af86..f983ab4 100644 --- a/.prettierrc +++ b/.prettierrc @@ -17,4 +17,4 @@ "trailingComma": "es5", "useTabs": false, "vueIndentScriptAndStyle": false - } \ No newline at end of file + } diff --git a/package.json b/package.json index 26e324c..61b0814 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,12 @@ "dependencies": { "@ant-design/colors": "^7.0.0", "@ant-design/icons": "^5.2.6", + "@aws-sdk/client-s3": "3.317.0", + "@aws-sdk/s3-request-presigner": "^3.427.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@fullcalendar/common": "^5.11.5", + "@hookform/resolvers": "^3.3.1", "@mui/icons-material": "^5.14.9", "@mui/lab": "5.0.0-alpha.143", "@mui/material": "^5.14.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fed4747..b42d321 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,12 @@ dependencies: '@ant-design/icons': specifier: ^5.2.6 version: 5.2.6(react-dom@18.2.0)(react@18.2.0) + '@aws-sdk/client-s3': + specifier: 3.317.0 + version: 3.317.0 + '@aws-sdk/s3-request-presigner': + specifier: ^3.427.0 + version: 3.427.0 '@emotion/react': specifier: ^11.11.1 version: 11.11.1(@types/react@18.0.28)(react@18.2.0) @@ -20,6 +26,9 @@ dependencies: '@fullcalendar/common': specifier: ^5.11.5 version: 5.11.5 + '@hookform/resolvers': + specifier: ^3.3.1 + version: 3.3.1(react-hook-form@7.43.9) '@mui/icons-material': specifier: ^5.14.9 version: 5.14.9(@mui/material@5.14.8)(@types/react@18.0.28)(react@18.2.0) @@ -304,6 +313,998 @@ packages: default-browser-id: 3.0.0 dev: true + /@aws-crypto/crc32@3.0.0: + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.425.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/crc32c@3.0.0: + resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.425.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/ie11-detection@3.0.0: + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha1-browser@3.0.0: + resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-browser@3.0.0: + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-locate-window': 3.310.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js@3.0.0: + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.425.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/supports-web-crypto@3.0.0: + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/util@3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-sdk/abort-controller@3.310.0: + resolution: {integrity: sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/chunked-blob-reader@3.310.0: + resolution: {integrity: sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/client-s3@3.317.0: + resolution: {integrity: sha512-Y7AZMO/ikKFARsGYv7LKNELTDqJHjEpDTGEBBWnFkVoTmlquBsa9r0tU2nofP3uxSIkySPkkQpR50Zm/Q6zWyw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 3.0.0 + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.316.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.316.0 + '@aws-sdk/eventstream-serde-browser': 3.310.0 + '@aws-sdk/eventstream-serde-config-resolver': 3.310.0 + '@aws-sdk/eventstream-serde-node': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-blob-browser': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/hash-stream-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/md5-js': 3.310.0 + '@aws-sdk/middleware-bucket-endpoint': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-expect-continue': 3.310.0 + '@aws-sdk/middleware-flexible-checksums': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-location-constraint': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-sdk-s3': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-ssec': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4-multi-region': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-stream-browser': 3.310.0 + '@aws-sdk/util-stream-node': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + '@aws-sdk/util-waiter': 3.310.0 + '@aws-sdk/xml-builder': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/signature-v4-crt' + - aws-crt + dev: false + + /@aws-sdk/client-sso-oidc@3.316.0: + resolution: {integrity: sha512-e2fvC7o42YV+LcZYfXCcvBn4L7NM9oNccnZ7T+pS6SFpHZlaqkw4uuQMRE6iUAof+Id7Mt7xDrz1x2yGlP+8GA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.316.0: + resolution: {integrity: sha512-wGXfIhR0lJGB8QTT0fwSwwklHePHxd2GW3IQt3trXnEYe0frmJ7vYRnVL5CSRKsikLDmaU7ll3SdsshMzQzo3w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts@3.316.0: + resolution: {integrity: sha512-5SD59+DRVy1mKckGs/5J8OwWpRS3E5v4BX19XaX/s9JJ5Rw9aZd9DP4SZVpeNXztIPjkQSEzHgrUVlZFB1QJgg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-node': 3.316.0 + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/hash-node': 3.310.0 + '@aws-sdk/invalid-dependency': 3.310.0 + '@aws-sdk/middleware-content-length': 3.310.0 + '@aws-sdk/middleware-endpoint': 3.310.0 + '@aws-sdk/middleware-host-header': 3.310.0 + '@aws-sdk/middleware-logger': 3.310.0 + '@aws-sdk/middleware-recursion-detection': 3.310.0 + '@aws-sdk/middleware-retry': 3.310.0 + '@aws-sdk/middleware-sdk-sts': 3.310.0 + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/middleware-user-agent': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/smithy-client': 3.316.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-body-length-browser': 3.310.0 + '@aws-sdk/util-body-length-node': 3.310.0 + '@aws-sdk/util-defaults-mode-browser': 3.316.0 + '@aws-sdk/util-defaults-mode-node': 3.316.0 + '@aws-sdk/util-endpoints': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + '@aws-sdk/util-user-agent-browser': 3.310.0 + '@aws-sdk/util-user-agent-node': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + fast-xml-parser: 4.1.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/config-resolver@3.310.0: + resolution: {integrity: sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-config-provider': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.310.0: + resolution: {integrity: sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-imds@3.310.0: + resolution: {integrity: sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-ini@3.316.0: + resolution: {integrity: sha512-ZADkpdEjFCAXyzEpYbCRENlZ/AQEwevWdPd2yshjNo7xvOcepv4pPIBpYd8h9LvRafSLGA7zlWDz84hkIt+HKA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/credential-provider-process': 3.310.0 + '@aws-sdk/credential-provider-sso': 3.316.0 + '@aws-sdk/credential-provider-web-identity': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.316.0: + resolution: {integrity: sha512-oE1LTXP8XZp4bT8LhBeolMRiz0RwnmHDC2XpUmWO8LTmbDNrQO0mVzxEvXDLeKaN5BIFIJqNFlMgjWUMa9Kwcw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/credential-provider-ini': 3.316.0 + '@aws-sdk/credential-provider-process': 3.310.0 + '@aws-sdk/credential-provider-sso': 3.316.0 + '@aws-sdk/credential-provider-web-identity': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process@3.310.0: + resolution: {integrity: sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-sso@3.316.0: + resolution: {integrity: sha512-8/O2twlsoV1bDkZ9jd7JCMWsftfyoTyRT1UYscsKZGUDEgZRAxRkzS3GLYuLXEWNuxb1OB9rYk/cEJoxwy7T9g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.316.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/token-providers': 3.316.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity@3.310.0: + resolution: {integrity: sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/eventstream-codec@3.310.0: + resolution: {integrity: sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/eventstream-serde-browser@3.310.0: + resolution: {integrity: sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-serde-universal': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/eventstream-serde-config-resolver@3.310.0: + resolution: {integrity: sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/eventstream-serde-node@3.310.0: + resolution: {integrity: sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-serde-universal': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/eventstream-serde-universal@3.310.0: + resolution: {integrity: sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/eventstream-codec': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/fetch-http-handler@3.310.0: + resolution: {integrity: sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/querystring-builder': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/hash-blob-browser@3.310.0: + resolution: {integrity: sha512-OoR8p0cbypToysLT0v3o2oyjy6+DKrY7GNCAzHOHJK9xmqXCt+DsjKoPeiY7o1sWX2aN6Plmvubj/zWxMKEn/A==} + dependencies: + '@aws-sdk/chunked-blob-reader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/hash-node@3.310.0: + resolution: {integrity: sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-buffer-from': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/hash-stream-node@3.310.0: + resolution: {integrity: sha512-ZoXdybNgvMz1Hl6k/e32xVL3jmG5p2IEk5mTtLfFEuskTJ74Z+VMYKkkF1whyy7KQfH83H+TQGnsGtlRCchQKw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/invalid-dependency@3.310.0: + resolution: {integrity: sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/is-array-buffer@3.310.0: + resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/md5-js@3.310.0: + resolution: {integrity: sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ==} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-bucket-endpoint@3.310.0: + resolution: {integrity: sha512-uJJfHI7v4AgbJZRLtyI8ap2QRWkBokGc3iyUoQ+dVNT3/CE2ZCu694A6W+H0dRqg79dIE+f9CRNdtLGa/Ehhvg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-arn-parser': 3.310.0 + '@aws-sdk/util-config-provider': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-content-length@3.310.0: + resolution: {integrity: sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-endpoint@3.310.0: + resolution: {integrity: sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-serde': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/url-parser': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-expect-continue@3.310.0: + resolution: {integrity: sha512-l3d1z2gt+gINJDnPSyu84IxfzjzPfCQrqC1sunw2cZGo/sXtEiq698Q3SiTcO2PGP4LBQAy2RHb5wVBJP708CQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-flexible-checksums@3.310.0: + resolution: {integrity: sha512-5ndnLgzgGVpWkmHBAiYkagHqiSuow8q62J4J6E2PzaQ77+fm8W3nfdy7hK5trHokEyouCZdxT/XK/IRhgj/4PA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-crypto/crc32c': 3.0.0 + '@aws-sdk/is-array-buffer': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.310.0: + resolution: {integrity: sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-location-constraint@3.310.0: + resolution: {integrity: sha512-LFm0JTQWwTPWL/tZU2wsQTl8J5PpDEkXjEhaXVKamtyH0xhysRqd+0n92n65dc8oztAuQkb9xUbErGn5b6gsew==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.310.0: + resolution: {integrity: sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.310.0: + resolution: {integrity: sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-retry@3.310.0: + resolution: {integrity: sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/service-error-classification': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + '@aws-sdk/util-retry': 3.310.0 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + + /@aws-sdk/middleware-sdk-s3@3.310.0: + resolution: {integrity: sha512-QK9x9g2ksg0hOjjYgqddeFcn5ctUEGdxJVu4OumPXceulefMcSO2jyH2qTybYSA93nqNQFdFmg5wQfvIRUWFCQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-arn-parser': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-sdk-sts@3.310.0: + resolution: {integrity: sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-signing': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-serde@3.310.0: + resolution: {integrity: sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-signing@3.310.0: + resolution: {integrity: sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-ssec@3.310.0: + resolution: {integrity: sha512-CnEwNKVpd5bXnrCKPaePF8mWTA9ET21OMBb54y9b0fd8K02zoOcdBz4DWfh1SjFD4HkgCdja4egd8l2ivyvqmw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-stack@3.310.0: + resolution: {integrity: sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.310.0: + resolution: {integrity: sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-endpoints': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/node-config-provider@3.310.0: + resolution: {integrity: sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/node-http-handler@3.310.0: + resolution: {integrity: sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.310.0 + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/querystring-builder': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/property-provider@3.310.0: + resolution: {integrity: sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/protocol-http@3.310.0: + resolution: {integrity: sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/querystring-builder@3.310.0: + resolution: {integrity: sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-uri-escape': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/querystring-parser@3.310.0: + resolution: {integrity: sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/s3-request-presigner@3.427.0: + resolution: {integrity: sha512-BJuzCADG8XJoqEM9lTi402tFDF0URWnj2YGWdKSbW/ISsBt5qsp6SDcFFMr+vAR1jbSJK8zdx3Jhtxrp2xIoWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/signature-v4-multi-region': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-format-url': 3.425.0 + '@smithy/middleware-endpoint': 2.0.11 + '@smithy/protocol-http': 3.0.7 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@aws-sdk/service-error-classification@3.310.0: + resolution: {integrity: sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==} + engines: {node: '>=14.0.0'} + dev: false + + /@aws-sdk/shared-ini-file-loader@3.310.0: + resolution: {integrity: sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.310.0: + resolution: {integrity: sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/signature-v4-crt': ^3.118.0 + peerDependenciesMeta: + '@aws-sdk/signature-v4-crt': + optional: true + dependencies: + '@aws-sdk/protocol-http': 3.310.0 + '@aws-sdk/signature-v4': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.425.0: + resolution: {integrity: sha512-7n2FRPE9rLaVa26xXQJ8TExrt53dWN824axQd1a0r5va0SmMQYG/iV5LBmwUlAntUSq46Lse4Q5YnbOVedGOmw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.425.0 + '@smithy/protocol-http': 3.0.7 + '@smithy/signature-v4': 2.0.11 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@aws-sdk/signature-v4@3.310.0: + resolution: {integrity: sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + '@aws-sdk/util-middleware': 3.310.0 + '@aws-sdk/util-uri-escape': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/smithy-client@3.316.0: + resolution: {integrity: sha512-6YXOKbRnXeS8r8RWzuL6JMBolDYM5Wa4fD/VY6x/wK78i2xErHOvqzHgyyeLI1MMw4uqyd4wRNJNWC9TMPduXw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-stack': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/token-providers@3.316.0: + resolution: {integrity: sha512-foJ2YmB8A/mtp52riO2zdmBgzA3IpASNgUhY9FZg1BKpGcjqLQDGYP+BY3BA0H7CFsMa4PCf13M5wWwn1onyBA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso-oidc': 3.316.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/shared-ini-file-loader': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/types@3.310.0: + resolution: {integrity: sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/types@3.425.0: + resolution: {integrity: sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@aws-sdk/url-parser@3.310.0: + resolution: {integrity: sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==} + dependencies: + '@aws-sdk/querystring-parser': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-arn-parser@3.310.0: + resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-base64@3.310.0: + resolution: {integrity: sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-body-length-browser@3.310.0: + resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-body-length-node@3.310.0: + resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-buffer-from@3.310.0: + resolution: {integrity: sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/is-array-buffer': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-config-provider@3.310.0: + resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-defaults-mode-browser@3.316.0: + resolution: {integrity: sha512-6FSqLhYmaihtH2n1s4b2rlLW0ABU8N6VZIfzLfe2ING4PF0MzfaMMhnTFUHVXfKCVGoR8yP6iyFTRCyHGVEL1w==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-defaults-mode-node@3.316.0: + resolution: {integrity: sha512-dkYy10hdjPSScXXvnjGpZpnJxllkb6ICHgLMwZ4JczLHhPM12T/4PQ758YN8HS+muiYDGX1Bl2z1jd/bMcewBQ==} + engines: {node: '>= 10.0.0'} + dependencies: + '@aws-sdk/config-resolver': 3.310.0 + '@aws-sdk/credential-provider-imds': 3.310.0 + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/property-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.310.0: + resolution: {integrity: sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-format-url@3.425.0: + resolution: {integrity: sha512-qkqua+CwQqv15OMQ5Bb5n182Jt26DSZH2zzj3T1helEeJQJeywAInUYaq+ncIZLx7qKlWMWR/7ICTTSQiredCQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.425.0 + '@smithy/querystring-builder': 2.0.11 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-hex-encoding@3.310.0: + resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-locate-window@3.310.0: + resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-middleware@3.310.0: + resolution: {integrity: sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-retry@3.310.0: + resolution: {integrity: sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==} + engines: {node: '>= 14.0.0'} + dependencies: + '@aws-sdk/service-error-classification': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-stream-browser@3.310.0: + resolution: {integrity: sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w==} + dependencies: + '@aws-sdk/fetch-http-handler': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-base64': 3.310.0 + '@aws-sdk/util-hex-encoding': 3.310.0 + '@aws-sdk/util-utf8': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-stream-node@3.310.0: + resolution: {integrity: sha512-hueAXFK0GVvnfYFgqbF7587xZfMZff5jlIFZOHqx7XVU7bl7qrRUCnphHk8H6yZ7RoQbDPcfmHJgtEoAJg1T1Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/node-http-handler': 3.310.0 + '@aws-sdk/types': 3.310.0 + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-uri-escape@3.310.0: + resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-browser@3.310.0: + resolution: {integrity: sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==} + dependencies: + '@aws-sdk/types': 3.310.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-node@3.310.0: + resolution: {integrity: sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/node-config-provider': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-utf8@3.310.0: + resolution: {integrity: sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/util-buffer-from': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-waiter@3.310.0: + resolution: {integrity: sha512-AV5j3guH/Y4REu+Qh3eXQU9igljHuU4XjX2sADAgf54C0kkhcCCkkiuzk3IsX089nyJCqIcj5idbjdvpnH88Vw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/abort-controller': 3.310.0 + '@aws-sdk/types': 3.310.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/xml-builder@3.310.0: + resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + /@babel/cli@7.21.5(@babel/core@7.21.8): resolution: {integrity: sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g==} engines: {node: '>=6.9.0'} @@ -2165,6 +3166,14 @@ packages: graphql: 16.8.0 dev: false + /@hookform/resolvers@3.3.1(react-hook-form@7.43.9): + resolution: {integrity: sha512-K7KCKRKjymxIB90nHDQ7b9nli474ru99ZbqxiqDAWYsYhOsU3/4qLxW91y+1n04ic13ajjZ66L3aXbNef8PELQ==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.43.9(react@18.2.0) + dev: false + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -2738,6 +3747,202 @@ packages: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true + /@smithy/abort-controller@2.0.11: + resolution: {integrity: sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.0.11: + resolution: {integrity: sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.3.5 + '@smithy/util-hex-encoding': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/fetch-http-handler@2.2.2: + resolution: {integrity: sha512-K7aRtRuaBjzlk+jWWeyfDTLAmRRvmA4fU8eHUXtjsuEDgi3f356ZE32VD2ssxIH13RCLVZbXMt5h7wHzYiSuVA==} + dependencies: + '@smithy/protocol-http': 3.0.7 + '@smithy/querystring-builder': 2.0.11 + '@smithy/types': 2.3.5 + '@smithy/util-base64': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/is-array-buffer@2.0.0: + resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/middleware-endpoint@2.0.11: + resolution: {integrity: sha512-mCugsvB15up6fqpzUEpMT4CuJmFkEI+KcozA7QMzYguXCaIilyMKsyxgamwmr+o7lo3QdjN0//XLQ9bWFL129g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-serde': 2.0.11 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 + '@smithy/util-middleware': 2.0.4 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-serde@2.0.11: + resolution: {integrity: sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-stack@2.0.5: + resolution: {integrity: sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/node-http-handler@2.1.7: + resolution: {integrity: sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.0.11 + '@smithy/protocol-http': 3.0.7 + '@smithy/querystring-builder': 2.0.11 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/protocol-http@3.0.7: + resolution: {integrity: sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-builder@2.0.11: + resolution: {integrity: sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + '@smithy/util-uri-escape': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-parser@2.0.11: + resolution: {integrity: sha512-YXe7jhi7s3dQ0Fu9dLoY/gLu6NCyy8tBWJL/v2c9i7/RLpHgKT+uT96/OqZkHizCJ4kr0ZD46tzMjql/o60KLg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/signature-v4@2.0.11: + resolution: {integrity: sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.0.11 + '@smithy/is-array-buffer': 2.0.0 + '@smithy/types': 2.3.5 + '@smithy/util-hex-encoding': 2.0.0 + '@smithy/util-middleware': 2.0.4 + '@smithy/util-uri-escape': 2.0.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/smithy-client@2.1.10: + resolution: {integrity: sha512-2OEmZDiW1Z196QHuQZ5M6cBE8FCSG0H2HADP1G+DY8P3agsvb0YJyfhyKuJbxIQy15tr3eDAK6FOrlbxgKOOew==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-stack': 2.0.5 + '@smithy/types': 2.3.5 + '@smithy/util-stream': 2.0.15 + tslib: 2.6.2 + dev: false + + /@smithy/types@2.3.5: + resolution: {integrity: sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/url-parser@2.0.11: + resolution: {integrity: sha512-h89yXMCCF+S5k9XIoKltMIWTYj+FcEkU/IIFZ6RtE222fskOTL4Iak6ZRG+ehSvZDt8yKEcxqheTDq7JvvtK3g==} + dependencies: + '@smithy/querystring-parser': 2.0.11 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/util-base64@2.0.0: + resolution: {integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-buffer-from@2.0.0: + resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-hex-encoding@2.0.0: + resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-middleware@2.0.4: + resolution: {integrity: sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + dev: false + + /@smithy/util-stream@2.0.15: + resolution: {integrity: sha512-A/hkYJPH2N5MCWYvky4tTpQihpYAEzqnUfxDyG3L/yMndy/2sLvxnyQal9Opuj1e9FiKSTeMyjnU9xxZGs0mRw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/node-http-handler': 2.1.7 + '@smithy/types': 2.3.5 + '@smithy/util-base64': 2.0.0 + '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-hex-encoding': 2.0.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-uri-escape@2.0.0: + resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-utf8@2.0.0: + resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.2 + dev: false + /@storybook/addon-actions@7.0.12(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-f07Mc3qwcG9heGsuUUTIJbWF2nw/Ite3mvyIZY2VbgwhMUMVHj4knY4fh/LojwcUmmmc7CNZu3sJN/wIqpaHCQ==} peerDependencies: @@ -4965,6 +6170,10 @@ packages: - supports-color dev: true + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false + /boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} @@ -6382,6 +7591,13 @@ packages: punycode: 1.4.1 dev: true + /fast-xml-parser@4.1.2: + resolution: {integrity: sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -9301,7 +10517,7 @@ packages: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.5.0 + tslib: 2.6.2 dev: true /rechoir@0.6.2: @@ -9524,7 +10740,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.0 + tslib: 2.6.2 dev: true /safe-buffer@5.1.1: @@ -9981,6 +11197,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /style-loader@1.3.0(webpack@5.88.2): resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} engines: {node: '>= 8.9.0'} @@ -10613,7 +11833,6 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - dev: true /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} diff --git a/src/base/hooks/useAwsS3.ts b/src/base/hooks/useAwsS3.ts new file mode 100644 index 0000000..681f10d --- /dev/null +++ b/src/base/hooks/useAwsS3.ts @@ -0,0 +1,58 @@ +import { PutObjectCommand, PutObjectRequest, S3Client, S3ClientConfig } from '@aws-sdk/client-s3' +import React, { useMemo } from 'react' +import { v4 as uuidv4 } from "uuid"; +import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; + +const config:S3ClientConfig = { + credentials : { + accessKeyId : "AKIAWPKX6GSPLAZFCWG5", + secretAccessKey: "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" + }, + region:"ap-southeast-1" +} +type UploadParams = { + object: Blob | File + path : string +} + + +const useAwsS3 = () => { + /** + * ISSUE with s3 client : build version @aws-sdk/client-s3@3.427.0 + * https://stackoverflow.com/questions/77229817/failed-to-fetch-aws + * https://github.com/aws/aws-sdk-js-v3/issues/5334 + * downgrade to @aws-sdk/client-s3@3.317.0 for working + * */ + const s3Client = useMemo(()=> new S3Client(config) , []); + const putObject = async({ + object, + path + } : UploadParams)=> { + try { + + const fileName = object instanceof File ? object.name : uuidv4(); + const input: PutObjectRequest = { + Bucket: "momkitchen", + Key: path+fileName, + Body: object, + + } + const command = new PutObjectCommand(input); + await s3Client.send(command); + // const url = await getSignedUrl(s3Client, command, { expiresIn: 3600 }); + // return url + const objectPath = `https://momkitchen.s3.amazonaws.com/${input.Key}`; + return objectPath; + + + } catch (error) { + console.error("Error s3 upload => ", error); + return null; + } + + } + return { putObject }; +} + + +export default useAwsS3 \ No newline at end of file diff --git a/src/data/@mk/mock/Role.ts b/src/data/@mk/mock/Role.ts new file mode 100644 index 0000000..dc63d1a --- /dev/null +++ b/src/data/@mk/mock/Role.ts @@ -0,0 +1,26 @@ +import { Role } from "@/types/@mk/entity/role"; +import { faker } from "@faker-js/faker"; + +const roles = ["admin", "kitchen", "customer"] +export function generateRandomRole():Role { + return { + name: roles[faker.number.int({min:0, max: 2})] , + id: faker.number.int().toString(), + createdDate: faker.date.recent().toISOString(), + updatedDate: faker.date.recent().toISOString(), + createdBy: null, + updatedBy: 'admin', + isDeleted: false, + }; + } + + // Generate a list of 20 mock tray objects + export const mockRole = Array.from({ length: faker.number.int({ min: 2, max: 3}) }, () => generateRandomRole()).map(role => { + return role + }); + + + + + + \ No newline at end of file diff --git a/src/modules/customer/components/AddCustomerModal.tsx b/src/modules/customer/components/AddCustomerModal.tsx index d4731d8..8beca42 100644 --- a/src/modules/customer/components/AddCustomerModal.tsx +++ b/src/modules/customer/components/AddCustomerModal.tsx @@ -9,6 +9,7 @@ import { Divider, FormControl, FormControlLabel, + FormHelperText, FormLabel, Grid, IconButton, @@ -28,8 +29,11 @@ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import Avatar from "@ui/@extended/Avatar"; import { MuiTelInput, matchIsValidTel } from "mui-tel-input"; import { ChangeEvent, ReactNode, useEffect, useState } from "react"; -import { Controller, useForm } from "react-hook-form"; -// import * as Yup from "yup"; +import { Controller, FormProvider, useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import CustomerManipulateForm from "./form/CustomerManipulateForm"; +import useCustomerForm, { ManipulateCustomerForm } from "../hook/useCustomerForm"; +import { mockRole } from "@/data/@mk/mock/Role"; interface AddCustomerModalProps { isOpen?: boolean; @@ -38,43 +42,24 @@ interface AddCustomerModalProps { customer: User; } -interface AddCustomerForm { - fullName: string; -} + const AddCustomerModal = ({ customer, onCancel, }: // isOpen, AddCustomerModalProps) => { - console.log("render"); - - const theme = useTheme(); - // const dispatch = useDispatch(); - // const isCreating = !customer; - const isCreating = true; - - const [selectedImage, setSelectedImage] = useState( - undefined - ); - const [avatar, setAvatar] = useState(); - // avatarImage(`./avatar-${isCreating && !customer?.avatar ? 1 : customer.avatar}.png`).default - - useEffect(() => { - if (selectedImage) { - setAvatar(URL.createObjectURL(selectedImage)); - } - }, [selectedImage]); - - /* const CustomerSchema = Yup.object().shape({ - name: Yup.string().max(255).required("Name is required"), - orderStatus: Yup.string().required("Name is required"), - email: Yup.string() - .max(255) - .required("Email is required") - .email("Must be a valid email"), - location: Yup.string().max(500), - }); - */ + const isCreating = !customer; + const defaultValue:ManipulateCustomerForm = !isCreating ? { + autoPassword: true, + birthday: customer?.birthday, + email: customer?.email, + phone: customer?.phone, + fullname: customer?.fullName, + status: customer?.customer.status, + role: customer?.roleId + }: {autoPassword: true} + + const {CustomerSchema, createCustomerHandler} = useCustomerForm() const deleteHandler = () => { // dispatch(deleteCustomer(customer?.id)); - delete // dispatch( @@ -138,327 +123,35 @@ AddCustomerModalProps) => { // } // } // }); - const { - control, - handleSubmit, - register, - formState: { errors }, - } = useForm(); - // const allStatus = ["Complicated", "Single", "Relationship"]; - const roles = []; // TODO: load from be + const methods = useForm({ + mode: "all", + resolver: yupResolver(CustomerSchema), + defaultValues:{ + autoPassword:true + } + }); + + const roles = mockRole; // TODO: load from be + useEffect(()=>{ + console.log("Error =>",methods.formState?.errors); + + },[methods.formState.errors]) return ( <> - - {/*
*/} + { + onSubmit={methods.handleSubmit( async (data) => { console.log("Add customer data => ", data); + const res = await createCustomerHandler(data); })}> {customer ? "Edit Customer" : "New Customer"} - - - - - - - - - - Upload - - - - - ) => - setSelectedImage(e.target.files?.[0]) - } - /> - - - - - - - Full Name - - - - - - Email - - - - - - Phone - {/* - */} - ( - - )} - /> - - - - - - Birthday - ( - { - onChange(event); - }} - - // renderInput={(params) => } - /> - )} - /> - - - - - - Status - - - - - {/* {touched.orderStatus && errors.orderStatus && ( - - {errors.orderStatus} - - )} */} - - - - - - Role - - - - - {/* {touched.orderStatus && errors.orderStatus && ( - - {errors.orderStatus} - - )} */} - - - - - - Location - - - - - - - - - Make Contact Info Public - - - Means that anyone viewing your profile will be able to - see your contacts details - - - } - label="" - labelPlacement="start" - /> - - - - - - Available to hire - - - Toggling this will let your teammates know that you - are available for acquiring new projects - - - } - label="" - labelPlacement="start" - /> - - - - - + @@ -499,9 +192,7 @@ AddCustomerModalProps) => { - - {/* */} -
+ ); }; diff --git a/src/modules/customer/components/form/CustomerManipulateForm.tsx b/src/modules/customer/components/form/CustomerManipulateForm.tsx new file mode 100644 index 0000000..2f6d6cf --- /dev/null +++ b/src/modules/customer/components/form/CustomerManipulateForm.tsx @@ -0,0 +1,400 @@ +import { Customer } from "@/types/@mk/entity/customer"; +import { Role } from "@/types/@mk/entity/role"; +import { CustomerStatus } from "@/types/@mk/enum/customerStatus"; +import { CameraOutlined } from "@ant-design/icons"; +import { + FormControl, + FormControlLabel, + FormHelperText, + FormLabel, + Grid, + InputLabel, + ListItemText, + MenuItem, + OutlinedInput, + Select, + Switch, + TextField, + Typography +} from "@mui/material"; +import { Box, Stack, useTheme } from '@mui/system'; +import { DatePicker } from "@mui/x-date-pickers"; +import Avatar from '@ui/@extended/Avatar'; +import { MuiTelInput, matchIsValidTel } from "mui-tel-input"; +import { ChangeEvent, ReactNode, useEffect, useState } from 'react'; +import { Controller, useFormContext } from 'react-hook-form'; +import { ManipulateCustomerForm } from "../../hook/useCustomerForm"; +type Props = { + customer? : Customer + isCreating?: boolean; + roles: Role[] +} +// const roles = []; // TODO: load from be + +const CustomerManipulateForm = (props: Props) => { + const {customer, isCreating = true, roles} = props + const theme = useTheme(); + const { + control, + register, + formState: { errors }, + setValue + } = useFormContext(); + const [autoPasswordToggle, setAutoPasswordToggle] = useState(true); + const [selectedImage, setSelectedImage] = useState( + undefined + ); + + const [avatar, setAvatar] = useState(); + useEffect(() => { + if (selectedImage) { + setAvatar(URL.createObjectURL(selectedImage)); + setValue("avatar", selectedImage); + } + }, [selectedImage, setValue]); + useEffect(()=>{ + console.log("Checked =>",autoPasswordToggle); + + },[autoPasswordToggle]) + + return ( + + + + + + + + + + Upload + + + + + ) => + setSelectedImage(e.target.files?.[0]) + } + /> + + + + + + + Full Name + + + + + + Email + + + + + + Phone + {/* + */} + ( + { + onChange(value) + }} + defaultCountry="VN" + helperText={ + error?.message + } + error={!!error} + /> + )} + /> + + + + + + Birthday + + + ( + <> + { + onChange(val); + }} + /> + {!!error && {error.message} + } + + + )} + /> + + + + + + + Status + + + + {!!errors?.status && ( + + {errors.status?.message as string} + + )} + + + + + + + + Role + + + + {!!errors?.role && ( + + {errors.role?.message} + + )} + + + + + {/* + + + Make Contact Info Public + + + Means that anyone viewing your profile will be able to + see your contacts details + + + } + label="" + labelPlacement="start" + /> + + */} + + + + Auto generate password + + + Toggling this will let your teammates know that you + are available for acquiring new projects + + + ( + { + + setAutoPasswordToggle(checked); + onChange(e,checked); + }} />} + label="" + labelPlacement="start" + /> + + )} + /> + + + + {!autoPasswordToggle && + + Password + + + + Confirmation Password + + + } + + + + ) +} + +export default CustomerManipulateForm \ No newline at end of file diff --git a/src/modules/customer/hook/useCustomerData.ts b/src/modules/customer/hook/useCustomerData.ts new file mode 100644 index 0000000..2890478 --- /dev/null +++ b/src/modules/customer/hook/useCustomerData.ts @@ -0,0 +1,80 @@ +import { PaginationState, SortingState } from '@tanstack/react-table'; +import React, { useState } from 'react' +import CustomerApi from '../service/customer.api'; +import { useMutation, useQuery } from 'react-query'; +import { Customer, CustomerAdmin } from '@/types/@mk/entity/customer'; + + +const useCustomerData = () => { + // const [orderData, setOrderData] = useState(); +const [pagination, setPagination] = useState({ + pageIndex: 0, + pageSize: 25, + }); + const [sortState, setSortState] = useState([]); + const [keyword, setKeyword] = useState(); + + // Define the fetchCustomerDataFunction that fetches orders using the OrderApi + const fetchCustomerDataFunction = async () => { + try { + const response = await CustomerApi.getCustomers({ + paging: pagination, // Pass the pagination state + sort: sortState, // Pass the sort state + keyword, // Pass the keyword + }); + // Return the data from the response + return response?.data; + } + catch(e){ + console.log(e); + throw e + } + }; + // Define your initial query key, including dependencies like pagination, sorting, and keyword + // TODO: use debounce technique to prevent many calls at a short time + const queryKey = ['orders', pagination, sortState, keyword]; + + // Fetch order data using React Query's useQuery hook + const { data: customerData, + // isLoading, error + } = useQuery(queryKey, fetchCustomerDataFunction,{ + onError:(err) => console.log("error at hook",err) + + }); + const createCustomerFunction = async (customer:Customer) => { + const response = await CustomerApi.createCustomer(customer); + return response.data; + } + const createCustomer = useMutation(createCustomerFunction, { + // You can specify onSuccess and onError callbacks here + }); + + // Define your mutation functions for creating, updating, and deleting orders + // const createOrder = useMutation(createOrderFunction, { + // // You can specify onSuccess and onError callbacks here + // }); + // Define the updateCustomerFunction to update an order using the OrderApi + const updateCustomerFunction = async (customer: CustomerAdmin) => { + const response = await CustomerApi.updateCustomer(customer); + // You can handle the success scenario here if needed + return response?.data; // Return the updated order data + }; + + const updateCustomer = useMutation(updateCustomerFunction, { + // You can specify onSuccess and onError callbacks here + }); + // Define the deleteCustomerFunction to delete an order using the OrderApi + const deleteCustomerFunction = async (id: number) => { + const response = await CustomerApi.deleteCustomer(id); + // You can handle the success scenario here if needed + return response?.data; // Return any data indicating the success of deletion + + }; + const deleteCustomer = useMutation(deleteCustomerFunction, { + // You can specify onSuccess and onError callbacks here + }); + + return { customerData, setSortState, setKeyword, setPagination, updateCustomer, deleteCustomer, createCustomer }; +} + +export default useCustomerData \ No newline at end of file diff --git a/src/modules/customer/hook/useCustomerForm.ts b/src/modules/customer/hook/useCustomerForm.ts new file mode 100644 index 0000000..51e70b3 --- /dev/null +++ b/src/modules/customer/hook/useCustomerForm.ts @@ -0,0 +1,115 @@ +import React from "react"; +import * as Yup from "yup"; +import useCustomerData from "./useCustomerData"; +import { Customer } from "@/types/@mk/entity/customer"; +import { CustomerStatus } from "@/types/@mk/enum/customerStatus"; +import useAwsS3 from "@/base/hooks/useAwsS3"; + +export interface ManipulateCustomerForm { + fullname?: string; + email?: string; + phone?: string; + birthday?: string; + password?: string; + confirmPassword?: string; + role?: string; + autoPassword?: boolean; + status?: string; + avatar?: File; +} + +const useCustomerForm = () => { + const { + createCustomer: { + mutateAsync: createCustomer, + isLoading: isCreateCustomer, + }, + } = useCustomerData(); + const {putObject} = useAwsS3(); + const CustomerSchema = Yup.object().shape({ + fullname: Yup.string().max(255).required("Name is required"), + phone: Yup.string() + .required("Phone is required") + .max(16, "Must be a valid phone") + .matches(/^\+[\d+]|[\d+]*$/, "Must be a valid phone"), + email: Yup.string() + .max(255) + .required("Email is required") + .email("Must be a valid email"), + autoPassword: Yup.boolean(), + birthday: Yup.string().required(), + role: Yup.string().required(), + password: Yup.string().when("autoPassword", (autoPassword, schema) => { + if (!autoPassword[0]) { + return schema.required(); + } else { + return schema.notRequired(); + } + }), + confirmPassword: Yup.string().when( + ["autoPassword", "password"], + ([autoPassword, password], schema) => { + { + console.log("Auto Password in yup => ", autoPassword); + console.log("Password in yup => ", password); + + if (!autoPassword && !!password) { + return schema + .required("Confirm Password is required") + .oneOf( + [Yup.ref("password"), null], + "Confirm Password does not match" + ); + } else { + return schema; + } + } + } + ), + status: Yup.string().required(), + }); + const createCustomerHandler = async (formValues: ManipulateCustomerForm) => { + + const { + avatar, + fullname: fullName, + email, + password, + phone, + birthday, + role, + status, + } = formValues; + let objectPath = null + if(avatar){ + objectPath = await putObject({ + object: avatar, + path : "customer/avatar/" + }); + console.log("Uploaded object path => ", objectPath); + } + const newCustomer: Customer = { + user: { + fullName, + email, + password, + phone, + birthday, + roleId: role, + avatarUrl: objectPath, + }, + status: CustomerStatus[status], + }; + console.log("New customer => ", newCustomer); + + // const res = await createCustomer(newCustomer); + // return res; + }; + return { + CustomerSchema, + createCustomerHandler, + isCreateCustomer, + }; +}; + +export default useCustomerForm; diff --git a/src/modules/customer/service/customer.api.ts b/src/modules/customer/service/customer.api.ts new file mode 100644 index 0000000..de435e6 --- /dev/null +++ b/src/modules/customer/service/customer.api.ts @@ -0,0 +1,47 @@ +import axiosClient from "@/base/service/axiosClient"; +import { ResponseObject } from "@/base/service/response"; +import { Customer, CustomerAdmin } from "@/types/@mk/entity/customer"; + +import { + PaginationState, + SortingState +} from "@tanstack/react-table"; + +interface CustomerGetParams { + paging?: PaginationState; + sort?: SortingState; + keyword?: string; + // filter : +} +const CustomerApi = { + getCustomers: (params: CustomerGetParams) => { + const endpoint = "/customers"; + return axiosClient.get>(endpoint, { + params: { ...params }, + }); + }, + getCustomerDetail: (id: number) => { + const endpoint = "/customer"; + return axiosClient.get>(endpoint, { + params: { + id, + }, + }); +}, +createCustomer: (customer : Customer) => { + const endpoint = "/customer"; + //TODO specify return type + return axiosClient.post>(endpoint, customer) + }, + updateCustomer: (customer: CustomerAdmin) => { + const endpoint = "/customer"; + return axiosClient.put(endpoint, customer); + }, + deleteCustomer: (id: number) => { + const endpoint = "/customer"; + return axiosClient.delete(endpoint, { + params: { id }, + }); + }, +}; +export default CustomerApi; diff --git a/src/modules/kitchen/components/AddKitchenModal.tsx b/src/modules/kitchen/components/AddKitchenModal.tsx new file mode 100644 index 0000000..cf89460 --- /dev/null +++ b/src/modules/kitchen/components/AddKitchenModal.tsx @@ -0,0 +1,91 @@ +import CustomerManipulateForm from '@/modules/customer/components/form/CustomerManipulateForm'; +import { Kitchen, KitchenAdmin } from '@/types/@mk/entity/kitchen'; +import { DeleteFilled } from '@ant-design/icons'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Tooltip } from '@mui/material'; +import { Button } from '@mui/material'; +import { DialogActions, DialogContent, DialogTitle, Divider, Grid } from '@mui/material'; +import { Box, Stack } from '@mui/system'; +import IconButton from '@ui/@extended/IconButton'; +import React from 'react' +import { FormProvider, useForm } from 'react-hook-form'; + +type Props = { + kitchen?: KitchenAdmin + onCancel: () => void; + +} + +const AddKitchenModal = (props: Props) => { + const {kitchen, onCancel} = props + const isCreating = !kitchen + const methods = useForm({ + mode: "all", + resolver: yupResolver(null), + defaultValues:{ + autoPassword:true + } + }); + const deleteHandler = ()=>{ + console.log("TODO : Implement"); + } + return ( + <> + + { + console.log("Add customer data => ", data); + })}> + + {kitchen ? "Edit kitchen" : "New kitchen"} + + + + {/* */} + + + + + + {!isCreating && ( + + + + + + )} + + + + + + + + + + + + + ) +} + +export default AddKitchenModal \ No newline at end of file diff --git a/src/modules/kitchen/pages/KitchenListPage.tsx b/src/modules/kitchen/pages/KitchenListPage.tsx index 37e455c..948a654 100644 --- a/src/modules/kitchen/pages/KitchenListPage.tsx +++ b/src/modules/kitchen/pages/KitchenListPage.tsx @@ -3,14 +3,17 @@ import { KitchenAdmin } from '@/types/@mk/entity/kitchen' import { DatePicker } from '@mui/x-date-pickers' import MainCard from '@ui/MainCard' import QuickTable from '@ui/common/table/QuickTable' -import { useMemo } from 'react' +import { useMemo, useState } from 'react' import useKitchenData from '../hook/useKitchenData' import useKitchenTable from '../hook/useKitchenTable' +import { Dialog } from '@mui/material' +import AddKitchenModal from '../components/AddKitchenModal' const KitchenListPage = () => { const data = useMemo(()=>{ return mockKitchenAdmin },[]) + const [addToggle, setAddToggle] = useState(false); const {columnsDef} = useKitchenTable({ handleEditClick: ()=>console.log("TODO: implement") @@ -30,8 +33,9 @@ const KitchenListPage = () => { isShown: true, addButtonHandler: () => { // TODO : add action, nav page -> create/update + setAddToggle(true) }, - buttonContentLangKey: "Add order", + buttonContentLangKey: "Add Kitchen", }} onSearchKeywordChange={(q) => setKeyword(q)} onSortByChange={(sort) => setSortState(sort)} @@ -52,6 +56,15 @@ const KitchenListPage = () => { } /> + {addToggle && setAddToggle(false)} + open={addToggle} + sx={{ "& .MuiDialog-paper": { p: 0 } }}> + {addToggle && setAddToggle(false)}/>} + } + ) } diff --git a/src/types/@mk/common/baseEntity.ts b/src/types/@mk/common/baseEntity.ts index 50483e5..0d317b0 100644 --- a/src/types/@mk/common/baseEntity.ts +++ b/src/types/@mk/common/baseEntity.ts @@ -1,8 +1,8 @@ export interface BaseEntity { - id: string; - createdDate: string; - updatedDate: string; - createdBy: string | null; - updatedBy: string | null; - isDeleted: boolean; + id?: string; + createdDate?: string; + updatedDate?: string; + createdBy?: string | null; + updatedBy?: string | null; + isDeleted?: boolean; } \ No newline at end of file diff --git a/src/types/@mk/entity/customer.ts b/src/types/@mk/entity/customer.ts index 7bad621..b0b6217 100644 --- a/src/types/@mk/entity/customer.ts +++ b/src/types/@mk/entity/customer.ts @@ -6,16 +6,16 @@ import { BaseEntity } from "../common/baseEntity"; import { CustomerStatus } from "../enum/customerStatus"; export interface Customer extends BaseEntity { - userId: string; - user: User; + userId?: string; + user?: User; status: CustomerStatus; - favouriteKitchens: FavouriteKitchen[]; - feedbacks: Feedback[]; - orders: Order[]; + favouriteKitchens?: FavouriteKitchen[]; + feedbacks?: Feedback[]; + orders?: Order[]; } export interface CustomerAdmin extends Customer { - order_quantity: number; + orderQuantity: number; spentMoney: number; - selection: boolean; + // selection: boolean; } diff --git a/src/types/@mk/entity/role.ts b/src/types/@mk/entity/role.ts index c5da596..4bfffc4 100644 --- a/src/types/@mk/entity/role.ts +++ b/src/types/@mk/entity/role.ts @@ -3,5 +3,5 @@ import { BaseEntity } from "../common/baseEntity"; export interface Role extends BaseEntity { name: string; - users: User[]; + users?: User[]; } \ No newline at end of file diff --git a/src/types/@mk/entity/user.ts b/src/types/@mk/entity/user.ts index 7888594..9805cbf 100644 --- a/src/types/@mk/entity/user.ts +++ b/src/types/@mk/entity/user.ts @@ -13,8 +13,8 @@ export interface User extends BaseEntity { avatarUrl: string | null; fullName: string; roleId: string; - role: Role | null; - notifications: Notification[]; - customer: Customer | null; - kitchen: Kitchen | null; + role?: Role | null; + notifications?: Notification[]; + customer?: Customer | null; + kitchen?: Kitchen | null; }