From 77ee0bf1860c9ba3336c6f870d248d887d2f5fb3 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Mon, 20 Sep 2021 10:56:15 +0100 Subject: [PATCH 01/15] feat: rma shipping option + unit tests --- .../api/routes/admin/orders/create-swap.js | 7 + .../carts/__tests__/add-shipping-method.js | 56 +++++++- .../routes/store/carts/add-shipping-method.js | 9 +- .../__tests__/list-shipping-options.js | 52 ++++++- .../shipping-options/list-shipping-options.js | 8 +- packages/medusa/src/index.js | 1 + .../1632851018347-add_rma_shipping_options.ts | 38 +++++ packages/medusa/src/models/cart.ts | 1 + packages/medusa/src/models/claim-order.ts | 8 ++ .../medusa/src/models/rma-shipping-option.ts | 133 ++++++++++++++++++ packages/medusa/src/models/swap.ts | 8 ++ .../src/repositories/RMA-shipping-option.ts | 5 + .../medusa/src/services/__mocks__/cart.js | 3 + .../services/__mocks__/shipping-profile.js | 3 + .../medusa/src/services/__tests__/cart.js | 70 +++++++++ .../services/__tests__/shipping-profile.js | 98 +++++++++++++ .../medusa/src/services/__tests__/swap.js | 10 +- packages/medusa/src/services/cart.js | 44 +++++- .../medusa/src/services/shipping-profile.js | 34 +++++ packages/medusa/src/services/swap.js | 9 +- 20 files changed, 577 insertions(+), 20 deletions(-) create mode 100644 packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts create mode 100644 packages/medusa/src/models/rma-shipping-option.ts create mode 100644 packages/medusa/src/repositories/RMA-shipping-option.ts diff --git a/packages/medusa/src/api/routes/admin/orders/create-swap.js b/packages/medusa/src/api/routes/admin/orders/create-swap.js index 25ad45604e..3e609bef5b 100644 --- a/packages/medusa/src/api/routes/admin/orders/create-swap.js +++ b/packages/medusa/src/api/routes/admin/orders/create-swap.js @@ -78,6 +78,12 @@ export default async (req, res) => { .optional(), }) .optional(), + rma_shipping_options: Validator.array().items({ + option_id: Validator.string().optional(), + price: Validator.number() + .integer() + .optional(), + }), additional_items: Validator.array().items({ variant_id: Validator.string().required(), quantity: Validator.number().required(), @@ -138,6 +144,7 @@ export default async (req, res) => { value.return_items, value.additional_items, value.return_shipping, + value.rma_shipping_options, { idempotency_key: idempotencyKey.idempotency_key, no_notification: value.no_notification, diff --git a/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js b/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js index 93f418dcc6..075ad81e94 100644 --- a/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js +++ b/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js @@ -23,9 +23,9 @@ describe("POST /store/carts/:id/shipping-methods", () => { jest.clearAllMocks() }) - it("calls CartService addShipping", () => { - expect(CartServiceMock.addShippingMethod).toHaveBeenCalledTimes(1) - expect(CartServiceMock.addShippingMethod).toHaveBeenCalledWith( + it("calls CartService addRMAMethod", () => { + expect(CartServiceMock.addRMAMethod).toHaveBeenCalledTimes(1) + expect(CartServiceMock.addRMAMethod).toHaveBeenCalledWith( IdMap.getId("fr-cart"), IdMap.getId("freeShipping"), {} @@ -45,6 +45,50 @@ describe("POST /store/carts/:id/shipping-methods", () => { }) }) + describe("successfully adds a RMA shipping method", () => { + let subject + + beforeAll(async () => { + const cartId = IdMap.getId("swap-cart") + subject = await request( + "POST", + `/store/carts/${cartId}/shipping-methods`, + { + payload: { + option_id: IdMap.getId("freeShipping"), + }, + } + ) + }) + + afterAll(() => { + jest.clearAllMocks() + }) + + it("calls CartService addRMAMethod", () => { + expect(CartServiceMock.addRMAMethod).toHaveBeenCalledTimes(1) + expect(CartServiceMock.addRMAMethod).toHaveBeenCalledWith( + IdMap.getId("swap-cart"), + IdMap.getId("freeShipping"), + {} + ) + }) + + it("calls CartService retrieve", () => { + expect(CartServiceMock.retrieve).toHaveBeenCalledTimes(2) + }) + + it("returns 200", () => { + expect(subject.status).toEqual(200) + }) + + it("returns the cart", () => { + expect(subject.body.cart).toEqual( + expect.objectContaining({ type: "swap", id: IdMap.getId("test-swap") }) + ) + }) + }) + describe("successfully adds a shipping method with additional data", () => { let subject @@ -68,9 +112,9 @@ describe("POST /store/carts/:id/shipping-methods", () => { jest.clearAllMocks() }) - it("calls CartService addShipping", () => { - expect(CartServiceMock.addShippingMethod).toHaveBeenCalledTimes(1) - expect(CartServiceMock.addShippingMethod).toHaveBeenCalledWith( + it("calls CartService addRMAMethod", () => { + expect(CartServiceMock.addRMAMethod).toHaveBeenCalledTimes(1) + expect(CartServiceMock.addRMAMethod).toHaveBeenCalledWith( IdMap.getId("fr-cart"), IdMap.getId("freeShipping"), { diff --git a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js index fc3b8090ee..93628aa6d9 100644 --- a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js +++ b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js @@ -1,6 +1,7 @@ import _ from "lodash" import { Validator, MedusaError } from "medusa-core-utils" import { defaultFields, defaultRelations } from "./" +import { CartType } from "../../../../models/cart" /** * @oas [post] /carts/{id}/shipping-methods @@ -44,7 +45,9 @@ export default async (req, res) => { await manager.transaction(async m => { const txCartService = cartService.withTransaction(m) - await txCartService.addShippingMethod(id, value.option_id, value.data) + + await txCartService.addRMAMethod(id, value.option_id, value.data) + const updated = await txCartService.retrieve(id, { relations: ["payment_sessions"], }) @@ -54,12 +57,12 @@ export default async (req, res) => { } }) - const cart = await cartService.retrieve(id, { + const updatedCart = await cartService.retrieve(id, { select: defaultFields, relations: defaultRelations, }) - res.status(200).json({ cart }) + res.status(200).json({ cart: updatedCart }) } catch (err) { throw err } diff --git a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js index 256f0d461d..09ce8407d1 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js @@ -4,7 +4,7 @@ import { carts, CartServiceMock } from "../../../../../services/__mocks__/cart" import { ShippingProfileServiceMock } from "../../../../../services/__mocks__/shipping-profile" describe("GET /store/shipping-options", () => { - describe("retrieves shipping options", () => { + describe("retrieves shipping options when cart type is not swap and not claim", () => { let subject beforeAll(async () => { @@ -53,4 +53,54 @@ describe("GET /store/shipping-options", () => { ) }) }) + + describe("retrieves shipping options when cart type is swap", () => { + let subject + + beforeAll(async () => { + subject = await request( + "GET", + `/store/shipping-options/${IdMap.getId("swap-cart")}` + ) + }) + + afterAll(() => { + jest.clearAllMocks() + }) + + it("calls CartService retrieve", () => { + expect(CartServiceMock.retrieve).toHaveBeenCalledTimes(1) + expect(CartServiceMock.retrieve).toHaveBeenCalledWith( + IdMap.getId("swap-cart"), + { + select: ["subtotal"], + relations: [ + "region", + "items", + "items.variant", + "items.variant.product", + ], + } + ) + }) + + it("calls ShippingProfileService fetchRMAOptions", () => { + expect(ShippingProfileServiceMock.fetchRMAOptions).toHaveBeenCalledTimes( + 1 + ) + expect(ShippingProfileServiceMock.fetchRMAOptions).toHaveBeenCalledWith( + carts.testSwapCart + ) + }) + + it("returns 200", () => { + expect(subject.status).toEqual(200) + }) + + it("returns the RMAshippingOptions", () => { + expect(subject.body.shipping_options[0].id).toEqual( + IdMap.getId("cartRMAShippingOption") + ) + }) + }) }) diff --git a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js index e89a9d92f0..26f4ee3251 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js @@ -1,4 +1,5 @@ import { Validator, MedusaError } from "medusa-core-utils" +import { CartType } from "../../../../models/cart" /** * @oas [get] /shipping-options/{cart_id} @@ -40,7 +41,12 @@ export default async (req, res) => { relations: ["region", "items", "items.variant", "items.variant.product"], }) - const options = await shippingProfileService.fetchCartOptions(cart) + let options + if (cart.type === CartType.SWAP || cart.type === CartType.CLAIM) { + options = await shippingProfileService.fetchRMAOptions(cart) + } else { + options = await shippingProfileService.fetchCartOptions(cart) + } res.status(200).json({ shipping_options: options }) } catch (err) { diff --git a/packages/medusa/src/index.js b/packages/medusa/src/index.js index effb629ac7..e637e57935 100644 --- a/packages/medusa/src/index.js +++ b/packages/medusa/src/index.js @@ -45,3 +45,4 @@ export { Swap } from "./models/swap" export { User } from "./models/user" export { DraftOrder } from "./models/draft-order" export { ReturnReason } from "./models/return-reason" +export { RMAShippingOption } from "./models/rma-shipping-option" diff --git a/packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts b/packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts new file mode 100644 index 0000000000..554ab5d796 --- /dev/null +++ b/packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts @@ -0,0 +1,38 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class addRmaShippingOptions1632851018347 implements MigrationInterface { + name = 'addRmaShippingOptions1632851018347' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "rma_shipping_option" ("id" character varying NOT NULL, "price" integer NOT NULL, "shipping_option_id" character varying NOT NULL, "swap_id" character varying, "claim_order_id" character varying, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deleted_at" TIMESTAMP WITH TIME ZONE, "metadata" jsonb, CONSTRAINT "PK_12d2eebc6cef997c9057b338647" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE INDEX "IDX_f3618cd0930a2e7357eddbebf4" ON "rma_shipping_option" ("shipping_option_id") `); + await queryRunner.query(`CREATE INDEX "IDX_4e4c2c0a3223c79a84a6f54e58" ON "rma_shipping_option" ("swap_id") `); + await queryRunner.query(`CREATE INDEX "IDX_2e262bb0e324b501d80a69f9df" ON "rma_shipping_option" ("claim_order_id") `); + await queryRunner.query(`ALTER TYPE "public"."cart_type_enum" RENAME TO "cart_type_enum_old"`); + await queryRunner.query(`CREATE TYPE "public"."cart_type_enum" AS ENUM('default', 'swap', 'draft_order', 'payment_link', 'claim')`); + await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" TYPE "public"."cart_type_enum" USING "type"::"text"::"public"."cart_type_enum"`); + await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" SET DEFAULT 'default'`); + await queryRunner.query(`DROP TYPE "public"."cart_type_enum_old"`); + await queryRunner.query(`ALTER TABLE "rma_shipping_option" ADD CONSTRAINT "FK_f3618cd0930a2e7357eddbebf4c" FOREIGN KEY ("shipping_option_id") REFERENCES "shipping_option"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "rma_shipping_option" ADD CONSTRAINT "FK_4e4c2c0a3223c79a84a6f54e583" FOREIGN KEY ("swap_id") REFERENCES "swap"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "rma_shipping_option" ADD CONSTRAINT "FK_2e262bb0e324b501d80a69f9df4" FOREIGN KEY ("claim_order_id") REFERENCES "claim_order"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "rma_shipping_option" DROP CONSTRAINT "FK_2e262bb0e324b501d80a69f9df4"`); + await queryRunner.query(`ALTER TABLE "rma_shipping_option" DROP CONSTRAINT "FK_4e4c2c0a3223c79a84a6f54e583"`); + await queryRunner.query(`ALTER TABLE "rma_shipping_option" DROP CONSTRAINT "FK_f3618cd0930a2e7357eddbebf4c"`); + await queryRunner.query(`CREATE TYPE "public"."cart_type_enum_old" AS ENUM('default', 'swap', 'draft_order', 'payment_link')`); + await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" TYPE "public"."cart_type_enum_old" USING "type"::"text"::"public"."cart_type_enum_old"`); + await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" SET DEFAULT 'default'`); + await queryRunner.query(`DROP TYPE "public"."cart_type_enum"`); + await queryRunner.query(`ALTER TYPE "public"."cart_type_enum_old" RENAME TO "cart_type_enum"`); + await queryRunner.query(`DROP INDEX "IDX_2e262bb0e324b501d80a69f9df"`); + await queryRunner.query(`DROP INDEX "IDX_4e4c2c0a3223c79a84a6f54e58"`); + await queryRunner.query(`DROP INDEX "IDX_f3618cd0930a2e7357eddbebf4"`); + await queryRunner.query(`DROP TABLE "rma_shipping_option"`); + } + +} diff --git a/packages/medusa/src/models/cart.ts b/packages/medusa/src/models/cart.ts index 1786681024..77407bc836 100644 --- a/packages/medusa/src/models/cart.ts +++ b/packages/medusa/src/models/cart.ts @@ -119,6 +119,7 @@ export enum CartType { SWAP = "swap", DRAFT_ORDER = "draft_order", PAYMENT_LINK = "payment_link", + CLAIM = "claim", } @Entity() diff --git a/packages/medusa/src/models/claim-order.ts b/packages/medusa/src/models/claim-order.ts index f16956d33d..2dc9cd0e8a 100644 --- a/packages/medusa/src/models/claim-order.ts +++ b/packages/medusa/src/models/claim-order.ts @@ -1,3 +1,4 @@ +import { RMAShippingOption } from './rma-shipping-option'; import { Entity, BeforeInsert, @@ -113,6 +114,13 @@ export class ClaimOrder { ) shipping_methods: ShippingMethod[] + @OneToMany( + () => RMAShippingOption, + method => method.swap, + { cascade: ["insert"] } + ) + rma_shipping_options: RMAShippingOption[] + @OneToMany( () => Fulfillment, fulfillment => fulfillment.claim_order, diff --git a/packages/medusa/src/models/rma-shipping-option.ts b/packages/medusa/src/models/rma-shipping-option.ts new file mode 100644 index 0000000000..88ff39f292 --- /dev/null +++ b/packages/medusa/src/models/rma-shipping-option.ts @@ -0,0 +1,133 @@ +import { + BeforeInsert, + Check, + Column, + CreateDateColumn, + DeleteDateColumn, + Entity, + Index, + JoinColumn, + ManyToOne, + PrimaryColumn, + UpdateDateColumn +} from "typeorm"; +import { ulid } from "ulid"; +import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column"; +import { ClaimOrder } from './claim-order'; +import { ShippingOption } from "./shipping-option"; +import { Swap } from './swap'; + + +@Entity() +export class RMAShippingOption { + @PrimaryColumn() + id: string + + @Column({ type: "int" }) + price: number + + @Index() + @Column() + shipping_option_id: string; + + @ManyToOne(() => ShippingOption, { eager: true }) + @JoinColumn({ name: "shipping_option_id" }) + shipping_option: ShippingOption + + @Index() + @Column({ nullable: true }) + swap_id: string + + @ManyToOne(() => Swap) + @JoinColumn({ name: "swap_id" }) + swap: Swap + + @Index() + @Column({ nullable: true }) + claim_order_id: string + + @ManyToOne(() => ClaimOrder) + @JoinColumn({ name: "claim_order_id" }) + claim_order: ClaimOrder + + @CreateDateColumn({ type: resolveDbType("timestamptz") }) + created_at: Date + + @UpdateDateColumn({ type: resolveDbType("timestamptz") }) + updated_at: Date + + @DeleteDateColumn({ type: resolveDbType("timestamptz") }) + deleted_at: Date + + @DbAwareColumn({ type: "jsonb", nullable: true }) + metadata: any + + @BeforeInsert() + private beforeInsert() { + if (this.id) return + const id = ulid() + this.id = `rmaso_${id}` + } +} + +/** + * @schema RMA shipping_option + * title: "RMA Shipping Option" + * description: "Shipping Options represent a way in which an Order or Return can be shipped. Shipping Options have an associated Fulfillment Provider that will be used when the fulfillment of an Order is initiated. Shipping Options themselves cannot be added to Carts, but serve as a template for Shipping Methods. This distinction makes it possible to customize individual Shipping Methods with additional information." + * x-resourceId: shipping_option + * properties: + * id: + * description: "The id of the Shipping Option. This value will be prefixed with `so_`." + * type: string + * name: + * description: "The name given to the Shipping Option - this may be displayed to the Customer." + * type: string + * region_id: + * description: "The id of the Region that the Shipping Option belongs to." + * type: string + * region: + * description: "The id of the Region that the Shipping Option belongs to." + * anyOf: + * - $ref: "#/components/schemas/region" + * profile_id: + * description: "The id of the Shipping Profile that the Shipping Option belongs to. Shipping Profiles have a set of defined Shipping Options that can be used to Fulfill a given set of Products." + * type: string + * provider_id: + * description: "The id of the Fulfillment Provider, that will be used to process Fulfillments from the Shipping Option." + * type: string + * price_type: + * description: "The type of pricing calculation that is used when creatin Shipping Methods from the Shipping Option. Can be `flat_rate` for fixed prices or `calculated` if the Fulfillment Provider can provide price calulations." + * type: string + * enum: + * - flat_rate + * - calculated + * amount: + * description: "The amount to charge for shipping when the Shipping Option price type is `flat_rate`." + * type: integer + * is_return: + * description: "Flag to indicate if the Shipping Option can be used for Return shipments." + * type: boolean + * requirements: + * description: "The requirements that must be satisfied for the Shipping Option to be available for a Cart." + * type: array + * items: + * $ref: "#/components/schemas/shipping_option_requirement" + * data: + * description: "The data needed for the Fulfillment Provider to identify the Shipping Option." + * type: object + * created_at: + * description: "The date with timezone at which the resource was created." + * type: string + * format: date-time + * updated_at: + * description: "The date with timezone at which the resource was last updated." + * type: string + * format: date-time + * deleted_at: + * description: "The date with timezone at which the resource was deleted." + * type: string + * format: date-time + * metadata: + * description: "An optional key-value map with additional information." + * type: object + */ diff --git a/packages/medusa/src/models/swap.ts b/packages/medusa/src/models/swap.ts index 9628c81732..105aace46d 100644 --- a/packages/medusa/src/models/swap.ts +++ b/packages/medusa/src/models/swap.ts @@ -1,3 +1,4 @@ +import { RMAShippingOption } from './rma-shipping-option'; import { Entity, Index, @@ -112,6 +113,13 @@ export class Swap { ) shipping_methods: ShippingMethod[] + @OneToMany( + () => RMAShippingOption, + method => method.swap, + { cascade: ["insert"] } + ) + rma_shipping_options: RMAShippingOption[] + @Column({ nullable: true }) cart_id: string diff --git a/packages/medusa/src/repositories/RMA-shipping-option.ts b/packages/medusa/src/repositories/RMA-shipping-option.ts new file mode 100644 index 0000000000..52a7113d53 --- /dev/null +++ b/packages/medusa/src/repositories/RMA-shipping-option.ts @@ -0,0 +1,5 @@ +import { EntityRepository, Repository } from "typeorm" +import { RMAShippingOption } from './../models/rma-shipping-option'; + +@EntityRepository(RMAShippingOption) +export class RMAShippingOptionRepository extends Repository {} diff --git a/packages/medusa/src/services/__mocks__/cart.js b/packages/medusa/src/services/__mocks__/cart.js index 6c99bcd2c7..e65805bd75 100644 --- a/packages/medusa/src/services/__mocks__/cart.js +++ b/packages/medusa/src/services/__mocks__/cart.js @@ -342,6 +342,9 @@ export const CartServiceMock = { addShippingMethod: jest.fn().mockImplementation(cartId => { return Promise.resolve() }), + addRMAMethod: jest.fn().mockImplementation(cartId => { + return Promise.resolve() + }), retrieveShippingOption: jest.fn().mockImplementation((cartId, optionId) => { if (optionId === IdMap.getId("freeShipping")) { return { diff --git a/packages/medusa/src/services/__mocks__/shipping-profile.js b/packages/medusa/src/services/__mocks__/shipping-profile.js index d4e3848136..4abc212d84 100644 --- a/packages/medusa/src/services/__mocks__/shipping-profile.js +++ b/packages/medusa/src/services/__mocks__/shipping-profile.js @@ -134,6 +134,9 @@ export const ShippingProfileServiceMock = { fetchCartOptions: jest.fn().mockImplementation(() => { return Promise.resolve([{ id: IdMap.getId("cartShippingOption") }]) }), + fetchRMAOptions: jest.fn().mockImplementation(() => { + return Promise.resolve([{ id: IdMap.getId("cartRMAShippingOption") }]) + }), fetchOptionsByProductIds: jest.fn().mockImplementation(() => { return Promise.resolve([{ id: IdMap.getId("cartShippingOption") }]) }), diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index 18919d6b29..355b4f5970 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -1467,6 +1467,76 @@ describe("CartService", () => { }) }) + describe("addRMAMethod", () => { + const rmaSO = { + id: IdMap.getId("rmaso-option"), + shipping_option_id: IdMap.getId("regular-so-option"), + price: 0, + } + + const RMAShippingOptionRepository = MockRepository({ + findOne: q => { + if (q.where.id === IdMap.getId("rmaso-option")) { + return Promise.resolve(rmaSO) + } + return Promise.resolve(null) + }, + }) + + const cartService = new CartService({ + manager: MockManager, + totalsService, + RMAShippingOptionRepository, + eventBusService, + }) + + cartService.addShippingMethod = jest.fn().mockImplementation(() => { + return Promise.resolve({}) + }) + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("when a normal shipping option id is provided, then it should call addShippingMethod", async () => { + const data = { + id: "test", + extra: "yes", + } + + await cartService.addRMAMethod( + IdMap.getId("cart"), + IdMap.getId("regular-so-option"), + data + ) + expect(cartService.addShippingMethod).toHaveBeenCalledWith( + IdMap.getId("cart"), + IdMap.getId("regular-so-option"), + data + ) + }) + + it("when a rma shipping option is provided, then it should call addShippingOption with a custom price", async () => { + const data = { + id: "testshipperid", + } + await cartService.addRMAMethod( + IdMap.getId("cart"), + IdMap.getId("rmaso-option"), + data + ) + + expect(cartService.addShippingMethod).toHaveBeenCalledWith( + IdMap.getId("cart"), + IdMap.getId("regular-so-option"), + expect.objectContaining({ + ...data, + price: 0, + }) + ) + }) + }) + describe("applyDiscount", () => { const cartRepository = MockRepository({ findOneWithRelations: (rels, q) => { diff --git a/packages/medusa/src/services/__tests__/shipping-profile.js b/packages/medusa/src/services/__tests__/shipping-profile.js index b66adebf64..bce3cb47b9 100644 --- a/packages/medusa/src/services/__tests__/shipping-profile.js +++ b/packages/medusa/src/services/__tests__/shipping-profile.js @@ -241,6 +241,104 @@ describe("ShippingProfileService", () => { }) }) + describe("fetchRMAOptions", () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + it("given a swap cart with rma shipping options, should return correct rma shipping options ", async () => { + const swapRepository = MockRepository({ + findOne() { + return Promise.resolve({ + id: "swap-cart", + type: "swap", + rma_shipping_options: [ + { option_id: "test-option1", id: "rmsao-option1", price: 10 }, + { option_id: "test-option2", id: "rmsao-option2", price: 0 }, + ], + }) + }, + }) + + const profileService = new ShippingProfileService({ + manager: MockManager, + swapRepository, + }) + + const cart = { + id: "swap-cart", + type: "swap", + } + + await expect(profileService.fetchRMAOptions(cart)).resolves.toEqual([ + expect.objectContaining({ id: "rmsao-option1" }), + expect.objectContaining({ id: "rmsao-option2" }), + ]) + }) + + it("given a swap cart with no rma shipping options, should call fetchCartOptions and return normal shipping options ", async () => { + const swapRepository = MockRepository({ + findOne() { + return Promise.resolve({ + id: "swap-cart", + type: "swap", + rma_shipping_options: [], + }) + }, + }) + + const profileService = new ShippingProfileService({ + manager: MockManager, + swapRepository, + }) + + profileService.fetchCartOptions = jest.fn().mockImplementation(() => { + return Promise.resolve([ + { + id: "normal-option1", + }, + { + id: "normal-option2", + }, + ]) + }) + + const cart = { + id: "swap-cart", + type: "swap", + } + + await expect(profileService.fetchRMAOptions(cart)).resolves.toEqual([ + expect.objectContaining({ + id: "normal-option1", + }), + expect.objectContaining({ id: "normal-option2" }), + ]) + + expect(profileService.fetchCartOptions).toHaveBeenCalledTimes(1) + expect(profileService.fetchCartOptions).toHaveBeenCalledWith({ + id: "swap-cart", + type: "swap", + }) + }) + + it("when cart is default, then should throw", async () => { + const profileService = new ShippingProfileService({ + manager: MockManager, + }) + + const cart = { + id: "normal-cart", + type: "default", + } + + await expect(profileService.fetchRMAOptions(cart)).rejects.toThrow({ + type: "invalid_data", + message: "error", + }) + }) + }) + describe("addShippingOption", () => { const profRepo = MockRepository({ findOne: () => Promise.resolve({}) }) diff --git a/packages/medusa/src/services/__tests__/swap.js b/packages/medusa/src/services/__tests__/swap.js index ebf9c2fd47..a1663d5e9f 100644 --- a/packages/medusa/src/services/__tests__/swap.js +++ b/packages/medusa/src/services/__tests__/swap.js @@ -324,7 +324,8 @@ describe("SwapService", () => { { id: IdMap.getId("return-shipping"), price: 20, - } + }, + [{ option_id: IdMap.getId("rmaso-option1"), price: 0 }] ) expect(lineItemService.generate).toHaveBeenCalledTimes(1) @@ -343,7 +344,8 @@ describe("SwapService", () => { { id: IdMap.getId("return-shipping"), price: 20, - } + }, + [{ option_id: IdMap.getId("rmaso-option1"), price: 0 }] ) expect(swapRepo.create).toHaveBeenCalledWith({ @@ -358,6 +360,9 @@ describe("SwapService", () => { quantity: 1, }, ], + rma_shipping_options: [ + { shipping_option_id: IdMap.getId("rmaso-option1"), price: 0 }, + ], }) expect(returnService.create).toHaveBeenCalledTimes(1) @@ -378,6 +383,7 @@ describe("SwapService", () => { id: IdMap.getId("return-shipping"), price: 20, }, + [], { no_notification: input } ) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index 5052d57cce..06e408aaa1 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -24,7 +24,6 @@ class CartService extends BaseService { regionService, lineItemService, shippingOptionService, - shippingProfileService, customerService, discountService, giftCardService, @@ -32,6 +31,7 @@ class CartService extends BaseService { addressRepository, paymentSessionRepository, inventoryService, + RMAShippingOptionRepository, }) { super() @@ -62,9 +62,6 @@ class CartService extends BaseService { /** @private @const {PaymentProviderService} */ this.paymentProviderService_ = paymentProviderService - /** @private @const {ShippingProfileService} */ - this.shippingProfileService_ = shippingProfileService - /** @private @const {CustomerService} */ this.customerService_ = customerService @@ -88,6 +85,8 @@ class CartService extends BaseService { /** @private @const {InventoryService} */ this.inventoryService_ = inventoryService + + this.rmaShippingOptionRepository_ = RMAShippingOptionRepository } withTransaction(transactionManager) { @@ -107,13 +106,13 @@ class CartService extends BaseService { regionService: this.regionService_, lineItemService: this.lineItemService_, shippingOptionService: this.shippingOptionService_, - shippingProfileService: this.shippingProfileService_, customerService: this.customerService_, discountService: this.discountService_, totalsService: this.totalsService_, addressRepository: this.addressRepository_, giftCardService: this.giftCardService_, inventoryService: this.inventoryService_, + RMAShippingOptionRepository: this.rmaShippingOptionRepository_, }) cloned.transactionManager_ = transactionManager @@ -1303,9 +1302,13 @@ class CartService extends BaseService { }) const { shipping_methods } = cart + const customPrice = data.price ? { price: data.price } : {} const newMethod = await this.shippingOptionService_ .withTransaction(manager) - .createShippingMethod(optionId, data, { cart }) + .createShippingMethod(optionId, data, { + cart, + ...customPrice, + }) const methods = [newMethod] if (shipping_methods.length) { @@ -1345,6 +1348,35 @@ class CartService extends BaseService { }, "SERIALIZABLE") } + /** + * Adds the corresponding shipping method either from a normal or rma shipping option to the list of shipping methods associated with + * the cart. + * @param {string} cartId - the id of the cart to add shipping method to + * @param {string} optionIdOrRmaOptionId - id of the normal or rma shipping option to add as valid method + * @param {Object} data - the fulmillment data for the method + * @return {Promise} the result of the update operation + */ + async addRMAMethod(cartId, optionIdOrRmaOptionId, data) { + return this.atomicPhase_(async manager => { + const rmaShippingOptionRepo = manager.getCustomRepository( + this.rmaShippingOptionRepository_ + ) + + const rmaOption = await rmaShippingOptionRepo.findOne({ + where: { id: optionIdOrRmaOptionId }, + }) + + if (rmaOption) { + await this.addShippingMethod(cartId, rmaOption.shipping_option_id, { + ...data, + price: rmaOption.price, + }) + } else { + await this.addShippingMethod(cartId, optionIdOrRmaOptionId, data) + } + }) + } + /** * Set's the region of a cart. * @param {string} cartId - the id of the cart to set region on diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index 950bb541bb..ca12c22833 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -2,6 +2,7 @@ import _ from "lodash" import { MedusaError } from "medusa-core-utils" import { BaseService } from "medusa-interfaces" import { Any, In } from "typeorm" +import { CartType } from "../models/cart" /** * Provides layer to manipulate profiles. @@ -14,6 +15,7 @@ class ShippingProfileService extends BaseService { productService, productRepository, shippingOptionService, + swapRepository, }) { super() @@ -31,6 +33,9 @@ class ShippingProfileService extends BaseService { /** @private @const {ShippingOptionService} */ this.shippingOptionService_ = shippingOptionService + + /** @private @const {SwapRepository} */ + this.swapRepository_ = swapRepository } withTransaction(transactionManager) { @@ -43,6 +48,7 @@ class ShippingProfileService extends BaseService { shippingProfileRepository: this.shippingProfileRepository_, productService: this.productService_, shippingOptionService: this.shippingOptionService_, + swapRepository: this.swapRepository_, }) cloned.transactionManager_ = transactionManager @@ -436,6 +442,34 @@ class ShippingProfileService extends BaseService { return options } + /** + * Finds all the rma shipping options that cover the products in a cart, and + * validates all options that are available for the cart. + * @param {Cart} cart - the cart object to find rma shipping options for + * @return {[RMAShippingOptions | ShippingOptions]} a list of the available rma or normal shipping options + */ + async fetchRMAOptions(cart) { + if (cart.type === CartType.DEFAULT) { + throw new MedusaError(MedusaError.Types.INVALID_DATA, "error") + } + + const swapRepo = await this.manager_.getCustomRepository( + this.swapRepository_ + ) + + if (cart.type === CartType.SWAP) { + const swap = await swapRepo.findOne({ + where: { cart_id: cart.id }, + relations: ["rma_shipping_options"], + }) + + if (swap.rma_shipping_options.length === 0) { + return this.fetchCartOptions(cart) + } + + return swap.rma_shipping_options + } + } } export default ShippingProfileService diff --git a/packages/medusa/src/services/swap.js b/packages/medusa/src/services/swap.js index 5559d04e35..cab52a6bc4 100644 --- a/packages/medusa/src/services/swap.js +++ b/packages/medusa/src/services/swap.js @@ -288,6 +288,7 @@ class SwapService extends BaseService { * the customer. * @param {ReturnShipping?} returnShipping - an optional shipping method for * returning the returnItems. + * @param {rmaShippingOptions?} rmaShippingOptions - an optional list of rma shipping options for the swap * @param {Object} custom - contains relevant custom information. This object may * include no_notification which will disable sending notification when creating * swap. If set, it overrules the attribute inherited from the order. @@ -298,6 +299,7 @@ class SwapService extends BaseService { returnItems, additionalItems, returnShipping, + rmaShippingOptions = [], custom = { no_notification: undefined, } @@ -318,7 +320,6 @@ class SwapService extends BaseService { const line = await this.lineItemService_.retrieve(item.item_id, { relations: ["order", "swap", "claim_order"], }) - console.log(line) if ( line.order?.canceled_at || @@ -342,6 +343,11 @@ class SwapService extends BaseService { }) ) + const rma_shipping_options = rmaShippingOptions.map(so => ({ + shipping_option_id: so.option_id, + price: so.price, + })) + const evaluatedNoNotification = no_notification !== undefined ? no_notification : order.no_notification @@ -353,6 +359,7 @@ class SwapService extends BaseService { order_id: order.id, additional_items: newItems, no_notification: evaluatedNoNotification, + rma_shipping_options, }) const result = await swapRepo.save(created) From 79c601279e8d16d1a5f1f98396dbd1e8970c5228 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 30 Sep 2021 14:50:38 +0100 Subject: [PATCH 02/15] tests: integration tests --- .../api/__tests__/admin/order.js | 686 +++++++++--------- integration-tests/api/__tests__/store/cart.js | 421 ++++++----- .../api/__tests__/store/shipping-options.js | 152 ++-- integration-tests/api/helpers/cart-seeder.js | 112 +-- integration-tests/api/helpers/swap-seeder.js | 116 ++- 5 files changed, 837 insertions(+), 650 deletions(-) diff --git a/integration-tests/api/__tests__/admin/order.js b/integration-tests/api/__tests__/admin/order.js index 863b151551..640221d5f2 100644 --- a/integration-tests/api/__tests__/admin/order.js +++ b/integration-tests/api/__tests__/admin/order.js @@ -1,64 +1,65 @@ -const path = require("path"); +const path = require("path") const { ReturnReason, Order, LineItem, ProductVariant, -} = require("@medusajs/medusa"); + RMAShippingOption, +} = require("@medusajs/medusa") -const setupServer = require("../../../helpers/setup-server"); -const { useApi } = require("../../../helpers/use-api"); -const { initDb, useDb } = require("../../../helpers/use-db"); +const setupServer = require("../../../helpers/setup-server") +const { useApi } = require("../../../helpers/use-api") +const { initDb, useDb } = require("../../../helpers/use-db") -const orderSeeder = require("../../helpers/order-seeder"); -const swapSeeder = require("../../helpers/swap-seeder"); -const adminSeeder = require("../../helpers/admin-seeder"); -const claimSeeder = require("../../helpers/claim-seeder"); +const orderSeeder = require("../../helpers/order-seeder") +const swapSeeder = require("../../helpers/swap-seeder") +const adminSeeder = require("../../helpers/admin-seeder") +const claimSeeder = require("../../helpers/claim-seeder") const { expectPostCallToReturn, expectAllPostCallsToReturn, callGet, partial, -} = require("../../helpers/call-helpers"); +} = require("../../helpers/call-helpers") -jest.setTimeout(30000); +jest.setTimeout(30000) describe("/admin/orders", () => { - let medusaProcess; - let dbConnection; + let medusaProcess + let dbConnection beforeAll(async () => { - const cwd = path.resolve(path.join(__dirname, "..", "..")); - dbConnection = await initDb({ cwd }); - medusaProcess = await setupServer({ cwd }); - }); + const cwd = path.resolve(path.join(__dirname, "..", "..")) + dbConnection = await initDb({ cwd }) + medusaProcess = await setupServer({ cwd }) + }) afterAll(async () => { - const db = useDb(); - await db.shutdown(); + const db = useDb() + await db.shutdown() - medusaProcess.kill(); - }); + medusaProcess.kill() + }) describe("GET /admin/orders", () => { beforeEach(async () => { try { - await adminSeeder(dbConnection); - await orderSeeder(dbConnection); + await adminSeeder(dbConnection) + await orderSeeder(dbConnection) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("gets orders", async () => { - const api = useApi(); + const api = useApi() const response = await api .get("/admin/orders", { @@ -67,25 +68,25 @@ describe("/admin/orders", () => { }, }) .catch((err) => { - console.log(err); - }); - expect(response.status).toEqual(200); - }); - }); + console.log(err) + }) + expect(response.status).toEqual(200) + }) + }) describe("GET /admin/orders", () => { beforeEach(async () => { try { - await adminSeeder(dbConnection); - await orderSeeder(dbConnection); - await swapSeeder(dbConnection); - await claimSeeder(dbConnection); + await adminSeeder(dbConnection) + await orderSeeder(dbConnection) + await swapSeeder(dbConnection) + await claimSeeder(dbConnection) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - const manager = dbConnection.manager; + const manager = dbConnection.manager const order2 = manager.create(Order, { id: "test-order-not-payed", @@ -136,9 +137,9 @@ describe("/admin/orders", () => { }, ], items: [], - }); + }) - await manager.save(order2); + await manager.save(order2) const li2 = manager.create(LineItem, { id: "test-item", @@ -151,23 +152,23 @@ describe("/admin/orders", () => { quantity: 1, variant_id: "test-variant", order_id: "test-order-not-payed", - }); + }) - await manager.save(li2); - }); + await manager.save(li2) + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("cancels an order and increments inventory_quantity", async () => { - const api = useApi(); - const manager = dbConnection.manager; + const api = useApi() + const manager = dbConnection.manager - const initialInventoryRes = await api.get("/store/variants/test-variant"); + const initialInventoryRes = await api.get("/store/variants/test-variant") - expect(initialInventoryRes.data.variant.inventory_quantity).toEqual(1); + expect(initialInventoryRes.data.variant.inventory_quantity).toEqual(1) const response = await api .post( @@ -180,26 +181,26 @@ describe("/admin/orders", () => { } ) .catch((err) => { - console.log(err); - }); - expect(response.status).toEqual(200); + console.log(err) + }) + expect(response.status).toEqual(200) - const secondInventoryRes = await api.get("/store/variants/test-variant"); + const secondInventoryRes = await api.get("/store/variants/test-variant") - expect(secondInventoryRes.data.variant.inventory_quantity).toEqual(2); - }); + expect(secondInventoryRes.data.variant.inventory_quantity).toEqual(2) + }) it("cancels an order but does not increment inventory_quantity of unmanaged variant", async () => { - const api = useApi(); - const manager = dbConnection.manager; + const api = useApi() + const manager = dbConnection.manager await manager.query( `UPDATE "product_variant" SET manage_inventory=false WHERE id = 'test-variant'` - ); + ) - const initialInventoryRes = await api.get("/store/variants/test-variant"); + const initialInventoryRes = await api.get("/store/variants/test-variant") - expect(initialInventoryRes.data.variant.inventory_quantity).toEqual(1); + expect(initialInventoryRes.data.variant.inventory_quantity).toEqual(1) const response = await api .post( @@ -212,35 +213,35 @@ describe("/admin/orders", () => { } ) .catch((err) => { - console.log(err); - }); - expect(response.status).toEqual(200); + console.log(err) + }) + expect(response.status).toEqual(200) - const secondInventoryRes = await api.get("/store/variants/test-variant"); + const secondInventoryRes = await api.get("/store/variants/test-variant") - expect(secondInventoryRes.data.variant.inventory_quantity).toEqual(1); - }); - }); + expect(secondInventoryRes.data.variant.inventory_quantity).toEqual(1) + }) + }) describe("POST /admin/orders/:id/claims", () => { beforeEach(async () => { try { - await adminSeeder(dbConnection); - await orderSeeder(dbConnection); - await claimSeeder(dbConnection); + await adminSeeder(dbConnection) + await orderSeeder(dbConnection) + await claimSeeder(dbConnection) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("creates a claim", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/claims", @@ -267,30 +268,30 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); + ) + expect(response.status).toEqual(200) const variant = await api.get("/admin/products", { headers: { authorization: "Bearer test_token", }, - }); + }) // find test variant and verify that its inventory quantity has changed const toTest = variant.data.products[0].variants.find( (v) => v.id === "test-variant" - ); - expect(toTest.inventory_quantity).toEqual(0); + ) + expect(toTest.inventory_quantity).toEqual(0) expect(response.data.order.claims[0].shipping_address_id).toEqual( "test-shipping-address" - ); + ) expect(response.data.order.claims[0].shipping_address).toEqual( expect.objectContaining({ first_name: "lebron", country_code: "us", }) - ); + ) expect(response.data.order.claims[0].claim_items).toEqual( expect.arrayContaining([ @@ -305,7 +306,7 @@ describe("/admin/orders", () => { ]), }), ]) - ); + ) expect(response.data.order.claims[0].additional_items).toEqual( expect.arrayContaining([ @@ -314,11 +315,11 @@ describe("/admin/orders", () => { quantity: 1, }), ]) - ); - }); + ) + }) it("creates a claim with a shipping address", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/claims", @@ -353,8 +354,8 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); + ) + expect(response.status).toEqual(200) expect(response.data.order.claims[0].shipping_address).toEqual( expect.objectContaining({ @@ -365,7 +366,7 @@ describe("/admin/orders", () => { postal_code: "12345", country_code: "us", }) - ); + ) expect(response.data.order.claims[0].claim_items).toEqual( expect.arrayContaining([ @@ -380,7 +381,7 @@ describe("/admin/orders", () => { ]), }), ]) - ); + ) expect(response.data.order.claims[0].additional_items).toEqual( expect.arrayContaining([ @@ -389,11 +390,11 @@ describe("/admin/orders", () => { quantity: 1, }), ]) - ); - }); + ) + }) it("creates a claim with return shipping", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/claims", @@ -421,9 +422,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(response.status).toEqual(200); + expect(response.status).toEqual(200) expect(response.data.order.claims[0].claim_items).toEqual( expect.arrayContaining([ @@ -438,7 +439,7 @@ describe("/admin/orders", () => { ]), }), ]) - ); + ) expect(response.data.order.claims[0].additional_items).toEqual( expect.arrayContaining([ @@ -447,7 +448,7 @@ describe("/admin/orders", () => { quantity: 1, }), ]) - ); + ) expect( response.data.order.claims[0].return_order.shipping_method @@ -456,11 +457,11 @@ describe("/admin/orders", () => { price: 0, shipping_option_id: "test-return-option", }) - ); - }); + ) + }) it("updates a claim", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/claims", @@ -487,10 +488,10 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); + ) + expect(response.status).toEqual(200) - const cid = response.data.order.claims[0].id; + const cid = response.data.order.claims[0].id const { status, data: updateData } = await api.post( `/admin/orders/test-order/claims/${cid}`, { @@ -505,18 +506,18 @@ describe("/admin/orders", () => { authorization: "bearer test_token", }, } - ); + ) - expect(status).toEqual(200); + expect(status).toEqual(200) expect(updateData.order.claims[0].shipping_methods).toEqual([ expect.objectContaining({ id: "test-method", }), - ]); - }); + ]) + }) it("updates claim items", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/claims", @@ -543,11 +544,11 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); + ) + expect(response.status).toEqual(200) - let claim = response.data.order.claims[0]; - const cid = claim.id; + let claim = response.data.order.claims[0] + const cid = claim.id const { status, data: updateData } = await api.post( `/admin/orders/test-order/claims/${cid}`, { @@ -570,14 +571,14 @@ describe("/admin/orders", () => { authorization: "bearer test_token", }, } - ); + ) - expect(status).toEqual(200); - expect(updateData.order.claims.length).toEqual(1); + expect(status).toEqual(200) + expect(updateData.order.claims.length).toEqual(1) - claim = updateData.order.claims[0]; + claim = updateData.order.claims[0] - expect(claim.claim_items.length).toEqual(1); + expect(claim.claim_items.length).toEqual(1) expect(claim.claim_items).toEqual( expect.arrayContaining([ expect.objectContaining({ @@ -599,11 +600,11 @@ describe("/admin/orders", () => { // ]), }), ]) - ); - }); + ) + }) it("updates claim items - removes image", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/claims", @@ -630,11 +631,11 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); + ) + expect(response.status).toEqual(200) - let claim = response.data.order.claims[0]; - const cid = claim.id; + let claim = response.data.order.claims[0] + const cid = claim.id const { status, data: updateData } = await api.post( `/admin/orders/test-order/claims/${cid}`, { @@ -654,14 +655,14 @@ describe("/admin/orders", () => { authorization: "bearer test_token", }, } - ); + ) - expect(status).toEqual(200); - expect(updateData.order.claims.length).toEqual(1); + expect(status).toEqual(200) + expect(updateData.order.claims.length).toEqual(1) - claim = updateData.order.claims[0]; + claim = updateData.order.claims[0] - expect(claim.claim_items.length).toEqual(1); + expect(claim.claim_items.length).toEqual(1) expect(claim.claim_items).toEqual([ expect.objectContaining({ id: claim.claim_items[0].id, @@ -674,11 +675,11 @@ describe("/admin/orders", () => { // expect.objectContaining({ value: "tags" }), // ]), }), - ]); - }); + ]) + }) it("fulfills a claim", async () => { - const api = useApi(); + const api = useApi() const response = await api .post( @@ -713,10 +714,10 @@ describe("/admin/orders", () => { } ) .catch((err) => { - console.log(err); - }); + console.log(err) + }) - const cid = response.data.order.claims[0].id; + const cid = response.data.order.claims[0].id const fulRes = await api.post( `/admin/orders/test-order/claims/${cid}/fulfillments`, {}, @@ -725,18 +726,18 @@ describe("/admin/orders", () => { Authorization: "Bearer test_token", }, } - ); - expect(fulRes.status).toEqual(200); + ) + expect(fulRes.status).toEqual(200) expect(fulRes.data.order.claims).toEqual([ expect.objectContaining({ id: cid, order_id: "test-order", fulfillment_status: "fulfilled", }), - ]); + ]) - const fid = fulRes.data.order.claims[0].fulfillments[0].id; - const iid = fulRes.data.order.claims[0].additional_items[0].id; + const fid = fulRes.data.order.claims[0].fulfillments[0].id + const iid = fulRes.data.order.claims[0].additional_items[0].id expect(fulRes.data.order.claims[0].fulfillments).toEqual([ expect.objectContaining({ items: [ @@ -747,63 +748,63 @@ describe("/admin/orders", () => { }, ], }), - ]); - }); + ]) + }) it("Only allow canceling claim after canceling fulfillments", async () => { - const order_id = "order-with-claim"; + const order_id = "order-with-claim" const order = await callGet({ path: `/admin/orders/${order_id}`, get: "order", - }); + }) - const claim = order.claims.filter((s) => s.id === "claim-w-f")[0]; - const claim_id = claim.id; + const claim = order.claims.filter((s) => s.id === "claim-w-f")[0] + const claim_id = claim.id const expectCancelToReturn = partial(expectPostCallToReturn, { path: `/admin/orders/${order_id}/claims/${claim_id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 400 }); + await expectCancelToReturn({ code: 400 }) await expectAllPostCallsToReturn({ code: 200, col: claim.fulfillments, pathf: (f) => `/admin/orders/${order_id}/claims/${claim_id}/fulfillments/${f.id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 200 }); - }); + await expectCancelToReturn({ code: 200 }) + }) it("Only allow canceling claim after canceling returns", async () => { - const order_id = "order-with-claim"; + const order_id = "order-with-claim" const order = await callGet({ path: `/admin/orders/${order_id}`, get: "order", - }); + }) - const claim = order.claims.filter((c) => c.id === "claim-w-r")[0]; - const claim_id = claim.id; + const claim = order.claims.filter((c) => c.id === "claim-w-r")[0] + const claim_id = claim.id const expectCancelToReturn = partial(expectPostCallToReturn, { path: `/admin/orders/${order_id}/claims/${claim_id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 400 }); + await expectCancelToReturn({ code: 400 }) await expectPostCallToReturn({ code: 200, path: `/admin/returns/${claim.return_order.id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 200 }); - }); + await expectCancelToReturn({ code: 200 }) + }) it("fails to creates a claim due to no stock on additional items", async () => { - const api = useApi(); + const api = useApi() try { await api.post( "/admin/orders/test-order/claims", @@ -830,43 +831,43 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) } catch (e) { - expect(e.response.status).toEqual(400); + expect(e.response.status).toEqual(400) expect(e.response.data.message).toEqual( "Variant with id: test-variant does not have the required inventory" - ); + ) } - }); - }); + }) + }) describe("POST /admin/orders/:id/return", () => { - let rrId; + let rrId beforeEach(async () => { try { - await adminSeeder(dbConnection); - await orderSeeder(dbConnection); + await adminSeeder(dbConnection) + await orderSeeder(dbConnection) const created = dbConnection.manager.create(ReturnReason, { value: "too_big", label: "Too Big", - }); - const result = await dbConnection.manager.save(created); + }) + const result = await dbConnection.manager.save(created) - rrId = result.id; + rrId = result.id } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("creates a return", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/return", @@ -885,10 +886,10 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); + ) + expect(response.status).toEqual(200) - expect(response.data.order.returns[0].refund_amount).toEqual(7200); + expect(response.data.order.returns[0].refund_amount).toEqual(7200) expect(response.data.order.returns[0].items).toEqual([ expect.objectContaining({ item_id: "test-item", @@ -896,11 +897,11 @@ describe("/admin/orders", () => { reason_id: rrId, note: "TOO SMALL", }), - ]); - }); + ]) + }) it("increases inventory_quantity when return is received", async () => { - const api = useApi(); + const api = useApi() const returned = await api.post( "/admin/orders/test-order/return", @@ -918,24 +919,22 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) //Find variant that should have its inventory_quantity updated - const toTest = returned.data.order.items.find( - (i) => i.id === "test-item" - ); + const toTest = returned.data.order.items.find((i) => i.id === "test-item") - expect(returned.status).toEqual(200); - expect(toTest.variant.inventory_quantity).toEqual(2); - }); + expect(returned.status).toEqual(200) + expect(toTest.variant.inventory_quantity).toEqual(2) + }) it("does not increases inventory_quantity when return is received when inventory is not managed", async () => { - const api = useApi(); - const manager = dbConnection.manager; + const api = useApi() + const manager = dbConnection.manager await manager.query( `UPDATE "product_variant" SET manage_inventory=false WHERE id = 'test-variant'` - ); + ) const returned = await api.post( "/admin/orders/test-order/return", @@ -953,48 +952,46 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) //Find variant that should have its inventory_quantity updated - const toTest = returned.data.order.items.find( - (i) => i.id === "test-item" - ); + const toTest = returned.data.order.items.find((i) => i.id === "test-item") - expect(returned.status).toEqual(200); - expect(toTest.variant.inventory_quantity).toEqual(1); - }); - }); + expect(returned.status).toEqual(200) + expect(toTest.variant.inventory_quantity).toEqual(1) + }) + }) describe("GET /admin/orders", () => { beforeEach(async () => { try { - await adminSeeder(dbConnection); + await adminSeeder(dbConnection) // Manually insert date for filtering - const createdAt = new Date("26 January 1997 12:00 UTC"); + const createdAt = new Date("26 January 1997 12:00 UTC") await orderSeeder(dbConnection, { created_at: createdAt.toISOString(), - }); + }) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("lists all orders", async () => { - const api = useApi(); + const api = useApi() const response = await api.get("/admin/orders?fields=id", { headers: { authorization: "Bearer test_token", }, - }); + }) - expect(response.status).toEqual(200); + expect(response.status).toEqual(200) expect(response.data.orders).toEqual([ expect.objectContaining({ id: "test-order", @@ -1013,11 +1010,11 @@ describe("/admin/orders", () => { expect.objectContaining({ id: "test-order-w-r", }), - ]); - }); + ]) + }) it("successfully lists orders with greater than", async () => { - const api = useApi(); + const api = useApi() const response = await api.get( "/admin/orders?fields=id&created_at[gt]=01-26-1990", @@ -1026,9 +1023,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(response.status).toEqual(200); + expect(response.status).toEqual(200) expect(response.data.orders).toEqual([ expect.objectContaining({ id: "test-order", @@ -1046,11 +1043,11 @@ describe("/admin/orders", () => { expect.objectContaining({ id: "test-order-w-r", }), - ]); - }); + ]) + }) it("successfully lists no orders with greater than", async () => { - const api = useApi(); + const api = useApi() const response = await api.get( "/admin/orders?fields=id&created_at[gt]=01-26-2000", @@ -1059,14 +1056,14 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(response.status).toEqual(200); - expect(response.data.orders).toEqual([]); - }); + expect(response.status).toEqual(200) + expect(response.data.orders).toEqual([]) + }) it("successfully lists orders with less than", async () => { - const api = useApi(); + const api = useApi() const response = await api.get( "/admin/orders?fields=id&created_at[lt]=01-26-2000", @@ -1075,9 +1072,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(response.status).toEqual(200); + expect(response.status).toEqual(200) expect(response.data.orders).toEqual([ expect.objectContaining({ id: "test-order", @@ -1095,11 +1092,11 @@ describe("/admin/orders", () => { expect.objectContaining({ id: "test-order-w-r", }), - ]); - }); + ]) + }) it("successfully lists no orders with less than", async () => { - const api = useApi(); + const api = useApi() const response = await api.get( "/admin/orders?fields=id&created_at[lt]=01-26-1990", @@ -1108,14 +1105,14 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(response.status).toEqual(200); - expect(response.data.orders).toEqual([]); - }); + expect(response.status).toEqual(200) + expect(response.data.orders).toEqual([]) + }) it("successfully lists orders using unix (greater than)", async () => { - const api = useApi(); + const api = useApi() const response = await api.get( "/admin/orders?fields=id&created_at[gt]=633351600", @@ -1124,9 +1121,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(response.status).toEqual(200); + expect(response.status).toEqual(200) expect(response.data.orders).toEqual([ expect.objectContaining({ id: "test-order", @@ -1144,8 +1141,8 @@ describe("/admin/orders", () => { expect.objectContaining({ id: "test-order-w-r", }), - ]); - }); + ]) + }) it.each([ [ @@ -1175,49 +1172,49 @@ describe("/admin/orders", () => { ])( "Only allows canceling order after canceling %s", async (id, o, of, pf) => { - const order_id = o; + const order_id = o const order = await callGet({ path: `/admin/orders/${order_id}`, get: "order", - }); + }) const expectCanceltoReturn = partial(expectPostCallToReturn, { path: `/admin/orders/${order_id}/cancel`, - }); + }) - await expectCanceltoReturn({ code: 400 }); + await expectCanceltoReturn({ code: 400 }) await expectAllPostCallsToReturn({ code: 200, col: of(order), pathf: pf, - }); + }) - await expectCanceltoReturn({ code: 200 }); + await expectCanceltoReturn({ code: 200 }) } - ); - }); + ) + }) describe("POST /admin/orders/:id/swaps", () => { beforeEach(async () => { try { - await adminSeeder(dbConnection); - await orderSeeder(dbConnection); - await swapSeeder(dbConnection); + await adminSeeder(dbConnection) + await orderSeeder(dbConnection) + await swapSeeder(dbConnection) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("creates a swap", async () => { - const api = useApi(); + const api = useApi() const response = await api.post( "/admin/orders/test-order/swaps", @@ -1235,12 +1232,51 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); - expect(response.status).toEqual(200); - }); + ) + expect(response.status).toEqual(200) + }) + + it("creates a swap with rma shipping options", async () => { + const api = useApi() + + const response = await api.post( + "/admin/orders/test-order/swaps", + { + return_items: [ + { + item_id: "test-item", + quantity: 1, + }, + ], + additional_items: [{ variant_id: "test-variant-2", quantity: 1 }], + rma_shipping_options: [{ option_id: "test-option", price: 0 }], + }, + { + headers: { + authorization: "Bearer test_token", + }, + } + ) + + const swap = response.data.order.swaps[0] + + const manager = dbConnection.manager + const rma = await manager.findOne(RMAShippingOption, { + shipping_option_id: "test-option", + swap_id: swap.id, + }) + + expect(response.status).toEqual(200) + expect(rma).toEqual( + expect.objectContaining({ + shipping_option_id: "test-option", + price: 0, + }) + ) + }) it("creates a swap and a return", async () => { - const api = useApi(); + const api = useApi() const returnedOrderFirst = await api.post( "/admin/orders/order-with-swap/return", @@ -1258,9 +1294,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(returnedOrderFirst.status).toEqual(200); + expect(returnedOrderFirst.status).toEqual(200) const returnedOrderSecond = await api.post( "/admin/orders/order-with-swap/return", @@ -1278,19 +1314,19 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) // find item to test returned quantiy for const toTest = returnedOrderSecond.data.order.items.find( (i) => i.id === "test-item-many" - ); + ) - expect(returnedOrderSecond.status).toEqual(200); - expect(toTest.returned_quantity).toBe(3); - }); + expect(returnedOrderSecond.status).toEqual(200) + expect(toTest.returned_quantity).toBe(3) + }) it("creates a swap and receives the items", async () => { - const api = useApi(); + const api = useApi() const createdSwapOrder = await api.post( "/admin/orders/test-order/swaps", @@ -1308,11 +1344,11 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(createdSwapOrder.status).toEqual(200); + expect(createdSwapOrder.status).toEqual(200) - const swap = createdSwapOrder.data.order.swaps[0]; + const swap = createdSwapOrder.data.order.swaps[0] const receivedSwap = await api.post( `/admin/returns/${swap.return_order.id}/receive`, @@ -1329,14 +1365,14 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(receivedSwap.status).toEqual(200); - expect(receivedSwap.data.return.status).toBe("received"); - }); + expect(receivedSwap.status).toEqual(200) + expect(receivedSwap.data.return.status).toBe("received") + }) it("creates a swap on a swap", async () => { - const api = useApi(); + const api = useApi() const swapOnSwap = await api.post( "/admin/orders/order-with-swap/swaps", @@ -1354,13 +1390,13 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(swapOnSwap.status).toEqual(200); - }); + expect(swapOnSwap.status).toEqual(200) + }) it("receives a swap on swap", async () => { - const api = useApi(); + const api = useApi() const received = await api.post( `/admin/returns/return-on-swap/receive`, @@ -1377,13 +1413,13 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(received.status).toEqual(200); - }); + expect(received.status).toEqual(200) + }) it("creates a return on a swap", async () => { - const api = useApi(); + const api = useApi() const returnOnSwap = await api.post( "/admin/orders/order-with-swap/return", @@ -1400,13 +1436,13 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(returnOnSwap.status).toEqual(200); - }); + expect(returnOnSwap.status).toEqual(200) + }) it("creates a return on an order", async () => { - const api = useApi(); + const api = useApi() const returnOnOrder = await api.post( "/admin/orders/test-order/return", @@ -1423,9 +1459,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(returnOnOrder.status).toEqual(200); + expect(returnOnOrder.status).toEqual(200) const captured = await api.post( "/admin/orders/test-order/capture", @@ -1435,9 +1471,9 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - const returnId = returnOnOrder.data.order.returns[0].id; + const returnId = returnOnOrder.data.order.returns[0].id const received = await api.post( `/admin/returns/${returnId}/receive`, @@ -1454,63 +1490,63 @@ describe("/admin/orders", () => { authorization: "Bearer test_token", }, } - ); + ) - expect(received.status).toEqual(200); - }); + expect(received.status).toEqual(200) + }) it("Only allows canceling swap after canceling fulfillments", async () => { try { - const swap_id = "swap-w-f"; + const swap_id = "swap-w-f" const swap = await callGet({ path: `/admin/swaps/${swap_id}`, get: "swap", - }); + }) - const { order_id } = swap; + const { order_id } = swap const expectCancelToReturn = partial(expectPostCallToReturn, { path: `/admin/orders/${order_id}/swaps/${swap_id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 400 }); + await expectCancelToReturn({ code: 400 }) await expectAllPostCallsToReturn({ code: 200, col: swap.fulfillments, pathf: (f) => `/admin/orders/${order_id}/swaps/${swap_id}/fulfillments/${f.id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 200 }); + await expectCancelToReturn({ code: 200 }) } catch (e) { - console.log(e); + console.log(e) } - }); + }) it("Only allows canceling swap after canceling return", async () => { - const swap_id = "swap-w-r"; + const swap_id = "swap-w-r" const swap = await callGet({ path: `/admin/swaps/${swap_id}`, get: "swap", - }); + }) - const { order_id } = swap; + const { order_id } = swap const expectCancelToReturn = partial(expectPostCallToReturn, { path: `/admin/orders/${order_id}/swaps/${swap_id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 400 }); + await expectCancelToReturn({ code: 400 }) await expectPostCallToReturn({ code: 200, path: `/admin/returns/${swap.return_order.id}/cancel`, - }); + }) - await expectCancelToReturn({ code: 200 }); - }); - }); -}); + await expectCancelToReturn({ code: 200 }) + }) + }) +}) diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index 8527218273..f1a01ae492 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -1,155 +1,162 @@ -const path = require("path"); -const { Region, LineItem, GiftCard } = require("@medusajs/medusa"); +const path = require("path") +const { + Region, + LineItem, + GiftCard, + RMAShippingOption, + Cart, +} = require("@medusajs/medusa") -const setupServer = require("../../../helpers/setup-server"); -const { useApi } = require("../../../helpers/use-api"); -const { initDb, useDb } = require("../../../helpers/use-db"); +const setupServer = require("../../../helpers/setup-server") +const { useApi } = require("../../../helpers/use-api") +const { initDb, useDb } = require("../../../helpers/use-db") -const cartSeeder = require("../../helpers/cart-seeder"); +const cartSeeder = require("../../helpers/cart-seeder") +const swapSeeder = require("../../helpers/swap-seeder") -jest.setTimeout(30000); +jest.setTimeout(30000) describe("/store/carts", () => { - let medusaProcess; - let dbConnection; + let medusaProcess + let dbConnection const doAfterEach = async () => { - const db = useDb(); - return await db.teardown(); - }; + const db = useDb() + return await db.teardown() + } beforeAll(async () => { - const cwd = path.resolve(path.join(__dirname, "..", "..")); - dbConnection = await initDb({ cwd }); - medusaProcess = await setupServer({ cwd }); - }); + const cwd = path.resolve(path.join(__dirname, "..", "..")) + dbConnection = await initDb({ cwd }) + medusaProcess = await setupServer({ cwd }) + }) afterAll(async () => { - const db = useDb(); - await db.shutdown(); - medusaProcess.kill(); - }); + const db = useDb() + await db.shutdown() + medusaProcess.kill() + }) describe("POST /store/carts", () => { beforeEach(async () => { - const manager = dbConnection.manager; + const manager = dbConnection.manager await manager.insert(Region, { id: "region", name: "Test Region", currency_code: "usd", tax_rate: 0, - }); + }) await manager.query( `UPDATE "country" SET region_id='region' WHERE iso_2 = 'us'` - ); - }); + ) + }) afterEach(async () => { - await doAfterEach(); - }); + await doAfterEach() + }) it("creates a cart", async () => { - const api = useApi(); + const api = useApi() - const response = await api.post("/store/carts"); - expect(response.status).toEqual(200); + const response = await api.post("/store/carts") + expect(response.status).toEqual(200) - const getRes = await api.post(`/store/carts/${response.data.cart.id}`); - expect(getRes.status).toEqual(200); - }); + const getRes = await api.post(`/store/carts/${response.data.cart.id}`) + expect(getRes.status).toEqual(200) + }) it("creates a cart with country", async () => { - const api = useApi(); + const api = useApi() const response = await api.post("/store/carts", { country_code: "us", - }); - expect(response.status).toEqual(200); - expect(response.data.cart.shipping_address.country_code).toEqual("us"); + }) + expect(response.status).toEqual(200) + expect(response.data.cart.shipping_address.country_code).toEqual("us") - const getRes = await api.post(`/store/carts/${response.data.cart.id}`); - expect(getRes.status).toEqual(200); - }); + const getRes = await api.post(`/store/carts/${response.data.cart.id}`) + expect(getRes.status).toEqual(200) + }) it("creates a cart with context", async () => { - const api = useApi(); + const api = useApi() const response = await api.post("/store/carts", { context: { test_id: "test", }, - }); - expect(response.status).toEqual(200); + }) + expect(response.status).toEqual(200) - const getRes = await api.post(`/store/carts/${response.data.cart.id}`); - expect(getRes.status).toEqual(200); + const getRes = await api.post(`/store/carts/${response.data.cart.id}`) + expect(getRes.status).toEqual(200) - const cart = getRes.data.cart; + const cart = getRes.data.cart expect(cart.context).toEqual({ ip: "::ffff:127.0.0.1", user_agent: "axios/0.21.1", test_id: "test", - }); - }); - }); + }) + }) + }) describe("POST /store/carts/:id", () => { beforeEach(async () => { try { - await cartSeeder(dbConnection); + await cartSeeder(dbConnection) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - await doAfterEach(); - }); + await doAfterEach() + }) it("fails on apply discount if limit has been reached", async () => { - const api = useApi(); + const api = useApi() try { await api.post("/store/carts/test-cart", { discounts: [{ code: "CREATED" }], - }); + }) } catch (error) { - expect(error.response.status).toEqual(400); + expect(error.response.status).toEqual(400) expect(error.response.data.message).toEqual( "Discount has been used maximum allowed times" - ); + ) } - }); + }) it("updates cart customer id", async () => { - const api = useApi(); + const api = useApi() const response = await api.post("/store/carts/test-cart", { customer_id: "test-customer-2", - }); + }) - expect(response.status).toEqual(200); - }); + expect(response.status).toEqual(200) + }) it("updates address using string id", async () => { - const api = useApi(); + const api = useApi() const response = await api.post("/store/carts/test-cart", { billing_address: "test-general-address", shipping_address: "test-general-address", - }); + }) expect(response.data.cart.shipping_address_id).toEqual( "test-general-address" - ); + ) expect(response.data.cart.billing_address_id).toEqual( "test-general-address" - ); - expect(response.status).toEqual(200); - }); + ) + expect(response.status).toEqual(200) + }) it("updates address", async () => { - const api = useApi(); + const api = useApi() const response = await api.post("/store/carts/test-cart", { shipping_address: { @@ -160,14 +167,14 @@ describe("/store/carts", () => { country_code: "us", postal_code: "something", }, - }); + }) - expect(response.data.cart.shipping_address.first_name).toEqual("clark"); - expect(response.status).toEqual(200); - }); + expect(response.data.cart.shipping_address.first_name).toEqual("clark") + expect(response.status).toEqual(200) + }) it("adds free shipping to cart then removes it again", async () => { - const api = useApi(); + const api = useApi() let cart = await api.post( "/store/carts/test-cart", @@ -175,10 +182,10 @@ describe("/store/carts", () => { discounts: [{ code: "FREE_SHIPPING" }, { code: "CREATED" }], }, { withCredentials: true } - ); + ) - expect(cart.data.cart.shipping_total).toBe(0); - expect(cart.status).toEqual(200); + expect(cart.data.cart.shipping_total).toBe(0) + expect(cart.status).toEqual(200) cart = await api.post( "/store/carts/test-cart", @@ -186,68 +193,68 @@ describe("/store/carts", () => { discounts: [{ code: "CREATED" }], }, { withCredentials: true } - ); + ) - expect(cart.data.cart.shipping_total).toBe(1000); - expect(cart.status).toEqual(200); - }); + expect(cart.data.cart.shipping_total).toBe(1000) + expect(cart.status).toEqual(200) + }) it("complete cart with giftcard total 0", async () => { - const manager = dbConnection.manager; + const manager = dbConnection.manager await manager.insert(GiftCard, { id: "gift_test", code: "GC_TEST", value: 20000, balance: 20000, region_id: "test-region", - }); + }) - const api = useApi(); + const api = useApi() await api.post(`/store/carts/test-cart-3`, { gift_cards: [{ code: "GC_TEST" }], - }); + }) const getRes = await api .post(`/store/carts/test-cart-3/complete`) .catch((err) => { - console.log(err.response.data); - }); + console.log(err.response.data) + }) - expect(getRes.status).toEqual(200); - expect(getRes.data.type).toEqual("order"); - }); + expect(getRes.status).toEqual(200) + expect(getRes.data.type).toEqual("order") + }) it("complete cart with items inventory covered", async () => { - const api = useApi(); - const getRes = await api.post(`/store/carts/test-cart-2/complete-cart`); + const api = useApi() + const getRes = await api.post(`/store/carts/test-cart-2/complete-cart`) - expect(getRes.status).toEqual(200); + expect(getRes.status).toEqual(200) - const variantRes = await api.get("/store/variants/test-variant"); - expect(variantRes.data.variant.inventory_quantity).toEqual(0); - }); + const variantRes = await api.get("/store/variants/test-variant") + expect(variantRes.data.variant.inventory_quantity).toEqual(0) + }) it("returns early, if cart is already completed", async () => { - const manager = dbConnection.manager; - const api = useApi(); + const manager = dbConnection.manager + const api = useApi() await manager.query( `UPDATE "cart" SET completed_at=current_timestamp WHERE id = 'test-cart-2'` - ); + ) try { - await api.post(`/store/carts/test-cart-2/complete-cart`); + await api.post(`/store/carts/test-cart-2/complete-cart`) } catch (error) { expect(error.response.data).toMatchSnapshot({ code: "not_allowed", message: "Cart has already been completed", code: "cart_incompatible_state", - }); - expect(error.response.status).toEqual(409); + }) + expect(error.response.status).toEqual(409) } - }); + }) it("fails to complete cart with items inventory not/partially covered", async () => { - const manager = dbConnection.manager; + const manager = dbConnection.manager const li = manager.create(LineItem, { id: "test-item", @@ -258,37 +265,58 @@ describe("/store/carts", () => { quantity: 99, variant_id: "test-variant-2", cart_id: "test-cart-2", - }); - await manager.save(li); + }) + await manager.save(li) - const api = useApi(); + const api = useApi() try { - await api.post(`/store/carts/test-cart-2/complete-cart`); + await api.post(`/store/carts/test-cart-2/complete-cart`) } catch (e) { expect(e.response.data).toMatchSnapshot({ code: "insufficient_inventory", - }); - expect(e.response.status).toBe(409); + }) + expect(e.response.status).toBe(409) } //check to see if payment has been cancelled - const res = await api.get(`/store/carts/test-cart-2`); - expect(res.data.cart.payment.canceled_at).not.toBe(null); - }); - }); + const res = await api.get(`/store/carts/test-cart-2`) + expect(res.data.cart.payment.canceled_at).not.toBe(null) + }) + }) describe("POST /store/carts/:id/shipping-methods", () => { beforeEach(async () => { - await cartSeeder(dbConnection); - }); + await cartSeeder(dbConnection) + const manager = dbConnection.manager + + await manager.insert(Cart, { + id: "test-cart-rma", + customer_id: "some-customer", + email: "some-customer@email.com", + shipping_address: { + id: "test-shipping-address", + first_name: "lebron", + country_code: "us", + }, + region_id: "test-region", + currency_code: "usd", + type: "swap", + }) + + await manager.insert(RMAShippingOption, { + id: "test-rmaso", + shipping_option_id: "test-option", + price: 5, + }) + }) afterEach(async () => { - await doAfterEach(); - }); + await doAfterEach() + }) - it("adds a shipping method to cart", async () => { - const api = useApi(); + it("adds a normal shipping method to cart", async () => { + const api = useApi() const cartWithShippingMethod = await api.post( "/store/carts/test-cart/shipping-methods", @@ -296,16 +324,37 @@ describe("/store/carts", () => { option_id: "test-option", }, { withCredentials: true } - ); + ) expect(cartWithShippingMethod.data.cart.shipping_methods).toContainEqual( expect.objectContaining({ shipping_option_id: "test-option" }) - ); - expect(cartWithShippingMethod.status).toEqual(200); - }); + ) + expect(cartWithShippingMethod.status).toEqual(200) + }) + + it("adds a rma shipping method to cart", async () => { + const api = useApi() + + const cartWithRMAShippingMethod = await api + .post( + "/store/carts/test-cart-rma/shipping-methods", + { + option_id: "test-rmaso", + }, + { withCredentials: true } + ) + .catch((err) => err.response) + + expect( + cartWithRMAShippingMethod.data.cart.shipping_methods + ).toContainEqual( + expect.objectContaining({ shipping_option_id: "test-option", price: 5 }) + ) + expect(cartWithRMAShippingMethod.status).toEqual(200) + }) it("adds a giftcard to cart, but ensures discount only applied to discountable items", async () => { - const api = useApi(); + const api = useApi() // Add standard line item to cart await api.post( @@ -315,7 +364,7 @@ describe("/store/carts", () => { quantity: 1, }, { withCredentials: true } - ); + ) // Add gift card to cart await api.post( @@ -325,7 +374,7 @@ describe("/store/carts", () => { quantity: 1, }, { withCredentials: true } - ); + ) // Add a 10% discount to the cart const cartWithGiftcard = await api.post( @@ -334,16 +383,16 @@ describe("/store/carts", () => { discounts: [{ code: "10PERCENT" }], }, { withCredentials: true } - ); + ) // Ensure that the discount is only applied to the standard item - expect(cartWithGiftcard.data.cart.total).toBe(1900); // 1000 (giftcard) + 900 (standard item with 10% discount) - expect(cartWithGiftcard.data.cart.discount_total).toBe(100); - expect(cartWithGiftcard.status).toEqual(200); - }); + expect(cartWithGiftcard.data.cart.total).toBe(1900) // 1000 (giftcard) + 900 (standard item with 10% discount) + expect(cartWithGiftcard.data.cart.discount_total).toBe(100) + expect(cartWithGiftcard.status).toEqual(200) + }) it("adds no more than 1 shipping method per shipping profile", async () => { - const api = useApi(); + const api = useApi() const addShippingMethod = async (option_id) => { return await api.post( "/store/carts/test-cart/shipping-methods", @@ -351,17 +400,17 @@ describe("/store/carts", () => { option_id, }, { withCredentials: true } - ); - }; + ) + } - await addShippingMethod("test-option"); + await addShippingMethod("test-option") const cartWithAnotherShippingMethod = await addShippingMethod( "test-option-2" - ); + ) expect( cartWithAnotherShippingMethod.data.cart.shipping_methods.length - ).toEqual(1); + ).toEqual(1) expect( cartWithAnotherShippingMethod.data.cart.shipping_methods ).toContainEqual( @@ -369,30 +418,30 @@ describe("/store/carts", () => { shipping_option_id: "test-option-2", price: 500, }) - ); - expect(cartWithAnotherShippingMethod.status).toEqual(200); - }); - }); + ) + expect(cartWithAnotherShippingMethod.status).toEqual(200) + }) + }) describe("DELETE /store/carts/:id/discounts/:code", () => { beforeEach(async () => { try { - await cartSeeder(dbConnection); + await cartSeeder(dbConnection) await dbConnection.manager.query( `INSERT INTO "cart_discounts" (cart_id, discount_id) VALUES ('test-cart', 'free-shipping')` - ); + ) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - await doAfterEach(); - }); + await doAfterEach() + }) it("removes free shipping and updates shipping total", async () => { - const api = useApi(); + const api = useApi() const cartWithFreeShipping = await api.post( "/store/carts/test-cart", @@ -400,36 +449,36 @@ describe("/store/carts", () => { discounts: [{ code: "FREE_SHIPPING" }], }, { withCredentials: true } - ); + ) - expect(cartWithFreeShipping.data.cart.shipping_total).toBe(0); - expect(cartWithFreeShipping.status).toEqual(200); + expect(cartWithFreeShipping.data.cart.shipping_total).toBe(0) + expect(cartWithFreeShipping.status).toEqual(200) const response = await api.delete( "/store/carts/test-cart/discounts/FREE_SHIPPING" - ); + ) - expect(response.data.cart.shipping_total).toBe(1000); - expect(response.status).toEqual(200); - }); - }); + expect(response.data.cart.shipping_total).toBe(1000) + expect(response.status).toEqual(200) + }) + }) describe("get-cart with session customer", () => { beforeEach(async () => { try { - await cartSeeder(dbConnection); + await cartSeeder(dbConnection) } catch (err) { - console.log(err); - throw err; + console.log(err) + throw err } - }); + }) afterEach(async () => { - await doAfterEach(); - }); + await doAfterEach() + }) it("updates empty cart.customer_id on cart retrieval", async () => { - const api = useApi(); + const api = useApi() let customer = await api.post( "/store/customers", @@ -440,29 +489,25 @@ describe("/store/carts", () => { last_name: "oli", }, { withCredentials: true } - ); + ) - const cookie = customer.headers["set-cookie"][0]; + const cookie = customer.headers["set-cookie"][0] - const cart = await api.post( - "/store/carts", - {}, - { withCredentials: true } - ); + const cart = await api.post("/store/carts", {}, { withCredentials: true }) const response = await api.get(`/store/carts/${cart.data.cart.id}`, { headers: { cookie, }, withCredentials: true, - }); + }) - expect(response.data.cart.customer_id).toEqual(customer.data.customer.id); - expect(response.status).toEqual(200); - }); + expect(response.data.cart.customer_id).toEqual(customer.data.customer.id) + expect(response.status).toEqual(200) + }) it("updates cart.customer_id on cart retrieval if cart.customer_id differ from session customer", async () => { - const api = useApi(); + const api = useApi() let customer = await api.post( "/store/customers", @@ -473,15 +518,15 @@ describe("/store/carts", () => { last_name: "oli", }, { withCredentials: true } - ); + ) - const cookie = customer.headers["set-cookie"][0]; + const cookie = customer.headers["set-cookie"][0] - const cart = await api.post("/store/carts"); + const cart = await api.post("/store/carts") const updatedCart = await api.post(`/store/carts/${cart.data.cart.id}`, { customer_id: "test-customer", - }); + }) const response = await api.get( `/store/carts/${updatedCart.data.cart.id}`, @@ -490,10 +535,10 @@ describe("/store/carts", () => { cookie, }, } - ); + ) - expect(response.data.cart.customer_id).toEqual(customer.data.customer.id); - expect(response.status).toEqual(200); - }); - }); -}); + expect(response.data.cart.customer_id).toEqual(customer.data.customer.id) + expect(response.status).toEqual(200) + }) + }) +}) diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index 2a9858facd..2c5f54050d 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -1,51 +1,53 @@ -const path = require("path"); -const { Region, ShippingProfile, ShippingOption } = require("@medusajs/medusa"); +const path = require("path") +const { Region, ShippingProfile, ShippingOption } = require("@medusajs/medusa") -const setupServer = require("../../../helpers/setup-server"); -const { useApi } = require("../../../helpers/use-api"); -const { initDb, useDb } = require("../../../helpers/use-db"); +const setupServer = require("../../../helpers/setup-server") +const { useApi } = require("../../../helpers/use-api") +const { initDb, useDb } = require("../../../helpers/use-db") +const cartSeeder = require("../../helpers/cart-seeder") +const swapSeeder = require("../../helpers/swap-seeder") -jest.setTimeout(30000); +jest.setTimeout(30000) describe("/store/shipping-options", () => { - let medusaProcess; - let dbConnection; + let medusaProcess + let dbConnection beforeAll(async () => { - const cwd = path.resolve(path.join(__dirname, "..", "..")); - dbConnection = await initDb({ cwd }); - medusaProcess = await setupServer({ cwd }); - }); + const cwd = path.resolve(path.join(__dirname, "..", "..")) + dbConnection = await initDb({ cwd }) + medusaProcess = await setupServer({ cwd }) + }) afterAll(async () => { - const db = useDb(); - await db.shutdown(); - medusaProcess.kill(); - }); + const db = useDb() + await db.shutdown() + medusaProcess.kill() + }) describe("POST /store/shipping-options", () => { beforeEach(async () => { - const manager = dbConnection.manager; + const manager = dbConnection.manager await manager.query( `ALTER SEQUENCE order_display_id_seq RESTART WITH 111` - ); + ) await manager.insert(Region, { id: "region", name: "Test Region", currency_code: "usd", tax_rate: 0, - }); + }) await manager.insert(Region, { id: "region2", name: "Test Region 2", currency_code: "usd", tax_rate: 0, - }); + }) const defaultProfile = await manager.findOne(ShippingProfile, { type: "default", - }); + }) await manager.insert(ShippingOption, { id: "test-out", @@ -57,7 +59,7 @@ describe("/store/shipping-options", () => { price_type: "flat_rate", amount: 2000, is_return: false, - }); + }) await manager.insert(ShippingOption, { id: "test-return", @@ -69,7 +71,7 @@ describe("/store/shipping-options", () => { price_type: "flat_rate", amount: 1000, is_return: true, - }); + }) await manager.insert(ShippingOption, { id: "test-region2", @@ -81,51 +83,101 @@ describe("/store/shipping-options", () => { price_type: "flat_rate", amount: 1000, is_return: false, - }); - }); + }) + }) afterEach(async () => { - const db = useDb(); - await db.teardown(); - }); + const db = useDb() + await db.teardown() + }) it("retrieves all shipping options", async () => { - const api = useApi(); + const api = useApi() const response = await api.get("/store/shipping-options").catch((err) => { - return err.response; - }); + return err.response + }) - expect(response.status).toEqual(200); - expect(response.data.shipping_options.length).toEqual(3); - }); + expect(response.status).toEqual(200) + expect(response.data.shipping_options.length).toEqual(3) + }) it("creates a return with shipping method", async () => { - const api = useApi(); + const api = useApi() const response = await api .get("/store/shipping-options?is_return=true") .catch((err) => { - return err.response; - }); + return err.response + }) - expect(response.status).toEqual(200); - expect(response.data.shipping_options.length).toEqual(1); - expect(response.data.shipping_options[0].id).toEqual("test-return"); - }); + expect(response.status).toEqual(200) + expect(response.data.shipping_options.length).toEqual(1) + expect(response.data.shipping_options[0].id).toEqual("test-return") + }) it("creates a return with shipping method", async () => { - const api = useApi(); + const api = useApi() const response = await api .get("/store/shipping-options?region_id=region2") .catch((err) => { - return err.response; - }); + return err.response + }) - expect(response.status).toEqual(200); - expect(response.data.shipping_options.length).toEqual(1); - expect(response.data.shipping_options[0].id).toEqual("test-region2"); - }); - }); -}); + expect(response.status).toEqual(200) + expect(response.data.shipping_options.length).toEqual(1) + expect(response.data.shipping_options[0].id).toEqual("test-region2") + }) + }) + + describe("GET /store/shipping-options/:cart_id", () => { + beforeEach(async () => { + await cartSeeder(dbConnection) + await swapSeeder(dbConnection) + }) + + afterEach(async () => { + const db = useDb() + await db.teardown() + }) + + it("given a default cart, when user retrieves its shipping options, then should return a list of shipping options", async () => { + const api = useApi() + + const response = await api + .get("/store/shipping-options/test-cart-2") + .catch((err) => { + return err.response + }) + + expect(response.status).toEqual(200) + expect(response.data.shipping_options).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: "test-option", amount: 1000 }), + expect.objectContaining({ id: "test-option-2", amount: 500 }), + ]) + ) + }) + + it("given a swap cart, when user retrieves its shipping options, then should return a list of RMA shipping options", async () => { + const api = useApi() + + const response = await api + .get("/store/shipping-options/test-cart-rma") + .catch((err) => { + return err.response + }) + + expect(response.status).toEqual(200) + expect(response.data.shipping_options).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + shipping_option_id: "test-option", + price: 0, + }), + ]) + ) + }) + }) +}) diff --git a/integration-tests/api/helpers/cart-seeder.js b/integration-tests/api/helpers/cart-seeder.js index 1d769fb0c0..40dbe74566 100644 --- a/integration-tests/api/helpers/cart-seeder.js +++ b/integration-tests/api/helpers/cart-seeder.js @@ -14,31 +14,31 @@ const { LineItem, Payment, PaymentSession, -} = require("@medusajs/medusa"); +} = require("@medusajs/medusa") module.exports = async (connection, data = {}) => { - const manager = connection.manager; + const manager = connection.manager const defaultProfile = await manager.findOne(ShippingProfile, { type: "default", - }); + }) const gcProfile = await manager.findOne(ShippingProfile, { type: "gift_card", - }); + }) await manager.insert(Address, { id: "test-general-address", first_name: "superman", country_code: "us", - }); + }) const r = manager.create(Region, { id: "test-region", name: "Test Region", currency_code: "usd", tax_rate: 0, - }); + }) const freeRule = manager.create(DiscountRule, { id: "free-shipping-rule", @@ -46,18 +46,18 @@ module.exports = async (connection, data = {}) => { type: "free_shipping", value: 100, allocation: "total", - }); + }) const freeDisc = manager.create(Discount, { id: "free-shipping", code: "FREE_SHIPPING", is_dynamic: false, is_disabled: false, - }); + }) - freeDisc.regions = [r]; - freeDisc.rule = freeRule; - await manager.save(freeDisc); + freeDisc.regions = [r] + freeDisc.rule = freeRule + await manager.save(freeDisc) const tenPercentRule = manager.create(DiscountRule, { id: "tenpercent-rule", @@ -65,25 +65,25 @@ module.exports = async (connection, data = {}) => { type: "percentage", value: 10, allocation: "total", - }); + }) const tenPercent = manager.create(Discount, { id: "10Percent", code: "10PERCENT", is_dynamic: false, is_disabled: false, - }); + }) - tenPercent.regions = [r]; - tenPercent.rule = tenPercentRule; - await manager.save(tenPercent); + tenPercent.regions = [r] + tenPercent.rule = tenPercentRule + await manager.save(tenPercent) const d = await manager.create(Discount, { id: "test-discount", code: "CREATED", is_dynamic: false, is_disabled: false, - }); + }) const dr = await manager.create(DiscountRule, { id: "test-discount-rule", @@ -91,31 +91,31 @@ module.exports = async (connection, data = {}) => { type: "fixed", value: 10000, allocation: "total", - }); + }) - d.rule = dr; - d.regions = [r]; + d.rule = dr + d.regions = [r] - await manager.save(d); + await manager.save(d) await manager.query( `UPDATE "country" SET region_id='test-region' WHERE iso_2 = 'us'` - ); + ) await manager.insert(Customer, { id: "test-customer", email: "test@email.com", - }); + }) await manager.insert(Customer, { id: "test-customer-2", email: "test-2@email.com", - }); + }) await manager.insert(Customer, { id: "some-customer", email: "some-customer@email.com", - }); + }) await manager.insert(ShippingOption, { id: "test-option", @@ -126,7 +126,7 @@ module.exports = async (connection, data = {}) => { price_type: "flat_rate", amount: 1000, data: {}, - }); + }) await manager.insert(ShippingOption, { id: "gc-option", @@ -137,7 +137,7 @@ module.exports = async (connection, data = {}) => { price_type: "flat_rate", amount: 0, data: {}, - }); + }) await manager.insert(ShippingOption, { id: "test-option-2", @@ -148,7 +148,7 @@ module.exports = async (connection, data = {}) => { price_type: "flat_rate", amount: 500, data: {}, - }); + }) await manager.insert(Product, { id: "giftcard-product", @@ -157,7 +157,7 @@ module.exports = async (connection, data = {}) => { discountable: false, profile_id: gcProfile.id, options: [{ id: "denom", title: "Denomination" }], - }); + }) await manager.insert(ProductVariant, { id: "giftcard-denom", @@ -170,14 +170,14 @@ module.exports = async (connection, data = {}) => { value: "1000", }, ], - }); + }) await manager.insert(Product, { id: "test-product", title: "test product", profile_id: defaultProfile.id, options: [{ id: "test-option", title: "Size" }], - }); + }) await manager.insert(ProductVariant, { id: "test-variant", @@ -190,7 +190,7 @@ module.exports = async (connection, data = {}) => { value: "Size", }, ], - }); + }) await manager.insert(ProductVariant, { id: "test-variant-2", @@ -203,31 +203,31 @@ module.exports = async (connection, data = {}) => { value: "Size", }, ], - }); + }) const ma = manager.create(MoneyAmount, { variant_id: "test-variant", currency_code: "usd", amount: 1000, - }); + }) - await manager.save(ma); + await manager.save(ma) const ma2 = manager.create(MoneyAmount, { variant_id: "test-variant-2", currency_code: "usd", amount: 8000, - }); + }) - await manager.save(ma2); + await manager.save(ma2) const ma3 = manager.create(MoneyAmount, { variant_id: "giftcard-denom", currency_code: "usd", amount: 1000, - }); + }) - await manager.save(ma3); + await manager.save(ma3) const cart = manager.create(Cart, { id: "test-cart", @@ -241,9 +241,9 @@ module.exports = async (connection, data = {}) => { region_id: "test-region", currency_code: "usd", items: [], - }); + }) - await manager.save(cart); + await manager.save(cart) const cart2 = manager.create(Cart, { id: "test-cart-2", @@ -258,7 +258,7 @@ module.exports = async (connection, data = {}) => { currency_code: "usd", completed_at: null, items: [], - }); + }) const pay = manager.create(Payment, { id: "test-payment", @@ -267,13 +267,13 @@ module.exports = async (connection, data = {}) => { amount_refunded: 0, provider_id: "test-pay", data: {}, - }); + }) - await manager.save(pay); + await manager.save(pay) - cart2.payment = pay; + cart2.payment = pay - await manager.save(cart2); + await manager.save(cart2) await manager.insert(PaymentSession, { id: "test-session", @@ -282,7 +282,7 @@ module.exports = async (connection, data = {}) => { is_selected: true, data: {}, status: "authorized", - }); + }) await manager.insert(ShippingMethod, { id: "test-method", @@ -290,7 +290,7 @@ module.exports = async (connection, data = {}) => { cart_id: "test-cart", price: 1000, data: {}, - }); + }) const li = manager.create(LineItem, { id: "test-item", @@ -301,8 +301,8 @@ module.exports = async (connection, data = {}) => { quantity: 1, variant_id: "test-variant", cart_id: "test-cart-2", - }); - await manager.save(li); + }) + await manager.save(li) const cart3 = manager.create(Cart, { id: "test-cart-3", @@ -317,8 +317,8 @@ module.exports = async (connection, data = {}) => { currency_code: "usd", completed_at: null, items: [], - }); - await manager.save(cart3); + }) + await manager.save(cart3) await manager.insert(ShippingMethod, { id: "test-method-2", @@ -326,7 +326,7 @@ module.exports = async (connection, data = {}) => { cart_id: "test-cart-3", price: 0, data: {}, - }); + }) const li2 = manager.create(LineItem, { id: "test-item-2", @@ -337,6 +337,6 @@ module.exports = async (connection, data = {}) => { quantity: 1, variant_id: "test-variant", cart_id: "test-cart-3", - }); - await manager.save(li2); -}; + }) + await manager.save(li2) +} diff --git a/integration-tests/api/helpers/swap-seeder.js b/integration-tests/api/helpers/swap-seeder.js index 7fcc9e6395..c5d6dda7fc 100644 --- a/integration-tests/api/helpers/swap-seeder.js +++ b/integration-tests/api/helpers/swap-seeder.js @@ -14,10 +14,11 @@ const { Swap, Cart, Return, -} = require("@medusajs/medusa"); + RMAShippingOption, +} = require("@medusajs/medusa") module.exports = async (connection, data = {}) => { - const manager = connection.manager; + const manager = connection.manager let orderWithSwap = manager.create(Order, { id: "order-with-swap", @@ -50,9 +51,9 @@ module.exports = async (connection, data = {}) => { ], items: [], ...data, - }); + }) - orderWithSwap = await manager.save(orderWithSwap); + orderWithSwap = await manager.save(orderWithSwap) const cart = manager.create(Cart, { id: "test-cart", @@ -66,9 +67,9 @@ module.exports = async (connection, data = {}) => { swap_id: "test-swap", parent_order_id: orderWithSwap.id, }, - }); + }) - await manager.save(cart); + await manager.save(cart) const swap = manager.create(Swap, { id: "test-swap", @@ -97,9 +98,62 @@ module.exports = async (connection, data = {}) => { cart_id: "test-cart", }, ], - }); + }) - await manager.save(swap); + await manager.save(swap) + + const rmaCart = manager.create(Cart, { + id: "test-cart-rma", + customer_id: "test-customer", + email: "test-customer@email.com", + shipping_address_id: "test-shipping-address", + billing_address_id: "test-billing-address", + region_id: "test-region", + type: "swap", + metadata: { + swap_id: "test-swap", + parent_order_id: orderWithSwap.id, + }, + }) + + await manager.save(rmaCart) + + const swapWithRMAMethod = manager.create(Swap, { + id: "test-swap-rma", + order_id: "order-with-swap", + payment_status: "captured", + fulfillment_status: "fulfilled", + cart_id: "test-cart-rma", + payment: { + id: "test-payment-swap", + amount: 10000, + currency_code: "usd", + amount_refunded: 0, + provider_id: "test-pay", + data: {}, + }, + additional_items: [ + { + id: "test-item-swapped", + fulfilled_quantity: 1, + title: "Line Item", + description: "Line Item Desc", + thumbnail: "https://test.js/1234", + unit_price: 9000, + quantity: 1, + variant_id: "test-variant-2", + cart_id: "test-cart", + }, + ], + rma_shipping_options: [ + { + shipping_option_id: "test-option", + price: 0, + }, + ], + }) + + await manager.save(swapWithRMAMethod) const cartTemplate = async (cartId) => { const cart = manager.create(Cart, { @@ -112,13 +166,13 @@ module.exports = async (connection, data = {}) => { type: "swap", metadata: {}, ...data, - }); + }) - await manager.save(cart); - }; + await manager.save(cart) + } const swapTemplate = async (cartId) => { - await cartTemplate(cartId); + await cartTemplate(cartId) return { order_id: orderWithSwap.id, fulfillment_status: "fulfilled", @@ -132,8 +186,8 @@ module.exports = async (connection, data = {}) => { data: {}, }, ...data, - }; - }; + } + } const swapWithFulfillments = manager.create(Swap, { id: "swap-w-f", @@ -150,9 +204,9 @@ module.exports = async (connection, data = {}) => { }, ], ...(await swapTemplate("sc-w-f")), - }); + }) - await manager.save(swapWithFulfillments); + await manager.save(swapWithFulfillments) const swapWithReturn = manager.create(Swap, { id: "swap-w-r", @@ -162,9 +216,9 @@ module.exports = async (connection, data = {}) => { refund_amount: 0, }, ...(await swapTemplate("sc-w-r")), - }); + }) - await manager.save(swapWithReturn); + await manager.save(swapWithReturn) const li = manager.create(LineItem, { id: "return-item-1", fulfilled_quantity: 1, @@ -176,9 +230,9 @@ module.exports = async (connection, data = {}) => { variant_id: "test-variant", order_id: orderWithSwap.id, cart_id: cart.id, - }); + }) - await manager.save(li); + await manager.save(li) const li2 = manager.create(LineItem, { id: "test-item-many", @@ -190,9 +244,9 @@ module.exports = async (connection, data = {}) => { quantity: 4, variant_id: "test-variant", order_id: orderWithSwap.id, - }); + }) - await manager.save(li2); + await manager.save(li2) const swapReturn = await manager.create(Return, { swap_id: swap.id, @@ -200,16 +254,16 @@ module.exports = async (connection, data = {}) => { item_id: li.id, refund_amount: li.quantity * li.unit_price, // shipping_method_id: , - }); + }) - await manager.save(swapReturn); + await manager.save(swapReturn) const return_item1 = manager.create(LineItem, { ...li, unit_price: -1 * li.unit_price, - }); + }) - await manager.save(return_item1); + await manager.save(return_item1) await manager.insert(ShippingMethod, { id: "another-test-method", @@ -217,7 +271,7 @@ module.exports = async (connection, data = {}) => { cart_id: "test-cart", price: 1000, data: {}, - }); + }) const swapOnSwap = manager.create(Swap, { id: "swap-on-swap", @@ -255,9 +309,9 @@ module.exports = async (connection, data = {}) => { variant_id: "test-variant", }, ], - }); + }) - await manager.save(swapOnSwap); + await manager.save(swapOnSwap) await manager.insert(ShippingMethod, { id: "test-method-swap-order", @@ -265,5 +319,5 @@ module.exports = async (connection, data = {}) => { order_id: "order-with-swap", price: 1000, data: {}, - }); -}; + }) +} From 02ce006440e3f366bedcb4e4cc7a195dc5a0fccc Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 30 Sep 2021 17:35:21 +0100 Subject: [PATCH 03/15] fix: jsdoc --- packages/medusa/src/services/cart.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index 06e408aaa1..f203c7881f 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -32,6 +32,7 @@ class CartService extends BaseService { paymentSessionRepository, inventoryService, RMAShippingOptionRepository, + swapRepository, }) { super() @@ -86,6 +87,7 @@ class CartService extends BaseService { /** @private @const {InventoryService} */ this.inventoryService_ = inventoryService + /** @private @const {RMAShippingOptionRepository} */ this.rmaShippingOptionRepository_ = RMAShippingOptionRepository } From 7ea284bb20415fe73c1111e8ff7b1fba7fa30d47 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 30 Sep 2021 17:57:46 +0100 Subject: [PATCH 04/15] fix: tests --- integration-tests/api/package.json | 6 +- integration-tests/api/yarn.lock | 107 +++++++++++++++++------------ 2 files changed, 66 insertions(+), 47 deletions(-) diff --git a/integration-tests/api/package.json b/integration-tests/api/package.json index adc7e6d917..3923280cec 100644 --- a/integration-tests/api/package.json +++ b/integration-tests/api/package.json @@ -8,15 +8,15 @@ "build": "babel src -d dist --extensions \".ts,.js\"" }, "dependencies": { - "@medusajs/medusa": "1.1.40-dev-1631178030541", - "medusa-interfaces": "1.1.21", + "@medusajs/medusa": "1.1.41-dev-1632959007011", + "medusa-interfaces": "1.1.23-dev-1632959007011", "typeorm": "^0.2.31" }, "devDependencies": { "@babel/cli": "^7.12.10", "@babel/core": "^7.12.10", "@babel/node": "^7.12.10", - "babel-preset-medusa-package": "1.1.13", + "babel-preset-medusa-package": "1.1.15-dev-1632959007011", "jest": "^26.6.3" } } diff --git a/integration-tests/api/yarn.lock b/integration-tests/api/yarn.lock index afe977164c..9b93bc77ba 100644 --- a/integration-tests/api/yarn.lock +++ b/integration-tests/api/yarn.lock @@ -1223,10 +1223,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@medusajs/medusa-cli@^1.1.16": - version "1.1.16" - resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.16.tgz#3ddcd5b16388a387c430116b962bb27a933ee85e" - integrity sha512-QvE7IYkR3NFiy4seZklfX+Xs/dJannVLbKfxLQbxCV2Sso3ZtJbSJt1BpTUwDxYjOFWXyTxRRjO1kEnA1yqCBA== +"@medusajs/medusa-cli@1.1.18-dev-1632959007011": + version "1.1.18-dev-1632959007011" + resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.18-dev-1632959007011.tgz#015c1c783a66e6ce7304f38ccee45e805c828885" + integrity sha512-6Aa9coormjBoAcQsymBCJXbtwHIF+IXovjq0C7CbwS58oytzJiReB+WJQmK1/tMq79femCIzH6TCLAqWkZCpWg== dependencies: "@babel/polyfill" "^7.8.7" "@babel/runtime" "^7.9.6" @@ -1244,8 +1244,8 @@ is-valid-path "^0.1.1" joi-objectid "^3.0.1" meant "^1.0.1" - medusa-core-utils "^0.1.27" - medusa-telemetry "^0.0.3" + medusa-core-utils "1.1.22-dev-1632959007011" + medusa-telemetry "0.0.5-dev-1632959007011" netrc-parser "^3.1.6" open "^8.0.6" ora "^5.4.1" @@ -1259,13 +1259,13 @@ winston "^3.3.3" yargs "^15.3.1" -"@medusajs/medusa@1.1.40-dev-1631178030541": - version "1.1.40-dev-1631178030541" - resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.40-dev-1631178030541.tgz#d693bdd9461e2281d387b26ad54b72c30e53218b" - integrity sha512-hhh67dltQ9dZYXBzA8FB8NrCaQ8bdALEm48t7oZ0J+GueG0fa6kcjU7Ud0uyy1vdov2zN4NOZmxGpcAw3n4alg== +"@medusajs/medusa@1.1.41-dev-1632959007011": + version "1.1.41-dev-1632959007011" + resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.41-dev-1632959007011.tgz#be73b1d7bc3af918130f7dff7883c6badda68a50" + integrity sha512-IVmz2U329dUTvC79yhxiH4mwEejvaTlecpM68uGQfNlU0lfONJQDNAzrLoBeYsrVI1okmVWTuDVvg22UE4Mc3A== dependencies: "@hapi/joi" "^16.1.8" - "@medusajs/medusa-cli" "^1.1.16" + "@medusajs/medusa-cli" "1.1.18-dev-1632959007011" "@types/lodash" "^4.14.168" awilix "^4.2.3" body-parser "^1.19.0" @@ -1286,8 +1286,8 @@ joi "^17.3.0" joi-objectid "^3.0.1" jsonwebtoken "^8.5.1" - medusa-core-utils "^1.1.20" - medusa-test-utils "^1.1.23" + medusa-core-utils "1.1.22-dev-1632959007011" + medusa-test-utils "1.1.25-dev-1632959007011" morgan "^1.9.1" multer "^1.4.2" passport "^0.4.0" @@ -1302,6 +1302,7 @@ resolve-cwd "^3.0.0" scrypt-kdf "^2.0.1" sqlite3 "^5.0.2" + typeorm "^0.2.37" ulid "^2.3.0" uuid "^8.3.1" winston "^3.2.1" @@ -1932,10 +1933,10 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" -babel-preset-medusa-package@1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.13.tgz#9dc4e64e08436fb7b3536cef0f363a535e126474" - integrity sha512-Q9t06udxwMnfwyx7gyxoUKiZj/dtYSSXBtQ+K4ntY1hzMhOK2hBBInuiTgnLQS1cxc4j+FN2oYYPCpspX/acaw== +babel-preset-medusa-package@1.1.15-dev-1632959007011: + version "1.1.15-dev-1632959007011" + resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.15-dev-1632959007011.tgz#fa8d0e46ab52761446c03452bbc00c0eed5ca1b8" + integrity sha512-3E4NjDP/9OUS9DW5aCV6bcYwLYpa3xRIlR2q8WTZMaM+jsIxSuA7+HD1tbmDrxMpRB9ErYPhX6iyKZMzvHKw6w== dependencies: "@babel/plugin-proposal-class-properties" "^7.12.1" "@babel/plugin-proposal-decorators" "^7.12.1" @@ -2867,6 +2868,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dom-walk@^0.1.0: + version "0.1.2" + resolved "http://localhost:4873/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -3588,6 +3594,14 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +global@^4.4.0: + version "4.4.0" + resolved "http://localhost:4873/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -5091,50 +5105,43 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -medusa-core-utils@^0.1.27: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-0.1.39.tgz#d57816c9bd43f9a92883650c1e66add1665291df" - integrity sha512-R8+U1ile7if+nR6Cjh5exunx0ETV0OfkWUUBUpz1KmHSDv0V0CcvQqU9lcZesPFDEbu3Y2iEjsCqidVA4nG2nQ== - dependencies: - "@hapi/joi" "^16.1.8" - joi-objectid "^3.0.1" - -medusa-core-utils@^1.1.20: - version "1.1.20" - resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-1.1.20.tgz#676c0dc863a206b80cc53299a984c532d07df65f" - integrity sha512-gf+/L5eeqHea3xgjwD7YZEzfUGlxbjfvaeiiGWi3Wfu0dLa+G1B4S0TsX+upR+oVeWPmk66VMqWC80h3e4csqw== +medusa-core-utils@1.1.22-dev-1632959007011: + version "1.1.22-dev-1632959007011" + resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.22-dev-1632959007011.tgz#41209056f0a1a47503d8fc1d0c5e30e49811bdd9" + integrity sha512-jRfRWMxiNDYwTQ6k9Lers7HWqTfI5ZjIihRKLIx+mGio/mOFVr243co7VIZXOUurL7BM3ddm2HP87nZTz68qBA== dependencies: joi "^17.3.0" joi-objectid "^3.0.1" -medusa-interfaces@1.1.21: - version "1.1.21" - resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-1.1.21.tgz#ca86808e939b7ecc21a6d316008a4e41f163619f" - integrity sha512-mlHHoMIOFBc+Exs+uVIQsfeEP2C1Pi6IZHcpbm7O00tYBdQdqRjJre9+Z/I/Z37wt5IwA28/TIoVkYG71iQYxw== +medusa-interfaces@1.1.23-dev-1632959007011: + version "1.1.23-dev-1632959007011" + resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.23-dev-1632959007011.tgz#1e8cfc25d2c2363c370e3580b1f18bfa818b0569" + integrity sha512-HyyY6FnUtvzw0w9/4H8dEfC6LcAkYNoxep9Rh0HZBwchrZUx/JaSUAmRWFSzHaaqjxk6txbZIVjerAj2t2YBRQ== dependencies: - medusa-core-utils "^1.1.20" + medusa-core-utils "1.1.22-dev-1632959007011" -medusa-telemetry@^0.0.3: - version "0.0.3" - resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.3.tgz#c11e5e0f3cc969f3eaee41d1c24f78a5c0715362" - integrity sha512-Qb/sgOwO8t2Sjjo4nKyBa6hKZ/SjniT4eEWenygEaJDqXZhfogVYGhWc5gn4tLlFFNEHXzDTlrqX2LvzfEJWIw== +medusa-telemetry@0.0.5-dev-1632959007011: + version "0.0.5-dev-1632959007011" + resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.5-dev-1632959007011.tgz#b10a46693403140bf3d5963010d6c640340a3f33" + integrity sha512-BqEb1MHz8ac1vMH0miIXNBbTkvvUvcy2WkoCVUnG4zzkL4cApXqUKitMUMT774kh2WO/glOnIccNNlKbAJgaZg== dependencies: axios "^0.21.1" axios-retry "^3.1.9" boxen "^5.0.1" ci-info "^3.2.0" configstore "5.0.1" + global "^4.4.0" is-docker "^2.2.1" remove-trailing-slash "^0.1.1" uuid "^8.3.2" -medusa-test-utils@^1.1.23: - version "1.1.23" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-1.1.23.tgz#e8380df499979cd0b97a5bb87779662f4da9d722" - integrity sha512-okyUgB4t7bqDieE0XO+HkbVVemn6hE1tTAtF9PXRi2igmKmcnyW/Ljk3lqrKYVhjei4z3Z/b+K2b0oNwhopbGQ== +medusa-test-utils@1.1.25-dev-1632959007011: + version "1.1.25-dev-1632959007011" + resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.25-dev-1632959007011.tgz#c3d971e89d52d35898ab7d95c2a449846ce1cd38" + integrity sha512-wCKlIugeRlgJIaoyYN5K9KtJaBd66rdmg1yD5Vxq+Fd5rftJUOP2wiN5nIV0BK5v13mMH56iSY7aOK12Um287Q== dependencies: "@babel/plugin-transform-classes" "^7.9.5" - medusa-core-utils "^1.1.20" + medusa-core-utils "1.1.22-dev-1632959007011" randomatic "^3.1.1" merge-descriptors@1.0.1: @@ -5218,6 +5225,13 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-document@^2.19.0: + version "2.19.0" + resolved "http://localhost:4873/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -6060,6 +6074,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "http://localhost:4873/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + promise.prototype.finally@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz#b8af89160c9c673cefe3b4c4435b53cfd0287067" @@ -7267,7 +7286,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typeorm@^0.2.31: +typeorm@^0.2.31, typeorm@^0.2.37: version "0.2.37" resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.37.tgz#1a5e59216077640694d27c04c99ed3f968d15dc8" integrity sha512-7rkW0yCgFC24I5T0f3S/twmLSuccPh1SQmxET/oDWn2sSDVzbyWdnItSdKy27CdJGTlKHYtUVeOcMYw5LRsXVw== From db83448d188b092745c3df6f38e87d89836942cc Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 30 Sep 2021 20:39:58 +0100 Subject: [PATCH 05/15] fix: tests --- .../admin/__snapshots__/auth.js.snap | 15 +- .../store/__snapshots__/auth.js.snap | 17 + integration-tests/api/__tests__/store/cart.js | 1 + integration-tests/api/helpers/cart-seeder.js | 29 - integration-tests/api/helpers/swap-seeder.js | 7 - integration-tests/api/package.json | 6 +- integration-tests/api/yarn.lock | 79 +- packages/medusa/package.json | 2 +- .../api/routes/admin/orders/create-swap.js | 14 +- .../routes/store/carts/add-shipping-method.js | 1 - .../shipping-options/list-shipping-options.js | 3 +- .../src/api/routes/store/swaps/create-swap.js | 5 +- packages/medusa/src/services/cart.js | 2 +- .../medusa/src/services/shipping-profile.js | 5 +- packages/medusa/yarn.lock | 1668 +++++++---------- 15 files changed, 793 insertions(+), 1061 deletions(-) diff --git a/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap b/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap index 3a3a924b4b..bd72f27516 100644 --- a/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap +++ b/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap @@ -1,5 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`/admin/auth creates admin session correctly 1`] = ` +Object { + "api_token": "test_token", + "created_at": Any, + "deleted_at": null, + "email": "admin@medusa.js", + "first_name": null, + "id": "admin_user", + "last_name": null, + "metadata": null, + "updated_at": Any, +} +`; + exports[`/admin/discounts creates admin session correctly 1`] = ` Object { "api_token": "test_token", @@ -13,4 +27,3 @@ Object { "updated_at": Any, } `; - diff --git a/integration-tests/api/__tests__/store/__snapshots__/auth.js.snap b/integration-tests/api/__tests__/store/__snapshots__/auth.js.snap index aaae35ba9c..5bfeffc442 100644 --- a/integration-tests/api/__tests__/store/__snapshots__/auth.js.snap +++ b/integration-tests/api/__tests__/store/__snapshots__/auth.js.snap @@ -1,5 +1,22 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`/admin/auth creates store session correctly 1`] = ` +Object { + "billing_address_id": null, + "created_at": Any, + "deleted_at": null, + "email": "test@testesen.dk", + "first_name": "test", + "has_account": true, + "id": Any, + "last_name": "testesen", + "metadata": null, + "orders": Array [], + "phone": "12345678", + "updated_at": Any, +} +`; + exports[`/admin/discounts creates store session correctly 1`] = ` Object { "billing_address_id": null, diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index 9b218ae6d0..7e59faae39 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -145,6 +145,7 @@ describe("/store/carts", () => { discounts: [{ code: "CREATED" }], }) } catch (error) { + console.log(error.response) expect(error.response.status).toEqual(400) expect(error.response.data.message).toEqual( "Discount has been used maximum allowed times" diff --git a/integration-tests/api/helpers/cart-seeder.js b/integration-tests/api/helpers/cart-seeder.js index fbaafc4578..f7e499368a 100644 --- a/integration-tests/api/helpers/cart-seeder.js +++ b/integration-tests/api/helpers/cart-seeder.js @@ -51,8 +51,6 @@ module.exports = async (connection, data = {}) => { currency_code: "usd", tax_rate: 0, }) -<<<<<<< HEAD -======= // Region with multiple countries const regionWithMultipleCoutries = manager.create(Region, { @@ -69,7 +67,6 @@ module.exports = async (connection, data = {}) => { await manager.query( `UPDATE "country" SET region_id='test-region-multiple' WHERE iso_2 = 'dk'` ) ->>>>>>> develop const freeRule = manager.create(DiscountRule, { id: "free-shipping-rule", @@ -103,11 +100,8 @@ module.exports = async (connection, data = {}) => { code: "10PERCENT", is_dynamic: false, is_disabled: false, -<<<<<<< HEAD -======= starts_at: tenDaysAgo, ends_at: tenDaysFromToday, ->>>>>>> develop }) tenPercent.regions = [r] @@ -128,13 +122,6 @@ module.exports = async (connection, data = {}) => { value: 10000, allocation: "total", }) -<<<<<<< HEAD - - d.rule = dr - d.regions = [r] - - await manager.save(d) -======= d.rule = dr d.regions = [r] @@ -226,7 +213,6 @@ module.exports = async (connection, data = {}) => { DynamicDiscount.regions = [r] DynamicDiscount.rule = DynamicRule await manager.save(DynamicDiscount) ->>>>>>> develop await manager.query( `UPDATE "country" SET region_id='test-region' WHERE iso_2 = 'us'` @@ -389,8 +375,6 @@ module.exports = async (connection, data = {}) => { completed_at: null, items: [], }) -<<<<<<< HEAD -======= const swapCart = manager.create(Cart, { id: "swap-cart", @@ -410,7 +394,6 @@ module.exports = async (connection, data = {}) => { swap_id: "test-swap", }, }) ->>>>>>> develop const pay = manager.create(Payment, { id: "test-payment", @@ -420,14 +403,6 @@ module.exports = async (connection, data = {}) => { provider_id: "test-pay", data: {}, }) -<<<<<<< HEAD - - await manager.save(pay) - - cart2.payment = pay - - await manager.save(cart2) -======= await manager.save(pay) @@ -451,7 +426,6 @@ module.exports = async (connection, data = {}) => { await manager.save(cart2) await manager.save(swapCart) ->>>>>>> develop await manager.insert(PaymentSession, { id: "test-session", @@ -461,8 +435,6 @@ module.exports = async (connection, data = {}) => { data: {}, status: "authorized", }) -<<<<<<< HEAD -======= await manager.insert(PaymentSession, { id: "test-swap-session", @@ -472,7 +444,6 @@ module.exports = async (connection, data = {}) => { data: {}, status: "authorized", }) ->>>>>>> develop await manager.insert(ShippingMethod, { id: "test-method", diff --git a/integration-tests/api/helpers/swap-seeder.js b/integration-tests/api/helpers/swap-seeder.js index 3b8f6ba043..1965e67805 100644 --- a/integration-tests/api/helpers/swap-seeder.js +++ b/integration-tests/api/helpers/swap-seeder.js @@ -100,7 +100,6 @@ module.exports = async (connection, data = {}) => { }) await manager.save(swap) -<<<<<<< HEAD const rmaCart = manager.create(Cart, { id: "test-cart-rma", @@ -154,8 +153,6 @@ module.exports = async (connection, data = {}) => { }) await manager.save(swapWithRMAMethod) -======= ->>>>>>> develop const cartTemplate = async (cartId) => { const cart = manager.create(Cart, { @@ -255,10 +252,6 @@ module.exports = async (connection, data = {}) => { order_id: orderWithSwap.id, item_id: li.id, refund_amount: li.quantity * li.unit_price, -<<<<<<< HEAD - // shipping_method_id: , -======= ->>>>>>> develop }) await manager.save(swapReturn) diff --git a/integration-tests/api/package.json b/integration-tests/api/package.json index 7abd7c9b69..1dbc61e055 100644 --- a/integration-tests/api/package.json +++ b/integration-tests/api/package.json @@ -8,15 +8,15 @@ "build": "babel src -d dist --extensions \".ts,.js\"" }, "dependencies": { - "@medusajs/medusa": "1.1.40-dev-1631630701835", - "medusa-interfaces": "1.1.21-dev-1631630701835", + "@medusajs/medusa": "1.1.41-dev-1633030366783", + "medusa-interfaces": "1.1.23-dev-1633030366783", "typeorm": "^0.2.31" }, "devDependencies": { "@babel/cli": "^7.12.10", "@babel/core": "^7.12.10", "@babel/node": "^7.12.10", - "babel-preset-medusa-package": "1.1.13-dev-1631630701835", + "babel-preset-medusa-package": "1.1.15-dev-1633030366783", "jest": "^26.6.3" } } diff --git a/integration-tests/api/yarn.lock b/integration-tests/api/yarn.lock index 3e2aeb4f43..85f1c0ab05 100644 --- a/integration-tests/api/yarn.lock +++ b/integration-tests/api/yarn.lock @@ -1223,10 +1223,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@medusajs/medusa-cli@1.1.16-dev-1631630701835": - version "1.1.16-dev-1631630701835" - resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.16-dev-1631630701835.tgz#7fcb95cb9a45e0367cc5becfff7f5d1533b46b5f" - integrity sha512-UomtR8B1lBFDb3h1y060fOcWcZi812Jwt8Kgjxqtpn+aRj6Bu7+I3WJGHBVSx4VnUBINSYbtiQMpEwqVGTCKnw== +"@medusajs/medusa-cli@1.1.18-dev-1633030366783": + version "1.1.18-dev-1633030366783" + resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.18-dev-1633030366783.tgz#1112165ea9c03c797cd8d01f1149da989b9bea55" + integrity sha512-EIDxOs9STvFWwXv+8VWetrzABkijGOzcbKJzJ1jeDYjl61uRnELoWg57aeWj6wzKcTjhYRRKDrivMRUiexkHsA== dependencies: "@babel/polyfill" "^7.8.7" "@babel/runtime" "^7.9.6" @@ -1244,8 +1244,8 @@ is-valid-path "^0.1.1" joi-objectid "^3.0.1" meant "^1.0.1" - medusa-core-utils "1.1.20-dev-1631630701835" - medusa-telemetry "0.0.3-dev-1631630701835" + medusa-core-utils "1.1.22-dev-1633030366783" + medusa-telemetry "0.0.5-dev-1633030366783" netrc-parser "^3.1.6" open "^8.0.6" ora "^5.4.1" @@ -1259,13 +1259,13 @@ winston "^3.3.3" yargs "^15.3.1" -"@medusajs/medusa@1.1.40-dev-1631630701835": - version "1.1.40-dev-1631630701835" - resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.40-dev-1631630701835.tgz#fa67ceda5887fd31196b3bcfd3115a9e02d68448" - integrity sha512-svPsKonuBrwRgtYod7U7ho9bN84K7N/QorMJG9+wklEO4jp6zXG+U5DQcfVAKQ00cHHe50OcnfX1ZS0kVNovYw== +"@medusajs/medusa@1.1.41-dev-1633030366783": + version "1.1.41-dev-1633030366783" + resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.41-dev-1633030366783.tgz#0beb57e9844c3b85c59bfcde86183a2a625e3a91" + integrity sha512-b1QGscpszVYhDLOea7WhbW0DCgEKBKchHP1nNLj07mWTxE5vOBuAZeUSh1FHNw0jbPhtn9mOaFz2wwIgxPcfqw== dependencies: "@hapi/joi" "^16.1.8" - "@medusajs/medusa-cli" "1.1.16-dev-1631630701835" + "@medusajs/medusa-cli" "1.1.18-dev-1633030366783" "@types/lodash" "^4.14.168" awilix "^4.2.3" body-parser "^1.19.0" @@ -1283,11 +1283,12 @@ glob "^7.1.6" ioredis "^4.17.3" ioredis-mock "^5.6.0" + iso8601-duration "^1.3.0" joi "^17.3.0" joi-objectid "^3.0.1" jsonwebtoken "^8.5.1" - medusa-core-utils "1.1.20-dev-1631630701835" - medusa-test-utils "1.1.23-dev-1631630701835" + medusa-core-utils "1.1.22-dev-1633030366783" + medusa-test-utils "1.1.25-dev-1633030366783" morgan "^1.9.1" multer "^1.4.2" passport "^0.4.0" @@ -1302,7 +1303,6 @@ resolve-cwd "^3.0.0" scrypt-kdf "^2.0.1" sqlite3 "^5.0.2" - typeorm "^0.2.37" ulid "^2.3.0" uuid "^8.3.1" winston "^3.2.1" @@ -1933,10 +1933,10 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" -babel-preset-medusa-package@1.1.13-dev-1631630701835: - version "1.1.13-dev-1631630701835" - resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.13-dev-1631630701835.tgz#5b66b3738e4904e31b2db30a6ea8e68eb0f8f641" - integrity sha512-V7sXlktlvEON7FLhxe+Y3NVe8l8DQyB5oJTryG4Bhw8y1AaUFOiQ5Vat3XuoL3qRcUSVMGL4VHw0m0O78t0PuA== +babel-preset-medusa-package@1.1.15-dev-1633030366783: + version "1.1.15-dev-1633030366783" + resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.15-dev-1633030366783.tgz#00f8aa5ebcb98c9a161a2c12dad55ffac53df88c" + integrity sha512-A/qfZNpIcYFMjAHYqVvavP9uY7ODtKGaQwZyx9quFydxebLSUstHTJ5s9ES1XjqhRYpEy//ixwNBkzggig0F9w== dependencies: "@babel/plugin-proposal-class-properties" "^7.12.1" "@babel/plugin-proposal-decorators" "^7.12.1" @@ -4275,6 +4275,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +iso8601-duration@^1.3.0: + version "1.3.0" + resolved "http://localhost:4873/iso8601-duration/-/iso8601-duration-1.3.0.tgz#29d7b69e0574e4acdee50c5e5e09adab4137ba5a" + integrity sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -5105,25 +5110,25 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -medusa-core-utils@1.1.20-dev-1631630701835: - version "1.1.20-dev-1631630701835" - resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.20-dev-1631630701835.tgz#1fa7ccd2551b7891127d4f07f708029c585f4ea8" - integrity sha512-KKBo6W1QI47Ig3KMV4UXQnQN5JilMfjR6Cx7hDNj4frJoNiWa/YKDYqUr6SmY2+iJtKetnLkrKaPsDyyhZrxcw== +medusa-core-utils@1.1.22-dev-1633030366783: + version "1.1.22-dev-1633030366783" + resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.22-dev-1633030366783.tgz#988358df8d8c7350d4fea3c3c00ae9f2e4aaa434" + integrity sha512-WYJ141mu6aYFGO9Vs9lXx+mJWXogrASxWJOIT29bZIFuaqI/LuiZysFn+Y6tzGBHLRdMKwHE+u/Zg1vh1NGfrw== dependencies: joi "^17.3.0" joi-objectid "^3.0.1" -medusa-interfaces@1.1.21-dev-1631630701835: - version "1.1.21-dev-1631630701835" - resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.21-dev-1631630701835.tgz#af29b2ef0c987bded1b2d295ac6cf39880af551e" - integrity sha512-rTASRjOdcS3J9fP95p9vJzCpatMpUhTum5ddfAA0s42pZx2gsPlf1f+rUSNz5QfeC5RdIEzRfOmAGfvMpAbYGw== +medusa-interfaces@1.1.23-dev-1633030366783: + version "1.1.23-dev-1633030366783" + resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.23-dev-1633030366783.tgz#d3cb82493e2bb53ff728e369d38183d964ac2cc9" + integrity sha512-7X3KnKUJHBye7ikmLouvYQCCINHb2DpBy9cOQKpUSwsaKlUMIvxJq2T+AieuwWhiTACwAwTLiWshSILUdbvKcQ== dependencies: - medusa-core-utils "1.1.20-dev-1631630701835" + medusa-core-utils "1.1.22-dev-1633030366783" -medusa-telemetry@0.0.3-dev-1631630701835: - version "0.0.3-dev-1631630701835" - resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.3-dev-1631630701835.tgz#d56c01d261fa30ccedc6d9976971b9744b9d8c0f" - integrity sha512-FS1L1DOIOSdRZgeIQWaM5nhFG5NtbnC/Pntfac51vQxLkzFuHy7ZEtg11CXKE+x6NWlqT1rqqgxq0EabFzEZzw== +medusa-telemetry@0.0.5-dev-1633030366783: + version "0.0.5-dev-1633030366783" + resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.5-dev-1633030366783.tgz#ee9368da672a5f46d323a98b521d49983f6f1e9d" + integrity sha512-BU1XyCWS2iX5lqfxcCRAxOCrtY55eLyH1XoLLPoO8dWKIDn3G0uh4N/WKBPn40cVLbeTRqOoVRYQP6jnuEjn6w== dependencies: axios "^0.21.1" axios-retry "^3.1.9" @@ -5135,13 +5140,13 @@ medusa-telemetry@0.0.3-dev-1631630701835: remove-trailing-slash "^0.1.1" uuid "^8.3.2" -medusa-test-utils@1.1.23-dev-1631630701835: - version "1.1.23-dev-1631630701835" - resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.23-dev-1631630701835.tgz#8995d636caf2dea9ebb184f1e15b0c364c4d1b93" - integrity sha512-A8xRL+sZS22qXZSHpVfdV8f/egZxXs4iExRO2xUkTP6I/OgMhFBSg6nEd/DXVdVfpsHZCDEv8PA3ewaeAkoYhQ== +medusa-test-utils@1.1.25-dev-1633030366783: + version "1.1.25-dev-1633030366783" + resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.25-dev-1633030366783.tgz#97b8235e4fbfd5cf16ed91444df1af44d4c45a60" + integrity sha512-9cztZpuTMbn++Zg/06+vlOnAFa7jUAFf7o7i7kXQGXInlJngS0Tw9pq8H0vQ4vz7QRdiOiFPXb11gymLUT64uA== dependencies: "@babel/plugin-transform-classes" "^7.9.5" - medusa-core-utils "1.1.20-dev-1631630701835" + medusa-core-utils "1.1.22-dev-1633030366783" randomatic "^3.1.1" merge-descriptors@1.0.1: @@ -7286,7 +7291,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typeorm@^0.2.31, typeorm@^0.2.37: +typeorm@^0.2.31: version "0.2.37" resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.37.tgz#1a5e59216077640694d27c04c99ed3f968d15dc8" integrity sha512-7rkW0yCgFC24I5T0f3S/twmLSuccPh1SQmxET/oDWn2sSDVzbyWdnItSdKy27CdJGTlKHYtUVeOcMYw5LRsXVw== diff --git a/packages/medusa/package.json b/packages/medusa/package.json index 3c6e0f2f33..f019717f75 100644 --- a/packages/medusa/package.json +++ b/packages/medusa/package.json @@ -88,4 +88,4 @@ "winston": "^3.2.1" }, "gitHead": "41a5425405aea5045a26def95c0dc00cf4a5a44d" -} +} \ No newline at end of file diff --git a/packages/medusa/src/api/routes/admin/orders/create-swap.js b/packages/medusa/src/api/routes/admin/orders/create-swap.js index 49404162de..f88351c317 100644 --- a/packages/medusa/src/api/routes/admin/orders/create-swap.js +++ b/packages/medusa/src/api/routes/admin/orders/create-swap.js @@ -81,12 +81,14 @@ export default async (req, res) => { .optional(), }) .optional(), - rma_shipping_options: Validator.array().items({ - option_id: Validator.string().optional(), - price: Validator.number() - .integer() - .optional(), - }), + rma_shipping_options: Validator.array() + .items({ + option_id: Validator.string().optional(), + price: Validator.number() + .integer() + .optional(), + }) + .default([]), additional_items: Validator.array().items({ variant_id: Validator.string().required(), quantity: Validator.number().required(), diff --git a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js index 93628aa6d9..b66c928fa9 100644 --- a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js +++ b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js @@ -1,7 +1,6 @@ import _ from "lodash" import { Validator, MedusaError } from "medusa-core-utils" import { defaultFields, defaultRelations } from "./" -import { CartType } from "../../../../models/cart" /** * @oas [post] /carts/{id}/shipping-methods diff --git a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js index 26f4ee3251..c1903d3204 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js @@ -1,5 +1,4 @@ import { Validator, MedusaError } from "medusa-core-utils" -import { CartType } from "../../../../models/cart" /** * @oas [get] /shipping-options/{cart_id} @@ -42,7 +41,7 @@ export default async (req, res) => { }) let options - if (cart.type === CartType.SWAP || cart.type === CartType.CLAIM) { + if (cart.type === "swap" || cart.type === "claim") { options = await shippingProfileService.fetchRMAOptions(cart) } else { options = await shippingProfileService.fetchCartOptions(cart) diff --git a/packages/medusa/src/api/routes/store/swaps/create-swap.js b/packages/medusa/src/api/routes/store/swaps/create-swap.js index eb115ca443..5254bda2ef 100644 --- a/packages/medusa/src/api/routes/store/swaps/create-swap.js +++ b/packages/medusa/src/api/routes/store/swaps/create-swap.js @@ -108,7 +108,7 @@ export default async (req, res) => { case "started": { const { key, error } = await idempotencyKeyService.workStage( idempotencyKey.idempotency_key, - async (manager) => { + async manager => { const order = await orderService .withTransaction(manager) .retrieve(value.order_id, { @@ -130,6 +130,7 @@ export default async (req, res) => { value.return_items, value.additional_items, returnShipping, + [], { idempotency_key: idempotencyKey.idempotency_key, no_notification: true, @@ -163,7 +164,7 @@ export default async (req, res) => { case "swap_created": { const { key, error } = await idempotencyKeyService.workStage( idempotencyKey.idempotency_key, - async (manager) => { + async manager => { const swaps = await swapService.list({ idempotency_key: idempotencyKey.idempotency_key, }) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index 7b6e0fd094..e17c626b6b 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -1327,7 +1327,7 @@ class CartService extends BaseService { }) const { shipping_methods } = cart - const customPrice = data.price ? { price: data.price } : {} + const customPrice = data && data.price ? { price: data.price } : {} const newMethod = await this.shippingOptionService_ .withTransaction(manager) .createShippingMethod(optionId, data, { diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index ca12c22833..419b8cef62 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -2,7 +2,6 @@ import _ from "lodash" import { MedusaError } from "medusa-core-utils" import { BaseService } from "medusa-interfaces" import { Any, In } from "typeorm" -import { CartType } from "../models/cart" /** * Provides layer to manipulate profiles. @@ -449,7 +448,7 @@ class ShippingProfileService extends BaseService { * @return {[RMAShippingOptions | ShippingOptions]} a list of the available rma or normal shipping options */ async fetchRMAOptions(cart) { - if (cart.type === CartType.DEFAULT) { + if (cart.type === "default") { throw new MedusaError(MedusaError.Types.INVALID_DATA, "error") } @@ -457,7 +456,7 @@ class ShippingProfileService extends BaseService { this.swapRepository_ ) - if (cart.type === CartType.SWAP) { + if (cart.type === "swap") { const swap = await swapRepo.findOne({ where: { cart_id: cart.id }, relations: ["rma_shipping_options"], diff --git a/packages/medusa/yarn.lock b/packages/medusa/yarn.lock index 82e2b85eb7..a9ddf270d1 100644 --- a/packages/medusa/yarn.lock +++ b/packages/medusa/yarn.lock @@ -3,9 +3,9 @@ "@babel/cli@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.3.tgz#9f6c8aee12e8660df879610f19a8010958b26a6f" - integrity sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A== + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.15.7.tgz#62658abedb786d09c1f70229224b11a65440d7a1" + integrity sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -15,47 +15,35 @@ slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents" + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== - dependencies: - "@babel/highlight" "^7.12.13" - -"@babel/code-frame@^7.14.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== -"@babel/compat-data@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" - integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== - "@babel/core@^7.1.0", "@babel/core@^7.14.3", "@babel/core@^7.7.5": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" - integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.3" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.3" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -63,89 +51,51 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" - integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== +"@babel/generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== dependencies: - "@babel/types" "^7.14.2" + "@babel/types" "^7.15.4" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" - integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== dependencies: - "@babel/types" "^7.15.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-annotate-as-pure@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" - integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== - dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" - integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== dependencies: - "@babel/helper-explode-assignable-expression" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" - integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: "@babel/compat-data" "^7.15.0" "@babel/helper-validator-option" "^7.14.5" browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.13.16": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" - integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== dependencies: - "@babel/compat-data" "^7.14.4" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" - integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.14.4" - "@babel/helper-split-export-declaration" "^7.12.13" - -"@babel/helper-create-class-features-plugin@^7.14.5": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7" - integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" @@ -169,243 +119,144 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" - integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" - integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.14.2" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226" + integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw== dependencies: - "@babel/types" "^7.13.12" + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" -"@babel/helper-member-expression-to-functions@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" - integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== dependencies: - "@babel/types" "^7.15.0" + "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" - integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" - integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-simple-access" "^7.14.8" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-remap-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" - integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-wrap-function" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" - integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" - integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" + "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" - integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: - "@babel/types" "^7.14.8" + "@babel/types" "^7.15.4" -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" - integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helper-wrap-function@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" - integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" - -"@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" "@babel/highlight@^7.14.5": version "7.14.5" @@ -416,32 +267,27 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" - integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== +"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" + integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== -"@babel/parser@^7.14.5", "@babel/parser@^7.15.0": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" - integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" - integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz#7028dc4fa21dc199bbacf98b39bab1267d0eaf9a" - integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw== +"@babel/plugin-proposal-async-generator-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" + integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.14.5": @@ -452,21 +298,21 @@ "@babel/helper-create-class-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" - integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== +"@babel/plugin-proposal-class-static-block@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.12.1": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz#59bc4dfc1d665b5a6749cf798ff42297ed1b2c1d" - integrity sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg== + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.15.4.tgz#fb55442bc83ab4d45dda76b91949706bf22881d2" + integrity sha512-WNER+YLs7avvRukEddhu5PSfSaMMimX2xBFgLQS7Bw16yrUxJGWidO9nQp+yLy9MVybg5Ba3BlhAw+BkdhpDmg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-decorators" "^7.14.5" @@ -518,16 +364,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" - integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== +"@babel/plugin-proposal-object-rest-spread@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" "@babel/plugin-proposal-optional-catch-binding@^7.14.5": version "7.14.5" @@ -554,13 +400,13 @@ "@babel/helper-create-class-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" - integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -691,12 +537,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" - integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.14.5": version "7.14.5" @@ -721,24 +567,24 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.14.5": +"@babel/plugin-transform-block-scoping@^7.15.3": version "7.15.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.14.9", "@babel/plugin-transform-classes@^7.9.5": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz#2a391ffb1e5292710b00f2e2c210e1435e7d449f" - integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A== +"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.15.4", "@babel/plugin-transform-classes@^7.9.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.14.5": @@ -778,10 +624,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" - integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== +"@babel/plugin-transform-for-of@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -823,25 +669,25 @@ "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz#3305896e5835f953b5cdb363acd9e8c2219a5281" - integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig== +"@babel/plugin-transform-modules-commonjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== dependencies: - "@babel/helper-module-transforms" "^7.15.0" + "@babel/helper-module-transforms" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.8" + "@babel/helper-simple-access" "^7.15.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" - integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== +"@babel/plugin-transform-modules-systemjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== dependencies: - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.14.5": @@ -874,10 +720,10 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" - integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== +"@babel/plugin-transform-parameters@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -950,14 +796,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.13.0": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.4.tgz#1c48829fa6d5f2de646060cd08abb6cda4b521a7" - integrity sha512-WYdcGNEO7mCCZ2XzRlxwGj3PgeAr50ifkofOUC/+IN/GzKLB+biDPVBUAQN2C/dVZTvEXCp80kfQ1FFZPrwykQ== +"@babel/plugin-transform-typescript@^7.15.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz#db7a062dcf8be5fc096bc0eeb40a13fbfa1fa251" + integrity sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.4" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-typescript" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" "@babel/plugin-transform-unicode-escapes@^7.14.5": version "7.14.5" @@ -983,29 +829,29 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.12.7": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.0.tgz#e2165bf16594c9c05e52517a194bf6187d6fe464" - integrity sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q== + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" + integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== dependencies: "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" + "@babel/plugin-proposal-async-generator-functions" "^7.15.4" "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.15.4" "@babel/plugin-proposal-dynamic-import" "^7.14.5" "@babel/plugin-proposal-export-namespace-from" "^7.14.5" "@babel/plugin-proposal-json-strings" "^7.14.5" "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.7" + "@babel/plugin-proposal-object-rest-spread" "^7.15.6" "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.15.4" "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -1024,25 +870,25 @@ "@babel/plugin-transform-arrow-functions" "^7.14.5" "@babel/plugin-transform-async-to-generator" "^7.14.5" "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.9" + "@babel/plugin-transform-block-scoping" "^7.15.3" + "@babel/plugin-transform-classes" "^7.15.4" "@babel/plugin-transform-computed-properties" "^7.14.5" "@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-dotall-regex" "^7.14.5" "@babel/plugin-transform-duplicate-keys" "^7.14.5" "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.15.4" "@babel/plugin-transform-function-name" "^7.14.5" "@babel/plugin-transform-literals" "^7.14.5" "@babel/plugin-transform-member-expression-literals" "^7.14.5" "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.0" - "@babel/plugin-transform-modules-systemjs" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/plugin-transform-modules-systemjs" "^7.15.4" "@babel/plugin-transform-modules-umd" "^7.14.5" "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" "@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" "@babel/plugin-transform-property-literals" "^7.14.5" "@babel/plugin-transform-regenerator" "^7.14.5" "@babel/plugin-transform-reserved-words" "^7.14.5" @@ -1054,7 +900,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.14.5" "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.0" + "@babel/types" "^7.15.6" babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2" @@ -1073,80 +919,49 @@ esutils "^2.0.2" "@babel/preset-typescript@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a" - integrity sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw== + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.6": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" - integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.12.13", "@babel/template@^7.3.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/template@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== +"@babel/template@^7.15.4", "@babel/template@^7.3.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" - integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.2" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" - integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" - integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.4.4": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== +"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" @@ -1189,9 +1004,9 @@ integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== "@hapi/hoek@^9.0.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" - integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== "@hapi/joi@^16.1.8": version "16.1.8" @@ -1217,9 +1032,9 @@ "@hapi/hoek" "^8.3.0" "@hapi/topo@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" - integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" @@ -1408,9 +1223,9 @@ chalk "^3.0.0" "@medusajs/medusa-cli@^1.1.18": - version "1.1.18" - resolved "https://registry.yarnpkg.com/@medusajs/medusa-cli/-/medusa-cli-1.1.18.tgz#a2b34575a81a7df239d6d06cf0d0b192e2b8c8db" - integrity sha512-JEvQVjebaGuOF5BsqjZYnewmU4TPbrnhODKVyadPKPb/cxPcCMODg21d5QyoaVlcXood08LgTFe8CfdWoyubVw== + version "1.1.19" + resolved "https://registry.yarnpkg.com/@medusajs/medusa-cli/-/medusa-cli-1.1.19.tgz#65507b9694f9b51b1fce3f2f4bd601075b53ce94" + integrity sha512-DuHJBPEhAGV5Mx0P5WTaVrbkLE7CeGdA+s2u6Wnp0cMPS3N6XDv3dBUHjHXiIEUoKHWZfDLyBKV3UUA3r+M6TQ== dependencies: "@babel/polyfill" "^7.8.7" "@babel/runtime" "^7.9.6" @@ -1443,22 +1258,10 @@ winston "^3.3.3" yargs "^15.3.1" -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": - version "2.1.8-no-fsevents" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" - integrity sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1589,9 +1392,9 @@ defer-to-connect "^1.0.1" "@types/babel__core@^7.1.7": - version "7.1.14" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1600,24 +1403,24 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" - integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" @@ -1649,19 +1452,19 @@ "@types/istanbul-lib-report" "*" "@types/lodash@^4.14.168": - version "4.14.170" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" - integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== + version "4.14.175" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.175.tgz#b78dfa959192b01fae0ad90e166478769b215f45" + integrity sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw== "@types/node@*": - version "15.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" - integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== + version "16.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.2.tgz#5764ca9aa94470adb4e1185fe2e9f19458992b2e" + integrity sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ== "@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/prettier@^1.19.0": version "1.19.1" @@ -1674,14 +1477,14 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" @@ -1712,9 +1515,9 @@ acorn-globals@^4.3.2: acorn-walk "^6.0.1" acorn-jsx@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^6.0.1: version "6.2.0" @@ -1742,11 +1545,11 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: uri-js "^4.2.2" ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: - string-width "^3.0.0" + string-width "^4.1.0" ansi-escapes@^3.1.0: version "3.2.0" @@ -1775,10 +1578,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -1807,7 +1610,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.1: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1826,9 +1629,9 @@ aproba@^1.0.3: integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -1897,15 +1700,10 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - async@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + version "3.2.1" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" + integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg== asynckit@^0.4.0: version "0.4.0" @@ -1936,9 +1734,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios-retry@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.1.9.tgz#6c30fc9aeb4519aebaec758b90ef56fa03fe72e8" - integrity sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.2.0.tgz#eb48e72f90b177fde62329b2896aa8476cfb90ba" + integrity sha512-RK2cLMgIsAQBDhlIsJR5dOhODPigvel18XUv1dDXW+4k1FzebyfRk+C+orot6WPZOYFKSfhLwHPwVmTVOODQ5w== dependencies: is-retry-allowed "^1.1.0" @@ -2000,12 +1798,12 @@ babel-plugin-polyfill-corejs2@^0.2.2: semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" - integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.14.0" + core-js-compat "^3.16.2" babel-plugin-polyfill-regenerator@^0.2.2: version "0.2.2" @@ -2098,11 +1896,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2140,30 +1933,16 @@ body-parser@1.19.0, body-parser@^1.19.0: raw-body "2.4.0" type-is "~1.6.17" -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" - -boxen@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.1.tgz#657528bdd3f59a772b8279b831f27ec2c744664b" - integrity sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA== +boxen@^5.0.0, boxen@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: ansi-align "^3.0.0" camelcase "^6.2.0" chalk "^4.1.0" cli-boxes "^2.2.1" - string-width "^4.2.0" + string-width "^4.2.2" type-fest "^0.20.2" widest-line "^3.1.0" wrap-ansi "^7.0.0" @@ -2176,7 +1955,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -2211,27 +1990,16 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== +browserslist@^4.16.6, browserslist@^4.17.1: + version "4.17.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.2.tgz#aa15dbd2fab399a399fe4df601bb09363c5458a6" + integrity sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ== dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" + caniuse-lite "^1.0.30001261" + electron-to-chromium "^1.3.854" escalade "^3.1.1" - node-releases "^1.1.71" - -browserslist@^4.16.7: - version "4.16.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.7.tgz#108b0d1ef33c4af1b587c54f390e7041178e4335" - integrity sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA== - dependencies: - caniuse-lite "^1.0.30001248" - colorette "^1.2.2" - electron-to-chromium "^1.3.793" - escalade "^3.1.1" - node-releases "^1.1.73" + nanocolors "^0.2.12" + node-releases "^1.1.76" bser@2.1.1: version "2.1.1" @@ -2246,9 +2014,9 @@ buffer-equal-constant-time@1.0.1: integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-writer@2.0.0: version "2.0.0" @@ -2264,9 +2032,9 @@ buffer@^5.5.0: ieee754 "^1.1.13" bull@^3.12.1: - version "3.22.8" - resolved "https://registry.yarnpkg.com/bull/-/bull-3.22.8.tgz#ca15630d5eab2d41cc6f98a786bafcab15d1575f" - integrity sha512-HqUKZqGqhIUY3JJSypUNICxa8q4Ka2812S3Alth6tSBsjYf7NBQQlMifCpX9ua4Y+JMQHoYIqz7b9midzpwxqg== + version "3.29.2" + resolved "https://registry.yarnpkg.com/bull/-/bull-3.29.2.tgz#30051fd14c7214b1e90c212585674f77fd982650" + integrity sha512-zWHyza/ElwVvJUqIEDJdUhGKd1V9EHjituUL7sJAmJoxS9Z7QMhYcMOWcgbUlWPgtiKN1g9ZlOtFAoq7C4/SQw== dependencies: cron-parser "^2.13.0" debuglog "^1.0.0" @@ -2351,15 +2119,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001219: - version "1.0.30001236" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" - integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== - -caniuse-lite@^1.0.30001248: - version "1.0.30001251" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85" - integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A== +caniuse-lite@^1.0.30001261: + version "1.0.30001263" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001263.tgz#7ce7a6fb482a137585cbc908aaf38e90c53a16a4" + integrity sha512-doiV5dft6yzWO1WwU19kt8Qz8R0/8DgEziz6/9n2FxUasteZNwNNYSmJO3GLBH8lCVE73AB1RPDPAeYbcO5Cvw== capture-exit@^2.0.0: version "2.0.0" @@ -2398,7 +2161,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2406,33 +2169,25 @@ chalk@^4.0.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.2: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" chownr@^1.1.4: version "1.1.4" @@ -2466,7 +2221,7 @@ clean-stack@^3.0.0: dependencies: escape-string-regexp "4.0.0" -cli-boxes@^2.2.0, cli-boxes@^2.2.1: +cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== @@ -2479,9 +2234,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-progress@^3.4.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.0.tgz#25db83447deb812e62d05bac1af9aec5387ef3d4" - integrity sha512-g7rLWfhAo/7pF+a/STFH/xPyosaL1zgADhI0OM83hl3c7S43iGvJWEAV2QuDOnQ8i6EMBj/u4+NTd0d5L+4JfA== + version "3.9.1" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.1.tgz#a22eba6a20f53289fdd05d5ee8cb2cc8c28f866e" + integrity sha512-AXxiCe2a0Lm0VN+9L0jzmfQSkcZm5EYspfqXKaSIQKqIk+0hnkZ3/v1E9B39mkD6vYhKih3c/RPsJBSwq9O99Q== dependencies: colors "^1.1.2" string-width "^4.2.0" @@ -2602,9 +2357,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.2: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -2617,11 +2372,6 @@ color@3.0.x: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - colors@^1.1.2, colors@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2702,9 +2452,9 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -2732,21 +2482,21 @@ cookie@0.4.1: integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookiejar@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.14.0, core-js-compat@^3.16.0: - version "3.16.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.1.tgz#c44b7caa2dcb94b673a98f27eee1c8312f55bc2d" - integrity sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ== +core-js-compat@^3.16.0, core-js-compat@^3.16.2: + version "3.18.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.1.tgz#01942a0877caf9c6e5007c027183cf0bdae6a191" + integrity sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg== dependencies: - browserslist "^4.16.7" + browserslist "^4.17.1" semver "7.0.0" core-js@^2.6.5: @@ -2754,21 +2504,21 @@ core-js@^2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.6.5: - version "3.14.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.14.0.tgz#62322b98c71cc2018b027971a69419e2425c2a6c" - integrity sha512-3s+ed8er9ahK+zJpp9ZtuVcDoFzHNiZsPbNAAE4KXgrRHbjSqqNN6xGSXq6bq7TZIbKj4NLrLb6bJ5i+vSVjHA== +core-js@^3.6.5, core-js@^3.7.0: + version "3.18.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.18.1.tgz#289d4be2ce0085d40fc1244c0b1a54c00454622f" + integrity sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA== -core-js@^3.7.0: - version "3.16.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.1.tgz#f4485ce5c9f3c6a7cb18fa80488e08d362097249" - integrity sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw== - -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -2865,9 +2615,9 @@ debug@^3.1.0, debug@^3.2.6: ms "^2.1.1" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" @@ -2899,9 +2649,9 @@ deep-extend@^0.6.0: integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" @@ -2965,9 +2715,9 @@ delegates@^1.0.0: integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= denque@^1.1.0, denque@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" - integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== depd@~1.1.2: version "1.1.2" @@ -3023,7 +2773,7 @@ doctrine@^3.0.0: dom-walk@^0.1.0: version "0.1.2" - resolved "http://localhost:4873/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== domexception@^1.0.1: @@ -3070,15 +2820,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.723: - version "1.3.750" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.750.tgz#7e5ef6f478316b0bd656af5942fe502610e97eaf" - integrity sha512-Eqy9eHNepZxJXT+Pc5++zvEi5nQ6AGikwFYDCYwXUFBr+ynJ6pDG7MzZmwGYCIuXShLJM0n4bq+aoKDmvSGJ8A== - -electron-to-chromium@^1.3.793: - version "1.3.806" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.806.tgz#21502100f11aead6c501d1cd7f2504f16c936642" - integrity sha512-AH/otJLAAecgyrYp0XK1DPiGVWcOgwPeJBOLeuFQ5l//vhQhwC9u6d+GijClqJAmsHG4XDue81ndSQPohUu0xA== +electron-to-chromium@^1.3.854: + version "1.3.856" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.856.tgz#75dee0eef9702bffabbf4c1293c989cd3cacb7ba" + integrity sha512-lSezYIe1/p5qkEswAfaQUseOBiwGwuCvRl/MKzOEVe++DcmQ92+43dznDl4rFJ4Zpu+kevhwyIf7KjJevyDA/A== emoji-regex@^7.0.1: version "7.0.3" @@ -3115,21 +2860,25 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.0-next.0, es-abstract@^1.18.0-next.2: - version "1.18.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" - integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + version "1.19.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.0.tgz#0a6e6682268e7f5bdc1c740b33ce2578d64538d3" + integrity sha512-oWPrF+7P1nGv/rw9oIInwdkmI1qediEJSvVfHFryBd8mWllCKB5tke3aKyf51J6chgyKmi6mODqdnin2yb88Nw== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" has-symbols "^1.0.2" - is-callable "^1.2.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" is-negative-zero "^2.0.1" - is-regex "^1.1.3" - is-string "^1.0.6" - object-inspect "^1.10.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" @@ -3524,15 +3273,10 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-safe-stringify@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - fastq@^1.6.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" - integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -3634,9 +3378,9 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.14.0: - version "1.14.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e" - integrity sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw== + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== for-each@^0.3.3: version "0.3.3" @@ -3735,7 +3479,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.1.2, fsevents@~2.3.1: +fsevents@^2.1.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3784,7 +3528,7 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -3827,6 +3571,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3839,15 +3591,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3855,9 +3599,9 @@ glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0: is-glob "^4.0.1" glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3866,16 +3610,16 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" - integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== dependencies: - ini "1.3.7" + ini "2.0.0" global@^4.4.0: version "4.4.0" - resolved "http://localhost:4873/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" @@ -3922,12 +3666,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -3970,6 +3709,13 @@ has-symbols@^1.0.1, has-symbols@^1.0.2: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -4176,10 +3922,10 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== ini@~1.3.0: version "1.3.8" @@ -4206,9 +3952,9 @@ inquirer@^7.0.0: through "^2.3.6" inquirer@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d" - integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q== + version "8.1.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.5.tgz#2dc5159203c826d654915b5fe6990fd17f54a150" + integrity sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -4218,13 +3964,22 @@ inquirer@^8.0.0: figures "^3.0.0" lodash "^4.17.21" mute-stream "0.0.8" - ora "^5.3.0" + ora "^5.4.1" run-async "^2.4.0" rxjs "^7.2.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + ioredis-mock@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/ioredis-mock/-/ioredis-mock-5.6.0.tgz#f60f9fbc3a53b50f567be9369e2b211ed52c0653" @@ -4236,15 +3991,16 @@ ioredis-mock@^5.6.0: standard-as-callback "^2.1.0" ioredis@^4.17.3, ioredis@^4.27.0: - version "4.27.5" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.27.5.tgz#b62192bb6198f8a5a02947902117150aef39b7f1" - integrity sha512-JJ3HzOzU6kgUk3gKhpx8kxEYn9ruI5TkpOtGvbw/hLyWxfC19T9uCZTgmw4Mci4al4aOCCMfAjYzJ7aqQkLbJg== + version "4.27.9" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.27.9.tgz#c27bbade9724f0b8f84c279fb1d567be785ba33d" + integrity sha512-hAwrx9F+OQ0uIvaJefuS3UTqW+ByOLyLIV+j0EH8ClNVxvFyH9Vmb08hCL4yje6mDYT5zMquShhypkd50RRzkg== dependencies: cluster-key-slot "^1.1.0" debug "^4.3.1" denque "^1.1.0" lodash.defaults "^4.2.0" lodash.flatten "^4.4.0" + lodash.isarguments "^3.1.0" p-map "^2.1.0" redis-commands "1.7.0" redis-errors "^1.2.0" @@ -4286,16 +4042,11 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: - binary-extensions "^1.0.0" + has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" @@ -4305,21 +4056,22 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" @@ -4329,9 +4081,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + version "2.7.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== dependencies: has "^1.0.3" @@ -4350,9 +4102,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-descriptor@^0.1.0: version "0.1.6" @@ -4394,7 +4148,7 @@ is-extglob@^1.0.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -4428,27 +4182,20 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" + global-dirs "^3.0.0" + is-path-inside "^3.0.2" is-interactive@^1.0.0: version "1.0.0" @@ -4475,15 +4222,17 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -4507,7 +4256,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-inside@^3.0.1: +is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -4519,33 +4268,40 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.2" + has-tostringtag "^1.0.0" is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" @@ -4571,6 +4327,13 @@ is-valid-path@^0.1.1: dependencies: is-invalid-path "^0.1.0" +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -4608,6 +4371,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +iso8601-duration@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iso8601-duration/-/iso8601-duration-1.3.0.tgz#29d7b69e0574e4acdee50c5e5e09adab4137ba5a" + integrity sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -4626,9 +4394,9 @@ isstream@~0.1.2: integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz#e8900b3ed6069759229cf30f7067388d148aeb5e" + integrity sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ== istanbul-lib-instrument@^4.0.0: version "4.0.3" @@ -5036,9 +4804,9 @@ joi-objectid@^3.0.1: integrity sha512-V/3hbTlGpvJ03Me6DJbdBI08hBTasFOmipsauOsxOSnsF1blxV537WTl1zPwbfcKle4AK0Ma4OPnzMH4LlvTpQ== joi@^17.3.0: - version "17.4.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" - integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== + version "17.4.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.2.tgz#02f4eb5cf88e515e614830239379dcbbe28ce7f7" + integrity sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -5243,7 +5011,7 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -latest-version@^5.0.0: +latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== @@ -5300,6 +5068,11 @@ lodash.includes@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" @@ -5364,14 +5137,14 @@ log-symbols@^4.1.0: is-unicode-supported "^0.1.0" logform@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" - integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.3.0.tgz#a3997a05985de2ebd325ae0d166dffc9c6fe6b57" + integrity sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ== dependencies: colors "^1.2.1" - fast-safe-stringify "^2.0.4" fecha "^4.2.0" ms "^2.1.1" + safe-stable-stringify "^1.1.0" triple-beam "^1.3.0" lolex@^5.0.0: @@ -5462,20 +5235,20 @@ medusa-core-utils@^0.1.27: "@hapi/joi" "^16.1.8" joi-objectid "^3.0.1" -medusa-core-utils@^1.1.22: - version "1.1.22" - resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-1.1.22.tgz#84ce0af0a7c672191d758ea462056e30a39d08b1" - integrity sha512-kMuRkWOuNG4Bw6epg/AYu95UJuE+rjHTeTWRLbEPrYGjWREV82tLWVDI21/QcccmaHmMU98Rkw2z9JwyFZIiyw== +medusa-core-utils@^1.1.22, medusa-core-utils@^1.1.23: + version "1.1.23" + resolved "https://registry.yarnpkg.com/medusa-core-utils/-/medusa-core-utils-1.1.23.tgz#1e9260d5066117350dbf56dc176dd25e488e90a1" + integrity sha512-3KnfbCGud09xYC7qrc+kw2XmBFa4UuGBOPT2IU3j70BjFhEU9ftD45oolKXNUziOZIIGRf/FIwGj+Lwgy6IAfA== dependencies: joi "^17.3.0" joi-objectid "^3.0.1" medusa-interfaces@^1.1.23: - version "1.1.23" - resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-1.1.23.tgz#b552a8c1d0eaddeff30472ab238652b9e1a56e73" - integrity sha512-dHCOnsyYQvjrtRd3p0ZqQZ4M/zmo4M/BAgVfRrYSyGrMdQ86TK9Z1DQDCHEzM1216AxEfXz2JYUD7ilTfG2iHQ== + version "1.1.24" + resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-1.1.24.tgz#13d0bc4afbd56c028c9e4bc562b0ce7a2023453c" + integrity sha512-jzdHRN6AmX2Tuh3nbZd9PQJ0z1b6TzAAfyjak2rmakfoXzv19cAcXq5iUV04kQk+659Q+A14ei1LD/IemMYDmA== dependencies: - medusa-core-utils "^1.1.22" + medusa-core-utils "^1.1.23" medusa-telemetry@^0.0.5: version "0.0.5" @@ -5493,12 +5266,12 @@ medusa-telemetry@^0.0.5: uuid "^8.3.2" medusa-test-utils@^1.1.25: - version "1.1.25" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-1.1.25.tgz#7c4aa8a70ec8a95875304258ffbe7493a1e5a7fc" - integrity sha512-4xy20KsZBR1XcuzckGRq9A+GJwh+CFHzVw3dajaO4iiNpL/a9K3Yj2N4f/8BgRcQyw5PnkKGJ0pzv+OR8+5GVw== + version "1.1.26" + resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-1.1.26.tgz#badc7213e9acd332c2b4353602c5fc9d16f3c4e6" + integrity sha512-CtDD+5cLMqxuiJNtLljZF1btain7i64K6P3rbdef/kndPwjofBVUb3awoz4bieoZzJZF0GOn+p1kCZNsj2ggew== dependencies: "@babel/plugin-transform-classes" "^7.9.5" - medusa-core-utils "^1.1.22" + medusa-core-utils "^1.1.23" randomatic "^3.1.1" merge-descriptors@1.0.1: @@ -5521,7 +5294,7 @@ methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5548,17 +5321,17 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: - mime-db "1.48.0" + mime-db "1.49.0" mime@1.6.0, mime@^1.4.1: version "1.6.0" @@ -5577,7 +5350,7 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: min-document@^2.19.0: version "2.19.0" - resolved "http://localhost:4873/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" @@ -5617,7 +5390,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -5668,14 +5441,14 @@ ms@^2.1.1: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multer@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.2.tgz#2f1f4d12dbaeeba74cb37e623f234bf4d3d2057a" - integrity sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg== + version "1.4.3" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.3.tgz#4db352d6992e028ac0eacf7be45c6efd0264297b" + integrity sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg== dependencies: append-field "^1.0.0" busboy "^0.2.11" concat-stream "^1.5.2" - mkdirp "^0.5.1" + mkdirp "^0.5.4" object-assign "^4.1.1" on-finished "^2.3.0" type-is "^1.6.4" @@ -5686,6 +5459,11 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nanocolors@^0.2.12: + version "0.2.12" + resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.2.12.tgz#4d05932e70116078673ea4cc6699a1c56cc77777" + integrity sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -5714,9 +5492,9 @@ natural-orderby@^2.0.1: integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== needle@^2.2.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.8.0.tgz#1c8ef9c1a2c29dcc1e83d73809d7bc681c80a048" - integrity sha512-ZTq6WYkN/3782H1393me3utVYdq2XyqNUFBsprEE3VMAT0+hP/cItpnITpqsY6ep2yeFE4Tqtqwc74VqUlUYtw== + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -5808,20 +5586,15 @@ node-pre-gyp@^0.11.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== - -node-releases@^1.1.73: - version "1.1.74" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.74.tgz#e5866488080ebaa70a93b91144ccde06f3c3463e" - integrity sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw== +node-releases@^1.1.76: + version "1.1.76" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e" + integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA== nodemon@^2.0.1: - version "2.0.7" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32" - integrity sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== + version "2.0.13" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.13.tgz#67d40d3a4d5bd840aa785c56587269cfcf5d24aa" + integrity sha512-UMXMpsZsv1UXUttCn6gv8eQPhn6DR4BW+txnL3IN5IHqrCwcrT/yWHfL35UsClGXknTH79r5xbu+6J1zNHuSyA== dependencies: chokidar "^3.2.2" debug "^3.2.6" @@ -5832,7 +5605,7 @@ nodemon@^2.0.1: supports-color "^5.5.0" touch "^3.1.0" undefsafe "^2.0.3" - update-notifier "^4.1.0" + update-notifier "^5.1.0" "nopt@2 || 3": version "3.0.6" @@ -5957,10 +5730,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.10.3, object-inspect@^1.9.0: - version "1.10.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" - integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -6059,7 +5832,7 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -ora@^5.3.0, ora@^5.4.1: +ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -6241,11 +6014,6 @@ password-prompt@^1.1.2: ansi-escapes "^3.1.0" cross-spawn "^6.0.5" -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -6313,11 +6081,6 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.3.0.tgz#12d5c7f65ea18a6e99ca9811bd18129071e562fc" - integrity sha512-0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg== - pg-pool@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c" @@ -6339,7 +6102,7 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.3.0: +pg@^8.3.0, pg@^8.5.1: version "8.7.1" resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471" integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== @@ -6352,19 +6115,6 @@ pg@^8.3.0: pg-types "^2.1.0" pgpass "1.x" -pg@^8.5.1: - version "8.6.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.6.0.tgz#e222296b0b079b280cce106ea991703335487db2" - integrity sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ== - dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "^2.5.0" - pg-pool "^3.3.0" - pg-protocol "^1.5.0" - pg-types "^2.1.0" - pgpass "1.x" - pgpass@1.x: version "1.0.4" resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" @@ -6460,7 +6210,7 @@ process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" - resolved "http://localhost:4873/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: @@ -6521,7 +6271,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: +pupa@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== @@ -6628,7 +6378,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@^2.3.7: +readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@^2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -6650,19 +6400,10 @@ readable-stream@^3.0.0, readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -6715,14 +6456,14 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: - regenerate "^1.4.0" + regenerate "^1.4.2" -regenerate@^1.4.0: +regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== @@ -6753,16 +6494,16 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" registry-auth-token@^4.0.0: version "4.2.1" @@ -6778,15 +6519,15 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.5.1: +regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" - integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" @@ -6998,6 +6739,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-stable-stringify@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -7057,7 +6803,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: +semver@^7.3.2, semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -7157,9 +6903,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== simple-swizzle@^0.2.2: version "0.2.2" @@ -7234,9 +6980,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -7283,9 +7029,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" - integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -7410,14 +7156,14 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string.prototype.trimend@^1.0.4: version "1.0.4" @@ -7475,12 +7221,12 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" @@ -7585,9 +7331,9 @@ tar@^2.0.0: inherits "2" tar@^4: - version "4.4.16" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.16.tgz#4a48b3c025e77d9d0c788f038a09b91c594d326d" - integrity sha512-gOVUT/KWPkGFZQmCRDVFNUWBl7niIo/PRR7lzrIqtZpit+st54lGROuVjc6zEQM9FhH+dJfQIl+9F0k8GNXg5g== + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: chownr "^1.1.4" fs-minipass "^1.2.7" @@ -7597,11 +7343,6 @@ tar@^4: safe-buffer "^5.2.1" yallist "^3.1.1" -term-size@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -7739,16 +7480,11 @@ tslib@^1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0: +tslib@^2.0.0, tslib@^2.0.3: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== - tslib@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" @@ -7847,28 +7583,28 @@ undefsafe@^2.0.3: dependencies: debug "^2.2.0" -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== union-value@^1.0.0: version "1.0.1" @@ -7910,27 +7646,23 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-notifier@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" - integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== dependencies: - boxen "^4.2.0" - chalk "^3.0.0" + boxen "^5.0.0" + chalk "^4.1.0" configstore "^5.0.1" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" semver-diff "^3.1.1" xdg-basedir "^4.0.0" @@ -8211,9 +7943,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.0.0: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== xdg-basedir@^4.0.0: version "4.0.0" From 52be911e506dfb80c2f39aac31d33a8805e4b6d2 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Wed, 6 Oct 2021 14:17:36 +0100 Subject: [PATCH 06/15] fix: adjustments based on feedback rename RMAShippingOption to CustomShippingOption update models and relations update unit and integration tests update services --- .../api/__tests__/admin/order.js | 22 +-- integration-tests/api/__tests__/store/cart.js | 88 +++++++--- .../api/__tests__/store/shipping-options.js | 2 +- integration-tests/api/helpers/swap-seeder.js | 18 +- integration-tests/api/package.json | 6 +- integration-tests/api/yarn.lock | 70 ++++---- .../api/routes/admin/orders/create-swap.js | 30 ++-- .../carts/__tests__/add-shipping-method.js | 20 +-- .../routes/store/carts/add-shipping-method.js | 2 +- .../__tests__/list-shipping-options.js | 53 +----- .../shipping-options/list-shipping-options.js | 15 +- .../src/api/routes/store/swaps/create-swap.js | 1 - packages/medusa/src/index.js | 2 +- .../1632851018347-add_rma_shipping_options.ts | 38 ----- ...33522106578-add_custom_shipping_options.ts | 34 ++++ packages/medusa/src/models/cart.ts | 10 ++ packages/medusa/src/models/claim-order.ts | 8 - .../src/models/custom-shipping-option.ts | 97 +++++++++++ .../medusa/src/models/rma-shipping-option.ts | 133 --------------- packages/medusa/src/models/swap.ts | 8 - .../src/repositories/RMA-shipping-option.ts | 5 - .../medusa/src/services/__mocks__/cart.js | 3 - .../services/__mocks__/shipping-profile.js | 3 - .../medusa/src/services/__tests__/cart.js | 161 +++++++++++------- .../services/__tests__/shipping-profile.js | 116 ++----------- .../medusa/src/services/__tests__/swap.js | 14 +- packages/medusa/src/services/cart.js | 60 +++---- .../medusa/src/services/shipping-profile.js | 38 +---- packages/medusa/src/services/swap.js | 14 +- 29 files changed, 467 insertions(+), 604 deletions(-) delete mode 100644 packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts create mode 100644 packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts create mode 100644 packages/medusa/src/models/custom-shipping-option.ts delete mode 100644 packages/medusa/src/models/rma-shipping-option.ts delete mode 100644 packages/medusa/src/repositories/RMA-shipping-option.ts diff --git a/integration-tests/api/__tests__/admin/order.js b/integration-tests/api/__tests__/admin/order.js index b4d5082ccb..eecfeee6dd 100644 --- a/integration-tests/api/__tests__/admin/order.js +++ b/integration-tests/api/__tests__/admin/order.js @@ -4,7 +4,7 @@ const { Order, LineItem, ProductVariant, - RMAShippingOption, + CustomShippingOption, } = require("@medusajs/medusa") const setupServer = require("../../../helpers/setup-server") @@ -1277,7 +1277,7 @@ describe("/admin/orders", () => { expect(response.status).toEqual(200) }) - it("creates a swap with rma shipping options", async () => { + it("creates a swap with custom shipping options", async () => { const api = useApi() const response = await api.post( @@ -1290,7 +1290,7 @@ describe("/admin/orders", () => { }, ], additional_items: [{ variant_id: "test-variant-2", quantity: 1 }], - rma_shipping_options: [{ option_id: "test-option", price: 0 }], + custom_shipping_options: [{ option_id: "test-option", price: 0 }], }, { headers: { @@ -1302,17 +1302,19 @@ describe("/admin/orders", () => { const swap = response.data.order.swaps[0] const manager = dbConnection.manager - const rma = await manager.findOne(RMAShippingOption, { + const customOptions = await manager.find(CustomShippingOption, { shipping_option_id: "test-option", - swap_id: swap.id, }) expect(response.status).toEqual(200) - expect(rma).toEqual( - expect.objectContaining({ - shipping_option_id: "test-option", - price: 0, - }) + expect(customOptions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + shipping_option_id: "test-option", + price: 0, + cart_id: swap.cart_id, + }), + ]) ) }) diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index 7e59faae39..f857875b2b 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -3,8 +3,8 @@ const { Region, LineItem, GiftCard, - RMAShippingOption, Cart, + CustomShippingOption, } = require("@medusajs/medusa") const setupServer = require("../../../helpers/setup-server") @@ -145,7 +145,6 @@ describe("/store/carts", () => { discounts: [{ code: "CREATED" }], }) } catch (error) { - console.log(error.response) expect(error.response.status).toEqual(400) expect(error.response.data.message).toEqual( "Discount has been used maximum allowed times" @@ -440,29 +439,41 @@ describe("/store/carts", () => { }) describe("POST /store/carts/:id/shipping-methods", () => { + let cartWithCustomSo beforeEach(async () => { - await cartSeeder(dbConnection) - const manager = dbConnection.manager + try { + await cartSeeder(dbConnection) + const manager = dbConnection.manager - await manager.insert(Cart, { - id: "test-cart-rma", - customer_id: "some-customer", - email: "some-customer@email.com", - shipping_address: { - id: "test-shipping-address", - first_name: "lebron", - country_code: "us", - }, - region_id: "test-region", - currency_code: "usd", - type: "swap", - }) + const _cart = await manager.create(Cart, { + id: "test-cart-with-cso", + customer_id: "some-customer", + email: "some-customer@email.com", + shipping_address: { + id: "test-shipping-address", + first_name: "lebron", + country_code: "us", + }, + custom_shipping_options: [ + { + shipping_option_id: "test-option", + price: 5, + }, + ], + region_id: "test-region", + currency_code: "usd", + type: "swap", + }) - await manager.insert(RMAShippingOption, { - id: "test-rmaso", - shipping_option_id: "test-option", - price: 5, - }) + cartWithCustomSo = await manager.save(_cart) + + await manager.insert(CustomShippingOption, { + id: "orphan-cso", + price: 0, + }) + } catch (err) { + console.log(err) + } }) afterEach(async () => { @@ -486,25 +497,46 @@ describe("/store/carts", () => { expect(cartWithShippingMethod.status).toEqual(200) }) - it("adds a rma shipping method to cart", async () => { + it("given a cart with custom options and a custom option id already belonging to said cart, then it should add a shipping method based on the given custom shipping option", async () => { + const customOptionId = cartWithCustomSo.custom_shipping_options[0].id + const api = useApi() - const cartWithRMAShippingMethod = await api + const cartWithCustomShippingMethod = await api .post( - "/store/carts/test-cart-rma/shipping-methods", + "/store/carts/test-cart-with-cso/shipping-methods", { - option_id: "test-rmaso", + option_id: customOptionId, }, { withCredentials: true } ) .catch((err) => err.response) expect( - cartWithRMAShippingMethod.data.cart.shipping_methods + cartWithCustomShippingMethod.data.cart.shipping_methods ).toContainEqual( expect.objectContaining({ shipping_option_id: "test-option", price: 5 }) ) - expect(cartWithRMAShippingMethod.status).toEqual(200) + expect(cartWithCustomShippingMethod.status).toEqual(200) + }) + + it("given a cart with custom options and a custom option id not belonging to said cart, then it should throw a shipping option not found error", async () => { + const api = useApi() + + try { + await api.post( + "/store/carts/test-cart-with-cso/shipping-methods", + { + option_id: "orphan-cso", + }, + { withCredentials: true } + ) + } catch (err) { + expect(err.response.status).toEqual(404) + expect(err.response.data.message).toEqual( + "Shipping Option with orphan-cso was not found" + ) + } }) it("adds a giftcard to cart, but ensures discount only applied to discountable items", async () => { diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index 2c5f54050d..f7d1e12de3 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -160,7 +160,7 @@ describe("/store/shipping-options", () => { ) }) - it("given a swap cart, when user retrieves its shipping options, then should return a list of RMA shipping options", async () => { + it("given a swap cart, when user retrieves its shipping options, then should return a list of custom shipping options", async () => { const api = useApi() const response = await api diff --git a/integration-tests/api/helpers/swap-seeder.js b/integration-tests/api/helpers/swap-seeder.js index 1965e67805..70ab54e11f 100644 --- a/integration-tests/api/helpers/swap-seeder.js +++ b/integration-tests/api/helpers/swap-seeder.js @@ -101,7 +101,7 @@ module.exports = async (connection, data = {}) => { await manager.save(swap) - const rmaCart = manager.create(Cart, { + const cartWithCustomSo = manager.create(Cart, { id: "test-cart-rma", customer_id: "test-customer", email: "test-customer@email.com", @@ -109,20 +109,26 @@ module.exports = async (connection, data = {}) => { billing_address_id: "test-billing-address", region_id: "test-region", type: "swap", + custom_shipping_options: [ + { + shipping_option_id: "test-option", + price: 0, + }, + ], metadata: { swap_id: "test-swap", parent_order_id: orderWithSwap.id, }, }) - await manager.save(rmaCart) + await manager.save(cartWithCustomSo) const swapWithRMAMethod = manager.create(Swap, { id: "test-swap-rma", order_id: "order-with-swap", payment_status: "captured", fulfillment_status: "fulfilled", - cart_id: "test-cart-rma", + cart_id: cartWithCustomSo.id, payment: { id: "test-payment-swap", amount: 10000, @@ -144,12 +150,6 @@ module.exports = async (connection, data = {}) => { cart_id: "test-cart", }, ], - rma_shipping_options: [ - { - shipping_option_id: "test-option", - price: 0, - }, - ], }) await manager.save(swapWithRMAMethod) diff --git a/integration-tests/api/package.json b/integration-tests/api/package.json index 1dbc61e055..a71da1bac7 100644 --- a/integration-tests/api/package.json +++ b/integration-tests/api/package.json @@ -8,15 +8,15 @@ "build": "babel src -d dist --extensions \".ts,.js\"" }, "dependencies": { - "@medusajs/medusa": "1.1.41-dev-1633030366783", - "medusa-interfaces": "1.1.23-dev-1633030366783", + "@medusajs/medusa": "1.1.41-dev-1633520747607", + "medusa-interfaces": "1.1.23-dev-1633520747607", "typeorm": "^0.2.31" }, "devDependencies": { "@babel/cli": "^7.12.10", "@babel/core": "^7.12.10", "@babel/node": "^7.12.10", - "babel-preset-medusa-package": "1.1.15-dev-1633030366783", + "babel-preset-medusa-package": "1.1.15-dev-1633520747607", "jest": "^26.6.3" } } diff --git a/integration-tests/api/yarn.lock b/integration-tests/api/yarn.lock index 85f1c0ab05..4497855c7e 100644 --- a/integration-tests/api/yarn.lock +++ b/integration-tests/api/yarn.lock @@ -1223,10 +1223,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@medusajs/medusa-cli@1.1.18-dev-1633030366783": - version "1.1.18-dev-1633030366783" - resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.18-dev-1633030366783.tgz#1112165ea9c03c797cd8d01f1149da989b9bea55" - integrity sha512-EIDxOs9STvFWwXv+8VWetrzABkijGOzcbKJzJ1jeDYjl61uRnELoWg57aeWj6wzKcTjhYRRKDrivMRUiexkHsA== +"@medusajs/medusa-cli@1.1.18-dev-1633520747607": + version "1.1.18-dev-1633520747607" + resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.18-dev-1633520747607.tgz#46a3f73f6aff016f50a8123f47d69c64b7a52037" + integrity sha512-4KLnR6gq8R3sCAhOcYCI5SE+G9vyt2l6RyImvvPw7I03iDiNMc3URwoq2cFwV+V4dSrW59WFIlMJR7ALCTygdA== dependencies: "@babel/polyfill" "^7.8.7" "@babel/runtime" "^7.9.6" @@ -1244,8 +1244,8 @@ is-valid-path "^0.1.1" joi-objectid "^3.0.1" meant "^1.0.1" - medusa-core-utils "1.1.22-dev-1633030366783" - medusa-telemetry "0.0.5-dev-1633030366783" + medusa-core-utils "1.1.22-dev-1633520747607" + medusa-telemetry "0.0.5-dev-1633520747607" netrc-parser "^3.1.6" open "^8.0.6" ora "^5.4.1" @@ -1259,13 +1259,13 @@ winston "^3.3.3" yargs "^15.3.1" -"@medusajs/medusa@1.1.41-dev-1633030366783": - version "1.1.41-dev-1633030366783" - resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.41-dev-1633030366783.tgz#0beb57e9844c3b85c59bfcde86183a2a625e3a91" - integrity sha512-b1QGscpszVYhDLOea7WhbW0DCgEKBKchHP1nNLj07mWTxE5vOBuAZeUSh1FHNw0jbPhtn9mOaFz2wwIgxPcfqw== +"@medusajs/medusa@1.1.41-dev-1633520747607": + version "1.1.41-dev-1633520747607" + resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.41-dev-1633520747607.tgz#82efd5b0bbaaaac76ce740dc9b35fe47c780592f" + integrity sha512-D+1WVpMWDaVki+Ti3rXYAl+3rb3eaX16BZ1RU/bG7FbhFJt8P1a1LXwMMQLV2rG/mUDgs6kDyl2qhYTzZ7X7aA== dependencies: "@hapi/joi" "^16.1.8" - "@medusajs/medusa-cli" "1.1.18-dev-1633030366783" + "@medusajs/medusa-cli" "1.1.18-dev-1633520747607" "@types/lodash" "^4.14.168" awilix "^4.2.3" body-parser "^1.19.0" @@ -1287,8 +1287,8 @@ joi "^17.3.0" joi-objectid "^3.0.1" jsonwebtoken "^8.5.1" - medusa-core-utils "1.1.22-dev-1633030366783" - medusa-test-utils "1.1.25-dev-1633030366783" + medusa-core-utils "1.1.22-dev-1633520747607" + medusa-test-utils "1.1.25-dev-1633520747607" morgan "^1.9.1" multer "^1.4.2" passport "^0.4.0" @@ -1933,10 +1933,10 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" -babel-preset-medusa-package@1.1.15-dev-1633030366783: - version "1.1.15-dev-1633030366783" - resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.15-dev-1633030366783.tgz#00f8aa5ebcb98c9a161a2c12dad55ffac53df88c" - integrity sha512-A/qfZNpIcYFMjAHYqVvavP9uY7ODtKGaQwZyx9quFydxebLSUstHTJ5s9ES1XjqhRYpEy//ixwNBkzggig0F9w== +babel-preset-medusa-package@1.1.15-dev-1633520747607: + version "1.1.15-dev-1633520747607" + resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.15-dev-1633520747607.tgz#ac970d565ac9803333bb5fecc7d16c162302c97b" + integrity sha512-XpU4J3xmdk8y2QRrxXFbkCq+9OzqUNeZlPAffiGlFTWYx0VRD4tZS4DWazrA5ub3RfqMFl/cxZA6NBcbJhZ/iQ== dependencies: "@babel/plugin-proposal-class-properties" "^7.12.1" "@babel/plugin-proposal-decorators" "^7.12.1" @@ -5110,25 +5110,25 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -medusa-core-utils@1.1.22-dev-1633030366783: - version "1.1.22-dev-1633030366783" - resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.22-dev-1633030366783.tgz#988358df8d8c7350d4fea3c3c00ae9f2e4aaa434" - integrity sha512-WYJ141mu6aYFGO9Vs9lXx+mJWXogrASxWJOIT29bZIFuaqI/LuiZysFn+Y6tzGBHLRdMKwHE+u/Zg1vh1NGfrw== +medusa-core-utils@1.1.22-dev-1633520747607: + version "1.1.22-dev-1633520747607" + resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.22-dev-1633520747607.tgz#d18c79e4ba9ee8b373bfc02024e23763f079ab87" + integrity sha512-pP1FdbrXbHqRxzMh2nKX6ByxtCrNSjJzOIJ45k1/Kl41VortD9EYiOpuLGOdodkD1jbuf6aV4x0zNIoWpGyHew== dependencies: joi "^17.3.0" joi-objectid "^3.0.1" -medusa-interfaces@1.1.23-dev-1633030366783: - version "1.1.23-dev-1633030366783" - resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.23-dev-1633030366783.tgz#d3cb82493e2bb53ff728e369d38183d964ac2cc9" - integrity sha512-7X3KnKUJHBye7ikmLouvYQCCINHb2DpBy9cOQKpUSwsaKlUMIvxJq2T+AieuwWhiTACwAwTLiWshSILUdbvKcQ== +medusa-interfaces@1.1.23-dev-1633520747607: + version "1.1.23-dev-1633520747607" + resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.23-dev-1633520747607.tgz#9487b2979cee9784b219a2117cf7199fbfadceb7" + integrity sha512-jyoc0wemXrZBtJMA6e7FcdnB/7do7j6oyLevCon7A6HibqQkuxLZ7TfWLHGROj4qy8aP8sAvtuXq9gpwkIm3CQ== dependencies: - medusa-core-utils "1.1.22-dev-1633030366783" + medusa-core-utils "1.1.22-dev-1633520747607" -medusa-telemetry@0.0.5-dev-1633030366783: - version "0.0.5-dev-1633030366783" - resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.5-dev-1633030366783.tgz#ee9368da672a5f46d323a98b521d49983f6f1e9d" - integrity sha512-BU1XyCWS2iX5lqfxcCRAxOCrtY55eLyH1XoLLPoO8dWKIDn3G0uh4N/WKBPn40cVLbeTRqOoVRYQP6jnuEjn6w== +medusa-telemetry@0.0.5-dev-1633520747607: + version "0.0.5-dev-1633520747607" + resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.5-dev-1633520747607.tgz#c8d23d5acf744eea8c88102a792b481051f84fb9" + integrity sha512-YX2hKGIANC0Ha9QKkMz5se9wDLJ940VEXwlMMGZzIRHoCoNpmxnsgXQXgeCtC1LKmlcaOaOzMqYyk19fgVCybQ== dependencies: axios "^0.21.1" axios-retry "^3.1.9" @@ -5140,13 +5140,13 @@ medusa-telemetry@0.0.5-dev-1633030366783: remove-trailing-slash "^0.1.1" uuid "^8.3.2" -medusa-test-utils@1.1.25-dev-1633030366783: - version "1.1.25-dev-1633030366783" - resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.25-dev-1633030366783.tgz#97b8235e4fbfd5cf16ed91444df1af44d4c45a60" - integrity sha512-9cztZpuTMbn++Zg/06+vlOnAFa7jUAFf7o7i7kXQGXInlJngS0Tw9pq8H0vQ4vz7QRdiOiFPXb11gymLUT64uA== +medusa-test-utils@1.1.25-dev-1633520747607: + version "1.1.25-dev-1633520747607" + resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.25-dev-1633520747607.tgz#7c283312d241e012ce9814841ab0fcb0e141245e" + integrity sha512-rW4GRGXlKBoqHeX3AvPWpV9R6AWe5CXEhDcTxxPNk/Nog8E8zBlWDHsff1057RagVIMjd4wkFx4Kz3mgUMgQAg== dependencies: "@babel/plugin-transform-classes" "^7.9.5" - medusa-core-utils "1.1.22-dev-1633030366783" + medusa-core-utils "1.1.22-dev-1633520747607" randomatic "^3.1.1" merge-descriptors@1.0.1: diff --git a/packages/medusa/src/api/routes/admin/orders/create-swap.js b/packages/medusa/src/api/routes/admin/orders/create-swap.js index f88351c317..16848d99c0 100644 --- a/packages/medusa/src/api/routes/admin/orders/create-swap.js +++ b/packages/medusa/src/api/routes/admin/orders/create-swap.js @@ -45,6 +45,17 @@ import { defaultFields, defaultRelations } from "./" * quantity: * description: The quantity of the Product Variant to ship. * type: integer + * custom_shipping_options: + * description: The custom shipping options to potentially create a Shipping Method from. + * type: array + * items: + * properties: + * option_id: + * description: The id of the Shipping Option to override with a custom price. + * type: string + * price: + * description: The custom price of the Shipping Option. + * type: integer * no_notification: * description: If set to true no notification will be send related to this Swap. * type: boolean @@ -81,18 +92,16 @@ export default async (req, res) => { .optional(), }) .optional(), - rma_shipping_options: Validator.array() - .items({ - option_id: Validator.string().optional(), - price: Validator.number() - .integer() - .optional(), - }) - .default([]), additional_items: Validator.array().items({ variant_id: Validator.string().required(), quantity: Validator.number().required(), }), + custom_shipping_options: Validator.array() + .items({ + option_id: Validator.string().required(), + price: Validator.number().required(), + }) + .default([]), no_notification: Validator.boolean().optional(), allow_backorder: Validator.boolean().default(true), }) @@ -150,7 +159,6 @@ export default async (req, res) => { value.return_items, value.additional_items, value.return_shipping, - value.rma_shipping_options, { idempotency_key: idempotencyKey.idempotency_key, no_notification: value.no_notification, @@ -158,7 +166,9 @@ export default async (req, res) => { } ) - await swapService.withTransaction(manager).createCart(swap.id) + await swapService + .withTransaction(manager) + .createCart(swap.id, value.custom_shipping_options) const returnOrder = await returnService .withTransaction(manager) .retrieveBySwap(swap.id) diff --git a/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js b/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js index 075ad81e94..34fe6ddbdd 100644 --- a/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js +++ b/packages/medusa/src/api/routes/store/carts/__tests__/add-shipping-method.js @@ -23,9 +23,9 @@ describe("POST /store/carts/:id/shipping-methods", () => { jest.clearAllMocks() }) - it("calls CartService addRMAMethod", () => { - expect(CartServiceMock.addRMAMethod).toHaveBeenCalledTimes(1) - expect(CartServiceMock.addRMAMethod).toHaveBeenCalledWith( + it("calls CartService addShippingMethod", () => { + expect(CartServiceMock.addShippingMethod).toHaveBeenCalledTimes(1) + expect(CartServiceMock.addShippingMethod).toHaveBeenCalledWith( IdMap.getId("fr-cart"), IdMap.getId("freeShipping"), {} @@ -45,7 +45,7 @@ describe("POST /store/carts/:id/shipping-methods", () => { }) }) - describe("successfully adds a RMA shipping method", () => { + describe("successfully adds a shipping method", () => { let subject beforeAll(async () => { @@ -65,9 +65,9 @@ describe("POST /store/carts/:id/shipping-methods", () => { jest.clearAllMocks() }) - it("calls CartService addRMAMethod", () => { - expect(CartServiceMock.addRMAMethod).toHaveBeenCalledTimes(1) - expect(CartServiceMock.addRMAMethod).toHaveBeenCalledWith( + it("calls CartService addShippingMethod", () => { + expect(CartServiceMock.addShippingMethod).toHaveBeenCalledTimes(1) + expect(CartServiceMock.addShippingMethod).toHaveBeenCalledWith( IdMap.getId("swap-cart"), IdMap.getId("freeShipping"), {} @@ -112,9 +112,9 @@ describe("POST /store/carts/:id/shipping-methods", () => { jest.clearAllMocks() }) - it("calls CartService addRMAMethod", () => { - expect(CartServiceMock.addRMAMethod).toHaveBeenCalledTimes(1) - expect(CartServiceMock.addRMAMethod).toHaveBeenCalledWith( + it("calls CartService addShippingMethod", () => { + expect(CartServiceMock.addShippingMethod).toHaveBeenCalledTimes(1) + expect(CartServiceMock.addShippingMethod).toHaveBeenCalledWith( IdMap.getId("fr-cart"), IdMap.getId("freeShipping"), { diff --git a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js index b66c928fa9..a52e531519 100644 --- a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js +++ b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js @@ -45,7 +45,7 @@ export default async (req, res) => { await manager.transaction(async m => { const txCartService = cartService.withTransaction(m) - await txCartService.addRMAMethod(id, value.option_id, value.data) + await txCartService.addShippingMethod(id, value.option_id, value.data) const updated = await txCartService.retrieve(id, { relations: ["payment_sessions"], diff --git a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js index 09ce8407d1..113e820266 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js @@ -4,7 +4,7 @@ import { carts, CartServiceMock } from "../../../../../services/__mocks__/cart" import { ShippingProfileServiceMock } from "../../../../../services/__mocks__/shipping-profile" describe("GET /store/shipping-options", () => { - describe("retrieves shipping options when cart type is not swap and not claim", () => { + describe("retrieves shipping options", () => { let subject beforeAll(async () => { @@ -29,6 +29,7 @@ describe("GET /store/shipping-options", () => { "items", "items.variant", "items.variant.product", + "custom_shipping_options", ], } ) @@ -53,54 +54,4 @@ describe("GET /store/shipping-options", () => { ) }) }) - - describe("retrieves shipping options when cart type is swap", () => { - let subject - - beforeAll(async () => { - subject = await request( - "GET", - `/store/shipping-options/${IdMap.getId("swap-cart")}` - ) - }) - - afterAll(() => { - jest.clearAllMocks() - }) - - it("calls CartService retrieve", () => { - expect(CartServiceMock.retrieve).toHaveBeenCalledTimes(1) - expect(CartServiceMock.retrieve).toHaveBeenCalledWith( - IdMap.getId("swap-cart"), - { - select: ["subtotal"], - relations: [ - "region", - "items", - "items.variant", - "items.variant.product", - ], - } - ) - }) - - it("calls ShippingProfileService fetchRMAOptions", () => { - expect(ShippingProfileServiceMock.fetchRMAOptions).toHaveBeenCalledTimes( - 1 - ) - expect(ShippingProfileServiceMock.fetchRMAOptions).toHaveBeenCalledWith( - carts.testSwapCart - ) - }) - - it("returns 200", () => { - expect(subject.status).toEqual(200) - }) - - it("returns the RMAshippingOptions", () => { - expect(subject.body.shipping_options[0].id).toEqual( - IdMap.getId("cartRMAShippingOption") - ) - }) - }) }) diff --git a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js index c1903d3204..bde062eacd 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js @@ -37,15 +37,16 @@ export default async (req, res) => { const cart = await cartService.retrieve(value.cart_id, { select: ["subtotal"], - relations: ["region", "items", "items.variant", "items.variant.product"], + relations: [ + "region", + "items", + "items.variant", + "items.variant.product", + "custom_shipping_options", + ], }) - let options - if (cart.type === "swap" || cart.type === "claim") { - options = await shippingProfileService.fetchRMAOptions(cart) - } else { - options = await shippingProfileService.fetchCartOptions(cart) - } + const options = await shippingProfileService.fetchCartOptions(cart) res.status(200).json({ shipping_options: options }) } catch (err) { diff --git a/packages/medusa/src/api/routes/store/swaps/create-swap.js b/packages/medusa/src/api/routes/store/swaps/create-swap.js index 5254bda2ef..4345a0735e 100644 --- a/packages/medusa/src/api/routes/store/swaps/create-swap.js +++ b/packages/medusa/src/api/routes/store/swaps/create-swap.js @@ -130,7 +130,6 @@ export default async (req, res) => { value.return_items, value.additional_items, returnShipping, - [], { idempotency_key: idempotencyKey.idempotency_key, no_notification: true, diff --git a/packages/medusa/src/index.js b/packages/medusa/src/index.js index cfdb72f215..0c90c4c160 100644 --- a/packages/medusa/src/index.js +++ b/packages/medusa/src/index.js @@ -46,4 +46,4 @@ export { User } from "./models/user" export { DraftOrder } from "./models/draft-order" export { ReturnReason } from "./models/return-reason" export { Note } from "./models/note" -export { RMAShippingOption } from "./models/rma-shipping-option" +export { CustomShippingOption } from "./models/custom-shipping-option" diff --git a/packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts b/packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts deleted file mode 100644 index 554ab5d796..0000000000 --- a/packages/medusa/src/migrations/1632851018347-add_rma_shipping_options.ts +++ /dev/null @@ -1,38 +0,0 @@ -import {MigrationInterface, QueryRunner} from "typeorm"; - -export class addRmaShippingOptions1632851018347 implements MigrationInterface { - name = 'addRmaShippingOptions1632851018347' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "rma_shipping_option" ("id" character varying NOT NULL, "price" integer NOT NULL, "shipping_option_id" character varying NOT NULL, "swap_id" character varying, "claim_order_id" character varying, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deleted_at" TIMESTAMP WITH TIME ZONE, "metadata" jsonb, CONSTRAINT "PK_12d2eebc6cef997c9057b338647" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE INDEX "IDX_f3618cd0930a2e7357eddbebf4" ON "rma_shipping_option" ("shipping_option_id") `); - await queryRunner.query(`CREATE INDEX "IDX_4e4c2c0a3223c79a84a6f54e58" ON "rma_shipping_option" ("swap_id") `); - await queryRunner.query(`CREATE INDEX "IDX_2e262bb0e324b501d80a69f9df" ON "rma_shipping_option" ("claim_order_id") `); - await queryRunner.query(`ALTER TYPE "public"."cart_type_enum" RENAME TO "cart_type_enum_old"`); - await queryRunner.query(`CREATE TYPE "public"."cart_type_enum" AS ENUM('default', 'swap', 'draft_order', 'payment_link', 'claim')`); - await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" DROP DEFAULT`); - await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" TYPE "public"."cart_type_enum" USING "type"::"text"::"public"."cart_type_enum"`); - await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" SET DEFAULT 'default'`); - await queryRunner.query(`DROP TYPE "public"."cart_type_enum_old"`); - await queryRunner.query(`ALTER TABLE "rma_shipping_option" ADD CONSTRAINT "FK_f3618cd0930a2e7357eddbebf4c" FOREIGN KEY ("shipping_option_id") REFERENCES "shipping_option"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); - await queryRunner.query(`ALTER TABLE "rma_shipping_option" ADD CONSTRAINT "FK_4e4c2c0a3223c79a84a6f54e583" FOREIGN KEY ("swap_id") REFERENCES "swap"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); - await queryRunner.query(`ALTER TABLE "rma_shipping_option" ADD CONSTRAINT "FK_2e262bb0e324b501d80a69f9df4" FOREIGN KEY ("claim_order_id") REFERENCES "claim_order"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "rma_shipping_option" DROP CONSTRAINT "FK_2e262bb0e324b501d80a69f9df4"`); - await queryRunner.query(`ALTER TABLE "rma_shipping_option" DROP CONSTRAINT "FK_4e4c2c0a3223c79a84a6f54e583"`); - await queryRunner.query(`ALTER TABLE "rma_shipping_option" DROP CONSTRAINT "FK_f3618cd0930a2e7357eddbebf4c"`); - await queryRunner.query(`CREATE TYPE "public"."cart_type_enum_old" AS ENUM('default', 'swap', 'draft_order', 'payment_link')`); - await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" DROP DEFAULT`); - await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" TYPE "public"."cart_type_enum_old" USING "type"::"text"::"public"."cart_type_enum_old"`); - await queryRunner.query(`ALTER TABLE "public"."cart" ALTER COLUMN "type" SET DEFAULT 'default'`); - await queryRunner.query(`DROP TYPE "public"."cart_type_enum"`); - await queryRunner.query(`ALTER TYPE "public"."cart_type_enum_old" RENAME TO "cart_type_enum"`); - await queryRunner.query(`DROP INDEX "IDX_2e262bb0e324b501d80a69f9df"`); - await queryRunner.query(`DROP INDEX "IDX_4e4c2c0a3223c79a84a6f54e58"`); - await queryRunner.query(`DROP INDEX "IDX_f3618cd0930a2e7357eddbebf4"`); - await queryRunner.query(`DROP TABLE "rma_shipping_option"`); - } - -} diff --git a/packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts b/packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts new file mode 100644 index 0000000000..17645022cd --- /dev/null +++ b/packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts @@ -0,0 +1,34 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class addCustomShippingOptions1633522106578 implements MigrationInterface { + name = 'addCustomShippingOptions1633522106578' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "custom_shipping_option" ("id" character varying NOT NULL, "price" integer NOT NULL, "shipping_option_id" character varying NOT NULL, "cart_id" character varying, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deleted_at" TIMESTAMP WITH TIME ZONE, "metadata" jsonb, CONSTRAINT "PK_8dfcb5c1172c29eec4a728420cc" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE INDEX "IDX_44090cb11b06174cbcc667e91c" ON "custom_shipping_option" ("shipping_option_id") `); + await queryRunner.query(`CREATE INDEX "IDX_93caeb1bb70d37c1d36d6701a7" ON "custom_shipping_option" ("cart_id") `); + await queryRunner.query(`ALTER TYPE "cart_type_enum" RENAME TO "cart_type_enum_old"`); + await queryRunner.query(`CREATE TYPE "cart_type_enum" AS ENUM('default', 'swap', 'draft_order', 'payment_link', 'claim')`); + await queryRunner.query(`ALTER TABLE "cart" ALTER COLUMN "type" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "cart" ALTER COLUMN "type" TYPE "cart_type_enum" USING "type"::"text"::"cart_type_enum"`); + await queryRunner.query(`ALTER TABLE "cart" ALTER COLUMN "type" SET DEFAULT 'default'`); + await queryRunner.query(`DROP TYPE "cart_type_enum_old"`); + await queryRunner.query(`ALTER TABLE "custom_shipping_option" ADD CONSTRAINT "FK_44090cb11b06174cbcc667e91ca" FOREIGN KEY ("shipping_option_id") REFERENCES "shipping_option"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "custom_shipping_option" ADD CONSTRAINT "FK_93caeb1bb70d37c1d36d6701a7a" FOREIGN KEY ("cart_id") REFERENCES "cart"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "custom_shipping_option" DROP CONSTRAINT "FK_93caeb1bb70d37c1d36d6701a7a"`); + await queryRunner.query(`ALTER TABLE "custom_shipping_option" DROP CONSTRAINT "FK_44090cb11b06174cbcc667e91ca"`); + await queryRunner.query(`CREATE TYPE "cart_type_enum_old" AS ENUM('default', 'swap', 'draft_order', 'payment_link')`); + await queryRunner.query(`ALTER TABLE "cart" ALTER COLUMN "type" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "cart" ALTER COLUMN "type" TYPE "cart_type_enum_old" USING "type"::"text"::"cart_type_enum_old"`); + await queryRunner.query(`ALTER TABLE "cart" ALTER COLUMN "type" SET DEFAULT 'default'`); + await queryRunner.query(`DROP TYPE "cart_type_enum"`); + await queryRunner.query(`ALTER TYPE "cart_type_enum_old" RENAME TO "cart_type_enum"`); + await queryRunner.query(`DROP INDEX "IDX_93caeb1bb70d37c1d36d6701a7"`); + await queryRunner.query(`DROP INDEX "IDX_44090cb11b06174cbcc667e91c"`); + await queryRunner.query(`DROP TABLE "custom_shipping_option"`); + } + +} diff --git a/packages/medusa/src/models/cart.ts b/packages/medusa/src/models/cart.ts index 62d702d519..f5ea91a5de 100644 --- a/packages/medusa/src/models/cart.ts +++ b/packages/medusa/src/models/cart.ts @@ -44,6 +44,8 @@ * $ref: "#/components/schemas/payment_session" * payment: * $ref: "#/components/schemas/payment" + * custom_shipping_options: + * $ref: "#/components/schemas/custom_shipping_option" * shipping_methods: * type: array * items: @@ -113,6 +115,7 @@ import { PaymentSession } from "./payment-session" import { Payment } from "./payment" import { GiftCard } from "./gift-card" import { ShippingMethod } from "./shipping-method" +import { CustomShippingOption } from "./custom-shipping-option" export enum CartType { DEFAULT = "default", @@ -218,6 +221,13 @@ export class Cart { @JoinColumn({ name: "payment_id" }) payment: Payment + @OneToMany( + () => CustomShippingOption, + method => method.cart, + { cascade: ["insert"] } + ) + custom_shipping_options: CustomShippingOption[] + @OneToMany( () => ShippingMethod, method => method.cart, diff --git a/packages/medusa/src/models/claim-order.ts b/packages/medusa/src/models/claim-order.ts index 2dc9cd0e8a..f16956d33d 100644 --- a/packages/medusa/src/models/claim-order.ts +++ b/packages/medusa/src/models/claim-order.ts @@ -1,4 +1,3 @@ -import { RMAShippingOption } from './rma-shipping-option'; import { Entity, BeforeInsert, @@ -114,13 +113,6 @@ export class ClaimOrder { ) shipping_methods: ShippingMethod[] - @OneToMany( - () => RMAShippingOption, - method => method.swap, - { cascade: ["insert"] } - ) - rma_shipping_options: RMAShippingOption[] - @OneToMany( () => Fulfillment, fulfillment => fulfillment.claim_order, diff --git a/packages/medusa/src/models/custom-shipping-option.ts b/packages/medusa/src/models/custom-shipping-option.ts new file mode 100644 index 0000000000..a8b904e77f --- /dev/null +++ b/packages/medusa/src/models/custom-shipping-option.ts @@ -0,0 +1,97 @@ +import { + BeforeInsert, Column, + CreateDateColumn, + DeleteDateColumn, + Entity, + Index, + JoinColumn, + ManyToOne, + PrimaryColumn, + UpdateDateColumn +} from "typeorm"; +import { ulid } from "ulid"; +import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column"; +import { Cart } from './cart'; +import { ShippingOption } from "./shipping-option"; + + +@Entity() +export class CustomShippingOption { + @PrimaryColumn() + id: string + + @Column({ type: "int" }) + price: number + + @Index() + @Column() + shipping_option_id: string; + + @ManyToOne(() => ShippingOption, { eager: true }) + @JoinColumn({ name: "shipping_option_id" }) + shipping_option: ShippingOption + + @Index() + @Column({ nullable: true }) + cart_id: string + + @ManyToOne(() => Cart) + @JoinColumn({ name: "cart_id" }) + cart: Cart + + @CreateDateColumn({ type: resolveDbType("timestamptz") }) + created_at: Date + + @UpdateDateColumn({ type: resolveDbType("timestamptz") }) + updated_at: Date + + @DeleteDateColumn({ type: resolveDbType("timestamptz") }) + deleted_at: Date + + @DbAwareColumn({ type: "jsonb", nullable: true }) + metadata: any + + @BeforeInsert() + private beforeInsert() { + if (this.id) return + const id = ulid() + this.id = `cso_${id}` + } +} + +/** + * @schema Custom shipping_option + * title: "Custom Shipping Option" + * description: "Custom Shipping Options are 'overriden' Shipping Options. Store managers can attach a Custom Shipping Option to a cart in order to set a custom price for a particular Shipping Option" + * x-resourceId: custom_shipping_option + * properties: + * id: + * description: "The id of the Custom Shipping Option. This value will be prefixed with `cso_`." + * type: string + * price: + * description: "The custom price set that will override the shipping option's original price" + * type: integer + * shipping_option_id: + * description: "The id of the Shipping Option that the custom shipping option overrides" + * anyOf: + * - $ref: "#/components/schemas/shipping_option" + * cart_id: + * description: "The id of the Cart that the custom shipping option is attached to" + * anyOf: + * - $ref: "#/components/schemas/cart" + * created_at: + * description: "The date with timezone at which the resource was created." + * type: string + * format: date-time + * updated_at: + * description: "The date with timezone at which the resource was last updated." + * type: string + * format: date-time + * deleted_at: + * description: "The date with timezone at which the resource was deleted." + * type: string + * format: date-time + * metadata: + * description: "An optional key-value map with additional information." + * type: object + */ diff --git a/packages/medusa/src/models/rma-shipping-option.ts b/packages/medusa/src/models/rma-shipping-option.ts deleted file mode 100644 index 88ff39f292..0000000000 --- a/packages/medusa/src/models/rma-shipping-option.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { - BeforeInsert, - Check, - Column, - CreateDateColumn, - DeleteDateColumn, - Entity, - Index, - JoinColumn, - ManyToOne, - PrimaryColumn, - UpdateDateColumn -} from "typeorm"; -import { ulid } from "ulid"; -import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column"; -import { ClaimOrder } from './claim-order'; -import { ShippingOption } from "./shipping-option"; -import { Swap } from './swap'; - - -@Entity() -export class RMAShippingOption { - @PrimaryColumn() - id: string - - @Column({ type: "int" }) - price: number - - @Index() - @Column() - shipping_option_id: string; - - @ManyToOne(() => ShippingOption, { eager: true }) - @JoinColumn({ name: "shipping_option_id" }) - shipping_option: ShippingOption - - @Index() - @Column({ nullable: true }) - swap_id: string - - @ManyToOne(() => Swap) - @JoinColumn({ name: "swap_id" }) - swap: Swap - - @Index() - @Column({ nullable: true }) - claim_order_id: string - - @ManyToOne(() => ClaimOrder) - @JoinColumn({ name: "claim_order_id" }) - claim_order: ClaimOrder - - @CreateDateColumn({ type: resolveDbType("timestamptz") }) - created_at: Date - - @UpdateDateColumn({ type: resolveDbType("timestamptz") }) - updated_at: Date - - @DeleteDateColumn({ type: resolveDbType("timestamptz") }) - deleted_at: Date - - @DbAwareColumn({ type: "jsonb", nullable: true }) - metadata: any - - @BeforeInsert() - private beforeInsert() { - if (this.id) return - const id = ulid() - this.id = `rmaso_${id}` - } -} - -/** - * @schema RMA shipping_option - * title: "RMA Shipping Option" - * description: "Shipping Options represent a way in which an Order or Return can be shipped. Shipping Options have an associated Fulfillment Provider that will be used when the fulfillment of an Order is initiated. Shipping Options themselves cannot be added to Carts, but serve as a template for Shipping Methods. This distinction makes it possible to customize individual Shipping Methods with additional information." - * x-resourceId: shipping_option - * properties: - * id: - * description: "The id of the Shipping Option. This value will be prefixed with `so_`." - * type: string - * name: - * description: "The name given to the Shipping Option - this may be displayed to the Customer." - * type: string - * region_id: - * description: "The id of the Region that the Shipping Option belongs to." - * type: string - * region: - * description: "The id of the Region that the Shipping Option belongs to." - * anyOf: - * - $ref: "#/components/schemas/region" - * profile_id: - * description: "The id of the Shipping Profile that the Shipping Option belongs to. Shipping Profiles have a set of defined Shipping Options that can be used to Fulfill a given set of Products." - * type: string - * provider_id: - * description: "The id of the Fulfillment Provider, that will be used to process Fulfillments from the Shipping Option." - * type: string - * price_type: - * description: "The type of pricing calculation that is used when creatin Shipping Methods from the Shipping Option. Can be `flat_rate` for fixed prices or `calculated` if the Fulfillment Provider can provide price calulations." - * type: string - * enum: - * - flat_rate - * - calculated - * amount: - * description: "The amount to charge for shipping when the Shipping Option price type is `flat_rate`." - * type: integer - * is_return: - * description: "Flag to indicate if the Shipping Option can be used for Return shipments." - * type: boolean - * requirements: - * description: "The requirements that must be satisfied for the Shipping Option to be available for a Cart." - * type: array - * items: - * $ref: "#/components/schemas/shipping_option_requirement" - * data: - * description: "The data needed for the Fulfillment Provider to identify the Shipping Option." - * type: object - * created_at: - * description: "The date with timezone at which the resource was created." - * type: string - * format: date-time - * updated_at: - * description: "The date with timezone at which the resource was last updated." - * type: string - * format: date-time - * deleted_at: - * description: "The date with timezone at which the resource was deleted." - * type: string - * format: date-time - * metadata: - * description: "An optional key-value map with additional information." - * type: object - */ diff --git a/packages/medusa/src/models/swap.ts b/packages/medusa/src/models/swap.ts index a13a2989d7..cb44a825cd 100644 --- a/packages/medusa/src/models/swap.ts +++ b/packages/medusa/src/models/swap.ts @@ -1,4 +1,3 @@ -import { RMAShippingOption } from './rma-shipping-option'; import { Entity, Index, @@ -114,13 +113,6 @@ export class Swap { ) shipping_methods: ShippingMethod[] - @OneToMany( - () => RMAShippingOption, - method => method.swap, - { cascade: ["insert"] } - ) - rma_shipping_options: RMAShippingOption[] - @Column({ nullable: true }) cart_id: string diff --git a/packages/medusa/src/repositories/RMA-shipping-option.ts b/packages/medusa/src/repositories/RMA-shipping-option.ts deleted file mode 100644 index 52a7113d53..0000000000 --- a/packages/medusa/src/repositories/RMA-shipping-option.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from "typeorm" -import { RMAShippingOption } from './../models/rma-shipping-option'; - -@EntityRepository(RMAShippingOption) -export class RMAShippingOptionRepository extends Repository {} diff --git a/packages/medusa/src/services/__mocks__/cart.js b/packages/medusa/src/services/__mocks__/cart.js index e65805bd75..6c99bcd2c7 100644 --- a/packages/medusa/src/services/__mocks__/cart.js +++ b/packages/medusa/src/services/__mocks__/cart.js @@ -342,9 +342,6 @@ export const CartServiceMock = { addShippingMethod: jest.fn().mockImplementation(cartId => { return Promise.resolve() }), - addRMAMethod: jest.fn().mockImplementation(cartId => { - return Promise.resolve() - }), retrieveShippingOption: jest.fn().mockImplementation((cartId, optionId) => { if (optionId === IdMap.getId("freeShipping")) { return { diff --git a/packages/medusa/src/services/__mocks__/shipping-profile.js b/packages/medusa/src/services/__mocks__/shipping-profile.js index 4abc212d84..d4e3848136 100644 --- a/packages/medusa/src/services/__mocks__/shipping-profile.js +++ b/packages/medusa/src/services/__mocks__/shipping-profile.js @@ -134,9 +134,6 @@ export const ShippingProfileServiceMock = { fetchCartOptions: jest.fn().mockImplementation(() => { return Promise.resolve([{ id: IdMap.getId("cartShippingOption") }]) }), - fetchRMAOptions: jest.fn().mockImplementation(() => { - return Promise.resolve([{ id: IdMap.getId("cartRMAShippingOption") }]) - }), fetchOptionsByProductIds: jest.fn().mockImplementation(() => { return Promise.resolve([{ id: IdMap.getId("cartShippingOption") }]) }), diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index 51e7f7b949..499f2a8559 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -1308,6 +1308,68 @@ describe("CartService", () => { }) }) + describe("extractShippingOptionIdAndPrice", () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + let cartService = new CartService({}) + + it("given a cart with custom shipping options and a custom shipping option id, then it should return a normal shipping option id corresponding to the custom shipping option id and a customPrice", async () => { + const cart = { + id: "cart-with-so", + custom_shipping_options: [ + { id: "cso-test", shipping_option_id: "test-so", price: 20 }, + ], + } + const result = cartService.extractShippingOptionIdAndPrice( + cart, + "cso-test" + ) + + expect(result).toEqual({ + optionId: "test-so", + customPrice: { price: 20 }, + }) + }) + + it("given a cart with custom shipping options and a normal shipping option id, then it should return a normal shipping option id and empty customPrice", async () => { + const cart = { + id: "cart-with-so", + custom_shipping_options: [ + { id: "cso-test", shipping_option_id: "test-so", price: 20 }, + ], + } + const result = cartService.extractShippingOptionIdAndPrice( + cart, + "test-so" + ) + + expect(result).toEqual({ + optionId: "test-so", + customPrice: {}, + }) + }) + + it("given a cart with custom shipping options and a custom shipping option id that does not belong to the cart, then it should return the custom shipping option id and empty customPrice", async () => { + const cart = { + id: "cart-with-so", + custom_shipping_options: [ + { id: "cso-test", shipping_option_id: "test-so", price: 20 }, + ], + } + const result = cartService.extractShippingOptionIdAndPrice( + cart, + "cso-test-2" + ) + + expect(result).toEqual({ + optionId: "cso-test-2", + customPrice: {}, + }) + }) + }) + describe("addShippingMethod", () => { const buildCart = (id, config = {}) => { return { @@ -1326,6 +1388,13 @@ describe("CartService", () => { profile_id: IdMap.getId(m.profile), }, })), + custom_shipping_options: (config.custom_shipping_options || []).map( + cso => ({ + ...cso, + id: IdMap.getId(cso.id), + shipping_option_id: IdMap.getId(cso.shipping_option_id), + }) + ), discounts: [], } } @@ -1337,6 +1406,11 @@ describe("CartService", () => { const cart3 = buildCart("lines", { items: [{ id: "line", profile: "profile1" }], }) + const cartWithCustomSO = buildCart("cart-with-custom-so", { + custom_shipping_options: [ + { id: "cso-test", shipping_option_id: "test-so" }, + ], + }) const cartRepository = MockRepository({ findOneWithRelations: (rels, q) => { @@ -1345,6 +1419,8 @@ describe("CartService", () => { return Promise.resolve(cart3) case IdMap.getId("existing"): return Promise.resolve(cart2) + case IdMap.getId("cart-with-custom-so"): + return Promise.resolve(cartWithCustomSO) default: return Promise.resolve(cart1) } @@ -1468,74 +1544,37 @@ describe("CartService", () => { has_shipping: true, }) }) - }) - describe("addRMAMethod", () => { - const rmaSO = { - id: IdMap.getId("rmaso-option"), - shipping_option_id: IdMap.getId("regular-so-option"), - price: 0, - } - - const RMAShippingOptionRepository = MockRepository({ - findOne: q => { - if (q.where.id === IdMap.getId("rmaso-option")) { - return Promise.resolve(rmaSO) - } - return Promise.resolve(null) - }, - }) - - const cartService = new CartService({ - manager: MockManager, - totalsService, - RMAShippingOptionRepository, - eventBusService, - }) - - cartService.addShippingMethod = jest.fn().mockImplementation(() => { - return Promise.resolve({}) - }) - - beforeEach(() => { - jest.clearAllMocks() - }) - - it("when a normal shipping option id is provided, then it should call addShippingMethod", async () => { + it("adds a shipping method from a custom shipping option and custom price", async () => { const data = { id: "test", extra: "yes", } - await cartService.addRMAMethod( - IdMap.getId("cart"), - IdMap.getId("regular-so-option"), - data - ) - expect(cartService.addShippingMethod).toHaveBeenCalledWith( - IdMap.getId("cart"), - IdMap.getId("regular-so-option"), - data - ) - }) - - it("when a rma shipping option is provided, then it should call addShippingOption with a custom price", async () => { - const data = { - id: "testshipperid", - } - await cartService.addRMAMethod( - IdMap.getId("cart"), - IdMap.getId("rmaso-option"), - data - ) - - expect(cartService.addShippingMethod).toHaveBeenCalledWith( - IdMap.getId("cart"), - IdMap.getId("regular-so-option"), - expect.objectContaining({ - ...data, - price: 0, + cartService.extractShippingOptionIdAndPrice = jest + .fn() + .mockImplementation((cart, optionId) => { + if (cart.id === IdMap.getId("cart-with-custom-so")) { + return { + optionId: IdMap.getId("test-so"), + customPrice: { price: 0 }, + } + } + return { optionId, customPrice: {} } }) + + await cartService.addShippingMethod( + IdMap.getId("cart-with-custom-so"), + IdMap.getId("cso-test"), + data + ) + expect(shippingOptionService.createShippingMethod).toHaveBeenCalledWith( + IdMap.getId("test-so"), + data, + { + cart: cartWithCustomSO, + price: 0, + } ) }) }) diff --git a/packages/medusa/src/services/__tests__/shipping-profile.js b/packages/medusa/src/services/__tests__/shipping-profile.js index bce3cb47b9..9054e3a92a 100644 --- a/packages/medusa/src/services/__tests__/shipping-profile.js +++ b/packages/medusa/src/services/__tests__/shipping-profile.js @@ -202,7 +202,23 @@ describe("ShippingProfileService", () => { jest.clearAllMocks() }) - it("fetches correct options", async () => { + it("given a swap cart with custom shipping options, should return correct custom shipping options ", async () => { + const cart = { + id: "swap-cart", + type: "swap", + custom_shipping_options: [ + { option_id: "test-option1", id: "cso-option1", price: 10 }, + { option_id: "test-option2", id: "cso-option2", price: 0 }, + ], + } + + await expect(profileService.fetchCartOptions(cart)).resolves.toEqual([ + expect.objectContaining({ id: "cso-option1" }), + expect.objectContaining({ id: "cso-option2" }), + ]) + }) + + it("given correct options when cart has no custom shipping options, should return normal shipping options", async () => { const cart = { items: [ { @@ -241,104 +257,6 @@ describe("ShippingProfileService", () => { }) }) - describe("fetchRMAOptions", () => { - beforeEach(() => { - jest.clearAllMocks() - }) - - it("given a swap cart with rma shipping options, should return correct rma shipping options ", async () => { - const swapRepository = MockRepository({ - findOne() { - return Promise.resolve({ - id: "swap-cart", - type: "swap", - rma_shipping_options: [ - { option_id: "test-option1", id: "rmsao-option1", price: 10 }, - { option_id: "test-option2", id: "rmsao-option2", price: 0 }, - ], - }) - }, - }) - - const profileService = new ShippingProfileService({ - manager: MockManager, - swapRepository, - }) - - const cart = { - id: "swap-cart", - type: "swap", - } - - await expect(profileService.fetchRMAOptions(cart)).resolves.toEqual([ - expect.objectContaining({ id: "rmsao-option1" }), - expect.objectContaining({ id: "rmsao-option2" }), - ]) - }) - - it("given a swap cart with no rma shipping options, should call fetchCartOptions and return normal shipping options ", async () => { - const swapRepository = MockRepository({ - findOne() { - return Promise.resolve({ - id: "swap-cart", - type: "swap", - rma_shipping_options: [], - }) - }, - }) - - const profileService = new ShippingProfileService({ - manager: MockManager, - swapRepository, - }) - - profileService.fetchCartOptions = jest.fn().mockImplementation(() => { - return Promise.resolve([ - { - id: "normal-option1", - }, - { - id: "normal-option2", - }, - ]) - }) - - const cart = { - id: "swap-cart", - type: "swap", - } - - await expect(profileService.fetchRMAOptions(cart)).resolves.toEqual([ - expect.objectContaining({ - id: "normal-option1", - }), - expect.objectContaining({ id: "normal-option2" }), - ]) - - expect(profileService.fetchCartOptions).toHaveBeenCalledTimes(1) - expect(profileService.fetchCartOptions).toHaveBeenCalledWith({ - id: "swap-cart", - type: "swap", - }) - }) - - it("when cart is default, then should throw", async () => { - const profileService = new ShippingProfileService({ - manager: MockManager, - }) - - const cart = { - id: "normal-cart", - type: "default", - } - - await expect(profileService.fetchRMAOptions(cart)).rejects.toThrow({ - type: "invalid_data", - message: "error", - }) - }) - }) - describe("addShippingOption", () => { const profRepo = MockRepository({ findOne: () => Promise.resolve({}) }) diff --git a/packages/medusa/src/services/__tests__/swap.js b/packages/medusa/src/services/__tests__/swap.js index ecc6ecc872..4b5af9a5d5 100644 --- a/packages/medusa/src/services/__tests__/swap.js +++ b/packages/medusa/src/services/__tests__/swap.js @@ -188,7 +188,9 @@ describe("SwapService", () => { }) it("finds swap and calls return create cart", async () => { - await swapService.createCart(IdMap.getId("swap-1")) + await swapService.createCart(IdMap.getId("swap-1"), [ + { option_id: "test-option", price: 10 }, + ]) expect(swapRepo.findOneWithRelations).toHaveBeenCalledTimes(1) expect(swapRepo.findOneWithRelations).toHaveBeenCalledWith( @@ -214,6 +216,9 @@ describe("SwapService", () => { discounts: testOrder.discounts, region_id: testOrder.region_id, customer_id: testOrder.customer_id, + custom_shipping_options: [ + { shipping_option_id: "test-option", price: 10 }, + ], type: "swap", metadata: { swap_id: IdMap.getId("test-swap"), @@ -344,8 +349,7 @@ describe("SwapService", () => { { id: IdMap.getId("return-shipping"), price: 20, - }, - [{ option_id: IdMap.getId("rmaso-option1"), price: 0 }] + } ) expect(swapRepo.create).toHaveBeenCalledWith({ @@ -360,9 +364,6 @@ describe("SwapService", () => { quantity: 1, }, ], - rma_shipping_options: [ - { shipping_option_id: IdMap.getId("rmaso-option1"), price: 0 }, - ], }) expect(returnService.create).toHaveBeenCalledTimes(1) @@ -383,7 +384,6 @@ describe("SwapService", () => { id: IdMap.getId("return-shipping"), price: 20, }, - [], { no_notification: input } ) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index e17c626b6b..f1b1b3b63f 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -31,8 +31,6 @@ class CartService extends BaseService { addressRepository, paymentSessionRepository, inventoryService, - RMAShippingOptionRepository, - swapRepository, }) { super() @@ -86,9 +84,6 @@ class CartService extends BaseService { /** @private @const {InventoryService} */ this.inventoryService_ = inventoryService - - /** @private @const {RMAShippingOptionRepository} */ - this.rmaShippingOptionRepository_ = RMAShippingOptionRepository } withTransaction(transactionManager) { @@ -114,7 +109,6 @@ class CartService extends BaseService { addressRepository: this.addressRepository_, giftCardService: this.giftCardService_, inventoryService: this.inventoryService_, - RMAShippingOptionRepository: this.rmaShippingOptionRepository_, }) cloned.transactionManager_ = transactionManager @@ -1311,7 +1305,7 @@ class CartService extends BaseService { * @param {Object} data - the fulmillment data for the method * @return {Promise} the result of the update operation */ - async addShippingMethod(cartId, optionId, data) { + async addShippingMethod(cartId, optionIdOrCustomOptionId, data) { return this.atomicPhase_(async manager => { const cart = await this.retrieve(cartId, { select: ["subtotal"], @@ -1323,11 +1317,17 @@ class CartService extends BaseService { "items.variant", "payment_sessions", "items.variant.product", + "custom_shipping_options", ], }) + + let { optionId, customPrice } = this.extractShippingOptionIdAndPrice( + cart, + optionIdOrCustomOptionId + ) + const { shipping_methods } = cart - const customPrice = data && data.price ? { price: data.price } : {} const newMethod = await this.shippingOptionService_ .withTransaction(manager) .createShippingMethod(optionId, data, { @@ -1374,32 +1374,32 @@ class CartService extends BaseService { } /** - * Adds the corresponding shipping method either from a normal or rma shipping option to the list of shipping methods associated with + * Adds the corresponding shipping method either from a normal or custom option to the list of shipping methods associated with * the cart. - * @param {string} cartId - the id of the cart to add shipping method to - * @param {string} optionIdOrRmaOptionId - id of the normal or rma shipping option to add as valid method - * @param {Object} data - the fulmillment data for the method - * @return {Promise} the result of the update operation + * @param {Object} cart - the cart object + * @param {string} optionIdOrCustomOptionId - id of the normal or custom shipping option to add as valid method + * @returns {{ optionId: string; customPrice: { price: number; } | {};}} */ - async addRMAMethod(cartId, optionIdOrRmaOptionId, data) { - return this.atomicPhase_(async manager => { - const rmaShippingOptionRepo = manager.getCustomRepository( - this.rmaShippingOptionRepository_ + extractShippingOptionIdAndPrice(cart, optionIdOrCustomOptionId) { + if ( + cart.custom_shipping_options && + cart.custom_shipping_options.length > 0 + ) { + const customOption = cart.custom_shipping_options.find( + cso => cso.id === optionIdOrCustomOptionId ) - - const rmaOption = await rmaShippingOptionRepo.findOne({ - where: { id: optionIdOrRmaOptionId }, - }) - - if (rmaOption) { - await this.addShippingMethod(cartId, rmaOption.shipping_option_id, { - ...data, - price: rmaOption.price, - }) - } else { - await this.addShippingMethod(cartId, optionIdOrRmaOptionId, data) + if (customOption) { + return { + optionId: customOption.shipping_option_id, + customPrice: { price: customOption.price }, + } } - }) + } + + return { + optionId: optionIdOrCustomOptionId, + customPrice: {}, + } } /** diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index 419b8cef62..e4fb799289 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -14,7 +14,6 @@ class ShippingProfileService extends BaseService { productService, productRepository, shippingOptionService, - swapRepository, }) { super() @@ -32,9 +31,6 @@ class ShippingProfileService extends BaseService { /** @private @const {ShippingOptionService} */ this.shippingOptionService_ = shippingOptionService - - /** @private @const {SwapRepository} */ - this.swapRepository_ = swapRepository } withTransaction(transactionManager) { @@ -47,7 +43,6 @@ class ShippingProfileService extends BaseService { shippingProfileRepository: this.shippingProfileRepository_, productService: this.productService_, shippingOptionService: this.shippingOptionService_, - swapRepository: this.swapRepository_, }) cloned.transactionManager_ = transactionManager @@ -418,6 +413,11 @@ class ShippingProfileService extends BaseService { * @return {[ShippingOptions]} a list of the available shipping options */ async fetchCartOptions(cart) { + const customShippingOptions = cart.custom_shipping_options + + if (customShippingOptions && customShippingOptions.length > 0) + return customShippingOptions + const profileIds = this.getProfilesInCart_(cart) const rawOpts = await this.shippingOptionService_.list( @@ -441,34 +441,6 @@ class ShippingProfileService extends BaseService { return options } - /** - * Finds all the rma shipping options that cover the products in a cart, and - * validates all options that are available for the cart. - * @param {Cart} cart - the cart object to find rma shipping options for - * @return {[RMAShippingOptions | ShippingOptions]} a list of the available rma or normal shipping options - */ - async fetchRMAOptions(cart) { - if (cart.type === "default") { - throw new MedusaError(MedusaError.Types.INVALID_DATA, "error") - } - - const swapRepo = await this.manager_.getCustomRepository( - this.swapRepository_ - ) - - if (cart.type === "swap") { - const swap = await swapRepo.findOne({ - where: { cart_id: cart.id }, - relations: ["rma_shipping_options"], - }) - - if (swap.rma_shipping_options.length === 0) { - return this.fetchCartOptions(cart) - } - - return swap.rma_shipping_options - } - } } export default ShippingProfileService diff --git a/packages/medusa/src/services/swap.js b/packages/medusa/src/services/swap.js index 81ec5ce2e4..074a7be1d3 100644 --- a/packages/medusa/src/services/swap.js +++ b/packages/medusa/src/services/swap.js @@ -288,7 +288,6 @@ class SwapService extends BaseService { * the customer. * @param {ReturnShipping?} returnShipping - an optional shipping method for * returning the returnItems. - * @param {rmaShippingOptions?} rmaShippingOptions - an optional list of rma shipping options for the swap * @param {Object} custom - contains relevant custom information. This object may * include no_notification which will disable sending notification when creating * swap. If set, it overrules the attribute inherited from the order. @@ -299,7 +298,6 @@ class SwapService extends BaseService { returnItems, additionalItems, returnShipping, - rmaShippingOptions = [], custom = { no_notification: undefined, } @@ -343,11 +341,6 @@ class SwapService extends BaseService { }) ) - const rma_shipping_options = rmaShippingOptions.map(so => ({ - shipping_option_id: so.option_id, - price: so.price, - })) - const evaluatedNoNotification = no_notification !== undefined ? no_notification : order.no_notification @@ -359,7 +352,6 @@ class SwapService extends BaseService { order_id: order.id, additional_items: newItems, no_notification: evaluatedNoNotification, - rma_shipping_options, }) const result = await swapRepo.save(created) @@ -531,7 +523,7 @@ class SwapService extends BaseService { * @returns {Promise} the swap with its cart_id prop set to the id of * the new cart. */ - async createCart(swapId) { + async createCart(swapId, customShippingOptions = []) { return this.atomicPhase_(async manager => { const swap = await this.retrieve(swapId, { relations: [ @@ -576,6 +568,10 @@ class SwapService extends BaseService { region_id: order.region_id, customer_id: order.customer_id, type: "swap", + custom_shipping_options: customShippingOptions.map(so => ({ + price: so.price, + shipping_option_id: so.option_id, + })), metadata: { swap_id: swap.id, parent_order_id: order.id, From 3d088c351b4c430832dc22750c01220310577279 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 7 Oct 2021 14:54:05 +0100 Subject: [PATCH 07/15] fix: more adjustments add: composite unique constraint for shipping_option_id and cart_id fix: fetchCartOptions to format custom shipping options like normal shipping options fix: addShippingMethod should throw when custom shipping options is not empty and no optionId corresponds to custom shipping options --- integration-tests/api/__tests__/store/cart.js | 28 +++++---- .../api/__tests__/store/shipping-options.js | 7 ++- ...3614437919-add_custom_shipping_options.ts} | 6 +- .../src/models/custom-shipping-option.ts | 2 + .../medusa/src/services/__tests__/cart.js | 57 +++++++------------ .../services/__tests__/shipping-profile.js | 18 ++++-- packages/medusa/src/services/cart.js | 54 ++++++++---------- .../medusa/src/services/shipping-profile.js | 12 ++-- 8 files changed, 87 insertions(+), 97 deletions(-) rename packages/medusa/src/migrations/{1633522106578-add_custom_shipping_options.ts => 1633614437919-add_custom_shipping_options.ts} (91%) diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index f857875b2b..b13953b446 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -5,6 +5,7 @@ const { GiftCard, Cart, CustomShippingOption, + ShippingOption, } = require("@medusajs/medusa") const setupServer = require("../../../helpers/setup-server") @@ -466,11 +467,6 @@ describe("/store/carts", () => { }) cartWithCustomSo = await manager.save(_cart) - - await manager.insert(CustomShippingOption, { - id: "orphan-cso", - price: 0, - }) } catch (err) { console.log(err) } @@ -497,8 +493,9 @@ describe("/store/carts", () => { expect(cartWithShippingMethod.status).toEqual(200) }) - it("given a cart with custom options and a custom option id already belonging to said cart, then it should add a shipping method based on the given custom shipping option", async () => { - const customOptionId = cartWithCustomSo.custom_shipping_options[0].id + it("given a cart with custom options and a shipping option already belonging to said cart, then it should add a shipping method based on the given custom shipping option", async () => { + const shippingOptionId = + cartWithCustomSo.custom_shipping_options[0].shipping_option_id const api = useApi() @@ -506,7 +503,7 @@ describe("/store/carts", () => { .post( "/store/carts/test-cart-with-cso/shipping-methods", { - option_id: customOptionId, + option_id: shippingOptionId, }, { withCredentials: true } ) @@ -515,27 +512,28 @@ describe("/store/carts", () => { expect( cartWithCustomShippingMethod.data.cart.shipping_methods ).toContainEqual( - expect.objectContaining({ shipping_option_id: "test-option", price: 5 }) + expect.objectContaining({ + shipping_option_id: shippingOptionId, + price: 5, + }) ) expect(cartWithCustomShippingMethod.status).toEqual(200) }) - it("given a cart with custom options and a custom option id not belonging to said cart, then it should throw a shipping option not found error", async () => { + it("given a cart with custom options and an option id not corresponding to any custom shipping option, then it should throw an invalid error", async () => { const api = useApi() try { await api.post( "/store/carts/test-cart-with-cso/shipping-methods", { - option_id: "orphan-cso", + option_id: "orphan-so", }, { withCredentials: true } ) } catch (err) { - expect(err.response.status).toEqual(404) - expect(err.response.data.message).toEqual( - "Shipping Option with orphan-cso was not found" - ) + expect(err.response.status).toEqual(400) + expect(err.response.data.message).toEqual("Wrong shipping option") } }) diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index f7d1e12de3..06814a5cf6 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -160,7 +160,7 @@ describe("/store/shipping-options", () => { ) }) - it("given a swap cart, when user retrieves its shipping options, then should return a list of custom shipping options", async () => { + it("given a cart with custom shipping options, when user retrieves its shipping options, then should return the list of custom shipping options", async () => { const api = useApi() const response = await api @@ -173,8 +173,9 @@ describe("/store/shipping-options", () => { expect(response.data.shipping_options).toEqual( expect.arrayContaining([ expect.objectContaining({ - shipping_option_id: "test-option", - price: 0, + id: "test-option", + amount: 0, + name: "test-option", }), ]) ) diff --git a/packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts b/packages/medusa/src/migrations/1633614437919-add_custom_shipping_options.ts similarity index 91% rename from packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts rename to packages/medusa/src/migrations/1633614437919-add_custom_shipping_options.ts index 17645022cd..3f7824e9ba 100644 --- a/packages/medusa/src/migrations/1633522106578-add_custom_shipping_options.ts +++ b/packages/medusa/src/migrations/1633614437919-add_custom_shipping_options.ts @@ -1,10 +1,10 @@ import {MigrationInterface, QueryRunner} from "typeorm"; -export class addCustomShippingOptions1633522106578 implements MigrationInterface { - name = 'addCustomShippingOptions1633522106578' +export class addCustomShippingOptions1633614437919 implements MigrationInterface { + name = 'addCustomShippingOptions1633614437919' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "custom_shipping_option" ("id" character varying NOT NULL, "price" integer NOT NULL, "shipping_option_id" character varying NOT NULL, "cart_id" character varying, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deleted_at" TIMESTAMP WITH TIME ZONE, "metadata" jsonb, CONSTRAINT "PK_8dfcb5c1172c29eec4a728420cc" PRIMARY KEY ("id"))`); + await queryRunner.query(`CREATE TABLE "custom_shipping_option" ("id" character varying NOT NULL, "price" integer NOT NULL, "shipping_option_id" character varying NOT NULL, "cart_id" character varying, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "deleted_at" TIMESTAMP WITH TIME ZONE, "metadata" jsonb, CONSTRAINT "UQ_0f838b122a9a01d921aa1cdb669" UNIQUE ("shipping_option_id", "cart_id"), CONSTRAINT "PK_8dfcb5c1172c29eec4a728420cc" PRIMARY KEY ("id"))`); await queryRunner.query(`CREATE INDEX "IDX_44090cb11b06174cbcc667e91c" ON "custom_shipping_option" ("shipping_option_id") `); await queryRunner.query(`CREATE INDEX "IDX_93caeb1bb70d37c1d36d6701a7" ON "custom_shipping_option" ("cart_id") `); await queryRunner.query(`ALTER TYPE "cart_type_enum" RENAME TO "cart_type_enum_old"`); diff --git a/packages/medusa/src/models/custom-shipping-option.ts b/packages/medusa/src/models/custom-shipping-option.ts index a8b904e77f..ebe8b3f960 100644 --- a/packages/medusa/src/models/custom-shipping-option.ts +++ b/packages/medusa/src/models/custom-shipping-option.ts @@ -7,6 +7,7 @@ import { JoinColumn, ManyToOne, PrimaryColumn, + Unique, UpdateDateColumn } from "typeorm"; import { ulid } from "ulid"; @@ -16,6 +17,7 @@ import { ShippingOption } from "./shipping-option"; @Entity() +@Unique(['shipping_option_id', 'cart_id']) export class CustomShippingOption { @PrimaryColumn() id: string diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index 499f2a8559..4b84178204 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -1308,65 +1308,50 @@ describe("CartService", () => { }) }) - describe("extractShippingOptionIdAndPrice", () => { + describe("findCustomShippingOption", () => { beforeEach(() => { jest.clearAllMocks() }) let cartService = new CartService({}) - it("given a cart with custom shipping options and a custom shipping option id, then it should return a normal shipping option id corresponding to the custom shipping option id and a customPrice", async () => { + it("given a cart with custom shipping options and a shipping option id corresponding to a custom shipping option, then it should return a custom shipping option", async () => { const cart = { id: "cart-with-so", custom_shipping_options: [ { id: "cso-test", shipping_option_id: "test-so", price: 20 }, ], } - const result = cartService.extractShippingOptionIdAndPrice( - cart, - "cso-test" - ) + const result = cartService.findCustomShippingOption(cart, "test-so") expect(result).toEqual({ - optionId: "test-so", - customPrice: { price: 20 }, + id: "cso-test", + shipping_option_id: "test-so", + price: 20, }) }) - it("given a cart with custom shipping options and a normal shipping option id, then it should return a normal shipping option id and empty customPrice", async () => { + it("given a cart with empty custom shipping options and shipping option id, then it should return undefined", async () => { const cart = { id: "cart-with-so", - custom_shipping_options: [ - { id: "cso-test", shipping_option_id: "test-so", price: 20 }, - ], + custom_shipping_options: [], } - const result = cartService.extractShippingOptionIdAndPrice( - cart, - "test-so" - ) + const result = cartService.findCustomShippingOption(cart, "test-so") - expect(result).toEqual({ - optionId: "test-so", - customPrice: {}, - }) + expect(result).toBeUndefined() }) - it("given a cart with custom shipping options and a custom shipping option id that does not belong to the cart, then it should return the custom shipping option id and empty customPrice", async () => { + it("given a cart with custom shipping options and a shipping option id that does not belong to the cart, then it should throw an invalid error", async () => { const cart = { id: "cart-with-so", custom_shipping_options: [ - { id: "cso-test", shipping_option_id: "test-so", price: 20 }, + { id: "cso-test", shipping_option_id: "test-so", price: 500 }, ], } - const result = cartService.extractShippingOptionIdAndPrice( - cart, - "cso-test-2" - ) - expect(result).toEqual({ - optionId: "cso-test-2", - customPrice: {}, - }) + expect(() => { + cartService.findCustomShippingOption(cart, "some-other-so") + }).toThrow(MedusaError) }) }) @@ -1545,27 +1530,25 @@ describe("CartService", () => { }) }) - it("adds a shipping method from a custom shipping option and custom price", async () => { + it("successfully adds a shipping method from a custom shipping option and custom price", async () => { const data = { id: "test", extra: "yes", } - cartService.extractShippingOptionIdAndPrice = jest + cartService.findCustomShippingOption = jest .fn() - .mockImplementation((cart, optionId) => { + .mockImplementation(cart => { if (cart.id === IdMap.getId("cart-with-custom-so")) { return { - optionId: IdMap.getId("test-so"), - customPrice: { price: 0 }, + price: 0, } } - return { optionId, customPrice: {} } }) await cartService.addShippingMethod( IdMap.getId("cart-with-custom-so"), - IdMap.getId("cso-test"), + IdMap.getId("test-so"), data ) expect(shippingOptionService.createShippingMethod).toHaveBeenCalledWith( diff --git a/packages/medusa/src/services/__tests__/shipping-profile.js b/packages/medusa/src/services/__tests__/shipping-profile.js index 9054e3a92a..92c9a5e802 100644 --- a/packages/medusa/src/services/__tests__/shipping-profile.js +++ b/packages/medusa/src/services/__tests__/shipping-profile.js @@ -207,14 +207,24 @@ describe("ShippingProfileService", () => { id: "swap-cart", type: "swap", custom_shipping_options: [ - { option_id: "test-option1", id: "cso-option1", price: 10 }, - { option_id: "test-option2", id: "cso-option2", price: 0 }, + { + shipping_option_id: "test-option1", + id: "cso-option1", + shipping_option: { id: "test-option1" }, + price: 10, + }, + { + shipping_option_id: "test-option2", + id: "cso-option2", + shipping_option: { id: "test-option2" }, + price: 0, + }, ], } await expect(profileService.fetchCartOptions(cart)).resolves.toEqual([ - expect.objectContaining({ id: "cso-option1" }), - expect.objectContaining({ id: "cso-option2" }), + expect.objectContaining({ id: "test-option1", amount: 10 }), + expect.objectContaining({ id: "test-option2", amount: 0 }), ]) }) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index f1b1b3b63f..d61507b551 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -1305,7 +1305,7 @@ class CartService extends BaseService { * @param {Object} data - the fulmillment data for the method * @return {Promise} the result of the update operation */ - async addShippingMethod(cartId, optionIdOrCustomOptionId, data) { + async addShippingMethod(cartId, optionId, data) { return this.atomicPhase_(async manager => { const cart = await this.retrieve(cartId, { select: ["subtotal"], @@ -1321,19 +1321,19 @@ class CartService extends BaseService { ], }) - let { optionId, customPrice } = this.extractShippingOptionIdAndPrice( - cart, - optionIdOrCustomOptionId - ) + let customShippingOption = this.findCustomShippingOption(cart, optionId) const { shipping_methods } = cart + const shippingMethodConfig = customShippingOption + ? { cart, price: customShippingOption.price } + : { + cart, + } + const newMethod = await this.shippingOptionService_ .withTransaction(manager) - .createShippingMethod(optionId, data, { - cart, - ...customPrice, - }) + .createShippingMethod(optionId, data, shippingMethodConfig) const methods = [newMethod] if (shipping_methods.length) { @@ -1374,32 +1374,26 @@ class CartService extends BaseService { } /** - * Adds the corresponding shipping method either from a normal or custom option to the list of shipping methods associated with - * the cart. + * Finds the cart's custom shipping option based on the passed option id. + * throws if custom options is not empty and no shipping option corresponds to optionId * @param {Object} cart - the cart object - * @param {string} optionIdOrCustomOptionId - id of the normal or custom shipping option to add as valid method - * @returns {{ optionId: string; customPrice: { price: number; } | {};}} + * @param {string} option - id of the normal or custom shipping option to add as valid method + * @returns {CustomShippingOption | undefined} */ - extractShippingOptionIdAndPrice(cart, optionIdOrCustomOptionId) { - if ( - cart.custom_shipping_options && - cart.custom_shipping_options.length > 0 - ) { - const customOption = cart.custom_shipping_options.find( - cso => cso.id === optionIdOrCustomOptionId + findCustomShippingOption(cart, optionId) { + let customOption = cart.custom_shipping_options?.find( + cso => cso.shipping_option_id === optionId + ) + const hasCustomOptions = cart.custom_shipping_options?.length + + if (hasCustomOptions && !customOption) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + "Wrong shipping option" ) - if (customOption) { - return { - optionId: customOption.shipping_option_id, - customPrice: { price: customOption.price }, - } - } } - return { - optionId: optionIdOrCustomOptionId, - customPrice: {}, - } + return customOption } /** diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index e4fb799289..3e68d77b20 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -410,13 +410,15 @@ class ShippingProfileService extends BaseService { * Finds all the shipping profiles that cover the products in a cart, and * validates all options that are available for the cart. * @param {Cart} cart - the cart object to find shipping options for - * @return {[ShippingOptions]} a list of the available shipping options + * @return {[ShippingOption]} a list of the available shipping options */ async fetchCartOptions(cart) { - const customShippingOptions = cart.custom_shipping_options - - if (customShippingOptions && customShippingOptions.length > 0) - return customShippingOptions + if (cart.custom_shipping_options?.length) { + return cart.custom_shipping_options.map(cso => ({ + ...cso.shipping_option, + amount: cso.price, + })) + } const profileIds = this.getProfilesInCart_(cart) From dba1d5bb69f02e822f883cc3081fc3c2e4e26dff Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Wed, 13 Oct 2021 17:06:35 +0100 Subject: [PATCH 08/15] fix: adjustments based on seb's feedback - remove eager from shipping_option relationship in `models/custom-shipping-options.ts` - remove custom_shipping_options relation from cart model --- .../api/__tests__/admin/order.js | 2 +- integration-tests/api/__tests__/store/cart.js | 12 +- .../api/__tests__/store/shipping-options.js | 2 +- integration-tests/api/helpers/swap-seeder.js | 16 ++- integration-tests/api/package.json | 6 +- integration-tests/api/yarn.lock | 70 +++++----- .../__tests__/list-shipping-options.js | 1 - .../shipping-options/list-shipping-options.js | 8 +- packages/medusa/src/models/cart.ts | 9 -- .../src/models/custom-shipping-option.ts | 2 +- .../repositories/custom-shipping-option.ts | 5 + .../medusa/src/services/__tests__/cart.js | 66 ++++----- .../__tests__/custom-shipping-option.js | 130 ++++++++++++++++++ .../services/__tests__/shipping-profile.js | 48 ++++--- .../medusa/src/services/__tests__/swap.js | 12 +- packages/medusa/src/services/cart.js | 27 ++-- .../src/services/custom-shipping-option.js | 112 +++++++++++++++ .../medusa/src/services/shipping-profile.js | 16 ++- packages/medusa/src/services/swap.js | 19 ++- 19 files changed, 424 insertions(+), 139 deletions(-) create mode 100644 packages/medusa/src/repositories/custom-shipping-option.ts create mode 100644 packages/medusa/src/services/__tests__/custom-shipping-option.js create mode 100644 packages/medusa/src/services/custom-shipping-option.js diff --git a/integration-tests/api/__tests__/admin/order.js b/integration-tests/api/__tests__/admin/order.js index eecfeee6dd..8fb15770ef 100644 --- a/integration-tests/api/__tests__/admin/order.js +++ b/integration-tests/api/__tests__/admin/order.js @@ -32,7 +32,7 @@ describe("/admin/orders", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd }) + medusaProcess = await setupServer({ cwd, verbose: true }) }) afterAll(async () => { diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index b13953b446..cad84175a0 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -30,7 +30,7 @@ describe("/store/carts", () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) try { dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd }) + medusaProcess = await setupServer({ cwd, verbose: true }) } catch (error) { console.log(error) } @@ -467,6 +467,13 @@ describe("/store/carts", () => { }) cartWithCustomSo = await manager.save(_cart) + + await manager.insert(CustomShippingOption, { + id: "another-cso-test", + cart_id: "test-cart-with-cso", + shipping_option_id: "test-option", + price: 5, + }) } catch (err) { console.log(err) } @@ -494,8 +501,7 @@ describe("/store/carts", () => { }) it("given a cart with custom options and a shipping option already belonging to said cart, then it should add a shipping method based on the given custom shipping option", async () => { - const shippingOptionId = - cartWithCustomSo.custom_shipping_options[0].shipping_option_id + const shippingOptionId = "test-option" const api = useApi() diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index 06814a5cf6..3235e878e4 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -16,7 +16,7 @@ describe("/store/shipping-options", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd }) + medusaProcess = await setupServer({ cwd, verbose: true }) }) afterAll(async () => { diff --git a/integration-tests/api/helpers/swap-seeder.js b/integration-tests/api/helpers/swap-seeder.js index 70ab54e11f..f3f098a637 100644 --- a/integration-tests/api/helpers/swap-seeder.js +++ b/integration-tests/api/helpers/swap-seeder.js @@ -15,6 +15,9 @@ const { Cart, Return, } = require("@medusajs/medusa") +const { + CustomShippingOption, +} = require("@medusajs/medusa/dist/models/custom-shipping-option") module.exports = async (connection, data = {}) => { const manager = connection.manager @@ -109,12 +112,6 @@ module.exports = async (connection, data = {}) => { billing_address_id: "test-billing-address", region_id: "test-region", type: "swap", - custom_shipping_options: [ - { - shipping_option_id: "test-option", - price: 0, - }, - ], metadata: { swap_id: "test-swap", parent_order_id: orderWithSwap.id, @@ -123,6 +120,13 @@ module.exports = async (connection, data = {}) => { await manager.save(cartWithCustomSo) + manager.insert(CustomShippingOption, { + id: "cso-test", + cart_id: cartWithCustomSo.id, + price: 0, + shipping_option_id: "test-option", + }) + const swapWithRMAMethod = manager.create(Swap, { id: "test-swap-rma", order_id: "order-with-swap", diff --git a/integration-tests/api/package.json b/integration-tests/api/package.json index a71da1bac7..7c694041db 100644 --- a/integration-tests/api/package.json +++ b/integration-tests/api/package.json @@ -8,15 +8,15 @@ "build": "babel src -d dist --extensions \".ts,.js\"" }, "dependencies": { - "@medusajs/medusa": "1.1.41-dev-1633520747607", - "medusa-interfaces": "1.1.23-dev-1633520747607", + "@medusajs/medusa": "1.1.41-dev-1634206968632", + "medusa-interfaces": "1.1.23-dev-1634206968632", "typeorm": "^0.2.31" }, "devDependencies": { "@babel/cli": "^7.12.10", "@babel/core": "^7.12.10", "@babel/node": "^7.12.10", - "babel-preset-medusa-package": "1.1.15-dev-1633520747607", + "babel-preset-medusa-package": "1.1.15-dev-1634206968632", "jest": "^26.6.3" } } diff --git a/integration-tests/api/yarn.lock b/integration-tests/api/yarn.lock index 4497855c7e..2fd0b45a7d 100644 --- a/integration-tests/api/yarn.lock +++ b/integration-tests/api/yarn.lock @@ -1223,10 +1223,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@medusajs/medusa-cli@1.1.18-dev-1633520747607": - version "1.1.18-dev-1633520747607" - resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.18-dev-1633520747607.tgz#46a3f73f6aff016f50a8123f47d69c64b7a52037" - integrity sha512-4KLnR6gq8R3sCAhOcYCI5SE+G9vyt2l6RyImvvPw7I03iDiNMc3URwoq2cFwV+V4dSrW59WFIlMJR7ALCTygdA== +"@medusajs/medusa-cli@1.1.18-dev-1634206968632": + version "1.1.18-dev-1634206968632" + resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.18-dev-1634206968632.tgz#26c12ed689f9d0485c14eccdd377b67bff505f90" + integrity sha512-oQwdVu2M2v5JRC+gwNXoL/fyGkH6nRaEBDG1rJk0YAmMawMxOIAAd/t1tMK16P69xK4eIUb4fkwX7BpC7kWKiA== dependencies: "@babel/polyfill" "^7.8.7" "@babel/runtime" "^7.9.6" @@ -1244,8 +1244,8 @@ is-valid-path "^0.1.1" joi-objectid "^3.0.1" meant "^1.0.1" - medusa-core-utils "1.1.22-dev-1633520747607" - medusa-telemetry "0.0.5-dev-1633520747607" + medusa-core-utils "1.1.22-dev-1634206968632" + medusa-telemetry "0.0.5-dev-1634206968632" netrc-parser "^3.1.6" open "^8.0.6" ora "^5.4.1" @@ -1259,13 +1259,13 @@ winston "^3.3.3" yargs "^15.3.1" -"@medusajs/medusa@1.1.41-dev-1633520747607": - version "1.1.41-dev-1633520747607" - resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.41-dev-1633520747607.tgz#82efd5b0bbaaaac76ce740dc9b35fe47c780592f" - integrity sha512-D+1WVpMWDaVki+Ti3rXYAl+3rb3eaX16BZ1RU/bG7FbhFJt8P1a1LXwMMQLV2rG/mUDgs6kDyl2qhYTzZ7X7aA== +"@medusajs/medusa@1.1.41-dev-1634206968632": + version "1.1.41-dev-1634206968632" + resolved "http://localhost:4873/@medusajs%2fmedusa/-/medusa-1.1.41-dev-1634206968632.tgz#f4fb24416aab594401d4a8de91f2bcd63f4078d9" + integrity sha512-3nbKX3vcB1sDCkt9FUs611ZxBrGGWBGArEXwtwHpJ/PScesPE1Gl9y+q8lfnu8NInYD3hw1Tpp4JMaOrfpifgw== dependencies: "@hapi/joi" "^16.1.8" - "@medusajs/medusa-cli" "1.1.18-dev-1633520747607" + "@medusajs/medusa-cli" "1.1.18-dev-1634206968632" "@types/lodash" "^4.14.168" awilix "^4.2.3" body-parser "^1.19.0" @@ -1287,8 +1287,8 @@ joi "^17.3.0" joi-objectid "^3.0.1" jsonwebtoken "^8.5.1" - medusa-core-utils "1.1.22-dev-1633520747607" - medusa-test-utils "1.1.25-dev-1633520747607" + medusa-core-utils "1.1.22-dev-1634206968632" + medusa-test-utils "1.1.25-dev-1634206968632" morgan "^1.9.1" multer "^1.4.2" passport "^0.4.0" @@ -1933,10 +1933,10 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" -babel-preset-medusa-package@1.1.15-dev-1633520747607: - version "1.1.15-dev-1633520747607" - resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.15-dev-1633520747607.tgz#ac970d565ac9803333bb5fecc7d16c162302c97b" - integrity sha512-XpU4J3xmdk8y2QRrxXFbkCq+9OzqUNeZlPAffiGlFTWYx0VRD4tZS4DWazrA5ub3RfqMFl/cxZA6NBcbJhZ/iQ== +babel-preset-medusa-package@1.1.15-dev-1634206968632: + version "1.1.15-dev-1634206968632" + resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.15-dev-1634206968632.tgz#752d6b645d0d09ad53d955bc823572b8d05ecda6" + integrity sha512-AvhdeUwC2uUnMFN9qA4oPDyZ+P0IO+rmiG/Udl7mssh43o3thDATllZSNbRBIwr4jy9M67oj+dbtrO6o8vJoBQ== dependencies: "@babel/plugin-proposal-class-properties" "^7.12.1" "@babel/plugin-proposal-decorators" "^7.12.1" @@ -5110,25 +5110,25 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -medusa-core-utils@1.1.22-dev-1633520747607: - version "1.1.22-dev-1633520747607" - resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.22-dev-1633520747607.tgz#d18c79e4ba9ee8b373bfc02024e23763f079ab87" - integrity sha512-pP1FdbrXbHqRxzMh2nKX6ByxtCrNSjJzOIJ45k1/Kl41VortD9EYiOpuLGOdodkD1jbuf6aV4x0zNIoWpGyHew== +medusa-core-utils@1.1.22-dev-1634206968632: + version "1.1.22-dev-1634206968632" + resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.22-dev-1634206968632.tgz#7eb0e6f95d8bd494aec706aa081ffbba8825e4ba" + integrity sha512-htkx9927dyEWdfOXw2xj58O7GPtPaTY5p9JO/Sja6LuN9QaotMPVrOkqy7drHiGtdn3IzjIMq4i7iub2DgJy0w== dependencies: joi "^17.3.0" joi-objectid "^3.0.1" -medusa-interfaces@1.1.23-dev-1633520747607: - version "1.1.23-dev-1633520747607" - resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.23-dev-1633520747607.tgz#9487b2979cee9784b219a2117cf7199fbfadceb7" - integrity sha512-jyoc0wemXrZBtJMA6e7FcdnB/7do7j6oyLevCon7A6HibqQkuxLZ7TfWLHGROj4qy8aP8sAvtuXq9gpwkIm3CQ== +medusa-interfaces@1.1.23-dev-1634206968632: + version "1.1.23-dev-1634206968632" + resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.23-dev-1634206968632.tgz#1b9de0742daf85ddeacb11424857f5d6cc75e8f0" + integrity sha512-8KsXxuMF+jFczyGa088DLVHzfejwD0X74g/AuXhCTkHbc52cbCZr9o7GMok7hfOCz7wp2kKUDBACL0y6PzxHrQ== dependencies: - medusa-core-utils "1.1.22-dev-1633520747607" + medusa-core-utils "1.1.22-dev-1634206968632" -medusa-telemetry@0.0.5-dev-1633520747607: - version "0.0.5-dev-1633520747607" - resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.5-dev-1633520747607.tgz#c8d23d5acf744eea8c88102a792b481051f84fb9" - integrity sha512-YX2hKGIANC0Ha9QKkMz5se9wDLJ940VEXwlMMGZzIRHoCoNpmxnsgXQXgeCtC1LKmlcaOaOzMqYyk19fgVCybQ== +medusa-telemetry@0.0.5-dev-1634206968632: + version "0.0.5-dev-1634206968632" + resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.5-dev-1634206968632.tgz#a9a1161aacfe0aaa476ba3ce3c15cb199c201cef" + integrity sha512-z3a5mXplM+XxkY3vJ8t159odgmkdMUHAWBZEM9PGaltkCh9Ew3RWkNXZeC60nW7tc85sfn1/nRxWpLgIywbruQ== dependencies: axios "^0.21.1" axios-retry "^3.1.9" @@ -5140,13 +5140,13 @@ medusa-telemetry@0.0.5-dev-1633520747607: remove-trailing-slash "^0.1.1" uuid "^8.3.2" -medusa-test-utils@1.1.25-dev-1633520747607: - version "1.1.25-dev-1633520747607" - resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.25-dev-1633520747607.tgz#7c283312d241e012ce9814841ab0fcb0e141245e" - integrity sha512-rW4GRGXlKBoqHeX3AvPWpV9R6AWe5CXEhDcTxxPNk/Nog8E8zBlWDHsff1057RagVIMjd4wkFx4Kz3mgUMgQAg== +medusa-test-utils@1.1.25-dev-1634206968632: + version "1.1.25-dev-1634206968632" + resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.25-dev-1634206968632.tgz#7306ff294c23bc2f229ae3112e8fc5b5ea362500" + integrity sha512-P+aa/Z7qywZt7z+6vj/owZhX8bHJCPsn1/Ak/9cGM0oJM/QGPzrQ00auikE13XyD95/53fPMh5G5mB8cJ+QbNg== dependencies: "@babel/plugin-transform-classes" "^7.9.5" - medusa-core-utils "1.1.22-dev-1633520747607" + medusa-core-utils "1.1.22-dev-1634206968632" randomatic "^3.1.1" merge-descriptors@1.0.1: diff --git a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js index 113e820266..256f0d461d 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-shipping-options.js @@ -29,7 +29,6 @@ describe("GET /store/shipping-options", () => { "items", "items.variant", "items.variant.product", - "custom_shipping_options", ], } ) diff --git a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js index bde062eacd..e89a9d92f0 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js @@ -37,13 +37,7 @@ export default async (req, res) => { const cart = await cartService.retrieve(value.cart_id, { select: ["subtotal"], - relations: [ - "region", - "items", - "items.variant", - "items.variant.product", - "custom_shipping_options", - ], + relations: ["region", "items", "items.variant", "items.variant.product"], }) const options = await shippingProfileService.fetchCartOptions(cart) diff --git a/packages/medusa/src/models/cart.ts b/packages/medusa/src/models/cart.ts index f5ea91a5de..5588d24c3b 100644 --- a/packages/medusa/src/models/cart.ts +++ b/packages/medusa/src/models/cart.ts @@ -44,8 +44,6 @@ * $ref: "#/components/schemas/payment_session" * payment: * $ref: "#/components/schemas/payment" - * custom_shipping_options: - * $ref: "#/components/schemas/custom_shipping_option" * shipping_methods: * type: array * items: @@ -221,13 +219,6 @@ export class Cart { @JoinColumn({ name: "payment_id" }) payment: Payment - @OneToMany( - () => CustomShippingOption, - method => method.cart, - { cascade: ["insert"] } - ) - custom_shipping_options: CustomShippingOption[] - @OneToMany( () => ShippingMethod, method => method.cart, diff --git a/packages/medusa/src/models/custom-shipping-option.ts b/packages/medusa/src/models/custom-shipping-option.ts index ebe8b3f960..04e7bfaf06 100644 --- a/packages/medusa/src/models/custom-shipping-option.ts +++ b/packages/medusa/src/models/custom-shipping-option.ts @@ -29,7 +29,7 @@ export class CustomShippingOption { @Column() shipping_option_id: string; - @ManyToOne(() => ShippingOption, { eager: true }) + @ManyToOne(() => ShippingOption) @JoinColumn({ name: "shipping_option_id" }) shipping_option: ShippingOption diff --git a/packages/medusa/src/repositories/custom-shipping-option.ts b/packages/medusa/src/repositories/custom-shipping-option.ts new file mode 100644 index 0000000000..07c9ebea18 --- /dev/null +++ b/packages/medusa/src/repositories/custom-shipping-option.ts @@ -0,0 +1,5 @@ +import { EntityRepository, Repository } from "typeorm" +import { CustomShippingOption } from './../models/custom-shipping-option'; + +@EntityRepository(CustomShippingOption) +export class CustomShippingOptionRepository extends Repository {} diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index 4b84178204..be537e6ab1 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -1316,13 +1316,10 @@ describe("CartService", () => { let cartService = new CartService({}) it("given a cart with custom shipping options and a shipping option id corresponding to a custom shipping option, then it should return a custom shipping option", async () => { - const cart = { - id: "cart-with-so", - custom_shipping_options: [ - { id: "cso-test", shipping_option_id: "test-so", price: 20 }, - ], - } - const result = cartService.findCustomShippingOption(cart, "test-so") + const cartCSO = [ + { id: "cso-test", shipping_option_id: "test-so", price: 20 }, + ] + const result = cartService.findCustomShippingOption(cartCSO, "test-so") expect(result).toEqual({ id: "cso-test", @@ -1332,25 +1329,20 @@ describe("CartService", () => { }) it("given a cart with empty custom shipping options and shipping option id, then it should return undefined", async () => { - const cart = { - id: "cart-with-so", - custom_shipping_options: [], - } - const result = cartService.findCustomShippingOption(cart, "test-so") + const cartCSO = [] + + const result = cartService.findCustomShippingOption(cartCSO, "test-so") expect(result).toBeUndefined() }) it("given a cart with custom shipping options and a shipping option id that does not belong to the cart, then it should throw an invalid error", async () => { - const cart = { - id: "cart-with-so", - custom_shipping_options: [ - { id: "cso-test", shipping_option_id: "test-so", price: 500 }, - ], - } + const cartCSO = [ + { id: "cso-test", shipping_option_id: "test-so", price: 500 }, + ] expect(() => { - cartService.findCustomShippingOption(cart, "some-other-so") + cartService.findCustomShippingOption(cartCSO, "some-other-so") }).toThrow(MedusaError) }) }) @@ -1373,13 +1365,6 @@ describe("CartService", () => { profile_id: IdMap.getId(m.profile), }, })), - custom_shipping_options: (config.custom_shipping_options || []).map( - cso => ({ - ...cso, - id: IdMap.getId(cso.id), - shipping_option_id: IdMap.getId(cso.shipping_option_id), - }) - ), discounts: [], } } @@ -1391,11 +1376,7 @@ describe("CartService", () => { const cart3 = buildCart("lines", { items: [{ id: "line", profile: "profile1" }], }) - const cartWithCustomSO = buildCart("cart-with-custom-so", { - custom_shipping_options: [ - { id: "cso-test", shipping_option_id: "test-so" }, - ], - }) + const cartWithCustomSO = buildCart("cart-with-custom-so") const cartRepository = MockRepository({ findOneWithRelations: (rels, q) => { @@ -1432,6 +1413,20 @@ describe("CartService", () => { }, } + const customShippingOptionService = { + list: jest.fn().mockImplementation(({ cart_id }) => { + if (cart_id === IdMap.getId("cart-with-custom-so")) { + return [ + { + id: "cso-test", + shipping_profile_id: "test-so", + cart_id: IdMap.getId("cart-with-custom-so"), + }, + ] + } + }), + } + const cartService = new CartService({ manager: MockManager, totalsService, @@ -1439,6 +1434,7 @@ describe("CartService", () => { shippingOptionService, lineItemService, eventBusService, + customShippingOptionService, }) beforeEach(() => { @@ -1538,11 +1534,9 @@ describe("CartService", () => { cartService.findCustomShippingOption = jest .fn() - .mockImplementation(cart => { - if (cart.id === IdMap.getId("cart-with-custom-so")) { - return { - price: 0, - } + .mockImplementation(cartCustomShippingOptions => { + return { + price: 0, } }) diff --git a/packages/medusa/src/services/__tests__/custom-shipping-option.js b/packages/medusa/src/services/__tests__/custom-shipping-option.js new file mode 100644 index 0000000000..a4a8d31cfb --- /dev/null +++ b/packages/medusa/src/services/__tests__/custom-shipping-option.js @@ -0,0 +1,130 @@ +import CustomShippingOptionService from "../custom-shipping-option" +import { MockManager, MockRepository, IdMap } from "medusa-test-utils" + +describe("CustomShippingOptionService", () => { + describe("list", () => { + const customShippingOptionRepository = MockRepository({ + find: q => { + return Promise.resolve([ + { + id: "cso-test", + shipping_option_id: "test-so", + price: 0, + cart_id: "test-cso-cart", + }, + ]) + }, + }) + + const customShippingOptionService = new CustomShippingOptionService({ + manager: MockManager, + customShippingOptionRepository, + }) + + beforeAll(async () => { + jest.clearAllMocks() + }) + + it("calls customShippingOptionRepository find method", async () => { + await customShippingOptionService.list( + { cart_id: "test-cso-cart" }, + { + relations: ["shipping_option"], + } + ) + expect(customShippingOptionRepository.find).toHaveBeenCalledTimes(1) + expect(customShippingOptionRepository.find).toHaveBeenCalledWith({ + where: { + cart_id: "test-cso-cart", + }, + relations: ["shipping_option"], + }) + }) + }) + + describe("retrieve", () => { + const customShippingOptionRepository = MockRepository({ + findOne: q => { + if (q.where.id === "cso-test") { + return Promise.resolve({ + id: "cso-test", + shipping_option_id: "test-so", + price: 0, + cart_id: "test-cso-cart", + }) + } + }, + }) + + const customShippingOptionService = new CustomShippingOptionService({ + manager: MockManager, + customShippingOptionRepository, + }) + + beforeAll(async () => { + jest.clearAllMocks() + }) + + it("calls customShippingOptionRepository findOne method", async () => { + await customShippingOptionService.retrieve("cso-test", { + relations: ["shipping_option", "cart"], + }) + + expect(customShippingOptionRepository.findOne).toHaveBeenCalledTimes(1) + expect(customShippingOptionRepository.findOne).toHaveBeenCalledWith({ + where: { id: "cso-test" }, + relations: ["shipping_option", "cart"], + }) + }) + + it("fails when custom shipping option is not found", async () => { + expect(customShippingOptionService.retrieve("bad-cso")).rejects.toThrow( + `Custom shipping option with id: bad-cso was not found.` + ) + }) + }) + + describe("create", () => { + const customShippingOptionRepository = MockRepository({ + create: jest + .fn() + .mockImplementation(f => Promise.resolve({ id: "test-cso", ...f })), + save: jest.fn().mockImplementation(f => Promise.resolve(f)), + }) + + const customShippingOptionService = new CustomShippingOptionService({ + manager: MockManager, + customShippingOptionRepository, + }) + + beforeAll(async () => { + jest.clearAllMocks() + }) + + it("calls customShippingOptionRepository create method", async () => { + const customShippingOption = { + cart_id: "test-cso-cart", + shipping_option_id: "test-so", + price: 30, + } + await customShippingOptionService.create(customShippingOption) + + expect(customShippingOptionRepository.create).toHaveBeenCalledTimes(1) + expect(customShippingOptionRepository.create).toHaveBeenCalledWith({ + cart_id: "test-cso-cart", + shipping_option_id: "test-so", + price: 30, + metadata: {}, + }) + + expect(customShippingOptionRepository.save).toHaveBeenCalledTimes(1) + expect(customShippingOptionRepository.save).toHaveBeenCalledWith({ + id: "test-cso", + cart_id: "test-cso-cart", + shipping_option_id: "test-so", + price: 30, + metadata: {}, + }) + }) + }) +}) diff --git a/packages/medusa/src/services/__tests__/shipping-profile.js b/packages/medusa/src/services/__tests__/shipping-profile.js index 92c9a5e802..b46737ebe6 100644 --- a/packages/medusa/src/services/__tests__/shipping-profile.js +++ b/packages/medusa/src/services/__tests__/shipping-profile.js @@ -192,43 +192,53 @@ describe("ShippingProfileService", () => { }, } + const customShippingOptionService = { + list: jest.fn().mockImplementation(({ cart_id }, config) => { + if (cart_id === "cso-cart") { + return Promise.resolve([ + { + id: "cso_1", + cart_id: "cso-cart", + shipping_option: { + id: "test-option", + amount: 200, + name: "Test option", + }, + price: 0, + }, + ]) + } + return Promise.resolve([]) + }), + } + const profileService = new ShippingProfileService({ manager: MockManager, shippingProfileRepository: profRepo, shippingOptionService, + customShippingOptionService, }) beforeEach(() => { jest.clearAllMocks() }) - it("given a swap cart with custom shipping options, should return correct custom shipping options ", async () => { + it("given a cart with custom shipping options, should return correct custom shipping options ", async () => { const cart = { - id: "swap-cart", + id: "cso-cart", type: "swap", - custom_shipping_options: [ - { - shipping_option_id: "test-option1", - id: "cso-option1", - shipping_option: { id: "test-option1" }, - price: 10, - }, - { - shipping_option_id: "test-option2", - id: "cso-option2", - shipping_option: { id: "test-option2" }, - price: 0, - }, - ], } await expect(profileService.fetchCartOptions(cart)).resolves.toEqual([ - expect.objectContaining({ id: "test-option1", amount: 10 }), - expect.objectContaining({ id: "test-option2", amount: 0 }), + expect.objectContaining({ + id: "test-option", + amount: 0, + name: "Test option", + }), ]) }) - it("given correct options when cart has no custom shipping options, should return normal shipping options", async () => { + it("given a cart with no custom shipping options, should return normal shipping options", async () => { const cart = { items: [ { diff --git a/packages/medusa/src/services/__tests__/swap.js b/packages/medusa/src/services/__tests__/swap.js index 4b5af9a5d5..7bbde84fb0 100644 --- a/packages/medusa/src/services/__tests__/swap.js +++ b/packages/medusa/src/services/__tests__/swap.js @@ -170,6 +170,14 @@ describe("SwapService", () => { findOneWithRelations: () => Promise.resolve(existing), }) + const customShippingOptionService = { + create: jest.fn().mockReturnValue(Promise.resolve({ id: "cso-test" })), + update: jest.fn().mockReturnValue(Promise.resolve()), + withTransaction: function() { + return this + }, + } + const lineItemService = { create: jest.fn().mockImplementation(d => Promise.resolve(d)), update: jest.fn().mockImplementation(d => Promise.resolve(d)), @@ -185,6 +193,7 @@ describe("SwapService", () => { swapRepository: swapRepo, cartService, lineItemService, + customShippingOptionService, }) it("finds swap and calls return create cart", async () => { @@ -216,9 +225,6 @@ describe("SwapService", () => { discounts: testOrder.discounts, region_id: testOrder.region_id, customer_id: testOrder.customer_id, - custom_shipping_options: [ - { shipping_option_id: "test-option", price: 10 }, - ], type: "swap", metadata: { swap_id: IdMap.getId("test-swap"), diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index d61507b551..1c5831295c 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -31,6 +31,7 @@ class CartService extends BaseService { addressRepository, paymentSessionRepository, inventoryService, + customShippingOptionService, }) { super() @@ -84,6 +85,9 @@ class CartService extends BaseService { /** @private @const {InventoryService} */ this.inventoryService_ = inventoryService + + /** @private @const {CustomShippingOptionService} */ + this.customShippingOptionService_ = customShippingOptionService } withTransaction(transactionManager) { @@ -109,6 +113,7 @@ class CartService extends BaseService { addressRepository: this.addressRepository_, giftCardService: this.giftCardService_, inventoryService: this.inventoryService_, + customShippingOptionService: this.customShippingOptionService_, }) cloned.transactionManager_ = transactionManager @@ -1317,11 +1322,17 @@ class CartService extends BaseService { "items.variant", "payment_sessions", "items.variant.product", - "custom_shipping_options", ], }) - let customShippingOption = this.findCustomShippingOption(cart, optionId) + let cartCustomShippingOptions = await this.customShippingOptionService_.list( + { cart_id: cart.id } + ) + + let customShippingOption = this.findCustomShippingOption( + cartCustomShippingOptions, + optionId + ) const { shipping_methods } = cart @@ -1374,17 +1385,17 @@ class CartService extends BaseService { } /** - * Finds the cart's custom shipping option based on the passed option id. + * Finds the cart's custom shipping options based on the passed option id. * throws if custom options is not empty and no shipping option corresponds to optionId - * @param {Object} cart - the cart object - * @param {string} option - id of the normal or custom shipping option to add as valid method + * @param {Object} cartCustomShippingOptions - the cart's custom shipping options + * @param {string} option - id of the normal or custom shipping option to find in the cartCustomShippingOptions * @returns {CustomShippingOption | undefined} */ - findCustomShippingOption(cart, optionId) { - let customOption = cart.custom_shipping_options?.find( + findCustomShippingOption(cartCustomShippingOptions, optionId) { + let customOption = cartCustomShippingOptions?.find( cso => cso.shipping_option_id === optionId ) - const hasCustomOptions = cart.custom_shipping_options?.length + const hasCustomOptions = cartCustomShippingOptions?.length if (hasCustomOptions && !customOption) { throw new MedusaError( diff --git a/packages/medusa/src/services/custom-shipping-option.js b/packages/medusa/src/services/custom-shipping-option.js new file mode 100644 index 0000000000..a8369e5a96 --- /dev/null +++ b/packages/medusa/src/services/custom-shipping-option.js @@ -0,0 +1,112 @@ +import { MedusaError } from "medusa-core-utils" +import { BaseService } from "medusa-interfaces" +import _ from "lodash" + +class CustomShippingOptionService extends BaseService { + constructor({ manager, customShippingOptionRepository }) { + super() + + /** @private @const {EntityManager} */ + this.manager_ = manager + + /** @private @const {customShippingOptionRepository} */ + this.customShippingOptionRepository_ = customShippingOptionRepository + } + + /** + * Sets the service's manager to a given transaction manager + * @param {EntityManager} manager - the manager to use + * @return {CustomShippingOptionService} a cloned CustomShippingOption service + */ + withTransaction(manager) { + if (!manager) { + return this + } + + const cloned = new CustomShippingOptionService({ + manager, + customShippingOptionRepository: this.customShippingOptionRepository_, + }) + + cloned.transactionManager_ = manager + return cloned + } + + /** + * Retrieves a specific shipping option. + * @param {string} id - the id of the custom shipping option to retrieve. + * @param {*} config - any options needed to query for the result. + * @returns {Promise} which resolves to the requested custom shipping option. + */ + async retrieve(id, config = {}) { + const customShippingOptionRepo = this.manager_.getCustomRepository( + this.customShippingOptionRepository_ + ) + + const validatedId = this.validateId_(id) + const query = this.buildQuery_({ id: validatedId }, config) + + const customShippingOption = await customShippingOptionRepo.findOne(query) + + if (!customShippingOption) { + throw new MedusaError( + MedusaError.Types.NOT_FOUND, + `Custom shipping option with id: ${id} was not found.` + ) + } + + return customShippingOption + } + + /** Fetches all custom shipping options related to the given selector + * @param {Object} selector - the query object for find + * @param {Object} config - the configuration used to find the objects. contains relations, skip, and take. + * @return {Promise} custom shipping options matching the query + */ + async list( + selector, + config = { + skip: 0, + take: 50, + relations: [], + } + ) { + const customShippingOptionRepo = this.manager_.getCustomRepository( + this.customShippingOptionRepository_ + ) + + const query = this.buildQuery_(selector, config) + + return customShippingOptionRepo.find(query) + } + + /** + * Creates a custom shipping option associated with a given author + * @param {object} data - the custom shipping option to create + * @param {*} config - any configurations if needed, including meta data + * @returns {Promise} resolves to the creation result + */ + async create(data, config = { metadata: {} }) { + const { metadata } = config + + const { cart_id, shipping_option_id, price } = data + + return this.atomicPhase_(async manager => { + const customShippingOptionRepo = manager.getCustomRepository( + this.customShippingOptionRepository_ + ) + + const customShippingOption = await customShippingOptionRepo.create({ + cart_id, + shipping_option_id, + price, + metadata, + }) + const result = await customShippingOptionRepo.save(customShippingOption) + + return result + }) + } +} + +export default CustomShippingOptionService diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index 3e68d77b20..3f1f121ce9 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -14,6 +14,7 @@ class ShippingProfileService extends BaseService { productService, productRepository, shippingOptionService, + customShippingOptionService, }) { super() @@ -31,6 +32,9 @@ class ShippingProfileService extends BaseService { /** @private @const {ShippingOptionService} */ this.shippingOptionService_ = shippingOptionService + + /** @private @const {CustomShippingOptionService} */ + this.customShippingOptionService_ = customShippingOptionService } withTransaction(transactionManager) { @@ -43,6 +47,7 @@ class ShippingProfileService extends BaseService { shippingProfileRepository: this.shippingProfileRepository_, productService: this.productService_, shippingOptionService: this.shippingOptionService_, + customShippingOptionService: this.customShippingOptionService_, }) cloned.transactionManager_ = transactionManager @@ -413,8 +418,15 @@ class ShippingProfileService extends BaseService { * @return {[ShippingOption]} a list of the available shipping options */ async fetchCartOptions(cart) { - if (cart.custom_shipping_options?.length) { - return cart.custom_shipping_options.map(cso => ({ + const customShippingOptions = await this.customShippingOptionService_.list( + { + cart_id: cart.id, + }, + { relations: ["shipping_option"] } + ) + + if (customShippingOptions?.length) { + return customShippingOptions.map(cso => ({ ...cso.shipping_option, amount: cso.price, })) diff --git a/packages/medusa/src/services/swap.js b/packages/medusa/src/services/swap.js index 074a7be1d3..4c081474aa 100644 --- a/packages/medusa/src/services/swap.js +++ b/packages/medusa/src/services/swap.js @@ -32,6 +32,7 @@ class SwapService extends BaseService { fulfillmentService, orderService, inventoryService, + customShippingOptionService, }) { super() @@ -70,6 +71,9 @@ class SwapService extends BaseService { /** @private @const {EventBusService} */ this.eventBus_ = eventBusService + + /** @private @const {CustomShippingOptionService} */ + this.customShippingOptionService_ = customShippingOptionService } withTransaction(transactionManager) { @@ -90,6 +94,7 @@ class SwapService extends BaseService { orderService: this.orderService_, inventoryService: this.inventoryService_, fulfillmentService: this.fulfillmentService_, + customShippingOptionService: this.customShippingOptionService_, }) cloned.transactionManager_ = transactionManager @@ -568,16 +573,22 @@ class SwapService extends BaseService { region_id: order.region_id, customer_id: order.customer_id, type: "swap", - custom_shipping_options: customShippingOptions.map(so => ({ - price: so.price, - shipping_option_id: so.option_id, - })), metadata: { swap_id: swap.id, parent_order_id: order.id, }, }) + for (const customShippingOption of customShippingOptions) { + await this.customShippingOptionService_ + .withTransaction(manager) + .create({ + cart_id: cart.id, + shipping_option_id: customShippingOption.option_id, + price: customShippingOption.price, + }) + } + for (const item of swap.additional_items) { await this.lineItemService_.withTransaction(manager).update(item.id, { cart_id: cart.id, From 36aeb4fffa662930db0172a8397ff3b928b0d5ec Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 14 Oct 2021 14:50:28 +0100 Subject: [PATCH 09/15] fix: remove verbose mode in integration test + fix jsdoc --- integration-tests/api/__tests__/admin/order.js | 2 +- integration-tests/api/__tests__/store/cart.js | 2 +- integration-tests/api/__tests__/store/shipping-options.js | 2 +- packages/medusa/src/services/custom-shipping-option.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integration-tests/api/__tests__/admin/order.js b/integration-tests/api/__tests__/admin/order.js index 8fb15770ef..eecfeee6dd 100644 --- a/integration-tests/api/__tests__/admin/order.js +++ b/integration-tests/api/__tests__/admin/order.js @@ -32,7 +32,7 @@ describe("/admin/orders", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd, verbose: true }) + medusaProcess = await setupServer({ cwd }) }) afterAll(async () => { diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index cad84175a0..cc1e39d956 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -30,7 +30,7 @@ describe("/store/carts", () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) try { dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd, verbose: true }) + medusaProcess = await setupServer({ cwd }) } catch (error) { console.log(error) } diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index 3235e878e4..06814a5cf6 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -16,7 +16,7 @@ describe("/store/shipping-options", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd, verbose: true }) + medusaProcess = await setupServer({ cwd }) }) afterAll(async () => { diff --git a/packages/medusa/src/services/custom-shipping-option.js b/packages/medusa/src/services/custom-shipping-option.js index a8369e5a96..df4c6e5d05 100644 --- a/packages/medusa/src/services/custom-shipping-option.js +++ b/packages/medusa/src/services/custom-shipping-option.js @@ -9,7 +9,7 @@ class CustomShippingOptionService extends BaseService { /** @private @const {EntityManager} */ this.manager_ = manager - /** @private @const {customShippingOptionRepository} */ + /** @private @const {CustomShippingOptionRepository} */ this.customShippingOptionRepository_ = customShippingOptionRepository } From 29c5a1f8d25c94285fc9ad0ac34d7f1bdcc54e87 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 14 Oct 2021 16:03:59 +0100 Subject: [PATCH 10/15] fix: store cart integration test by removing custom shipping options when creating a swap --- integration-tests/api/__tests__/store/cart.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/integration-tests/api/__tests__/store/cart.js b/integration-tests/api/__tests__/store/cart.js index 5b54e54165..27f3ba78de 100644 --- a/integration-tests/api/__tests__/store/cart.js +++ b/integration-tests/api/__tests__/store/cart.js @@ -458,7 +458,6 @@ describe("/store/carts", () => { }) describe("POST /store/carts/:id/shipping-methods", () => { - let cartWithCustomSo beforeEach(async () => { try { await cartSeeder(dbConnection) @@ -473,18 +472,12 @@ describe("/store/carts", () => { first_name: "lebron", country_code: "us", }, - custom_shipping_options: [ - { - shipping_option_id: "test-option", - price: 5, - }, - ], region_id: "test-region", currency_code: "usd", type: "swap", }) - cartWithCustomSo = await manager.save(_cart) + let cartWithCustomSo = await manager.save(_cart) await manager.insert(CustomShippingOption, { id: "another-cso-test", From 71d433c33583830fb7a3724154aa9918592888bd Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 14 Oct 2021 16:10:08 +0100 Subject: [PATCH 11/15] fix: remove custom shipping options from swapService create method call --- packages/medusa/src/services/__tests__/swap.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/medusa/src/services/__tests__/swap.js b/packages/medusa/src/services/__tests__/swap.js index 5801075e8f..b963de0173 100644 --- a/packages/medusa/src/services/__tests__/swap.js +++ b/packages/medusa/src/services/__tests__/swap.js @@ -336,8 +336,7 @@ describe("SwapService", () => { { id: IdMap.getId("return-shipping"), price: 20, - }, - [{ option_id: IdMap.getId("rmaso-option1"), price: 0 }] + } ) expect(lineItemService.generate).toHaveBeenCalledTimes(1) From f7c765945b65c55489be0372533fc556869b0d58 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Thu, 14 Oct 2021 16:14:20 +0100 Subject: [PATCH 12/15] fix: jsdoc custom shipping option service --- packages/medusa/src/services/custom-shipping-option.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/medusa/src/services/custom-shipping-option.js b/packages/medusa/src/services/custom-shipping-option.js index 01e7290746..e45c86331e 100644 --- a/packages/medusa/src/services/custom-shipping-option.js +++ b/packages/medusa/src/services/custom-shipping-option.js @@ -35,7 +35,7 @@ class CustomShippingOptionService extends BaseService { * Retrieves a specific shipping option. * @param {string} id - the id of the custom shipping option to retrieve. * @param {*} config - any options needed to query for the result. - * @return {Promise} which resolves to the requested custom shipping option. + * @return {Promise} which resolves to the requested custom shipping option. */ async retrieve(id, config = {}) { const customShippingOptionRepo = this.manager_.getCustomRepository( @@ -83,7 +83,7 @@ class CustomShippingOptionService extends BaseService { * Creates a custom shipping option associated with a given author * @param {object} data - the custom shipping option to create * @param {*} config - any configurations if needed, including meta data - * @return {Promise} resolves to the creation result + * @return {Promise} resolves to the creation result */ async create(data, config = { metadata: {} }) { const { metadata } = config From 569595d0bbe9cd19fcd94c0229dce3244c685b1e Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Fri, 15 Oct 2021 15:01:23 +0100 Subject: [PATCH 13/15] fix: include shipping profile and requirement relations when fetching custom shipping options --- .../api/__tests__/store/shipping-options.js | 2 +- integration-tests/api/helpers/swap-seeder.js | 12 ++++++ .../services/__tests__/shipping-profile.js | 39 +++++++++++++---- .../medusa/src/services/shipping-profile.js | 42 ++++++++++++------- 4 files changed, 72 insertions(+), 23 deletions(-) diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index 06814a5cf6..3235e878e4 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -16,7 +16,7 @@ describe("/store/shipping-options", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd }) + medusaProcess = await setupServer({ cwd, verbose: true }) }) afterAll(async () => { diff --git a/integration-tests/api/helpers/swap-seeder.js b/integration-tests/api/helpers/swap-seeder.js index f3f098a637..c35fcc08ef 100644 --- a/integration-tests/api/helpers/swap-seeder.js +++ b/integration-tests/api/helpers/swap-seeder.js @@ -120,6 +120,18 @@ module.exports = async (connection, data = {}) => { await manager.save(cartWithCustomSo) + const liRma = manager.create(LineItem, { + id: "test-item-rma", + title: "Line Item RMA", + description: "Line Item Desc", + thumbnail: "https://test.js/1234", + unit_price: 8000, + quantity: 1, + variant_id: "test-variant", + cart_id: "test-cart-rma", + }) + await manager.save(liRma) + manager.insert(CustomShippingOption, { id: "cso-test", cart_id: cartWithCustomSo.id, diff --git a/packages/medusa/src/services/__tests__/shipping-profile.js b/packages/medusa/src/services/__tests__/shipping-profile.js index b46737ebe6..e9078f26d7 100644 --- a/packages/medusa/src/services/__tests__/shipping-profile.js +++ b/packages/medusa/src/services/__tests__/shipping-profile.js @@ -176,8 +176,17 @@ describe("ShippingProfileService", () => { }) const shippingOptionService = { - list: jest.fn().mockImplementation(() => - Promise.resolve([ + list: jest.fn().mockImplementation(({ id }) => { + if (id && id.includes("test-option")) { + return Promise.resolve([ + { + id: "test-option", + amount: 1000, + name: "Test option", + }, + ]) + } + return Promise.resolve([ { id: "ship_1", }, @@ -185,7 +194,7 @@ describe("ShippingProfileService", () => { id: "ship_2", }, ]) - ), + }), validateCartOption: jest.fn().mockImplementation(s => s), withTransaction: function() { return this @@ -199,11 +208,7 @@ describe("ShippingProfileService", () => { { id: "cso_1", cart_id: "cso-cart", - shipping_option: { - id: "test-option", - amount: 200, - name: "Test option", - }, + shipping_option_id: "test-option", price: 0, }, ]) @@ -226,6 +231,24 @@ describe("ShippingProfileService", () => { it("given a cart with custom shipping options, should return correct custom shipping options ", async () => { const cart = { id: "cso-cart", + items: [ + { + variant: { + product: { + _id: IdMap.getId("product_1"), + profile_id: IdMap.getId("profile"), + }, + }, + }, + { + variant: { + product: { + _id: IdMap.getId("product_2"), + profile_id: IdMap.getId("profile"), + }, + }, + }, + ], type: "swap", } diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index 3f1f121ce9..7271f171c1 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -418,29 +418,43 @@ class ShippingProfileService extends BaseService { * @return {[ShippingOption]} a list of the available shipping options */ async fetchCartOptions(cart) { + const profileIds = this.getProfilesInCart_(cart) + + const selector = { + profile_id: profileIds, + admin_only: false, + } + const customShippingOptions = await this.customShippingOptionService_.list( { cart_id: cart.id, }, - { relations: ["shipping_option"] } + { select: ["id", "shipping_option_id", "price"] } ) - if (customShippingOptions?.length) { - return customShippingOptions.map(cso => ({ - ...cso.shipping_option, - amount: cso.price, - })) + const hasCustomShippingOptions = customShippingOptions?.length + // if there are custom shipping options associated with the cart, use those + if (hasCustomShippingOptions) { + selector.id = customShippingOptions.map(cso => cso.shipping_option_id) } - const profileIds = this.getProfilesInCart_(cart) + const rawOpts = await this.shippingOptionService_.list(selector, { + relations: ["requirements", "profile"], + }) - const rawOpts = await this.shippingOptionService_.list( - { - profile_id: profileIds, - admin_only: false, - }, - { relations: ["requirements", "profile"] } - ) + // if there are custom shipping options associated with the cart, return cart shipping options with custom price + if (hasCustomShippingOptions) { + return rawOpts.map(so => { + const customOption = customShippingOptions.find( + cso => cso.shipping_option_id === so.id + ) + + return { + ...so, + amount: customOption?.price, + } + }) + } const options = [] From 75e59ec6d540e19708929e8a76e97fdb1feef813 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Fri, 15 Oct 2021 16:50:13 +0200 Subject: [PATCH 14/15] fix: allow custom shipping options to bypass option requirements --- packages/medusa/src/services/cart.js | 115 +++++++++--------- .../medusa/src/services/shipping-option.js | 36 +++--- 2 files changed, 79 insertions(+), 72 deletions(-) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index 93c9ecb01b..24dcb514b9 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -160,7 +160,7 @@ class CartService extends BaseService { "total", ] - const totalsToSelect = select.filter(v => totalFields.includes(v)) + const totalsToSelect = select.filter((v) => totalFields.includes(v)) if (totalsToSelect.length > 0) { const relationSet = new Set(relations) relationSet.add("items") @@ -168,14 +168,14 @@ class CartService extends BaseService { relationSet.add("discounts") relationSet.add("discounts.rule") relationSet.add("discounts.rule.valid_for") - //relationSet.add("discounts.parent_discount") - //relationSet.add("discounts.parent_discount.rule") - //relationSet.add("discounts.parent_discount.regions") + // relationSet.add("discounts.parent_discount") + // relationSet.add("discounts.parent_discount.rule") + // relationSet.add("discounts.parent_discount.regions") relationSet.add("shipping_methods") relationSet.add("region") relations = [...relationSet] - select = select.filter(v => !totalFields.includes(v)) + select = select.filter((v) => !totalFields.includes(v)) } return { @@ -238,9 +238,8 @@ class CartService extends BaseService { const cartRepo = this.manager_.getCustomRepository(this.cartRepository_) const validatedId = this.validateId_(cartId) - const { select, relations, totalsToSelect } = this.transformQueryForTotals_( - options - ) + const { select, relations, totalsToSelect } = + this.transformQueryForTotals_(options) const query = { where: { id: validatedId }, @@ -275,7 +274,7 @@ class CartService extends BaseService { * @return {Promise} the result of the create operation */ async create(data) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cartRepo = manager.getCustomRepository(this.cartRepository_) const addressRepo = manager.getCustomRepository(this.addressRepository_) const { region_id } = data @@ -344,7 +343,7 @@ class CartService extends BaseService { * @retur {Promise} the result of the update operation */ async removeLineItem(cartId, lineItemId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: [ "items", @@ -354,7 +353,7 @@ class CartService extends BaseService { ], }) - const lineItem = cart.items.find(li => li.id === lineItemId) + const lineItem = cart.items.find((li) => li.id === lineItemId) if (!lineItem) { return cart } @@ -423,7 +422,7 @@ class CartService extends BaseService { * @return {Promise} the result of the update operation */ async addLineItem(cartId, lineItem) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: [ "shipping_methods", @@ -436,7 +435,7 @@ class CartService extends BaseService { let currentItem if (lineItem.should_merge) { - currentItem = cart.items.find(line => { + currentItem = cart.items.find((line) => { if (line.should_merge && line.variant_id === lineItem.variant_id) { return _.isEqual(line.metadata, lineItem.metadata) } @@ -502,13 +501,13 @@ class CartService extends BaseService { * @return {Promise} the result of the update operation */ async updateLineItem(cartId, lineItemId, lineItemUpdate) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: ["items", "payment_sessions"], }) // Ensure that the line item exists in the cart - const lineItemExists = cart.items.find(i => i.id === lineItemId) + const lineItemExists = cart.items.find((i) => i.id === lineItemId) if (!lineItemExists) { throw new MedusaError( MedusaError.Types.INVALID_DATA, @@ -555,7 +554,7 @@ class CartService extends BaseService { // if any free shipping discounts, we ensure to update shipping method amount if (shouldAdd) { await Promise.all( - cart.shipping_methods.map(async sm => { + cart.shipping_methods.map(async (sm) => { const smRepo = this.manager_.getCustomRepository( this.shippingMethodRepository_ ) @@ -570,7 +569,7 @@ class CartService extends BaseService { ) } else { await Promise.all( - cart.shipping_methods.map(async sm => { + cart.shipping_methods.map(async (sm) => { const smRepo = this.manager_.getCustomRepository( this.shippingMethodRepository_ ) @@ -586,7 +585,7 @@ class CartService extends BaseService { } async update(cartId, update) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cartRepo = manager.getCustomRepository(this.cartRepository_) const cart = await this.retrieve(cartId, { select: [ @@ -733,9 +732,7 @@ class CartService extends BaseService { * @return {Promise} the resultign customer object */ async createOrFetchUserFromEmail_(email) { - const schema = Validator.string() - .email() - .required() + const schema = Validator.string().email().required() const { value, error } = schema.validate(email.toLowerCase()) if (error) { throw new MedusaError( @@ -886,11 +883,12 @@ class CartService extends BaseService { if (discount.usage_limit) { discount.usage_count = discount.usage_count || 0 - if (discount.usage_limit === discount.usage_count) + if (discount.usage_limit === discount.usage_count) { throw new MedusaError( MedusaError.Types.NOT_ALLOWED, "Discount has been used maximum allowed times" ) + } } const today = new Date() @@ -942,7 +940,7 @@ class CartService extends BaseService { const toParse = [...cart.discounts, discount] let sawNotShipping = false - const newDiscounts = toParse.map(d => { + const newDiscounts = toParse.map((d) => { const drule = d.rule switch (drule.type) { case "free_shipping": @@ -972,7 +970,7 @@ class CartService extends BaseService { * @return {Promise} the resulting cart */ async removeDiscount(cartId, discountCode) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: [ "discounts", @@ -987,7 +985,7 @@ class CartService extends BaseService { await this.adjustFreeShipping_(cart, false) } - cart.discounts = cart.discounts.filter(d => d.code !== discountCode) + cart.discounts = cart.discounts.filter((d) => d.code !== discountCode) const cartRepo = manager.getCustomRepository(this.cartRepository_) @@ -1018,7 +1016,7 @@ class CartService extends BaseService { * Updates the currently selected payment session. */ async updatePaymentSession(cartId, update) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: ["payment_sessions"], }) @@ -1052,7 +1050,7 @@ class CartService extends BaseService { * @return {Promise} the resulting cart */ async authorizePayment(cartId, context = {}) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cartRepository = manager.getCustomRepository(this.cartRepository_) const cart = await this.retrieve(cartId, { @@ -1096,10 +1094,10 @@ class CartService extends BaseService { * Sets a payment method for a cart. * @param {string} cartId - the id of the cart to add payment method to * @param {PaymentMethod} paymentMethod - the method to be set to the cart - * @returns {Promise} result of update operation + * @return {Promise} result of update operation */ async setPaymentSession(cartId, providerId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const psRepo = manager.getCustomRepository(this.paymentSessionRepository_) const cart = await this.retrieve(cartId, { @@ -1128,13 +1126,13 @@ class CartService extends BaseService { } await Promise.all( - cart.payment_sessions.map(ps => { + cart.payment_sessions.map((ps) => { return psRepo.save({ ...ps, is_selected: null }) }) ) const sess = cart.payment_sessions.find( - ps => ps.provider_id === providerId + (ps) => ps.provider_id === providerId ) sess.is_selected = true @@ -1157,13 +1155,13 @@ class CartService extends BaseService { * amounts, currencies, etc. as well as make sure to filter payment sessions * that are not available for the cart's region. * @param {string} cartId - the id of the cart to set payment session for - * @returns {Promise} the result of the update operation. + * @return {Promise} the result of the update operation. */ async setPaymentSessions(cartOrCartId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const psRepo = manager.getCustomRepository(this.paymentSessionRepository_) - let cartId = + const cartId = typeof cartOrCartId === `string` ? cartOrCartId : cartOrCartId.id const cart = await this.retrieve(cartId, { select: [ @@ -1192,7 +1190,7 @@ class CartService extends BaseService { const region = cart.region // If there are existing payment sessions ensure that these are up to date - let seen = [] + const seen = [] if (cart.payment_sessions && cart.payment_sessions.length) { for (const session of cart.payment_sessions) { if ( @@ -1242,10 +1240,10 @@ class CartService extends BaseService { * @param {string} cartId - the id of the cart to remove from * @param {string} providerId - the id of the provider whoose payment session * should be removed. - * @returns {Promise} the resulting cart. + * @return {Promise} the resulting cart. */ async deletePaymentSession(cartId, providerId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: ["payment_sessions"], }) @@ -1283,10 +1281,10 @@ class CartService extends BaseService { * @param {string} cartId - the id of the cart to remove from * @param {string} providerId - the id of the provider whoose payment session * should be removed. - * @returns {Promise} the resulting cart. + * @return {Promise} the resulting cart. */ async refreshPaymentSession(cartId, providerId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: ["payment_sessions"], }) @@ -1325,7 +1323,7 @@ class CartService extends BaseService { * @return {Promise} the result of the update operation */ async addShippingMethod(cartId, optionId, data) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { select: ["subtotal"], relations: [ @@ -1341,19 +1339,24 @@ class CartService extends BaseService { ], }) - let cartCustomShippingOptions = await this.customShippingOptionService_.list( - { cart_id: cart.id } - ) + const cartCustomShippingOptions = + await this.customShippingOptionService_.list({ cart_id: cart.id }) - let customShippingOption = this.findCustomShippingOption( + const customShippingOption = this.findCustomShippingOption( cartCustomShippingOptions, optionId ) const { shipping_methods } = cart + /** + * If we have a custom shipping option configured we want the price + * override to take effect and do not want `validateCartOption` to check + * if requirements are met, hence we are not passing the entire cart, but + * just the id. + */ const shippingMethodConfig = customShippingOption - ? { cart, price: customShippingOption.price } + ? { cart_id: cart.id, price: customShippingOption.price } : { cart, } @@ -1410,11 +1413,11 @@ class CartService extends BaseService { * throws if custom options is not empty and no shipping option corresponds to optionId * @param {Object} cartCustomShippingOptions - the cart's custom shipping options * @param {string} option - id of the normal or custom shipping option to find in the cartCustomShippingOptions - * @returns {CustomShippingOption | undefined} + * @return {CustomShippingOption | undefined} */ findCustomShippingOption(cartCustomShippingOptions, optionId) { - let customOption = cartCustomShippingOptions?.find( - cso => cso.shipping_option_id === optionId + const customOption = cartCustomShippingOptions?.find( + (cso) => cso.shipping_option_id === optionId ) const hasCustomOptions = cartCustomShippingOptions?.length @@ -1455,7 +1458,7 @@ class CartService extends BaseService { if (cart.items.length) { cart.items = await Promise.all( cart.items - .map(async item => { + .map(async (item) => { const availablePrice = await this.productVariantService_ .getRegionPrice(item.variant_id, regionId) .catch(() => undefined) @@ -1534,20 +1537,20 @@ class CartService extends BaseService { } if (cart.discounts && cart.discounts.length) { - const newDiscounts = cart.discounts.map(d => { + const newDiscounts = cart.discounts.map((d) => { if (d.regions.find(({ id }) => id === regionId)) { return d } }) - cart.discounts = newDiscounts.filter(d => !!d) + cart.discounts = newDiscounts.filter((d) => !!d) } cart.gift_cards = [] if (cart.payment_sessions && cart.payment_sessions.length) { await Promise.all( - cart.payment_sessions.map(ps => + cart.payment_sessions.map((ps) => this.paymentProviderService_ .withTransaction(this.manager_) .deleteSession(ps) @@ -1561,11 +1564,11 @@ class CartService extends BaseService { /** * Deletes a cart from the database. Completed carts cannot be deleted. * @param {string} cartId - the id of the cart to delete - * @returns {Promise} the deleted cart or undefined if the cart was + * @return {Promise} the deleted cart or undefined if the cart was * not found. */ async delete(cartId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cart = await this.retrieve(cartId, { relations: [ "items", @@ -1605,7 +1608,7 @@ class CartService extends BaseService { * @return {Promise} resolves to the updated result. */ async setMetadata(cartId, key, value) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cartRepo = manager.getCustomRepository(this.cartRepository_) const validatedId = this.validateId_(cartId) @@ -1639,7 +1642,7 @@ class CartService extends BaseService { * @return {Promise} resolves to the updated result. */ async deleteMetadata(cartId, key) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const cartRepo = manager.getCustomRepository(this.cartRepository_) const validatedId = this.validateId_(cartId) diff --git a/packages/medusa/src/services/shipping-option.js b/packages/medusa/src/services/shipping-option.js index ad2cbf8724..70c532dc22 100644 --- a/packages/medusa/src/services/shipping-option.js +++ b/packages/medusa/src/services/shipping-option.js @@ -174,7 +174,7 @@ class ShippingOptionService extends BaseService { * @returns {Promise} the resulting shipping method */ async updateShippingMethod(id, update) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const methodRepo = manager.getCustomRepository(this.methodRepository_) const method = await methodRepo.findOne({ where: { id } }) @@ -203,7 +203,7 @@ class ShippingOptionService extends BaseService { * @param {string} id - the id of the option to use for the method. */ async deleteShippingMethod(sm) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const methodRepo = manager.getCustomRepository(this.methodRepository_) return methodRepo.remove(sm) }) @@ -217,7 +217,7 @@ class ShippingOptionService extends BaseService { * @returns {ShippingMethod} the resulting shipping method. */ async createShippingMethod(optionId, data, config) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const option = await this.retrieve(optionId, { relations: ["requirements"], }) @@ -255,6 +255,10 @@ class ShippingOptionService extends BaseService { toCreate.cart_id = config.cart.id } + if (config.cart_id) { + toCreate.cart_id = config.cart_id + } + if (config.return_id) { toCreate.return_id = config.return_id } @@ -303,7 +307,7 @@ class ShippingOptionService extends BaseService { } const subtotal = cart.subtotal - const requirementResults = option.requirements.map(requirement => { + const requirementResults = option.requirements.map((requirement) => { switch (requirement.type) { case "max_subtotal": return requirement.amount > subtotal @@ -332,7 +336,7 @@ class ShippingOptionService extends BaseService { * @return {Promise} the result of the create operation */ async create(data) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const optionRepo = manager.getCustomRepository(this.optionRepository_) const option = await optionRepo.create(data) @@ -370,7 +374,7 @@ class ShippingOptionService extends BaseService { for (const r of data.requirements) { const validated = await this.validateRequirement_(r) - if (acc.find(raw => raw.type === validated.type)) { + if (acc.find((raw) => raw.type === validated.type)) { throw new MedusaError( MedusaError.Types.INVALID_DATA, "Only one requirement of each type is allowed" @@ -379,7 +383,7 @@ class ShippingOptionService extends BaseService { if ( acc.find( - raw => + (raw) => (raw.type === "max_subtotal" && validated.amount > raw.amount) || (raw.type === "min_subtotal" && validated.amount < raw.amount) @@ -449,7 +453,7 @@ class ShippingOptionService extends BaseService { * @return {Promise} resolves to the update result. */ async update(optionId, update) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const option = await this.retrieve(optionId, { relations: ["requirements"], }) @@ -477,7 +481,7 @@ class ShippingOptionService extends BaseService { for (const r of update.requirements) { const validated = await this.validateRequirement_(r, optionId) - if (acc.find(raw => raw.type === validated.type)) { + if (acc.find((raw) => raw.type === validated.type)) { throw new MedusaError( MedusaError.Types.INVALID_DATA, "Only one requirement of each type is allowed" @@ -486,7 +490,7 @@ class ShippingOptionService extends BaseService { if ( acc.find( - raw => + (raw) => (raw.type === "max_subtotal" && validated.amount > raw.amount) || (raw.type === "min_subtotal" && validated.amount < raw.amount) @@ -502,12 +506,12 @@ class ShippingOptionService extends BaseService { } if (option.requirements) { - const accReqs = acc.map(a => a.id) + const accReqs = acc.map((a) => a.id) const toRemove = option.requirements.filter( - r => !accReqs.includes(r.id) + (r) => !accReqs.includes(r.id) ) await Promise.all( - toRemove.map(async req => { + toRemove.map(async (req) => { await this.removeRequirement(req.id) }) ) @@ -579,13 +583,13 @@ class ShippingOptionService extends BaseService { * @return {Promise} the result of update */ async addRequirement(optionId, requirement) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { const option = await this.retrieve(optionId, { relations: ["requirements"], }) const validatedReq = await this.validateRequirement_(requirement) - if (option.requirements.find(r => r.type === validatedReq.type)) { + if (option.requirements.find((r) => r.type === validatedReq.type)) { throw new MedusaError( MedusaError.Types.DUPLICATE_ERROR, `A requirement with type: ${validatedReq.type} already exists` @@ -605,7 +609,7 @@ class ShippingOptionService extends BaseService { * @return {Promise} the result of update */ async removeRequirement(requirementId) { - return this.atomicPhase_(async manager => { + return this.atomicPhase_(async (manager) => { try { const reqRepo = manager.getCustomRepository(this.requirementRepository_) const requirement = await reqRepo.findOne({ From fe34ab5976003fcbd45b0e5a855a050ec4688a09 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Fri, 15 Oct 2021 20:00:27 +0200 Subject: [PATCH 15/15] fix: tests --- .../api/__tests__/admin/__snapshots__/auth.js.snap | 14 -------------- .../api/__tests__/store/shipping-options.js | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap b/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap index bd72f27516..0824e3c74c 100644 --- a/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap +++ b/integration-tests/api/__tests__/admin/__snapshots__/auth.js.snap @@ -13,17 +13,3 @@ Object { "updated_at": Any, } `; - -exports[`/admin/discounts creates admin session correctly 1`] = ` -Object { - "api_token": "test_token", - "created_at": Any, - "deleted_at": null, - "email": "admin@medusa.js", - "first_name": null, - "id": "admin_user", - "last_name": null, - "metadata": null, - "updated_at": Any, -} -`; diff --git a/integration-tests/api/__tests__/store/shipping-options.js b/integration-tests/api/__tests__/store/shipping-options.js index 3235e878e4..06814a5cf6 100644 --- a/integration-tests/api/__tests__/store/shipping-options.js +++ b/integration-tests/api/__tests__/store/shipping-options.js @@ -16,7 +16,7 @@ describe("/store/shipping-options", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd, verbose: true }) + medusaProcess = await setupServer({ cwd }) }) afterAll(async () => {