From 7e43aabda05c31a3d3fdc2d997d2d270741e26d6 Mon Sep 17 00:00:00 2001 From: Riqwan Thamir Date: Fri, 10 May 2024 17:16:16 +0200 Subject: [PATCH 1/4] chore(medusa): strict zod versions in workspace (#7296) --- .changeset/happy-mirrors-decide.md | 5 +++++ packages/medusa/package.json | 2 +- yarn.lock | 9 +-------- 3 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 .changeset/happy-mirrors-decide.md diff --git a/.changeset/happy-mirrors-decide.md b/.changeset/happy-mirrors-decide.md new file mode 100644 index 000000000000..d4669d431754 --- /dev/null +++ b/.changeset/happy-mirrors-decide.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +chore(medusa): strict zod versions in workspace diff --git a/packages/medusa/package.json b/packages/medusa/package.json index 4954ccee5674..beb28e1d21b0 100644 --- a/packages/medusa/package.json +++ b/packages/medusa/package.json @@ -103,7 +103,7 @@ "ulid": "^2.3.0", "uuid": "^9.0.0", "winston": "^3.8.2", - "zod": "^3.22.4" + "zod": "3.22.4" }, "gitHead": "cd1f5afa5aa8c0b15ea957008ee19f1d695cbd2e" } diff --git a/yarn.lock b/yarn.lock index 3d23d24fbf75..fad1fc377f39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5442,7 +5442,7 @@ __metadata: ulid: ^2.3.0 uuid: ^9.0.0 winston: ^3.8.2 - zod: ^3.22.4 + zod: 3.22.4 peerDependencies: medusa-interfaces: ^1.3.7 typeorm: ^0.3.16 @@ -32926,10 +32926,3 @@ __metadata: checksum: 7578ab283dac0eee66a0ad0fc4a7f28c43e6745aadb3a529f59a4b851aa10872b3890398b3160f257f4b6817b4ce643debdda4fb21a2c040adda7862cab0a587 languageName: node linkType: hard - -"zod@npm:^3.22.4": - version: 3.23.6 - resolution: "zod@npm:3.23.6" - checksum: 9181606c656235cf6454c60ded6ec783226acafc0206844e9729b4d3c1c6ade411b195fa2590e882d3368c82580a44869567f7aebab005bf8d8476db6186d43f - languageName: node - linkType: hard From e5904f8c758f850779380962ef9ac4efe0521878 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Fri, 10 May 2024 17:43:43 +0200 Subject: [PATCH 2/4] fix(medusa): Missing middlewares export (#7289) --- .changeset/itchy-forks-relate.md | 5 +++++ packages/medusa/src/api-v2/admin/api-keys/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/campaigns/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/collections/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/currencies/middlewares.ts | 2 +- .../src/api-v2/admin/customer-groups/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/customers/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/draft-orders/middlewares.ts | 2 +- .../src/api-v2/admin/fulfillment-providers/middlewares.ts | 2 +- .../src/api-v2/admin/fulfillment-sets/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/fulfillments/middlewares.ts | 2 +- .../src/api-v2/admin/inventory-items/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/invites/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/orders/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/payments/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/price-lists/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/pricing/middlewares.ts | 2 +- .../src/api-v2/admin/product-categories/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/product-types/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/products/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/promotions/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/regions/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/reservations/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/sales-channels/middlewares.ts | 2 +- .../src/api-v2/admin/shipping-options/middlewares.ts | 2 +- .../src/api-v2/admin/shipping-profiles/middlewares.ts | 2 +- .../src/api-v2/admin/stock-locations/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/stores/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/tax-rates/middlewares.ts | 2 +- .../medusa/src/api-v2/admin/tax-regions/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/uploads/middlewares.ts | 2 +- packages/medusa/src/api-v2/admin/users/middlewares.ts | 2 +- .../src/api-v2/admin/workflows-executions/middlewares.ts | 2 +- packages/medusa/src/api-v2/auth/middlewares.ts | 2 +- packages/medusa/src/api-v2/store/carts/middlewares.ts | 2 +- packages/medusa/src/api-v2/store/customers/middlewares.ts | 2 +- packages/medusa/src/api-v2/store/orders/middlewares.ts | 2 +- .../src/api-v2/store/payment-collections/middlewares.ts | 2 +- packages/medusa/src/api-v2/store/products/middlewares.ts | 2 +- packages/medusa/src/loaders/helpers/routing/index.ts | 8 ++++---- packages/medusa/src/utils/index.ts | 1 + .../utils/{ => middlewares}/authenticate-middleware.ts | 2 +- packages/medusa/src/utils/middlewares/index.ts | 3 ++- 43 files changed, 51 insertions(+), 44 deletions(-) create mode 100644 .changeset/itchy-forks-relate.md rename packages/medusa/src/utils/{ => middlewares}/authenticate-middleware.ts (99%) diff --git a/.changeset/itchy-forks-relate.md b/.changeset/itchy-forks-relate.md new file mode 100644 index 000000000000..c454d880f138 --- /dev/null +++ b/.changeset/itchy-forks-relate.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +fix(medusa): Missing middlewares export diff --git a/packages/medusa/src/api-v2/admin/api-keys/middlewares.ts b/packages/medusa/src/api-v2/admin/api-keys/middlewares.ts index 8e9e00248625..199398031370 100644 --- a/packages/medusa/src/api-v2/admin/api-keys/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/api-keys/middlewares.ts @@ -1,7 +1,7 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateApiKey, diff --git a/packages/medusa/src/api-v2/admin/campaigns/middlewares.ts b/packages/medusa/src/api-v2/admin/campaigns/middlewares.ts index a83bfe4d3777..2a8c6f20da9b 100644 --- a/packages/medusa/src/api-v2/admin/campaigns/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/campaigns/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import { createLinkBody } from "../../utils/validators" diff --git a/packages/medusa/src/api-v2/admin/collections/middlewares.ts b/packages/medusa/src/api-v2/admin/collections/middlewares.ts index a584c53d4e57..4a86b5744575 100644 --- a/packages/medusa/src/api-v2/admin/collections/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/collections/middlewares.ts @@ -1,6 +1,6 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateCollection, diff --git a/packages/medusa/src/api-v2/admin/currencies/middlewares.ts b/packages/medusa/src/api-v2/admin/currencies/middlewares.ts index 58f82d2f7dab..ab49f125776c 100644 --- a/packages/medusa/src/api-v2/admin/currencies/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/currencies/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" import { AdminGetCurrencyParams, AdminGetCurrenciesParams } from "./validators" diff --git a/packages/medusa/src/api-v2/admin/customer-groups/middlewares.ts b/packages/medusa/src/api-v2/admin/customer-groups/middlewares.ts index a7c3dbacf256..4356ee3de54d 100644 --- a/packages/medusa/src/api-v2/admin/customer-groups/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/customer-groups/middlewares.ts @@ -1,6 +1,6 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateCustomerGroup, diff --git a/packages/medusa/src/api-v2/admin/customers/middlewares.ts b/packages/medusa/src/api-v2/admin/customers/middlewares.ts index 0306ba0b0e57..30a1664060cd 100644 --- a/packages/medusa/src/api-v2/admin/customers/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/customers/middlewares.ts @@ -11,7 +11,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" diff --git a/packages/medusa/src/api-v2/admin/draft-orders/middlewares.ts b/packages/medusa/src/api-v2/admin/draft-orders/middlewares.ts index 15a42ae7c990..4964d2806c7e 100644 --- a/packages/medusa/src/api-v2/admin/draft-orders/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/draft-orders/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" diff --git a/packages/medusa/src/api-v2/admin/fulfillment-providers/middlewares.ts b/packages/medusa/src/api-v2/admin/fulfillment-providers/middlewares.ts index 31c924d3f46f..9b42a3d2b11a 100644 --- a/packages/medusa/src/api-v2/admin/fulfillment-providers/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/fulfillment-providers/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" import { AdminFulfillmentProvidersParams } from "./validators" diff --git a/packages/medusa/src/api-v2/admin/fulfillment-sets/middlewares.ts b/packages/medusa/src/api-v2/admin/fulfillment-sets/middlewares.ts index 9a378c6aa093..f4bbf073d9f2 100644 --- a/packages/medusa/src/api-v2/admin/fulfillment-sets/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/fulfillment-sets/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" diff --git a/packages/medusa/src/api-v2/admin/fulfillments/middlewares.ts b/packages/medusa/src/api-v2/admin/fulfillments/middlewares.ts index f1545f0e2c4a..ebcaf91fcad9 100644 --- a/packages/medusa/src/api-v2/admin/fulfillments/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/fulfillments/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" diff --git a/packages/medusa/src/api-v2/admin/inventory-items/middlewares.ts b/packages/medusa/src/api-v2/admin/inventory-items/middlewares.ts index 4448c33c3947..bb6a336cc2c2 100644 --- a/packages/medusa/src/api-v2/admin/inventory-items/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/inventory-items/middlewares.ts @@ -1,6 +1,6 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateInventoryItem, diff --git a/packages/medusa/src/api-v2/admin/invites/middlewares.ts b/packages/medusa/src/api-v2/admin/invites/middlewares.ts index 755b69edddbc..b13f7591abe5 100644 --- a/packages/medusa/src/api-v2/admin/invites/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/invites/middlewares.ts @@ -9,7 +9,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { validateAndTransformBody } from "../../utils/validate-body" diff --git a/packages/medusa/src/api-v2/admin/orders/middlewares.ts b/packages/medusa/src/api-v2/admin/orders/middlewares.ts index a5974dad042e..9208d9fdbd49 100644 --- a/packages/medusa/src/api-v2/admin/orders/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/orders/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" import { AdminGetOrdersOrderParams, AdminGetOrdersParams } from "./validators" diff --git a/packages/medusa/src/api-v2/admin/payments/middlewares.ts b/packages/medusa/src/api-v2/admin/payments/middlewares.ts index 7d0bcc3f4a7c..acdf36bdd8bb 100644 --- a/packages/medusa/src/api-v2/admin/payments/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/payments/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { unlessPath } from "../../utils/unless-path" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" diff --git a/packages/medusa/src/api-v2/admin/price-lists/middlewares.ts b/packages/medusa/src/api-v2/admin/price-lists/middlewares.ts index 4982c5497618..178e91f80ca9 100644 --- a/packages/medusa/src/api-v2/admin/price-lists/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/price-lists/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import { createBatchBody, createLinkBody } from "../../utils/validators" diff --git a/packages/medusa/src/api-v2/admin/pricing/middlewares.ts b/packages/medusa/src/api-v2/admin/pricing/middlewares.ts index 9075afdf6513..98732f27a244 100644 --- a/packages/medusa/src/api-v2/admin/pricing/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/pricing/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" diff --git a/packages/medusa/src/api-v2/admin/product-categories/middlewares.ts b/packages/medusa/src/api-v2/admin/product-categories/middlewares.ts index e62f07a9a60a..e871e666120b 100644 --- a/packages/medusa/src/api-v2/admin/product-categories/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/product-categories/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import { createLinkBody } from "../../utils/validators" diff --git a/packages/medusa/src/api-v2/admin/product-types/middlewares.ts b/packages/medusa/src/api-v2/admin/product-types/middlewares.ts index 903202651d3f..55fd9534da8d 100644 --- a/packages/medusa/src/api-v2/admin/product-types/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/product-types/middlewares.ts @@ -1,6 +1,6 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateProductType, diff --git a/packages/medusa/src/api-v2/admin/products/middlewares.ts b/packages/medusa/src/api-v2/admin/products/middlewares.ts index 5f431ba4e97c..1df9084c4420 100644 --- a/packages/medusa/src/api-v2/admin/products/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/products/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { maybeApplyLinkFilter } from "../../utils/maybe-apply-link-filter" import { unlessPath } from "../../utils/unless-path" import { validateAndTransformBody } from "../../utils/validate-body" diff --git a/packages/medusa/src/api-v2/admin/promotions/middlewares.ts b/packages/medusa/src/api-v2/admin/promotions/middlewares.ts index d0bb738b7360..d708b54cbc38 100644 --- a/packages/medusa/src/api-v2/admin/promotions/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/promotions/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import { createBatchBody } from "../../utils/validators" diff --git a/packages/medusa/src/api-v2/admin/regions/middlewares.ts b/packages/medusa/src/api-v2/admin/regions/middlewares.ts index aa175b1dccb3..5ce7620c7d48 100644 --- a/packages/medusa/src/api-v2/admin/regions/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/regions/middlewares.ts @@ -1,6 +1,6 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateRegion, diff --git a/packages/medusa/src/api-v2/admin/reservations/middlewares.ts b/packages/medusa/src/api-v2/admin/reservations/middlewares.ts index 6cd787a7574c..45cac0485e85 100644 --- a/packages/medusa/src/api-v2/admin/reservations/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/reservations/middlewares.ts @@ -1,7 +1,7 @@ import * as QueryConfig from "./query-config" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { AdminCreateReservation, diff --git a/packages/medusa/src/api-v2/admin/sales-channels/middlewares.ts b/packages/medusa/src/api-v2/admin/sales-channels/middlewares.ts index c976e1b77d05..ac249fffa7a0 100644 --- a/packages/medusa/src/api-v2/admin/sales-channels/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/sales-channels/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { maybeApplyLinkFilter } from "../../utils/maybe-apply-link-filter" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" diff --git a/packages/medusa/src/api-v2/admin/shipping-options/middlewares.ts b/packages/medusa/src/api-v2/admin/shipping-options/middlewares.ts index 32d2fd8dc985..335ac3142ece 100644 --- a/packages/medusa/src/api-v2/admin/shipping-options/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/shipping-options/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { AdminCreateShippingOption, AdminCreateShippingOptionRule, diff --git a/packages/medusa/src/api-v2/admin/shipping-profiles/middlewares.ts b/packages/medusa/src/api-v2/admin/shipping-profiles/middlewares.ts index 56ebd7278f18..88a4b26ab891 100644 --- a/packages/medusa/src/api-v2/admin/shipping-profiles/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/shipping-profiles/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import { diff --git a/packages/medusa/src/api-v2/admin/stock-locations/middlewares.ts b/packages/medusa/src/api-v2/admin/stock-locations/middlewares.ts index 18f67160bbdc..cc106409a177 100644 --- a/packages/medusa/src/api-v2/admin/stock-locations/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/stock-locations/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { maybeApplyLinkFilter } from "../../utils/maybe-apply-link-filter" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" diff --git a/packages/medusa/src/api-v2/admin/stores/middlewares.ts b/packages/medusa/src/api-v2/admin/stores/middlewares.ts index 5dd2672ee94c..b128c13b71e7 100644 --- a/packages/medusa/src/api-v2/admin/stores/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/stores/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" diff --git a/packages/medusa/src/api-v2/admin/tax-rates/middlewares.ts b/packages/medusa/src/api-v2/admin/tax-rates/middlewares.ts index 63e810ef8db5..84a5928f4281 100644 --- a/packages/medusa/src/api-v2/admin/tax-rates/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/tax-rates/middlewares.ts @@ -10,7 +10,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" export const adminTaxRateRoutesMiddlewares: MiddlewareRoute[] = [ diff --git a/packages/medusa/src/api-v2/admin/tax-regions/middlewares.ts b/packages/medusa/src/api-v2/admin/tax-regions/middlewares.ts index 288dcd9245b8..4bf30a9abac9 100644 --- a/packages/medusa/src/api-v2/admin/tax-regions/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/tax-regions/middlewares.ts @@ -7,7 +7,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" diff --git a/packages/medusa/src/api-v2/admin/uploads/middlewares.ts b/packages/medusa/src/api-v2/admin/uploads/middlewares.ts index 74a30ca05891..c4a5eba550ef 100644 --- a/packages/medusa/src/api-v2/admin/uploads/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/uploads/middlewares.ts @@ -1,6 +1,6 @@ import multer from "multer" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { retrieveUploadConfig } from "./query-config" import { AdminGetUploadParams } from "./validators" diff --git a/packages/medusa/src/api-v2/admin/users/middlewares.ts b/packages/medusa/src/api-v2/admin/users/middlewares.ts index 0106d9cdbf9e..261e0f4303bb 100644 --- a/packages/medusa/src/api-v2/admin/users/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/users/middlewares.ts @@ -8,7 +8,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { validateAndTransformBody } from "../../utils/validate-body" diff --git a/packages/medusa/src/api-v2/admin/workflows-executions/middlewares.ts b/packages/medusa/src/api-v2/admin/workflows-executions/middlewares.ts index 0a90fe3c8a4c..43558acf4d85 100644 --- a/packages/medusa/src/api-v2/admin/workflows-executions/middlewares.ts +++ b/packages/medusa/src/api-v2/admin/workflows-executions/middlewares.ts @@ -8,7 +8,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import { validateAndTransformBody } from "../../utils/validate-body" diff --git a/packages/medusa/src/api-v2/auth/middlewares.ts b/packages/medusa/src/api-v2/auth/middlewares.ts index 499a192c48d6..3c67152a73d9 100644 --- a/packages/medusa/src/api-v2/auth/middlewares.ts +++ b/packages/medusa/src/api-v2/auth/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../types/middlewares" -import { authenticate } from "../../utils/authenticate-middleware" +import { authenticate } from "../../utils/middlewares/authenticate-middleware" export const authRoutesMiddlewares: MiddlewareRoute[] = [ { diff --git a/packages/medusa/src/api-v2/store/carts/middlewares.ts b/packages/medusa/src/api-v2/store/carts/middlewares.ts index 749bbd8e094d..1827d7403498 100644 --- a/packages/medusa/src/api-v2/store/carts/middlewares.ts +++ b/packages/medusa/src/api-v2/store/carts/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as OrderQueryConfig from "../orders/query-config" diff --git a/packages/medusa/src/api-v2/store/customers/middlewares.ts b/packages/medusa/src/api-v2/store/customers/middlewares.ts index 6910189c89c7..a8b72f87939e 100644 --- a/packages/medusa/src/api-v2/store/customers/middlewares.ts +++ b/packages/medusa/src/api-v2/store/customers/middlewares.ts @@ -11,7 +11,7 @@ import { } from "./validators" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" diff --git a/packages/medusa/src/api-v2/store/orders/middlewares.ts b/packages/medusa/src/api-v2/store/orders/middlewares.ts index f172f5acd772..c5bf47ab0bb6 100644 --- a/packages/medusa/src/api-v2/store/orders/middlewares.ts +++ b/packages/medusa/src/api-v2/store/orders/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformQuery } from "../../utils/validate-query" import * as QueryConfig from "./query-config" import { StoreGetOrderParams, StoreGetOrdersParams } from "./validators" diff --git a/packages/medusa/src/api-v2/store/payment-collections/middlewares.ts b/packages/medusa/src/api-v2/store/payment-collections/middlewares.ts index 5d438072ee44..153b62cd665a 100644 --- a/packages/medusa/src/api-v2/store/payment-collections/middlewares.ts +++ b/packages/medusa/src/api-v2/store/payment-collections/middlewares.ts @@ -1,5 +1,5 @@ import { MiddlewareRoute } from "../../../types/middlewares" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { validateAndTransformBody } from "../../utils/validate-body" import { validateAndTransformQuery } from "../../utils/validate-query" import * as queryConfig from "./query-config" diff --git a/packages/medusa/src/api-v2/store/products/middlewares.ts b/packages/medusa/src/api-v2/store/products/middlewares.ts index 0c727c836f31..8527265fc579 100644 --- a/packages/medusa/src/api-v2/store/products/middlewares.ts +++ b/packages/medusa/src/api-v2/store/products/middlewares.ts @@ -1,6 +1,6 @@ import { isPresent, ProductStatus } from "@medusajs/utils" import { MiddlewareRoute } from "../../../loaders/helpers/routing/types" -import { authenticate } from "../../../utils/authenticate-middleware" +import { authenticate } from "../../../utils/middlewares/authenticate-middleware" import { maybeApplyLinkFilter } from "../../utils/maybe-apply-link-filter" import { applyDefaultFilters, diff --git a/packages/medusa/src/loaders/helpers/routing/index.ts b/packages/medusa/src/loaders/helpers/routing/index.ts index df40b43bff9f..933cce0e8ad8 100644 --- a/packages/medusa/src/loaders/helpers/routing/index.ts +++ b/packages/medusa/src/loaders/helpers/routing/index.ts @@ -1,12 +1,12 @@ import { promiseAll, wrapHandler } from "@medusajs/utils" import cors from "cors" -import { Router, json, text, urlencoded, type Express } from "express" +import { type Express, json, Router, text, urlencoded } from "express" import { readdir } from "fs/promises" import { parseCorsOrigins } from "medusa-core-utils" import { extname, join, sep } from "path" import { - authenticate, authenticateCustomer, + authenticateLegacy, errorHandler, requireCustomerAuthentication, } from "../../../utils/middlewares" @@ -18,8 +18,8 @@ import { GlobalMiddlewareDescriptor, HTTP_METHODS, MiddlewareRoute, - MiddlewareVerb, MiddlewaresConfig, + MiddlewareVerb, ParserConfigArgs, RouteConfig, RouteDescriptor, @@ -665,7 +665,7 @@ export class RoutesLoader { /** * Require the admin to be authenticated */ - this.router.use(descriptor.route, authenticate()) + this.router.use(descriptor.route, authenticateLegacy()) } for (const route of routes) { diff --git a/packages/medusa/src/utils/index.ts b/packages/medusa/src/utils/index.ts index 5b25a5dcaf79..f3e6dcbd2468 100644 --- a/packages/medusa/src/utils/index.ts +++ b/packages/medusa/src/utils/index.ts @@ -16,3 +16,4 @@ export * from "./set-metadata" export * from "./validate-id" export { registerOverriddenValidators, validator } from "./validator" export * from "./validators/is-type" +export * from "./middlewares" diff --git a/packages/medusa/src/utils/authenticate-middleware.ts b/packages/medusa/src/utils/middlewares/authenticate-middleware.ts similarity index 99% rename from packages/medusa/src/utils/authenticate-middleware.ts rename to packages/medusa/src/utils/middlewares/authenticate-middleware.ts index 327e07e9870b..7d5b3d78d332 100644 --- a/packages/medusa/src/utils/authenticate-middleware.ts +++ b/packages/medusa/src/utils/middlewares/authenticate-middleware.ts @@ -7,7 +7,7 @@ import { AuthenticatedMedusaRequest, MedusaRequest, MedusaResponse, -} from "../types/routing" +} from "../../types/routing" const SESSION_AUTH = "session" const BEARER_AUTH = "bearer" diff --git a/packages/medusa/src/utils/middlewares/index.ts b/packages/medusa/src/utils/middlewares/index.ts index ee4cdcd5e9e2..97453ab2d363 100644 --- a/packages/medusa/src/utils/middlewares/index.ts +++ b/packages/medusa/src/utils/middlewares/index.ts @@ -1,4 +1,5 @@ -export { default as authenticate } from "./authenticate" +export { default as authenticateLegacy } from "./authenticate" +export { authenticate } from "./authenticate-middleware" export { default as authenticateCustomer } from "./authenticate-customer" export { default as wrapHandler } from "./await-middleware" export { default as errorHandler } from "./error-handler" From e960f10aba11523e85ce61195fe162489148a712 Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Fri, 10 May 2024 21:06:55 +0300 Subject: [PATCH 3/4] fix(docblock-generator): fix how type names created from Zod objects are inferred (#7292) --- .../src/classes/helpers/oas-schema.ts | 15 +++-- .../src/classes/kinds/oas.ts | 67 ++++++++++++++----- .../src/utils/get-correct-zod-type-name.ts | 23 +++++++ .../src/utils/is-zod-object.ts | 15 +++++ 4 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 www/utils/packages/docblock-generator/src/utils/get-correct-zod-type-name.ts create mode 100644 www/utils/packages/docblock-generator/src/utils/is-zod-object.ts diff --git a/www/utils/packages/docblock-generator/src/classes/helpers/oas-schema.ts b/www/utils/packages/docblock-generator/src/classes/helpers/oas-schema.ts index bd5ffbb75ee0..35424d3bf8fd 100644 --- a/www/utils/packages/docblock-generator/src/classes/helpers/oas-schema.ts +++ b/www/utils/packages/docblock-generator/src/classes/helpers/oas-schema.ts @@ -8,7 +8,8 @@ import getOasOutputBasePath from "../../utils/get-oas-output-base-path.js" import { parse } from "yaml" import formatOas from "../../utils/format-oas.js" import pluralize from "pluralize" -import { wordsToPascal } from "utils" +import { capitalize, wordsToPascal } from "utils" +import { OasArea } from "../kinds/oas.js" export type ParsedSchema = { schema: OpenApiSchema @@ -200,7 +201,10 @@ class OasSchemaHelper { * @returns The normalized name. */ normalizeSchemaName(name: string): string { - return name.replace("DTO", "").replace(this.schemaRefPrefix, "") + return name + .replace("DTO", "") + .replace(this.schemaRefPrefix, "") + .replace(/Type$/, "") } /** @@ -256,10 +260,11 @@ class OasSchemaHelper { * associated with a tag. * * @param tagName - The name of the tag. - * @returns The possible name of the associated schema. + * @returns The possible names of the associated schema. */ - tagNameToSchemaName(tagName: string): string { - return wordsToPascal(pluralize.singular(tagName)) + tagNameToSchemaName(tagName: string, area: OasArea): string[] { + const mainSchemaName = wordsToPascal(pluralize.singular(tagName)) + return [mainSchemaName, `${capitalize(area)}Create${mainSchemaName}`] } } diff --git a/www/utils/packages/docblock-generator/src/classes/kinds/oas.ts b/www/utils/packages/docblock-generator/src/classes/kinds/oas.ts index a05523afb7f3..cc6fdf20e987 100644 --- a/www/utils/packages/docblock-generator/src/classes/kinds/oas.ts +++ b/www/utils/packages/docblock-generator/src/classes/kinds/oas.ts @@ -19,11 +19,13 @@ import OasExamplesGenerator from "../examples/oas.js" import pluralize from "pluralize" import getOasOutputBasePath from "../../utils/get-oas-output-base-path.js" import parseOas, { ExistingOas } from "../../utils/parse-oas.js" -import OasSchemaHelper from "../helpers/oas-schema.js" +import OasSchemaHelper, { ParsedSchema } from "../helpers/oas-schema.js" import formatOas from "../../utils/format-oas.js" import { DEFAULT_OAS_RESPONSES } from "../../constants.js" import { capitalize, kebabToTitle, wordsToKebab } from "utils" import SchemaFactory from "../helpers/schema-factory.js" +import isZodObject from "../../utils/is-zod-object.js" +import getCorrectZodTypeName from "../../utils/get-correct-zod-type-name.js" export const API_ROUTE_PARAM_REGEX = /\[(.+?)\]/g const RES_STATUS_REGEX = /^res[\s\S]*\.status\((\d+)\)/ @@ -1094,11 +1096,16 @@ class OasKindGenerator extends FunctionKindGenerator { const requestTypeArguments = this.checker.getTypeArguments(requestType) if (requestTypeArguments.length === 1) { + const zodObjectTypeName = getCorrectZodTypeName({ + typeReferenceNode: node.parameters[0].type, + itemType: requestTypeArguments[0], + }) requestSchema = this.typeToSchema({ itemType: requestTypeArguments[0], descriptionOptions: { parentName: tagName, }, + zodObjectTypeName: zodObjectTypeName, }) } } @@ -1167,6 +1174,10 @@ class OasKindGenerator extends FunctionKindGenerator { descriptionOptions: { parentName: tagName, }, + zodObjectTypeName: getCorrectZodTypeName({ + typeReferenceNode: node.parameters[1].type, + itemType: responseTypeArguments[0], + }), }) } } @@ -1187,6 +1198,7 @@ class OasKindGenerator extends FunctionKindGenerator { descriptionOptions, allowedChildren, disallowedChildren, + zodObjectTypeName, }: { /** * The TypeScript type. @@ -1214,6 +1226,12 @@ class OasKindGenerator extends FunctionKindGenerator { * only children not included in this array are added to the schema. */ disallowedChildren?: string[] + /** + * By default, the type name is generated from itemType, which + * doesn't work for types created by Zod. This allows to correct the + * generated type name. + */ + zodObjectTypeName?: string }): OpenApiSchema { if (level > this.MAX_LEVEL) { return {} @@ -1227,7 +1245,8 @@ class OasKindGenerator extends FunctionKindGenerator { : title ? this.getSchemaDescription({ typeStr: title, nodeType: itemType }) : this.defaultSummary - const typeAsString = this.checker.typeToString(itemType) + const typeAsString = + zodObjectTypeName || this.checker.typeToString(itemType) const schemaFromFactory = this.schemaFactory.tryGetSchema( itemType.symbol?.getName() || @@ -1433,6 +1452,7 @@ class OasKindGenerator extends FunctionKindGenerator { (itemType as ts.Type).flags === ts.TypeFlags.Object: const properties: Record = {} const requiredProperties: string[] = [] + if (level + 1 <= this.MAX_LEVEL) { itemType.getProperties().forEach((property) => { if ( @@ -1461,7 +1481,9 @@ class OasKindGenerator extends FunctionKindGenerator { type: "object", description, "x-schemaName": - itemType.isClassOrInterface() || itemType.isTypeParameter() + itemType.isClassOrInterface() || + itemType.isTypeParameter() || + (isZodObject(itemType) && zodObjectTypeName) ? this.oasSchemaHelper.normalizeSchemaName(typeAsString) : undefined, required: @@ -1871,32 +1893,43 @@ class OasKindGenerator extends FunctionKindGenerator { const areaYaml = parse( readFileSync(areaYamlPath, "utf-8") ) as OpenApiDocument - let addedTags = false + let modifiedTags = false areaYaml.tags = [...(areaYaml.tags || [])] this.tags.get(area)?.forEach((tag) => { const existingTag = areaYaml.tags!.find((baseTag) => baseTag.name === tag) + // try to retrieve associated schema + let schema: ParsedSchema | undefined + this.oasSchemaHelper.tagNameToSchemaName(tag, area).some((schemaName) => { + schema = this.oasSchemaHelper.getSchemaByName(schemaName) + + if (schema) { + return true + } + }) + const associatedSchema = schema?.schema?.["x-schemaName"] + ? { + $ref: this.oasSchemaHelper.constructSchemaReference( + schema.schema["x-schemaName"] + ), + } + : undefined if (!existingTag) { - // try to retrieve associated schema - const schema = this.oasSchemaHelper.getSchemaByName( - this.oasSchemaHelper.tagNameToSchemaName(tag) - ) areaYaml.tags!.push({ name: tag, - "x-associatedSchema": schema?.schema?.["x-schemaName"] - ? { - $ref: this.oasSchemaHelper.constructSchemaReference( - schema.schema["x-schemaName"] - ), - } - : undefined, + "x-associatedSchema": associatedSchema, }) - addedTags = true + modifiedTags = true + } else if ( + existingTag["x-associatedSchema"]?.$ref !== associatedSchema?.$ref + ) { + existingTag["x-associatedSchema"] = associatedSchema + modifiedTags = true } }) - if (addedTags) { + if (modifiedTags) { // sort alphabetically areaYaml.tags.sort((tagA, tagB) => { return tagA.name.localeCompare(tagB.name) diff --git a/www/utils/packages/docblock-generator/src/utils/get-correct-zod-type-name.ts b/www/utils/packages/docblock-generator/src/utils/get-correct-zod-type-name.ts new file mode 100644 index 000000000000..b8e25ed56f30 --- /dev/null +++ b/www/utils/packages/docblock-generator/src/utils/get-correct-zod-type-name.ts @@ -0,0 +1,23 @@ +// Due to some types using Zod in their declaration +// The type name isn't picked properly by typescript + +import ts from "typescript" +import isZodObject from "./is-zod-object.js" + +// this ensures that the correct type name is used. +export default function getCorrectZodTypeName({ + typeReferenceNode, + itemType, +}: { + typeReferenceNode: ts.TypeReferenceNode + itemType: ts.Type +}): string | undefined { + if (!isZodObject(itemType)) { + return + } + + return typeReferenceNode.typeArguments?.[0] && + "typeName" in typeReferenceNode.typeArguments[0] + ? (typeReferenceNode.typeArguments?.[0].typeName as ts.Identifier).getText() + : undefined +} diff --git a/www/utils/packages/docblock-generator/src/utils/is-zod-object.ts b/www/utils/packages/docblock-generator/src/utils/is-zod-object.ts new file mode 100644 index 000000000000..7329c91e867f --- /dev/null +++ b/www/utils/packages/docblock-generator/src/utils/is-zod-object.ts @@ -0,0 +1,15 @@ +import ts from "typescript" + +export default function isZodObject(itemType: ts.Type): boolean { + if (!itemType.symbol?.declarations?.length) { + return false + } + + const parent = itemType.symbol.declarations[0].parent + + if (!("typeName" in parent)) { + return false + } + + return (parent.typeName as ts.Identifier).getText().includes("ZodObject") +} From 1a68f4602c328f9f1e21be0a51c7b6330dd00fba Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Fri, 10 May 2024 21:07:35 +0300 Subject: [PATCH 4/4] feat(api-ref): show schema of a tag (#7297) --- package.json | 4 +- .../api-reference/app/api/schema/route.ts | 73 ++++++++++ .../components/Section/Container/index.tsx | 8 +- .../CodeSection/Responses/Sample/index.tsx | 74 ++-------- .../components/Tags/Paths/index.tsx | 7 +- .../components/Tags/Section/Schema/index.tsx | 135 ++++++++++++++++++ .../components/Tags/Section/index.tsx | 43 +++++- .../api-reference/hooks/use-schema-example.ts | 85 +++++++++++ www/apps/api-reference/types/openapi.ts | 5 + .../api-reference/utils/get-paths-of-tag.ts | 2 +- .../docs-ui/src/providers/Sidebar/index.tsx | 9 +- 11 files changed, 368 insertions(+), 77 deletions(-) create mode 100644 www/apps/api-reference/app/api/schema/route.ts create mode 100644 www/apps/api-reference/components/Tags/Section/Schema/index.tsx create mode 100644 www/apps/api-reference/hooks/use-schema-example.ts diff --git a/package.json b/package.json index 145824857d71..49b493e98ea3 100644 --- a/package.json +++ b/package.json @@ -77,8 +77,8 @@ "test:integration:packages": "turbo run test:integration --concurrency=50% --no-daemon --no-cache --force --filter='./packages/*' --filter='./packages/core/*' --filter='./packages/cli/*' --filter='./packages/modules/*' --filter='./packages/modules/providers/*'", "test:integration:api": "turbo run test:integration:chunk --concurrency=50% --no-daemon --no-cache --force --filter=integration-tests-api", "test:integration:modules": "turbo run test:integration:chunk --concurrency=50% --no-daemon --no-cache --force --filter=integration-tests-modules", - "openapi:generate": "yarn ./packages/oas/oas-github-ci run ci --with-full-file --v2", - "medusa-oas": "yarn ./packages/oas/medusa-oas-cli run medusa-oas --v2", + "openapi:generate": "yarn ./packages/cli/oas/oas-github-ci run ci --with-full-file --v2", + "medusa-oas": "yarn ./packages/cli/oas/medusa-oas-cli run medusa-oas --v2", "release:snapshot": "changeset publish --no-git-tags --snapshot --tag snapshot", "release:next": "chgstangeset publish --no-git-tags --snapshot --tag next", "version:next": "changeset version --snapshot next", diff --git a/www/apps/api-reference/app/api/schema/route.ts b/www/apps/api-reference/app/api/schema/route.ts new file mode 100644 index 000000000000..719eb3f33681 --- /dev/null +++ b/www/apps/api-reference/app/api/schema/route.ts @@ -0,0 +1,73 @@ +import { NextResponse } from "next/server" +import { SchemaObject, Version } from "../../../types/openapi" +import path from "path" +import { existsSync, promises as fs } from "fs" +import { parseDocument } from "yaml" + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url) + let name = searchParams.get("name") + const area = searchParams.get("area") + const version = (searchParams.get("version") as Version) || "1" + + if (!name) { + return NextResponse.json( + { + success: false, + message: `Name is required.`, + }, + { + status: 400, + } + ) + } + + if (area !== "admin" && area !== "store") { + return NextResponse.json( + { + success: false, + message: `area ${area} is not allowed`, + }, + { + status: 400, + } + ) + } + + name = name + .replace("#/components/schemas/", "") + .replaceAll("./components/schemas/", "") + + const schemaPath = path.join( + process.cwd(), + version === "1" ? "specs" : "specs-v2", + area, + "components", + "schemas", + name + ) + + if (!existsSync(schemaPath)) { + return NextResponse.json( + { + success: false, + message: `Schema ${name} doesn't exist.`, + }, + { + status: 404, + } + ) + } + + const schemaContent = await fs.readFile(schemaPath, "utf-8") + const schema = parseDocument(schemaContent).toJS() as SchemaObject + + return NextResponse.json( + { + schema, + }, + { + status: 200, + } + ) +} diff --git a/www/apps/api-reference/components/Section/Container/index.tsx b/www/apps/api-reference/components/Section/Container/index.tsx index acf1bf4d7272..0394e510620a 100644 --- a/www/apps/api-reference/components/Section/Container/index.tsx +++ b/www/apps/api-reference/components/Section/Container/index.tsx @@ -5,14 +5,18 @@ import { forwardRef } from "react" type SectionContainerProps = { children: React.ReactNode noTopPadding?: boolean + noDivider?: boolean } const SectionContainer = forwardRef( - function SectionContainer({ children, noTopPadding = false }, ref) { + function SectionContainer( + { children, noTopPadding = false, noDivider = false }, + ref + ) { return (
{children} - + {!noDivider && }
) } diff --git a/www/apps/api-reference/components/Tags/Operation/CodeSection/Responses/Sample/index.tsx b/www/apps/api-reference/components/Tags/Operation/CodeSection/Responses/Sample/index.tsx index 37615bef4c96..a1d8a3c623b7 100644 --- a/www/apps/api-reference/components/Tags/Operation/CodeSection/Responses/Sample/index.tsx +++ b/www/apps/api-reference/components/Tags/Operation/CodeSection/Responses/Sample/index.tsx @@ -1,9 +1,7 @@ import { CodeBlock } from "docs-ui" import type { ExampleObject, ResponseObject } from "@/types/openapi" -import type { JSONSchema7 } from "json-schema" -import stringify from "json-stringify-pretty-compact" -import { sample } from "openapi-sampler" -import { useCallback, useEffect, useState } from "react" +import { useEffect, useState } from "react" +import useSchemaExample from "../../../../../../hooks/use-schema-example" export type TagsOperationCodeSectionResponsesSampleProps = { response: ResponseObject @@ -13,69 +11,21 @@ const TagsOperationCodeSectionResponsesSample = ({ response, className, }: TagsOperationCodeSectionResponsesSampleProps) => { - const [examples, setExamples] = useState([]) + const contentSchema = response.content + ? Object.values(response.content)[0] + : undefined + const { examples } = useSchemaExample({ + schema: contentSchema?.schema, + schemaExample: contentSchema?.example, + schemaExamples: contentSchema?.examples, + }) const [selectedExample, setSelectedExample] = useState< ExampleObject | undefined >() - const initExamples = useCallback(() => { - if (!response.content) { - return [] - } - const contentSchema = Object.values(response.content)[0] - const tempExamples = [] - if (contentSchema.examples) { - Object.entries(contentSchema.examples).forEach(([value, example]) => { - if ("$ref" in example) { - return [] - } - - tempExamples.push({ - title: example.summary || "", - value, - content: stringify(example.value, { - maxLength: 50, - }), - }) - }) - } else if (contentSchema.example) { - tempExamples.push({ - title: "", - value: "", - content: stringify(contentSchema.example, { - maxLength: 50, - }), - }) - } else { - const contentSample = stringify( - sample( - { - ...contentSchema.schema, - } as JSONSchema7, - { - skipNonRequired: true, - } - ), - { - maxLength: 50, - } - ) - - tempExamples.push({ - title: "", - value: "", - content: contentSample, - }) - } - - return tempExamples - }, [response.content]) - useEffect(() => { - const tempExamples = initExamples() - setExamples(tempExamples) - setSelectedExample(tempExamples[0]) - }, [initExamples]) + setSelectedExample(examples[0]) + }, [examples]) return ( <> diff --git a/www/apps/api-reference/components/Tags/Paths/index.tsx b/www/apps/api-reference/components/Tags/Paths/index.tsx index 845043c3ee7d..c71b6a55c194 100644 --- a/www/apps/api-reference/components/Tags/Paths/index.tsx +++ b/www/apps/api-reference/components/Tags/Paths/index.tsx @@ -64,10 +64,9 @@ const TagPaths = ({ tag, className }: TagPathsProps) => { { path: tagSlugName }, false ) - if (!parentItem?.children?.length) { - const items: SidebarItemType[] = getTagChildSidebarItems(paths) - - addItems(items, { + const pathItems: SidebarItemType[] = getTagChildSidebarItems(paths) + if ((parentItem?.children?.length || 0) < pathItems.length) { + addItems(pathItems, { section: SidebarItemSections.BOTTOM, parent: { path: tagSlugName, diff --git a/www/apps/api-reference/components/Tags/Section/Schema/index.tsx b/www/apps/api-reference/components/Tags/Section/Schema/index.tsx new file mode 100644 index 000000000000..e23b048e2992 --- /dev/null +++ b/www/apps/api-reference/components/Tags/Section/Schema/index.tsx @@ -0,0 +1,135 @@ +import { useEffect, useMemo } from "react" +import { SchemaObject } from "../../../../types/openapi" +import TagOperationParameters from "../../Operation/Parameters" +import { + Badge, + CodeBlock, + isElmWindow, + useScrollController, + useSidebar, +} from "docs-ui" +import { SidebarItemSections } from "types" +import getSectionId from "../../../../utils/get-section-id" +import DividedLayout from "../../../../layouts/Divided" +import SectionContainer from "../../../Section/Container" +import useSchemaExample from "../../../../hooks/use-schema-example" +import { InView } from "react-intersection-observer" +import checkElementInViewport from "../../../../utils/check-element-in-viewport" + +export type TagSectionSchemaProps = { + schema: SchemaObject + tagName: string +} + +const TagSectionSchema = ({ schema, tagName }: TagSectionSchemaProps) => { + const { addItems, setActivePath, activePath } = useSidebar() + const tagSlugName = useMemo(() => getSectionId([tagName]), [tagName]) + const formattedName = useMemo(() => { + if (!schema["x-schemaName"]) { + return tagName.replaceAll(" ", "") + } + + return schema["x-schemaName"] + .replaceAll(/^(Admin|Store)/g, "") + .replaceAll(/^Create/g, "") + }, [schema, tagName]) + const schemaSlug = useMemo( + () => getSectionId([tagName, formattedName, "schema"]), + [tagName, formattedName] + ) + const { examples } = useSchemaExample({ + schema, + options: { + skipNonRequired: false, + }, + }) + + const { scrollableElement } = useScrollController() + const root = useMemo(() => { + return isElmWindow(scrollableElement) ? document.body : scrollableElement + }, [scrollableElement]) + + useEffect(() => { + addItems( + [ + { + path: schemaSlug, + title: `${formattedName} Object`, + additionalElms: Schema, + loaded: true, + }, + ], + { + section: SidebarItemSections.BOTTOM, + parent: { + path: tagSlugName, + changeLoaded: true, + }, + indexPosition: 0, + } + ) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [formattedName]) + + useEffect(() => { + if (schemaSlug === (activePath || location.hash.replace("#", ""))) { + const elm = document.getElementById(schemaSlug) + elm?.scrollIntoView({ + block: "center", + }) + } + }, []) + + const handleViewChange = ( + inView: boolean, + entry: IntersectionObserverEntry + ) => { + const section = entry.target + + if ( + (inView || checkElementInViewport(section, 40)) && + activePath !== schemaSlug + ) { + // can't use next router as it doesn't support + // changing url without scrolling + history.pushState({}, "", `#${schemaSlug}`) + setActivePath(schemaSlug) + } + } + + return ( + + +

{formattedName} Object

+

+ Fields +

+ + + } + codeContent={ + + {examples.length && ( + + )} + + } + /> +
+ ) +} + +export default TagSectionSchema diff --git a/www/apps/api-reference/components/Tags/Section/index.tsx b/www/apps/api-reference/components/Tags/Section/index.tsx index 060d0fb07c84..d0d82461d4d5 100644 --- a/www/apps/api-reference/components/Tags/Section/index.tsx +++ b/www/apps/api-reference/components/Tags/Section/index.tsx @@ -1,10 +1,15 @@ "use client" import getSectionId from "@/utils/get-section-id" -import type { OpenAPIV3 } from "openapi-types" import { useInView } from "react-intersection-observer" import { useEffect, useMemo, useState } from "react" -import { isElmWindow, useScrollController, useSidebar } from "docs-ui" +import { + getLinkWithBasePath, + isElmWindow, + swrFetcher, + useScrollController, + useSidebar, +} from "docs-ui" import dynamic from "next/dynamic" import type { SectionProps } from "../../Section" import type { MDXContentClientProps } from "../../MDXContent/Client" @@ -12,21 +17,29 @@ import TagPaths from "../Paths" import DividedLayout from "@/layouts/Divided" import LoadingProvider from "@/providers/loading" import SectionContainer from "../../Section/Container" -import { useArea } from "../../../providers/area" +import { useArea } from "@/providers/area" import SectionDivider from "../../Section/Divider" import clsx from "clsx" import { Feedback, Loading, Link } from "docs-ui" import { usePathname } from "next/navigation" -import formatReportLink from "../../../utils/format-report-link" +import formatReportLink from "@/utils/format-report-link" +import { SchemaObject, TagObject } from "@/types/openapi" +import useSWR from "swr" +import { useVersion } from "@/providers/version" +import { TagSectionSchemaProps } from "./Schema" export type TagSectionProps = { - tag: OpenAPIV3.TagObject + tag: TagObject } & React.HTMLAttributes const Section = dynamic( async () => import("../../Section") ) as React.FC +const TagSectionSchema = dynamic( + async () => import("./Schema") +) as React.FC + const MDXContentClient = dynamic( async () => import("../../MDXContent/Client"), { @@ -41,6 +54,23 @@ const TagSection = ({ tag }: TagSectionProps) => { const { area } = useArea() const pathname = usePathname() const { scrollableElement } = useScrollController() + const { version } = useVersion() + const { data } = useSWR<{ + schema: SchemaObject + }>( + tag["x-associatedSchema"] + ? getLinkWithBasePath( + `/schema?name=${tag["x-associatedSchema"].$ref}&area=${area}&version=${version}`, + process.env.NEXT_PUBLIC_BASE_PATH + ) + : null, + swrFetcher, + { + errorRetryInterval: 2000, + } + ) + const associatedSchema = data?.schema + const root = useMemo(() => { return isElmWindow(scrollableElement) ? document.body : scrollableElement }, [scrollableElement]) @@ -118,6 +148,9 @@ const TagSection = ({ tag }: TagSectionProps) => { } codeContent={<>} /> + {associatedSchema && ( + + )} {loadPaths && ( diff --git a/www/apps/api-reference/hooks/use-schema-example.ts b/www/apps/api-reference/hooks/use-schema-example.ts new file mode 100644 index 000000000000..774b157a02bd --- /dev/null +++ b/www/apps/api-reference/hooks/use-schema-example.ts @@ -0,0 +1,85 @@ +"use client" + +import { useMemo } from "react" +import { ExampleObject, SchemaObject } from "../types/openapi" +import type { JSONSchema7 } from "json-schema" +import stringify from "json-stringify-pretty-compact" +import { sample } from "openapi-sampler" +import { OpenAPIV3 } from "openapi-types" + +type Options = { + schema?: SchemaObject + schemaExamples?: OpenAPIV3.ExampleObject + schemaExample?: any + options?: { + skipNonRequired?: boolean + } +} + +const useSchemaExample = ({ + schema, + schemaExamples, + schemaExample, + options = {}, +}: Options) => { + const { skipNonRequired = true } = options + const examples = useMemo(() => { + const tempExamples: ExampleObject[] = [] + + if (!schema) { + return tempExamples + } + + if (schemaExamples) { + Object.entries(schemaExamples).forEach(([value, example]) => { + if ("$ref" in example) { + return [] + } + + tempExamples.push({ + title: example.summary || "", + value, + content: stringify(example.value, { + maxLength: 50, + }), + }) + }) + } else if (schemaExample) { + tempExamples.push({ + title: "", + value: "", + content: stringify(schemaExample, { + maxLength: 50, + }), + }) + } else { + const contentSample = stringify( + sample( + { + ...schema, + } as JSONSchema7, + { + skipNonRequired, + } + ), + { + maxLength: 50, + } + ) + + tempExamples.push({ + title: "", + value: "", + content: contentSample, + }) + } + + return tempExamples + }, [schema, schemaExample, schemaExamples, skipNonRequired]) + + return { + examples, + } +} + +export default useSchemaExample diff --git a/www/apps/api-reference/types/openapi.ts b/www/apps/api-reference/types/openapi.ts index f54ee313984c..a6e5d3d31c64 100644 --- a/www/apps/api-reference/types/openapi.ts +++ b/www/apps/api-reference/types/openapi.ts @@ -88,6 +88,7 @@ export type SchemaObject = (ArraySchemaObject | NonArraySchemaObject) & { isRequired?: boolean "x-featureFlag"?: string "x-expandable"?: string + "x-schemaName"?: string } export type PropertiesObject = { @@ -114,3 +115,7 @@ export type ExpandedDocument = Document & { [k: string]: PathsObject } } + +export type TagObject = OpenAPIV3.TagObject & { + "x-associatedSchema"?: OpenAPIV3.ReferenceObject +} diff --git a/www/apps/api-reference/utils/get-paths-of-tag.ts b/www/apps/api-reference/utils/get-paths-of-tag.ts index f90fb30ae8cd..009c86bdd3b6 100644 --- a/www/apps/api-reference/utils/get-paths-of-tag.ts +++ b/www/apps/api-reference/utils/get-paths-of-tag.ts @@ -34,7 +34,7 @@ export default async function getPathsOfTag( return { ...fileContent, operationPath: `/${file - .replaceAll("_", "/") + .replaceAll(/(?