From e6379625da3c271417a2082a0643725fb86d084a Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Fri, 27 Sep 2024 11:05:30 -0500 Subject: [PATCH 01/21] chore: update setup to the latest Medusa v1 version --- .babelrc.js | 12 + .github/dependabot.yml | 21 + .gitignore | 36 +- .yarnrc.yml | 1 + index.js | 50 ++ medusa-config.js | 56 ++ package.json | 118 ++- tsconfig.admin.json | 14 +- tsconfig.json | 51 +- tsconfig.server.json | 14 +- tsconfig.spec.json | 5 + yarn.lock | 1750 +++++++++++++++++++--------------------- 12 files changed, 1096 insertions(+), 1032 deletions(-) create mode 100644 .babelrc.js create mode 100644 .github/dependabot.yml create mode 100644 .yarnrc.yml create mode 100644 index.js create mode 100644 medusa-config.js create mode 100644 tsconfig.spec.json diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 000000000..ae10f028d --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,12 @@ +let ignore = [`**/dist`] + +// Jest needs to compile this code, but generally we don't want this copied +// to output folders +if (process.env.NODE_ENV !== `test`) { + ignore.push(`**/__tests__`) +} + +module.exports = { + presets: [["babel-preset-medusa-package"], ["@babel/preset-typescript"]], + ignore, +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..d499e13f8 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,21 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-type: production + groups: + medusa: + patterns: + - "@medusajs*" + - "medusa*" + update-types: + - "minor" + - "patch" + ignore: + - dependency-name: "@medusajs*" + update-types: ["version-update:semver-major"] + - dependency-name: "medusa*" + update-types: ["version-update:semver-major"] diff --git a/.gitignore b/.gitignore index 8803ada6c..6d5c39988 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,26 @@ +/dist +.env +.DS_Store +/uploads +/node_modules +yarn-error.log + .idea -/lib -node_modules -.DS_store -**/.DS_Store -.env* -/*.js -dist coverage -api/ -services/ -models/ -subscribers/ -migrations/ -loaders/ -index.* - !src/** ./tsconfig.tsbuildinfo -./package-lock.json -./yarn.json +package-lock.json +yarn.lock +medusa-db.sql +build +.cache + +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 000000000..8b757b29a --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 000000000..e44fcfe54 --- /dev/null +++ b/index.js @@ -0,0 +1,50 @@ +const express = require("express") +const { GracefulShutdownServer } = require("medusa-core-utils") + +const loaders = require("@medusajs/medusa/dist/loaders/index").default + +;(async() => { + async function start() { + const app = express() + const directory = process.cwd() + + try { + const { container } = await loaders({ + directory, + expressApp: app + }) + const configModule = container.resolve("configModule") + const port = process.env.PORT ?? configModule.projectConfig.port ?? 9000 + + const server = GracefulShutdownServer.create( + app.listen(port, (err) => { + if (err) { + return + } + console.log(`Server is ready on port: ${port}`) + }) + ) + + // Handle graceful shutdown + const gracefulShutDown = () => { + server + .shutdown() + .then(() => { + console.info("Gracefully stopping the server.") + process.exit(0) + }) + .catch((e) => { + console.error("Error received when shutting down the server.", e) + process.exit(1) + }) + } + process.on("SIGTERM", gracefulShutDown) + process.on("SIGINT", gracefulShutDown) + } catch (err) { + console.error("Error starting server", err) + process.exit(1) + } + } + + await start() +})() diff --git a/medusa-config.js b/medusa-config.js new file mode 100644 index 000000000..50afc0499 --- /dev/null +++ b/medusa-config.js @@ -0,0 +1,56 @@ +const dotenv = require("dotenv"); + +let ENV_FILE_NAME = ""; +switch (process.env.NODE_ENV) { + case "production": + ENV_FILE_NAME = ".env.production"; + break; + case "staging": + ENV_FILE_NAME = ".env.staging"; + break; + case "test": + ENV_FILE_NAME = ".env.test"; + break; + case "development": + default: + ENV_FILE_NAME = ".env"; + break; +} + +try { + dotenv.config({ path: process.cwd() + "/" + ENV_FILE_NAME }); +} catch (e) {} + +// CORS when consuming Medusa from admin +const ADMIN_CORS = + process.env.ADMIN_CORS || "http://localhost:7000,http://localhost:7001"; + +// CORS to avoid issues when consuming Medusa from a client +const STORE_CORS = process.env.STORE_CORS || "http://localhost:8000"; + +const DATABASE_URL = + process.env.DATABASE_URL || "postgres://localhost/medusa-starter-default"; + +const REDIS_URL = process.env.REDIS_URL || "redis://localhost:6379"; + +const plugins = []; + +const modules = {}; + +/** @type {import('@medusajs/medusa').ConfigModule["projectConfig"]} */ +const projectConfig = { + jwt_secret: process.env.JWT_SECRET || "supersecret", + cookie_secret: process.env.COOKIE_SECRET || "supersecret", + store_cors: STORE_CORS, + database_url: DATABASE_URL, + admin_cors: ADMIN_CORS, + // Uncomment the following lines to enable REDIS + // redis_url: REDIS_URL +}; + +/** @type {import('@medusajs/medusa').ConfigModule} */ +module.exports = { + projectConfig, + plugins, + modules, +}; diff --git a/package.json b/package.json index ae68729d6..513baa3b8 100644 --- a/package.json +++ b/package.json @@ -3,73 +3,103 @@ "version": "1.0.0", "description": "Basic Roles and Permissions, for users", "repository": { - "type": "git", - "url": "https://codetuple.io/" + "type": "git", + "url": "https://codetuple.io/" }, "homepage": "", "author": "codetuple", "license": "MIT", "keywords": [ - "medusa-plugin", - "page", - "static-page", - "ecommerce", - "headless", - "medusa" + "sqlite", + "postgres", + "typescript", + "ecommerce", + "headless", + "medusa" ], "scripts": { - "prepare": "cross-env NODE_ENV=production yarn run build", - "test": "jest --passWithNoTests src", - "build": "tsc -p ./tsconfig.server.json && medusa-admin bundle", - "watch": "tsc --watch" + "clean": "cross-env ./node_modules/.bin/rimraf dist", + "copy-assets": "cp -rv src/assets dist/assets", + "build": "cross-env npm run clean && npm run build:server && npm run build:admin", + "build:server": "cross-env npm run clean && tsc -p tsconfig.server.json", + "build:admin": "cross-env medusa-admin build", + "prepare": "cross-env NODE_ENV=production npm run build:server && npm run copy-assets && medusa-admin bundle", + "watch": "cross-env tsc --watch", + "test": "cross-env jest", + "seed": "cross-env medusa seed -f ./data/seed.json", + "start": "cross-env npm run build && medusa start", + "start:custom": "cross-env npm run build && node --preserve-symlinks --trace-warnings index.js", + "dev": "cross-env npm run build:server && medusa develop" + }, + "dependencies": { + "@medusajs/admin": "^7.1.16", + "@medusajs/cache-redis": "^1.9.2", + "@medusajs/event-bus-local": "1.9.9", + "@medusajs/event-bus-redis": "^1.8.14", + "@medusajs/file-local": "1.0.4", + "@medusajs/icons": "^1.2.2", + "@tanstack/react-query": "4.22.0", + "body-parser": "^1.19.0", + "cors": "^2.8.5", + "dotenv": "16.3.1", + "express": "^4.17.2", + "medusa-interfaces": "1.3.10", + "medusa-react": "^9.0.18", + "prism-react-renderer": "^2.0.4", + "typeorm": "0.3.16" }, - "packageManager": "yarn@3.5.0", "devDependencies": { "@babel/cli": "^7.14.3", "@babel/core": "^7.14.3", "@babel/preset-typescript": "^7.21.4", - "@medusajs/medusa-cli": "^1.3.16", + "@medusajs/medusa": "1.20.9", + "@stdlib/number-float64-base-normalize": "0.0.8", "@types/express": "^4.17.13", "@types/jest": "^27.4.0", + "@types/mime": "1.3.5", "@types/node": "^17.0.8", - "babel-preset-medusa-package": "^1.1.13", + "babel-preset-medusa-package": "^1.1.19", "cross-env": "^7.0.3", "eslint": "^6.8.0", "jest": "^27.3.1", - "mongoose": "^5.13.14", "rimraf": "^3.0.2", "ts-jest": "^27.0.7", "ts-loader": "^9.2.6", "typescript": "^4.5.2" }, "peerDependencies": { - "react": "^18.2.0", - "react-router-dom": "^6.13.0" + "@medusajs/medusa": "^1.20.9", + "react": "^18.2.0", + "react-router-dom": "^6.13.0" }, - "dependencies": { - "@medusajs/admin": "^7.1.1", - "@medusajs/cache-inmemory": "^1.8.8", - "@medusajs/cache-redis": "^1.8.8", - "@medusajs/event-bus-local": "^1.9.6", - "@medusajs/event-bus-redis": "^1.8.9", - "@medusajs/file-local": "^1.0.2", - "@medusajs/icons": "^1.0.0", - "@medusajs/medusa": "1.17.0", - "@medusajs/ui": "^1.0.0", - "@tanstack/react-query": "4.22.0", - "babel-preset-medusa-package": "^1.1.13", - "body-parser": "^1.19.0", - "cors": "^2.8.5", - "dotenv": "16.0.3", - "express": "^4.17.2", - "medusa-fulfillment-manual": "^1.1.38", - "medusa-interfaces": "^1.3.7", - "medusa-payment-manual": "^1.0.24", - "medusa-payment-stripe": "^6.0.5", - "medusa-react": "^9.0.7", - "prism-react-renderer": "^2.0.4", - "react-router-dom": "^6.16.0", - "ts-node": "^10.9.1", - "typeorm": "^0.3.16" - } + "jest": { + "globals": { + "ts-jest": { + "tsconfig": "tsconfig.spec.json" + } + }, + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "testPathIgnorePatterns": [ + "/node_modules/", + "/node_modules/" + ], + "rootDir": "src", + "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|js)$", + "transform": { + ".ts": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "./coverage", + "testEnvironment": "node" + }, + "resolutions": { + "glob": "^7.1.6" + }, + "packageManager": "yarn@1.22.22" } diff --git a/tsconfig.admin.json b/tsconfig.admin.json index f47acc626..b109ee6f1 100644 --- a/tsconfig.admin.json +++ b/tsconfig.admin.json @@ -1,8 +1,8 @@ { - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "esnext" - }, - "include": ["src/admin"], - "exclude": ["**/*.spec.js"] - } \ No newline at end of file + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "esnext" + }, + "include": ["src/admin"], + "exclude": ["**/*.spec.js"] +} diff --git a/tsconfig.json b/tsconfig.json index dbb835d7b..5951e8ade 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,31 +1,30 @@ { "compilerOptions": { - "lib": ["es2020"], - "target": "es2020", - "outDir": "./dist", - "rootDir": "./src", - "jsx": "react-jsx", - "esModuleInterop": true, - "declaration": false, - "module": "commonjs", - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "sourceMap": true, - "noImplicitReturns": false, - "strictNullChecks": false, - "strictFunctionTypes": false, - "noImplicitThis": false, - "allowJs": true, - "skipLibCheck": true, - "downlevelIteration": true + "target": "es2020", + "allowJs": true, + "esModuleInterop": true, + "module": "commonjs", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "declaration": true, + "sourceMap": false, + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": ".", + "jsx": "react-jsx", + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "checkJs": false }, - "include": ["src"], + "include": ["src/"], "exclude": [ - "dist", - "src/**/__tests__", - "src/**/__mocks__", - "src/**/__fixtures__", - "node_modules" + "**/__tests__", + "**/__fixtures__", + "node_modules", + "build", + ".cache" ] -} \ No newline at end of file +} diff --git a/tsconfig.server.json b/tsconfig.server.json index 54f51a3e7..94a32ac58 100644 --- a/tsconfig.server.json +++ b/tsconfig.server.json @@ -1,8 +1,8 @@ { - "extends": "./tsconfig.json", - "compilerOptions": { - /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSourceMap": true - }, - "exclude": ["src/admin", "**/*.spec.js"] - } \ No newline at end of file + "extends": "./tsconfig.json", + "compilerOptions": { + /* Emit a single file with source maps instead of having a separate file. */ + "inlineSourceMap": true + }, + "exclude": ["src/admin", "**/*.spec.js"] +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 000000000..68764811a --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "exclude": ["dist", "node_modules"] +} diff --git a/yarn.lock b/yarn.lock index 6a0e24570..19f36f50e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -539,7 +544,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.22.15", "@babel/plugin-transform-classes@^7.9.5": +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== @@ -624,7 +629,7 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-instanceof@^7.12.1", "@babel/plugin-transform-instanceof@^7.8.3": +"@babel/plugin-transform-instanceof@^7.12.1": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.22.5.tgz#d44e29265026e7e4e31357a09e3e460d7f8ebbe6" integrity sha512-j8XdWrJhzeLTrgLKDyaFFq2GACjfT4NMYkM7KqdG9LnUXToyvyyJk7mzjy5/VJ9AwWiPlx5DgTQY8wag7/hSeg== @@ -1062,13 +1067,20 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.22.15", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.15.4", "@babel/runtime@^7.22.10": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -1129,13 +1141,6 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@csstools/cascade-layer-name-parser@^1.0.2", "@csstools/cascade-layer-name-parser@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.5.tgz#c4d276e32787651df0007af22c9fa70d9c9ca3c2" @@ -1931,7 +1936,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== @@ -1954,14 +1959,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" @@ -1987,18 +1984,18 @@ dependencies: "@lukeed/csprng" "^1.1.0" -"@medusajs/admin-ui@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@medusajs/admin-ui/-/admin-ui-2.1.4.tgz#f92b543350ba4331cbc278b8fad66d88d26897d6" - integrity sha512-eLJv9vI/x1o7PY0Tzgm5nvLrAopu/MsJPXynowLKCflfPJP0gWhHO6kT30C2HWAb/ns2FSfUSSefUmnhp+hCEA== +"@medusajs/admin-ui@^2.1.16": + version "2.1.17" + resolved "https://registry.yarnpkg.com/@medusajs/admin-ui/-/admin-ui-2.1.17.tgz#ee8c3e1fc19dc0ce9374df3e8b8cedd17b5f4f89" + integrity sha512-aLvMrpGESHUxySQ3PQWBWsNJobkPvBRpJlrWCIuIJZPkgJiN4PvgYjP4xic0gAG+dvRJM5F0+rNPEJwiGZ4xug== dependencies: "@babel/parser" "7.22.5" "@babel/traverse" "7.22.5" "@hookform/error-message" "^2.0.1" "@hookform/resolvers" "^3.3.1" - "@medusajs/icons" "1.1.0" - "@medusajs/ui" "^2.2.0" - "@medusajs/ui-preset" "1.0.2" + "@medusajs/icons" "^1.2.2" + "@medusajs/ui" "^3.0.1" + "@medusajs/ui-preset" "^1.1.4" "@pmmmwh/react-refresh-webpack-plugin" "^0.5.10" "@radix-ui/react-accordion" "^1.0.1" "@radix-ui/react-avatar" "^1.0.1" @@ -2012,12 +2009,13 @@ "@radix-ui/react-switch" "^1.0.1" "@radix-ui/react-tooltip" "^1.0.3" "@segment/analytics-next" "^1.51.1" + "@stdlib/number-float64-base-normalize" "0.0.8" "@svgr/webpack" "^8.0.1" "@swc/core" "^1.3.61" - "@tailwindcss/forms" "^0.5.3" + "@tailwindcss/forms" "^0.5.7" "@tanstack/react-query" "4.22.0" "@tanstack/react-table" "^8.7.9" - autoprefixer "^10.4.13" + autoprefixer "^10.4.19" chokidar "^3.5.3" clsx "^1.2.1" copy-to-clipboard "^3.3.1" @@ -2030,12 +2028,12 @@ i18next-browser-languagedetector "^7.0.1" i18next-http-backend "^2.2.1" md5 "^2.3.0" - medusa-react "*" + medusa-react "^9.0.18" mini-css-extract-plugin "^2.7.6" moment "^2.29.4" path-browserify "^1.0.1" pluralize "^8.0.0" - postcss "^8.4.21" + postcss "^8.4.38" postcss-loader "^7.3.2" postcss-preset-env "^8.4.1" prism-react-renderer "^2.0.4" @@ -2063,11 +2061,10 @@ react-router-dom "6.8.0" react-select "^5.5.4" react-table "^7.7.0" - source-map-loader "^4.0.1" style-loader "^3.3.3" swc-loader "^0.2.3" swc-minify-webpack-plugin "^2.1.1" - tailwindcss "3.2.2" + tailwindcss "^3.4.3" tailwindcss-radix "^2.7.0" ts-dedent "^2.2.0" type-fest "^3.6.0" @@ -2076,12 +2073,12 @@ webpackbar "^5.0.2" zod "^3.22.2" -"@medusajs/admin@^7.1.1": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@medusajs/admin/-/admin-7.1.4.tgz#4bd20fb18686b1178637fed2993ee14eb39a68cd" - integrity sha512-NOJh/ZeX0WTwOsKUJVs9CN9E0zsluLtzQL9algxW4PJKHRj7Qkl7qSLmuj2t1clH4pJBgjafn/0l7BTSBSzptQ== +"@medusajs/admin@^7.1.16": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@medusajs/admin/-/admin-7.1.16.tgz#0c042d455d057ea65af234186fa50d6f38c51932" + integrity sha512-1BKOL2P4jCzjRNvplnXN4qAPL25SenTc3UhZkp1CSSaXR4uKxowDRpCSQ5g/DTGPIITulKqzdMSzqlQi4eyZdA== dependencies: - "@medusajs/admin-ui" "^2.1.4" + "@medusajs/admin-ui" "^2.1.16" "@rollup/plugin-alias" "5.0.0" "@rollup/plugin-commonjs" "24.1.0" "@rollup/plugin-json" "6.0.0" @@ -2089,85 +2086,90 @@ "@rollup/plugin-replace" "5.0.2" "@rollup/plugin-virtual" "^3.0.1" commander "^10.0.0" - dotenv "16.3.1" + dotenv "^16.4.5" esbuild "0.17.18" express "4.18.2" fs-extra "11.1.0" lodash "^4.17.21" - medusa-core-utils "1.2.0" + medusa-core-utils "1.2.3" rollup "3.20.7" rollup-plugin-esbuild "5.0.0" ts-dedent "^2.2.0" -"@medusajs/cache-inmemory@^1.8.8": - version "1.8.8" - resolved "https://registry.yarnpkg.com/@medusajs/cache-inmemory/-/cache-inmemory-1.8.8.tgz#da37f21b92fd1cc7e322e1ff222db0143dee1d98" - integrity sha512-UutjrOFjPzCiiHZtlfoHSBZ1e8w/F9hBvzMkjHr+0oO+7idvISeptuYeQB+dv8zt9KgZdfMWtgJZPd+MyFZz6w== - dependencies: - "@medusajs/modules-sdk" "^1.8.8" - -"@medusajs/cache-redis@^1.8.8": - version "1.8.8" - resolved "https://registry.yarnpkg.com/@medusajs/cache-redis/-/cache-redis-1.8.8.tgz#2535828a5b3cfbe65d319265d0f084d4f935cb2a" - integrity sha512-KjcAYYkjDLM82fAxtdckWBtlS4XGcqNiWhYH2OIQLZyqQp66K5DxsvtfzntO8W3ttBnGCvad1ydSwyAXxMfQRw== +"@medusajs/cache-redis@^1.9.2": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@medusajs/cache-redis/-/cache-redis-1.9.2.tgz#b30ec5249ea78da66ea33d076e40e5e61fb899d8" + integrity sha512-Gbq14rYmlrKqwVSk4ze3pscNly4l9LI9QAxU6/GgwolcpoRocWeOJdIXohWBS05GLpyd1LgRCCf2bRaQ3cmiDA== dependencies: - "@medusajs/modules-sdk" "^1.8.8" + "@medusajs/modules-sdk" "^1.12.12" awilix "^8.0.0" ioredis "^5.3.1" -"@medusajs/event-bus-local@^1.9.6": - version "1.9.6" - resolved "https://registry.yarnpkg.com/@medusajs/event-bus-local/-/event-bus-local-1.9.6.tgz#138f2a57fa81a1d612b3ba121dc974ffecf35655" - integrity sha512-eah/8duL34kg1MNR2dA9DdcpkJaulJaAbjmh9S7K9GR12AHrl04Wlf9cY6tUi+7nSgTf/r8n9pLNGxMaQ52xlg== +"@medusajs/core-flows@^0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@medusajs/core-flows/-/core-flows-0.0.10.tgz#1d77685564d20e4ac03e17b0c989b6ec7c395b06" + integrity sha512-ivnbgMDIpVsiqtfLqqYQEaeQA6Wc9cvUoQcIzFUUssmbP5dVzckoUIS3YThh2oguC1T4QrZvKvg8WBLvIxsM7g== + dependencies: + "@medusajs/modules-sdk" "^1.12.12" + "@medusajs/orchestration" "^0.5.8" + "@medusajs/utils" "^1.11.10" + "@medusajs/workflows-sdk" "^0.1.8" + awilix "^8.0.1" + ulid "^2.3.0" + +"@medusajs/event-bus-local@1.9.9": + version "1.9.9" + resolved "https://registry.yarnpkg.com/@medusajs/event-bus-local/-/event-bus-local-1.9.9.tgz#96951772044f376fb8ad9a4efa06a18ed53616bb" + integrity sha512-4KC6kpGjoqooLIUFftTxd/pxQ3f8jTqTZugSXkTr3ptyvlmeGxKkORQowv8izo2GgUL8/00DNg4lW7YmizLxkw== dependencies: - "@medusajs/modules-sdk" "^1.8.8" - "@medusajs/utils" "^1.9.2" + "@medusajs/modules-sdk" "^1.12.12" + "@medusajs/utils" "^1.11.10" ulid "^2.3.0" -"@medusajs/event-bus-redis@^1.8.9": - version "1.8.9" - resolved "https://registry.yarnpkg.com/@medusajs/event-bus-redis/-/event-bus-redis-1.8.9.tgz#0f19d158148ea6622a5a3ce96dff854d4e59e48c" - integrity sha512-6SHReOjIMrfzV4n/oUS2UOo4GRlxvq/8P5gnJZQLp7dewVaran968bzxLtU1hn9gM5rHjolRpOZQtxdiiListQ== +"@medusajs/event-bus-redis@^1.8.14": + version "1.8.14" + resolved "https://registry.yarnpkg.com/@medusajs/event-bus-redis/-/event-bus-redis-1.8.14.tgz#c6885b5ef2595493433ca7255b4be10b9b0d1c29" + integrity sha512-+/aM6uD3EJ5qyZEek+QGtXt13if7BRq/hb65elZDqi6QiT3AAW5QQoy3ubD2iLt0YunJN/QNJT4dQF5WtWuT4A== dependencies: - "@medusajs/modules-sdk" "^1.8.8" - "@medusajs/utils" "^1.9.2" + "@medusajs/modules-sdk" "^1.12.12" + "@medusajs/utils" "^1.11.10" awilix "^8.0.0" - bullmq "^3.5.6" + bullmq "^5.4.2" ioredis "^5.2.5" -"@medusajs/file-local@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@medusajs/file-local/-/file-local-1.0.2.tgz#89c74bf3c828218180577fa7e7bce016e8358a08" - integrity sha512-OQDC5RPWr8fHkm46vyljTr1V3A1VlKycUs/w7DC1pYbPkiR3e3/QSgrwE6CY4w/W1JsOjLKCjGiUI7gfvDMDxg== - -"@medusajs/icons@*", "@medusajs/icons@1.1.0", "@medusajs/icons@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@medusajs/icons/-/icons-1.1.0.tgz#eeb8d5aa0ffbea7546d962b38fcf7593a50e2866" - integrity sha512-90+nCmUq9W4KHgg8XuyiZcp41yRleTqT1Y/OZW+Th8FkCvFd8981ugwu7DYZjnaUvXnBCpsGDQ0zYuJ7sU4QIA== +"@medusajs/file-local@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@medusajs/file-local/-/file-local-1.0.4.tgz#74716b5f275f943ed7b87ba2cec8b2ed7c1fda16" + integrity sha512-RXCqmtxYnqJ1IJQEu6zHAVk6IYiOEPJsfZ536H/301+bWzil0ySodyGcr2qaQ+Nrg7EHvnYQy3MjfqDCYQr0Sw== -"@medusajs/link-modules@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@medusajs/link-modules/-/link-modules-0.1.1.tgz#7a5bf46366fd1dfd1e464daf2edf46a426937c62" - integrity sha512-zwn4GaAl2daycwL3//PB5VFlxT3D+bJicxL6bfEoELemvgWbcMdkeO8fQ/pix1JTjz9WDkldqXAS2LhFK0rbuw== - dependencies: - "@medusajs/modules-sdk" "^1.11.0" - "@medusajs/types" "^1.11.1" - "@medusajs/utils" "^1.10.1" - "@mikro-orm/core" "5.7.12" - "@mikro-orm/postgresql" "5.7.12" +"@medusajs/icons@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@medusajs/icons/-/icons-1.2.2.tgz#2961143c075a40ba2d337df0e3c915b8a414b64b" + integrity sha512-yCaEvCJg1GqbJ8eySqe+y3zS8tiE0cK/XNOsgmCHZ3dsu8i6lKvrsGzPVdjAtKlUJ9F2CnBO8dm4oXrg5w+6CA== + +"@medusajs/link-modules@^0.2.12": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@medusajs/link-modules/-/link-modules-0.2.12.tgz#d3de7913dba8530206a182f5f3889e01adbf99ad" + integrity sha512-RxlC+h0RTqjwVso74PM0R+30PQJ3jTJgDI5Nd+nYVlqj59Ld1mWwChQUj+UaqTbqK4GRnXNvMEFm57ra6MRpOQ== + dependencies: + "@medusajs/modules-sdk" "^1.12.12" + "@medusajs/types" "^1.11.17" + "@medusajs/utils" "^1.11.10" + "@mikro-orm/core" "5.9.7" + "@mikro-orm/postgresql" "5.9.7" awilix "^8.0.0" -"@medusajs/medusa-cli@^1.3.16", "@medusajs/medusa-cli@^1.3.21": - version "1.3.21" - resolved "https://registry.yarnpkg.com/@medusajs/medusa-cli/-/medusa-cli-1.3.21.tgz#d69707a268e04e28db60ad823f2114c3086b2cec" - integrity sha512-j898S/3ipWFG3HIBZtyUc/KfqnO2JV5h4Mj30M/P+7vXxvLlpavKiU6qdBRxLZBQHHZ2mGuyHRoq3RatHrrw/Q== +"@medusajs/medusa-cli@^1.3.23": + version "1.3.23" + resolved "https://registry.yarnpkg.com/@medusajs/medusa-cli/-/medusa-cli-1.3.23.tgz#a56f95836ca894a570e1fb2dc1e0164d958e3089" + integrity sha512-0kLG9OP3h9rXwE9QHYrB6Psi+85lFpyTwGUNZNxhD/duZiuGdvUOw4om95lr7dsDzyBUzGg+nDqRb/9XnHC/lA== dependencies: - "@medusajs/utils" "^1.10.0" + "@medusajs/utils" "^1.11.10" axios "^0.21.4" chalk "^4.0.0" configstore "5.0.1" core-js "^3.6.5" - dotenv "16.0.3" + dotenv "^16.4.5" execa "^5.1.1" fs-exists-cached "^1.0.0" fs-extra "^10.0.0" @@ -2176,8 +2178,8 @@ inquirer "^8.0.0" is-valid-path "^0.1.1" meant "^1.0.3" - medusa-core-utils "^1.2.0" - medusa-telemetry "^0.0.17" + medusa-core-utils "^1.2.3" + medusa-telemetry "^0.0.18" open "^8.0.6" ora "^5.4.1" pg "^8.11.0" @@ -2202,21 +2204,22 @@ retry-axios "^2.6.0" uuid "^9.0.0" -"@medusajs/medusa@1.17.0": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@medusajs/medusa/-/medusa-1.17.0.tgz#bc9766f5cf872b2dbc4c1c8998b34c4c1a0364fd" - integrity sha512-p4kuMN4RKoIfM67ox9fm8s8zTd0K6I7f5PwoQh6Hkic65eUVbJ6CeHiR+QgzBGdr7gVrMlPoONtzK/v8UX7paA== - dependencies: - "@medusajs/link-modules" "^0.1.1" - "@medusajs/medusa-cli" "^1.3.21" - "@medusajs/modules-sdk" "^1.11.3" - "@medusajs/orchestration" "^0.4.1" - "@medusajs/utils" "^1.10.2" - "@medusajs/workflows" "^0.2.3" +"@medusajs/medusa@1.20.9": + version "1.20.9" + resolved "https://registry.yarnpkg.com/@medusajs/medusa/-/medusa-1.20.9.tgz#be34928fcff08823d0051497844e628fcec69f94" + integrity sha512-2rE66QhuWsWIp+NAOFUmeiRoP5smG8a+FV29piDz3FYQ5Gvy56d0RaZY/UdvK/oAU4/EQO4P2E7vvYcjQajYBA== + dependencies: + "@medusajs/core-flows" "^0.0.10" + "@medusajs/link-modules" "^0.2.12" + "@medusajs/medusa-cli" "^1.3.23" + "@medusajs/modules-sdk" "^1.12.12" + "@medusajs/orchestration" "^0.5.8" + "@medusajs/utils" "^1.11.10" + "@medusajs/workflows-sdk" "^0.1.8" awilix "^8.0.0" body-parser "^1.19.0" boxen "^5.0.1" - bullmq "^3.5.6" + bullmq "^5.4.2" chokidar "^3.4.2" class-transformer "^0.5.1" class-validator "^0.14.0" @@ -2226,7 +2229,7 @@ core-js "^3.6.5" cors "^2.8.5" cross-spawn "^7.0.3" - dotenv "^16.0.3" + dotenv "^16.4.5" express "^4.18.2" express-session "^1.17.3" fs-exists-cached "^1.0.0" @@ -2236,9 +2239,8 @@ iso8601-duration "^1.3.0" jsonwebtoken "^9.0.0" lodash "^4.17.21" - medusa-core-utils "^1.2.0" - medusa-telemetry "^0.0.17" - medusa-test-utils "^1.1.40" + medusa-core-utils "^1.2.3" + medusa-telemetry "^0.0.18" morgan "^1.9.1" multer "^1.4.5-lts.1" node-schedule "^2.1.1" @@ -2250,7 +2252,6 @@ pg "^8.11.2" qs "^6.11.2" randomatic "^3.1.1" - redis "^3.0.2" reflect-metadata "^0.1.13" regenerator-runtime "^0.13.11" request-ip "^3.3.0" @@ -2258,83 +2259,53 @@ ulid "^2.3.0" uuid "^9.0.0" winston "^3.8.2" + zod "^3.22.4" -"@medusajs/modules-sdk@^1.11.0", "@medusajs/modules-sdk@^1.11.3", "@medusajs/modules-sdk@^1.8.8": - version "1.12.0" - resolved "https://registry.yarnpkg.com/@medusajs/modules-sdk/-/modules-sdk-1.12.0.tgz#26b09d7a0d66f2658577188de8c4d4ac60abc062" - integrity sha512-1RHmgFBSdi0KsPDjiSkKTHkfcCiTPyBmy/Mv+vH+AW9+XZXwVQZ5jqj6iht4I6Ox71K9Doue1Y58wF6hKIUEog== +"@medusajs/modules-sdk@^1.12.12": + version "1.12.12" + resolved "https://registry.yarnpkg.com/@medusajs/modules-sdk/-/modules-sdk-1.12.12.tgz#916529ad4a18724aa0cd95cfc48a57f18adb67f6" + integrity sha512-27Uc75N+pS490BL6/j8BeM4OyEFlSQQWq2UW07p9GEF7GXXdCJRM5p7S/ZcTAZ61pCKpnQBNiS4qOkb/vhnJwg== dependencies: "@graphql-tools/merge" "^9.0.0" "@graphql-tools/schema" "^10.0.0" - "@medusajs/orchestration" "^0.4.1" - "@medusajs/types" "^1.11.3" - "@medusajs/utils" "^1.10.3" + "@medusajs/orchestration" "^0.5.8" + "@medusajs/types" "^1.11.17" + "@medusajs/utils" "^1.11.10" awilix "^8.0.0" + graphql "^16.6.0" knex "2.4.2" pg "^8.11.2" resolve-cwd "^3.0.0" -"@medusajs/orchestration@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@medusajs/orchestration/-/orchestration-0.4.1.tgz#01dfb24859709670338e03e08256b2cf44bba9a8" - integrity sha512-rtg4eNlxcwVQXkNMji12TR6EP4aMSxUlxZvpfZcji7hx6T5cW0lrqlWbdjX9dQAeP0UsF2sGLnODmWEL9hGdbA== +"@medusajs/orchestration@^0.5.8": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@medusajs/orchestration/-/orchestration-0.5.8.tgz#f9e0e74c38945988031d4f4a02b0a2d545d9be3f" + integrity sha512-jCBo6rbfQ6rQCKMarK5K+Lc/Dgq0Ddzqs5FIpFklHTd34gvsjtSAt0W+V9x9P9xwrDN0gNEoGXwTSXihNqrJVQ== dependencies: - "@medusajs/types" "^1.11.2" - "@medusajs/utils" "^1.10.2" + "@medusajs/types" "^1.11.17" + "@medusajs/utils" "^1.11.10" awilix "^8.0.0" graphql "^16.6.0" -"@medusajs/types@^1.11.1", "@medusajs/types@^1.11.2", "@medusajs/types@^1.11.3": - version "1.11.3" - resolved "https://registry.yarnpkg.com/@medusajs/types/-/types-1.11.3.tgz#392bd5053eb6c31e2692b252cea3f6a189d99872" - integrity sha512-kMk5TfJyIdQjR4I8qXYdn5fJlnRNaU5e4F5LZ0XptVT0Kh7S4iKrxJ6iLHKzw5nnUSuQ+na6VPKTSVG+Pt0Q7A== +"@medusajs/types@^1.11.17": + version "1.11.17" + resolved "https://registry.yarnpkg.com/@medusajs/types/-/types-1.11.17.tgz#e78104bdb44fd8b957bd9aa88e2eb294299f1bfe" + integrity sha512-EKrG1aU0b6es1KlKhCSU2ptwJuHVB0EEiHd35IaIcDyx8ZVjIMscpDOhCSl5efAiRlr3I5kqWIbdSakDIF2Smw== -"@medusajs/ui-preset@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@medusajs/ui-preset/-/ui-preset-1.0.2.tgz#91bd354ca7530c374af2ae909ef0583e42bdaf85" - integrity sha512-Z+VUZ/VbRAkAvXT4NAMO/saSouqa5BCr/SFkw/a/LdNkl3FY70nQZQ1B1fpY2BuaunmmzCON92tcjxGMXhJEHg== +"@medusajs/ui-preset@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@medusajs/ui-preset/-/ui-preset-1.1.4.tgz#ab3592f64184c18284e92e0e0170d5f21ae856a6" + integrity sha512-/09W6jLyWu24K7kvVpMwhp0K7iQ+Y8j5D2+ZL7vdX1d1/leDBQ3jQP2mZLWmcJIPlqBxvUVkiqWPUz8w05aZ9g== dependencies: "@tailwindcss/forms" "^0.5.3" tailwindcss-animate "^1.0.6" -"@medusajs/ui@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@medusajs/ui/-/ui-1.0.0.tgz#a599c0db99a2ba075fabab8341bc6ad53e3f6fc5" - integrity sha512-CQuepcgK3aD+6dUgqrOf/Flz44kd2+36ZBPwxTJ23pdtbovyd0LZ3Az6SAEH4+MVTI8KrwBuGo5spMb5vN8SfA== - dependencies: - "@medusajs/icons" "*" - "@radix-ui/react-alert-dialog" "^1.0.4" - "@radix-ui/react-avatar" "^1.0.3" - "@radix-ui/react-checkbox" "^1.0.4" - "@radix-ui/react-dialog" "^1.0.4" - "@radix-ui/react-dropdown-menu" "^2.0.5" - "@radix-ui/react-label" "^2.0.2" - "@radix-ui/react-popover" "^1.0.6" - "@radix-ui/react-radio-group" "^1.1.3" - "@radix-ui/react-scroll-area" "^1.0.4" - "@radix-ui/react-select" "^1.2.2" - "@radix-ui/react-slot" "^1.0.2" - "@radix-ui/react-switch" "^1.0.3" - "@radix-ui/react-toast" "^1.1.4" - "@radix-ui/react-tooltip" "^1.0.6" - "@react-aria/datepicker" "^3.5.0" - "@react-stately/datepicker" "^3.5.0" - class-variance-authority "^0.6.1" - clsx "^1.2.1" - copy-to-clipboard "^3.3.3" - date-fns "^2.30.0" - downshift "^8.1.0" - lodash "^4.17.21" - prism-react-renderer "^2.0.6" - react-day-picker "^8.8.0" - tailwind-merge "^1.13.2" - -"@medusajs/ui@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@medusajs/ui/-/ui-2.2.0.tgz#7f167300ac7969c234fab717b5a6dacdf92e27ae" - integrity sha512-T2VdLrIQSaa2+DCWaN0sc55WS+TnQv5En2JbLVoAsbABXerYMu81uQeWtVHX5p1ojloSFtCz+cdWxMLK7uJb+Q== +"@medusajs/ui@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@medusajs/ui/-/ui-3.0.1.tgz#1e5fa88975dc58bc06aa048711efad697215512c" + integrity sha512-L+zcJGU6Epy+7cNWJi595r/GvwIwGuEnxn/Bk6FLqH+rl64zMawiUjjX9UbuUcPJbBbGTg2i5UJfuPZ+oIR8Lw== dependencies: - "@medusajs/icons" "*" + "@medusajs/icons" "^1.2.2" "@radix-ui/react-accordion" "^1.1.2" "@radix-ui/react-alert-dialog" "^1.0.4" "@radix-ui/react-avatar" "^1.0.3" @@ -2350,82 +2321,84 @@ "@radix-ui/react-slot" "^1.0.2" "@radix-ui/react-switch" "^1.0.3" "@radix-ui/react-tabs" "^1.0.4" - "@radix-ui/react-toast" "^1.1.4" "@radix-ui/react-tooltip" "^1.0.6" "@react-aria/datepicker" "^3.5.0" "@react-stately/datepicker" "^3.5.0" - class-variance-authority "^0.6.1" clsx "^1.2.1" copy-to-clipboard "^3.3.3" + cva "1.0.0-beta.1" date-fns "^2.30.0" prism-react-renderer "^2.0.6" + prismjs "^1.29.0" react-currency-input-field "^3.6.11" react-day-picker "^8.8.0" - tailwind-merge "^1.13.2" - -"@medusajs/utils@^1.10.0", "@medusajs/utils@^1.10.1", "@medusajs/utils@^1.10.2", "@medusajs/utils@^1.10.3", "@medusajs/utils@^1.9.2": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@medusajs/utils/-/utils-1.10.3.tgz#ccbb2bc6fdc4b3e2757e0d1522fd90c97295b939" - integrity sha512-x8AJ8wp1osnixsTBwI2ydogKa1pXzjuYnpYwRa2shQ4gWSNzA6jQGHnVZA0IFDhSBjcI/ewsfZXQkkLm1AiGbg== - dependencies: - "@medusajs/types" "^1.11.3" - "@mikro-orm/core" "5.7.12" - "@mikro-orm/migrations" "5.7.12" - "@mikro-orm/postgresql" "5.7.12" + sonner "^1.4.41" + tailwind-merge "^2.2.1" + +"@medusajs/utils@^1.11.10": + version "1.11.11" + resolved "https://registry.yarnpkg.com/@medusajs/utils/-/utils-1.11.11.tgz#1a9e6417f6dbeb04532e5f8d5dfb0ca24489a2ce" + integrity sha512-r4u1Ctgwt0LftnAHggTfU7RgNppdwY6DfQaefxSrPRSCBMniU6p7j9Lv1G7DkTXZd79V9UNJuixqtlFezGC1tA== + dependencies: + "@medusajs/types" "^1.11.17" + "@mikro-orm/core" "5.9.7" + "@mikro-orm/migrations" "5.9.7" + "@mikro-orm/postgresql" "5.9.7" awilix "^8.0.1" + bignumber.js "^9.1.2" knex "2.4.2" ulid "^2.3.0" -"@medusajs/workflows@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@medusajs/workflows/-/workflows-0.2.3.tgz#352a2f84c5ff6b515bbddefc3e33937c52f43068" - integrity sha512-KcYqrOayDdwvojI9dDf39f/7YS55w627X1izoXbfrjjbHlJaFHBGzX6YYPsoC8k0q6IQiOaTpCmMBvgydHTuqg== +"@medusajs/workflows-sdk@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@medusajs/workflows-sdk/-/workflows-sdk-0.1.8.tgz#ff3e19c4295236fe875a4e480a0bb42f0315b3fb" + integrity sha512-w6TzVxX1TIIsdQA6oodPsgpV6CCeI9O09zhuARU9O7uSqJWubQ2HIZkb6gkXHyrnHNUptfrSRNienS4Ktt05fw== dependencies: - "@medusajs/modules-sdk" "^1.11.3" - "@medusajs/orchestration" "^0.4.1" - "@medusajs/utils" "^1.10.2" + "@medusajs/modules-sdk" "^1.12.12" + "@medusajs/orchestration" "^0.5.8" + "@medusajs/utils" "^1.11.10" awilix "^8.0.1" ulid "^2.3.0" -"@mikro-orm/core@5.7.12": - version "5.7.12" - resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-5.7.12.tgz#245a307faa781c38ea0b0d3f0e28c453c3d7bbaa" - integrity sha512-bd9M4zCzdUGjM2uDGVZmo2ENqa/slzSxOk4knS/LUeAVGgLizidRIT9A41lObILCT1giaVV70n1PhxNSrHe8sA== +"@mikro-orm/core@5.9.7": + version "5.9.7" + resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-5.9.7.tgz#fe35c8790c49684833fc77b3328384781a08e701" + integrity sha512-VzbpJPQlwuK6Q/4FkppWNGKvzyYL31Gsw/qskr/GCa/010yLO8u3RQio/Q1EKRi+tNsjhqTPGA1b7OOM+DvpiQ== dependencies: acorn-loose "8.3.0" acorn-walk "8.2.0" - dotenv "16.1.4" + dotenv "16.3.1" fs-extra "11.1.1" globby "11.1.0" - mikro-orm "~5.7.12" + mikro-orm "5.9.7" reflect-metadata "0.1.13" -"@mikro-orm/knex@~5.7.12": - version "5.7.14" - resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-5.7.14.tgz#906a846cee1a06930f59eccef743b7e66989449e" - integrity sha512-dLw80JiOfQ6YBtKXI3j0C31lYfbWlytZUpXFM4tEKlMbAMmSbPqDgZpiF3luxBKTg3JpsnGSK0urBOxL1c/m+g== +"@mikro-orm/knex@5.9.7": + version "5.9.7" + resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-5.9.7.tgz#41a5f0cc04f9b4da4d61dabaadb45d18c0c44334" + integrity sha512-LmyoXPXrEtTJ4/D/2/ppWMjRxIHwyk/E/2SNz28/fmN+nK9of6Sqa0ql6M0WJRNxYOxLiVOGZWy1fGJAGW3lCg== dependencies: fs-extra "11.1.1" knex "2.5.1" sqlstring "2.3.3" -"@mikro-orm/migrations@5.7.12": - version "5.7.12" - resolved "https://registry.yarnpkg.com/@mikro-orm/migrations/-/migrations-5.7.12.tgz#2368074f4b5a20031eb3cb37ef22eeda9a8029be" - integrity sha512-hUKUMKw01KpCKEoLMSbqLpztymE8Gk95+/nO7ThO5PTkNzH5eqLt00Zy9KlFgDEi85mOkyGnKbthzZMHPSLxSg== +"@mikro-orm/migrations@5.9.7": + version "5.9.7" + resolved "https://registry.yarnpkg.com/@mikro-orm/migrations/-/migrations-5.9.7.tgz#d0ca7d7c2a8b14438991933a0feaadc54dbf4f99" + integrity sha512-5CFVIwmGMxN7p7Rs3KRQmYlDVy47DN2MJQqtDOSVG9ww0xzOP0suCLDA/yRG1uFcPnTn/Ru6lwAH6nllqV75FQ== dependencies: - "@mikro-orm/knex" "~5.7.12" + "@mikro-orm/knex" "5.9.7" fs-extra "11.1.1" - knex "2.4.2" - umzug "3.2.1" + knex "2.5.1" + umzug "3.3.1" -"@mikro-orm/postgresql@5.7.12": - version "5.7.12" - resolved "https://registry.yarnpkg.com/@mikro-orm/postgresql/-/postgresql-5.7.12.tgz#f5d8100673af6dc4f02df0d8490fba50bc9c417d" - integrity sha512-JF89Yf3D/nyA45TzXxclajaDrHXFB/ad3edkF0BA5+sFKsj6it18P/wq0HEk/rhqsHLTlxcmyG0/F+AO3HOPow== +"@mikro-orm/postgresql@5.9.7": + version "5.9.7" + resolved "https://registry.yarnpkg.com/@mikro-orm/postgresql/-/postgresql-5.9.7.tgz#875f99f33e911460b727cbe81c9f62ca29ccc027" + integrity sha512-GbWWR/1QWjqTx10I4bjvMQjSN1SDVgNcQYm0kiY54sGvRxOqam55aiwA3Hb9Jp4myyKufKfDjAU0lCFmlpTWyQ== dependencies: - "@mikro-orm/knex" "~5.7.12" - pg "8.11.0" + "@mikro-orm/knex" "5.9.7" + pg "8.11.3" "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2": version "3.0.2" @@ -2770,18 +2743,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dismissable-layer@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz#883a48f5f938fa679427aa17fcba70c5494c6978" - integrity sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-escape-keydown" "1.0.3" - "@radix-ui/react-dismissable-layer@1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" @@ -2815,16 +2776,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-focus-scope@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz#9c2e8d4ed1189a1d419ee61edd5c1828726472f9" - integrity sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-focus-scope@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" @@ -2898,23 +2849,6 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" -"@radix-ui/react-popper@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" - integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== - dependencies: - "@babel/runtime" "^7.13.10" - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - "@radix-ui/react-use-rect" "1.0.1" - "@radix-ui/react-use-size" "1.0.1" - "@radix-ui/rect" "1.0.1" - "@radix-ui/react-popper@1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.3.tgz#24c03f527e7ac348fabf18c89795d85d21b00b42" @@ -2932,14 +2866,6 @@ "@radix-ui/react-use-size" "1.0.1" "@radix-ui/rect" "1.0.1" -"@radix-ui/react-portal@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" - integrity sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-portal@1.0.4", "@radix-ui/react-portal@^1.0.2", "@radix-ui/react-portal@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" @@ -3014,34 +2940,6 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-layout-effect" "1.0.1" -"@radix-ui/react-select@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-1.2.2.tgz#caa981fa0d672cf3c1b2a5240135524e69b32181" - integrity sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/number" "1.0.1" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-collection" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-dismissable-layer" "1.0.4" - "@radix-ui/react-focus-guards" "1.0.1" - "@radix-ui/react-focus-scope" "1.0.3" - "@radix-ui/react-id" "1.0.1" - "@radix-ui/react-popper" "1.1.2" - "@radix-ui/react-portal" "1.0.3" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-slot" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-controllable-state" "1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - "@radix-ui/react-use-previous" "1.0.1" - "@radix-ui/react-visually-hidden" "1.0.3" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.5" - "@radix-ui/react-select@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.0.0.tgz#a3511792a51a7018d6559357323a7f52e0e38887" @@ -3107,25 +3005,6 @@ "@radix-ui/react-roving-focus" "1.0.4" "@radix-ui/react-use-controllable-state" "1.0.1" -"@radix-ui/react-toast@^1.1.4": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toast/-/react-toast-1.1.5.tgz#f5788761c0142a5ae9eb97f0051fd3c48106d9e6" - integrity sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-collection" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-dismissable-layer" "1.0.5" - "@radix-ui/react-portal" "1.0.4" - "@radix-ui/react-presence" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-controllable-state" "1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - "@radix-ui/react-visually-hidden" "1.0.3" - "@radix-ui/react-tooltip@^1.0.3", "@radix-ui/react-tooltip@^1.0.6": version "1.0.7" resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz#8f55070f852e7e7450cc1d9210b793d2e5a7686e" @@ -3413,11 +3292,6 @@ resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.21.0.tgz#1af41fdf7dfbdbd33bbc1210617c43ed0d4ef20c" integrity sha512-wJA2cUF8dP4LkuNUt9Vh2kkfiQb2NLnV2pPXxVnKJZ7d4x2/7VPccN+LYPnH8m0X3+rt50cxWuPKQmjxSsCFOg== -"@remix-run/router@1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.10.0.tgz#e2170dc2049b06e65bbe883adad0e8ddf8291278" - integrity sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw== - "@remix-run/router@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.1.tgz#3bb0b6ddc0a276e8dc1138d08f63035e4e23e8bf" @@ -4152,6 +4026,18 @@ "@stdlib/number-float64-base-to-words" "^0.0.x" "@stdlib/utils-library-manifest" "^0.0.x" +"@stdlib/number-float64-base-normalize@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-normalize/-/number-float64-base-normalize-0.0.8.tgz#981149317bd34921c653ed526376718b961e17e9" + integrity sha512-4P3c7YD0hahCgflxxTWrjR8457o2ViYu32MH/M166Aj6nkPj0ZovYj/X1DdyiYAAMHhVePGGMl0JAL3X141FVQ== + dependencies: + "@stdlib/constants-float64-smallest-normal" "^0.0.x" + "@stdlib/math-base-assert-is-infinite" "^0.0.x" + "@stdlib/math-base-assert-is-nan" "^0.0.x" + "@stdlib/math-base-special-abs" "^0.0.x" + "@stdlib/types" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/number-float64-base-normalize@^0.0.x": version "0.0.9" resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-normalize/-/number-float64-base-normalize-0.0.9.tgz#9e98eda47faa9ffc24bcf8161e587ae7b5f96a39" @@ -4624,6 +4510,13 @@ dependencies: mini-svg-data-uri "^1.2.3" +"@tailwindcss/forms@^0.5.7": + version "0.5.9" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.9.tgz#b495c12575d6eae5865b2cbd9876b26d89f16f61" + integrity sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg== + dependencies: + mini-svg-data-uri "^1.2.3" + "@tanstack/query-core@4.22.0": version "4.22.0" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.22.0.tgz#7a786fcea64e229ed5d4308093dd644cdfaa895e" @@ -4659,26 +4552,6 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - "@types/argparse@1.0.38": version "1.0.38" resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" @@ -4737,20 +4610,6 @@ dependencies: "@types/node" "*" -"@types/bson@*": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.0.tgz#a2f71e933ff54b2c3bf267b67fa221e295a33337" - integrity sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg== - dependencies: - bson "*" - -"@types/bson@1.x || 4.0.x": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.5.tgz#9e0e1d1a6f8866483f96868a9b33bc804926b1fc" - integrity sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg== - dependencies: - "@types/node" "*" - "@types/connect-history-api-fallback@^1.3.5": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" @@ -4873,20 +4732,17 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.3.tgz#886674659ce55fe7c6c06ec5ca7c0eb276a08f91" integrity sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ== +"@types/mime@1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + "@types/mime@^1": version "1.3.4" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== -"@types/mongodb@^3.5.27": - version "3.6.20" - resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.20.tgz#b7c5c580644f6364002b649af1c06c3c0454e1d2" - integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== - dependencies: - "@types/bson" "*" - "@types/node" "*" - -"@types/node@*", "@types/node@>=8.1.0": +"@types/node@*": version "20.8.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== @@ -4996,14 +4852,14 @@ integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== "@types/triple-beam@^1.3.2": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.4.tgz#a1d5f480245db86e2f4777000065d4fe7467a012" - integrity sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== -"@types/validator@^13.7.10": - version "13.11.5" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.5.tgz#1911964fd5556b08d3479d1ded977c06f89a44a7" - integrity sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q== +"@types/validator@^13.11.8": + version "13.12.2" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.12.2.tgz#760329e756e18a4aab82fc502b51ebdfebbe49f5" + integrity sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA== "@types/ws@^8.5.1": version "8.5.8" @@ -5155,7 +5011,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: +abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -5193,31 +5049,22 @@ acorn-loose@8.3.0: dependencies: acorn "^8.5.0" -acorn-node@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@8.2.0, acorn-walk@^8.1.1: +acorn-walk@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn-walk@^7.0.0, acorn-walk@^7.1.1: +acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.0.0, acorn@^7.1.1: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -5349,11 +5196,6 @@ append-field@^1.0.0: resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -5404,9 +5246,9 @@ astral-regex@^1.0.0: integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -5418,7 +5260,7 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.13, autoprefixer@^10.4.14: +autoprefixer@^10.4.14: version "10.4.16" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== @@ -5430,6 +5272,18 @@ autoprefixer@^10.4.13, autoprefixer@^10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@^10.4.19: + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== + dependencies: + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.1" + postcss-value-parser "^4.2.0" + awilix@^8.0.0, awilix@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/awilix/-/awilix-8.0.1.tgz#4f4704038cc5df3f8f2b9254031af79d4d3708bb" @@ -5439,9 +5293,9 @@ awilix@^8.0.0, awilix@^8.0.1: fast-glob "^3.2.12" axios-retry@^3.1.9: - version "3.8.0" - resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.8.0.tgz#a174af633ef143a9f5642b9e4afe65c2017936b5" - integrity sha512-CfIsQyWNc5/AE7x/UEReRUadiBmQeoBpSEC+4QyGLJMswTsP1tz0GW2YYPnE7w9+ESMef5zOgLDFpHynNyEZ1w== + version "3.9.1" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.9.1.tgz#c8924a8781c8e0a2c5244abf773deb7566b3830d" + integrity sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w== dependencies: "@babel/runtime" "^7.15.4" is-retry-allowed "^2.2.0" @@ -5561,7 +5415,7 @@ babel-preset-jest@^27.5.1: babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" -babel-preset-medusa-package@^1.1.13: +babel-preset-medusa-package@^1.1.19: version "1.1.19" resolved "https://registry.yarnpkg.com/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.19.tgz#6b761cdf16bae007aa779610951c64627bfefcb7" integrity sha512-UZemPhNkoLhO4bVLi2QddqD28o4q7hFHHJcbgL68XENS66KchjBXeo5Fng63KALJv+RRe5rqoyY+J/JPdHLGbw== @@ -5609,19 +5463,16 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" - integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -5631,11 +5482,6 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -5654,6 +5500,24 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + body-parser@^1.19.0: version "1.20.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" @@ -5709,13 +5573,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -5738,6 +5595,16 @@ browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@ node-releases "^2.0.13" update-browserslist-db "^1.0.13" +browserslist@^4.23.3: + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== + dependencies: + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -5752,16 +5619,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -bson@*: - version "6.2.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.2.0.tgz#4b6acafc266ba18eeee111373c2699304a9ba0a3" - integrity sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q== - -bson@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" - integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== - buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -5798,17 +5655,16 @@ builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -bullmq@^3.5.6: - version "3.15.8" - resolved "https://registry.yarnpkg.com/bullmq/-/bullmq-3.15.8.tgz#e8ec5b46b0b7d7ce57e509280d03745109411e05" - integrity sha512-k3uimHGhl5svqD7SEak+iI6c5DxeLOaOXzCufI9Ic0ST3nJr69v71TGR4cXCTXdgCff3tLec5HgoBnfyWjgn5A== +bullmq@^5.4.2: + version "5.13.2" + resolved "https://registry.yarnpkg.com/bullmq/-/bullmq-5.13.2.tgz#33af1f9ce42e819cb522bf7aed86dc2fe8ea5c11" + integrity sha512-McGE8k3mrCvdUHdU0sHkTKDS1xr4pff+hbEKBY51wk5S6Za0gkuejYA620VQTo3Zz37E/NVWMgumwiXPQ3yZcA== dependencies: cron-parser "^4.6.0" - glob "^8.0.3" - ioredis "^5.3.2" - lodash "^4.17.21" - msgpackr "^1.6.2" - semver "^7.3.7" + ioredis "^5.4.1" + msgpackr "^1.10.1" + node-abort-controller "^3.1.1" + semver "^7.5.4" tslib "^2.0.0" uuid "^9.0.0" @@ -5837,6 +5693,17 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5870,6 +5737,11 @@ caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz#1f2cfa8820bd97c971a57349d7fd8f6e08664a3e" integrity sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg== +caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== + cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -5946,20 +5818,13 @@ class-transformer@^0.5.1: integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== class-validator@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.0.tgz#40ed0ecf3c83b2a8a6a320f4edb607be0f0df159" - integrity sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A== - dependencies: - "@types/validator" "^13.7.10" - libphonenumber-js "^1.10.14" - validator "^13.7.0" - -class-variance-authority@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.6.1.tgz#9482856c1496d33c21ef19e65b5d255460aa8039" - integrity sha512-eurOEGc7YVx3majOrOb099PNKgO3KnKSApOprXI4BTq6bcfbqbQXPN2u+rPPmIJ2di23bMwhk0SxCCthBmszEQ== + version "0.14.1" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.1.tgz#ff2411ed8134e9d76acfeb14872884448be98110" + integrity sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ== dependencies: - clsx "1.2.1" + "@types/validator" "^13.11.8" + libphonenumber-js "^1.10.53" + validator "^13.9.0" classnames@^2.2.6, classnames@^2.3.1: version "2.3.2" @@ -6012,9 +5877,9 @@ cli-progress@^3.4.0: string-width "^4.2.3" cli-spinners@^2.5.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" - integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-ux@^5.4.9: version "5.6.7" @@ -6085,7 +5950,12 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@1.2.1, clsx@^1.1.1, clsx@^1.2.1: +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +clsx@^1.1.1, clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -6124,7 +5994,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -6185,7 +6055,7 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: +commander@^4.0.0, commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== @@ -6235,11 +6105,6 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" -compute-scroll-into-view@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" - integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -6317,21 +6182,26 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - cookie@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" @@ -6368,7 +6238,12 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA== -core-js@^3.6.5, core-js@^3.7.0: +core-js@^3.6.5: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.1.tgz#aa375b79a286a670388a1a363363d53677c0383e" + integrity sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw== + +core-js@^3.7.0: version "3.33.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== @@ -6426,11 +6301,6 @@ create-react-class@^15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cron-parser@^4.2.0, cron-parser@^4.6.0: version "4.9.0" resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" @@ -6606,6 +6476,13 @@ csstype@^3.0.10, csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +cva@1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/cva/-/cva-1.0.0-beta.1.tgz#ad5ad2cc744ccf50d6b70f72645a60f9dfd86e8c" + integrity sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w== + dependencies: + clsx "2.0.0" + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -6629,13 +6506,6 @@ debug@2.6.9, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -6687,26 +6557,25 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -defined@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -denque@^1.4.1, denque@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" - integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== - denque@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" @@ -6750,15 +6619,6 @@ detect-port-alt@^1.1.6: address "^1.0.1" debug "^2.6.0" -detective@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" - integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== - dependencies: - acorn-node "^1.8.2" - defined "^1.0.0" - minimist "^1.2.6" - didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -6769,11 +6629,6 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -6911,31 +6766,15 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dotenv@16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" - integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== - -dotenv@16.1.4: - version "16.1.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.1.4.tgz#67ac1a10cd9c25f5ba604e4e08bc77c0ebe0ca8c" - integrity sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw== - dotenv@16.3.1, dotenv@^16.0.3: version "16.3.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== -downshift@^8.1.0: - version "8.2.2" - resolved "https://registry.yarnpkg.com/downshift/-/downshift-8.2.2.tgz#bc4bf0024ad9b70bf2c493b58cca9c652fb1d555" - integrity sha512-UmJHlNTzmFN3i427Hh9f1OXMnkhgSB/J+urC9ywabvwuftm0nB0/Utsb89OtDq+2UqyScQV4Ro7EM2PEV80N5w== - dependencies: - "@babel/runtime" "^7.22.15" - compute-scroll-into-view "^3.0.3" - prop-types "^15.8.1" - react-is "^18.2.0" - tslib "^2.6.2" +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== dset@^3.1.1, dset@^3.1.2: version "3.1.2" @@ -6964,10 +6803,15 @@ electron-to-chromium@^1.4.535: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz#050483c22c5eb2345017a8976a67b060559a33f4" integrity sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug== -emittery@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.12.1.tgz#cb9a4a18745816f7a1fa03a8953e7eaededb45f2" - integrity sha512-pYyW59MIZo0HxPFf+Vb3+gacUu0gxVS3TZwB2ClwkEZywgF9f9OJDoVmNLojTn0vKX3tO9LC+pdQEcLP4Oz/bQ== +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== + +emittery@^0.13.0: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emittery@^0.8.1: version "0.8.1" @@ -7006,6 +6850,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -7045,6 +6894,18 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-module-lexer@^1.0.5, es-module-lexer@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" @@ -7083,6 +6944,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -7276,12 +7142,12 @@ expect@^27.5.1: jest-message-util "^27.5.1" express-session@^1.17.3: - version "1.17.3" - resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.3.tgz#14b997a15ed43e5949cb1d073725675dd2777f36" - integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== + version "1.18.0" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.18.0.tgz#a6ae39d9091f2efba5f20fc5c65a3ce7c9ce16a3" + integrity sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ== dependencies: - cookie "0.4.2" - cookie-signature "1.0.6" + cookie "0.6.0" + cookie-signature "1.0.7" debug "2.6.9" depd "~2.0.0" on-headers "~1.0.2" @@ -7289,7 +7155,7 @@ express-session@^1.17.3: safe-buffer "5.2.1" uid-safe "~2.1.5" -express@4.18.2, express@^4.17.1, express@^4.17.2, express@^4.17.3, express@^4.18.2: +express@4.18.2, express@^4.17.2, express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -7326,6 +7192,43 @@ express@4.18.2, express@^4.17.1, express@^4.17.2, express@^4.17.3, express@^4.18 utils-merge "1.0.1" vary "~1.1.2" +express@^4.18.2: + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -7463,6 +7366,19 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -7510,11 +7426,16 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.4: +follow-redirects@^1.0.0, follow-redirects@^1.14.4: version "1.15.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.14.0: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" @@ -7548,7 +7469,7 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.3.6: +fraction.js@^4.3.6, fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== @@ -7618,14 +7539,6 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-jetpack@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-4.3.1.tgz#cdfd4b64e6bfdec7c7dc55c76b39efaa7853bb20" - integrity sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ== - dependencies: - minimatch "^3.0.2" - rimraf "^2.6.3" - fs-monkey@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" @@ -7646,7 +7559,7 @@ fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: +function-bind@^1.1.1, function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== @@ -7676,6 +7589,17 @@ get-intrinsic@^1.0.2: has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -7715,7 +7639,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^10.3.10, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^8.0.3, glob@^8.1.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7727,17 +7651,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3, glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -7802,6 +7715,13 @@ goober@^2.1.10: resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.13.tgz#e3c06d5578486212a76c9eba860cbc3232ff6d7c" integrity sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -7834,6 +7754,13 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" @@ -7849,6 +7776,13 @@ has@^1.0.3: resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -8057,7 +7991,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -8211,7 +8145,7 @@ ioredis-mock@8.4.0: fengari-interop "^0.1.3" semver "^7.3.8" -ioredis@^5.2.5, ioredis@^5.3.1, ioredis@^5.3.2: +ioredis@^5.2.5, ioredis@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== @@ -8226,6 +8160,21 @@ ioredis@^5.2.5, ioredis@^5.3.1, ioredis@^5.3.2: redis-parser "^3.0.0" standard-as-callback "^2.1.0" +ioredis@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.4.1.tgz#1c56b70b759f01465913887375ed809134296f40" + integrity sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA== + dependencies: + "@ioredis/commands" "^1.1.1" + cluster-key-slot "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" + lodash.defaults "^4.2.0" + lodash.isarguments "^3.1.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -8884,6 +8833,11 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== +jiti@^1.21.0: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + joycon@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -9036,11 +8990,6 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -kareem@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93" - integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ== - kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -9117,16 +9066,21 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libphonenumber-js@^1.10.14: - version "1.10.48" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.48.tgz#3c426b4aa21dfe3210bfbda47d208acffa3631bf" - integrity sha512-Vvcgt4+o8+puIBJZLdMshPYx9nRN3/kTT7HPtOyfYrSQuN9PGBF1KUv0g07fjNzt4E4GuA7FnsLb+WeAMzyRQg== +libphonenumber-js@^1.10.53: + version "1.11.9" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.9.tgz#e653042b11da2b50b7ea3b206fa7ca998436ae99" + integrity sha512-Zs5wf5HaWzW2/inlupe2tstl0I/Tbqo7lH20ZLr6Is58u7Dz2n+gRFGNlj9/gWxFvNfp9+YyDsiegjNhdixB9A== -lilconfig@^2.0.5, lilconfig@^2.0.6: +lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +lilconfig@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -9246,10 +9200,10 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== dependencies: "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" @@ -9325,7 +9279,7 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@1.x, make-error@^1.1.1: +make-error@1.x: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -9371,53 +9325,29 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -medusa-core-utils@1.2.0, medusa-core-utils@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-1.2.0.tgz#4a2aa9fd63dacda487b220c8e462540990605092" - integrity sha512-9mzXGkMsll92C46Ub8A9vwjcfFiHfdkgshwmPP9QpRrm02M6N+SQb45S2A9t0dKjyT9J7rgCCSrFhYQg3pvqbw== - -medusa-fulfillment-manual@^1.1.38: - version "1.1.38" - resolved "https://registry.yarnpkg.com/medusa-fulfillment-manual/-/medusa-fulfillment-manual-1.1.38.tgz#3038aa897504837a8e42717970e05b64a6289771" - integrity sha512-k72UWAK0wklFPMZBVFB4gRJEf/N7aLwOwDVzCYOIUvB3PeGnUGhtDz5hEJjfwsr63KsqqhMiAv9hzD+lKJ4s4g== - dependencies: - "@babel/plugin-transform-classes" "^7.9.5" - "@babel/plugin-transform-instanceof" "^7.8.3" - "@babel/runtime" "^7.7.6" - express "^4.17.1" - medusa-core-utils "^1.2.0" - -medusa-interfaces@^1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-1.3.7.tgz#57f561f03380100f76e506474abae66714162773" - integrity sha512-vU1PjepGeglUmEqoBY72gx5Pfj5Uv3VCO3oqYpj6hSz55jhy4xnUNhf4Ttw1mhqGmwtyi9UkHx+aTuCcYx24Ww== - -medusa-payment-manual@^1.0.24: - version "1.0.24" - resolved "https://registry.yarnpkg.com/medusa-payment-manual/-/medusa-payment-manual-1.0.24.tgz#4836998d51e4b2be4d0ba7acf3016b35c0f85437" - integrity sha512-VcQJuuE86J+ePPmZPVp0961Gkjfvu9v/xII9jM5uOH2CsuMsLI3G8QOjDBxn+kiy+hiQFXD1ZoWDDuuFY/Wt8A== - -medusa-payment-stripe@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/medusa-payment-stripe/-/medusa-payment-stripe-6.0.5.tgz#f4ac99dc4a491d6f8bca9d204846a437d18feecb" - integrity sha512-9lzvrgOaGJJ12cexaEwBgmz3/+c21ADolmpg89XvCjLWYEWfMl7GPvb7bPI6z+t7ZZM094eg+976nJ8Ofqqi0g== +medusa-core-utils@1.2.3, medusa-core-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-1.2.3.tgz#d6f327c771868122721c470d2f5be3551bdf6f6e" + integrity sha512-mNUqWh8G7BF9dcxt3t22GtSJrm4pfpU98QzvNgpqAvirVbBI4lOCpDQGoKE+jMHOLQJHrLQFoSJeqcofDJvEgA== dependencies: - body-parser "^1.19.0" - express "^4.17.1" - medusa-core-utils "^1.2.0" - stripe "^11.10.0" + awilix "^8.0.0" + +medusa-interfaces@1.3.10: + version "1.3.10" + resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-1.3.10.tgz#92c41c174becfa303fd6e948e3303063b0fe4d9c" + integrity sha512-S3J8+W/Wy5zoJML7P5mxGd9gRJTdMaRdpiPAhMeod8MmZGcTKpLRB1Ms8d2+pNDPhmoHJ69SAKaWRxp1w7eCUg== -medusa-react@*, medusa-react@^9.0.7: - version "9.0.7" - resolved "https://registry.yarnpkg.com/medusa-react/-/medusa-react-9.0.7.tgz#de2dd0d7cb1ba1c3b2e5636c68a3db0b9664ae94" - integrity sha512-/PI9zrV3OCB84CusH5/pHGjxP48gnBjJ94hMwFzETvA6jWTRMK6aZ0YmNM4VbXdAs+YY5N1D82uxwN4i8pwonQ== +medusa-react@^9.0.18: + version "9.0.18" + resolved "https://registry.yarnpkg.com/medusa-react/-/medusa-react-9.0.18.tgz#02b826f5b2720ecfd0334fdd9a49f341970f8ab9" + integrity sha512-3xSw3MuH7OEX6Tz21Tthev2+1Mk/S1nI6qsqgRqUl4prZTcRFgHXq421hPeqd1RoX2h8SO2Ap1/qObc2da3tCg== dependencies: "@medusajs/medusa-js" "*" -medusa-telemetry@^0.0.17: - version "0.0.17" - resolved "https://registry.yarnpkg.com/medusa-telemetry/-/medusa-telemetry-0.0.17.tgz#44e434307d7078491fb0bddb47883e6af7ec0ba2" - integrity sha512-Wwtm7QE1AKME0/uiEPen7lfzE9wnaO7J9Or8ObT8eTUipOqIbYRLEY7SSdGjMRg4NdyrzOJMIIjbcPz+vvsRVw== +medusa-telemetry@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/medusa-telemetry/-/medusa-telemetry-0.0.18.tgz#ef2cc0c514b1ab72c2ddb23cc30b86f1fabfd394" + integrity sha512-WY/cTFoe9+5I8Ly/n614y2XruOUSX3ViL+KznY0xRaQERl/bnx1XAeJMNNnAXTYWaNvdVYwo6ur5qYKai7w/dA== dependencies: "@babel/runtime" "^7.22.10" axios "^0.21.4" @@ -9430,15 +9360,6 @@ medusa-telemetry@^0.0.17: remove-trailing-slash "^0.1.1" uuid "^8.3.2" -medusa-test-utils@^1.1.40: - version "1.1.41" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-1.1.41.tgz#5a66146c61bc549b9e795a0d02d4bb5743b2d262" - integrity sha512-UZNmkkrWfLXjYwUJUwIKxUvkGC5j22IFB5mv1daHDw//C0ehCrFFi2q0bTqkds9vH1VSTUf31Kz0MUiMdXZs/g== - dependencies: - "@babel/plugin-transform-classes" "^7.9.5" - medusa-core-utils "^1.2.0" - randomatic "^3.1.1" - memfs@^3.1.2, memfs@^3.4.3: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" @@ -9456,16 +9377,16 @@ memoize-one@^6.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== -memory-pager@^1.0.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" - integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -9489,10 +9410,10 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -mikro-orm@~5.7.12: - version "5.7.14" - resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-5.7.14.tgz#040f40b4e0c28966469d5ad42d93fdbd91ffc04c" - integrity sha512-izfG8Cz5aYGYhxaNNv1Ozc1LAC/ifIsniwDrTWbxHVJkMlWLKAM8FzJhoZpXZzBissZqeRN9tPdzvBCxwV4G0w== +mikro-orm@5.9.7: + version "5.9.7" + resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-5.9.7.tgz#8fa930c819b03c6811b5c9813d4601a5ea6953be" + integrity sha512-0AxNDxQWk45n5N5g5q/K2tVj1/Narf4h5+1fhFc0uYAp/tOGAGvjmVK43Xy4TisEm/1VpBNOtS7FYKvh14WVOQ== mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" @@ -9540,20 +9461,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -9576,44 +9490,6 @@ moment@^2.29.4: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -mongodb@3.7.4: - version "3.7.4" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.7.4.tgz#119530d826361c3e12ac409b769796d6977037a4" - integrity sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw== - dependencies: - bl "^2.2.1" - bson "^1.1.4" - denque "^1.4.1" - optional-require "^1.1.8" - safe-buffer "^5.1.2" - optionalDependencies: - saslprep "^1.0.0" - -mongoose-legacy-pluralize@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" - integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== - -mongoose@^5.13.14: - version "5.13.20" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.13.20.tgz#247d3b2c6c4c4b71779d07dda0c72e1bd48a7370" - integrity sha512-TjGFa/XnJYt+wLmn8y9ssjyO2OhBMeEBtOHb9iJM16EWu2Du6L1Q6zSiEK2ziyYQM8agb4tumNIQFzqbxId7MA== - dependencies: - "@types/bson" "1.x || 4.0.x" - "@types/mongodb" "^3.5.27" - bson "^1.1.4" - kareem "2.3.2" - mongodb "3.7.4" - mongoose-legacy-pluralize "1.0.2" - mpath "0.8.4" - mquery "3.2.5" - ms "2.1.2" - optional-require "1.0.x" - regexp-clone "1.0.0" - safe-buffer "5.2.1" - sift "13.5.2" - sliced "1.0.1" - morgan@^1.9.1: version "1.10.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" @@ -9625,22 +9501,6 @@ morgan@^1.9.1: on-finished "~2.3.0" on-headers "~1.0.2" -mpath@0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313" - integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g== - -mquery@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.5.tgz#8f2305632e4bb197f68f60c0cffa21aaf4060c51" - integrity sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A== - dependencies: - bluebird "3.5.1" - debug "3.1.0" - regexp-clone "^1.0.0" - safe-buffer "5.1.2" - sliced "1.0.1" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9670,10 +9530,10 @@ msgpackr-extract@^3.0.2: "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2" "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2" -msgpackr@^1.6.2: - version "1.9.9" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.9.9.tgz#ec71e37beb8729280847f683cb0a340eb35ce70f" - integrity sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A== +msgpackr@^1.10.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.0.tgz#8321d52333048cadc749f56385e3231e65337091" + integrity sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw== optionalDependencies: msgpackr-extract "^3.0.2" @@ -9703,7 +9563,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mz@^2.4.0: +mz@^2.4.0, mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== @@ -9717,6 +9577,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -9757,6 +9622,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -9792,6 +9662,11 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + node-schedule@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" @@ -9845,6 +9720,11 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + object-inspect@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.0.tgz#42695d3879e1cd5bda6df5062164d80c996e23e2" @@ -9909,18 +9789,6 @@ open@^8.0.6, open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -optional-require@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.0.3.tgz#275b8e9df1dc6a17ad155369c2422a440f89cb07" - integrity sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA== - -optional-require@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.1.8.tgz#16364d76261b75d964c482b2406cb824d8ec44b7" - integrity sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA== - dependencies: - require-at "^1.0.6" - optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -10145,6 +10013,11 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10160,7 +10033,7 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== -pg-cloudflare@^1.1.0, pg-cloudflare@^1.1.1: +pg-cloudflare@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== @@ -10175,11 +10048,16 @@ pg-connection-string@2.6.1: resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== -pg-connection-string@^2.6.0, pg-connection-string@^2.6.2: +pg-connection-string@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== +pg-connection-string@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37" + integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== + pg-god@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/pg-god/-/pg-god-1.0.12.tgz#beaabef33eb4f359718dc64b1524be8370766801" @@ -10197,16 +10075,26 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.6.0, pg-pool@^3.6.1: +pg-pool@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== +pg-pool@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" + integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== + pg-protocol@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== +pg-protocol@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" + integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== + pg-types@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" @@ -10218,22 +10106,7 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.0.tgz#a37e534e94b57a7ed811e926f23a7c56385f55d9" - integrity sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA== - dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "^2.6.0" - pg-pool "^3.6.0" - pg-protocol "^1.6.0" - pg-types "^2.1.0" - pgpass "1.x" - optionalDependencies: - pg-cloudflare "^1.1.0" - -pg@^8.11.0, pg@^8.11.2, pg@^8.3.0: +pg@8.11.3, pg@^8.11.2: version "8.11.3" resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== @@ -10248,6 +10121,19 @@ pg@^8.11.0, pg@^8.11.2, pg@^8.3.0: optionalDependencies: pg-cloudflare "^1.1.1" +pg@^8.11.0, pg@^8.3.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.0.tgz#e3d245342eb0158112553fcc1890a60720ae2a3d" + integrity sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw== + dependencies: + pg-connection-string "^2.7.0" + pg-pool "^3.7.0" + pg-protocol "^1.7.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + pgpass@1.x: version "1.0.5" resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" @@ -10260,6 +10146,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -10275,7 +10166,7 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4: +pirates@^4.0.1, pirates@^4.0.4: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== @@ -10299,10 +10190,10 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pony-cause@^2.1.2: - version "2.1.10" - resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" - integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== +pony-cause@^2.1.4: + version "2.1.11" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.11.tgz#d69a20aaccdb3bdb8f74dd59e5c68d8e6772e4bd" + integrity sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg== postcss-attribute-case-insensitive@^6.0.2: version "6.0.2" @@ -10416,10 +10307,10 @@ postcss-image-set-function@^5.0.2: dependencies: postcss-value-parser "^4.2.0" -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" @@ -10430,7 +10321,7 @@ postcss-initial@^4.0.1: resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-js@^4.0.0: +postcss-js@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== @@ -10447,13 +10338,13 @@ postcss-lab-function@^5.2.3: "@csstools/css-tokenizer" "^2.1.1" "@csstools/postcss-progressive-custom-properties" "^2.3.0" -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" + lilconfig "^3.0.0" + yaml "^2.3.4" postcss-loader@^7.3.2: version "7.3.3" @@ -10499,12 +10390,12 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== +postcss-nested@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: - postcss-selector-parser "^6.0.10" + postcss-selector-parser "^6.1.1" postcss-nesting@^11.3.0: version "11.3.0" @@ -10627,12 +10518,20 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.13, postcss-select cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.18, postcss@^8.4.21: +postcss@^8.4.21: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -10641,6 +10540,15 @@ postcss@^8.4.18, postcss@^8.4.21: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.23, postcss@^8.4.38: + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.0" + source-map-js "^1.2.1" + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -10698,6 +10606,11 @@ prism-react-renderer@^2.0.4, prism-react-renderer@^2.0.6: "@types/prismjs" "^1.26.0" clsx "^1.2.1" +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -10762,7 +10675,14 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.10.3, qs@^6.11.0, qs@^6.11.2: +qs@6.13.0, qs@^6.11.2: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +qs@^6.10.3: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -10788,11 +10708,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" @@ -11031,11 +10946,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - react-json-tree@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.17.0.tgz#aca02cb8c2d3d944e128763c5d814bafa92511d4" @@ -11111,21 +11021,6 @@ react-router-dom@6.8.0: "@remix-run/router" "1.3.1" react-router "6.8.0" -react-router-dom@^6.16.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.17.0.tgz#ea73f89186546c1cf72b10fcb7356d874321b2ad" - integrity sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ== - dependencies: - "@remix-run/router" "1.10.0" - react-router "6.17.0" - -react-router@6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.17.0.tgz#7b680c4cefbc425b57537eb9c73bedecbdc67c1e" - integrity sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA== - dependencies: - "@remix-run/router" "1.10.0" - react-router@6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.0.tgz#dd61fd1ec44daa2cceaef8e6baa00f99a01a650f" @@ -11197,7 +11092,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5: +readable-stream@^2.0.1, readable-stream@^2.2.2: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -11210,7 +11105,7 @@ readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -11252,11 +11147,6 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -redis-commands@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" - integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== - redis-errors@^1.0.0, redis-errors@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" @@ -11269,16 +11159,6 @@ redis-parser@^3.0.0: dependencies: redis-errors "^1.0.0" -redis@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.2.tgz#766851117e80653d23e0ed536254677ab647638c" - integrity sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw== - dependencies: - denque "^1.5.0" - redis-commands "^1.7.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" - redux@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" @@ -11320,11 +11200,6 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regexp-clone@1.0.0, regexp-clone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" - integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== - regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -11375,11 +11250,6 @@ request-ip@^3.3.0: resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-3.3.0.tgz#863451e8fec03847d44f223e30a5d63e369fa611" integrity sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA== -require-at@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/require-at/-/require-at-1.0.6.tgz#9eb7e3c5e00727f5a4744070a7f560d4de4f6e6a" - integrity sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -11422,7 +11292,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -11461,13 +11331,6 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -11524,28 +11387,21 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -saslprep@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" - integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== - dependencies: - sparse-bitfield "^3.0.3" - saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -11605,7 +11461,7 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -11641,6 +11497,25 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" @@ -11671,11 +11546,33 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -11742,10 +11639,15 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -sift@13.5.2: - version "13.5.2" - resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6" - integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA== +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" @@ -11788,11 +11690,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sliced@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" - integrity sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA== - snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -11810,6 +11707,11 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +sonner@^1.4.41: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.5.0.tgz#af359f817063318415326b33aab54c5d17c747b7" + integrity sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA== + sorted-array-functions@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" @@ -11820,14 +11722,10 @@ source-map-js@^1.0.1, source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" - integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== - dependencies: - abab "^2.0.6" - iconv-lite "^0.6.3" - source-map-js "^1.0.2" +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" @@ -11857,13 +11755,6 @@ spark-md5@^3.0.1: resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== -sparse-bitfield@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" - integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== - dependencies: - memory-pager "^1.0.2" - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -12028,14 +11919,6 @@ strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stripe@^11.10.0: - version "11.18.0" - resolved "https://registry.yarnpkg.com/stripe/-/stripe-11.18.0.tgz#2b99ac712e81a5232f88568327d001960b454465" - integrity sha512-OUA32uhNoSoM6wOodyFbV+3IBCoO140uzdXmBArQ0S88D4EbH91xl2v+Ml1sKalcFKUBadHLeHfU/p9AbsOfGw== - dependencies: - "@types/node" ">=8.1.0" - qs "^6.11.0" - style-loader@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" @@ -12046,6 +11929,19 @@ stylis@4.2.0: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -12122,10 +12018,10 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tailwind-merge@^1.13.2: - version "1.14.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.14.0.tgz#e677f55d864edc6794562c63f5001f45093cdb8b" - integrity sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ== +tailwind-merge@^2.2.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.2.tgz#000f05a703058f9f9f3829c644235f81d4c08a1f" + integrity sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg== tailwindcss-animate@^1.0.6: version "1.0.7" @@ -12137,34 +12033,33 @@ tailwindcss-radix@^2.7.0: resolved "https://registry.yarnpkg.com/tailwindcss-radix/-/tailwindcss-radix-2.8.0.tgz#bac081a3a497cdc30d70f8e7425b795ffde0020a" integrity sha512-1k1UfoIYgVyBl13FKwwoKavjnJ5VEaUClCTAsgz3VLquN4ay/lyaMPzkbqD71sACDs2fRGImytAUlMb4TzOt1A== -tailwindcss@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.2.tgz#705f78cec8f4de2feb52abdb7a8a056e67f2d736" - integrity sha512-c2GtSdqg+harR4QeoTmex0Ngfg8IIHNeLQH5yr2B9uZbZR1Xt1rYbjWOWTcj3YLTZhrmZnPowoQDbSRFyZHQ5Q== +tailwindcss@^3.4.3: + version "3.4.13" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.13.tgz#3d11e5510660f99df4f1bfb2d78434666cb8f831" + integrity sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw== dependencies: + "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" chokidar "^3.5.3" - color-name "^1.1.4" - detective "^5.2.1" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.2.12" + fast-glob "^3.3.0" glob-parent "^6.0.2" is-glob "^4.0.3" - lilconfig "^2.0.6" + jiti "^1.21.0" + lilconfig "^2.1.0" micromatch "^4.0.5" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.18" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" - postcss-selector-parser "^6.0.10" - postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" tapable@^1.0.0: version "1.1.3" @@ -12334,6 +12229,11 @@ ts-dedent@^2.2.0: resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + ts-jest@^27.0.7: version "27.1.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" @@ -12359,35 +12259,21 @@ ts-loader@^9.2.6: semver "^7.3.4" source-map "^0.7.4" -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - tslib@^1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.6.1, tslib@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -12415,12 +12301,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^2.18.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-fest@^3.6.0: +type-fest@^3.0.0, type-fest@^3.6.0: version "3.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== @@ -12445,10 +12326,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typeorm@^0.3.16: - version "0.3.17" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949" - integrity sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig== +typeorm@0.3.16: + version "0.3.16" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.16.tgz#a001d77b36cfaaf9ff495e15805dd17883116b7b" + integrity sha512-wJ4Qy1oqRKNDdZiBTTaVMqwo/XxC52Q7uNPTjltPgLhvIW173bL6Iad0lhptMOsFlpixFPaUu3PNziaRBwX2Zw== dependencies: "@sqltools/formatter" "^1.2.5" app-root-path "^3.1.0" @@ -12488,17 +12369,16 @@ ulid@^2.3.0: resolved "https://registry.yarnpkg.com/ulid/-/ulid-2.3.0.tgz#93063522771a9774121a84d126ecd3eb9804071f" integrity sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw== -umzug@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.2.1.tgz#01c3a109efb037a10a317d4191be22810c37b195" - integrity sha512-XyWQowvP9CKZycKc/Zg9SYWrAWX/gJCE799AUTFqk8yC3tp44K1xWr3LoFF0MNEjClKOo1suCr5ASnoy+KltdA== +umzug@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.3.1.tgz#4ed726e7ec216049d826623a9c4faf66d412eb61" + integrity sha512-jG3C35jti1YnCuH/k3fJEfHbnIG9c3Q9ITZ0B9eWwnXngh/AUd0mRHv8OdpE2Q9VoK7tB6xL990JrMCr0LtfNA== dependencies: "@rushstack/ts-command-line" "^4.12.2" - emittery "^0.12.1" - fs-jetpack "^4.3.1" + emittery "^0.13.0" glob "^8.0.3" - pony-cause "^2.1.2" - type-fest "^2.18.0" + pony-cause "^2.1.4" + type-fest "^3.0.0" undici-types@~5.25.1: version "5.25.3" @@ -12573,6 +12453,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -12638,11 +12526,6 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - v8-compile-cache@^2.0.3: version "2.4.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" @@ -12657,10 +12540,10 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" -validator@^13.7.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" - integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== +validator@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.12.0.tgz#7d78e76ba85504da3fee4fd1922b385914d4b35f" + integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== value-or-promise@^1.0.12: version "1.0.12" @@ -12908,31 +12791,31 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -winston-transport@^4.5.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" - integrity sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg== +winston-transport@^4.7.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.1.tgz#52ff1bcfe452ad89991a0aaff9c3b18e7f392569" + integrity sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA== dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" + logform "^2.6.1" + readable-stream "^3.6.2" triple-beam "^1.3.0" winston@^3.8.2: - version "3.11.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" - integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== + version "3.14.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.14.2.tgz#94ce5fd26d374f563c969d12f0cd9c641065adab" + integrity sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg== dependencies: "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" - logform "^2.4.0" + logform "^2.6.0" one-time "^1.0.0" readable-stream "^3.4.0" safe-stable-stringify "^2.3.1" stack-trace "0.0.x" triple-beam "^1.3.0" - winston-transport "^4.5.0" + winston-transport "^4.7.0" word-wrap@~1.2.3: version "1.2.5" @@ -13004,7 +12887,7 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@^4.0.2: +xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -13029,11 +12912,16 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.3.4: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== + yargs-parser@20.x, yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -13095,11 +12983,6 @@ yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" @@ -13109,3 +12992,8 @@ zod@^3.22.2: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zod@^3.22.4: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 5523b86c59bbdf113aa21cde6991d1296ac62662 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Fri, 27 Sep 2024 11:10:32 -0500 Subject: [PATCH 02/21] chore: replace settings icon --- src/admin/routes/role/page.tsx | 2 ++ .../{UserRoles => user-roles}/page.tsx | 20 +++++++------- src/admin/ui-components/icons/types.ts | 6 +++++ src/admin/ui-components/icons/user-shield.tsx | 27 +++++++++++++++++++ 4 files changed, 46 insertions(+), 9 deletions(-) rename src/admin/settings/{UserRoles => user-roles}/page.tsx (92%) create mode 100644 src/admin/ui-components/icons/types.ts create mode 100644 src/admin/ui-components/icons/user-shield.tsx diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index f15e603e9..9d6d0db0b 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -10,6 +10,7 @@ import { import { useParams } from "react-router-dom"; import { useState } from "react"; import { useAdminCustomQuery, useAdminCustomPost } from "medusa-react"; + const SetPermission = () => { const { "*": id } = useParams(); const [selectedPermissions, setSelectedPermissions] = useState([]); @@ -618,4 +619,5 @@ const SetPermission = () => { ); }; + export default SetPermission; diff --git a/src/admin/settings/UserRoles/page.tsx b/src/admin/settings/user-roles/page.tsx similarity index 92% rename from src/admin/settings/UserRoles/page.tsx rename to src/admin/settings/user-roles/page.tsx index a1c2ac264..c043802f4 100644 --- a/src/admin/settings/UserRoles/page.tsx +++ b/src/admin/settings/user-roles/page.tsx @@ -1,5 +1,5 @@ import type { SettingConfig } from "@medusajs/admin"; -import { Adjustments, PlusMini } from "@medusajs/icons"; +import { PlusMini } from "@medusajs/icons"; import { Container, Text, @@ -16,11 +16,13 @@ import { } from "medusa-react"; import { useState, useEffect } from "react"; import { Link } from "react-router-dom"; +import UserShield from "../../ui-components/icons/user-shield"; + const CustomSettingPage = () => { - // Create New ROle + // Create New Role const [name, setRoleName] = useState(""); const { mutate } = useAdminCustomPost("/roles/create-role", []); - const [mendatory, setMendatory] = useState(""); + const [mandatory, setMandatory] = useState(""); const [drawerOpen, setDrawerOpen] = useState(false); const [refetchFlag, setRefetchFlag] = useState(false); @@ -34,14 +36,14 @@ const CustomSettingPage = () => { const handleRoleNameChange = (e) => { setRoleName(e.target.value); - if (mendatory) { - setMendatory(""); + if (mandatory) { + setMandatory(""); } }; const handleSave = async () => { if (!name) { - setMendatory("Name field is empty"); + setMandatory("Name field is empty"); return; } try { @@ -62,7 +64,7 @@ const CustomSettingPage = () => { }, [refetchFlag]); const handlecancle = () => { setRoleName(""); - setMendatory(""); + setMandatory(""); setDrawerOpen(false); }; // Handle delete roles @@ -124,7 +126,7 @@ const CustomSettingPage = () => { onChange={handleRoleNameChange} /> -
{mendatory}
+
{mandatory}
@@ -183,7 +185,7 @@ export const config: SettingConfig = { card: { label: "Roles & Permissions", description: "Manage User roles and Permission", - icon: Adjustments, + icon: UserShield, }, }; diff --git a/src/admin/ui-components/icons/types.ts b/src/admin/ui-components/icons/types.ts new file mode 100644 index 000000000..66ed68474 --- /dev/null +++ b/src/admin/ui-components/icons/types.ts @@ -0,0 +1,6 @@ +import * as React from "react"; + +export interface IconProps extends React.SVGAttributes { + children?: never; + color?: string; +} diff --git a/src/admin/ui-components/icons/user-shield.tsx b/src/admin/ui-components/icons/user-shield.tsx new file mode 100644 index 000000000..3afb0c8d2 --- /dev/null +++ b/src/admin/ui-components/icons/user-shield.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import { IconProps } from "./types"; + +const UserShield = React.forwardRef( + ({ color = "currentColor", ...props }, ref) => { + return ( + + + + ); + } +); + +UserShield.displayName = "UserShield"; + +export default UserShield; From 1cbc7c5c2e82dad5f01bba05ed9452c4c130b551 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Mon, 30 Sep 2024 15:26:42 -0500 Subject: [PATCH 03/21] chore: add MedusaJS admin UI required components --- src/admin/ui-components/atoms/avatar.tsx | 63 ++++ src/admin/ui-components/atoms/back-button.tsx | 34 +++ src/admin/ui-components/atoms/input-error.tsx | 74 +++++ .../ui-components/atoms/notification.tsx | 65 +++++ src/admin/ui-components/atoms/spinner.tsx | 35 +++ .../ui-components/atoms/toaster-container.tsx | 33 +++ src/admin/ui-components/atoms/tooltip.tsx | 61 ++++ .../ui-components/fundamentals/button.tsx | 79 ++++++ .../fundamentals/input-header.tsx | 39 +++ .../ui-components/hooks/use-notification.tsx | 18 ++ src/admin/ui-components/hooks/use-scroll.ts | 20 ++ .../hooks/use-window-dimensions.ts | 25 ++ .../icons/more-horizontal-icon.tsx | 47 +++ src/admin/ui-components/icons/user-shield.tsx | 6 +- .../ui-components/molecules/actionables.tsx | 118 ++++++++ .../ui-components/molecules/icon-tooltip.tsx | 37 +++ src/admin/ui-components/molecules/input.tsx | 165 +++++++++++ .../ui-components/molecules/modal/index.tsx | 169 +++++++++++ .../molecules/sidebar-team-member.tsx | 28 ++ .../molecules/table/filtering-option.tsx | 97 +++++++ .../ui-components/molecules/table/index.tsx | 268 ++++++++++++++++++ .../molecules/table/table-search.tsx | 47 +++ .../ui-components/organisms/body-card.tsx | 135 +++++++++ .../ui-components/organisms/delete-prompt.tsx | 96 +++++++ .../ui-components/utils/error-messages.ts | 10 + .../ui-components/utils/form-validator.ts | 47 +++ 26 files changed, 1813 insertions(+), 3 deletions(-) create mode 100644 src/admin/ui-components/atoms/avatar.tsx create mode 100644 src/admin/ui-components/atoms/back-button.tsx create mode 100644 src/admin/ui-components/atoms/input-error.tsx create mode 100644 src/admin/ui-components/atoms/notification.tsx create mode 100644 src/admin/ui-components/atoms/spinner.tsx create mode 100644 src/admin/ui-components/atoms/toaster-container.tsx create mode 100644 src/admin/ui-components/atoms/tooltip.tsx create mode 100644 src/admin/ui-components/fundamentals/button.tsx create mode 100644 src/admin/ui-components/fundamentals/input-header.tsx create mode 100644 src/admin/ui-components/hooks/use-notification.tsx create mode 100644 src/admin/ui-components/hooks/use-scroll.ts create mode 100644 src/admin/ui-components/hooks/use-window-dimensions.ts create mode 100644 src/admin/ui-components/icons/more-horizontal-icon.tsx create mode 100644 src/admin/ui-components/molecules/actionables.tsx create mode 100644 src/admin/ui-components/molecules/icon-tooltip.tsx create mode 100644 src/admin/ui-components/molecules/input.tsx create mode 100644 src/admin/ui-components/molecules/modal/index.tsx create mode 100644 src/admin/ui-components/molecules/sidebar-team-member.tsx create mode 100644 src/admin/ui-components/molecules/table/filtering-option.tsx create mode 100644 src/admin/ui-components/molecules/table/index.tsx create mode 100644 src/admin/ui-components/molecules/table/table-search.tsx create mode 100644 src/admin/ui-components/organisms/body-card.tsx create mode 100644 src/admin/ui-components/organisms/delete-prompt.tsx create mode 100644 src/admin/ui-components/utils/error-messages.ts create mode 100644 src/admin/ui-components/utils/form-validator.ts diff --git a/src/admin/ui-components/atoms/avatar.tsx b/src/admin/ui-components/atoms/avatar.tsx new file mode 100644 index 000000000..7ff40863e --- /dev/null +++ b/src/admin/ui-components/atoms/avatar.tsx @@ -0,0 +1,63 @@ +import * as RadixAvatar from "@radix-ui/react-avatar"; +import clsx from "clsx"; +import React from "react"; + +import Spinner from "./spinner"; + +type AvatarProps = { + user?: { + img?: string; + first_name?: string; + last_name?: string; + email?: string; + }; + font?: string; + color?: string; + isLoading?: boolean; +}; + +const Avatar: React.FC = ({ + user, + font = "inter-small-semibold", + color = "bg-grey-80", + isLoading = false, +}) => { + let username: string; + + if (user?.first_name && user?.last_name) { + username = user.first_name + " " + user.last_name; + } else if (user?.email) { + username = user.email; + } else { + username = "Medusa user"; + } + + return ( + + + + {isLoading ? ( + + ) : ( + username.slice(0, 1).toUpperCase() + )} + + + ); +}; + +export default Avatar; diff --git a/src/admin/ui-components/atoms/back-button.tsx b/src/admin/ui-components/atoms/back-button.tsx new file mode 100644 index 000000000..f7a411794 --- /dev/null +++ b/src/admin/ui-components/atoms/back-button.tsx @@ -0,0 +1,34 @@ +import clsx from "clsx"; +import { useNavigate } from "react-router-dom"; +import { useTranslation } from "react-i18next"; + +import { ArrowLeftMini } from "@medusajs/icons"; + +type Props = { + path?: string; + label?: string; + className?: string; +}; + +const BackButton = ({ path, label, className }: Props) => { + const { t } = useTranslation(); + const navigate = useNavigate(); + + return ( + + ); +}; + +export default BackButton; diff --git a/src/admin/ui-components/atoms/input-error.tsx b/src/admin/ui-components/atoms/input-error.tsx new file mode 100644 index 000000000..7f640af71 --- /dev/null +++ b/src/admin/ui-components/atoms/input-error.tsx @@ -0,0 +1,74 @@ +import { ErrorMessage } from "@hookform/error-message"; + +import clsx from "clsx"; +import { MultipleFieldErrors } from "react-hook-form"; + +import Tooltip from "./tooltip"; + +type InputErrorProps = { + errors?: { [x: string]: unknown }; + name?: string; + className?: string; +}; + +const InputError = ({ errors, name, className }: InputErrorProps) => { + if (!errors || !name) { + return null; + } + + return ( + { + return ( +
+ {messages ? ( + + ) : ( +

{message}

+ )} +
+ ); + }} + /> + ); +}; + +const MultipleMessages = ({ messages }: { messages: MultipleFieldErrors }) => { + const errors = Object.entries(messages).map(([_, message]) => message); + + const displayedError = errors[0]; + const remainderErrors = errors.slice(1); + + return ( +
+

{displayedError}

+ {remainderErrors?.length > 0 && ( + + {remainderErrors.map((e, i) => { + return ( +

+ {Array.from(Array(i + 1)).map((_) => "*")} + {e} +

+ ); + })} +
+ } + > +

+ +{remainderErrors.length}{" "} + {remainderErrors.length > 1 ? "errors" : "error"} +

+ + )} + + ); +}; + +export default InputError; diff --git a/src/admin/ui-components/atoms/notification.tsx b/src/admin/ui-components/atoms/notification.tsx new file mode 100644 index 000000000..ff3902bdf --- /dev/null +++ b/src/admin/ui-components/atoms/notification.tsx @@ -0,0 +1,65 @@ +import React from "react"; +import type { Toast } from "react-hot-toast"; +import { toast as globalToast } from "react-hot-toast"; +import { + ExclamationCircle, + CheckCircleSolid, + XMark, + InformationCircle, + XCircle, +} from "@medusajs/icons"; + +import ToasterContainer from "./toaster-container"; + +export type NotificationTypes = "success" | "warning" | "error" | "info"; + +type NotificationProps = { + toast: Toast; + type: NotificationTypes; + title: string; + message: string; +}; + +const Notification: React.FC = ({ + toast, + type, + title, + message, +}) => { + const onDismiss = () => { + globalToast.dismiss(toast.id); + }; + + return ( + +
{getIcon(type)}
+
+ {title} + {message} +
+
+ + Close +
+
+ ); +}; + +const ICON_SIZE = 20; + +function getIcon(type: NotificationTypes) { + switch (type) { + case "success": + return ; + case "warning": + return ; + case "error": + return ; + default: + return ; + } +} + +export default Notification; diff --git a/src/admin/ui-components/atoms/spinner.tsx b/src/admin/ui-components/atoms/spinner.tsx new file mode 100644 index 000000000..441e19a92 --- /dev/null +++ b/src/admin/ui-components/atoms/spinner.tsx @@ -0,0 +1,35 @@ +import clsx from "clsx"; +import React from "react"; + +export type SpinnerProps = { + size?: "large" | "medium" | "small"; + variant?: "primary" | "secondary"; +}; + +const Spinner: React.FC = ({ + size = "large", + variant = "primary", +}) => { + return ( +
+
+
+
+
+ ); +}; + +export default Spinner; diff --git a/src/admin/ui-components/atoms/toaster-container.tsx b/src/admin/ui-components/atoms/toaster-container.tsx new file mode 100644 index 000000000..9121555b9 --- /dev/null +++ b/src/admin/ui-components/atoms/toaster-container.tsx @@ -0,0 +1,33 @@ +import clsx from "clsx"; +import React from "react"; + +type ToasterContainerProps = { + visible: boolean; +} & React.HTMLAttributes; + +const ToasterContainer: React.FC = ({ + children, + visible, + className, + ...rest +}) => { + return ( +
+ {children} +
+ ); +}; + +export default ToasterContainer; diff --git a/src/admin/ui-components/atoms/tooltip.tsx b/src/admin/ui-components/atoms/tooltip.tsx new file mode 100644 index 000000000..240b841e0 --- /dev/null +++ b/src/admin/ui-components/atoms/tooltip.tsx @@ -0,0 +1,61 @@ +import * as RadixTooltip from "@radix-ui/react-tooltip"; + +import React from "react"; +import clsx from "clsx"; + +export type TooltipProps = RadixTooltip.TooltipContentProps & + Pick< + RadixTooltip.TooltipProps, + "open" | "defaultOpen" | "onOpenChange" | "delayDuration" + > & { + content: React.ReactNode; + side?: "bottom" | "left" | "top" | "right"; + onClick?: React.ButtonHTMLAttributes["onClick"]; + maxWidth?: number; + }; + +const Tooltip = ({ + children, + content, + open, + defaultOpen, + onOpenChange, + delayDuration, + maxWidth = 220, + className, + side, + onClick, + ...props +}: TooltipProps) => { + return ( + + + + {children} + + + {content} + + + + ); +}; + +export default Tooltip; diff --git a/src/admin/ui-components/fundamentals/button.tsx b/src/admin/ui-components/fundamentals/button.tsx new file mode 100644 index 000000000..834a65f72 --- /dev/null +++ b/src/admin/ui-components/fundamentals/button.tsx @@ -0,0 +1,79 @@ +import React, { Children } from "react"; +import clsx from "clsx"; + +import Spinner, { SpinnerProps } from "../atoms/spinner"; + +export type ButtonProps = { + variant: "primary" | "secondary" | "ghost" | "danger" | "nuclear"; + size?: "small" | "medium" | "large"; + loading?: boolean; + spanClassName?: string; + spinnerConfig?: SpinnerProps; +} & React.ButtonHTMLAttributes; + +const Button = React.forwardRef( + ( + { + variant = "primary", + size = "large", + loading = false, + spanClassName, + spinnerConfig, + children, + ...attributes + }, + ref + ) => { + const handleClick = (e) => { + if (!loading && attributes.onClick) { + attributes.onClick(e); + } + }; + + const variantClassname = clsx({ + ["btn-primary"]: variant === "primary", + ["btn-secondary"]: variant === "secondary", + ["btn-ghost"]: variant === "ghost", + ["btn-danger"]: variant === "danger", + ["btn-nuclear"]: variant === "nuclear", + }); + + const sizeClassname = clsx({ + ["btn-large"]: size === "large", + ["btn-medium"]: size === "medium", + ["btn-small"]: size === "small", + }); + + return ( + + ); + } +); + +export default Button; diff --git a/src/admin/ui-components/fundamentals/input-header.tsx b/src/admin/ui-components/fundamentals/input-header.tsx new file mode 100644 index 000000000..f11fe1418 --- /dev/null +++ b/src/admin/ui-components/fundamentals/input-header.tsx @@ -0,0 +1,39 @@ +import clsx from "clsx"; +import React from "react"; + +import IconTooltip from "../molecules/icon-tooltip"; + +export type InputHeaderProps = { + label?: string; + required?: boolean; + tooltipContent?: string; + tooltip?: React.ReactNode; + className?: string; +}; + +const InputHeader: React.FC = ({ + label, + required = false, + tooltipContent, + tooltip, + className, +}) => { + return ( +
+ + {required &&
*
} + {tooltip || tooltipContent ? ( +
+ {tooltip || } +
+ ) : null} +
+ ); +}; + +export default InputHeader; diff --git a/src/admin/ui-components/hooks/use-notification.tsx b/src/admin/ui-components/hooks/use-notification.tsx new file mode 100644 index 000000000..d3e58c6b5 --- /dev/null +++ b/src/admin/ui-components/hooks/use-notification.tsx @@ -0,0 +1,18 @@ +import { toast } from "react-hot-toast"; +import Notification, { NotificationTypes } from "../atoms/notification"; + +const useNotification = () => { + return (title: string, message: string, type: NotificationTypes) => { + toast.custom( + (t) => ( + + ), + { + position: "top-right", + duration: 3000, + } + ); + }; +}; + +export default useNotification; diff --git a/src/admin/ui-components/hooks/use-scroll.ts b/src/admin/ui-components/hooks/use-scroll.ts new file mode 100644 index 000000000..428b9fc75 --- /dev/null +++ b/src/admin/ui-components/hooks/use-scroll.ts @@ -0,0 +1,20 @@ +import { useState } from "react"; + +type useScrollProps = { + threshold?: number; +}; + +export const useScroll = ({ threshold = 0 }: useScrollProps) => { + const [isScrolled, setIsScrolled] = useState(false); + + const scrollListener = (e) => { + const currentScrollY = e.target.scrollTop; + if (currentScrollY > threshold) { + setIsScrolled(true); + } else { + setIsScrolled(false); + } + }; + + return { isScrolled, scrollListener }; +}; diff --git a/src/admin/ui-components/hooks/use-window-dimensions.ts b/src/admin/ui-components/hooks/use-window-dimensions.ts new file mode 100644 index 000000000..1a2beb266 --- /dev/null +++ b/src/admin/ui-components/hooks/use-window-dimensions.ts @@ -0,0 +1,25 @@ +import { useEffect, useState } from "react"; + +export const useWindowDimensions = () => { + const [dimensions, setDimensions] = useState({ + height: window.innerHeight, + width: window.innerWidth, + }); + + useEffect(() => { + const handleResize = () => { + setDimensions({ + height: window.innerHeight, + width: window.innerWidth, + }); + }; + + window.addEventListener("resize", handleResize); + + return () => { + window.removeEventListener("resize", handleResize); + }; + }, []); + + return dimensions; +}; diff --git a/src/admin/ui-components/icons/more-horizontal-icon.tsx b/src/admin/ui-components/icons/more-horizontal-icon.tsx new file mode 100644 index 000000000..6484265fb --- /dev/null +++ b/src/admin/ui-components/icons/more-horizontal-icon.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { IconProps } from "./types"; + +const MoreHorizontalIcon = React.forwardRef( + ({ color = "currentColor", ...props }, ref) => { + return ( + + + + + + ); + } +); + +MoreHorizontalIcon.displayName = "MoreHorizontalIcon"; + +export default MoreHorizontalIcon; diff --git a/src/admin/ui-components/icons/user-shield.tsx b/src/admin/ui-components/icons/user-shield.tsx index 3afb0c8d2..4f1d22578 100644 --- a/src/admin/ui-components/icons/user-shield.tsx +++ b/src/admin/ui-components/icons/user-shield.tsx @@ -10,9 +10,9 @@ const UserShield = React.forwardRef( height={24} fill="none" stroke={color} - stroke-linecap="round" - stroke-linejoin="round" - stroke-width="2" + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="2" ref={ref} {...props} > diff --git a/src/admin/ui-components/molecules/actionables.tsx b/src/admin/ui-components/molecules/actionables.tsx new file mode 100644 index 000000000..b3010a362 --- /dev/null +++ b/src/admin/ui-components/molecules/actionables.tsx @@ -0,0 +1,118 @@ +import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; +import clsx from "clsx"; +import React from "react"; + +import Button from "../fundamentals/button"; +import MoreHorizontalIcon from "../icons/more-horizontal-icon"; + +export type ActionType = { + label: string; + onClick: (e: React.MouseEvent) => void; + variant?: "normal" | "danger"; + disabled?: boolean; + icon?: React.ReactNode; +}; + +type ActionablesProps = { + actions?: ActionType[]; + customTrigger?: React.ReactNode; + forceDropdown?: boolean; +}; + +const Actionables: React.FC = ({ + actions, + customTrigger, + forceDropdown = false, +}) => { + if (actions && (forceDropdown || actions.length > 1)) { + return ( +
+ + + {!customTrigger ? ( + + ) : ( + customTrigger + )} + + + + + {actions.map((action, i) => { + return ( + + { + + } + + ); + })} + + + +
+ ); + } + + if (customTrigger) { + const triggers = Array.isArray(customTrigger) + ? customTrigger + : [customTrigger]; + return ( +
+ {triggers.map((trigger, i) => ( +
{trigger}
+ ))} +
+ ); + } + + const [action] = actions ?? []; + if (action) { + return ( +
+ +
+ ); + } + + return null; +}; + +export default Actionables; diff --git a/src/admin/ui-components/molecules/icon-tooltip.tsx b/src/admin/ui-components/molecules/icon-tooltip.tsx new file mode 100644 index 000000000..881fdb5d6 --- /dev/null +++ b/src/admin/ui-components/molecules/icon-tooltip.tsx @@ -0,0 +1,37 @@ +import { ExclamationCircle, XCircle, InformationCircle } from "@medusajs/icons"; +import React from "react"; +import Tooltip, { TooltipProps } from "../atoms/tooltip"; +import { IconProps } from "../icons/types"; + +type IconTooltipProps = TooltipProps & { + type?: "info" | "warning" | "error"; + size?: number; +}; + +const IconTooltip: React.FC = ({ + type = "info", + size = 16, + content, + ...props +}) => { + const icon = (type: IconTooltipProps["type"]) => { + switch (type) { + case "warning": + return ( + + ); + case "error": + return ; + default: + return ; + } + }; + + return ( + + {icon(type)} + + ); +}; + +export default IconTooltip; diff --git a/src/admin/ui-components/molecules/input.tsx b/src/admin/ui-components/molecules/input.tsx new file mode 100644 index 000000000..608793cce --- /dev/null +++ b/src/admin/ui-components/molecules/input.tsx @@ -0,0 +1,165 @@ +import { Minus, Plus } from "@medusajs/icons"; + +import clsx from "clsx"; +import React, { + ChangeEventHandler, + FocusEventHandler, + MouseEventHandler, + useImperativeHandle, + useRef, +} from "react"; + +import InputHeader, { InputHeaderProps } from "../fundamentals/input-header"; +import InputError from "../atoms/input-error"; + +export type InputProps = Omit, "prefix"> & + InputHeaderProps & { + small?: boolean; + label?: string; + deletable?: boolean; + onDelete?: MouseEventHandler; + onChange?: ChangeEventHandler; + onFocus?: FocusEventHandler; + errors?: { [x: string]: unknown }; + prefix?: React.ReactNode; + suffix?: React.ReactNode; + props?: React.HTMLAttributes; + }; + +const InputField = React.forwardRef( + ( + { + small, + placeholder, + label, + name, + required, + deletable, + onDelete, + onChange, + onFocus, + tooltipContent, + tooltip, + prefix, + suffix, + errors, + props, + className, + ...fieldProps + }: InputProps, + ref + ) => { + const inputRef = useRef(null); + + useImperativeHandle( + ref, + () => inputRef.current + ); + + const onNumberIncrement = () => { + inputRef.current?.stepUp(); + if (onChange) { + inputRef.current?.dispatchEvent( + new InputEvent("change", { + view: window, + bubbles: true, + cancelable: false, + }) + ); + } + }; + + const onNumberDecrement = () => { + inputRef.current?.stepDown(); + if (onChange) { + inputRef.current?.dispatchEvent( + new InputEvent("change", { + view: window, + bubbles: true, + cancelable: false, + }) + ); + } + }; + + return ( +
+ {label && ( + + )} +
+ {prefix ? ( + {prefix} + ) : null} + + {suffix ? ( + {suffix} + ) : null} + + {deletable && ( + + )} + + {fieldProps.type === "number" && ( +
+ + +
+ )} +
+ +
+ ); + } +); + +InputField.displayName = "InputField"; + +export default InputField; diff --git a/src/admin/ui-components/molecules/modal/index.tsx b/src/admin/ui-components/molecules/modal/index.tsx new file mode 100644 index 000000000..3fbd1d47b --- /dev/null +++ b/src/admin/ui-components/molecules/modal/index.tsx @@ -0,0 +1,169 @@ +import { XMark } from "@medusajs/icons"; +import * as Dialog from "@radix-ui/react-dialog"; +import * as Portal from "@radix-ui/react-portal"; + +import clsx from "clsx"; +import React from "react"; + +import Button from "../../fundamentals/button"; +import { useWindowDimensions } from "../../hooks/use-window-dimensions"; + +type ModalState = { + portalRef: any; + isLargeModal?: boolean; +}; + +export const ModalContext = React.createContext({ + portalRef: undefined, + isLargeModal: true, +}); + +export type ModalProps = { + isLargeModal?: boolean; + handleClose: () => void; + open?: boolean; + children?: React.ReactNode; +}; + +type ModalChildProps = { + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; +}; + +type ModalHeaderProps = { + handleClose: () => void; + children?: React.ReactNode; +}; + +type ModalType = React.FC & { + Body: React.FC; + Header: React.FC; + Footer: React.FC; + Content: React.FC; +}; + +const Overlay: React.FC = ({ children }) => { + return ( + + {children} + + ); +}; + +const Content: React.FC = ({ children }) => { + const { height } = useWindowDimensions(); + const style = { + maxHeight: height - 64, + }; + return ( + + {children} + + ); +}; + +const Modal: ModalType = ({ + open = true, + handleClose, + isLargeModal = true, + children, +}) => { + const portalRef = React.useRef(null); + return ( + + + + + {children} + + + + + ); +}; + +Modal.Body = ({ children, className, style }) => { + const { isLargeModal } = React.useContext(ModalContext); + + return ( +
e.stopPropagation()} + > + {children} +
+ ); +}; + +Modal.Content = ({ children, className }) => { + const { isLargeModal } = React.useContext(ModalContext); + + const { height } = useWindowDimensions(); + const style = { + maxHeight: height - 90 - 141, + }; + return ( +
+ {children} +
+ ); +}; + +Modal.Header = ({ handleClose = undefined, children }) => { + return ( +
e.stopPropagation()} + > +
{children}
+
+ {handleClose && ( + + )} +
+
+ ); +}; + +Modal.Footer = ({ children, className }) => { + const { isLargeModal } = React.useContext(ModalContext); + + return ( +
e.stopPropagation()} + className={clsx( + "bottom-0 flex w-full px-7 pb-5", + { + "border-grey-20 border-t pt-4": isLargeModal, + }, + className + )} + > + {children} +
+ ); +}; + +export default Modal; diff --git a/src/admin/ui-components/molecules/sidebar-team-member.tsx b/src/admin/ui-components/molecules/sidebar-team-member.tsx new file mode 100644 index 000000000..c08577e02 --- /dev/null +++ b/src/admin/ui-components/molecules/sidebar-team-member.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import Avatar from "../atoms/avatar"; + +type SidebarTeamMemberProps = { + color?: string; + user: any; +}; + +const SidebarTeamMember: React.FC = ({ + color = "bg-grey-80", + user, +}: SidebarTeamMemberProps) => { + const fullName = + user.first_name || user.last_name + ? `${user.first_name} ${user.last_name}` + : user.email; + + return ( +
+
+ +
+ {fullName} +
+ ); +}; + +export default SidebarTeamMember; diff --git a/src/admin/ui-components/molecules/table/filtering-option.tsx b/src/admin/ui-components/molecules/table/filtering-option.tsx new file mode 100644 index 000000000..8d3c4d863 --- /dev/null +++ b/src/admin/ui-components/molecules/table/filtering-option.tsx @@ -0,0 +1,97 @@ +import { Check, ChevronDown } from "@medusajs/icons"; + +import * as DropdownMenu from "@radix-ui/react-dropdown-menu"; +import clsx from "clsx"; +import React, { useState } from "react"; + +export type FilteringOptionProps = { + title: string; + options: { + title: string; + count?: number; + onClick: () => void; + }[]; +} & React.HTMLAttributes; + +const FilteringOptions: React.FC = ({ + title, + options, + className, + ...props +}) => { + const [selected, setSelected] = useState(options?.[0]?.title || "All"); + const [open, setOpen] = useState(false); + + return ( +
+ {title}: + + +
+ {selected} +
+ +
+
+
+ + {options.map((opt, idx) => ( + { + opt.onClick(); + setSelected(opt.title); + }} + disabled={typeof opt.count !== "undefined" && opt.count < 1} + className={clsx( + "text-grey-90 inter-small-semibold my-1 flex w-48 items-center rounded py-1.5 px-3 hover:border-0 hover:outline-none", + { + "hover:bg-grey-10 cursor-pointer": + typeof opt.count === "undefined" || opt.count > 0, + } + )} + > + {selected === opt.title && ( + + + + )} +
+ {opt.title} + + {opt.count} + +
+
+ ))} +
+
+
+ ); +}; + +export default FilteringOptions; diff --git a/src/admin/ui-components/molecules/table/index.tsx b/src/admin/ui-components/molecules/table/index.tsx new file mode 100644 index 000000000..697daf7d1 --- /dev/null +++ b/src/admin/ui-components/molecules/table/index.tsx @@ -0,0 +1,268 @@ +import { MagnifyingGlass } from "@medusajs/icons"; +import clsx from "clsx"; +import React from "react"; +import { useNavigate } from "react-router-dom"; + +import Actionables, { ActionType } from "../actionables"; + +import FilteringOptions, { FilteringOptionProps } from "./filtering-option"; +import TableSearch from "./table-search"; + +type TableRowProps = React.HTMLAttributes & { + forceDropdown?: boolean; + actions?: ActionType[]; + linkTo?: string; + clickable?: boolean; +}; + +type TableCellProps = React.TdHTMLAttributes & { + linkTo?: string; + name?: string; +}; + +type SortingHeadCellProps = { + onSortClicked: () => void; + sortDirection?: "ASC" | "DESC"; + setSortDirection: (string) => void; +} & React.HTMLAttributes; + +export type TableProps = { + filteringOptions?: FilteringOptionProps[] | React.ReactNode; + tableActions?: React.ReactNode; + enableSearch?: boolean; + searchClassName?: string; + immediateSearchFocus?: boolean; + searchPlaceholder?: string; + searchValue?: string; + containerClassName?: string; + handleSearch?: (searchTerm: string) => void; +} & React.HTMLAttributes; + +type TableElement = React.ForwardRefExoticComponent & + React.RefAttributes; + +type TableType = { + Head: TableElement>; + HeadRow: TableElement>; + HeadCell: TableElement>; + SortingHeadCell: TableElement; + Body: TableElement>; + Row: TableElement; + Cell: TableElement; +} & TableElement; + +const Table = React.forwardRef( + ( + { + className, + children, + tableActions, + enableSearch, + searchClassName, + immediateSearchFocus, + searchPlaceholder, + searchValue, + handleSearch, + filteringOptions, + containerClassName, + ...props + }, + ref + ) => { + if (enableSearch && !handleSearch) { + throw new Error("Table cannot enable search without a search handler"); + } + + return ( +
+
+ {filteringOptions ? ( +
+ {Array.isArray(filteringOptions) + ? filteringOptions.map((fo, idx) => ( + + )) + : filteringOptions} +
+ ) : ( + + )} +
+ {tableActions &&
{tableActions}
} + {enableSearch && ( + + )} +
+
+
+ + {children} +
+
+
+ ); + } +) as TableType; + +Table.Head = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, children, ...props }, ref) => ( + + {children} + +)); + +Table.HeadRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, children, ...props }, ref) => ( + + {children} + +)); + +Table.HeadCell = React.forwardRef< + HTMLTableCellElement, + React.HTMLAttributes +>(({ className, children, ...props }, ref) => ( + + {children} + +)); + +Table.SortingHeadCell = React.forwardRef< + HTMLTableCellElement, + SortingHeadCellProps +>( + ( + { + onSortClicked, + sortDirection, + setSortDirection, + className, + children, + ...props + }: SortingHeadCellProps, + ref + ) => { + return ( + +
{ + e.preventDefault(); + if (!sortDirection) { + setSortDirection("ASC"); + } else { + if (sortDirection === "ASC") { + setSortDirection("DESC"); + } else { + setSortDirection(undefined); + } + } + onSortClicked(); + }} + > + {children} + +
+ + ); + } +); + +Table.Body = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, children, ...props }, ref) => ( + + {children} + +)); + +Table.Cell = React.forwardRef( + ({ className, linkTo, children, ...props }, ref) => { + const navigate = useNavigate(); + return ( + { + navigate(linkTo); + e.stopPropagation(); + }, + })} + > + {children} + + ); + } +); + +Table.Row = React.forwardRef( + ( + { + className, + actions, + children, + linkTo, + forceDropdown, + clickable, + ...props + }, + ref + ) => { + const navigate = useNavigate(); + return ( + { + navigate(linkTo); + }, + })} + > + {children} + {actions && ( + e.stopPropagation()} className="w-[32px]"> + + + )} + + ); + } +); + +export default Table; diff --git a/src/admin/ui-components/molecules/table/table-search.tsx b/src/admin/ui-components/molecules/table/table-search.tsx new file mode 100644 index 000000000..c00c36245 --- /dev/null +++ b/src/admin/ui-components/molecules/table/table-search.tsx @@ -0,0 +1,47 @@ +import { MagnifyingGlass } from "@medusajs/icons"; +import clsx from "clsx"; +import React from "react"; + +type TableSearchProps = { + autoFocus?: boolean; + onSearch: (term: string) => void; + placeholder?: string; + searchValue?: string; +} & React.HTMLAttributes; + +const TableSearch: React.FC = ({ + autoFocus, + onSearch, + placeholder = "Search", + searchValue, + className, + ...props +}) => { + return ( +
+ + + + { + onSearch(e.target.value); + }} + /> +
+ ); +}; + +export default TableSearch; diff --git a/src/admin/ui-components/organisms/body-card.tsx b/src/admin/ui-components/organisms/body-card.tsx new file mode 100644 index 000000000..9474889e3 --- /dev/null +++ b/src/admin/ui-components/organisms/body-card.tsx @@ -0,0 +1,135 @@ +import clsx from "clsx"; +import React from "react"; + +import { useScroll } from "../hooks/use-scroll"; +import Actionables, { ActionType } from "../molecules/actionables"; +import Button from "../fundamentals/button"; + +type BodyCardProps = { + title?: string | JSX.Element | React.ReactNode; + subtitle?: string; + events?: { + label: string; + onClick: (e: React.MouseEvent) => void; + type?: React.ButtonHTMLAttributes["type"]; + }[]; + actionables?: ActionType[]; + forceDropdown?: boolean; + customActionable?: React.ReactNode; + status?: React.ReactNode; + customHeader?: React.ReactNode; + compact?: boolean; + footerMinHeight?: number; + setBorders?: boolean; +} & React.HTMLAttributes; + +const BodyCard: React.FC = ({ + title, + subtitle, + events, + actionables, + forceDropdown = false, + customActionable, + status, + customHeader, + className, + children, + compact = false, + setBorders = false, + footerMinHeight = 24, + ...rest +}) => { + const { isScrolled, scrollListener } = useScroll({ threshold: 16 }); + + return ( +
+
+ {isScrolled && ( +
+ )} +
+
+
+
+
+ {customHeader ? ( +
{customHeader}
+ ) : title ? ( +

{title}

+ ) : ( +
+ )} + + {subtitle && ( +

+ {subtitle} +

+ )} +
+ +
+ {status && status} + +
+
+
+ +
+ {children && ( +
+ {children} +
+ )} +
+
+ {events && events.length > 0 ? ( +
+
+ {events.map((event, i: React.Key) => { + return ( + + ); + })} +
+
+ ) : ( +
+ )} +
+ ); +}; + +export default BodyCard; diff --git a/src/admin/ui-components/organisms/delete-prompt.tsx b/src/admin/ui-components/organisms/delete-prompt.tsx new file mode 100644 index 000000000..047c89859 --- /dev/null +++ b/src/admin/ui-components/organisms/delete-prompt.tsx @@ -0,0 +1,96 @@ +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; + +import useNotification from "../hooks/use-notification"; +import { getErrorMessage } from "../utils/error-messages"; +import Button from "../fundamentals/button"; +import Modal from "../molecules/modal"; + +type DeletePromptProps = { + heading?: string; + text?: string; + successText?: string | false; + cancelText?: string; + confirmText?: string; + handleClose: () => void; + onDelete: () => Promise; +}; + +const DeletePrompt: React.FC = ({ + heading, + text = "", + successText, + cancelText, + confirmText, + handleClose, + onDelete, +}) => { + const { t } = useTranslation(); + const notification = useNotification(); + const [isLoading, setIsLoading] = useState(false); + + const handleSubmit = (e) => { + e.preventDefault(); + + setIsLoading(true); + onDelete() + .then(() => { + if (successText) { + notification( + t("organisms-success", "Success"), + successText || + t("organisms-delete-successful", "Delete successful"), + "success" + ); + } + }) + .catch((err) => notification("Error", getErrorMessage(err), "error")) + .finally(() => { + setIsLoading(false); + handleClose(); + }); + }; + + return ( + + + +
+ + {heading || + t( + "organisms-are-you-sure-you-want-to-delete", + "Are you sure you want to delete?" + )} + + {text} +
+
+ +
+ + +
+
+
+
+ ); +}; + +export default DeletePrompt; diff --git a/src/admin/ui-components/utils/error-messages.ts b/src/admin/ui-components/utils/error-messages.ts new file mode 100644 index 000000000..295263704 --- /dev/null +++ b/src/admin/ui-components/utils/error-messages.ts @@ -0,0 +1,10 @@ +export const getErrorMessage = (error: any) => { + let msg = error?.response?.data?.message; + if (msg[0].message) { + msg = msg[0].message; + } + if (!msg) { + msg = "Something went wrong, Please try again."; + } + return msg; +}; diff --git a/src/admin/ui-components/utils/form-validator.ts b/src/admin/ui-components/utils/form-validator.ts new file mode 100644 index 000000000..c3ab02287 --- /dev/null +++ b/src/admin/ui-components/utils/form-validator.ts @@ -0,0 +1,47 @@ +import { ValidationRule } from "react-hook-form"; + +/** + * Utility functions for validating form inputs. + */ +const FormValidator = { + whiteSpaceRule: (name: string) => + ({ + value: /^[^\s]+(?:$|.*[^\s]+$)/, + message: `${name} cannot have leading or trailing spaces, or be an empty string.`, + } as ValidationRule), + nonNegativeNumberRule: (name: string) => ({ + value: 0, + message: `${name} cannot be negative.`, + }), + minOneCharRule: (name: string) => ({ + value: 1, + message: `${name} must be at least 1 character.`, + }), + min: (name: string, min: number) => ({ + value: min, + message: `${name} must be greater than or equal to ${min}.`, + }), + max: (name: string, max: number) => ({ + value: max, + message: `${name} must be less than or equal to ${max}.`, + }), + required: (name: string) => ({ + value: true, + message: `${name} is required.`, + }), + minLength: (name: string, min: number) => ({ + value: min, + message: `${name} must be at least ${min} characters.`, + }), + email: (name: string) => ({ + value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i, + message: `${name} must be a valid email address.`, + }), +}; + +/** + * The maximum integer value that can be stored in the database. + */ +const MAX_INTEGER = 2147483647; + +export default FormValidator; From 4cc5250a74d02c9c85f82438a82fd01773311a39 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Mon, 30 Sep 2024 18:06:01 -0500 Subject: [PATCH 04/21] refactor: role page now follows the Medusa admin design --- src/admin/settings/user-roles/page.tsx | 207 +++++++---------------- src/api/routes/admin/role/delete-role.ts | 10 +- src/api/routes/admin/role/index.ts | 5 +- src/models/role.ts | 4 + src/services/role.ts | 9 +- 5 files changed, 73 insertions(+), 162 deletions(-) diff --git a/src/admin/settings/user-roles/page.tsx b/src/admin/settings/user-roles/page.tsx index c043802f4..397d93389 100644 --- a/src/admin/settings/user-roles/page.tsx +++ b/src/admin/settings/user-roles/page.tsx @@ -1,183 +1,92 @@ import type { SettingConfig } from "@medusajs/admin"; import { PlusMini } from "@medusajs/icons"; -import { - Container, - Text, - Table, - Button, - Drawer, - Input, - Label, -} from "@medusajs/ui"; -import { - useAdminCustomQuery, - useAdminCustomPost, - useAdminCustomDelete, -} from "medusa-react"; + +import { useAdminCustomQuery } from "medusa-react"; import { useState, useEffect } from "react"; -import { Link } from "react-router-dom"; +import { useTranslation } from "react-i18next"; + import UserShield from "../../ui-components/icons/user-shield"; +import BackButton from "../../ui-components/atoms/back-button"; +import BodyCard from "../../ui-components/organisms/body-card"; +import CreateRoleModal from "../../ui-components/organisms/create-role-modal"; +import RoleTable from "../../ui-components/templates/role-table"; +import Spinner from "../../ui-components/atoms/spinner"; const CustomSettingPage = () => { - // Create New Role - const [name, setRoleName] = useState(""); - const { mutate } = useAdminCustomPost("/roles/create-role", []); - const [mandatory, setMandatory] = useState(""); - const [drawerOpen, setDrawerOpen] = useState(false); + const { t } = useTranslation(); + + const [showCreateRoleModal, setShowCreateRoleModal] = useState(false); const [refetchFlag, setRefetchFlag] = useState(false); const { data, isLoading, error, refetch } = useAdminCustomQuery( "/roles/get-roles", [] ); - const { mutate: deleteMutate } = useAdminCustomPost("/roles/delete-role", [ - "DeleteRole", - ]); - const handleRoleNameChange = (e) => { - setRoleName(e.target.value); - if (mandatory) { - setMandatory(""); - } + const triggerRefetch = () => { + setRefetchFlag((prev) => !prev); }; - const handleSave = async () => { - if (!name) { - setMandatory("Name field is empty"); - return; - } - try { - const response = await mutate({ name }); - setRoleName(""); - - setDrawerOpen(false); - setRefetchFlag(true); - } catch (error) { - console.error("Error creating page:", error); - } - }; useEffect(() => { if (refetchFlag) { refetch(); setRefetchFlag(false); } }, [refetchFlag]); - const handlecancle = () => { - setRoleName(""); - setMandatory(""); - setDrawerOpen(false); - }; - // Handle delete roles - - const handleDeleteRole = (id): void => { - deleteMutate({ id }); - setRefetchFlag(true); - }; - // Here we get all the Roles if (isLoading) { - return
Loading...
; + return ; } if (error) { return
Error: {error.message}
; } + const actionables = [ + { + label: t("roles-create-role", "Create Role"), + onClick: () => setShowCreateRoleModal(true), + icon: ( + + + + ), + }, + ]; + return ( - <> - -
+
+ + - - Manage the user roles and Permissions - - - - - - - - - Add New Role - - -
- -
- -
- -
-
{mandatory}
-
- - - - - - -
-
-
-
- - - - # - Role Name - - - - {data.role.map((role, index) => ( - - {index + 1} - {role.name} - - - - -
- -
-
-
- ))} -
-
- -
- +
+ +

