From b8902637251e9ed4f8762ef280659bbab6d967de Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 16 Apr 2025 14:55:14 +0530 Subject: [PATCH] feature: add support for dynamoDB for storing sessions and some types cleanup (#12140) --- .changeset/short-meals-bake.md | 7 + packages/core/framework/package.json | 10 + packages/core/framework/src/config/config.ts | 4 +- packages/core/framework/src/config/types.ts | 984 +---------------- .../src/http/__fixtures__/server/index.ts | 4 +- .../core/framework/src/http/express-loader.ts | 15 +- .../core/framework/src/medusa-app-loader.ts | 6 +- .../core/types/src/common/config-module.ts | 181 ++-- .../common/__tests__/define-config.spec.ts | 599 +++++++++++ .../core/utils/src/common/define-config.ts | 30 +- packages/core/utils/src/common/index.ts | 1 + .../utils/src/common/try-convert-to-number.ts | 18 + yarn.lock | 986 +++++++++++++++++- 13 files changed, 1792 insertions(+), 1053 deletions(-) create mode 100644 .changeset/short-meals-bake.md create mode 100644 packages/core/utils/src/common/try-convert-to-number.ts diff --git a/.changeset/short-meals-bake.md b/.changeset/short-meals-bake.md new file mode 100644 index 0000000000..cfe6812704 --- /dev/null +++ b/.changeset/short-meals-bake.md @@ -0,0 +1,7 @@ +--- +"@medusajs/framework": patch +"@medusajs/types": patch +"@medusajs/utils": patch +--- + +Add support for dynamoDB for storing sessions and some types cleanup diff --git a/packages/core/framework/package.json b/packages/core/framework/package.json index e150488063..748ded6947 100644 --- a/packages/core/framework/package.json +++ b/packages/core/framework/package.json @@ -54,6 +54,7 @@ "test": "jest --runInBand --bail --forceExit -- src/**/__tests__/**/*.ts" }, "devDependencies": { + "@aws-sdk/client-dynamodb": "^3.218.0", "@medusajs/cli": "2.7.0", "@mikro-orm/core": "6.4.3", "@mikro-orm/knex": "6.4.3", @@ -64,6 +65,7 @@ "@types/cors": "^2.8.17", "@types/jsonwebtoken": "^8.5.9", "awilix": "^8.0.1", + "connect-dynamodb": "^3.0.5", "ioredis": "^5.4.1", "jest": "^29.7.0", "pg": "^8.13.0", @@ -98,6 +100,7 @@ "zod": "3.22.4" }, "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.218.0", "@medusajs/cli": "2.7.0", "@mikro-orm/cli": "6.4.3", "@mikro-orm/core": "6.4.3", @@ -105,14 +108,21 @@ "@mikro-orm/migrations": "6.4.3", "@mikro-orm/postgresql": "6.4.3", "awilix": "^8.0.1", + "connect-dynamodb": "^3.0.5", "ioredis": "^5.4.1", "pg": "^8.13.0", "vite": "^5.4.14" }, "peerDependenciesMeta": { + "@aws-sdk/client-dynamodb": { + "optional": true + }, "@mikro-orm/cli": { "optional": true }, + "connect-dynamodb": { + "optional": true + }, "ioredis": { "optional": true }, diff --git a/packages/core/framework/src/config/config.ts b/packages/core/framework/src/config/config.ts index 90e2f506d2..02f0ccf0f9 100644 --- a/packages/core/framework/src/config/config.ts +++ b/packages/core/framework/src/config/config.ts @@ -164,7 +164,9 @@ export class ConfigManager { this.#config = { projectConfig: normalizedProjectConfig, - admin: projectConfig.admin ?? {}, + admin: projectConfig.admin ?? { + path: "/app", + }, modules: projectConfig.modules ?? {}, featureFlags: projectConfig.featureFlags ?? {}, plugins: projectConfig.plugins ?? [], diff --git a/packages/core/framework/src/config/types.ts b/packages/core/framework/src/config/types.ts index 1218ad05f4..c34e3fc830 100644 --- a/packages/core/framework/src/config/types.ts +++ b/packages/core/framework/src/config/types.ts @@ -1,978 +1,8 @@ -import { - ExternalModuleDeclaration, - InternalModuleDeclaration, +export { + AdminOptions, + SessionOptions, + ProjectConfigOptions, + HttpCompressionOptions, + ConfigModule, + PluginDetails, } from "@medusajs/types" - -import type { RedisOptions } from "ioredis" -import { ConnectionOptions } from "node:tls" -// @ts-expect-error -import type { InlineConfig } from "vite" - -/** - * @interface - * - * Admin dashboard configurations. - */ -export type AdminOptions = { - /** - * Whether to disable the admin dashboard. If set to `true`, the admin dashboard is disabled, - * in both development and production environments. The default value is `false`. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * admin: { - * disable: process.env.ADMIN_DISABLED === "true" || - * false - * }, - * // ... - * }) - * ``` - */ - disable?: boolean - /** - * The path to the admin dashboard. The default value is `/app`. - * - * The value cannot be one of the reserved paths: - * - `/admin` - * - `/store` - * - `/auth` - * - `/` - * - * :::note - * - * When using Docker, make sure that the root path of the Docker image doesn't path the admin's `path`. For example, if the Docker image's root path is `/app`, change - * the value of the `path` configuration, as it's `/app` by default. - * - * ::: - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * admin: { - * path: process.env.ADMIN_PATH || `/app`, - * }, - * // ... - * }) - * ``` - */ - path?: `/${string}` - /** - * The directory where the admin build is outputted when you run the `build` command. - * The default value is `./build`. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * admin: { - * outDir: process.env.ADMIN_BUILD_DIR || `./build`, - * }, - * // ... - * }) - * ``` - */ - outDir?: string - /** - * The URL of your Medusa application. Defaults to the browser origin. This is useful to set when running the admin on a separate domain. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * admin: { - * backendUrl: process.env.MEDUSA_BACKEND_URL || - * "http://localhost:9000" - * }, - * // ... - * }) - * ``` - */ - backendUrl?: string - /** - * The URL of your Medusa storefront application. This URL is used as a prefix to some - * links in the admin that require performing actions in the storefront. For example, - * this URL is used as a prefix to shareable payment links for orders with - * outstanding amounts. - * - * @example - * ```js title="medusa-config.js" - * module.exports = defineConfig({ - * admin: { - * storefrontUrl: process.env.MEDUSA_STOREFRONT_URL || - * "http://localhost:8000" - * }, - * // ... - * }) - * ``` - */ - storefrontUrl?: string - /** - * Configure the Vite configuration for the admin dashboard. This function receives the default Vite configuration - * and returns the modified configuration. The default value is `undefined`. - * - * Learn about configurations you can pass to Vite in [Vite's documentation](https://vite.dev/config/). - * - * @example - * For example, if you're using a third-party library that isn't ESM-compatible, add it to Vite's `optimizeDeps` configuration: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * admin: { - * vite: () => { - * return { - * optimizeDeps: { - * include: ["qs"], - * }, - * }; - * }, - * }, - * // ... - * }) - * ``` - */ - vite?: (config: InlineConfig) => InlineConfig -} - -/** - * @interface - * - * Options to pass to `express-session`. - */ -type SessionOptions = { - /** - * The name of the session ID cookie to set in the response (and read from in the request). The default value is `connect.sid`. - * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#name) for more details. - */ - name?: string - /** - * Whether the session should be saved back to the session store, even if the session was never modified during the request. The default value is `true`. - * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#resave) for more details. - */ - resave?: boolean - /** - * Whether the session identifier cookie should be force-set on every response. The default value is `false`. - * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#rolling) for more details. - */ - rolling?: boolean - /** - * Whether a session that is "uninitialized" is forced to be saved to the store. The default value is `true`. - * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#saveUninitialized) for more details. - */ - saveUninitialized?: boolean - /** - * The secret to sign the session ID cookie. By default, the value of `http.cookieSecret` is used. - * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#secret) for details. - */ - secret?: string - /** - * Used when calculating the `Expires` `Set-Cookie` attribute of cookies. By default, its value is `10 * 60 * 60 * 1000`. - * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#cookiemaxage) for details. - */ - ttl?: number -} - -/** - * @interface - * - * HTTP compression configurations. - */ -export type HttpCompressionOptions = { - /** - * Whether HTTP compression is enabled. By default, it's `false`. - */ - enabled?: boolean - /** - * The level of zlib compression to apply to responses. A higher level will result in better compression but will take longer to complete. - * A lower level will result in less compression but will be much faster. The default value is `6`. - */ - level?: number - /** - * How much memory should be allocated to the internal compression state. It's an integer in the range of 1 (minimum level) and 9 (maximum level). - * The default value is `8`. - */ - memLevel?: number - /** - * The minimum response body size that compression is applied on. Its value can be the number of bytes or any string accepted by the - * [bytes](https://www.npmjs.com/package/bytes) module. The default value is `1024`. - */ - threshold?: number | string -} - -/** - * @interface - * - * Essential configurations related to the Medusa application, such as database and CORS configurations. - */ -export type ProjectConfigOptions = { - /** - * The name of the database to connect to. If the name is specified in `databaseUrl`, then you don't have to use this configuration. - * - * Make sure to create the PostgreSQL database before using it. You can check how to create a database in - * [PostgreSQL's documentation](https://www.postgresql.org/docs/current/sql-createdatabase.html). - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * databaseName: process.env.DATABASE_NAME || - * "medusa-store", - * // ... - * }, - * // ... - * }) - * ``` - */ - databaseName?: string - - /** - * The PostgreSQL connection URL of the database, which is of the following format: - * - * ```bash - * postgres://[user][:password]@[host][:port]/[dbname] - * ``` - * - * Where: - * - * - `[user]`: (required) your PostgreSQL username. If not specified, the system's username is used by default. The database user that you use must have create privileges. If you're using the `postgres` superuser, then it should have these privileges by default. Otherwise, make sure to grant your user create privileges. You can learn how to do that in [PostgreSQL's documentation](https://www.postgresql.org/docs/current/ddl-priv.html). - * - `[:password]`: an optional password for the user. When provided, make sure to put `:` before the password. - * - `[host]`: (required) your PostgreSQL host. When run locally, it should be `localhost`. - * - `[:port]`: an optional port that the PostgreSQL server is listening on. By default, it's `5432`. When provided, make sure to put `:` before the port. - * - `[dbname]`: (required) the name of the database. - * - * You can learn more about the connection URL format in [PostgreSQL’s documentation](https://www.postgresql.org/docs/current/libpq-connect.html). - * - * @example - * For example, set the following database URL in your environment variables: - * - * ```bash - * DATABASE_URL=postgres://postgres@localhost/medusa-store - * ``` - * - * Then, use the value in `medusa-config.ts`: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * databaseUrl: process.env.DATABASE_URL, - * // ... - * }, - * // ... - * }) - * ``` - */ - databaseUrl?: string - - /** - * The database schema to connect to. This is not required to provide if you’re using the default schema, which is `public`. - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * databaseSchema: process.env.DATABASE_SCHEMA || - * "custom", - * // ... - * }, - * // ... - * }) - * ``` - */ - databaseSchema?: string - - /** - * This configuration specifies whether database messages should be logged. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * databaseLogging: false - * // ... - * }, - * // ... - * }) - * ``` - */ - databaseLogging?: boolean - - /** - * This configuration is used to pass additional options to the database connection. You can pass any configuration. For example, pass the - * `ssl` property that enables support for TLS/SSL connections. - * - * This is useful for production databases, which can be supported by setting the `rejectUnauthorized` attribute of `ssl` object to `false`. - * During development, it’s recommended not to pass this option. - * - * :::note - * - * Make sure to add to the end of the database URL `?ssl_mode=disable` as well when disabling `rejectUnauthorized`. - * - * ::: - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * databaseDriverOptions: process.env.NODE_ENV !== "development" ? - * { connection: { ssl: { rejectUnauthorized: false } } } : {} - * // ... - * }, - * // ... - * }) - * ``` - */ - databaseDriverOptions?: Record & { - connection?: { - /** - * Configure support for TLS/SSL connection - */ - ssl?: boolean | ConnectionOptions - } - } - - /** - * This configuration specifies the connection URL to Redis to store the Medusa server's session. - * - * :::note - * - * You must first have Redis installed. You can refer to [Redis's installation guide](https://redis.io/docs/getting-started/installation/). - * - * ::: - * - * The Redis connection URL has the following format: - * - * ```bash - * redis[s]://[[username][:password]@][host][:port][/db-number] - * ``` - * - * For a local Redis installation, the connection URL should be `redis://localhost:6379` unless you’ve made any changes to the Redis configuration during installation. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * redisUrl: process.env.REDIS_URL || - * "redis://localhost:6379", - * // ... - * }, - * // ... - * }) - * ``` - */ - redisUrl?: string - - /** - * This configuration defines a prefix on all keys stored in Redis for the Medusa server's session. The default value is `sess:`. - * - * If this configuration option is provided, it is prepended to `sess:`. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * redisPrefix: process.env.REDIS_URL || "medusa:", - * // ... - * }, - * // ... - * }) - * ``` - */ - redisPrefix?: string - - /** - * This configuration defines options to pass ioredis for the Redis connection used to store the Medusa server's session. Refer to [ioredis’s RedisOptions documentation](https://redis.github.io/ioredis/index.html#RedisOptions) - * for the list of available options. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * redisOptions: { - * connectionName: process.env.REDIS_CONNECTION_NAME || - * "medusa", - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - redisOptions?: RedisOptions - - /** - * This configuration defines additional options to pass to [express-session](https://www.npmjs.com/package/express-session), which is used to store the Medusa server's session. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * sessionOptions: { - * name: process.env.SESSION_NAME || "custom", - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - sessionOptions?: SessionOptions - - /** - * Configure the number of staged jobs that are polled from the database. Default is `1000`. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * jobsBatchSize: 100 - * // ... - * }, - * // ... - * }) - * ``` - * - * @ignore - * - * @privateRemarks - * Couldn't find any use for this option. - */ - jobsBatchSize?: number - - /** - * Configure the application's worker mode. - * - * Workers are processes running separately from the main application. They're useful for executing long-running or resource-heavy tasks in the background, such as importing products. - * - * With a worker, these tasks are offloaded to a separate process. So, they won't affect the performance of the main application. - * - * ![Diagram showcasing how the server and worker work together](https://res.cloudinary.com/dza7lstvk/image/upload/fl_lossy/f_auto/r_16/ar_16:9,c_pad/v1/Medusa%20Book/medusa-worker_klkbch.jpg?_a=BATFJtAA0) - * - * Medusa has three runtime modes: - * - * - Use `shared` to run the application in a single process. - * - Use `worker` to run the a worker process only. - * - Use `server` to run the application server only. - * - * In production, it's recommended to deploy two instances: - * - * 1. One having the `workerMode` configuration set to `server`. - * 2. Another having the `workerMode` configuration set to `worker`. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * workerMode: process.env.WORKER_MODE || "shared" - * // ... - * }, - * // ... - * }) - * ``` - */ - workerMode?: "shared" | "worker" | "server" - - /** - * This property configures the application's http-specific settings. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * cookieSecret: "supersecret", - * compression: { - * // ... - * } - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - http: { - /** - * A random string used to create authentication tokens in the http layer. Although this configuration option is not required, it’s highly recommended to set it for better security. - * - * In a development environment, if this option is not set the default secret is `supersecret`. However, in production, if this configuration is not set, an - * error is thrown and the application crashes. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * jwtSecret: "supersecret", - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - jwtSecret?: string - /** - * The expiration time for the JWT token. Its format is based off the [ms package](https://github.com/vercel/ms). - * - * If not provided, the default value is `24h`. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * jwtExpiresIn: "2d" - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - jwtExpiresIn?: string - /** - * A random string used to create cookie tokens in the http layer. Although this configuration option is not required, it’s highly recommended to set it for better security. - * - * In a development environment, if this option is not set, the default secret is `supersecret`. However, in production, if this configuration is not set, an error is thrown and - * the application crashes. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * cookieSecret: "supersecret" - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - cookieSecret?: string - /** - * The Medusa application's API Routes are protected by Cross-Origin Resource Sharing (CORS). So, only allowed URLs or URLs matching a specified pattern can send requests to the backend’s API Routes. - * - * `cors` is a string used to specify the accepted URLs or patterns for API Routes starting with `/auth`. It can either be one accepted origin, or a comma-separated list of accepted origins. - * - * Every origin in that list must either be: - * - * 1. A URL. For example, `http://localhost:7001`. The URL must not end with a backslash; - * 2. Or a regular expression pattern that can match more than one origin. For example, `.example.com`. The regex pattern that Medusa tests for is `^([\/~@;%#'])(.*?)\1([gimsuy]*)$`. - * - * @example - * Some example values of common use cases: - * - * ```bash - * # Allow different ports locally starting with 700 - * AUTH_CORS=/http:\/\/localhost:700\d+$/ - * - * # Allow any origin ending with vercel.app. For example, admin.vercel.app - * AUTH_CORS=/vercel\.app$/ - * - * # Allow all HTTP requests - * AUTH_CORS=/http:\/\/.+/ - * ``` - * - * Then, set the configuration in `medusa-config.ts`: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * authCors: process.env.AUTH_CORS - * } - * // ... - * }, - * // ... - * }) - * ``` - * - * If you’re adding the value directly within `medusa-config.ts`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * authCors: "/http:\\/\\/localhost:700\\d+$/", - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - authCors: string - /** - * - * Configure HTTP compression from the application layer. If you have access to the HTTP server, the recommended approach would be to enable it there. - * However, some platforms don't offer access to the HTTP layer and in those cases, this is a good alternative. - * - * If you enable HTTP compression and you want to disable it for specific API Routes, you can pass in the request header `"x-no-compression": true`. - * Learn more in the [API Reference](https://docs.medusajs.com/api/store#http-compression). - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * compression: { - * enabled: true, - * level: 6, - * memLevel: 8, - * threshold: 1024 - * } - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - compression?: HttpCompressionOptions - /** - * The Medusa application's API Routes are protected by Cross-Origin Resource Sharing (CORS). So, only allowed URLs or URLs matching a specified pattern can send requests to the backend’s API Routes. - * - * `store_cors` is a string used to specify the accepted URLs or patterns for store API Routes. It can either be one accepted origin, or a comma-separated list of accepted origins. - * - * Every origin in that list must either be: - * - * 1. A URL. For example, `http://localhost:8000`. The URL must not end with a backslash; - * 2. Or a regular expression pattern that can match more than one origin. For example, `.example.com`. The regex pattern that the backend tests for is `^([\/~@;%#'])(.*?)\1([gimsuy]*)$`. - * - * @example - * Some example values of common use cases: - * - * ```bash - * # Allow different ports locally starting with 800 - * STORE_CORS=/http:\/\/localhost:800\d+$/ - * - * # Allow any origin ending with vercel.app. For example, storefront.vercel.app - * STORE_CORS=/vercel\.app$/ - * - * # Allow all HTTP requests - * STORE_CORS=/http:\/\/.+/ - * ``` - * - * Then, set the configuration in `medusa-config.ts`: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * storeCors: process.env.STORE_CORS, - * } - * // ... - * }, - * // ... - * }) - * ``` - * - * If you’re adding the value directly within `medusa-config.ts`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * storeCors: "/vercel\\.app$/", - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - storeCors: string - - /** - * The Medusa application's API Routes are protected by Cross-Origin Resource Sharing (CORS). So, only allowed URLs or URLs matching a specified pattern can send requests to the backend’s API Routes. - * - * `admin_cors` is a string used to specify the accepted URLs or patterns for admin API Routes. It can either be one accepted origin, or a comma-separated list of accepted origins. - * - * Every origin in that list must either be: - * - * 1. A URL. For example, `http://localhost:7001`. The URL must not end with a backslash; - * 2. Or a regular expression pattern that can match more than one origin. For example, `.example.com`. The regex pattern that the backend tests for is `^([\/~@;%#'])(.*?)\1([gimsuy]*)$`. - * - * @example - * Some example values of common use cases: - * - * ```bash - * # Allow different ports locally starting with 700 - * ADMIN_CORS=/http:\/\/localhost:700\d+$/ - * - * # Allow any origin ending with vercel.app. For example, admin.vercel.app - * ADMIN_CORS=/vercel\.app$/ - * - * # Allow all HTTP requests - * ADMIN_CORS=/http:\/\/.+/ - * ``` - * - * Then, set the configuration in `medusa-config.ts`: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * adminCors: process.env.ADMIN_CORS, - * } - * // ... - * }, - * // ... - * }) - * ``` - * - * If you’re adding the value directly within `medusa-config.ts`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * adminCors: "/vercel\\.app$/", - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - adminCors: string - - /** - * This configuration specifies the supported authentication providers per actor type (such as `user`, `customer`, or any custom actors). - * For example, you only want to allow SSO logins for `users`, while you want to allow email/password logins for `customers` to the storefront. - * - * `authMethodsPerActor` is a a map where the actor type (eg. 'user') is the key, and the value is an array of supported auth provider IDs. - * - * @example - * Some example values of common use cases: - * - * Then, set the configuration in `medusa-config.ts`: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * authMethodsPerActor: { - * user: ["email"], - * customer: ["emailpass", "google"] - * } - * } - * // ... - * }, - * // ... - * }) - * ``` - */ - authMethodsPerActor?: Record - - /** - * Specifies the fields that can't be selected in the response unless specified in the allowed query config. - * This is useful to restrict sensitive fields from being exposed in the API. - * - * @example - * - * ```js title="medusa-config.js" - * module.exports = defineConfig({ - * projectConfig: { - * http: { - * restrictedFields: { - * store: ["order", "orders"], - * } - * } - * ``` - */ - restrictedFields?: { - store?: string[] - /*admin?: string[]*/ - } - } -} - -/** - * @interface - * - * The configurations for your Medusa application are set in `medusa-config.ts` located in the root of your Medusa project. The configurations include configurations for database, modules, and more. - * - * :::note - * - * Some Medusa configurations are set through environment variables, which you can find in [this documentation](https://docs.medusajs.com/learn/fundamentals/environment-variables#predefined-medusa-environment-variables). - * - * ::: - * - * `medusa-config.ts` exports the value returned by the `defineConfig` utility function imported from `@medusajs/framework/utils`. - * - * `defineConfig` accepts as a parameter an object with the following properties: - * - * - {@link ConfigModule.projectConfig | projectConfig} (required): An object that holds general configurations related to the Medusa application, such as database or CORS configurations. - * - {@link ConfigModule.plugins | plugins}: An array of strings or objects that hold the configurations of the plugins installed in the Medusa application. - * - {@link ConfigModule.admin | admin}: An object that holds admin-related configurations. - * - {@link ConfigModule.modules | modules}: An object that configures the Medusa application's modules. - * - {@link ConfigModule.featureFlags | featureFlags}: An object that enables or disables features guarded by a feature flag. - * - * For example: - * - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * projectConfig: { - * // ... - * }, - * admin: { - * // ... - * }, - * modules: { - * // ... - * }, - * featureFlags: { - * // ... - * } - * }) - * ``` - * - * --- - * - * ## Environment Variables - * - * It's highly recommended to store the values of configurations in environment variables, then reference them within `medusa-config.ts`. - * - * During development, you can set your environment variables in the `.env` file at the root of your Medusa application project. In production, - * setting the environment variables depends on the hosting provider. - * - * --- - */ -export type ConfigModule = { - /** - * This property holds essential configurations related to the Medusa application, such as database and CORS configurations. - */ - projectConfig: ProjectConfigOptions - - /** - * This property holds configurations for the Medusa Admin dashboard. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * admin: { - * backendUrl: process.env.MEDUSA_BACKEND_URL || - * "http://localhost:9000" - * }, - * // ... - * }) - * ``` - */ - admin?: AdminOptions - - /** - * On your Medusa server, you can use [Plugins](https://docs.medusajs.com/learn/fundamentals/plugins) to add re-usable Medusa customizations. Plugins - * can include modules, workflows, API Routes, and other customizations. Plugins are available starting from [Medusa v2.3.0](https://github.com/medusajs/medusa/releases/tag/v2.3.0). - * - * Aside from installing the plugin with NPM, you need to pass the plugin you installed into the `plugins` array defined in `medusa-config.ts`. - * - * The items in the array can either be: - * - * - A string, which is the name of the plugin's package as specified in the plugin's `package.json` file. You can pass a plugin as a string if it doesn’t require any options. - * - An object having the following properties: - * - `resolve`: The name of the plugin's package as specified in the plugin's `package.json` file. - * - `options`: An object that includes options to be passed to the modules within the plugin. Learn more in [this documentation](https://docs.medusajs.com/learn/fundamentals/modules/options). - * - * Learn how to create a plugin in [this documentation](https://docs.medusajs.com/learn/fundamentals/plugins/create). - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = { - * plugins: [ - * `medusa-my-plugin-1`, - * { - * resolve: `medusa-my-plugin`, - * options: { - * apiKey: process.env.MY_API_KEY || - * `test`, - * }, - * }, - * // ... - * ], - * // ... - * } - * ``` - */ - plugins: ( - | { - /** - * The name of the plugin's package as specified in the plugin's `package.json` file. - */ - resolve: string - /** - * An object that includes options to be passed to the modules within the plugin. - * Learn more in [this documentation](https://docs.medusajs.com/learn/fundamentals/modules/options). - */ - options: Record - } - | string - )[] - - /** - * This property holds all custom modules installed in your Medusa application. - * - * :::note - * - * Medusa's commerce modules are configured by default, so only - * add them to this property if you're changing their configurations or adding providers to a module. - * - * ::: - * - * `modules` is an array of objects, each holding a module's registration configurations. Each object has the following properties: - * - * 1. `resolve`: a string indicating the path to the module relative to `src`, or the module's NPM package name. For example, `./modules/my-module`. - * 2. `options`: (optional) an object indicating the options to pass to the module. - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * modules: [ - * { - * resolve: "./modules/hello" - * } - * ] - * // ... - * }) - * ``` - */ - modules?: Record< - string, - boolean | Partial - > - - /** - * Some features in the Medusa application are guarded by a feature flag. This ensures constant shipping of new features while maintaining the engine’s stability. - * - * You can enable a feature in your application by enabling its feature flag. Feature flags are enabled through either environment - * variables or through this configuration property exported in `medusa-config.ts`. - * - * The `featureFlags`'s value is an object. Its properties are the names of the feature flags, and their value is a boolean indicating whether the feature flag is enabled. - * - * You can find available feature flags and their key name [here](https://github.com/medusajs/medusa/tree/develop/packages/medusa/src/loaders/feature-flags). - * - * @example - * ```ts title="medusa-config.ts" - * module.exports = defineConfig({ - * featureFlags: { - * analytics: true, - * // ... - * } - * // ... - * }) - * ``` - * - * :::note - * - * After enabling a feature flag, make sure to run migrations as it may require making changes to the database. - * - * ::: - */ - featureFlags: Record> -} - -export type PluginDetails = { - resolve: string - name: string - id: string - options: Record - version: string -} diff --git a/packages/core/framework/src/http/__fixtures__/server/index.ts b/packages/core/framework/src/http/__fixtures__/server/index.ts index 7180c3bd2f..153bac8fe9 100644 --- a/packages/core/framework/src/http/__fixtures__/server/index.ts +++ b/packages/core/framework/src/http/__fixtures__/server/index.ts @@ -11,7 +11,7 @@ import supertest from "supertest" import { config } from "../mocks" import { MedusaContainer } from "@medusajs/types" -import { configManager, ConfigModule } from "../../../config" +import { configManager } from "../../../config" import { container } from "../../../container" import { featureFlagsLoader } from "../../../feature-flags" import { logger } from "../../../logger" @@ -44,7 +44,7 @@ export const createServer = async (rootDir) => { }) configManager.loadConfig({ - projectConfig: config as ConfigModule, + projectConfig: config, baseDir: rootDir, }) diff --git a/packages/core/framework/src/http/express-loader.ts b/packages/core/framework/src/http/express-loader.ts index 98d54ec541..47ef44deb7 100644 --- a/packages/core/framework/src/http/express-loader.ts +++ b/packages/core/framework/src/http/express-loader.ts @@ -8,6 +8,7 @@ import path from "path" import { logger } from "../logger" import { configManager } from "../config" import { MedusaRequest, MedusaResponse } from "./types" +import { dynamicImport } from "@medusajs/utils" const NOISY_ENDPOINTS_CHUNKS = ["@fs", "@id", "@vite", "@react", "node_modules"] @@ -37,7 +38,7 @@ export async function expressLoader({ app }: { app: Express }): Promise<{ name: sessionOptions?.name ?? "connect.sid", resave: sessionOptions?.resave ?? true, rolling: sessionOptions?.rolling ?? false, - saveUninitialized: sessionOptions?.saveUninitialized ?? true, + saveUninitialized: sessionOptions?.saveUninitialized ?? false, proxy: true, secret: sessionOptions?.secret ?? http?.cookieSecret, cookie: { @@ -50,7 +51,17 @@ export async function expressLoader({ app }: { app: Express }): Promise<{ let redisClient: Redis - if (configModule?.projectConfig?.redisUrl) { + if (configModule?.projectConfig.sessionOptions?.dynamodbOptions) { + const storeFactory = await dynamicImport("connect-dynamodb") + const client = await dynamicImport("@aws-sdk/client-dynamodb") + const DynamoDBStore = storeFactory({ session }) + sessionOpts.store = new DynamoDBStore({ + ...configModule.projectConfig.sessionOptions.dynamodbOptions, + client: new client.DynamoDBClient( + configModule.projectConfig.sessionOptions.dynamodbOptions.clientOptions + ), + }) + } else if (configModule?.projectConfig?.redisUrl) { const RedisStore = createStore(session) redisClient = new Redis( configModule.projectConfig.redisUrl, diff --git a/packages/core/framework/src/medusa-app-loader.ts b/packages/core/framework/src/medusa-app-loader.ts index 4894a549b9..23eefe1c00 100644 --- a/packages/core/framework/src/medusa-app-loader.ts +++ b/packages/core/framework/src/medusa-app-loader.ts @@ -115,8 +115,10 @@ export class MedusaAppLoader { ), } - const driverOptions = { ...(configManager.config.projectConfig.databaseDriverOptions ?? {}) } - const pool = driverOptions.pool ?? {} + const driverOptions = { + ...(configManager.config.projectConfig.databaseDriverOptions ?? {}), + } + const pool = (driverOptions.pool as Record) ?? {} delete driverOptions.pool const sharedResourcesConfig: ModuleServiceInitializeOptions = { diff --git a/packages/core/types/src/common/config-module.ts b/packages/core/types/src/common/config-module.ts index ee6e925304..35aa53c778 100644 --- a/packages/core/types/src/common/config-module.ts +++ b/packages/core/types/src/common/config-module.ts @@ -19,7 +19,7 @@ export interface AdminOptions { * in both development and production environments. The default value is `false`. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * admin: { * disable: process.env.ADMIN_DISABLED === "true" || @@ -30,6 +30,7 @@ export interface AdminOptions { * ``` */ disable?: boolean + /** * The path to the admin dashboard. The default value is `/app`. * @@ -40,7 +41,7 @@ export interface AdminOptions { * - `/` * * @example - * ```js title="medusa-config.js" + * ```ts title="medusa-config.ts" * module.exports = defineConfig({ * admin: { * path: process.env.ADMIN_PATH || `/app`, @@ -50,11 +51,12 @@ export interface AdminOptions { * ``` */ path: `/${string}` + /** * The URL of your Medusa application. Defaults to the browser origin. This is useful to set when running the admin on a separate domain. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * admin: { * backendUrl: process.env.MEDUSA_BACKEND_URL || @@ -65,12 +67,13 @@ export interface AdminOptions { * ``` */ backendUrl?: string + /** * The URL of your Medusa storefront application. This will help generate links from the admin * to provide to customers to complete any processes * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * admin: { * storefrontUrl: process.env.MEDUSA_STOREFRONT_URL || @@ -81,6 +84,13 @@ export interface AdminOptions { * ``` */ storefrontUrl?: string + + /** + * The directory where the admin build is output. This is where the build process places the generated files. + * The default value is `./build`. + */ + outDir?: string + /** * Configure the Vite configuration for the admin dashboard. This function receives the default Vite configuration * and returns the modified configuration. The default value is `undefined`. @@ -95,7 +105,7 @@ export interface AdminOptions { * * Options to pass to `express-session`. */ -type SessionOptions = { +export type SessionOptions = { /** * The name of the session ID cookie to set in the response (and read from in the request). The default value is `connect.sid`. * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#name) for more details. @@ -126,6 +136,36 @@ type SessionOptions = { * Refer to [express-session’s documentation](https://www.npmjs.com/package/express-session#cookiemaxage) for details. */ ttl?: number + + /** + * Specify the options for storing session data to dynamoDB. Make + * sure to install the following dependencies first. + * + * - @aws-sdk/client-dynamodb@^3.218.0 + * - connect-dynamodb@^3.0.5 + */ + dynamodbOptions?: { + clientOptions?: { + endpoint?: string + } + table?: string + /** Defaults to 'sess:' */ + prefix?: string + /** Defaults to 'id' */ + hashKey?: string + readCapacityUnits?: number + writeCapacityUnits?: number + specialKeys?: { + name: string + type: string + }[] + skipThrowMissingSpecialKeys?: boolean + /** + * Disable initialization. + * Useful if the table already exists or if you want to skip existence checks in a serverless environment such as AWS Lambda. + */ + initialized?: boolean + } } /** @@ -168,7 +208,7 @@ export type ProjectConfigOptions = { * [PostgreSQL's documentation](https://www.postgresql.org/docs/current/sql-createdatabase.html). * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * databaseName: process.env.DATABASE_NAME || @@ -205,9 +245,9 @@ export type ProjectConfigOptions = { * DATABASE_URL=postgres://postgres@localhost/medusa-store * ``` * - * Then, use the value in `medusa-config.js`: + * Then, use the value in `medusa-config.ts`: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * databaseUrl: process.env.DATABASE_URL, @@ -222,7 +262,7 @@ export type ProjectConfigOptions = { /** * The database schema to connect to. This is not required to provide if you’re using the default schema, which is `public`. * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * databaseSchema: process.env.DATABASE_SCHEMA || @@ -239,7 +279,7 @@ export type ProjectConfigOptions = { * This configuration specifies whether database messages should be logged. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * databaseLogging: false @@ -265,7 +305,7 @@ export type ProjectConfigOptions = { * ::: * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * databaseDriverOptions: process.env.NODE_ENV !== "development" ? @@ -303,7 +343,7 @@ export type ProjectConfigOptions = { * For a local Redis installation, the connection URL should be `redis://localhost:6379` unless you’ve made any changes to the Redis configuration during installation. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * redisUrl: process.env.REDIS_URL || @@ -322,7 +362,7 @@ export type ProjectConfigOptions = { * If this configuration option is provided, it is prepended to `sess:`. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * redisPrefix: process.env.REDIS_URL || "medusa:", @@ -339,7 +379,7 @@ export type ProjectConfigOptions = { * for the list of available options. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * redisOptions: { @@ -358,7 +398,7 @@ export type ProjectConfigOptions = { * This configuration defines additional options to pass to [express-session](https://www.npmjs.com/package/express-session), which is used to store the Medusa server's session. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * sessionOptions: { @@ -376,7 +416,7 @@ export type ProjectConfigOptions = { * Configure the number of staged jobs that are polled from the database. Default is `1000`. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * jobsBatchSize: 100 @@ -414,7 +454,7 @@ export type ProjectConfigOptions = { * 2. Another having the `workerMode` configuration set to `worker`. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * workerMode: process.env.WORKER_MODE || "shared" @@ -430,7 +470,7 @@ export type ProjectConfigOptions = { * This property configures the application's http-specific settings. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -453,7 +493,7 @@ export type ProjectConfigOptions = { * error is thrown and the application crashes. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -472,7 +512,7 @@ export type ProjectConfigOptions = { * If not provided, the default value is `24h`. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -492,7 +532,7 @@ export type ProjectConfigOptions = { * the application crashes. * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -529,9 +569,9 @@ export type ProjectConfigOptions = { * AUTH_CORS=/http:\/\/.+/ * ``` * - * Then, set the configuration in `medusa-config.js`: + * Then, set the configuration in `medusa-config.ts`: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -543,9 +583,9 @@ export type ProjectConfigOptions = { * }) * ``` * - * If you’re adding the value directly within `medusa-config.js`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: + * If you’re adding the value directly within `medusa-config.ts`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -567,7 +607,7 @@ export type ProjectConfigOptions = { * Learn more in the [API Reference](https://docs.medusajs.com/api/store#http-compression). * * @example - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -609,9 +649,9 @@ export type ProjectConfigOptions = { * STORE_CORS=/http:\/\/.+/ * ``` * - * Then, set the configuration in `medusa-config.js`: + * Then, set the configuration in `medusa-config.ts`: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -623,9 +663,9 @@ export type ProjectConfigOptions = { * }) * ``` * - * If you’re adding the value directly within `medusa-config.js`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: + * If you’re adding the value directly within `medusa-config.ts`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -663,9 +703,9 @@ export type ProjectConfigOptions = { * ADMIN_CORS=/http:\/\/.+/ * ``` * - * Then, set the configuration in `medusa-config.js`: + * Then, set the configuration in `medusa-config.ts`: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -677,9 +717,9 @@ export type ProjectConfigOptions = { * }) * ``` * - * If you’re adding the value directly within `medusa-config.js`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: + * If you’re adding the value directly within `medusa-config.ts`, make sure to add an extra escaping `/` for every backslash in the pattern. For example: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -702,9 +742,9 @@ export type ProjectConfigOptions = { * @example * Some example values of common use cases: * - * Then, set the configuration in `medusa-config.js`: + * Then, set the configuration in `medusa-config.ts`: * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -727,7 +767,7 @@ export type ProjectConfigOptions = { * * @example * - * ```js title="medusa-config.js" + * ```js title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * http: { @@ -747,20 +787,27 @@ export type ProjectConfigOptions = { /** * @interface * - * The configurations for your Medusa application are in `medusa-config.js` located in the root of your Medusa project. The configurations include configurations for database, modules, and more. + * The configurations for your Medusa application are set in `medusa-config.ts` located in the root of your Medusa project. The configurations include configurations for database, modules, and more. * - * `medusa-config.js` exports the value returned by the `defineConfig` utility function imported from `@medusajs/utils`. + * :::note + * + * Some Medusa configurations are set through environment variables, which you can find in [this documentation](https://docs.medusajs.com/learn/fundamentals/environment-variables#predefined-medusa-environment-variables). + * + * ::: + * + * `medusa-config.ts` exports the value returned by the `defineConfig` utility function imported from `@medusajs/framework/utils`. * * `defineConfig` accepts as a parameter an object with the following properties: * * - {@link ConfigModule.projectConfig | projectConfig} (required): An object that holds general configurations related to the Medusa application, such as database or CORS configurations. + * - {@link ConfigModule.plugins | plugins}: An array of strings or objects that hold the configurations of the plugins installed in the Medusa application. * - {@link ConfigModule.admin | admin}: An object that holds admin-related configurations. * - {@link ConfigModule.modules | modules}: An object that configures the Medusa application's modules. * - {@link ConfigModule.featureFlags | featureFlags}: An object that enables or disables features guarded by a feature flag. * * For example: * - * ```js title="medusa-config.js" + * ```ts title="medusa-config.ts" * module.exports = defineConfig({ * projectConfig: { * // ... @@ -781,7 +828,7 @@ export type ProjectConfigOptions = { * * ## Environment Variables * - * It's highly recommended to store the values of configurations in environment variables, then reference them within `medusa-config.js`. + * It's highly recommended to store the values of configurations in environment variables, then reference them within `medusa-config.ts`. * * During development, you can set your environment variables in the `.env` file at the root of your Medusa application project. In production, * setting the environment variables depends on the hosting provider. @@ -798,7 +845,7 @@ export type ConfigModule = { * This property holds configurations for the Medusa Admin dashboard. * * @example - * ```js title="medusa-config.js" + * ```ts title="medusa-config.ts" * module.exports = defineConfig({ * admin: { * backendUrl: process.env.MEDUSA_BACKEND_URL || @@ -811,20 +858,22 @@ export type ConfigModule = { admin: AdminOptions /** - * On your Medusa backend, you can use [Plugins](https://docs.medusajs.com/development/plugins/overview) to add custom features or integrate third-party services. - * For example, installing a plugin to use Stripe as a payment processor. + * On your Medusa server, you can use [Plugins](https://docs.medusajs.com/learn/fundamentals/plugins) to add re-usable Medusa customizations. Plugins + * can include modules, workflows, API Routes, and other customizations. Plugins are available starting from [Medusa v2.3.0](https://github.com/medusajs/medusa/releases/tag/v2.3.0). * - * Aside from installing the plugin with NPM, you need to pass the plugin you installed into the `plugins` array defined in `medusa-config.js`. + * Aside from installing the plugin with NPM, you need to pass the plugin you installed into the `plugins` array defined in `medusa-config.ts`. * * The items in the array can either be: * - * - A string, which is the name of the plugin to add. You can pass a plugin as a string if it doesn’t require any configurations. + * - A string, which is the name of the plugin's package as specified in the plugin's `package.json` file. You can pass a plugin as a string if it doesn’t require any options. * - An object having the following properties: - * - `resolve`: The name of the plugin. - * - `options`: An object that includes the plugin’s options. These options vary for each plugin, and you should refer to the plugin’s documentation for available options. + * - `resolve`: The name of the plugin's package as specified in the plugin's `package.json` file. + * - `options`: An object that includes options to be passed to the modules within the plugin. Learn more in [this documentation](https://docs.medusajs.com/learn/fundamentals/modules/options). + * + * Learn how to create a plugin in [this documentation](https://docs.medusajs.com/learn/fundamentals/plugins/create). * * @example - * ```js title="medusa-config.js" + * ```ts title="medusa-config.ts" * module.exports = { * plugins: [ * `medusa-my-plugin-1`, @@ -840,15 +889,17 @@ export type ConfigModule = { * // ... * } * ``` - * - * @ignore - * - * @privateRemarks - * Added the `@\ignore` tag for now so it's not generated in the main docs until we figure out what to do with plugins */ plugins: ( | { + /** + * The name of the plugin's package as specified in the plugin's `package.json` file. + */ resolve: string + /** + * An object that includes options to be passed to the modules within the plugin. + * Learn more in [this documentation](https://docs.medusajs.com/learn/fundamentals/modules/options). + */ options: Record } | string @@ -864,21 +915,19 @@ export type ConfigModule = { * * ::: * - * The keys of the `modules` configuration object refer to the module's registration name. Its value can be one of the following: + * `modules` is an array of objects, each holding a module's registration configurations. Each object has the following properties: * - * 1. A boolean value indicating whether the module type is enabled. This is only supported for Medusa's commerce and architectural modules; - * 2. Or an object having the following properties: - * 1. `resolve`: a string indicating the path to the module relative to `src`, or the module's NPM package name. For example, `./modules/my-module`. - * 2. `options`: (optional) an object indicating the options to pass to the module. + * 1. `resolve`: a string indicating the path to the module relative to `src`, or the module's NPM package name. For example, `./modules/my-module`. + * 2. `options`: (optional) an object indicating the options to pass to the module. * * @example - * ```js title="medusa-config.js" + * ```ts title="medusa-config.ts" * module.exports = defineConfig({ - * modules: { - * helloModuleService: { + * modules: [ + * { * resolve: "./modules/hello" * } - * } + * ] * // ... * }) * ``` @@ -892,14 +941,14 @@ export type ConfigModule = { * Some features in the Medusa application are guarded by a feature flag. This ensures constant shipping of new features while maintaining the engine’s stability. * * You can enable a feature in your application by enabling its feature flag. Feature flags are enabled through either environment - * variables or through this configuration property exported in `medusa-config.js`. + * variables or through this configuration property exported in `medusa-config.ts`. * * The `featureFlags`'s value is an object. Its properties are the names of the feature flags, and their value is a boolean indicating whether the feature flag is enabled. * * You can find available feature flags and their key name [here](https://github.com/medusajs/medusa/tree/develop/packages/medusa/src/loaders/feature-flags). * * @example - * ```js title="medusa-config.js" + * ```ts title="medusa-config.ts" * module.exports = defineConfig({ * featureFlags: { * analytics: true, @@ -952,7 +1001,7 @@ export type InputConfigModules = Partial< */ export type InputConfig = Partial< Omit & { - admin: Partial + admin?: Partial modules: | InputConfigModules /** diff --git a/packages/core/utils/src/common/__tests__/define-config.spec.ts b/packages/core/utils/src/common/__tests__/define-config.spec.ts index 76c6ffdc79..02dc06f42e 100644 --- a/packages/core/utils/src/common/__tests__/define-config.spec.ts +++ b/packages/core/utils/src/common/__tests__/define-config.spec.ts @@ -145,6 +145,7 @@ describe("defineConfig", function () { "redisOptions": { "retryStrategy": [Function], }, + "sessionOptions": {}, }, } `) @@ -304,6 +305,7 @@ describe("defineConfig", function () { "redisOptions": { "retryStrategy": [Function], }, + "sessionOptions": {}, }, } `) @@ -471,6 +473,7 @@ describe("defineConfig", function () { "redisOptions": { "retryStrategy": [Function], }, + "sessionOptions": {}, }, } `) @@ -639,6 +642,7 @@ describe("defineConfig", function () { "redisOptions": { "retryStrategy": [Function], }, + "sessionOptions": {}, }, } `) @@ -795,6 +799,7 @@ describe("defineConfig", function () { "redisOptions": { "retryStrategy": [Function], }, + "sessionOptions": {}, }, } `) @@ -954,6 +959,7 @@ describe("defineConfig", function () { "redisOptions": { "retryStrategy": [Function], }, + "sessionOptions": {}, }, } `) @@ -1147,6 +1153,599 @@ describe("defineConfig", function () { "retryStrategy": [Function], }, "redisUrl": "redis://localhost:6379", + "sessionOptions": {}, + }, + } + `) + }) + + it("should include cloud-based config with dynamo db", function () { + const originalEnv = { ...process.env } + + process.env.EXECUTION_CONTEXT = "medusa-cloud" + process.env.REDIS_URL = "redis://localhost:6379" + process.env.S3_FILE_URL = "https://s3.amazonaws.com/medusa-cloud-test" + process.env.S3_PREFIX = "test" + process.env.S3_REGION = "us-east-1" + process.env.S3_BUCKET = "medusa-cloud-test" + process.env.S3_ENDPOINT = "https://s3.amazonaws.com" + process.env.SESSION_STORE = "dynamodb" + const res = defineConfig({}) + + process.env = { ...originalEnv } + + expect(res).toMatchInlineSnapshot(` + { + "admin": { + "backendUrl": "/", + "path": "/app", + }, + "featureFlags": {}, + "modules": { + "api_key": { + "resolve": "@medusajs/medusa/api-key", + }, + "auth": { + "options": { + "providers": [ + { + "id": "emailpass", + "resolve": "@medusajs/medusa/auth-emailpass", + }, + ], + }, + "resolve": "@medusajs/medusa/auth", + }, + "cache": { + "options": { + "redisUrl": "redis://localhost:6379", + }, + "resolve": "@medusajs/medusa/cache-redis", + }, + "cart": { + "resolve": "@medusajs/medusa/cart", + }, + "currency": { + "resolve": "@medusajs/medusa/currency", + }, + "customer": { + "resolve": "@medusajs/medusa/customer", + }, + "event_bus": { + "options": { + "redisUrl": "redis://localhost:6379", + }, + "resolve": "@medusajs/medusa/event-bus-redis", + }, + "file": { + "options": { + "providers": [ + { + "id": "s3", + "options": { + "authentication_method": "s3-iam-role", + "bucket": "medusa-cloud-test", + "endpoint": "https://s3.amazonaws.com", + "file_url": "https://s3.amazonaws.com/medusa-cloud-test", + "prefix": "test", + "region": "us-east-1", + }, + "resolve": "@medusajs/medusa/file-s3", + }, + ], + }, + "resolve": "@medusajs/medusa/file", + }, + "fulfillment": { + "options": { + "providers": [ + { + "id": "manual", + "resolve": "@medusajs/medusa/fulfillment-manual", + }, + ], + }, + "resolve": "@medusajs/medusa/fulfillment", + }, + "inventory": { + "resolve": "@medusajs/medusa/inventory", + }, + "locking": { + "options": { + "providers": [ + { + "id": "locking-redis", + "is_default": true, + "options": { + "redisUrl": "redis://localhost:6379", + }, + "resolve": "@medusajs/medusa/locking-redis", + }, + ], + }, + "resolve": "@medusajs/medusa/locking", + }, + "notification": { + "options": { + "providers": [ + { + "id": "local", + "options": { + "channels": [ + "feed", + ], + "name": "Local Notification Provider", + }, + "resolve": "@medusajs/medusa/notification-local", + }, + ], + }, + "resolve": "@medusajs/medusa/notification", + }, + "order": { + "resolve": "@medusajs/medusa/order", + }, + "payment": { + "resolve": "@medusajs/medusa/payment", + }, + "pricing": { + "resolve": "@medusajs/medusa/pricing", + }, + "product": { + "resolve": "@medusajs/medusa/product", + }, + "promotion": { + "resolve": "@medusajs/medusa/promotion", + }, + "region": { + "resolve": "@medusajs/medusa/region", + }, + "sales_channel": { + "resolve": "@medusajs/medusa/sales-channel", + }, + "stock_location": { + "resolve": "@medusajs/medusa/stock-location", + }, + "store": { + "resolve": "@medusajs/medusa/store", + }, + "tax": { + "resolve": "@medusajs/medusa/tax", + }, + "user": { + "options": { + "jwt_secret": "supersecret", + }, + "resolve": "@medusajs/medusa/user", + }, + "workflows": { + "options": { + "redis": { + "url": "redis://localhost:6379", + }, + }, + "resolve": "@medusajs/medusa/workflow-engine-redis", + }, + }, + "plugins": [], + "projectConfig": { + "databaseUrl": "postgres://localhost/medusa-starter-default", + "http": { + "adminCors": "http://localhost:7000,http://localhost:7001,http://localhost:5173", + "authCors": "http://localhost:7000,http://localhost:7001,http://localhost:5173", + "cookieSecret": "supersecret", + "jwtSecret": "supersecret", + "restrictedFields": { + "store": [ + ${DEFAULT_STORE_RESTRICTED_FIELDS.map((v) => `"${v}"`).join( + ",\n " + )}, + ], + }, + "storeCors": "http://localhost:8000", + }, + "redisOptions": { + "retryStrategy": [Function], + }, + "redisUrl": "redis://localhost:6379", + "sessionOptions": { + "dynamodbOptions": { + "hashKey": "id", + "initialized": true, + "prefix": "sess:", + "readCapacityUnits": 5, + "skipThrowMissingSpecialKeys": true, + "table": "medusa-sessions", + "writeCapacityUnits": 5, + }, + }, + }, + } + `) + }) + + it("should allow overriding cloud-only dynamodb config values via environment variables", function () { + const originalEnv = { ...process.env } + + process.env.EXECUTION_CONTEXT = "medusa-cloud" + process.env.REDIS_URL = "redis://localhost:6379" + process.env.S3_FILE_URL = "https://s3.amazonaws.com/medusa-cloud-test" + process.env.S3_PREFIX = "test" + process.env.S3_REGION = "us-east-1" + process.env.S3_BUCKET = "medusa-cloud-test" + process.env.S3_ENDPOINT = "https://s3.amazonaws.com" + process.env.SESSION_STORE = "dynamodb" + process.env.DYNAMO_DB_SESSIONS_CREATE_TABLE = "true" + process.env.DYNAMO_DB_SESSIONS_HASH_KEY = "user_id" + process.env.DYNAMO_DB_SESSIONS_PREFIX = "my_session:" + process.env.DYNAMO_DB_SESSIONS_TABLE = "test-sessions" + process.env.DYNAMO_DB_SESSIONS_READ_UNITS = "10" + process.env.DYNAMO_DB_SESSIONS_WRITE_UNITS = "10" + const res = defineConfig({}) + + process.env = { ...originalEnv } + + expect(res).toMatchInlineSnapshot(` + { + "admin": { + "backendUrl": "/", + "path": "/app", + }, + "featureFlags": {}, + "modules": { + "api_key": { + "resolve": "@medusajs/medusa/api-key", + }, + "auth": { + "options": { + "providers": [ + { + "id": "emailpass", + "resolve": "@medusajs/medusa/auth-emailpass", + }, + ], + }, + "resolve": "@medusajs/medusa/auth", + }, + "cache": { + "options": { + "redisUrl": "redis://localhost:6379", + }, + "resolve": "@medusajs/medusa/cache-redis", + }, + "cart": { + "resolve": "@medusajs/medusa/cart", + }, + "currency": { + "resolve": "@medusajs/medusa/currency", + }, + "customer": { + "resolve": "@medusajs/medusa/customer", + }, + "event_bus": { + "options": { + "redisUrl": "redis://localhost:6379", + }, + "resolve": "@medusajs/medusa/event-bus-redis", + }, + "file": { + "options": { + "providers": [ + { + "id": "s3", + "options": { + "authentication_method": "s3-iam-role", + "bucket": "medusa-cloud-test", + "endpoint": "https://s3.amazonaws.com", + "file_url": "https://s3.amazonaws.com/medusa-cloud-test", + "prefix": "test", + "region": "us-east-1", + }, + "resolve": "@medusajs/medusa/file-s3", + }, + ], + }, + "resolve": "@medusajs/medusa/file", + }, + "fulfillment": { + "options": { + "providers": [ + { + "id": "manual", + "resolve": "@medusajs/medusa/fulfillment-manual", + }, + ], + }, + "resolve": "@medusajs/medusa/fulfillment", + }, + "inventory": { + "resolve": "@medusajs/medusa/inventory", + }, + "locking": { + "options": { + "providers": [ + { + "id": "locking-redis", + "is_default": true, + "options": { + "redisUrl": "redis://localhost:6379", + }, + "resolve": "@medusajs/medusa/locking-redis", + }, + ], + }, + "resolve": "@medusajs/medusa/locking", + }, + "notification": { + "options": { + "providers": [ + { + "id": "local", + "options": { + "channels": [ + "feed", + ], + "name": "Local Notification Provider", + }, + "resolve": "@medusajs/medusa/notification-local", + }, + ], + }, + "resolve": "@medusajs/medusa/notification", + }, + "order": { + "resolve": "@medusajs/medusa/order", + }, + "payment": { + "resolve": "@medusajs/medusa/payment", + }, + "pricing": { + "resolve": "@medusajs/medusa/pricing", + }, + "product": { + "resolve": "@medusajs/medusa/product", + }, + "promotion": { + "resolve": "@medusajs/medusa/promotion", + }, + "region": { + "resolve": "@medusajs/medusa/region", + }, + "sales_channel": { + "resolve": "@medusajs/medusa/sales-channel", + }, + "stock_location": { + "resolve": "@medusajs/medusa/stock-location", + }, + "store": { + "resolve": "@medusajs/medusa/store", + }, + "tax": { + "resolve": "@medusajs/medusa/tax", + }, + "user": { + "options": { + "jwt_secret": "supersecret", + }, + "resolve": "@medusajs/medusa/user", + }, + "workflows": { + "options": { + "redis": { + "url": "redis://localhost:6379", + }, + }, + "resolve": "@medusajs/medusa/workflow-engine-redis", + }, + }, + "plugins": [], + "projectConfig": { + "databaseUrl": "postgres://localhost/medusa-starter-default", + "http": { + "adminCors": "http://localhost:7000,http://localhost:7001,http://localhost:5173", + "authCors": "http://localhost:7000,http://localhost:7001,http://localhost:5173", + "cookieSecret": "supersecret", + "jwtSecret": "supersecret", + "restrictedFields": { + "store": [ + ${DEFAULT_STORE_RESTRICTED_FIELDS.map((v) => `"${v}"`).join( + ",\n " + )}, + ], + }, + "storeCors": "http://localhost:8000", + }, + "redisOptions": { + "retryStrategy": [Function], + }, + "redisUrl": "redis://localhost:6379", + "sessionOptions": { + "dynamodbOptions": { + "hashKey": "user_id", + "initialized": false, + "prefix": "my_session:", + "readCapacityUnits": 10, + "skipThrowMissingSpecialKeys": true, + "table": "test-sessions", + "writeCapacityUnits": 10, + }, + }, + }, + } + `) + }) + + it("should allow custom dynamodb config", function () { + expect( + defineConfig({ + projectConfig: { + http: { + adminCors: "http://localhost:3000", + } as any, + sessionOptions: { + dynamodbOptions: { + clientOptions: { + endpoint: "http://localhost:8000", + }, + table: "medusa-sessions", + writeCapacityUnits: 25, + readCapacityUnits: 25, + }, + }, + }, + }) + ).toMatchInlineSnapshot(` + { + "admin": { + "backendUrl": "/", + "path": "/app", + }, + "featureFlags": {}, + "modules": { + "api_key": { + "resolve": "@medusajs/medusa/api-key", + }, + "auth": { + "options": { + "providers": [ + { + "id": "emailpass", + "resolve": "@medusajs/medusa/auth-emailpass", + }, + ], + }, + "resolve": "@medusajs/medusa/auth", + }, + "cache": { + "resolve": "@medusajs/medusa/cache-inmemory", + }, + "cart": { + "resolve": "@medusajs/medusa/cart", + }, + "currency": { + "resolve": "@medusajs/medusa/currency", + }, + "customer": { + "resolve": "@medusajs/medusa/customer", + }, + "event_bus": { + "resolve": "@medusajs/medusa/event-bus-local", + }, + "file": { + "options": { + "providers": [ + { + "id": "local", + "resolve": "@medusajs/medusa/file-local", + }, + ], + }, + "resolve": "@medusajs/medusa/file", + }, + "fulfillment": { + "options": { + "providers": [ + { + "id": "manual", + "resolve": "@medusajs/medusa/fulfillment-manual", + }, + ], + }, + "resolve": "@medusajs/medusa/fulfillment", + }, + "inventory": { + "resolve": "@medusajs/medusa/inventory", + }, + "locking": { + "resolve": "@medusajs/medusa/locking", + }, + "notification": { + "options": { + "providers": [ + { + "id": "local", + "options": { + "channels": [ + "feed", + ], + "name": "Local Notification Provider", + }, + "resolve": "@medusajs/medusa/notification-local", + }, + ], + }, + "resolve": "@medusajs/medusa/notification", + }, + "order": { + "resolve": "@medusajs/medusa/order", + }, + "payment": { + "resolve": "@medusajs/medusa/payment", + }, + "pricing": { + "resolve": "@medusajs/medusa/pricing", + }, + "product": { + "resolve": "@medusajs/medusa/product", + }, + "promotion": { + "resolve": "@medusajs/medusa/promotion", + }, + "region": { + "resolve": "@medusajs/medusa/region", + }, + "sales_channel": { + "resolve": "@medusajs/medusa/sales-channel", + }, + "stock_location": { + "resolve": "@medusajs/medusa/stock-location", + }, + "store": { + "resolve": "@medusajs/medusa/store", + }, + "tax": { + "resolve": "@medusajs/medusa/tax", + }, + "user": { + "options": { + "jwt_secret": "supersecret", + }, + "resolve": "@medusajs/medusa/user", + }, + "workflows": { + "resolve": "@medusajs/medusa/workflow-engine-inmemory", + }, + }, + "plugins": [], + "projectConfig": { + "databaseUrl": "postgres://localhost/medusa-starter-default", + "http": { + "adminCors": "http://localhost:3000", + "authCors": "http://localhost:7000,http://localhost:7001,http://localhost:5173", + "cookieSecret": "supersecret", + "jwtSecret": "supersecret", + "restrictedFields": { + "store": [ + ${DEFAULT_STORE_RESTRICTED_FIELDS.map((v) => `"${v}"`).join( + ",\n " + )}, + ], + }, + "storeCors": "http://localhost:8000", + }, + "redisOptions": { + "retryStrategy": [Function], + }, + "sessionOptions": { + "dynamodbOptions": { + "clientOptions": { + "endpoint": "http://localhost:8000", + }, + "readCapacityUnits": 25, + "table": "medusa-sessions", + "writeCapacityUnits": 25, + }, + }, }, } `) diff --git a/packages/core/utils/src/common/define-config.ts b/packages/core/utils/src/common/define-config.ts index e701d18a78..998883afc0 100644 --- a/packages/core/utils/src/common/define-config.ts +++ b/packages/core/utils/src/common/define-config.ts @@ -12,6 +12,7 @@ import { } from "../modules-sdk" import { isObject } from "./is-object" import { isString } from "./is-string" +import { tryConvertToNumber } from "./try-convert-to-number" import { normalizeImportPathWithSource } from "./normalize-import-path-with-source" import { resolveExports } from "./resolve-exports" @@ -310,7 +311,8 @@ function normalizeProjectConfig( projectConfig: InputConfig["projectConfig"], { isCloud }: { isCloud: boolean } ): ConfigModule["projectConfig"] { - const { http, redisOptions, ...restOfProjectConfig } = projectConfig || {} + const { http, redisOptions, sessionOptions, ...restOfProjectConfig } = + projectConfig || {} /** * The defaults to use for the project config. They are shallow merged @@ -347,8 +349,32 @@ function normalizeProjectConfig( }, ...redisOptions, }, + sessionOptions: { + ...(isCloud && process.env.SESSION_STORE === "dynamodb" + ? { + dynamodbOptions: { + prefix: process.env.DYNAMO_DB_SESSIONS_PREFIX ?? "sess:", + hashKey: process.env.DYNAMO_DB_SESSIONS_HASH_KEY ?? "id", + initialized: process.env.DYNAMO_DB_SESSIONS_CREATE_TABLE + ? false + : true, + table: process.env.DYNAMO_DB_SESSIONS_TABLE ?? "medusa-sessions", + readCapacityUnits: tryConvertToNumber( + process.env.DYNAMO_DB_SESSIONS_READ_UNITS, + 5 + ), + writeCapacityUnits: tryConvertToNumber( + process.env.DYNAMO_DB_SESSIONS_WRITE_UNITS, + 5 + ), + skipThrowMissingSpecialKeys: true, + }, + } + : {}), + ...sessionOptions, + }, ...restOfProjectConfig, - } + } satisfies ConfigModule["projectConfig"] } function normalizeAdminConfig( diff --git a/packages/core/utils/src/common/index.ts b/packages/core/utils/src/common/index.ts index bb80855e8f..878e785aa3 100644 --- a/packages/core/utils/src/common/index.ts +++ b/packages/core/utils/src/common/index.ts @@ -80,6 +80,7 @@ export * from "./to-handle" export * from "./to-kebab-case" export * from "./to-pascal-case" export * from "./to-unix-slash" +export * from "./try-convert-to-number" export * from "./trim-zeros" export * from "./unflatten-object-keys" export * from "./upper-case-first" diff --git a/packages/core/utils/src/common/try-convert-to-number.ts b/packages/core/utils/src/common/try-convert-to-number.ts new file mode 100644 index 0000000000..53b670cbdb --- /dev/null +++ b/packages/core/utils/src/common/try-convert-to-number.ts @@ -0,0 +1,18 @@ +/** + * Transforms a value to number or returns the default value + * when original value cannot be casted to number + */ +export function tryConvertToNumber(value: unknown): number | undefined +export function tryConvertToNumber( + value: unknown, + defaultValue: T +): number | T +export function tryConvertToNumber( + value: unknown, + defaultValue?: T +): number | undefined | T { + const transformedValue = Number(value) + return Number.isNaN(transformedValue) + ? defaultValue ?? undefined + : transformedValue +} diff --git a/yarn.lock b/yarn.lock index c4de2480f4..9a4c08e646 100644 --- a/yarn.lock +++ b/yarn.lock @@ -187,6 +187,21 @@ __metadata: languageName: node linkType: hard +"@aws-crypto/sha256-browser@npm:5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/sha256-browser@npm:5.2.0" + dependencies: + "@aws-crypto/sha256-js": ^5.2.0 + "@aws-crypto/supports-web-crypto": ^5.2.0 + "@aws-crypto/util": ^5.2.0 + "@aws-sdk/types": ^3.222.0 + "@aws-sdk/util-locate-window": ^3.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.6.2 + checksum: 05f6d256794df800fe9aef5f52f2ac7415f7f3117d461f85a6aecaa4e29e91527b6fd503681a17136fa89e9dd3d916e9c7e4cfb5eba222875cb6c077bdc1d00d + languageName: node + linkType: hard + "@aws-crypto/sha256-js@npm:3.0.0, @aws-crypto/sha256-js@npm:^3.0.0": version: 3.0.0 resolution: "@aws-crypto/sha256-js@npm:3.0.0" @@ -198,6 +213,17 @@ __metadata: languageName: node linkType: hard +"@aws-crypto/sha256-js@npm:5.2.0, @aws-crypto/sha256-js@npm:^5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/sha256-js@npm:5.2.0" + dependencies: + "@aws-crypto/util": ^5.2.0 + "@aws-sdk/types": ^3.222.0 + tslib: ^2.6.2 + checksum: 6c48701f8336341bb104dfde3d0050c89c288051f6b5e9bdfeb8091cf3ffc86efcd5c9e6ff2a4a134406b019c07aca9db608128f8d9267c952578a3108db9fd1 + languageName: node + linkType: hard + "@aws-crypto/supports-web-crypto@npm:^3.0.0": version: 3.0.0 resolution: "@aws-crypto/supports-web-crypto@npm:3.0.0" @@ -207,6 +233,15 @@ __metadata: languageName: node linkType: hard +"@aws-crypto/supports-web-crypto@npm:^5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/supports-web-crypto@npm:5.2.0" + dependencies: + tslib: ^2.6.2 + checksum: 4d2118e29d68ca3f5947f1e37ce1fbb3239a0c569cc938cdc8ab8390d595609b5caf51a07c9e0535105b17bf5c52ea256fed705a07e9681118120ab64ee73af2 + languageName: node + linkType: hard + "@aws-crypto/util@npm:^3.0.0": version: 3.0.0 resolution: "@aws-crypto/util@npm:3.0.0" @@ -218,6 +253,68 @@ __metadata: languageName: node linkType: hard +"@aws-crypto/util@npm:^5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/util@npm:5.2.0" + dependencies: + "@aws-sdk/types": ^3.222.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.6.2 + checksum: 0362d4c197b1fd64b423966945130207d1fe23e1bb2878a18e361f7743c8d339dad3f8729895a29aa34fff6a86c65f281cf5167c4bf253f21627ae80b6dd2951 + languageName: node + linkType: hard + +"@aws-sdk/client-dynamodb@npm:^3.218.0": + version: 3.782.0 + resolution: "@aws-sdk/client-dynamodb@npm:3.782.0" + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.775.0 + "@aws-sdk/credential-provider-node": 3.782.0 + "@aws-sdk/middleware-endpoint-discovery": 3.775.0 + "@aws-sdk/middleware-host-header": 3.775.0 + "@aws-sdk/middleware-logger": 3.775.0 + "@aws-sdk/middleware-recursion-detection": 3.775.0 + "@aws-sdk/middleware-user-agent": 3.782.0 + "@aws-sdk/region-config-resolver": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@aws-sdk/util-endpoints": 3.782.0 + "@aws-sdk/util-user-agent-browser": 3.775.0 + "@aws-sdk/util-user-agent-node": 3.782.0 + "@smithy/config-resolver": ^4.1.0 + "@smithy/core": ^3.2.0 + "@smithy/fetch-http-handler": ^5.0.2 + "@smithy/hash-node": ^4.0.2 + "@smithy/invalid-dependency": ^4.0.2 + "@smithy/middleware-content-length": ^4.0.2 + "@smithy/middleware-endpoint": ^4.1.0 + "@smithy/middleware-retry": ^4.1.0 + "@smithy/middleware-serde": ^4.0.3 + "@smithy/middleware-stack": ^4.0.2 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/node-http-handler": ^4.0.4 + "@smithy/protocol-http": ^5.1.0 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + "@smithy/url-parser": ^4.0.2 + "@smithy/util-base64": ^4.0.0 + "@smithy/util-body-length-browser": ^4.0.0 + "@smithy/util-body-length-node": ^4.0.0 + "@smithy/util-defaults-mode-browser": ^4.0.8 + "@smithy/util-defaults-mode-node": ^4.0.8 + "@smithy/util-endpoints": ^3.0.2 + "@smithy/util-middleware": ^4.0.2 + "@smithy/util-retry": ^4.0.2 + "@smithy/util-utf8": ^4.0.0 + "@smithy/util-waiter": ^4.0.3 + "@types/uuid": ^9.0.1 + tslib: ^2.6.2 + uuid: ^9.0.1 + checksum: 58d3fbe3f4b85f936c11e8e4c7135d94ec1dd5ca1afaf1b59583223f0ccd66d0ce246107d0ecec81446f9441fc9cfe6a233bca4da3c2800937c6a4bf745098c2 + languageName: node + linkType: hard + "@aws-sdk/client-s3@npm:^3.556.0": version: 3.569.0 resolution: "@aws-sdk/client-s3@npm:3.569.0" @@ -378,6 +475,52 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/client-sso@npm:3.782.0" + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.775.0 + "@aws-sdk/middleware-host-header": 3.775.0 + "@aws-sdk/middleware-logger": 3.775.0 + "@aws-sdk/middleware-recursion-detection": 3.775.0 + "@aws-sdk/middleware-user-agent": 3.782.0 + "@aws-sdk/region-config-resolver": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@aws-sdk/util-endpoints": 3.782.0 + "@aws-sdk/util-user-agent-browser": 3.775.0 + "@aws-sdk/util-user-agent-node": 3.782.0 + "@smithy/config-resolver": ^4.1.0 + "@smithy/core": ^3.2.0 + "@smithy/fetch-http-handler": ^5.0.2 + "@smithy/hash-node": ^4.0.2 + "@smithy/invalid-dependency": ^4.0.2 + "@smithy/middleware-content-length": ^4.0.2 + "@smithy/middleware-endpoint": ^4.1.0 + "@smithy/middleware-retry": ^4.1.0 + "@smithy/middleware-serde": ^4.0.3 + "@smithy/middleware-stack": ^4.0.2 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/node-http-handler": ^4.0.4 + "@smithy/protocol-http": ^5.1.0 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + "@smithy/url-parser": ^4.0.2 + "@smithy/util-base64": ^4.0.0 + "@smithy/util-body-length-browser": ^4.0.0 + "@smithy/util-body-length-node": ^4.0.0 + "@smithy/util-defaults-mode-browser": ^4.0.8 + "@smithy/util-defaults-mode-node": ^4.0.8 + "@smithy/util-endpoints": ^3.0.2 + "@smithy/util-middleware": ^4.0.2 + "@smithy/util-retry": ^4.0.2 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: c95ffbdb9d030587902eed54de2d2abdaca86b350ef34081ad4087de51a994428e7b77204a5e9320e4d6c435ce76cb53f8de395f84c3f1c39aa2ea46f3cee594 + languageName: node + linkType: hard + "@aws-sdk/client-sts@npm:3.569.0": version: 3.569.0 resolution: "@aws-sdk/client-sts@npm:3.569.0" @@ -441,6 +584,25 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/core@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/core@npm:3.775.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/core": ^3.2.0 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/property-provider": ^4.0.2 + "@smithy/protocol-http": ^5.1.0 + "@smithy/signature-v4": ^5.0.2 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + "@smithy/util-middleware": ^4.0.2 + fast-xml-parser: 4.4.1 + tslib: ^2.6.2 + checksum: 14fb2fb46c191d4409a1f35fc4276ec77c446e81f22d6dc5355d3d7a28575ab26253fc646e4a0deed05c2fe89e4850547096191a4ef3ec6bb775a1a4c30171d1 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-env@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/credential-provider-env@npm:3.568.0" @@ -453,6 +615,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-env@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.775.0" + dependencies: + "@aws-sdk/core": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@smithy/property-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 461d2dba7d8dde9720b99e9d34d6b9e4e115335d3d184d15011e36124fc73d182e9c9f33fcf77682428abc7849a1b248371758be46c23fc312521f51d08054e2 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-http@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/credential-provider-http@npm:3.568.0" @@ -470,6 +645,24 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-http@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.775.0" + dependencies: + "@aws-sdk/core": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@smithy/fetch-http-handler": ^5.0.2 + "@smithy/node-http-handler": ^4.0.4 + "@smithy/property-provider": ^4.0.2 + "@smithy/protocol-http": ^5.1.0 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + "@smithy/util-stream": ^4.2.0 + tslib: ^2.6.2 + checksum: f2a5939108ecdb330610b60fab61c01f0b98e972df2abaa5ac6e46102e4a2a7e877c934e28bacb32a855a431c33af53a169568ee2df6b1c4bcf6e32ed69c721a + languageName: node + linkType: hard + "@aws-sdk/credential-provider-ini@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.568.0" @@ -490,6 +683,27 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-ini@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.782.0" + dependencies: + "@aws-sdk/core": 3.775.0 + "@aws-sdk/credential-provider-env": 3.775.0 + "@aws-sdk/credential-provider-http": 3.775.0 + "@aws-sdk/credential-provider-process": 3.775.0 + "@aws-sdk/credential-provider-sso": 3.782.0 + "@aws-sdk/credential-provider-web-identity": 3.782.0 + "@aws-sdk/nested-clients": 3.782.0 + "@aws-sdk/types": 3.775.0 + "@smithy/credential-provider-imds": ^4.0.2 + "@smithy/property-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 26f2edeead793488d530a0c771fc93f167d4702301bdccf5369c21e193a673ce4a5f0c7abf1ad4828706e1cd2448b4f80fd0d719173df3ff39c6d95bf8ac9d8d + languageName: node + linkType: hard + "@aws-sdk/credential-provider-node@npm:3.569.0": version: 3.569.0 resolution: "@aws-sdk/credential-provider-node@npm:3.569.0" @@ -510,6 +724,26 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-node@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.782.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.775.0 + "@aws-sdk/credential-provider-http": 3.775.0 + "@aws-sdk/credential-provider-ini": 3.782.0 + "@aws-sdk/credential-provider-process": 3.775.0 + "@aws-sdk/credential-provider-sso": 3.782.0 + "@aws-sdk/credential-provider-web-identity": 3.782.0 + "@aws-sdk/types": 3.775.0 + "@smithy/credential-provider-imds": ^4.0.2 + "@smithy/property-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: b786082b9eeaba6f389b71f3bcc3b4044d6856d3aeac10231f20c3ac1489f4f9b4aa33a7703ac522ec58539c13d8fd010b6f8bef55ede5dabccb8cb0775a1a3e + languageName: node + linkType: hard + "@aws-sdk/credential-provider-process@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/credential-provider-process@npm:3.568.0" @@ -523,6 +757,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-process@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.775.0" + dependencies: + "@aws-sdk/core": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@smithy/property-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 5e8fc389ddf91694a590adb0ee2dadf148b7279759c1a0a8b3a055a78af0b75773f9f50f6a769be1d3284c639ad037a2a8951a463020e692c5f911c8e5062402 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-sso@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.568.0" @@ -538,6 +786,22 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-sso@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.782.0" + dependencies: + "@aws-sdk/client-sso": 3.782.0 + "@aws-sdk/core": 3.775.0 + "@aws-sdk/token-providers": 3.782.0 + "@aws-sdk/types": 3.775.0 + "@smithy/property-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 572f53045e34cc6689bb394f9cc136998dbc1b0301a39f84260c045d83086468b2dd7d7c94269899f4cbb191d374b9f49f6479b96288ac100ce1155d9924e03d + languageName: node + linkType: hard + "@aws-sdk/credential-provider-web-identity@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.568.0" @@ -552,6 +816,30 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-web-identity@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.782.0" + dependencies: + "@aws-sdk/core": 3.775.0 + "@aws-sdk/nested-clients": 3.782.0 + "@aws-sdk/types": 3.775.0 + "@smithy/property-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 313e59f2b551797c8253abf11b02f17ec6eab069a589bf1599b68b3177ae57949f00917830bbc9234b8ef692baa275a2242ccbcdaf05833b02b6265d5d8161fa + languageName: node + linkType: hard + +"@aws-sdk/endpoint-cache@npm:3.723.0": + version: 3.723.0 + resolution: "@aws-sdk/endpoint-cache@npm:3.723.0" + dependencies: + mnemonist: 0.38.3 + tslib: ^2.6.2 + checksum: ac2468af7e36141157202ad4a3c51e8e4f57c9ba50478b7d7f223973ac5e6d7d90516a8eb06d2c9369f7313d0ac33a2c89930310b70f8db3ab4ec40567767a0e + languageName: node + linkType: hard + "@aws-sdk/middleware-bucket-endpoint@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.568.0" @@ -567,6 +855,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-endpoint-discovery@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/middleware-endpoint-discovery@npm:3.775.0" + dependencies: + "@aws-sdk/endpoint-cache": 3.723.0 + "@aws-sdk/types": 3.775.0 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: f3dd4992fea9bb39bae6568f9771ad64a6127247db02f60790aa5b18dee361eed658bc07041b79177e29026dd9f5035f8aa755733b6a0b4ad8cf6c62cce40313 + languageName: node + linkType: hard + "@aws-sdk/middleware-expect-continue@npm:3.567.0": version: 3.567.0 resolution: "@aws-sdk/middleware-expect-continue@npm:3.567.0" @@ -607,6 +909,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-host-header@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.775.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 1e7fb71bc596250c20d51a6ec5f33801746db6ca553f2baf3f3261db5abf18dc5f0c31514c81496f6efaf39643aaa90226ca801b36d9bd76943221f15256a266 + languageName: node + linkType: hard + "@aws-sdk/middleware-location-constraint@npm:3.567.0": version: 3.567.0 resolution: "@aws-sdk/middleware-location-constraint@npm:3.567.0" @@ -629,6 +943,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-logger@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/middleware-logger@npm:3.775.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: ab46864523cd58e965bd7071781a8719dec7037aeef4c08345138ad90d6e0162ac911f79b40bd2bd3308776edbaa5dc987f9e104da0980537947227a4cddce12 + languageName: node + linkType: hard + "@aws-sdk/middleware-recursion-detection@npm:3.567.0": version: 3.567.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.567.0" @@ -641,6 +966,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-recursion-detection@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.775.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 652ac6384034cb7219d8f44cbbc059dbc68cc6f8c9e61dbd19bc5488ff267564cc899ab52cdc45aa79d0e2d4162ce52e00c518a3eb4371f5b72465e715cd5387 + languageName: node + linkType: hard + "@aws-sdk/middleware-sdk-s3@npm:3.569.0": version: 3.569.0 resolution: "@aws-sdk/middleware-sdk-s3@npm:3.569.0" @@ -697,6 +1034,67 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-user-agent@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.782.0" + dependencies: + "@aws-sdk/core": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@aws-sdk/util-endpoints": 3.782.0 + "@smithy/core": ^3.2.0 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: f36c661d189372ebad6faa2b4c601ba7bc045b3650918cc91a37680901c91b75b70314260bfa83cbab677fa2396979498179e493a8ca3530e54faba777556c9b + languageName: node + linkType: hard + +"@aws-sdk/nested-clients@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/nested-clients@npm:3.782.0" + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.775.0 + "@aws-sdk/middleware-host-header": 3.775.0 + "@aws-sdk/middleware-logger": 3.775.0 + "@aws-sdk/middleware-recursion-detection": 3.775.0 + "@aws-sdk/middleware-user-agent": 3.782.0 + "@aws-sdk/region-config-resolver": 3.775.0 + "@aws-sdk/types": 3.775.0 + "@aws-sdk/util-endpoints": 3.782.0 + "@aws-sdk/util-user-agent-browser": 3.775.0 + "@aws-sdk/util-user-agent-node": 3.782.0 + "@smithy/config-resolver": ^4.1.0 + "@smithy/core": ^3.2.0 + "@smithy/fetch-http-handler": ^5.0.2 + "@smithy/hash-node": ^4.0.2 + "@smithy/invalid-dependency": ^4.0.2 + "@smithy/middleware-content-length": ^4.0.2 + "@smithy/middleware-endpoint": ^4.1.0 + "@smithy/middleware-retry": ^4.1.0 + "@smithy/middleware-serde": ^4.0.3 + "@smithy/middleware-stack": ^4.0.2 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/node-http-handler": ^4.0.4 + "@smithy/protocol-http": ^5.1.0 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + "@smithy/url-parser": ^4.0.2 + "@smithy/util-base64": ^4.0.0 + "@smithy/util-body-length-browser": ^4.0.0 + "@smithy/util-body-length-node": ^4.0.0 + "@smithy/util-defaults-mode-browser": ^4.0.8 + "@smithy/util-defaults-mode-node": ^4.0.8 + "@smithy/util-endpoints": ^3.0.2 + "@smithy/util-middleware": ^4.0.2 + "@smithy/util-retry": ^4.0.2 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: b601a6097a950f471015cbd7738b11bf9ef24029e1649c9578ce6d374b117123fccac4abed7df2a63370adaa20418a4565615f0eec927e37c5c04f38eaf21475 + languageName: node + linkType: hard + "@aws-sdk/region-config-resolver@npm:3.567.0": version: 3.567.0 resolution: "@aws-sdk/region-config-resolver@npm:3.567.0" @@ -711,6 +1109,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/region-config-resolver@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.775.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + "@smithy/util-config-provider": ^4.0.0 + "@smithy/util-middleware": ^4.0.2 + tslib: ^2.6.2 + checksum: 774d3e65873c725634b208604df3aac379ba9a9b8c4910a0ba54360bae8855d22e7dd1310d15f1946d9b8b16bca03b268d29984d0b25f2ba33094aeb30da6072 + languageName: node + linkType: hard + "@aws-sdk/s3-request-presigner@npm:^3.556.0": version: 3.569.0 resolution: "@aws-sdk/s3-request-presigner@npm:3.569.0" @@ -756,6 +1168,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/token-providers@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/token-providers@npm:3.782.0" + dependencies: + "@aws-sdk/nested-clients": 3.782.0 + "@aws-sdk/types": 3.775.0 + "@smithy/property-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 4d6f567bcdeb271ae73afb3fc4ed22c13f6d6404e1911a30aae14656709fcd861006234691269077668f07f05d4d04206bf847dd8a43e8593cbda48321efdc65 + languageName: node + linkType: hard + "@aws-sdk/types@npm:3.567.0, @aws-sdk/types@npm:^3.222.0": version: 3.567.0 resolution: "@aws-sdk/types@npm:3.567.0" @@ -766,6 +1192,16 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/types@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/types@npm:3.775.0" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 106515a677a8619ecffc6a652d6866a29f9191f2f883d4a98e44ea1926a112994c4c4733e77f7d997f5f1a4cecf2ce605059a449001d5630ed73f6cd4d4d94a3 + languageName: node + linkType: hard + "@aws-sdk/util-arn-parser@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/util-arn-parser@npm:3.568.0" @@ -787,6 +1223,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-endpoints@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/util-endpoints@npm:3.782.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/types": ^4.2.0 + "@smithy/util-endpoints": ^3.0.2 + tslib: ^2.6.2 + checksum: a28cf7d265fb469f65e91eaef0c1c2e5c78ee2b3172164e56b2a9d0e19755cf6f2416212fa0a5101ea1b4b8fdbb47c45a1164c3fc04f28ca7ac4ade352ffc74f + languageName: node + linkType: hard + "@aws-sdk/util-format-url@npm:3.567.0": version: 3.567.0 resolution: "@aws-sdk/util-format-url@npm:3.567.0" @@ -820,6 +1268,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-browser@npm:3.775.0": + version: 3.775.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.775.0" + dependencies: + "@aws-sdk/types": 3.775.0 + "@smithy/types": ^4.2.0 + bowser: ^2.11.0 + tslib: ^2.6.2 + checksum: 527f3225a28a49de6893c2a396d80cd13cfa64f9cc9d16b575a708e5d4a6006e145aaec6166071012aacdb732604c3a554d69ab6f099fb021d0d15565bb7fb4c + languageName: node + linkType: hard + "@aws-sdk/util-user-agent-node@npm:3.568.0": version: 3.568.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.568.0" @@ -837,6 +1297,24 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-node@npm:3.782.0": + version: 3.782.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.782.0" + dependencies: + "@aws-sdk/middleware-user-agent": 3.782.0 + "@aws-sdk/types": 3.775.0 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: 713218125a52127023af7d2da9f2269d93259bdd8d871d9e6b235527f29f560fda7c0b26d76e17db4fbb6726e33f328c7ca48dc92dc58e64f932e25ee7aa944c + languageName: node + linkType: hard + "@aws-sdk/util-utf8-browser@npm:^3.0.0": version: 3.259.0 resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" @@ -5771,6 +6249,7 @@ __metadata: version: 0.0.0-use.local resolution: "@medusajs/framework@workspace:packages/core/framework" dependencies: + "@aws-sdk/client-dynamodb": ^3.218.0 "@jercle/yargonaut": ^1.1.5 "@medusajs/cli": 2.7.0 "@medusajs/modules-sdk": 2.7.0 @@ -5792,6 +6271,7 @@ __metadata: awilix: ^8.0.1 chokidar: ^3.4.2 compression: 1.7.4 + connect-dynamodb: ^3.0.5 connect-redis: 5.2.0 cookie-parser: ^1.4.6 cors: ^2.8.5 @@ -5812,6 +6292,7 @@ __metadata: vite: ^5.4.14 zod: 3.22.4 peerDependencies: + "@aws-sdk/client-dynamodb": ^3.218.0 "@medusajs/cli": 2.7.0 "@mikro-orm/cli": 6.4.3 "@mikro-orm/core": 6.4.3 @@ -5819,12 +6300,17 @@ __metadata: "@mikro-orm/migrations": 6.4.3 "@mikro-orm/postgresql": 6.4.3 awilix: ^8.0.1 + connect-dynamodb: ^3.0.5 ioredis: ^5.4.1 pg: ^8.13.0 vite: ^5.4.14 peerDependenciesMeta: + "@aws-sdk/client-dynamodb": + optional: true "@mikro-orm/cli": optional: true + connect-dynamodb: + optional: true ioredis: optional: true vite: @@ -11851,6 +12337,16 @@ __metadata: languageName: node linkType: hard +"@smithy/abort-controller@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/abort-controller@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: d5647478fa61d5d1cf3ac8fe5b91955c679ecf48e0d71638c0ce908fbcc87f166e42722d181f33ae3c37761de89e48c5eecf620f6fd0e99cd86edbb8365dd38d + languageName: node + linkType: hard + "@smithy/chunked-blob-reader-native@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/chunked-blob-reader-native@npm:2.2.0" @@ -11883,6 +12379,19 @@ __metadata: languageName: node linkType: hard +"@smithy/config-resolver@npm:^4.1.0": + version: 4.1.0 + resolution: "@smithy/config-resolver@npm:4.1.0" + dependencies: + "@smithy/node-config-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + "@smithy/util-config-provider": ^4.0.0 + "@smithy/util-middleware": ^4.0.2 + tslib: ^2.6.2 + checksum: db67064f27981452788ef8cffa3146a1896b50911379febda7315e0657e4fe3bba6c52414670b9778eb986fe06f7e50d10e7373fa644975a0491d27333e909de + languageName: node + linkType: hard + "@smithy/core@npm:^1.4.2": version: 1.4.2 resolution: "@smithy/core@npm:1.4.2" @@ -11899,6 +12408,22 @@ __metadata: languageName: node linkType: hard +"@smithy/core@npm:^3.2.0": + version: 3.2.0 + resolution: "@smithy/core@npm:3.2.0" + dependencies: + "@smithy/middleware-serde": ^4.0.3 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + "@smithy/util-body-length-browser": ^4.0.0 + "@smithy/util-middleware": ^4.0.2 + "@smithy/util-stream": ^4.2.0 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: ad514aec318c4863851c8167fdade41ac3393f245038de73b546fcdc6e3ad794c12a661d5248cb56a2e893c2b236db95a93d06c91e53b04e6c2967c31e300567 + languageName: node + linkType: hard + "@smithy/credential-provider-imds@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/credential-provider-imds@npm:2.3.0" @@ -11912,6 +12437,19 @@ __metadata: languageName: node linkType: hard +"@smithy/credential-provider-imds@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/credential-provider-imds@npm:4.0.2" + dependencies: + "@smithy/node-config-provider": ^4.0.2 + "@smithy/property-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + "@smithy/url-parser": ^4.0.2 + tslib: ^2.6.2 + checksum: 516482c103bd42d93de584ec75fa75d1184541816a7b430db109f8ec18abcaf8eb7bd072660fbf417f37a3df5c7438a1ba92aabd5a185ed736be1a6e885f0999 + languageName: node + linkType: hard + "@smithy/eventstream-codec@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/eventstream-codec@npm:2.2.0" @@ -11980,6 +12518,19 @@ __metadata: languageName: node linkType: hard +"@smithy/fetch-http-handler@npm:^5.0.2": + version: 5.0.2 + resolution: "@smithy/fetch-http-handler@npm:5.0.2" + dependencies: + "@smithy/protocol-http": ^5.1.0 + "@smithy/querystring-builder": ^4.0.2 + "@smithy/types": ^4.2.0 + "@smithy/util-base64": ^4.0.0 + tslib: ^2.6.2 + checksum: 3bf84a1fe93c07558a5ba520ab0aca62518c13659d5794094764aaef95acfbcf58ba938c51b9269c485304fdbe7353eb3cd37d7e4c57863d7c50478a9e3ff4fc + languageName: node + linkType: hard + "@smithy/hash-blob-browser@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/hash-blob-browser@npm:2.2.0" @@ -12004,6 +12555,18 @@ __metadata: languageName: node linkType: hard +"@smithy/hash-node@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/hash-node@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + "@smithy/util-buffer-from": ^4.0.0 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: aaec3fb2146d4347e97067de4dd91759de9d0254d03e234dcced1cbd52cf8b3a77067d571bd5767cb6295da7aa7261b87a789bd597cbc45a380cd90bb47f3490 + languageName: node + linkType: hard + "@smithy/hash-stream-node@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/hash-stream-node@npm:2.2.0" @@ -12025,6 +12588,16 @@ __metadata: languageName: node linkType: hard +"@smithy/invalid-dependency@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/invalid-dependency@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: f0b884ba25c371d3d3f507aebc24e598e23edeadf0a74dfd7092fc49c496cd427ab517454ebde454b2a05916719e01aa98f34603a5396455cc2dc009ad8799e8 + languageName: node + linkType: hard + "@smithy/is-array-buffer@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/is-array-buffer@npm:2.2.0" @@ -12034,6 +12607,15 @@ __metadata: languageName: node linkType: hard +"@smithy/is-array-buffer@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/is-array-buffer@npm:4.0.0" + dependencies: + tslib: ^2.6.2 + checksum: ae393fbd5944d710443cd5dd225d1178ef7fb5d6259c14f3e1316ec75e401bda6cf86f7eb98bfd38e5ed76e664b810426a5756b916702cbd418f0933e15e7a3b + languageName: node + linkType: hard + "@smithy/md5-js@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/md5-js@npm:2.2.0" @@ -12056,6 +12638,17 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-content-length@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/middleware-content-length@npm:4.0.2" + dependencies: + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 4ab343b68a15cf461f3b5996460a0730463975d9da739cf40cfb5993794023269a8bd857366f855844290fabb2b340abb6ff473cec4bfd3d6653a64f17e00c4a + languageName: node + linkType: hard + "@smithy/middleware-endpoint@npm:^2.5.1": version: 2.5.1 resolution: "@smithy/middleware-endpoint@npm:2.5.1" @@ -12071,6 +12664,22 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-endpoint@npm:^4.1.0": + version: 4.1.0 + resolution: "@smithy/middleware-endpoint@npm:4.1.0" + dependencies: + "@smithy/core": ^3.2.0 + "@smithy/middleware-serde": ^4.0.3 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + "@smithy/url-parser": ^4.0.2 + "@smithy/util-middleware": ^4.0.2 + tslib: ^2.6.2 + checksum: 1d38c793dbe5b32f01f96c6812935753ee14ebf5c9adf9f3782b6d3b36cf48537a7e123bfb7f7447effffa5dde0bd0d79c581cf07e8175fe1fb2b69fe158a41a + languageName: node + linkType: hard + "@smithy/middleware-retry@npm:^2.3.1": version: 2.3.1 resolution: "@smithy/middleware-retry@npm:2.3.1" @@ -12088,6 +12697,23 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-retry@npm:^4.1.0": + version: 4.1.0 + resolution: "@smithy/middleware-retry@npm:4.1.0" + dependencies: + "@smithy/node-config-provider": ^4.0.2 + "@smithy/protocol-http": ^5.1.0 + "@smithy/service-error-classification": ^4.0.2 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + "@smithy/util-middleware": ^4.0.2 + "@smithy/util-retry": ^4.0.2 + tslib: ^2.6.2 + uuid: ^9.0.1 + checksum: fe62a5be9f7e81bff08ce495792c8f5c6cffecd3a872125b8e3487b9bb2dd7341ee8804a714ab4cc8b00468f80d6d83fa19b146dfb0a8d38da9502c582655f52 + languageName: node + linkType: hard + "@smithy/middleware-serde@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/middleware-serde@npm:2.3.0" @@ -12098,6 +12724,16 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-serde@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/middleware-serde@npm:4.0.3" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 0a3b037c8f1cade46abf9c782fe11da3f1a92d59f3c61d5806fe26a0f3c8b20d5e7e9ab919549ba33762e63fb02c60b5e436b9459647af39300b37d975acde2e + languageName: node + linkType: hard + "@smithy/middleware-stack@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/middleware-stack@npm:2.2.0" @@ -12108,6 +12744,16 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-stack@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/middleware-stack@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: ef94882966431729f7a7bddf8206b6495d67736b1f26fd88d6d6c283a96f9fffd12632ed7352e5f060f17d3ee1845a9a9da1247c26e4c46ff7011aac20b4aacc + languageName: node + linkType: hard + "@smithy/node-config-provider@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/node-config-provider@npm:2.3.0" @@ -12120,6 +12766,18 @@ __metadata: languageName: node linkType: hard +"@smithy/node-config-provider@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/node-config-provider@npm:4.0.2" + dependencies: + "@smithy/property-provider": ^4.0.2 + "@smithy/shared-ini-file-loader": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 1a3b26835577e6c698a2ce59cd1dd9a3653c75e24847d35a45cd80124d72e0118b84daff47ee1ae0cdb89c134efdf7c7754d0ccf1e1c4b57467865b269b5cd0b + languageName: node + linkType: hard + "@smithy/node-http-handler@npm:^2.5.0": version: 2.5.0 resolution: "@smithy/node-http-handler@npm:2.5.0" @@ -12133,6 +12791,19 @@ __metadata: languageName: node linkType: hard +"@smithy/node-http-handler@npm:^4.0.4": + version: 4.0.4 + resolution: "@smithy/node-http-handler@npm:4.0.4" + dependencies: + "@smithy/abort-controller": ^4.0.2 + "@smithy/protocol-http": ^5.1.0 + "@smithy/querystring-builder": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: fb621c6ebcf012a99fc442d82965ca18d752f66be6f937a400e3b4e3feef1c259c028c27df9e78fc9ac7c40679b25276cbaa8d7ab82fd111bda64003ef831358 + languageName: node + linkType: hard + "@smithy/property-provider@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/property-provider@npm:2.2.0" @@ -12143,6 +12814,16 @@ __metadata: languageName: node linkType: hard +"@smithy/property-provider@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/property-provider@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 6effc5ef7895eb4802c6b4c704d5616f50cd0c376da1644176d3aef71396cb65f9df20f4dd85c8301a9fa24f8ac53601e0634463f4364f0d867928efa5eb5e3d + languageName: node + linkType: hard + "@smithy/protocol-http@npm:^3.3.0": version: 3.3.0 resolution: "@smithy/protocol-http@npm:3.3.0" @@ -12153,6 +12834,16 @@ __metadata: languageName: node linkType: hard +"@smithy/protocol-http@npm:^5.1.0": + version: 5.1.0 + resolution: "@smithy/protocol-http@npm:5.1.0" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: bb2f600853c0282630f5f32286a07a37294a57dbbec25ea0c6fbb6be32341b1be83e37933c2e3540e513c90dcb08f492bcb05980cde0b92b083e67ade6d56eb0 + languageName: node + linkType: hard + "@smithy/querystring-builder@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/querystring-builder@npm:2.2.0" @@ -12164,6 +12855,17 @@ __metadata: languageName: node linkType: hard +"@smithy/querystring-builder@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/querystring-builder@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + "@smithy/util-uri-escape": ^4.0.0 + tslib: ^2.6.2 + checksum: 2ae27840e21982926182df809872e07d6b10b2fd93b58e02fa3f9588de23d333ddf02f0f3517de8a02a949489733bdcecb8c847980f8fb12ce1f8c3b6d127e86 + languageName: node + linkType: hard + "@smithy/querystring-parser@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/querystring-parser@npm:2.2.0" @@ -12174,6 +12876,16 @@ __metadata: languageName: node linkType: hard +"@smithy/querystring-parser@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/querystring-parser@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: e6115fce0a07b1509f407cd3eca371cce1d9c09c7e3bd9156e35506b8ab1100f9864fb8779d4dbe0169501af23f062ebc2176afc012e9132e917781cd11a2f82 + languageName: node + linkType: hard + "@smithy/service-error-classification@npm:^2.1.5": version: 2.1.5 resolution: "@smithy/service-error-classification@npm:2.1.5" @@ -12183,6 +12895,15 @@ __metadata: languageName: node linkType: hard +"@smithy/service-error-classification@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/service-error-classification@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + checksum: a1f16a891cf96fad624e928d2e55d8b438b2acbb57098d615486bf01488a22f949223127a15e93b273e099a227cbe2ce7be3a3f538d1a4619fb2554dcf33d3dd + languageName: node + linkType: hard + "@smithy/shared-ini-file-loader@npm:^2.4.0": version: 2.4.0 resolution: "@smithy/shared-ini-file-loader@npm:2.4.0" @@ -12193,6 +12914,16 @@ __metadata: languageName: node linkType: hard +"@smithy/shared-ini-file-loader@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/shared-ini-file-loader@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 1e3d4921b6efbd1aa448a775dcb9a490d0221dd0a4fee434c5d83376de478013b3ad06d58a3d52db781124d4a53bd289fffcdb52eabffe9de152b0010332cee2 + languageName: node + linkType: hard + "@smithy/signature-v4@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/signature-v4@npm:2.3.0" @@ -12208,6 +12939,22 @@ __metadata: languageName: node linkType: hard +"@smithy/signature-v4@npm:^5.0.2": + version: 5.0.2 + resolution: "@smithy/signature-v4@npm:5.0.2" + dependencies: + "@smithy/is-array-buffer": ^4.0.0 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + "@smithy/util-hex-encoding": ^4.0.0 + "@smithy/util-middleware": ^4.0.2 + "@smithy/util-uri-escape": ^4.0.0 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: 379b2bcd535cfcf68567b8931920eefd3ec30fc734369b5a1055792377a815cb7b6c7fc3a18567e6066d771ddfd0d06da8e45334a02bf86d69985d1923a11c29 + languageName: node + linkType: hard + "@smithy/smithy-client@npm:^2.5.1": version: 2.5.1 resolution: "@smithy/smithy-client@npm:2.5.1" @@ -12222,6 +12969,21 @@ __metadata: languageName: node linkType: hard +"@smithy/smithy-client@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/smithy-client@npm:4.2.0" + dependencies: + "@smithy/core": ^3.2.0 + "@smithy/middleware-endpoint": ^4.1.0 + "@smithy/middleware-stack": ^4.0.2 + "@smithy/protocol-http": ^5.1.0 + "@smithy/types": ^4.2.0 + "@smithy/util-stream": ^4.2.0 + tslib: ^2.6.2 + checksum: 0d7ac7549edd92a7c50abcfdb9607f729533ff1aa5f70fbe7e3f9a47a272f0f1487094fb72f421d0bbf303b335e349bfd3db3f5b9e841037c3f23f47febb0f6b + languageName: node + linkType: hard + "@smithy/types@npm:^2.12.0": version: 2.12.0 resolution: "@smithy/types@npm:2.12.0" @@ -12231,6 +12993,15 @@ __metadata: languageName: node linkType: hard +"@smithy/types@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/types@npm:4.2.0" + dependencies: + tslib: ^2.6.2 + checksum: a8bd92c7e548bcbe7be211152de041ec164cfcc857d7574a87b1667c38827e5616563c13bd38a1d44b88bbfa3ee8f591dc597d4e2d50f3bc74e320ea82d7c49e + languageName: node + linkType: hard + "@smithy/url-parser@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/url-parser@npm:2.2.0" @@ -12242,6 +13013,17 @@ __metadata: languageName: node linkType: hard +"@smithy/url-parser@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/url-parser@npm:4.0.2" + dependencies: + "@smithy/querystring-parser": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 3da40fc18871c145bcbbb036a3d767ae113b954e94c745770f268dc877378cbafa6fc06759ea5a5e5c159a88e7331739b35b69f4d110ba0bd04b2d0923443f32 + languageName: node + linkType: hard + "@smithy/util-base64@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/util-base64@npm:2.3.0" @@ -12253,6 +13035,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-base64@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-base64@npm:4.0.0" + dependencies: + "@smithy/util-buffer-from": ^4.0.0 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: ad18ec66cc357c189eef358d96876b114faf7086b13e47e009b265d0ff80cec046052500489c183957b3a036768409acdd1a373e01074cc002ca6983f780cffc + languageName: node + linkType: hard + "@smithy/util-body-length-browser@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-body-length-browser@npm:2.2.0" @@ -12262,6 +13055,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-body-length-browser@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-body-length-browser@npm:4.0.0" + dependencies: + tslib: ^2.6.2 + checksum: 574a10934024a86556e9dcde1a9776170284326c3dfcc034afa128cc5a33c1c8179fca9cfb622ef8be5f2004316cc3f427badccceb943e829105536ec26306d9 + languageName: node + linkType: hard + "@smithy/util-body-length-node@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/util-body-length-node@npm:2.3.0" @@ -12271,6 +13073,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-body-length-node@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-body-length-node@npm:4.0.0" + dependencies: + tslib: ^2.6.2 + checksum: e91fd3816767606c5f786166ada26440457fceb60f96653b3d624dcf762a8c650e513c275ff3f647cb081c63c283cc178853a7ed9aa224abc8ece4eeeef7a1dd + languageName: node + linkType: hard + "@smithy/util-buffer-from@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-buffer-from@npm:2.2.0" @@ -12281,6 +13092,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-buffer-from@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-buffer-from@npm:4.0.0" + dependencies: + "@smithy/is-array-buffer": ^4.0.0 + tslib: ^2.6.2 + checksum: be7cd33b6cb91503982b297716251e67cdca02819a15797632091cadab2dc0b4a147fff0709a0aa9bbc0b82a2644a7ed7c8afdd2194d5093cee2e9605b3a9f6f + languageName: node + linkType: hard + "@smithy/util-config-provider@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/util-config-provider@npm:2.3.0" @@ -12290,6 +13111,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-config-provider@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-config-provider@npm:4.0.0" + dependencies: + tslib: ^2.6.2 + checksum: cd9498d5f77a73aadd575084bcb22d2bb5945bac4605d605d36f2efe3f165f2b60f4dc88b7a62c2ed082ffa4b2c2f19621d0859f18399edbc2b5988d92e4649f + languageName: node + linkType: hard + "@smithy/util-defaults-mode-browser@npm:^2.2.1": version: 2.2.1 resolution: "@smithy/util-defaults-mode-browser@npm:2.2.1" @@ -12303,6 +13133,19 @@ __metadata: languageName: node linkType: hard +"@smithy/util-defaults-mode-browser@npm:^4.0.8": + version: 4.0.8 + resolution: "@smithy/util-defaults-mode-browser@npm:4.0.8" + dependencies: + "@smithy/property-provider": ^4.0.2 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + bowser: ^2.11.0 + tslib: ^2.6.2 + checksum: ada59bc98f2538d189363bc8e22c7cb72b9ddd06142fbca54921efa5742cc248e8ea06f79ec679cb916683d3ac9e3a35bafb6377ee5d4cff8715e46de1445b81 + languageName: node + linkType: hard + "@smithy/util-defaults-mode-node@npm:^2.3.1": version: 2.3.1 resolution: "@smithy/util-defaults-mode-node@npm:2.3.1" @@ -12318,6 +13161,21 @@ __metadata: languageName: node linkType: hard +"@smithy/util-defaults-mode-node@npm:^4.0.8": + version: 4.0.8 + resolution: "@smithy/util-defaults-mode-node@npm:4.0.8" + dependencies: + "@smithy/config-resolver": ^4.1.0 + "@smithy/credential-provider-imds": ^4.0.2 + "@smithy/node-config-provider": ^4.0.2 + "@smithy/property-provider": ^4.0.2 + "@smithy/smithy-client": ^4.2.0 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: cbdfe00d5cd645250ca49416ebddcfc1055da3412826cf0baa75d4af6e58765ac7ea4b262a48c5bbd4e60e4329e362b76f96c319db1112b2d92b506c82bc002a + languageName: node + linkType: hard + "@smithy/util-endpoints@npm:^1.2.0": version: 1.2.0 resolution: "@smithy/util-endpoints@npm:1.2.0" @@ -12329,6 +13187,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-endpoints@npm:^3.0.2": + version: 3.0.2 + resolution: "@smithy/util-endpoints@npm:3.0.2" + dependencies: + "@smithy/node-config-provider": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 5d2fe3956dc528842c071329bc69bd6567462858c1fbb1cc7ca19622227a803b54d95f44f3ac703852bce6349f455bfec599aea51df56d02e3c8b12e6481c27a + languageName: node + linkType: hard + "@smithy/util-hex-encoding@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-hex-encoding@npm:2.2.0" @@ -12338,6 +13207,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-hex-encoding@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-hex-encoding@npm:4.0.0" + dependencies: + tslib: ^2.6.2 + checksum: 70dbb3aa1a79aff3329d07a66411ff26398df338bdd8a6d077b438231afe3dc86d9a7022204baddecd8bc633f059d5c841fa916d81dd7447ea79b64148f386d2 + languageName: node + linkType: hard + "@smithy/util-middleware@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-middleware@npm:2.2.0" @@ -12348,6 +13226,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-middleware@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/util-middleware@npm:4.0.2" + dependencies: + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 18c3882c94f1b1bbb3825c30d1e41ae77a8da3dcd93ebbf1c486f34d5db9e06431789aef54d1b1fbb0424b115fc1e1ae17d27efe4af4277173d901a76147fef8 + languageName: node + linkType: hard + "@smithy/util-retry@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-retry@npm:2.2.0" @@ -12359,6 +13247,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-retry@npm:^4.0.2": + version: 4.0.2 + resolution: "@smithy/util-retry@npm:4.0.2" + dependencies: + "@smithy/service-error-classification": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: c2b98faa4171f620aa17a0f0a91dff9215a4729242a040ad25aee4c716752a64944cc58031ae71bcf3fc320b3e84cb3da4648e5bbccd782126a721e588d98b87 + languageName: node + linkType: hard + "@smithy/util-stream@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-stream@npm:2.2.0" @@ -12375,6 +13274,22 @@ __metadata: languageName: node linkType: hard +"@smithy/util-stream@npm:^4.2.0": + version: 4.2.0 + resolution: "@smithy/util-stream@npm:4.2.0" + dependencies: + "@smithy/fetch-http-handler": ^5.0.2 + "@smithy/node-http-handler": ^4.0.4 + "@smithy/types": ^4.2.0 + "@smithy/util-base64": ^4.0.0 + "@smithy/util-buffer-from": ^4.0.0 + "@smithy/util-hex-encoding": ^4.0.0 + "@smithy/util-utf8": ^4.0.0 + tslib: ^2.6.2 + checksum: 52449a6ec68a483fdeef816128c923c744e278f6cf4d5b6fbe50e29fa8b6e5813df26221389f22bce143deb91f047ac56f87db85306908c5d0b87460e162bf63 + languageName: node + linkType: hard + "@smithy/util-uri-escape@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-uri-escape@npm:2.2.0" @@ -12384,7 +13299,16 @@ __metadata: languageName: node linkType: hard -"@smithy/util-utf8@npm:^2.3.0": +"@smithy/util-uri-escape@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-uri-escape@npm:4.0.0" + dependencies: + tslib: ^2.6.2 + checksum: 23984624060756adba8aa4ab1693fe6b387ee5064d8ec4dfd39bb5908c4ee8b9c3f2dc755da9b07505d8e3ce1338c1867abfa74158931e4728bf3cfcf2c05c3d + languageName: node + linkType: hard + +"@smithy/util-utf8@npm:^2.0.0, @smithy/util-utf8@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/util-utf8@npm:2.3.0" dependencies: @@ -12394,6 +13318,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-utf8@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-utf8@npm:4.0.0" + dependencies: + "@smithy/util-buffer-from": ^4.0.0 + tslib: ^2.6.2 + checksum: 28a5a5372cbf0b3d2e32dd16f79b04c2aec6f704cf13789db922e9686fde38dde0171491cfa4c2c201595d54752a319faaeeed3c325329610887694431e28c98 + languageName: node + linkType: hard + "@smithy/util-waiter@npm:^2.2.0": version: 2.2.0 resolution: "@smithy/util-waiter@npm:2.2.0" @@ -12405,6 +13339,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-waiter@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/util-waiter@npm:4.0.3" + dependencies: + "@smithy/abort-controller": ^4.0.2 + "@smithy/types": ^4.2.0 + tslib: ^2.6.2 + checksum: 0ca992cd85719b367655943df08e8f7f0dd0f4ffe335809de7ed4c133ee2db5b58a2661cfc43040cf91512ef21783c8302fc2352f95910ecf3f0a50b0e32c2ff + languageName: node + linkType: hard + "@storybook/addon-actions@npm:8.3.5": version: 8.3.5 resolution: "@storybook/addon-actions@npm:8.3.5" @@ -17535,6 +18480,18 @@ __metadata: languageName: node linkType: hard +"connect-dynamodb@npm:^3.0.5": + version: 3.0.5 + resolution: "connect-dynamodb@npm:3.0.5" + dependencies: + "@aws-sdk/client-dynamodb": ^3.218.0 + dependenciesMeta: + "@aws-sdk/client-dynamodb": + optional: true + checksum: ca8114f306f1d2f1f591898adcd357d7c84b6102b304d31f81727e1294c7be5fa555b0856fb27681be3d483fdaf94a97101bcb9a032a826e509f3265a88d5e29 + languageName: node + linkType: hard + "connect-redis@npm:5.2.0": version: 5.2.0 resolution: "connect-redis@npm:5.2.0" @@ -20749,6 +21706,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:4.4.1": + version: 4.4.1 + resolution: "fast-xml-parser@npm:4.4.1" + dependencies: + strnum: ^1.0.5 + bin: + fxparser: src/cli/cli.js + checksum: 7f334841fe41bfb0bf5d920904ccad09cefc4b5e61eaf4c225bf1e1bb69ee77ef2147d8942f783ee8249e154d1ca8a858e10bda78a5d78b8bed3f48dcee9bf33 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.17.1 resolution: "fastq@npm:1.17.1" @@ -25635,6 +26603,15 @@ __metadata: languageName: node linkType: hard +"mnemonist@npm:0.38.3": + version: 0.38.3 + resolution: "mnemonist@npm:0.38.3" + dependencies: + obliterator: ^1.6.1 + checksum: 064aa1ee1a89fce2754423b3617c598fd65bc34311eb3c01dc063976f6b819b073bd23532415cf8c92240157b4c8fbb7ec5d79d717f2bd4fcd95d8131cb23acb + languageName: node + linkType: hard + "mobx-react-lite@npm:^4.0.7": version: 4.0.7 resolution: "mobx-react-lite@npm:4.0.7" @@ -26508,6 +27485,13 @@ __metadata: languageName: node linkType: hard +"obliterator@npm:^1.6.1": + version: 1.6.1 + resolution: "obliterator@npm:1.6.1" + checksum: 5fad57319aae0ef6e34efa640541d41c2dd9790a7ab808f17dcb66c83a81333963fc2dfcfa6e1b62158e5cef6291cdcf15c503ad6c3de54b2227dd4c3d7e1b55 + languageName: node + linkType: hard + "obuf@npm:~1.1.2": version: 1.1.2 resolution: "obuf@npm:1.1.2"