+ {t("roles-count", "{{count}}", { count: data.role.length ?? 0 })} +

+
+ {showCreateRoleModal && ( + { + triggerRefetch(); + setShowCreateRoleModal(false); + }} + /> + )} + +
+
); }; diff --git a/src/api/routes/admin/role/delete-role.ts b/src/api/routes/admin/role/delete-role.ts index e241924d7..b7d396a33 100644 --- a/src/api/routes/admin/role/delete-role.ts +++ b/src/api/routes/admin/role/delete-role.ts @@ -1,10 +1,10 @@ import { Request, Response } from "express"; import RoleService from "../../../../services/role"; -export default async (req: Request, res: Response) =>{ - const id = req.body; +export default async (req: Request, res: Response) => { + const { id } = req.params; const roleService = req.scope.resolve("roleService") as RoleService; - const role = await roleService.DeleteRole(id); + const role = await roleService.deleteRole(id); - res.json({role}); -} \ No newline at end of file + res.json({ role }); +}; diff --git a/src/api/routes/admin/role/index.ts b/src/api/routes/admin/role/index.ts index 7e666652f..749717da6 100644 --- a/src/api/routes/admin/role/index.ts +++ b/src/api/routes/admin/role/index.ts @@ -8,9 +8,10 @@ import reterieve1 from "./getRoleById"; import updateRolePermissions from "./updateRolePermissions"; import createPermission from "./createPermission"; import list from "./getAllUsers"; -import DeleteRole from "./delete-role" +import deleteRole from "./delete-role"; import removePermission from "./removepermission"; import removeUsersfromRole from "./remove-user"; + const router = Router(); export default (adminRouter: Router) => { @@ -24,7 +25,7 @@ export default (adminRouter: Router) => { router.post("/update-permissions/:id", wrapHandler(updateRolePermissions)); router.post("/createnewpermission", wrapHandler(createPermission)); router.get("/getAllUsers", wrapHandler(list)); - router.post("/delete-role",wrapHandler(DeleteRole)); + router.delete("/delete-role/:id", wrapHandler(deleteRole)); router.post("/remove-permissions",wrapHandler(removePermission)); router.post("/remove-users",wrapHandler(removeUsersfromRole)); }; diff --git a/src/models/role.ts b/src/models/role.ts index f373dd88c..9c35a4b97 100644 --- a/src/models/role.ts +++ b/src/models/role.ts @@ -40,3 +40,7 @@ export class Role extends BaseEntity { this.id = generateEntityId(this.id, "role"); } } + +export type TRole = Role & { + id: string; +}; diff --git a/src/services/role.ts b/src/services/role.ts index eb778c6f9..5e5e4bb58 100644 --- a/src/services/role.ts +++ b/src/services/role.ts @@ -35,13 +35,10 @@ class RoleService extends TransactionBaseService { return await roleRepo.find(); } - async DeleteRole(id) { - // Extract the value from the id object - const roleId = id.value; - - const roleRepo = this.manager_.withRepository(this.roleRpository_); + async deleteRole(id) { + const roleRepo = this.manager_.withRepository(this.roleRepository_); const role = await roleRepo.findOne({ - where: { id: roleId }, + where: { id }, }); if (role) { From a01db5e408baabf107fb9cf6f54fb9602dd2f2f3 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Mon, 30 Sep 2024 21:18:11 -0500 Subject: [PATCH 05/21] chore: add create permission modal --- src/admin/routes/role/page.tsx | 181 +++++++++--------- .../organisms/create-permission-modal.tsx | 111 +++++++++++ src/api/routes/admin/role/createPermission.ts | 12 +- src/api/routes/admin/role/index.ts | 2 +- src/models/permission.ts | 50 +++-- src/services/permission.ts | 17 +- 6 files changed, 238 insertions(+), 135 deletions(-) create mode 100644 src/admin/ui-components/organisms/create-permission-modal.tsx diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index 9d6d0db0b..e1c22a8d3 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -1,3 +1,4 @@ +import { PlusMini } from "@medusajs/icons"; import { Button, Container, @@ -7,12 +8,26 @@ import { Input, Table, } from "@medusajs/ui"; -import { useParams } from "react-router-dom"; -import { useState } from "react"; import { useAdminCustomQuery, useAdminCustomPost } from "medusa-react"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useParams } from "react-router-dom"; + +import BackButton from "../../ui-components/atoms/back-button"; +import Spinner from "../../ui-components/atoms/spinner"; +import BodyCard from "../../ui-components/organisms/body-card"; +import UserTable from "../../ui-components/templates/user-table"; +import PermissionTable from "../../ui-components/templates/permission-table"; +import CreatePermissionModal from "../../ui-components/organisms/create-permission-modal"; const SetPermission = () => { + const { t } = useTranslation(); const { "*": id } = useParams(); + + const [refetchFlag, setRefetchFlag] = useState(false); + const [showCreatePermissionModal, setShowCreatePermissionModal] = + useState(false); + const [selectedPermissions, setSelectedPermissions] = useState([]); const [selectedUser, setSelectedUser] = useState([]); const [newPermission, setNewPermission] = useState({ @@ -31,15 +46,28 @@ const SetPermission = () => { isLoading: permissionsLoading, error: permissionsError, } = useAdminCustomQuery("/roles/get-permission", []); + // Hook#2 for getting all permission of a single role const { data: roleData, isLoading: roleIsloading, - error: roleerror, + error: roleError, + refetch, } = useAdminCustomQuery(`/roles/get-rolepermissions/${id}`, [ "getRolePermissions", ]); + const triggerRefetch = () => { + setRefetchFlag((prev) => !prev); + }; + + useEffect(() => { + if (refetchFlag) { + refetch(); + setRefetchFlag(false); + } + }, [refetchFlag]); + // Hook#3 for updating the role permissons const { mutate: updaterole, @@ -48,11 +76,7 @@ const SetPermission = () => { } = useAdminCustomPost(`/roles/update-permissions/${id}`, [ "updateRolesPermissions", ]); - // Hook#4 for creating a new permission - const { mutate: createnewpermission } = useAdminCustomPost( - "/roles/createnewpermission", - ["createPermissions"] - ); + // Hook#5 list all users const { data: usersData, @@ -194,37 +218,6 @@ const SetPermission = () => { setDrawerOpen2(false); }; - // Handle function to create permission - const handleCreatePermissions = () => { - if (!newPermission.name && !newPermission.metadata) { - setNameError("Name field is empty"); - setMetadataError("Metadata field is empty"); - return; - } - - if (!newPermission.name) { - setNameError("Name field is empty"); - return; - } - - if (!newPermission.metadata) { - setMetadataError("Metadata field is empty"); - return; - } - // Hook 4 creating new permissions - const newMetadata = { [`${newPermission.metadata}`]: true }; - const updatedPermission = { - name: newPermission.name, - metadata: newMetadata, - }; - try { - createnewpermission(updatedPermission); - setDrawerOpen(false); - } catch (error) { - console.error("Error creating page:", error); - } - }; - const handlecancel = () => { setNewPermission({ name: "", @@ -279,8 +272,65 @@ const SetPermission = () => { } }; + const actionables = [ + { + label: t("roles-create-permission", "Create Permission"), + onClick: () => { + setShowCreatePermissionModal(true); + return null; + }, + icon: ( + + + + ), + }, + ]; + return ( <> +
+
+ + +
+

+ {t("roles-permissions-title", "Permissions")} +

+ { + triggerRefetch(); + }} + /> +

+ {t("roles-permissions-count", "{{count}}", { + count: permissions.length ?? 0, + })} +

+
+ {showCreatePermissionModal && ( + { + triggerRefetch(); + setShowCreatePermissionModal(false); + }} + /> + )} +
+
+
+
{ Role Name: {roleData.role.name}
- - - - - - - - Add New Permission - - -
- -
- -
- -
-
{nameError}
-
- -
-
- -
-
{metadataError}
-
- - - - - - -
-

diff --git a/src/admin/ui-components/organisms/create-permission-modal.tsx b/src/admin/ui-components/organisms/create-permission-modal.tsx new file mode 100644 index 000000000..d91689b6f --- /dev/null +++ b/src/admin/ui-components/organisms/create-permission-modal.tsx @@ -0,0 +1,111 @@ +import { useAdminCustomPost } from "medusa-react"; +import React from "react"; +import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; + +import useNotification from "../hooks/use-notification"; + +import { CreateModalProps } from "./types"; +import { getErrorMessage } from "../utils/error-messages"; +import Modal from "../molecules/modal"; +import InputField from "../molecules/input"; +import Button from "../fundamentals/button"; + +type CreatePermissionModalFormData = { + name: string; + route: string; +}; + +const CreatePermissionModal: React.FC = ({ handleClose }) => { + const notification = useNotification(); + const { t } = useTranslation(); + + const { mutate: createPermission, isLoading } = useAdminCustomPost( + "/roles/create-permission", + ["create-permission"] + ); + + const { register, handleSubmit } = useForm(); + + const onSubmit = (data: CreatePermissionModalFormData) => { + createPermission( + { + name: data.name, + metadata: { [data.route]: true }, + }, + { + onSuccess: () => { + notification( + "Success", + `Created ${data.name} permission.`, + "success" + ); + handleClose(); + }, + onError: (error) => { + notification("Error", getErrorMessage(error), "error"); + }, + } + ); + }; + + return ( + +
+ + + + {t("create-role-modal-create-role", "Create Role")} + + + +
+ + +
+
+ +
+ + +
+
+
+
+
+ ); +}; + +export default CreatePermissionModal; diff --git a/src/api/routes/admin/role/createPermission.ts b/src/api/routes/admin/role/createPermission.ts index 1770e1704..1d5a11bba 100644 --- a/src/api/routes/admin/role/createPermission.ts +++ b/src/api/routes/admin/role/createPermission.ts @@ -1,15 +1,17 @@ import { Request, Response } from "express"; -import PermissionService from "../../../../services/permission"; + +import PermissionService, { + CreatePayload, +} from "../../../../services/permission"; + export default async (req: Request, res: Response) => { - const data = req.body; + const data = req.body as CreatePayload; const permissionService = req.scope.resolve( "permissionService" ) as PermissionService; - const role = await permissionService.createPermission({ - data, - }); + const role = await permissionService.create(data); res.json(role); }; diff --git a/src/api/routes/admin/role/index.ts b/src/api/routes/admin/role/index.ts index 749717da6..e69fc1193 100644 --- a/src/api/routes/admin/role/index.ts +++ b/src/api/routes/admin/role/index.ts @@ -23,7 +23,7 @@ export default (adminRouter: Router) => { router.get("/get-permission", wrapHandler(listPermission)); router.get("/get-rolepermissions/:id", wrapHandler(reterieve1)); router.post("/update-permissions/:id", wrapHandler(updateRolePermissions)); - router.post("/createnewpermission", wrapHandler(createPermission)); + router.post("/create-permission", wrapHandler(createPermission)); router.get("/getAllUsers", wrapHandler(list)); router.delete("/delete-role/:id", wrapHandler(deleteRole)); router.post("/remove-permissions",wrapHandler(removePermission)); diff --git a/src/models/permission.ts b/src/models/permission.ts index facf0ca39..3b94e7f4b 100644 --- a/src/models/permission.ts +++ b/src/models/permission.ts @@ -1,28 +1,22 @@ -import { - BeforeInsert, - Column, - Entity, - JoinTable, - ManyToMany, - } from "typeorm" - import { BaseEntity } from "@medusajs/medusa" - import { - DbAwareColumn, - generateEntityId, - } from "@medusajs/medusa/dist/utils" - import { Role } from "./role" - - @Entity() - export class Permission extends BaseEntity { - @Column({ type: "varchar" }) - name: string - - // holds the permissions - @DbAwareColumn({ type: "jsonb", nullable: true }) - metadata: Record - - @BeforeInsert() - private beforeInsert(): void { - this.id = generateEntityId(this.id, "perm") - } - } \ No newline at end of file +import { BaseEntity } from "@medusajs/medusa"; +import { DbAwareColumn, generateEntityId } from "@medusajs/medusa/dist/utils"; +import { BeforeInsert, Column, Entity } from "typeorm"; + +@Entity() +export class Permission extends BaseEntity { + @Column({ type: "varchar" }) + name: string; + + // holds the permissions + @DbAwareColumn({ type: "jsonb", nullable: true }) + metadata: Record; + + @BeforeInsert() + private beforeInsert(): void { + this.id = generateEntityId(this.id, "perm"); + } +} + +export type TPermission = Permission & { + id: string; +}; diff --git a/src/services/permission.ts b/src/services/permission.ts index df83c12c5..08abbb982 100644 --- a/src/services/permission.ts +++ b/src/services/permission.ts @@ -23,17 +23,16 @@ class PermissionService extends TransactionBaseService { return await permissionRepo.find(); } - async createPermission(data) { - const permissionRepo = this.manager_.withRepository( - this.permissionRepository_ - ); - console.log(data) - const permission = permissionRepo.create({name:data.data.name,metadata:data.data.metadata}); - console.log(permission) + async create(data: CreatePayload) { + // omitting validation for simplicity + return this.atomicPhase_(async (manager) => { + const permissionRepo = manager.withRepository(this.permissionRepository_); + const permission = permissionRepo.create(data); - const result = await permissionRepo.save(permission); + const result = await permissionRepo.save(permission); - return result; + return result; + }); } } From 4d7ecd7b0d9844df3f76f2153c16b73fc0cae55a Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Mon, 30 Sep 2024 21:18:55 -0500 Subject: [PATCH 06/21] chore: add missing create role, create types and header for delete promp --- .../organisms/create-role-modal.tsx | 96 +++++++++++++++++++ .../ui-components/organisms/delete-prompt.tsx | 5 + src/admin/ui-components/organisms/types.ts | 5 + 3 files changed, 106 insertions(+) create mode 100644 src/admin/ui-components/organisms/create-role-modal.tsx create mode 100644 src/admin/ui-components/organisms/types.ts diff --git a/src/admin/ui-components/organisms/create-role-modal.tsx b/src/admin/ui-components/organisms/create-role-modal.tsx new file mode 100644 index 000000000..bb5daa30f --- /dev/null +++ b/src/admin/ui-components/organisms/create-role-modal.tsx @@ -0,0 +1,96 @@ +import React from "react"; +import { useAdminCustomPost } from "medusa-react"; +import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; + +import Button from "../fundamentals/button"; +import useNotification from "../hooks/use-notification"; +import InputField from "../molecules/input"; +import Modal from "../molecules/modal"; +import { getErrorMessage } from "../utils/error-messages"; + +import { CreateModalProps } from "./types"; + +type CreateRoleModalFormData = { + name: string; +}; + +const CreateRoleModal: React.FC = ({ handleClose }) => { + const notification = useNotification(); + const { t } = useTranslation(); + + const { mutate: createRole, isLoading } = useAdminCustomPost( + "/roles/create-role", + ["create-role"] + ); + + const { register, handleSubmit } = useForm(); + + const onSubmit = (data: CreateRoleModalFormData) => { + createRole( + { + name: data.name, + }, + { + onSuccess: () => { + notification("Success", `Created ${data.name} role.`, "success"); + handleClose(); + }, + onError: (error) => { + notification("Error", getErrorMessage(error), "error"); + }, + } + ); + }; + + return ( + +
+ + + + {t("create-role-modal-create-role", "Create Role")} + + + +
+ +
+
+ +
+ + +
+
+
+
+
+ ); +}; + +export default CreateRoleModal; diff --git a/src/admin/ui-components/organisms/delete-prompt.tsx b/src/admin/ui-components/organisms/delete-prompt.tsx index 047c89859..ca0bbd698 100644 --- a/src/admin/ui-components/organisms/delete-prompt.tsx +++ b/src/admin/ui-components/organisms/delete-prompt.tsx @@ -54,6 +54,11 @@ const DeletePrompt: React.FC = ({ return ( + + + {t("organisms-delete-title", "Delete")} + +
diff --git a/src/admin/ui-components/organisms/types.ts b/src/admin/ui-components/organisms/types.ts new file mode 100644 index 000000000..21242aee7 --- /dev/null +++ b/src/admin/ui-components/organisms/types.ts @@ -0,0 +1,5 @@ +type CreateModalProps = { + handleClose: () => void; +}; + +export type { CreateModalProps }; From fe0602cf82498b44d53c80f229bd27cae426a206 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Tue, 1 Oct 2024 10:38:54 -0500 Subject: [PATCH 07/21] refactor: reorder and group routes by domain --- src/api/routes/admin/role/index.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/api/routes/admin/role/index.ts b/src/api/routes/admin/role/index.ts index e69fc1193..6993b397c 100644 --- a/src/api/routes/admin/role/index.ts +++ b/src/api/routes/admin/role/index.ts @@ -3,7 +3,7 @@ import { Router } from "express"; import create from "./create-role"; import associateUser from "./associate-user"; import listRoles from "./get-roles"; -import listPermission from "./get-permission"; +import listPermissions from "./get-permission"; import reterieve1 from "./getRoleById"; import updateRolePermissions from "./updateRolePermissions"; import createPermission from "./createPermission"; @@ -17,15 +17,17 @@ const router = Router(); export default (adminRouter: Router) => { adminRouter.use("/roles", router); - router.post("/create-role", wrapHandler(create)); - router.post("/:id/user", wrapHandler(associateUser)); router.get("/get-roles", wrapHandler(listRoles)); - router.get("/get-permission", wrapHandler(listPermission)); - router.get("/get-rolepermissions/:id", wrapHandler(reterieve1)); - router.post("/update-permissions/:id", wrapHandler(updateRolePermissions)); + router.post("/create-role", wrapHandler(create)); + router.delete("/delete-role/:id", wrapHandler(deleteRole)); + + router.get("/get-all-permissions", wrapHandler(listPermissions)); router.post("/create-permission", wrapHandler(createPermission)); + router.post("/update-permissions/:id", wrapHandler(updateRolePermissions)); + router.get("/get-rolepermissions/:id", wrapHandler(reterieve1)); + router.post("/remove-permissions", wrapHandler(removePermission)); + + router.post("/:id/user", wrapHandler(associateUser)); router.get("/getAllUsers", wrapHandler(list)); - router.delete("/delete-role/:id", wrapHandler(deleteRole)); - router.post("/remove-permissions",wrapHandler(removePermission)); - router.post("/remove-users",wrapHandler(removeUsersfromRole)); + router.post("/remove-users", wrapHandler(removeUsersfromRole)); }; From 8331ca9796ec0b697fceb3164c1e2e5918a5bb00 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Tue, 1 Oct 2024 10:43:52 -0500 Subject: [PATCH 08/21] chore: add Roles Table component --- .../ui-components/templates/role-table.tsx | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/admin/ui-components/templates/role-table.tsx diff --git a/src/admin/ui-components/templates/role-table.tsx b/src/admin/ui-components/templates/role-table.tsx new file mode 100644 index 000000000..8b5ad15bc --- /dev/null +++ b/src/admin/ui-components/templates/role-table.tsx @@ -0,0 +1,155 @@ +import { PencilSquare, Trash } from "@medusajs/icons"; +import { useAdminCustomDelete } from "medusa-react"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useNavigate } from "react-router-dom"; + +import type { TRole } from "src/models/role"; + +import useNotification from "../hooks/use-notification"; +import Table from "../molecules/table"; +import DeletePrompt from "../organisms/delete-prompt"; + +type RoleListElement = { + entity: TRole; + entityType: string; + tableElement: React.JSX.Element; +}; + +type RoleTableProps = { + roles: Array; + triggerRefetch: () => void; +}; + +const RoleTable: React.FC = ({ roles, triggerRefetch }) => { + const navigate = useNavigate(); + const notification = useNotification(); + const { t } = useTranslation(); + + const [selectedRoleId, setSelectedRoleId] = useState(null); + const [deleteRole, setDeleteRole] = useState(false); + const [elements, setElements] = useState>([]); + const [shownElements, setShownElements] = useState>( + [] + ); + + const { mutate: removeRole } = useAdminCustomDelete( + `/roles/delete-role/${selectedRoleId}`, + ["delete-role"], + [], + { + onSuccess: () => { + notification( + t("templates-success", "Success"), + t("templates-role-has-been-removed", "Role has been removed!"), + "success" + ); + triggerRefetch(); + }, + } + ); + + const handleClose = () => { + setSelectedRoleId(null); + setDeleteRole(false); + }; + + const getRoleTableRow = (role: TRole) => { + return ( + navigate(`/a/role/${role.id}`), + icon: , + }, + { + label: t("templates-remove-role", "Remove Role"), + variant: "danger", + onClick: () => { + setDeleteRole(true); + setSelectedRoleId(role.id); + }, + icon: , + }, + ]} + > + {role.name} + + {/* TODO +
    + {role.permissions.map((permission) => ( +
  • {permission.name}
  • + ))} +
*/} +
+ + {/* TODO + {role.users.length} + */} + + +
+ ); + }; + + useEffect(() => { + setElements([ + ...roles.map((role) => ({ + entity: role, + entityType: "user", + tableElement: getRoleTableRow(role), + })), + ]); + }, [roles]); + + useEffect(() => { + setShownElements(elements); + }, [elements]); + + const handleUserSearch = (term: string) => { + setShownElements((prevElements) => + prevElements.filter((element) => element.entity?.name?.includes(term)) + ); + }; + + return ( +
+ + + + + {t("templates-name", "Name")} + + + {t("templates-permissions", "Permissions")} + + + {t("templates-user-number", "No. Users")} + + + + + {shownElements.map((element) => element.tableElement)} + +
+ {selectedRoleId && deleteRole && ( + { + await removeRole(); + }} + handleClose={handleClose} + /> + )} +
+ ); +}; + +export default RoleTable; From 90f078418508524185ec9547ca7016eaa2c3f0a2 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Tue, 1 Oct 2024 10:44:29 -0500 Subject: [PATCH 09/21] refactor: handle assign permissions in external modal component --- src/admin/routes/role/page.tsx | 260 +++--------------- .../organisms/assign-permissions-modal.tsx | 191 +++++++++++++ .../templates/permission-table.tsx | 184 +++++++++++++ 3 files changed, 409 insertions(+), 226 deletions(-) create mode 100644 src/admin/ui-components/organisms/assign-permissions-modal.tsx create mode 100644 src/admin/ui-components/templates/permission-table.tsx diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index e1c22a8d3..1a519b1fd 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -28,29 +28,13 @@ const SetPermission = () => { const [showCreatePermissionModal, setShowCreatePermissionModal] = useState(false); - const [selectedPermissions, setSelectedPermissions] = useState([]); const [selectedUser, setSelectedUser] = useState([]); - const [newPermission, setNewPermission] = useState({ - name: "", - metadata: "", - }); - const [nameError, setNameError] = useState(""); - const [metadataError, setMetadataError] = useState(""); - const [drawerOpen, setDrawerOpen] = useState(false); - const [drawerOpen1, setDrawerOpen1] = useState(false); const [drawerOpen2, setDrawerOpen2] = useState(false); - // Hook#1 for getting all permission from database - const { - data: permissionsData, - isLoading: permissionsLoading, - error: permissionsError, - } = useAdminCustomQuery("/roles/get-permission", []); - // Hook#2 for getting all permission of a single role const { data: roleData, - isLoading: roleIsloading, + isLoading: roleIsLoading, error: roleError, refetch, } = useAdminCustomQuery(`/roles/get-rolepermissions/${id}`, [ @@ -68,32 +52,22 @@ const SetPermission = () => { } }, [refetchFlag]); - // Hook#3 for updating the role permissons - const { - mutate: updaterole, - isLoading: isUpdating, - error: iserror, - } = useAdminCustomPost(`/roles/update-permissions/${id}`, [ - "updateRolesPermissions", - ]); - // Hook#5 list all users const { data: usersData, isLoading: userLoading, error: userError, + refetch: refetchUser, } = useAdminCustomQuery("/roles/getAllUsers", []); // Hooks# 6 update the role_id inside the user entity - const { mutate: updateRoleInUser, - isLoading: updateroleLoading, - error: updateroleError, + isLoading: updateRoleLoading, + error: updateRoleError, } = useAdminCustomPost(`roles/${id}/user`, ["setRolestouser"]); // Hook# 7 for removing the permission from a role - const { mutate: removePermission, isLoading: removePermissionloading, @@ -101,65 +75,51 @@ const SetPermission = () => { } = useAdminCustomPost(`roles/remove-permissions`, ["removePermissions"]); // Hook# 8 for removing the users from role - const { mutate: removeRoleUsers, isLoading: removeRoleUsersloading, error: removeRoleUserserror, } = useAdminCustomPost(`roles/remove-users`, ["removeUsers"]); - // Hook 1 - if (permissionsLoading) { - return
Loading...
; - } - - if (permissionsError) { - return
Error: {permissionsError.message}
; - } // Hook 2 - if (roleIsloading) { - return
Loading...
; + if (roleIsLoading) { + return ; } - if (roleerror) { - return
Error: {roleerror.message}
; - } - //Hook 3 - if (isUpdating) { - return
Loading...
; + if (roleError) { + return
Error: {roleError.message}
; } - if (iserror) { - return
Error: {iserror.message}
; - } //Hook 4 if (userLoading) { - return
Loading...
; + return ; } if (userError) { return
Error: {userError.message}
; } + // Hook 5 - if (updateroleLoading) { - return
Loading...
; + if (updateRoleLoading) { + return ; } - if (updateroleError) { - return
Error: {updateroleError.message}
; + if (updateRoleError) { + return
Error: {updateRoleError.message}
; } + // hook 7 if (removePermissionloading) { - return
Loading...
; + return ; } if (removePermissionerror) { return
Error: {removePermissionerror.message}
; } - // hook 8 + // hook 8 if (removeRoleUsersloading) { - return
Loading...
; + return ; } if (removeRoleUserserror) { @@ -169,27 +129,6 @@ const SetPermission = () => { const permissions = roleData.role.permissions; const users = roleData.role.users; - // hook 3 handle checkbox - const handlePermissionToggle = (permission) => { - const selectedPermissionIds = selectedPermissions.map((p) => p.id); - - if (selectedPermissionIds.includes(permission.id)) { - // Permission is already selected, remove it - const updatedPermissions = selectedPermissions.filter( - (p) => p.id !== permission.id - ); - setSelectedPermissions(updatedPermissions); - } else { - // Permission is not selected, add it - setSelectedPermissions([...selectedPermissions, permission]); - } - }; - const handleUpdatePermissions = () => { - updaterole(selectedPermissions); - setSelectedPermissions([]); - setDrawerOpen1(false); - }; - // Here we handle the Selected Users const handleUsersToggle = (user) => { const selectedUserIds = selectedUser.map((p) => p.id); @@ -203,7 +142,7 @@ const SetPermission = () => { setSelectedUser([...selectedUser, user]); } }; - // zzz + const handleSelectedUser = () => { const newIds = selectedUser.map((user) => user.id); @@ -218,18 +157,6 @@ const SetPermission = () => { setDrawerOpen2(false); }; - const handlecancel = () => { - setNewPermission({ - name: "", - metadata: "", - }); - - setMetadataError(""); - - setNameError(""); - setDrawerOpen(false); - }; - // Handle remove permission from a role const handleRemovePermission = (permission_id) => { @@ -250,28 +177,6 @@ const SetPermission = () => { removeRoleUsers(ids); }; - const handleNameChange = (e) => { - const { value } = e.target; - setNewPermission({ - ...newPermission, - name: value, - }); - if (nameError) { - setNameError(""); - } - }; - - const handleMetadataChange = (e) => { - const { value } = e.target; - setNewPermission({ - ...newPermission, - metadata: value, - }); - if (metadataError) { - setMetadataError(""); - } - }; - const actionables = [ { label: t("roles-create-permission", "Create Permission"), @@ -318,6 +223,20 @@ const SetPermission = () => { count: permissions.length ?? 0, })}

+

+ {t("roles-users-title", "Users")} +

+ { + triggerRefetch(); + }} + /> +

+ {t("roles-users-count", "{{count}}", { + count: users.length ?? 0, + })} +

{showCreatePermissionModal && ( {
-
- - Role Name: {roleData.role.name} -
-
-
-
-
- -
- -

Permissions :

-
-
- - - - - - - - - Assign Permissions to selected Role - - - - List of all Permission's - -
-
- - - - Permission - Route - - - - {permissionsData.permission.map((permission, index) => ( - - - p.id === permission.id - )} - onChange={() => - handlePermissionToggle(permission) - } - disabled={permissions.some( - (p) => p.id === permission.id - )} - style={{ - width: "20px", - height: "20px", - border: "2px solid #FFFFFF", - marginRight: "10px", - }} - /> - - {permission.name} - - - {JSON.stringify(permission.metadata)} - - - ))} - -
-
- - - - - - -
-
-
{/* Table that display All permissions of a selected role */}
- + # Name Route diff --git a/src/admin/ui-components/organisms/assign-permissions-modal.tsx b/src/admin/ui-components/organisms/assign-permissions-modal.tsx new file mode 100644 index 000000000..820b97703 --- /dev/null +++ b/src/admin/ui-components/organisms/assign-permissions-modal.tsx @@ -0,0 +1,191 @@ +import React, { useCallback, useEffect, useState } from "react"; +import { useAdminCustomPost, useAdminCustomQuery } from "medusa-react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; + +import useNotification from "../hooks/use-notification"; + +import { CreateModalProps } from "./types"; +import Modal from "../molecules/modal"; +import Button from "../fundamentals/button"; +import Table from "../molecules/table"; +import { TPermission } from "src/models/permission"; +import InputField from "../molecules/input"; +import { getErrorMessage } from "../utils/error-messages"; +import Spinner from "../atoms/spinner"; + +type PermissionListElement = { + entity: TPermission; + entityType: string; + tableElement: React.JSX.Element; +}; + +type AssignPermissionsModalProps = CreateModalProps & { + roleId: string; + selectedPermissionsId: Array; +}; + +type AssignPermissionModalFormData = { + permissions: Array<{ + id: string; + selected: boolean; + }>; +}; + +const AssignPermissionsModal: React.FC = ({ + handleClose, + roleId, + selectedPermissionsId, +}) => { + const notification = useNotification(); + const { t } = useTranslation(); + const [shownElements, setShownElements] = useState< + Array + >([]); + + const { + data, + isLoading: isFetchingPermissions, + error: errorFetchingPermissions, + } = useAdminCustomQuery("/roles/get-all-permissions", ["all-permissions"]); + + const { mutate: assignPermissions, isLoading } = useAdminCustomPost( + `/roles/update-permissions/${roleId}`, + ["assign-permissions-to-roles", roleId] + ); + + const { control, reset, handleSubmit } = + useForm({ + defaultValue: { + permissions: [], + }, + }); + + const { fields } = useFieldArray({ + control, + name: "permissions", + }); + + useEffect(() => { + if (data?.permission) { + reset({ + permissions: data.permission.map((permission) => ({ + id: permission.id, + selected: selectedPermissionsId.includes(permission.id), + })), + }); + } + }, [data, reset]); + + const onSubmit = ({ permissions }: AssignPermissionModalFormData) => { + const selectedPermissions = permissions + .filter((perm) => perm.selected) // Only keep selected ones + .map((perm) => data.permission.find((p) => p.id === perm.id)); + + console.log("Selected: ", selectedPermissions); + + assignPermissions(selectedPermissions, { + onSuccess: () => { + notification( + "Success", + `Assigned ${data.permission.length} permissions.`, + "success" + ); + handleClose(); + }, + onError: (error) => { + notification("Error", getErrorMessage(error), "error"); + }, + }); + }; + + const renderPermissionTableRows = useCallback(() => { + return fields.map((field, index) => ( + + + + + {data.permission[index].name} + + {JSON.stringify(data.permission[index].metadata)} + + + )); + }, [fields]); + + const handleUserSearch = (term: string) => { + setShownElements((prevState) => + prevState.filter( + (element) => + element.entity?.name.includes(term) || + JSON.stringify(element.entity?.metadata || "").includes(term) + ) + ); + }; + + if (isFetchingPermissions) { + return ; + } + + if (errorFetchingPermissions) { + return
Error: {errorFetchingPermissions.message}
; + } + + return ( + +
+ + + + {t("assign-permissions-modal-title", "Assign Permissions")} + + + +
+ + + + + {t("templates-name", "Name")} + + + {t("templates-route", "Route")} + + + + {renderPermissionTableRows()} +
+ + +
+ + +
+
+ + + + ); +}; + +export default AssignPermissionsModal; diff --git a/src/admin/ui-components/templates/permission-table.tsx b/src/admin/ui-components/templates/permission-table.tsx new file mode 100644 index 000000000..7045b5969 --- /dev/null +++ b/src/admin/ui-components/templates/permission-table.tsx @@ -0,0 +1,184 @@ +import { PlusMini, Trash } from "@medusajs/icons"; + +import { useAdminCustomDelete } from "medusa-react"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import { TPermission } from "src/models/permission"; +import useNotification from "../hooks/use-notification"; +import Table from "../molecules/table"; +import Actionables from "../molecules/actionables"; +import DeletePrompt from "../organisms/delete-prompt"; +import AssignPermissionsModal from "../organisms/assign-permissions-modal"; + +type PermissionListElement = { + entity: TPermission; + entityType: string; + tableElement: React.JSX.Element; +}; + +type PermissionTableProps = { + roleId: string; + permissions: Array; + triggerRefetch: () => void; +}; + +const PermissionTable: React.FC = ({ + roleId, + permissions, + triggerRefetch, +}) => { + const notification = useNotification(); + const { t } = useTranslation(); + + const [selectedPermissionId, setSelectedPermissionId] = useState< + string | null + >(null); + const [deletePermission, setDeletePermission] = useState(false); + const [showAssignPermissionsModal, setShowAssignPermissionsModal] = + useState(false); + const [elements, setElements] = useState>([]); + const [shownElements, setShownElements] = useState< + Array + >([]); + + const { mutate: removePermission } = useAdminCustomDelete( + `roles/remove-permissions/${roleId}/${selectedPermissionId}`, + ["remove-permissions"], + [], + { + onSuccess: () => { + notification( + t("templates-success", "Success"), + t( + "templates-permission-has-been-removed", + "Permission has been removed!" + ), + "success" + ); + triggerRefetch(); + }, + } + ); + + const handleClose = () => { + setSelectedPermissionId(null); + setDeletePermission(false); + }; + + const getPermissionTableRow = (permission: TPermission) => { + return ( + { + setDeletePermission(true); + setSelectedPermissionId(permission.id); + }, + icon: , + }, + ]} + className="h-12" + > + {permission.name} + {JSON.stringify(permission.metadata)} + + ); + }; + + useEffect(() => { + setElements([ + ...permissions.map((permission) => ({ + entity: permission, + entityType: "permission", + tableElement: getPermissionTableRow(permission), + })), + ]); + }, [permissions]); + + useEffect(() => { + setShownElements(elements); + }, [elements]); + + const handleUserSearch = (term: string) => { + setShownElements( + elements.filter( + (element) => + element.entity?.name.includes(term) || + JSON.stringify(element.entity?.metadata || "").includes(term) + ) + ); + }; + + const actionables = [ + { + label: t("roles-associate-permission", "Assign Permissions"), + onClick: () => { + setShowAssignPermissionsModal(true); + }, + icon: ( + + + + ), + }, + ]; + + return ( +
+ + } + > + + + + {t("templates-name", "Name")} + + + {t("templates-route", "Route")} + + + + + {shownElements.map((element) => element.tableElement)} + +
+ {showAssignPermissionsModal && ( + { + triggerRefetch(); + setShowAssignPermissionsModal(false); + }} + roleId={roleId} + selectedPermissionsId={permissions.map((permission) => permission.id)} + /> + )} + {selectedPermissionId && deletePermission && ( + { + await removePermission(); + }} + handleClose={handleClose} + /> + )} +
+ ); +}; + +export default PermissionTable; From 165ddb754acaed4c7c040c5de02f3966c50e567c Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Tue, 1 Oct 2024 23:08:19 -0500 Subject: [PATCH 10/21] feat: enabling searching over the permissions and full replace perms --- .../organisms/assign-permissions-modal.tsx | 111 +++++++++++------- src/services/role.ts | 10 +- 2 files changed, 72 insertions(+), 49 deletions(-) diff --git a/src/admin/ui-components/organisms/assign-permissions-modal.tsx b/src/admin/ui-components/organisms/assign-permissions-modal.tsx index 820b97703..1027295ec 100644 --- a/src/admin/ui-components/organisms/assign-permissions-modal.tsx +++ b/src/admin/ui-components/organisms/assign-permissions-modal.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { useAdminCustomPost, useAdminCustomQuery } from "medusa-react"; import { useFieldArray, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; @@ -9,15 +9,14 @@ import { CreateModalProps } from "./types"; import Modal from "../molecules/modal"; import Button from "../fundamentals/button"; import Table from "../molecules/table"; -import { TPermission } from "src/models/permission"; -import InputField from "../molecules/input"; import { getErrorMessage } from "../utils/error-messages"; import Spinner from "../atoms/spinner"; +import useDebounce from "../hooks/use-debounce"; -type PermissionListElement = { - entity: TPermission; - entityType: string; - tableElement: React.JSX.Element; +type FieldListElement = { + id: string; + selected: boolean; + index: number; }; type AssignPermissionsModalProps = CreateModalProps & { @@ -39,9 +38,10 @@ const AssignPermissionsModal: React.FC = ({ }) => { const notification = useNotification(); const { t } = useTranslation(); - const [shownElements, setShownElements] = useState< - Array - >([]); + const [shownElements, setShownElements] = useState([]); + const [searchTerm, setSearchTerm] = useState(""); + + const debouncedSearchTerm = useDebounce(searchTerm, 1000); const { data, @@ -66,6 +66,25 @@ const AssignPermissionsModal: React.FC = ({ name: "permissions", }); + const permissionByIndex = useCallback( + (index: number) => data?.permission[index], + [data] + ); + + const findPermissionById = useCallback( + (id: string) => data?.permission.find((p) => p.id === id), + [data] + ); + + const parsedFields = useMemo( + () => + fields.map((field, index) => ({ + ...field, + index, + })), + [fields] + ); + useEffect(() => { if (data?.permission) { reset({ @@ -77,12 +96,46 @@ const AssignPermissionsModal: React.FC = ({ } }, [data, reset]); + useEffect(() => { + setShownElements(parsedFields); + }, [fields]); + + useEffect(() => { + if (debouncedSearchTerm) { + const searchTermRegex = new RegExp(debouncedSearchTerm, "i"); + + const filteredElements = parsedFields.filter((_, index) => + searchTermRegex.test(permissionByIndex(index)?.name) + ); + + setShownElements(filteredElements); + } else setShownElements(parsedFields ?? []); + }, [data, debouncedSearchTerm]); + + const renderPermissionTableRows = useCallback( + () => + shownElements.map((field) => ( + + + + + {permissionByIndex(field.index)?.name} + + {JSON.stringify(permissionByIndex(field.index)?.metadata)} + + + )), + [shownElements] + ); + const onSubmit = ({ permissions }: AssignPermissionModalFormData) => { const selectedPermissions = permissions - .filter((perm) => perm.selected) // Only keep selected ones - .map((perm) => data.permission.find((p) => p.id === perm.id)); - - console.log("Selected: ", selectedPermissions); + .filter((perm) => perm.selected) + .map(({ id }) => findPermissionById(id)); assignPermissions(selectedPermissions, { onSuccess: () => { @@ -99,32 +152,8 @@ const AssignPermissionsModal: React.FC = ({ }); }; - const renderPermissionTableRows = useCallback(() => { - return fields.map((field, index) => ( - - - - - {data.permission[index].name} - - {JSON.stringify(data.permission[index].metadata)} - - - )); - }, [fields]); - - const handleUserSearch = (term: string) => { - setShownElements((prevState) => - prevState.filter( - (element) => - element.entity?.name.includes(term) || - JSON.stringify(element.entity?.metadata || "").includes(term) - ) - ); + const handlePermissionSearch = (term: string) => { + setSearchTerm(term); }; if (isFetchingPermissions) { @@ -145,7 +174,7 @@ const AssignPermissionsModal: React.FC = ({ - +
diff --git a/src/services/role.ts b/src/services/role.ts index 5e5e4bb58..fce478b1b 100644 --- a/src/services/role.ts +++ b/src/services/role.ts @@ -85,7 +85,7 @@ class RoleService extends TransactionBaseService { } async updateRolePermissions(id, updatedData) { - const roleRepo = this.manager_.withRepository(this.roleRpository_); + const roleRepo = this.manager_.withRepository(this.roleRepository_); const role = await roleRepo.findOne({ where: { id, @@ -93,13 +93,7 @@ class RoleService extends TransactionBaseService { relations: ["permissions"], // Load the existing permissions }); - if (role.permissions) { - // Append the updated permissions to the existing ones - role.permissions.push(...updatedData); - } else { - // If no existing permissions, assign the updated data - role.permissions = updatedData; - } + role.permissions = updatedData; // Save the updated role const result = await roleRepo.save(role); From defe5b0ad168ec04c7b0231d2d6e44f7234ff531 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 17:36:17 -0500 Subject: [PATCH 11/21] refactor: make associate user modal and remove from page --- src/admin/routes/role/page.tsx | 182 +------------ .../organisms/associate-users-modal.tsx | 236 +++++++++++++++++ .../ui-components/templates/user-table.tsx | 245 ++++++++++++++++++ src/api/routes/admin/role/associate-user.ts | 43 ++- src/services/role.ts | 13 +- 5 files changed, 530 insertions(+), 189 deletions(-) create mode 100644 src/admin/ui-components/organisms/associate-users-modal.tsx create mode 100644 src/admin/ui-components/templates/user-table.tsx diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index 1a519b1fd..43898c5e8 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -1,13 +1,5 @@ import { PlusMini } from "@medusajs/icons"; -import { - Button, - Container, - Text, - Drawer, - Label, - Input, - Table, -} from "@medusajs/ui"; +import { Button, Container, Table } from "@medusajs/ui"; import { useAdminCustomQuery, useAdminCustomPost } from "medusa-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -52,21 +44,6 @@ const SetPermission = () => { } }, [refetchFlag]); - // Hook#5 list all users - const { - data: usersData, - isLoading: userLoading, - error: userError, - refetch: refetchUser, - } = useAdminCustomQuery("/roles/getAllUsers", []); - - // Hooks# 6 update the role_id inside the user entity - const { - mutate: updateRoleInUser, - isLoading: updateRoleLoading, - error: updateRoleError, - } = useAdminCustomPost(`roles/${id}/user`, ["setRolestouser"]); - // Hook# 7 for removing the permission from a role const { mutate: removePermission, @@ -74,13 +51,6 @@ const SetPermission = () => { error: removePermissionerror, } = useAdminCustomPost(`roles/remove-permissions`, ["removePermissions"]); - // Hook# 8 for removing the users from role - const { - mutate: removeRoleUsers, - isLoading: removeRoleUsersloading, - error: removeRoleUserserror, - } = useAdminCustomPost(`roles/remove-users`, ["removeUsers"]); - // Hook 2 if (roleIsLoading) { return ; @@ -90,24 +60,6 @@ const SetPermission = () => { return
Error: {roleError.message}
; } - //Hook 4 - if (userLoading) { - return ; - } - - if (userError) { - return
Error: {userError.message}
; - } - - // Hook 5 - if (updateRoleLoading) { - return ; - } - - if (updateRoleError) { - return
Error: {updateRoleError.message}
; - } - // hook 7 if (removePermissionloading) { return ; @@ -117,15 +69,6 @@ const SetPermission = () => { return
Error: {removePermissionerror.message}
; } - // hook 8 - if (removeRoleUsersloading) { - return ; - } - - if (removeRoleUserserror) { - return
Error: {removeRoleUserserror.message}
; - } - const permissions = roleData.role.permissions; const users = roleData.role.users; @@ -143,20 +86,6 @@ const SetPermission = () => { } }; - const handleSelectedUser = () => { - const newIds = selectedUser.map((user) => user.id); - - for (const singleId of newIds) { - const abc = [singleId]; - console.log(abc); - updateRoleInUser(abc); - } - - // Clear selectedUser and close the drawer - setSelectedUser([]); - setDrawerOpen2(false); - }; - // Handle remove permission from a role const handleRemovePermission = (permission_id) => { @@ -167,16 +96,6 @@ const SetPermission = () => { removePermission(ids); }; - // Handle remove users from a role - - const handleRemoveUsers = (user_id) => { - const ids = { - user_id, - id, - }; - removeRoleUsers(ids); - }; - const actionables = [ { label: t("roles-create-permission", "Create Permission"), @@ -227,6 +146,7 @@ const SetPermission = () => { {t("roles-users-title", "Users")} { triggerRefetch(); @@ -290,102 +210,6 @@ const SetPermission = () => {
-
- -

Users :

-
-
-
- - - - - - - Assign Role - - - List of all user's -
- -
-
-
- - - First Name - Last Name - Email - - - - {usersData.users.map((user, index) => ( - - - p.id === user.id - )} - onChange={() => handleUsersToggle(user)} - disabled={users.some((p) => p.id === user.id)} - style={{ - width: "20px", - height: "20px", - border: "2px solid #FFFFFF", - marginRight: "10px", - }} - /> - - {user.name} - - {user.first_name} - {user.last_name} - {user.email} - - ))} - -
- - - - - - - - - - -
- -
-
@@ -408,7 +232,7 @@ const SetPermission = () => {
+ + + + + {t("templates-name", "Name")} + + + {t("templates-email", "Email")} + + + {t("templates-team-permissions", "Team permissions")} + + + + {renderUserTableRows()} +
+ + +
+ + +
+
+ + + + ); +}; + +export default AssociateUsersModal; diff --git a/src/admin/ui-components/templates/user-table.tsx b/src/admin/ui-components/templates/user-table.tsx new file mode 100644 index 000000000..2e7e67d43 --- /dev/null +++ b/src/admin/ui-components/templates/user-table.tsx @@ -0,0 +1,245 @@ +import { PlusMini, Trash } from "@medusajs/icons"; +import { User } from "@medusajs/medusa"; + +import { useAdminCustomDelete } from "medusa-react"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; + +import useNotification from "../hooks/use-notification"; +import SidebarTeamMember from "../molecules/sidebar-team-member"; +import Table from "../molecules/table"; +import DeletePrompt from "../organisms/delete-prompt"; +import Actionables from "../molecules/actionables"; +import AssociateUsersModal from "../organisms/associate-users-modal"; + +type UserListElement = { + entity: any; + entityType: string; + tableElement: React.JSX.Element; +}; + +type UserTableProps = { + roleId: string; + users: Array; + triggerRefetch: () => void; +}; + +const UserTable: React.FC = ({ + roleId, + users, + triggerRefetch, +}) => { + const notification = useNotification(); + const { t } = useTranslation(); + + const [selectedUserId, setSelectedUserId] = useState(null); + const [deleteUser, setDeleteUser] = useState(false); + const [showAssociateUsersModal, setShowAssociateUsersModal] = useState(false); + const [elements, setElements] = useState>([]); + const [shownElements, setShownElements] = useState>( + [] + ); + + const { mutate: removeUser } = useAdminCustomDelete( + `roles/remove-users/${roleId}/${selectedUserId}`, + ["remove-users"], + [], + { + onSuccess: () => { + notification( + t("templates-success", "Success"), + t("templates-user-has-been-removed", "User has been removed!"), + "success" + ); + triggerRefetch(); + }, + } + ); + + const handleClose = () => { + setDeleteUser(false); + setSelectedUserId(null); + }; + + const getUserTableRow = (user: User, index: number) => { + return ( + { + setDeleteUser(true); + setSelectedUserId(user); + }, + icon: , + }, + ]} + className="h-12" + > + + + + {user.email} + + {user.role.charAt(0).toUpperCase()} + {user.role.slice(1)} + + + ); + }; + + useEffect(() => { + setElements([ + ...users.map((user, i) => ({ + entity: user, + entityType: "user", + tableElement: getUserTableRow(user, i), + })), + ]); + }, [users]); + + useEffect(() => { + setShownElements(elements); + }, [elements]); + + const handleUserSearch = (term: string) => { + setShownElements( + elements.filter( + (e) => + e.entity?.first_name?.includes(term) || + e.entity?.last_name?.includes(term) || + e.entity?.email?.includes(term) || + e.entity?.user_email?.includes(term) + ) + ); + }; + + const filteringOptions = [ + { + title: "Team permissions", + options: [ + { + title: t("templates-all", "All"), + count: elements.length, + onClick: () => setShownElements(elements), + }, + { + title: t("templates-member", "Member"), + count: elements.filter( + (e) => e.entityType === "user" && e.entity.role === "member" + ).length, + onClick: () => + setShownElements( + elements.filter( + (e) => e.entityType === "user" && e.entity.role === "member" + ) + ), + }, + { + title: t("templates-admin", "Admin"), + count: elements.filter( + (e) => e.entityType === "user" && e.entity.role === "admin" + ).length, + onClick: () => + setShownElements( + elements.filter( + (e) => e.entityType === "user" && e.entity.role === "admin" + ) + ), + }, + { + title: t("templates-no-team-permissions", "No team permissions"), + count: elements.filter((e) => e.entityType === "invite").length, + onClick: () => + setShownElements(elements.filter((e) => e.entityType === "invite")), + }, + ], + }, + { + title: t("templates-status", "Status"), + options: [ + { + title: t("templates-all", "All"), + count: elements.length, + onClick: () => setShownElements(elements), + }, + { + title: t("templates-active", "Active"), + count: elements.filter((e) => e.entityType === "user").length, + onClick: () => + setShownElements(elements.filter((e) => e.entityType === "user")), + }, + ], + }, + ]; + + const actionables = [ + { + label: t("roles-associate-user", "Associate User"), + onClick: () => { + setShowAssociateUsersModal(true); + }, + icon: ( + + + + ), + }, + ]; + + return ( +
+ + } + > + + + + {t("templates-name", "Name")} + + + {t("templates-email", "Email")} + + + {t("templates-team-permissions", "Team permissions")} + + + + {shownElements.map((e) => e.tableElement)} +
+ {showAssociateUsersModal && ( + { + triggerRefetch(); + setShowAssociateUsersModal(false); + }} + roleId={roleId} + selectedUsersIds={users.map((user) => user.id)} + /> + )} + {selectedUserId && deleteUser && ( + { + await removeUser(); + }} + handleClose={handleClose} + /> + )} +
+ ); +}; + +export default UserTable; diff --git a/src/api/routes/admin/role/associate-user.ts b/src/api/routes/admin/role/associate-user.ts index 5eab9cc27..823881e2f 100644 --- a/src/api/routes/admin/role/associate-user.ts +++ b/src/api/routes/admin/role/associate-user.ts @@ -1,12 +1,47 @@ import { Request, Response } from "express"; + import RoleService from "../../../../services/role"; -export default async (req: Request, res: Response) => { +export default async (req: Request, res: Response): Promise => { // omitting validation for simplicity purposes const { id } = req.params; - const user_id = req.body; + const usersIds = req.body; const roleService = req.scope.resolve("roleService") as RoleService; - const role = await roleService.associateUser(id, user_id); - res.json(role); + if (!Array.isArray(usersIds)) { + res.status(400).json({ message: "userIds must be an array" }); + + return; + } + + try { + // Use Promise.allSettled to associate each userId with the role + const results = await Promise.allSettled( + usersIds.map((userId: string) => roleService.associateUser(id, userId)) + ); + + const fulfilled = results + .filter( + (result): result is PromiseFulfilledResult => + result.status === "fulfilled" + ) + .map((result) => result.value); + + const rejected = results + .filter( + (result): result is PromiseRejectedResult => + result.status === "rejected" + ) + .map((result) => result.reason); + + res.json({ + message: "Association results", + successfulAssociations: fulfilled, + failedAssociations: rejected, + }); + } catch (error) { + res + .status(500) + .json({ message: "An error occurred", error: error.message }); + } }; diff --git a/src/services/role.ts b/src/services/role.ts index fce478b1b..956ebb159 100644 --- a/src/services/role.ts +++ b/src/services/role.ts @@ -18,20 +18,20 @@ type InjectedDependencies = { }; class RoleService extends TransactionBaseService { - protected readonly roleRpository_: typeof RoleRepository; + protected readonly roleRepository_: typeof RoleRepository; protected readonly permissionService_: PermissionService; protected readonly userService_: UserService; constructor(container: InjectedDependencies) { super(container); - this.roleRpository_ = container.roleRepository; + this.roleRepository_ = container.roleRepository; this.permissionService_ = container.permissionService; this.userService_ = container.userService; } async listRoles(): Promise { - const roleRepo = this.manager_.withRepository(this.roleRpository_); + const roleRepo = this.manager_.withRepository(this.roleRepository_); return await roleRepo.find(); } @@ -49,11 +49,11 @@ class RoleService extends TransactionBaseService { } } - async retrieve1(id: string): Promise { + async retrieve(id: string): Promise { // for simplicity, we retrieve all relations // however, it's best to supply the relations // as an optional method parameter - const roleRepo = this.manager_.withRepository(this.roleRpository_); + const roleRepo = this.manager_.withRepository(this.roleRepository_); return await roleRepo.findOne({ where: { id, @@ -103,11 +103,12 @@ class RoleService extends TransactionBaseService { async associateUser(role_id: string, user_id: string): Promise { return this.atomicPhase_(async () => { + // omitting validation for simplicity await this.userService_.update(user_id, { role_id, }); - return await this.retrieve1(role_id); + return await this.retrieve(role_id); }); } From a471ba389fed9bbf6aaec18c7bb45f481710c5ee Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 21:01:44 -0500 Subject: [PATCH 12/21] chore: improve remove permission and users from role --- .../ui-components/templates/user-table.tsx | 6 +-- src/api/routes/admin/role/index.ts | 24 +++++++----- .../routes/admin/role/remove-permission.ts | 11 ++++++ src/api/routes/admin/role/remove-user.ts | 15 ++++---- src/api/routes/admin/role/removepermission.ts | 10 ----- src/models/role.ts | 5 +++ src/repositories/permission.ts | 12 +++--- src/services/role.ts | 38 +++++++++---------- src/services/user.ts | 28 ++++++-------- 9 files changed, 75 insertions(+), 74 deletions(-) create mode 100644 src/api/routes/admin/role/remove-permission.ts delete mode 100644 src/api/routes/admin/role/removepermission.ts diff --git a/src/admin/ui-components/templates/user-table.tsx b/src/admin/ui-components/templates/user-table.tsx index 2e7e67d43..866db0005 100644 --- a/src/admin/ui-components/templates/user-table.tsx +++ b/src/admin/ui-components/templates/user-table.tsx @@ -41,8 +41,8 @@ const UserTable: React.FC = ({ ); const { mutate: removeUser } = useAdminCustomDelete( - `roles/remove-users/${roleId}/${selectedUserId}`, - ["remove-users"], + `roles/${roleId}/remove-user/${selectedUserId}`, + ["remove-user "], [], { onSuccess: () => { @@ -72,7 +72,7 @@ const UserTable: React.FC = ({ variant: "danger", onClick: () => { setDeleteUser(true); - setSelectedUserId(user); + setSelectedUserId(user.id); }, icon: , }, diff --git a/src/api/routes/admin/role/index.ts b/src/api/routes/admin/role/index.ts index 6993b397c..7848d95ab 100644 --- a/src/api/routes/admin/role/index.ts +++ b/src/api/routes/admin/role/index.ts @@ -1,16 +1,17 @@ import { wrapHandler } from "@medusajs/utils"; import { Router } from "express"; + import create from "./create-role"; -import associateUser from "./associate-user"; +import associateUsers from "./associate-user"; import listRoles from "./get-roles"; import listPermissions from "./get-permission"; import reterieve1 from "./getRoleById"; -import updateRolePermissions from "./updateRolePermissions"; +import assignPermissions from "./update-role-permissions"; import createPermission from "./createPermission"; -import list from "./getAllUsers"; +import listUsers from "./getAllUsers"; import deleteRole from "./delete-role"; -import removePermission from "./removepermission"; -import removeUsersfromRole from "./remove-user"; +import removePermission from "./remove-permission"; +import removeUser from "./remove-user"; const router = Router(); @@ -23,11 +24,14 @@ export default (adminRouter: Router) => { router.get("/get-all-permissions", wrapHandler(listPermissions)); router.post("/create-permission", wrapHandler(createPermission)); - router.post("/update-permissions/:id", wrapHandler(updateRolePermissions)); + router.post("/update-permissions/:id", wrapHandler(assignPermissions)); router.get("/get-rolepermissions/:id", wrapHandler(reterieve1)); - router.post("/remove-permissions", wrapHandler(removePermission)); + router.delete( + "/remove-permissions/:id/:permissionId", + wrapHandler(removePermission) + ); - router.post("/:id/user", wrapHandler(associateUser)); - router.get("/getAllUsers", wrapHandler(list)); - router.post("/remove-users", wrapHandler(removeUsersfromRole)); + router.get("/get-all-users", wrapHandler(listUsers)); + router.post("/:id/update-users", wrapHandler(associateUsers)); + router.delete("/:id/remove-user/:userId", wrapHandler(removeUser)); }; diff --git a/src/api/routes/admin/role/remove-permission.ts b/src/api/routes/admin/role/remove-permission.ts new file mode 100644 index 000000000..0dddc1bf7 --- /dev/null +++ b/src/api/routes/admin/role/remove-permission.ts @@ -0,0 +1,11 @@ +import { Request, Response } from "express"; + +import RoleService from "../../../../services/role"; + +export default async (req: Request, res: Response) => { + const { id, permissionId } = req.params; + const roleService = req.scope.resolve("roleService") as RoleService; + const role = await roleService.removePermission(id, permissionId); + + res.json({ role }); +}; diff --git a/src/api/routes/admin/role/remove-user.ts b/src/api/routes/admin/role/remove-user.ts index 96d7006ca..bc25f9047 100644 --- a/src/api/routes/admin/role/remove-user.ts +++ b/src/api/routes/admin/role/remove-user.ts @@ -1,12 +1,11 @@ import { Request, Response } from "express"; -import UserService from "../../../../services/user" -export default async (req: Request, res: Response) =>{ - const { user_id, id } = req.body; - const userService = req.scope.resolve("userService") as UserService; - const role = await userService.removeUsersfromRole(user_id,id); - - res.json({role}); -} +import UserService from "../../../../services/user"; +export default async (req: Request, res: Response) => { + const { id, userId } = req.params; + const userService = req.scope.resolve("userService") as UserService; + const role = await userService.removeUsersFromRole(userId, id); + res.json({ role }); +}; diff --git a/src/api/routes/admin/role/removepermission.ts b/src/api/routes/admin/role/removepermission.ts deleted file mode 100644 index abb9d21b8..000000000 --- a/src/api/routes/admin/role/removepermission.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Request, Response } from "express"; -import RoleService from "../../../../services/role"; - -export default async (req: Request, res: Response) =>{ - const { role_id, permission_id } = req.body; - const roleService = req.scope.resolve("roleService") as RoleService; - const role = await roleService.removePermission(role_id,permission_id); - - res.json({role}); -} \ No newline at end of file diff --git a/src/models/role.ts b/src/models/role.ts index 9c35a4b97..d97654680 100644 --- a/src/models/role.ts +++ b/src/models/role.ts @@ -44,3 +44,8 @@ export class Role extends BaseEntity { export type TRole = Role & { id: string; }; + +export type TRoleWithCounts = Omit & { + permissions: Array; + usersCount: number; +}; diff --git a/src/repositories/permission.ts b/src/repositories/permission.ts index 9bed3b684..99c307e2e 100644 --- a/src/repositories/permission.ts +++ b/src/repositories/permission.ts @@ -1,9 +1,7 @@ -import { Permission } from "../models/permission" -import { - dataSource, -} from "@medusajs/medusa/dist/loaders/database" +import { dataSource } from "@medusajs/medusa/dist/loaders/database"; -export const PermissionRepository = dataSource - .getRepository(Permission) +import { Permission } from "../models/permission"; -export default PermissionRepository \ No newline at end of file +export const PermissionRepository = dataSource.getRepository(Permission); + +export default PermissionRepository; diff --git a/src/services/role.ts b/src/services/role.ts index 956ebb159..43301b319 100644 --- a/src/services/role.ts +++ b/src/services/role.ts @@ -112,31 +112,31 @@ class RoleService extends TransactionBaseService { }); } - async removePermission(role_id, permission_id) { - const roleRepo = this.manager_.withRepository(this.roleRpository_); - - const role = await this.retrieve1(role_id); - - if (!role) { - return false; - } + async removePermission(roleId, permissionId) { + const roleRepo = this.manager_.withRepository(this.roleRepository_); - const permissionIndex = role.permissions.findIndex( - (p) => p.id === permission_id - ); + const role = await roleRepo.findOne({ + where: { id: roleId }, + relations: ["permissions"], + }); - if (permissionIndex === -1) { - return false; - } + if (role) { + const permissionIndex = role.permissions.findIndex( + (permission) => permission.id === permissionId + ); - role.permissions.splice(permissionIndex, 1); + if (permissionIndex === -1) { + throw new Error("Permission not found"); + } - await roleRepo.save(role); + role.permissions.splice(permissionIndex, 1); - return true; + await roleRepo.save(role); + } else { + // Handle the case where the role with the given ID doesn't exist + throw new Error("Role not found"); + } } - - } export default RoleService; diff --git a/src/services/user.ts b/src/services/user.ts index 96b81377c..70bfc2234 100644 --- a/src/services/user.ts +++ b/src/services/user.ts @@ -16,29 +16,23 @@ class UserService extends MedusaUserService { return await userRepo.find(); } - async removeUsersfromRole(user_id, role_idToRemove) { + async removeUsersFromRole(userId, roleId) { const userRepo = this.activeManager_.getRepository(User); + const user = await userRepo.findOne({ where: { - id: user_id, + id: userId, }, }); - - if (!user) { - return false; - } - - if (user.role_id === role_idToRemove) { - user.role_id = null; - - await userRepo.save(user); - - return true; - } - - return false; + + if (user) { + if (user.role_id === roleId) { + user.role_id = null; + + await userRepo.save(user); + } else throw new Error("User has not such role"); + } else throw new Error("User not found"); } - } export default UserService; From deae24e8e44280092a5afd1aa7fa838bd902fb1e Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 21:04:42 -0500 Subject: [PATCH 13/21] chore: show role's permissions labels and users count --- .../ui-components/templates/role-table.tsx | 15 +++++-------- src/services/role.ts | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/admin/ui-components/templates/role-table.tsx b/src/admin/ui-components/templates/role-table.tsx index 8b5ad15bc..d2034b38e 100644 --- a/src/admin/ui-components/templates/role-table.tsx +++ b/src/admin/ui-components/templates/role-table.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; -import type { TRole } from "src/models/role"; +import type { TRole, TRoleWithCounts } from "src/models/role"; import useNotification from "../hooks/use-notification"; import Table from "../molecules/table"; @@ -54,7 +54,7 @@ const RoleTable: React.FC = ({ roles, triggerRefetch }) => { setDeleteRole(false); }; - const getRoleTableRow = (role: TRole) => { + const getRoleTableRow = (role: TRoleWithCounts) => { return ( = ({ roles, triggerRefetch }) => { > {role.name} - {/* TODO
    {role.permissions.map((permission) => ( -
  • {permission.name}
  • +
  • {permission}
  • ))} -
*/} -
- - {/* TODO - {role.users.length} - */} + + {role.usersCount}
); diff --git a/src/services/role.ts b/src/services/role.ts index 43301b319..238e7f518 100644 --- a/src/services/role.ts +++ b/src/services/role.ts @@ -30,9 +30,26 @@ class RoleService extends TransactionBaseService { this.userService_ = container.userService; } - async listRoles(): Promise { + async listRoles(): Promise> { const roleRepo = this.manager_.withRepository(this.roleRepository_); - return await roleRepo.find(); + const roles = await roleRepo.find({ + relations: ["permissions", "users"], + }); + + const rolesWithCounts = roles.map(({ permissions, users, ...rest }) => { + const permissionsLabels = permissions?.map( + (permission) => permission.name + ); + const usersCount = users ? users.length : 0; + + return { + ...rest, + permissions: permissionsLabels, + usersCount, + }; + }); + + return rolesWithCounts; } async deleteRole(id) { From d283e6f333e40afb59a0524aed1561399c0ea842 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 21:06:44 -0500 Subject: [PATCH 14/21] fix: adding types and small fixes --- src/admin/settings/user-roles/page.tsx | 2 +- .../organisms/assign-permissions-modal.tsx | 31 +++++++++---------- src/admin/ui-components/organisms/types.ts | 13 +++++++- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/admin/settings/user-roles/page.tsx b/src/admin/settings/user-roles/page.tsx index 397d93389..f47e0b0da 100644 --- a/src/admin/settings/user-roles/page.tsx +++ b/src/admin/settings/user-roles/page.tsx @@ -35,7 +35,7 @@ const CustomSettingPage = () => { }, [refetchFlag]); if (isLoading) { - return ; + return ; } if (error) { diff --git a/src/admin/ui-components/organisms/assign-permissions-modal.tsx b/src/admin/ui-components/organisms/assign-permissions-modal.tsx index 1027295ec..fc176fbd9 100644 --- a/src/admin/ui-components/organisms/assign-permissions-modal.tsx +++ b/src/admin/ui-components/organisms/assign-permissions-modal.tsx @@ -3,42 +3,39 @@ import { useAdminCustomPost, useAdminCustomQuery } from "medusa-react"; import { useFieldArray, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; +import Spinner from "../atoms/spinner"; +import useDebounce from "../hooks/use-debounce"; import useNotification from "../hooks/use-notification"; - -import { CreateModalProps } from "./types"; import Modal from "../molecules/modal"; import Button from "../fundamentals/button"; import Table from "../molecules/table"; import { getErrorMessage } from "../utils/error-messages"; -import Spinner from "../atoms/spinner"; -import useDebounce from "../hooks/use-debounce"; -type FieldListElement = { - id: string; - selected: boolean; - index: number; -}; +import { + BooleanIdFieldArray, + CreateModalProps, + FieldListElement, +} from "./types"; type AssignPermissionsModalProps = CreateModalProps & { roleId: string; - selectedPermissionsId: Array; + selectedPermissionsIds: Array; }; type AssignPermissionModalFormData = { - permissions: Array<{ - id: string; - selected: boolean; - }>; + permissions: BooleanIdFieldArray; }; const AssignPermissionsModal: React.FC = ({ handleClose, roleId, - selectedPermissionsId, + selectedPermissionsIds, }) => { const notification = useNotification(); const { t } = useTranslation(); - const [shownElements, setShownElements] = useState([]); + const [shownElements, setShownElements] = useState>( + [] + ); const [searchTerm, setSearchTerm] = useState(""); const debouncedSearchTerm = useDebounce(searchTerm, 1000); @@ -90,7 +87,7 @@ const AssignPermissionsModal: React.FC = ({ reset({ permissions: data.permission.map((permission) => ({ id: permission.id, - selected: selectedPermissionsId.includes(permission.id), + selected: selectedPermissionsIds.includes(permission.id), })), }); } diff --git a/src/admin/ui-components/organisms/types.ts b/src/admin/ui-components/organisms/types.ts index 21242aee7..f4bbf95aa 100644 --- a/src/admin/ui-components/organisms/types.ts +++ b/src/admin/ui-components/organisms/types.ts @@ -2,4 +2,15 @@ type CreateModalProps = { handleClose: () => void; }; -export type { CreateModalProps }; +type FieldListElement = { + id: string; + selected: boolean; + index: number; +}; + +type BooleanIdFieldArray = Array<{ + id: string; + selected: boolean; +}>; + +export type { BooleanIdFieldArray, CreateModalProps, FieldListElement }; From 92349bcca1eba2e6e7b78ba4967baa14c0893b66 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 22:00:12 -0500 Subject: [PATCH 15/21] chore: debounce search term --- .../ui-components/hooks/use-debounce.tsx | 19 ++++++++++++ .../organisms/assign-permissions-modal.tsx | 2 +- .../organisms/associate-users-modal.tsx | 2 +- .../templates/permission-table.tsx | 30 ++++++++++++------- .../ui-components/templates/role-table.tsx | 22 ++++++++++---- .../ui-components/templates/user-table.tsx | 30 +++++++++++++------ 6 files changed, 79 insertions(+), 26 deletions(-) create mode 100644 src/admin/ui-components/hooks/use-debounce.tsx diff --git a/src/admin/ui-components/hooks/use-debounce.tsx b/src/admin/ui-components/hooks/use-debounce.tsx new file mode 100644 index 000000000..511c18802 --- /dev/null +++ b/src/admin/ui-components/hooks/use-debounce.tsx @@ -0,0 +1,19 @@ +import { useState, useEffect } from "react"; + +const useDebounce = (value: T, delay: number): T => { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(handler); + }; + }, [value, delay]); + + return debouncedValue; +}; + +export default useDebounce; diff --git a/src/admin/ui-components/organisms/assign-permissions-modal.tsx b/src/admin/ui-components/organisms/assign-permissions-modal.tsx index fc176fbd9..8930afb61 100644 --- a/src/admin/ui-components/organisms/assign-permissions-modal.tsx +++ b/src/admin/ui-components/organisms/assign-permissions-modal.tsx @@ -38,7 +38,7 @@ const AssignPermissionsModal: React.FC = ({ ); const [searchTerm, setSearchTerm] = useState(""); - const debouncedSearchTerm = useDebounce(searchTerm, 1000); + const debouncedSearchTerm = useDebounce(searchTerm, 500); const { data, diff --git a/src/admin/ui-components/organisms/associate-users-modal.tsx b/src/admin/ui-components/organisms/associate-users-modal.tsx index c51783592..0c1d1fd29 100644 --- a/src/admin/ui-components/organisms/associate-users-modal.tsx +++ b/src/admin/ui-components/organisms/associate-users-modal.tsx @@ -39,7 +39,7 @@ const AssociateUsersModal: React.FC = ({ ); const [searchTerm, setSearchTerm] = useState(""); - const debouncedSearchTerm = useDebounce(searchTerm, 1000); + const debouncedSearchTerm = useDebounce(searchTerm, 500); const { data, diff --git a/src/admin/ui-components/templates/permission-table.tsx b/src/admin/ui-components/templates/permission-table.tsx index 7045b5969..97e01807d 100644 --- a/src/admin/ui-components/templates/permission-table.tsx +++ b/src/admin/ui-components/templates/permission-table.tsx @@ -5,6 +5,7 @@ import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { TPermission } from "src/models/permission"; +import useDebounce from "../hooks/use-debounce"; import useNotification from "../hooks/use-notification"; import Table from "../molecules/table"; import Actionables from "../molecules/actionables"; @@ -41,6 +42,9 @@ const PermissionTable: React.FC = ({ const [shownElements, setShownElements] = useState< Array >([]); + const [searchTerm, setSearchTerm] = useState(""); + + const debouncedSearchTerm = useDebounce(searchTerm, 500); const { mutate: removePermission } = useAdminCustomDelete( `roles/remove-permissions/${roleId}/${selectedPermissionId}`, @@ -104,14 +108,18 @@ const PermissionTable: React.FC = ({ setShownElements(elements); }, [elements]); - const handleUserSearch = (term: string) => { - setShownElements( - elements.filter( - (element) => - element.entity?.name.includes(term) || - JSON.stringify(element.entity?.metadata || "").includes(term) - ) - ); + useEffect(() => { + if (debouncedSearchTerm) { + const searchTermRegex = new RegExp(debouncedSearchTerm, "i"); + + setShownElements( + elements.filter((element) => searchTermRegex.test(element.entity?.name)) + ); + } else setShownElements(elements); + }, [permissions, debouncedSearchTerm]); + + const handlePermissionSearch = (term: string) => { + setSearchTerm(term); }; const actionables = [ @@ -132,7 +140,7 @@ const PermissionTable: React.FC = ({
} @@ -158,7 +166,9 @@ const PermissionTable: React.FC = ({ setShowAssignPermissionsModal(false); }} roleId={roleId} - selectedPermissionsId={permissions.map((permission) => permission.id)} + selectedPermissionsIds={permissions.map( + (permission) => permission.id + )} /> )} {selectedPermissionId && deletePermission && ( diff --git a/src/admin/ui-components/templates/role-table.tsx b/src/admin/ui-components/templates/role-table.tsx index d2034b38e..7ce813154 100644 --- a/src/admin/ui-components/templates/role-table.tsx +++ b/src/admin/ui-components/templates/role-table.tsx @@ -6,6 +6,7 @@ import { useNavigate } from "react-router-dom"; import type { TRole, TRoleWithCounts } from "src/models/role"; +import useDebounce from "../hooks/use-debounce"; import useNotification from "../hooks/use-notification"; import Table from "../molecules/table"; import DeletePrompt from "../organisms/delete-prompt"; @@ -32,6 +33,9 @@ const RoleTable: React.FC = ({ roles, triggerRefetch }) => { const [shownElements, setShownElements] = useState>( [] ); + const [searchTerm, setSearchTerm] = useState(""); + + const debouncedSearchTerm = useDebounce(searchTerm, 500); const { mutate: removeRole } = useAdminCustomDelete( `/roles/delete-role/${selectedRoleId}`, @@ -104,15 +108,23 @@ const RoleTable: React.FC = ({ roles, triggerRefetch }) => { setShownElements(elements); }, [elements]); - const handleUserSearch = (term: string) => { - setShownElements((prevElements) => - prevElements.filter((element) => element.entity?.name?.includes(term)) - ); + useEffect(() => { + if (debouncedSearchTerm) { + const searchTermRegex = new RegExp(debouncedSearchTerm, "i"); + + setShownElements( + elements.filter((element) => searchTermRegex.test(element.entity?.name)) + ); + } else setShownElements(elements); + }, [roles, debouncedSearchTerm]); + + const handleRoleSearch = (term: string) => { + setSearchTerm(term); }; return (
-
+
diff --git a/src/admin/ui-components/templates/user-table.tsx b/src/admin/ui-components/templates/user-table.tsx index 866db0005..07fff1df6 100644 --- a/src/admin/ui-components/templates/user-table.tsx +++ b/src/admin/ui-components/templates/user-table.tsx @@ -5,6 +5,7 @@ import { useAdminCustomDelete } from "medusa-react"; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; +import useDebounce from "../hooks/use-debounce"; import useNotification from "../hooks/use-notification"; import SidebarTeamMember from "../molecules/sidebar-team-member"; import Table from "../molecules/table"; @@ -39,6 +40,9 @@ const UserTable: React.FC = ({ const [shownElements, setShownElements] = useState>( [] ); + const [searchTerm, setSearchTerm] = useState(""); + + const debouncedSearchTerm = useDebounce(searchTerm, 500); const { mutate: removeUser } = useAdminCustomDelete( `roles/${roleId}/remove-user/${selectedUserId}`, @@ -105,16 +109,24 @@ const UserTable: React.FC = ({ setShownElements(elements); }, [elements]); + useEffect(() => { + if (debouncedSearchTerm) { + const searchTermRegex = new RegExp(debouncedSearchTerm, "i"); + + setShownElements( + elements.filter( + (element) => + searchTermRegex.test(element.entity?.first_name) || + searchTermRegex.test(element.entity?.last_name) || + searchTermRegex.test(element.entity?.email) || + searchTermRegex.test(element.entity?.user_email) + ) + ); + } else setShownElements(elements); + }, [users, debouncedSearchTerm]); + const handleUserSearch = (term: string) => { - setShownElements( - elements.filter( - (e) => - e.entity?.first_name?.includes(term) || - e.entity?.last_name?.includes(term) || - e.entity?.email?.includes(term) || - e.entity?.user_email?.includes(term) - ) - ); + setSearchTerm(term); }; const filteringOptions = [ From 5949cd4bfe63834c7e19e8224efc4b6d29bac2be Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 22:30:35 -0500 Subject: [PATCH 16/21] chore: rename files, format and fix routes --- src/admin/routes/role/page.tsx | 2 +- src/api/routes/admin/index.ts | 4 +++- ...reatePermission.ts => create-permission.ts} | 0 src/api/routes/admin/role/create-role.ts | 1 + src/api/routes/admin/role/delete-role.ts | 1 + .../role/{getAllUsers.ts => get-all-users.ts} | 10 ++++++---- src/api/routes/admin/role/get-permission.ts | 12 +++++++----- .../role/{getRoleById.ts => get-role-by-id.ts} | 10 +++++----- src/api/routes/admin/role/get-roles.ts | 7 ++++--- src/api/routes/admin/role/index.ts | 18 +++++++++--------- ...rmissions.ts => update-role-permissions.ts} | 1 + 11 files changed, 38 insertions(+), 28 deletions(-) rename src/api/routes/admin/role/{createPermission.ts => create-permission.ts} (100%) rename src/api/routes/admin/role/{getAllUsers.ts => get-all-users.ts} (53%) rename src/api/routes/admin/role/{getRoleById.ts => get-role-by-id.ts} (50%) rename src/api/routes/admin/role/{updateRolePermissions.ts => update-role-permissions.ts} (99%) diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index 43898c5e8..6e52fbac4 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -29,7 +29,7 @@ const SetPermission = () => { isLoading: roleIsLoading, error: roleError, refetch, - } = useAdminCustomQuery(`/roles/get-rolepermissions/${id}`, [ + } = useAdminCustomQuery(`/roles/get-role-permissions/${id}`, [ "getRolePermissions", ]); diff --git a/src/api/routes/admin/index.ts b/src/api/routes/admin/index.ts index 4e31fb797..f98791417 100644 --- a/src/api/routes/admin/index.ts +++ b/src/api/routes/admin/index.ts @@ -1,7 +1,9 @@ import { Router } from "express"; import { wrapHandler } from "@medusajs/medusa"; + import customRouteHandler from "./custom-route-handler"; -import roleRouter from "./role" +import roleRouter from "./role"; + // Initialize a custom router const router = Router(); diff --git a/src/api/routes/admin/role/createPermission.ts b/src/api/routes/admin/role/create-permission.ts similarity index 100% rename from src/api/routes/admin/role/createPermission.ts rename to src/api/routes/admin/role/create-permission.ts diff --git a/src/api/routes/admin/role/create-role.ts b/src/api/routes/admin/role/create-role.ts index 14dfa6bf7..aff67a56f 100644 --- a/src/api/routes/admin/role/create-role.ts +++ b/src/api/routes/admin/role/create-role.ts @@ -1,4 +1,5 @@ import { Request, Response } from "express"; + import RoleService from "../../../../services/role"; export default async (req: Request, res: Response) => { diff --git a/src/api/routes/admin/role/delete-role.ts b/src/api/routes/admin/role/delete-role.ts index b7d396a33..f29b98674 100644 --- a/src/api/routes/admin/role/delete-role.ts +++ b/src/api/routes/admin/role/delete-role.ts @@ -1,4 +1,5 @@ import { Request, Response } from "express"; + import RoleService from "../../../../services/role"; export default async (req: Request, res: Response) => { diff --git a/src/api/routes/admin/role/getAllUsers.ts b/src/api/routes/admin/role/get-all-users.ts similarity index 53% rename from src/api/routes/admin/role/getAllUsers.ts rename to src/api/routes/admin/role/get-all-users.ts index f62f94914..a899f71fa 100644 --- a/src/api/routes/admin/role/getAllUsers.ts +++ b/src/api/routes/admin/role/get-all-users.ts @@ -1,8 +1,10 @@ import { Request, Response } from "express"; -import UserService from "../../../../services/user" -export default async (req: Request, res: Response) =>{ + +import UserService from "../../../../services/user"; + +export default async (req: Request, res: Response) => { const userService = req.scope.resolve("userService") as UserService; const users = await userService.list(); - res.json({users}); -} \ No newline at end of file + res.json({ users }); +}; diff --git a/src/api/routes/admin/role/get-permission.ts b/src/api/routes/admin/role/get-permission.ts index 5c7586cd0..529272618 100644 --- a/src/api/routes/admin/role/get-permission.ts +++ b/src/api/routes/admin/role/get-permission.ts @@ -1,10 +1,12 @@ import { Request, Response } from "express"; + import PermissionService from "../../../../services/permission"; -export default async (req: Request, res: Response) =>{ - const permissionService = req.scope.resolve("permissionService") as PermissionService; +export default async (req: Request, res: Response) => { + const permissionService = req.scope.resolve( + "permissionService" + ) as PermissionService; const permission = await permissionService.listPermission(); - res.json({permission}); -} - + res.json({ permission }); +}; diff --git a/src/api/routes/admin/role/getRoleById.ts b/src/api/routes/admin/role/get-role-by-id.ts similarity index 50% rename from src/api/routes/admin/role/getRoleById.ts rename to src/api/routes/admin/role/get-role-by-id.ts index 5883e6cd8..ea1087143 100644 --- a/src/api/routes/admin/role/getRoleById.ts +++ b/src/api/routes/admin/role/get-role-by-id.ts @@ -1,10 +1,10 @@ import { Request, Response } from "express"; import RoleService from "../../../../services/role"; -export default async (req: Request, res: Response) =>{ - const id = req.params.id as string; +export default async (req: Request, res: Response) => { + const id = req.params.id as string; const roleService = req.scope.resolve("roleService") as RoleService; - const role = await roleService.retrieve1(id); + const role = await roleService.retrieve(id); - res.json({role}); -} \ No newline at end of file + res.json({ role }); +}; diff --git a/src/api/routes/admin/role/get-roles.ts b/src/api/routes/admin/role/get-roles.ts index bbdf0bffc..30042f5c5 100644 --- a/src/api/routes/admin/role/get-roles.ts +++ b/src/api/routes/admin/role/get-roles.ts @@ -1,9 +1,10 @@ import { Request, Response } from "express"; + import RoleService from "../../../../services/role"; -export default async (req: Request, res: Response) =>{ +export default async (req: Request, res: Response) => { const roleService = req.scope.resolve("roleService") as RoleService; const role = await roleService.listRoles(); - res.json({role}); -} + res.json({ role }); +}; diff --git a/src/api/routes/admin/role/index.ts b/src/api/routes/admin/role/index.ts index 7848d95ab..912f357f5 100644 --- a/src/api/routes/admin/role/index.ts +++ b/src/api/routes/admin/role/index.ts @@ -1,17 +1,17 @@ import { wrapHandler } from "@medusajs/utils"; import { Router } from "express"; -import create from "./create-role"; import associateUsers from "./associate-user"; -import listRoles from "./get-roles"; -import listPermissions from "./get-permission"; -import reterieve1 from "./getRoleById"; -import assignPermissions from "./update-role-permissions"; -import createPermission from "./createPermission"; -import listUsers from "./getAllUsers"; +import createRole from "./create-role"; +import createPermission from "./create-permission"; import deleteRole from "./delete-role"; +import listUsers from "./get-all-users"; +import listPermissions from "./get-permission"; +import listRoles from "./get-roles"; +import getRoleById from "./get-role-by-id"; import removePermission from "./remove-permission"; import removeUser from "./remove-user"; +import assignPermissions from "./update-role-permissions"; const router = Router(); @@ -19,13 +19,13 @@ export default (adminRouter: Router) => { adminRouter.use("/roles", router); router.get("/get-roles", wrapHandler(listRoles)); - router.post("/create-role", wrapHandler(create)); + router.post("/create-role", wrapHandler(createRole)); router.delete("/delete-role/:id", wrapHandler(deleteRole)); router.get("/get-all-permissions", wrapHandler(listPermissions)); + router.get("/get-role-permissions/:id", wrapHandler(getRoleById)); router.post("/create-permission", wrapHandler(createPermission)); router.post("/update-permissions/:id", wrapHandler(assignPermissions)); - router.get("/get-rolepermissions/:id", wrapHandler(reterieve1)); router.delete( "/remove-permissions/:id/:permissionId", wrapHandler(removePermission) diff --git a/src/api/routes/admin/role/updateRolePermissions.ts b/src/api/routes/admin/role/update-role-permissions.ts similarity index 99% rename from src/api/routes/admin/role/updateRolePermissions.ts rename to src/api/routes/admin/role/update-role-permissions.ts index 783f776f2..990cd7faa 100644 --- a/src/api/routes/admin/role/updateRolePermissions.ts +++ b/src/api/routes/admin/role/update-role-permissions.ts @@ -1,4 +1,5 @@ import { Request, Response } from "express"; + import RoleService from "../../../../services/role"; export default async (req: Request, res: Response) => { From c49e1a1f5564614361a7d7a2b36f1b5238f2bd48 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 22:33:57 -0500 Subject: [PATCH 17/21] chore: update middleware --- src/api/index.ts | 6 +- src/api/middlewares/permission.ts | 77 +++++++++++--------- src/api/routes/admin/custom-route-handler.ts | 6 +- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index 8b1d76745..386c98b77 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -5,9 +5,7 @@ import { authenticate, ConfigModule } from "@medusajs/medusa"; import { getConfigFile } from "medusa-core-utils"; import { attachStoreRoutes } from "./routes/store"; import { attachAdminRoutes } from "./routes/admin"; -import permissionMiddleware from "./middlewares/permission"; - - +import { permissions as permissionsMiddleware } from "./middlewares/permission"; export default (rootDirectory: string): Router | Router[] => { // Read currently-loaded medusa config @@ -50,7 +48,7 @@ export default (rootDirectory: string): Router | Router[] => { router.use("/admin", adminRouter); // Attach the permission middleware to the adminRouter - adminRouter.use(permissionMiddleware); + adminRouter.use(permissionsMiddleware); // Attach custom routes to these routers attachStoreRoutes(storeRouter); diff --git a/src/api/middlewares/permission.ts b/src/api/middlewares/permission.ts index f7d8fc008..862084f3e 100644 --- a/src/api/middlewares/permission.ts +++ b/src/api/middlewares/permission.ts @@ -1,51 +1,58 @@ -import { UserService } from "@medusajs/medusa" -import { NextFunction, Request, Response } from "express" +import type { MiddlewaresConfig, UserService } from "@medusajs/medusa"; +import type { + MedusaRequest, + MedusaResponse, + MedusaNextFunction, +} from "@medusajs/medusa"; -export default async ( - req: Request, - res: Response, - next: NextFunction +export const permissions = async ( + req: MedusaRequest, + res: MedusaResponse, + next: MedusaNextFunction ) => { if (!req.user || !req.user.userId) { - next() - return + next(); + return; } // retrieve currently logged-in user - const userService = req.scope.resolve( - "userService" - ) as UserService - const loggedInUser = await userService.retrieve( - req.user.userId, - { - select: ["id"], - relations: ["teamRole", "teamRole.permissions"], - }) + const userService = req.scope.resolve("userService") as UserService; + const loggedInUser = await userService.retrieve(req.user.userId, { + select: ["id"], + relations: ["teamRole", "teamRole.permissions"], + }); if (!loggedInUser.teamRole) { // considered as super user - next() - return + next(); + return; } - const isAllowed = loggedInUser.teamRole?.permissions.some( - (permission) => { - const metadataKey = Object.keys(permission.metadata).find( - (key) => key === req.path - ) - if (!metadataKey) { - return false - } - - // boolean value - return permission.metadata[metadataKey] + const isAllowed = loggedInUser.teamRole?.permissions.some((permission) => { + const metadataKey = Object.keys(permission.metadata).find( + (key) => key === req.path + ); + if (!metadataKey) { + return false; } - ) + + // boolean value + return permission.metadata[metadataKey]; + }); if (isAllowed) { - next() - return + next(); + return; } // deny access - res.sendStatus(401) -} \ No newline at end of file + res.sendStatus(401); +}; + +export const config: MiddlewaresConfig = { + routes: [ + { + matcher: "/admin/*", + middlewares: [permissions], + }, + ], +}; diff --git a/src/api/routes/admin/custom-route-handler.ts b/src/api/routes/admin/custom-route-handler.ts index de9530df6..edc1d8a04 100644 --- a/src/api/routes/admin/custom-route-handler.ts +++ b/src/api/routes/admin/custom-route-handler.ts @@ -1,5 +1,5 @@ -import { Request, Response } from 'express' +import { Request, Response } from "express"; export default async (req: Request, res: Response): Promise => { - res.sendStatus(200) -} + res.sendStatus(200); +}; From 1442831155c6179dc2fcead5f6204ea923ea8400 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 22:38:01 -0500 Subject: [PATCH 18/21] chore: format fixes for resting files --- src/index.ts | 4 ++-- src/models/user.ts | 40 +++++++++++++++++----------------------- src/repositories/role.ts | 12 +++++------- src/services/role.ts | 35 +++++++++++++++++------------------ 4 files changed, 41 insertions(+), 50 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3c89a477e..f97252b14 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { Role } from "./models/role"; - declare module "@medusajs/medusa/dist/models/user" { - interface User { +declare module "@medusajs/medusa/dist/models/user" { + interface User { role_id: string | null; teamRole: Role | null; } diff --git a/src/models/user.ts b/src/models/user.ts index 28146b205..94286bf18 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -1,23 +1,17 @@ -import { - Column, - Entity, - Index, - JoinColumn, - ManyToOne, - } from "typeorm" - import { - // alias the core entity to not cause a naming conflict - User as MedusaUser, - } from "@medusajs/medusa" - import { Role } from "./role" - - @Entity() - export class User extends MedusaUser { - @Index() - @Column({ nullable: true }) - role_id: string | null - - @ManyToOne(() => Role, (role) => role.users) - @JoinColumn({ name: "role_id" }) - teamRole: Role | null - } \ No newline at end of file +import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm"; +import { + // alias the core entity to not cause a naming conflict + User as MedusaUser, +} from "@medusajs/medusa"; +import { Role } from "./role"; + +@Entity() +export class User extends MedusaUser { + @Index() + @Column({ nullable: true }) + role_id: string | null; + + @ManyToOne(() => Role, (role) => role.users) + @JoinColumn({ name: "role_id" }) + teamRole: Role | null; +} diff --git a/src/repositories/role.ts b/src/repositories/role.ts index 3854cbe39..4f4328ea0 100644 --- a/src/repositories/role.ts +++ b/src/repositories/role.ts @@ -1,9 +1,7 @@ -import { Role } from "../models/role" -import { - dataSource, -} from "@medusajs/medusa/dist/loaders/database" +import { dataSource } from "@medusajs/medusa/dist/loaders/database"; -export const RoleRepository = dataSource - .getRepository(Role) +import { Role } from "../models/role"; -export default RoleRepository \ No newline at end of file +export const RoleRepository = dataSource.getRepository(Role); + +export default RoleRepository; diff --git a/src/services/role.ts b/src/services/role.ts index 238e7f518..c7d5fed41 100644 --- a/src/services/role.ts +++ b/src/services/role.ts @@ -1,11 +1,10 @@ import { TransactionBaseService } from "@medusajs/medusa"; -import { Role } from "../models/role"; +import { Role, TRoleWithCounts } from "../models/role"; import RoleRepository from "../repositories/role"; import PermissionService, { CreatePayload as PermissionCreatePayload, } from "./permission"; import UserService from "./user"; -import { Any } from "typeorm"; type CreatePayload = Pick & { permissions?: PermissionCreatePayload[]; @@ -79,26 +78,26 @@ class RoleService extends TransactionBaseService { }); } - async create(name: any) { - // return this.atomicPhase_(async (manager) => { - // omitting validation for simplicity - // const { permissions: permissionsData = [] } = data - // delete data.permissions + async create(data: CreatePayload): Promise { + return this.atomicPhase_(async (manager) => { + // omitting validation for simplicity + const { permissions: permissionsData = [] } = data; + delete data.permissions; - const roleRepo = this.manager_.withRepository(this.roleRpository_); - const role = roleRepo.create(name); + const roleRepo = manager.withRepository(this.roleRepository_); + const role = roleRepo.create(data); - // role.permissions = []; + role.permissions = []; - // for (const permissionData of permissionsData) { - // role.permissions.push( - // await this.permissionService_.create(permissionData) - // ); - // }{"/roles/get-roles": true} - const result = await roleRepo.save(role); + for (const permissionData of permissionsData) { + role.permissions.push( + await this.permissionService_.create(permissionData) + ); + } + const result = await roleRepo.save(role); - return result; - // }); + return await this.retrieve(result.id); + }); } async updateRolePermissions(id, updatedData) { From 37f464ae2096e96f098b48fe36a0de175f568561 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Wed, 2 Oct 2024 23:06:07 -0500 Subject: [PATCH 19/21] chore: clean pages --- src/admin/routes/role/page.tsx | 232 ++++++------------------- src/admin/settings/user-roles/page.tsx | 58 +++---- 2 files changed, 80 insertions(+), 210 deletions(-) diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index 6e52fbac4..6216200f9 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -1,6 +1,5 @@ import { PlusMini } from "@medusajs/icons"; -import { Button, Container, Table } from "@medusajs/ui"; -import { useAdminCustomQuery, useAdminCustomPost } from "medusa-react"; +import { useAdminCustomQuery } from "medusa-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; @@ -20,10 +19,6 @@ const SetPermission = () => { const [showCreatePermissionModal, setShowCreatePermissionModal] = useState(false); - const [selectedUser, setSelectedUser] = useState([]); - const [drawerOpen2, setDrawerOpen2] = useState(false); - - // Hook#2 for getting all permission of a single role const { data: roleData, isLoading: roleIsLoading, @@ -44,58 +39,17 @@ const SetPermission = () => { } }, [refetchFlag]); - // Hook# 7 for removing the permission from a role - const { - mutate: removePermission, - isLoading: removePermissionloading, - error: removePermissionerror, - } = useAdminCustomPost(`roles/remove-permissions`, ["removePermissions"]); - - // Hook 2 if (roleIsLoading) { - return ; + return ; } if (roleError) { return
Error: {roleError.message}
; } - // hook 7 - if (removePermissionloading) { - return ; - } - - if (removePermissionerror) { - return
Error: {removePermissionerror.message}
; - } - const permissions = roleData.role.permissions; const users = roleData.role.users; - // Here we handle the Selected Users - const handleUsersToggle = (user) => { - const selectedUserIds = selectedUser.map((p) => p.id); - - if (selectedUserIds.includes(user.id)) { - // Permission is already selected, remove it - const updatedUsers = selectedUser.filter((p) => p.id !== user.id); - setSelectedUser(updatedUsers); - } else { - // Permission is not selected, add it - setSelectedUser([...selectedUser, user]); - } - }; - - // Handle remove permission from a role - - const handleRemovePermission = (permission_id) => { - const ids = { - role_id: id, - permission_id, - }; - removePermission(ids); - }; - const actionables = [ { label: t("roles-create-permission", "Create Permission"), @@ -112,140 +66,58 @@ const SetPermission = () => { ]; return ( - <> -
-
- + + +
+

+ {t("roles-permissions-title", "Permissions")} +

+ { + triggerRefetch(); + }} /> - -
-

- {t("roles-permissions-title", "Permissions")} -

- { - triggerRefetch(); - }} - /> -

- {t("roles-permissions-count", "{{count}}", { - count: permissions.length ?? 0, - })} -

-

- {t("roles-users-title", "Users")} -

- { - triggerRefetch(); - }} - /> -

- {t("roles-users-count", "{{count}}", { - count: users.length ?? 0, - })} -

-
- {showCreatePermissionModal && ( - { - triggerRefetch(); - setShowCreatePermissionModal(false); - }} - /> - )} -
+

+ {t("roles-permissions-count", "{{count}}", { + count: permissions.length ?? 0, + })} +

+

+ {t("roles-users-title", "Users")} +

+ { + triggerRefetch(); + }} + /> +

+ {t("roles-users-count", "{{count}}", { + count: users.length ?? 0, + })} +

-
- -
- - {/* Table that display All permissions of a selected role */} -
-
- - - # - Name - Route - - - - - {permissions.map((permission, index) => ( - - {index + 1} - - {permission.name} - - {JSON.stringify(permission.metadata)} - - - - - - ))} - -
-
- -
- -
- - - - # - First Name - Last Name - Email - - - - - {users.map((user, index) => ( - - {index + 1} - {user.first_name} - {user.last_name} - {user.email} - - - - - ))} - -
-
-
-
- + {showCreatePermissionModal && ( + { + triggerRefetch(); + setShowCreatePermissionModal(false); + }} + /> + )} + +
); }; diff --git a/src/admin/settings/user-roles/page.tsx b/src/admin/settings/user-roles/page.tsx index f47e0b0da..d3f5e92c3 100644 --- a/src/admin/settings/user-roles/page.tsx +++ b/src/admin/settings/user-roles/page.tsx @@ -56,36 +56,34 @@ const CustomSettingPage = () => { return (
-
- - -
- -

- {t("roles-count", "{{count}}", { count: data.role.length ?? 0 })} -

-
- {showCreateRoleModal && ( - { - triggerRefetch(); - setShowCreateRoleModal(false); - }} - /> - )} -
-
+ + +
+ +

+ {t("roles-count", "{{count}}", { count: data.role.length ?? 0 })} +

+
+ {showCreateRoleModal && ( + { + triggerRefetch(); + setShowCreateRoleModal(false); + }} + /> + )} +
); }; From a732e6412966e8bbe5ed526f0af2f8ff49a8a7c6 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Thu, 3 Oct 2024 19:49:52 -0500 Subject: [PATCH 20/21] fix: revert cleaning on pages and adding missing query key --- src/admin/routes/role/page.tsx | 106 +++++++++++++------------ src/admin/settings/user-roles/page.tsx | 60 +++++++------- 2 files changed, 86 insertions(+), 80 deletions(-) diff --git a/src/admin/routes/role/page.tsx b/src/admin/routes/role/page.tsx index 6216200f9..c96032063 100644 --- a/src/admin/routes/role/page.tsx +++ b/src/admin/routes/role/page.tsx @@ -25,7 +25,7 @@ const SetPermission = () => { error: roleError, refetch, } = useAdminCustomQuery(`/roles/get-role-permissions/${id}`, [ - "getRolePermissions", + "get-role-permissions", ]); const triggerRefetch = () => { @@ -67,56 +67,60 @@ const SetPermission = () => { return (
- - -
-

- {t("roles-permissions-title", "Permissions")} -

- { - triggerRefetch(); - }} - /> -

- {t("roles-permissions-count", "{{count}}", { - count: permissions.length ?? 0, - })} -

-

- {t("roles-users-title", "Users")} -

- { - triggerRefetch(); - }} - /> -

- {t("roles-users-count", "{{count}}", { - count: users.length ?? 0, - })} -

-
- {showCreatePermissionModal && ( - { - triggerRefetch(); - setShowCreatePermissionModal(false); - }} - /> - )} -
+
+ + +
+

+ {t("roles-permissions-title", "Permissions")} +

+ { + triggerRefetch(); + }} + /> +

+ {t("roles-permissions-count", "{{count}}", { + count: permissions.length ?? 0, + })} +

+

+ {t("roles-users-title", "Users")} +

+ { + triggerRefetch(); + }} + /> +

+ {t("roles-users-count", "{{count}}", { + count: users.length ?? 0, + })} +

+
+ {showCreatePermissionModal && ( + { + triggerRefetch(); + setShowCreatePermissionModal(false); + }} + /> + )} +
+
); }; diff --git a/src/admin/settings/user-roles/page.tsx b/src/admin/settings/user-roles/page.tsx index d3f5e92c3..d3016b463 100644 --- a/src/admin/settings/user-roles/page.tsx +++ b/src/admin/settings/user-roles/page.tsx @@ -20,7 +20,7 @@ const CustomSettingPage = () => { const { data, isLoading, error, refetch } = useAdminCustomQuery( "/roles/get-roles", - [] + ["get-roles"] ); const triggerRefetch = () => { @@ -56,34 +56,36 @@ const CustomSettingPage = () => { return (
- - -
- -

- {t("roles-count", "{{count}}", { count: data.role.length ?? 0 })} -

-
- {showCreateRoleModal && ( - { - triggerRefetch(); - setShowCreateRoleModal(false); - }} - /> - )} -
+
+ + +
+ +

+ {t("roles-count", "{{count}}", { count: data.role.length ?? 0 })} +

+
+ {showCreateRoleModal && ( + { + triggerRefetch(); + setShowCreateRoleModal(false); + }} + /> + )} +
+
); }; From 2f9bb84a03dc972f949cd3747db1ca3a19386e73 Mon Sep 17 00:00:00 2001 From: Luis Alaguna Date: Thu, 3 Oct 2024 23:02:58 -0500 Subject: [PATCH 21/21] chore: rename component --- src/admin/settings/user-roles/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/admin/settings/user-roles/page.tsx b/src/admin/settings/user-roles/page.tsx index d3016b463..97ac9134d 100644 --- a/src/admin/settings/user-roles/page.tsx +++ b/src/admin/settings/user-roles/page.tsx @@ -12,7 +12,7 @@ import CreateRoleModal from "../../ui-components/organisms/create-role-modal"; import RoleTable from "../../ui-components/templates/role-table"; import Spinner from "../../ui-components/atoms/spinner"; -const CustomSettingPage = () => { +const Roles = () => { const { t } = useTranslation(); const [showCreateRoleModal, setShowCreateRoleModal] = useState(false); @@ -98,4 +98,4 @@ export const config: SettingConfig = { }, }; -export default CustomSettingPage; +export default Roles;