feat: update and cancel swaps, claims, and returns (#310)
This commit is contained in:
@@ -1,49 +1,49 @@
|
||||
const path = require("path");
|
||||
const path = require("path")
|
||||
|
||||
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 draftOrderSeeder = require("../../helpers/draft-order-seeder");
|
||||
const adminSeeder = require("../../helpers/admin-seeder");
|
||||
const draftOrderSeeder = require("../../helpers/draft-order-seeder")
|
||||
const adminSeeder = require("../../helpers/admin-seeder")
|
||||
|
||||
jest.setTimeout(30000);
|
||||
jest.setTimeout(30000)
|
||||
|
||||
describe("/admin/draft-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("POST /admin/draft-orders", () => {
|
||||
beforeEach(async () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await draftOrderSeeder(dbConnection);
|
||||
await adminSeeder(dbConnection)
|
||||
await draftOrderSeeder(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 draft order cart", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "oli@test.dk",
|
||||
@@ -62,7 +62,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -71,13 +71,13 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
expect(response.status).toEqual(200);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
expect(response.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("creates a draft order cart and creates new user", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "non-existing@test.dk",
|
||||
@@ -96,7 +96,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -105,19 +105,19 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
const draftOrder = response.data.draft_order;
|
||||
const draftOrder = response.data.draft_order
|
||||
|
||||
expect(draftOrder.cart.customer_id).toBeDefined();
|
||||
expect(draftOrder.cart.email).toEqual("non-existing@test.dk");
|
||||
});
|
||||
expect(draftOrder.cart.customer_id).toBeDefined()
|
||||
expect(draftOrder.cart.email).toEqual("non-existing@test.dk")
|
||||
})
|
||||
|
||||
it("fails to create a draft order with option requirement", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "oli@test.dk",
|
||||
@@ -136,7 +136,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option-req",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -145,13 +145,13 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
return err.response;
|
||||
});
|
||||
expect(response.status).toEqual(400);
|
||||
});
|
||||
return err.response
|
||||
})
|
||||
expect(response.status).toEqual(400)
|
||||
})
|
||||
|
||||
it("creates a draft order with option requirement", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "oli@test.dk",
|
||||
@@ -175,7 +175,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option-req",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -184,13 +184,13 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
expect(response.status).toEqual(200);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
expect(response.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("creates a draft order with custom item", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "oli@test.dk",
|
||||
@@ -214,7 +214,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -223,13 +223,13 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
expect(response.status).toEqual(200);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
expect(response.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("creates a draft order with product variant with custom price and custom item price set to 0", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "oli@test.dk",
|
||||
@@ -255,7 +255,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -264,8 +264,8 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
const created = await api
|
||||
.get(`/admin/draft-orders/${response.data.draft_order.id}`, {
|
||||
@@ -274,10 +274,10 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
expect(created.data.draft_order.cart.items).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
@@ -288,17 +288,17 @@ describe("/admin/draft-orders", () => {
|
||||
unit_price: 0,
|
||||
}),
|
||||
])
|
||||
);
|
||||
)
|
||||
// Check that discount is applied
|
||||
expect(created.data.draft_order.cart.discounts[0]).toEqual(
|
||||
expect.objectContaining({
|
||||
code: "TEST",
|
||||
})
|
||||
);
|
||||
});
|
||||
)
|
||||
})
|
||||
|
||||
it("creates a draft order with created shipping address", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const payload = {
|
||||
email: "oli@test.dk",
|
||||
@@ -329,7 +329,7 @@ describe("/admin/draft-orders", () => {
|
||||
option_id: "test-option",
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
const response = await api
|
||||
.post("/admin/draft-orders", payload, {
|
||||
@@ -338,13 +338,13 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
expect(response.status).toEqual(200);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
expect(response.status).toEqual(200)
|
||||
})
|
||||
|
||||
it("creates a draft order and registers manual payment", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
// register system payment for draft order
|
||||
const orderResponse = await api.post(
|
||||
@@ -355,7 +355,7 @@ describe("/admin/draft-orders", () => {
|
||||
Authorization: "Bearer test_token",
|
||||
},
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
const createdOrder = await api.get(
|
||||
`/admin/orders/${orderResponse.data.order.id}`,
|
||||
@@ -364,7 +364,7 @@ describe("/admin/draft-orders", () => {
|
||||
Authorization: "Bearer test_token",
|
||||
},
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
const updatedDraftOrder = await api.get(
|
||||
`/admin/draft-orders/test-draft-order`,
|
||||
@@ -373,40 +373,38 @@ describe("/admin/draft-orders", () => {
|
||||
Authorization: "Bearer test_token",
|
||||
},
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
expect(orderResponse.status).toEqual(200);
|
||||
expect(orderResponse.status).toEqual(200)
|
||||
// expect newly created order to have id of draft order and system payment
|
||||
expect(createdOrder.data.order.draft_order_id).toEqual(
|
||||
"test-draft-order"
|
||||
);
|
||||
expect(createdOrder.data.order.draft_order_id).toEqual("test-draft-order")
|
||||
expect(createdOrder.data.order.payments).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ provider_id: "system" }),
|
||||
])
|
||||
);
|
||||
)
|
||||
// expect draft order to be complete
|
||||
expect(updatedDraftOrder.data.draft_order.status).toEqual("completed");
|
||||
expect(updatedDraftOrder.data.draft_order.completed_at).not.toEqual(null);
|
||||
});
|
||||
});
|
||||
expect(updatedDraftOrder.data.draft_order.status).toEqual("completed")
|
||||
expect(updatedDraftOrder.data.draft_order.completed_at).not.toEqual(null)
|
||||
})
|
||||
})
|
||||
describe("GET /admin/draft-orders", () => {
|
||||
beforeEach(async () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await draftOrderSeeder(dbConnection);
|
||||
await adminSeeder(dbConnection)
|
||||
await draftOrderSeeder(dbConnection)
|
||||
} catch (err) {
|
||||
throw err;
|
||||
throw err
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
const db = useDb();
|
||||
await db.teardown();
|
||||
});
|
||||
const db = useDb()
|
||||
await db.teardown()
|
||||
})
|
||||
|
||||
it("lists draft orders", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.get("/admin/draft-orders", {
|
||||
@@ -415,20 +413,20 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(response.data.draft_orders).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ id: "test-draft-order" }),
|
||||
])
|
||||
);
|
||||
});
|
||||
)
|
||||
})
|
||||
|
||||
it("lists draft orders with query", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.get("/admin/draft-orders?q=oli@test", {
|
||||
@@ -437,10 +435,10 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(response.data.draft_orders).toEqual(
|
||||
expect.arrayContaining([
|
||||
@@ -448,11 +446,11 @@ describe("/admin/draft-orders", () => {
|
||||
cart: expect.objectContaining({ email: "oli@test.dk" }),
|
||||
}),
|
||||
])
|
||||
);
|
||||
});
|
||||
)
|
||||
})
|
||||
|
||||
it("lists no draft orders on query for non-existing email", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.get("/admin/draft-orders?q=heyo@heyo.dk", {
|
||||
@@ -461,34 +459,34 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(response.data.draft_orders).toEqual([]);
|
||||
expect(response.data.count).toEqual(0);
|
||||
});
|
||||
});
|
||||
expect(response.data.draft_orders).toEqual([])
|
||||
expect(response.data.count).toEqual(0)
|
||||
})
|
||||
})
|
||||
|
||||
describe("DELETE /admin/draft-orders/:id", () => {
|
||||
beforeEach(async () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await draftOrderSeeder(dbConnection);
|
||||
await adminSeeder(dbConnection)
|
||||
await draftOrderSeeder(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("deletes a draft order", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.delete("/admin/draft-orders/test-draft-order", {
|
||||
@@ -497,36 +495,36 @@ describe("/admin/draft-orders", () => {
|
||||
},
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
expect(response.data).toEqual({
|
||||
id: "test-draft-order",
|
||||
object: "draft-order",
|
||||
deleted: true,
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("POST /admin/draft-orders/:id/line-items/:line_id", () => {
|
||||
beforeEach(async () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await draftOrderSeeder(dbConnection, { status: "open" });
|
||||
await adminSeeder(dbConnection)
|
||||
await draftOrderSeeder(dbConnection, { status: "open" })
|
||||
} catch (err) {
|
||||
throw err;
|
||||
throw err
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
const db = useDb();
|
||||
await db.teardown();
|
||||
});
|
||||
const db = useDb()
|
||||
await db.teardown()
|
||||
})
|
||||
|
||||
it("updates a line item on the draft order", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.post(
|
||||
@@ -542,10 +540,10 @@ describe("/admin/draft-orders", () => {
|
||||
}
|
||||
)
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
const updatedDraftOrder = await api.get(
|
||||
`/admin/draft-orders/test-draft-order`,
|
||||
@@ -554,16 +552,16 @@ describe("/admin/draft-orders", () => {
|
||||
Authorization: "Bearer test_token",
|
||||
},
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
const item = updatedDraftOrder.data.draft_order.cart.items[0];
|
||||
const item = updatedDraftOrder.data.draft_order.cart.items[0]
|
||||
|
||||
expect(item.title).toEqual("Update title");
|
||||
expect(item.unit_price).toEqual(1000);
|
||||
});
|
||||
expect(item.title).toEqual("Update title")
|
||||
expect(item.unit_price).toEqual(1000)
|
||||
})
|
||||
|
||||
it("removes the line item, if quantity is 0", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.post(
|
||||
@@ -579,10 +577,10 @@ describe("/admin/draft-orders", () => {
|
||||
}
|
||||
)
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
const updatedDraftOrder = await api.get(
|
||||
`/admin/draft-orders/test-draft-order`,
|
||||
@@ -591,31 +589,31 @@ describe("/admin/draft-orders", () => {
|
||||
Authorization: "Bearer test_token",
|
||||
},
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
const items = updatedDraftOrder.data.draft_order.cart.items;
|
||||
const items = updatedDraftOrder.data.draft_order.cart.items
|
||||
|
||||
expect(items).toEqual([]);
|
||||
});
|
||||
});
|
||||
expect(items).toEqual([])
|
||||
})
|
||||
})
|
||||
|
||||
describe("POST /admin/draft-orders/:id", () => {
|
||||
beforeEach(async () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await draftOrderSeeder(dbConnection, { status: "open" });
|
||||
await adminSeeder(dbConnection)
|
||||
await draftOrderSeeder(dbConnection, { status: "open" })
|
||||
} catch (err) {
|
||||
throw err;
|
||||
throw err
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
afterEach(async () => {
|
||||
const db = useDb();
|
||||
await db.teardown();
|
||||
});
|
||||
const db = useDb()
|
||||
await db.teardown()
|
||||
})
|
||||
|
||||
it("updates a line item on the draft order", async () => {
|
||||
const api = useApi();
|
||||
const api = useApi()
|
||||
|
||||
const response = await api
|
||||
.post(
|
||||
@@ -647,10 +645,10 @@ describe("/admin/draft-orders", () => {
|
||||
}
|
||||
)
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
console.log(err)
|
||||
})
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.status).toEqual(200)
|
||||
|
||||
const updatedDraftOrder = await api.get(
|
||||
`/admin/draft-orders/test-draft-order`,
|
||||
@@ -659,14 +657,14 @@ describe("/admin/draft-orders", () => {
|
||||
Authorization: "Bearer test_token",
|
||||
},
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
const dorder = updatedDraftOrder.data.draft_order;
|
||||
const dorder = updatedDraftOrder.data.draft_order
|
||||
|
||||
expect(dorder.cart.email).toEqual("lebron@james.com");
|
||||
expect(dorder.cart.billing_address.first_name).toEqual("lebron");
|
||||
expect(dorder.cart.shipping_address.last_name).toEqual("james");
|
||||
expect(dorder.cart.discounts[0].code).toEqual("TEST");
|
||||
});
|
||||
});
|
||||
});
|
||||
expect(dorder.cart.email).toEqual("lebron@james.com")
|
||||
expect(dorder.cart.billing_address.first_name).toEqual("lebron")
|
||||
expect(dorder.cart.shipping_address.last_name).toEqual("james")
|
||||
expect(dorder.cart.discounts[0].code).toEqual("TEST")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -13,6 +13,14 @@ 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 {
|
||||
expectPostCallToReturn,
|
||||
expectAllPostCallsToReturn,
|
||||
callGet,
|
||||
partial,
|
||||
} = require("../../helpers/call-helpers");
|
||||
|
||||
jest.setTimeout(30000);
|
||||
|
||||
@@ -70,6 +78,8 @@ describe("/admin/orders", () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await orderSeeder(dbConnection);
|
||||
await swapSeeder(dbConnection);
|
||||
await claimSeeder(dbConnection);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
throw err;
|
||||
@@ -217,6 +227,7 @@ describe("/admin/orders", () => {
|
||||
try {
|
||||
await adminSeeder(dbConnection);
|
||||
await orderSeeder(dbConnection);
|
||||
await claimSeeder(dbConnection);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
throw err;
|
||||
@@ -411,6 +422,7 @@ describe("/admin/orders", () => {
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
|
||||
expect(response.data.order.claims[0].claim_items).toEqual(
|
||||
@@ -738,6 +750,58 @@ describe("/admin/orders", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it("Only allow canceling claim after canceling fulfillments", async () => {
|
||||
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 expectCancelToReturn = partial(expectPostCallToReturn, {
|
||||
path: `/admin/orders/${order_id}/claims/${claim_id}/cancel`,
|
||||
});
|
||||
|
||||
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 });
|
||||
});
|
||||
|
||||
it("Only allow canceling claim after canceling returns", async () => {
|
||||
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 expectCancelToReturn = partial(expectPostCallToReturn, {
|
||||
path: `/admin/orders/${order_id}/claims/${claim_id}/cancel`,
|
||||
});
|
||||
|
||||
await expectCancelToReturn({ code: 400 });
|
||||
|
||||
await expectPostCallToReturn({
|
||||
code: 200,
|
||||
path: `/admin/returns/${claim.return_order.id}/cancel`,
|
||||
});
|
||||
|
||||
await expectCancelToReturn({ code: 200 });
|
||||
});
|
||||
|
||||
it("fails to creates a claim due to no stock on additional items", async () => {
|
||||
const api = useApi();
|
||||
try {
|
||||
@@ -935,6 +999,20 @@ describe("/admin/orders", () => {
|
||||
expect.objectContaining({
|
||||
id: "test-order",
|
||||
}),
|
||||
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-c",
|
||||
}),
|
||||
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-s",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-f",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-r",
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -955,6 +1033,19 @@ describe("/admin/orders", () => {
|
||||
expect.objectContaining({
|
||||
id: "test-order",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-c",
|
||||
}),
|
||||
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-s",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-f",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-r",
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -991,6 +1082,19 @@ describe("/admin/orders", () => {
|
||||
expect.objectContaining({
|
||||
id: "test-order",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-c",
|
||||
}),
|
||||
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-s",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-f",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-r",
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -1027,8 +1131,72 @@ describe("/admin/orders", () => {
|
||||
expect.objectContaining({
|
||||
id: "test-order",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-c",
|
||||
}),
|
||||
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-s",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-f",
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: "test-order-w-r",
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
it.each([
|
||||
[
|
||||
"returns",
|
||||
"test-order-w-r",
|
||||
(o) => o.returns,
|
||||
(r) => `/admin/returns/${r.id}/cancel`,
|
||||
],
|
||||
[
|
||||
"swaps",
|
||||
"test-order-w-s",
|
||||
(o) => o.swaps,
|
||||
(s) => `/admin/orders/test-order-w-s/swaps/${s.id}/cancel`,
|
||||
],
|
||||
[
|
||||
"claims",
|
||||
"test-order-w-c",
|
||||
(o) => o.claims,
|
||||
(c) => `/admin/orders/test-order-w-c/claims/${c.id}/cancel`,
|
||||
],
|
||||
[
|
||||
"fulfillments",
|
||||
"test-order-w-f",
|
||||
(o) => o.fulfillments,
|
||||
(f) => `/admin/orders/test-order-w-f/fulfillments/${f.id}/cancel`,
|
||||
],
|
||||
])(
|
||||
"Only allows canceling order after canceling %s",
|
||||
async (id, o, of, pf) => {
|
||||
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 expectAllPostCallsToReturn({
|
||||
code: 200,
|
||||
col: of(order),
|
||||
pathf: pf,
|
||||
});
|
||||
|
||||
await expectCanceltoReturn({ code: 200 });
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
describe("POST /admin/orders/:id/swaps", () => {
|
||||
@@ -1290,5 +1458,59 @@ describe("/admin/orders", () => {
|
||||
|
||||
expect(received.status).toEqual(200);
|
||||
});
|
||||
|
||||
it("Only allows canceling swap after canceling fulfillments", async () => {
|
||||
try {
|
||||
const swap_id = "swap-w-f";
|
||||
|
||||
const swap = await callGet({
|
||||
path: `/admin/swaps/${swap_id}`,
|
||||
get: "swap",
|
||||
});
|
||||
|
||||
const { order_id } = swap;
|
||||
|
||||
const expectCancelToReturn = partial(expectPostCallToReturn, {
|
||||
path: `/admin/orders/${order_id}/swaps/${swap_id}/cancel`,
|
||||
});
|
||||
|
||||
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 });
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
});
|
||||
|
||||
it("Only allows canceling swap after canceling return", async () => {
|
||||
const swap_id = "swap-w-r";
|
||||
|
||||
const swap = await callGet({
|
||||
path: `/admin/swaps/${swap_id}`,
|
||||
get: "swap",
|
||||
});
|
||||
|
||||
const { order_id } = swap;
|
||||
|
||||
const expectCancelToReturn = partial(expectPostCallToReturn, {
|
||||
path: `/admin/orders/${order_id}/swaps/${swap_id}/cancel`,
|
||||
});
|
||||
|
||||
await expectCancelToReturn({ code: 400 });
|
||||
|
||||
await expectPostCallToReturn({
|
||||
code: 200,
|
||||
path: `/admin/returns/${swap.return_order.id}/cancel`,
|
||||
});
|
||||
|
||||
await expectCancelToReturn({ code: 200 });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -283,7 +283,7 @@ Object {
|
||||
"created_at": Any<String>,
|
||||
"currency_code": "usd",
|
||||
"customer_id": "test-customer",
|
||||
"display_id": 2,
|
||||
"display_id": 6,
|
||||
"draft_order_id": null,
|
||||
"email": "test@email.com",
|
||||
"fulfillment_status": "fulfilled",
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
const { useApi } = require("../../helpers/use-api");
|
||||
|
||||
const header = {
|
||||
headers: {
|
||||
authorization: "Bearer test_token",
|
||||
},
|
||||
};
|
||||
|
||||
const resolveCall = async (path, payload, header) => {
|
||||
const api = useApi();
|
||||
let res;
|
||||
try {
|
||||
const resp = await api.post(path, payload, header);
|
||||
res = resp.status;
|
||||
} catch (expectedException) {
|
||||
try {
|
||||
res = expectedException.response.status;
|
||||
} catch (_) {
|
||||
console.error(expectedException);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
};
|
||||
|
||||
const determineFail = (actual, expected, path) => {
|
||||
if (expected !== actual) {
|
||||
console.log(`failed at path : ${path}`);
|
||||
}
|
||||
expect(actual).toEqual(expected);
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows you to wrap a Call function so that you may reuse some input values.
|
||||
* @param {Function} fun - the function to call with partial information
|
||||
* @param {Object} input - the constant input which we want to supply now
|
||||
* @returns
|
||||
*/
|
||||
module.exports.partial = function (fun, input = {}) {
|
||||
return async (remaining) => await fun({ ...remaining, ...input });
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows you to assert a specific code result from a POST call.
|
||||
* @param {Object} input - the information needed to make the call
|
||||
* (path & payload) and the expected code (code)
|
||||
*/
|
||||
module.exports.expectPostCallToReturn = async function (
|
||||
input = {
|
||||
code,
|
||||
path,
|
||||
payload: {},
|
||||
}
|
||||
) {
|
||||
const res = await resolveCall(input.path, input.payload, header);
|
||||
determineFail(res, input.code, input.path);
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows you to assert a specific code result from multiple POST
|
||||
* calls.
|
||||
* @param {Object} input - the collection of objects to execute
|
||||
* calls from (col), a function which yields the path (pathf),
|
||||
* and another one which provides the payload (payloadf), as
|
||||
* well as the code (code) which we want to assert.
|
||||
*/
|
||||
module.exports.expectAllPostCallsToReturn = async function (
|
||||
input = {
|
||||
code,
|
||||
col,
|
||||
pathf,
|
||||
payloadf,
|
||||
}
|
||||
) {
|
||||
for (const i of input.col) {
|
||||
const res = await resolveCall(
|
||||
input.pathf(i),
|
||||
input.payloadf ? input.payloadf(i) : {},
|
||||
header
|
||||
);
|
||||
determineFail(res, input.code, input.pathf(i));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Allows you to retrieve a specific object the response
|
||||
* from get call,
|
||||
* and simultaneously assert that the call was successful.
|
||||
* @param {Object} param0 - contains the path which to
|
||||
* call (path), and the object within the response.data (get)
|
||||
* we want to retrieve.
|
||||
* @returns {Object} found within response.data corresponding
|
||||
* to the get parameter provided.
|
||||
*/
|
||||
module.exports.callGet = async function ({ path, get }) {
|
||||
const api = useApi();
|
||||
const res = await api.get(path, header);
|
||||
|
||||
determineFail(res.status, 200, path);
|
||||
return res?.data[get];
|
||||
};
|
||||
@@ -0,0 +1,118 @@
|
||||
const {
|
||||
ClaimOrder,
|
||||
Order,
|
||||
LineItem,
|
||||
Fulfillment,
|
||||
Return,
|
||||
} = require("@medusajs/medusa");
|
||||
|
||||
module.exports = async (connection, data = {}) => {
|
||||
const manager = connection.manager;
|
||||
|
||||
let orderWithClaim = manager.create(Order, {
|
||||
id: "order-with-claim",
|
||||
customer_id: "test-customer",
|
||||
email: "test@email.com",
|
||||
payment_status: "captured",
|
||||
fulfillment_status: "fulfilled",
|
||||
billing_address: {
|
||||
id: "test-billing-address",
|
||||
first_name: "lebron",
|
||||
},
|
||||
shipping_address: {
|
||||
id: "test-shipping-address",
|
||||
first_name: "lebron",
|
||||
country_code: "us",
|
||||
},
|
||||
region_id: "test-region",
|
||||
currency_code: "usd",
|
||||
tax_rate: 0,
|
||||
discounts: [],
|
||||
payments: [
|
||||
{
|
||||
id: "test-payment-for-claim-order",
|
||||
amount: 10000,
|
||||
currency_code: "usd",
|
||||
amount_refunded: 0,
|
||||
provider_id: "test-pay",
|
||||
data: {},
|
||||
},
|
||||
],
|
||||
items: [],
|
||||
...data,
|
||||
});
|
||||
|
||||
await manager.save(orderWithClaim);
|
||||
|
||||
const li = manager.create(LineItem, {
|
||||
id: "test-item-co-2",
|
||||
fulfilled_quantity: 1,
|
||||
title: "Line Item",
|
||||
description: "Line Item Desc",
|
||||
thumbnail: "https://test.js/1234",
|
||||
unit_price: 8000,
|
||||
quantity: 1,
|
||||
variant_id: "test-variant",
|
||||
order_id: orderWithClaim.id,
|
||||
});
|
||||
|
||||
await manager.save(li);
|
||||
|
||||
const li2 = manager.create(LineItem, {
|
||||
id: "test-item-co-3",
|
||||
fulfilled_quantity: 4,
|
||||
title: "Line Item",
|
||||
description: "Line Item Desc",
|
||||
thumbnail: "https://test.js/1234",
|
||||
unit_price: 8000,
|
||||
quantity: 4,
|
||||
variant_id: "test-variant",
|
||||
order_id: orderWithClaim.id,
|
||||
});
|
||||
|
||||
await manager.save(li2);
|
||||
|
||||
const claimWithFulfillment = manager.create(ClaimOrder, {
|
||||
id: "claim-w-f",
|
||||
type: "replace",
|
||||
payment_status: "na",
|
||||
fulfillment_status: "not_fulfilled",
|
||||
order_id: "order-with-claim",
|
||||
...data,
|
||||
});
|
||||
|
||||
const ful1 = manager.create(Fulfillment, {
|
||||
id: "fulfillment-co-1",
|
||||
data: {},
|
||||
provider_id: "test-ful",
|
||||
});
|
||||
|
||||
const ful2 = manager.create(Fulfillment, {
|
||||
id: "fulfillment-co-2",
|
||||
data: {},
|
||||
provider_id: "test-ful",
|
||||
});
|
||||
|
||||
claimWithFulfillment.fulfillments = [ful1, ful2];
|
||||
|
||||
await manager.save(claimWithFulfillment);
|
||||
|
||||
const claimWithReturn = manager.create(ClaimOrder, {
|
||||
id: "claim-w-r",
|
||||
type: "replace",
|
||||
payment_status: "na",
|
||||
fulfillment_status: "not_fulfilled",
|
||||
order_id: "order-with-claim",
|
||||
...data,
|
||||
});
|
||||
|
||||
await manager.save(claimWithReturn);
|
||||
|
||||
await manager.insert(Return, {
|
||||
id: "return-id-2",
|
||||
claim_order_id: "claim-w-r",
|
||||
status: "requested",
|
||||
refund_amount: 0,
|
||||
data: {},
|
||||
});
|
||||
};
|
||||
@@ -9,6 +9,7 @@ const {
|
||||
Product,
|
||||
ProductVariant,
|
||||
Region,
|
||||
Payment,
|
||||
Order,
|
||||
Swap,
|
||||
} = require("@medusajs/medusa");
|
||||
@@ -183,4 +184,140 @@ module.exports = async (connection, data = {}) => {
|
||||
price: 1000,
|
||||
data: {},
|
||||
});
|
||||
|
||||
const orderTemplate = () => {
|
||||
return {
|
||||
customer_id: "test-customer",
|
||||
email: "test@gmail.com",
|
||||
payment_status: "not_paid",
|
||||
fulfillment_status: "not_fulfilled",
|
||||
region_id: "test-region",
|
||||
currency_code: "usd",
|
||||
tax_rate: 0,
|
||||
...data,
|
||||
};
|
||||
};
|
||||
|
||||
const paymentTemplate = () => {
|
||||
return {
|
||||
amount: 10000,
|
||||
currency_code: "usd",
|
||||
provider_id: "test-pay",
|
||||
data: {},
|
||||
};
|
||||
};
|
||||
|
||||
const orderWithClaim = manager.create(Order, {
|
||||
id: "test-order-w-c",
|
||||
claims: [
|
||||
{
|
||||
type: "replace",
|
||||
id: "claim-1",
|
||||
payment_status: "na",
|
||||
fulfillment_status: "not_fulfilled",
|
||||
payment_provider: "test-pay",
|
||||
},
|
||||
],
|
||||
...orderTemplate(),
|
||||
});
|
||||
|
||||
await manager.save(orderWithClaim);
|
||||
|
||||
await manager.insert(Payment, {
|
||||
order_id: "test-order-w-c",
|
||||
id: "o-pay1",
|
||||
...paymentTemplate(),
|
||||
});
|
||||
|
||||
const orderWithSwap = manager.create(Order, {
|
||||
id: "test-order-w-s",
|
||||
...orderTemplate(),
|
||||
});
|
||||
|
||||
await manager.save(orderWithSwap);
|
||||
|
||||
await manager.insert(Payment, {
|
||||
order_id: "test-order-w-s",
|
||||
id: "o-pay2",
|
||||
...paymentTemplate(),
|
||||
});
|
||||
|
||||
const swap1 = manager.create(Swap, {
|
||||
id: "swap-1",
|
||||
order_id: "test-order-w-s",
|
||||
fulfillment_status: "not_fulfilled",
|
||||
payment_status: "not_paid",
|
||||
});
|
||||
|
||||
const pay1 = manager.create(Payment, {
|
||||
id: "pay1",
|
||||
...paymentTemplate(),
|
||||
});
|
||||
|
||||
swap1.payment = pay1;
|
||||
|
||||
const swap2 = manager.create(Swap, {
|
||||
id: "swap-2",
|
||||
order_id: "test-order-w-s",
|
||||
fulfillment_status: "not_fulfilled",
|
||||
payment_status: "not_paid",
|
||||
});
|
||||
|
||||
const pay2 = manager.create(Payment, {
|
||||
id: "pay2",
|
||||
...paymentTemplate(),
|
||||
});
|
||||
|
||||
swap2.payment = pay2;
|
||||
|
||||
await manager.save(swap1);
|
||||
await manager.save(swap2);
|
||||
|
||||
const orderWithFulfillment = manager.create(Order, {
|
||||
id: "test-order-w-f",
|
||||
fulfillments: [
|
||||
{
|
||||
id: "fulfillment-on-order-1",
|
||||
data: {},
|
||||
provider_id: "test-ful",
|
||||
},
|
||||
{
|
||||
id: "fulfillment-on-order-2",
|
||||
data: {},
|
||||
provider_id: "test-ful",
|
||||
},
|
||||
],
|
||||
...orderTemplate(),
|
||||
});
|
||||
|
||||
await manager.save(orderWithFulfillment);
|
||||
|
||||
await manager.insert(Payment, {
|
||||
order_id: "test-order-w-f",
|
||||
id: "o-pay3",
|
||||
...paymentTemplate(),
|
||||
});
|
||||
|
||||
const orderWithReturn = manager.create(Order, {
|
||||
id: "test-order-w-r",
|
||||
returns: [
|
||||
{
|
||||
id: "return-on-order-1",
|
||||
refund_amount: 0,
|
||||
},
|
||||
{
|
||||
id: "return-on-order-2",
|
||||
refund_amount: 0,
|
||||
},
|
||||
],
|
||||
...orderTemplate(),
|
||||
});
|
||||
|
||||
await manager.save(orderWithReturn);
|
||||
|
||||
await manager.insert(Payment, {
|
||||
order_id: "test-order-w-r",
|
||||
id: "o-pay4",
|
||||
...paymentTemplate(),
|
||||
});
|
||||
};
|
||||
|
||||
@@ -9,6 +9,7 @@ const {
|
||||
Product,
|
||||
ProductVariant,
|
||||
Region,
|
||||
Payment,
|
||||
Order,
|
||||
Swap,
|
||||
Cart,
|
||||
@@ -43,7 +44,7 @@ module.exports = async (connection, data = {}) => {
|
||||
amount: 10000,
|
||||
currency_code: "usd",
|
||||
amount_refunded: 0,
|
||||
provider_id: "test",
|
||||
provider_id: "test-pay",
|
||||
data: {},
|
||||
},
|
||||
],
|
||||
@@ -80,7 +81,7 @@ module.exports = async (connection, data = {}) => {
|
||||
amount: 10000,
|
||||
currency_code: "usd",
|
||||
amount_refunded: 0,
|
||||
provider_id: "test",
|
||||
provider_id: "test-pay",
|
||||
data: {},
|
||||
},
|
||||
additional_items: [
|
||||
@@ -100,6 +101,70 @@ module.exports = async (connection, data = {}) => {
|
||||
|
||||
await manager.save(swap);
|
||||
|
||||
const cartTemplate = async (cartId) => {
|
||||
const cart = manager.create(Cart, {
|
||||
id: cartId,
|
||||
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: {},
|
||||
...data,
|
||||
});
|
||||
|
||||
await manager.save(cart);
|
||||
};
|
||||
|
||||
const swapTemplate = async (cartId) => {
|
||||
await cartTemplate(cartId);
|
||||
return {
|
||||
order_id: orderWithSwap.id,
|
||||
fulfillment_status: "fulfilled",
|
||||
payment_status: "not_paid",
|
||||
cart_id: cartId,
|
||||
payment: {
|
||||
amount: 5000,
|
||||
currency_code: "usd",
|
||||
amount_refunded: 0,
|
||||
provider_id: "test-pay",
|
||||
data: {},
|
||||
},
|
||||
...data,
|
||||
};
|
||||
};
|
||||
|
||||
const swapWithFulfillments = manager.create(Swap, {
|
||||
id: "swap-w-f",
|
||||
fulfillments: [
|
||||
{
|
||||
id: "fulfillment-1",
|
||||
data: {},
|
||||
provider_id: "test-ful",
|
||||
},
|
||||
{
|
||||
id: "fulfillment-2",
|
||||
data: {},
|
||||
provider_id: "test-ful",
|
||||
},
|
||||
],
|
||||
...(await swapTemplate("sc-w-f")),
|
||||
});
|
||||
|
||||
await manager.save(swapWithFulfillments);
|
||||
|
||||
const swapWithReturn = manager.create(Swap, {
|
||||
id: "swap-w-r",
|
||||
return_order: {
|
||||
id: "return-id",
|
||||
status: "requested",
|
||||
refund_amount: 0,
|
||||
},
|
||||
...(await swapTemplate("sc-w-r")),
|
||||
});
|
||||
|
||||
await manager.save(swapWithReturn);
|
||||
const li = manager.create(LineItem, {
|
||||
id: "return-item-1",
|
||||
fulfilled_quantity: 1,
|
||||
@@ -175,7 +240,7 @@ module.exports = async (connection, data = {}) => {
|
||||
amount: 10000,
|
||||
currency_code: "usd",
|
||||
amount_refunded: 0,
|
||||
provider_id: "test",
|
||||
provider_id: "test-pay",
|
||||
data: {},
|
||||
},
|
||||
additional_items: [
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const DB_USERNAME = process.env.DB_USERNAME || "postgres";
|
||||
const DB_PASSWORD = process.env.DB_PASSWORD || "";
|
||||
const DB_USERNAME = process.env.DB_USERNAME || "postgres"
|
||||
const DB_PASSWORD = process.env.DB_PASSWORD || ""
|
||||
|
||||
module.exports = {
|
||||
plugins: [],
|
||||
@@ -8,4 +8,4 @@ module.exports = {
|
||||
database_url: `postgres://${DB_USERNAME}:${DB_PASSWORD}@localhost/medusa-integration`,
|
||||
database_type: "postgres",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
+460
-419
File diff suppressed because it is too large
Load Diff
@@ -582,7 +582,10 @@ class WebshipperFulfillmentService extends FulfillmentService {
|
||||
}
|
||||
|
||||
if (order) {
|
||||
if (order.data.attributes.status !== "pending") {
|
||||
if (
|
||||
order.data.attributes.status !== "pending" &&
|
||||
order.data.attributes.status !== "missing_rate"
|
||||
) {
|
||||
if (order.data.attributes.status === "cancelled") {
|
||||
return Promise.resolve(order)
|
||||
}
|
||||
|
||||
@@ -953,18 +953,6 @@
|
||||
exec-sh "^0.3.2"
|
||||
minimist "^1.2.0"
|
||||
|
||||
"@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==
|
||||
|
||||
"@hapi/topo@^5.0.0":
|
||||
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"
|
||||
|
||||
"@istanbuljs/load-nyc-config@^1.0.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
|
||||
@@ -1166,23 +1154,6 @@
|
||||
readdirp "^2.2.1"
|
||||
upath "^1.1.1"
|
||||
|
||||
"@sideway/address@^4.1.0":
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.2.tgz#811b84333a335739d3969cfc434736268170cad1"
|
||||
integrity sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==
|
||||
dependencies:
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
|
||||
"@sideway/formula@^3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c"
|
||||
integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==
|
||||
|
||||
"@sideway/pinpoint@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
|
||||
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
|
||||
|
||||
"@sinonjs/commons@^1.7.0":
|
||||
version "1.8.3"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
|
||||
@@ -3144,11 +3115,6 @@ is-number@^3.0.0:
|
||||
dependencies:
|
||||
kind-of "^3.0.2"
|
||||
|
||||
is-number@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
|
||||
integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
@@ -3642,22 +3608,6 @@ jest@^25.5.2:
|
||||
import-local "^3.0.2"
|
||||
jest-cli "^25.5.4"
|
||||
|
||||
joi-objectid@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/joi-objectid/-/joi-objectid-3.0.1.tgz#63ace7860f8e1a993a28d40c40ffd8eff01a3668"
|
||||
integrity sha512-V/3hbTlGpvJ03Me6DJbdBI08hBTasFOmipsauOsxOSnsF1blxV537WTl1zPwbfcKle4AK0Ma4OPnzMH4LlvTpQ==
|
||||
|
||||
joi@^17.3.0:
|
||||
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"
|
||||
"@sideway/address" "^4.1.0"
|
||||
"@sideway/formula" "^3.0.0"
|
||||
"@sideway/pinpoint" "^2.0.0"
|
||||
|
||||
js-tokens@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||
@@ -3878,33 +3828,11 @@ map-visit@^1.0.0:
|
||||
dependencies:
|
||||
object-visit "^1.0.0"
|
||||
|
||||
math-random@^1.0.1:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
|
||||
integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
|
||||
|
||||
media-typer@0.3.0:
|
||||
version "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:
|
||||
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==
|
||||
dependencies:
|
||||
joi "^17.3.0"
|
||||
joi-objectid "^3.0.1"
|
||||
|
||||
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==
|
||||
dependencies:
|
||||
"@babel/plugin-transform-classes" "^7.9.5"
|
||||
medusa-core-utils "^1.1.20"
|
||||
randomatic "^3.1.1"
|
||||
|
||||
merge-descriptors@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
|
||||
@@ -4451,15 +4379,6 @@ qs@~6.5.2:
|
||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
|
||||
|
||||
randomatic@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
|
||||
integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
|
||||
dependencies:
|
||||
is-number "^4.0.0"
|
||||
kind-of "^6.0.0"
|
||||
math-random "^1.0.1"
|
||||
|
||||
range-parser@~1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.14.3",
|
||||
"@babel/core": "^7.14.3",
|
||||
"@babel/preset-typescript": "^7.13.0",
|
||||
"@babel/preset-typescript": "^7.15.0",
|
||||
"babel-preset-medusa-package": "^1.1.13",
|
||||
"cross-env": "^5.2.1",
|
||||
"eslint": "^6.8.0",
|
||||
@@ -40,6 +40,7 @@
|
||||
"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"
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { ClaimServiceMock } from "../../../../../services/__mocks__/claim"
|
||||
|
||||
describe("POST /admin/orders/:id/claims/:claim_id/cancel", () => {
|
||||
describe("successfully cancels a claim", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/claims/${IdMap.getId(
|
||||
"test-claim"
|
||||
)}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("calls ClaimService cancel", () => {
|
||||
expect(ClaimServiceMock.cancel).toHaveBeenCalledTimes(1)
|
||||
expect(ClaimServiceMock.cancel).toHaveBeenCalledWith(
|
||||
IdMap.getId("test-claim")
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a claim unrelated to the order fails", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order2")}/claims/${IdMap.getId(
|
||||
"test-claim"
|
||||
)}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,92 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { ClaimServiceMock } from "../../../../../services/__mocks__/claim"
|
||||
|
||||
describe("POST /admin/orders/:id/claims/:claim_id/fulfillments/:fulfillment_id/cancel", () => {
|
||||
describe("successfully cancels a fulfillment", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/claims/${IdMap.getId(
|
||||
"test-claim"
|
||||
)}/fulfillments/${IdMap.getId("claim-fulfillment")}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("calls claimService cancelFulfillment", () => {
|
||||
expect(ClaimServiceMock.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(ClaimServiceMock.cancelFulfillment).toHaveBeenCalledWith(
|
||||
IdMap.getId("claim-fulfillment")
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a fulfillment unrelated to the claim fails", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/claims/${IdMap.getId(
|
||||
"claim-fulfillment2"
|
||||
)}/fulfillments/${IdMap.getId("claim-fulfillment")}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a fulfillment, where claim and order are unrelated", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order2")}/claims/${IdMap.getId(
|
||||
"test-claim"
|
||||
)}/fulfillments/${IdMap.getId("claim-fulfillment")}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,92 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { SwapServiceMock } from "../../../../../services/__mocks__/swap"
|
||||
|
||||
describe("POST /admin/orders/:id/swaps/:swap_id/fulfillments/:fulfillment_id/cancel", () => {
|
||||
describe("successfully cancels a fulfillment", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/swaps/${IdMap.getId(
|
||||
"test-swap"
|
||||
)}/fulfillments/${IdMap.getId("swap-fulfillment")}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("calls SwapService cancelFulfillment", () => {
|
||||
expect(SwapServiceMock.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(SwapServiceMock.cancelFulfillment).toHaveBeenCalledWith(
|
||||
IdMap.getId("swap-fulfillment")
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a fulfillment unrelated to the swap fails", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/swaps/${IdMap.getId(
|
||||
"swap-fulfillment2"
|
||||
)}/fulfillments/${IdMap.getId("swap-fulfillment")}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a fulfillment, where swap and order are unrelated", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order2")}/swaps/${IdMap.getId(
|
||||
"test-swap"
|
||||
)}/fulfillments/${IdMap.getId("swap-fulfillment")}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,64 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { OrderServiceMock } from "../../../../../services/__mocks__/order"
|
||||
|
||||
describe("POST /admin/orders/:id/fulfillments/:fulfillment_id/cancel", () => {
|
||||
describe("successfully cancels a fulfillment", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/fulfillments/${IdMap.getId(
|
||||
"order-fulfillment"
|
||||
)}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("calls OrderService cancelFulfillment", () => {
|
||||
expect(OrderServiceMock.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(OrderServiceMock.cancelFulfillment).toHaveBeenCalledWith(
|
||||
IdMap.getId("order-fulfillment")
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a fulfillment unrelated to the order fails", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order2")}/fulfillments/${IdMap.getId(
|
||||
"order-fulfillment"
|
||||
)}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,64 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
import { request } from "../../../../../helpers/test-request"
|
||||
import { SwapServiceMock } from "../../../../../services/__mocks__/swap"
|
||||
|
||||
describe("POST /admin/orders/:id/swaps/:swap_id/cancel", () => {
|
||||
describe("successfully cancels a claim", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order")}/swaps/${IdMap.getId(
|
||||
"test-swap"
|
||||
)}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("calls SwapService cancel", () => {
|
||||
expect(SwapServiceMock.cancel).toHaveBeenCalledTimes(1)
|
||||
expect(SwapServiceMock.cancel).toHaveBeenCalledWith(
|
||||
IdMap.getId("test-swap")
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe("Trying to cancel a claim unrelated to the order fails", () => {
|
||||
let subject
|
||||
|
||||
beforeAll(async () => {
|
||||
subject = await request(
|
||||
"POST",
|
||||
`/admin/orders/${IdMap.getId("test-order2")}/swaps/${IdMap.getId(
|
||||
"test-swap"
|
||||
)}/cancel`,
|
||||
{
|
||||
adminSession: {
|
||||
jwt: {
|
||||
userId: IdMap.getId("admin_user"),
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("returns error", () => {
|
||||
expect(subject.status).toEqual(404)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -19,6 +19,7 @@ const defaultRelations = [
|
||||
"gift_card_transactions",
|
||||
"claims",
|
||||
"claims.return_order",
|
||||
"claims.return_order.shipping_method",
|
||||
"claims.shipping_methods",
|
||||
"claims.shipping_address",
|
||||
"claims.additional_items",
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
import { defaultRelations, defaultFields } from "."
|
||||
|
||||
/**
|
||||
* @oas [post] /orders/{id}/claims/{claim_id}/cancel
|
||||
* operationId: "PostOrdersClaimCancel"
|
||||
* summary: "Cancels a Claim"
|
||||
* description: "Cancels a Claim"
|
||||
* parameters:
|
||||
* - (path) id=* {string} The id of the Order.
|
||||
* . (path) claim_id=* {string} The id of the Claim.
|
||||
* tags:
|
||||
* - Claim
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* properties:
|
||||
* order:
|
||||
* $ref: "#/components/schemas/claim"
|
||||
*/
|
||||
export default async (req, res) => {
|
||||
const { id, claim_id } = req.params
|
||||
|
||||
try {
|
||||
const claimService = req.scope.resolve("claimService")
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
const claim = await claimService.retrieve(claim_id)
|
||||
|
||||
if (claim.order_id !== id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no claim was found with the id: ${claim_id} related to order: ${id}`
|
||||
)
|
||||
}
|
||||
|
||||
await claimService.cancel(claim_id)
|
||||
|
||||
const order = await orderService.retrieve(id, {
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
|
||||
res.json({ order })
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
import { defaultRelations, defaultFields } from "."
|
||||
|
||||
/**
|
||||
* @oas [post] orders//{id}/claims/{claim_id}/fulfillments/{fulfillment_id}/cancel
|
||||
* operationId: "PostOrdersClaimFulfillmentsCancel"
|
||||
* summary: "Cancels a fulfilmment related to a Claim"
|
||||
* description: "Registers a Fulfillment as canceled."
|
||||
* parameters:
|
||||
* - (path) id=* {string} The id of the Order which the Claim relates to.
|
||||
* - (path) claim_id=* {string} The id of the Claim which the Fulfillment relates to.
|
||||
* - (path) fulfillment_id=* {string} The id of the Fulfillment.
|
||||
* tags:
|
||||
* - Fulfillment
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* properties:
|
||||
* fulfillment:
|
||||
* $ref: "#/components/schemas/fulfillment"
|
||||
*/
|
||||
export default async (req, res) => {
|
||||
const { id, claim_id, fulfillment_id } = req.params
|
||||
|
||||
try {
|
||||
const fulfillmentService = req.scope.resolve("fulfillmentService")
|
||||
const claimService = req.scope.resolve("claimService")
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
const fulfillment = await fulfillmentService.retrieve(fulfillment_id)
|
||||
|
||||
if (fulfillment.claim_order_id !== claim_id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no fulfillment was found with the id: ${fulfillment_id} related to claim: ${claim_id}`
|
||||
)
|
||||
}
|
||||
|
||||
const claim = await claimService.retrieve(claim_id)
|
||||
|
||||
if (claim.order_id !== id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no claim was found with the id: ${claim_id} related to order: ${id}`
|
||||
)
|
||||
}
|
||||
|
||||
await claimService.cancelFulfillment(fulfillment_id)
|
||||
|
||||
const order = await orderService.retrieve(id, {
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
res.json({ order })
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
import { defaultRelations, defaultFields } from "."
|
||||
|
||||
/**
|
||||
* @oas [post] /orders/{id}/swaps/{swap_id}/fulfillments/{fulfillment_id}/cancel
|
||||
* operationId: "PostOrdersSwapFulfillmentsCancel"
|
||||
* summary: "Cancels a fulfilmment related to a Swap"
|
||||
* description: "Registers a Fulfillment as canceled."
|
||||
* parameters:
|
||||
* - (path) id=* {string} The id of the Order which the Swap relates to.
|
||||
* - (path) swap_id=* {string} The id of the Swap which the Fulfillment relates to.
|
||||
* - (path) fulfillment_id=* {string} The id of the Fulfillment.
|
||||
* tags:
|
||||
* - Fulfillment
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* properties:
|
||||
* fulfillment:
|
||||
* $ref: "#/components/schemas/fulfillment"
|
||||
*/
|
||||
export default async (req, res) => {
|
||||
const { id, swap_id, fulfillment_id } = req.params
|
||||
|
||||
try {
|
||||
const fulfillmentService = req.scope.resolve("fulfillmentService")
|
||||
const swapService = req.scope.resolve("swapService")
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
const fulfillment = await fulfillmentService.retrieve(fulfillment_id)
|
||||
|
||||
if (fulfillment.swap_id !== swap_id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no fulfillment was found with the id: ${fulfillment_id} related to swap: ${id}`
|
||||
)
|
||||
}
|
||||
|
||||
const swap = await swapService.retrieve(swap_id)
|
||||
|
||||
if (swap.order_id !== id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no swap was found with the id: ${swap_id} related to order: ${id}`
|
||||
)
|
||||
}
|
||||
|
||||
await swapService.cancelFulfillment(fulfillment_id)
|
||||
|
||||
const order = await orderService.retrieve(id, {
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
|
||||
res.json({ order })
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
import { defaultRelations, defaultFields } from "."
|
||||
|
||||
/**
|
||||
* @oas [post] /orders/{id}/fulfillments/{fulfillment_id}/cancel
|
||||
* operationId: "PostOrdersOrderFulfillmentsCancel"
|
||||
* summary: "Cancels a fulfilmment"
|
||||
* description: "Registers a Fulfillment as canceled."
|
||||
* parameters:
|
||||
* - (path) id=* {string} The id of the Order which the Fulfillment relates to.
|
||||
* - (path) fulfillment_id=* {string} The id of the Fulfillment
|
||||
* tags:
|
||||
* - Fulfillment
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* properties:
|
||||
* fulfillment:
|
||||
* $ref: "#/components/schemas/fulfillment"
|
||||
*/
|
||||
export default async (req, res) => {
|
||||
const { id, fulfillment_id } = req.params
|
||||
|
||||
try {
|
||||
const fulfillmentService = req.scope.resolve("fulfillmentService")
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
const fulfillment = await fulfillmentService.retrieve(fulfillment_id)
|
||||
|
||||
if (fulfillment.order_id !== id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no fulfillment was found with the id: ${fulfillment_id} related to order: ${id}`
|
||||
)
|
||||
}
|
||||
|
||||
await orderService.cancelFulfillment(fulfillment_id)
|
||||
|
||||
const order = await orderService.retrieve(id, {
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
|
||||
res.json({ order })
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
import { defaultFields, defaultRelations } from "."
|
||||
|
||||
/**
|
||||
* @oas [post] /orders/{id}/cancel
|
||||
* operationId: "PostOrdersOrderCancel"
|
||||
@@ -22,11 +24,11 @@ export default async (req, res) => {
|
||||
|
||||
try {
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
await orderService.cancel(id)
|
||||
|
||||
const order = await orderService.retrieve(id, {
|
||||
relations: ["region", "customer", "swaps"],
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
|
||||
res.json({ order })
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
import { defaultRelations, defaultFields } from "."
|
||||
|
||||
/**
|
||||
* @oas [post] /orders/{id}/swaps/{swap_id}/cancel
|
||||
* operationId: "PostOrdersSwapCancel"
|
||||
* summary: "Cancels a Swap"
|
||||
* description: "Cancels a Swap"
|
||||
* parameters:
|
||||
* - (path) id=* {string} The id of the Order.
|
||||
* . (path) swap_id=* {string} The id of the Swap.
|
||||
* tags:
|
||||
* - Swap
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* properties:
|
||||
* order:
|
||||
* $ref: "#/components/schemas/swap"
|
||||
*/
|
||||
export default async (req, res) => {
|
||||
const { id, swap_id } = req.params
|
||||
|
||||
try {
|
||||
const swapService = req.scope.resolve("swapService")
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
const swap = await swapService.retrieve(swap_id)
|
||||
|
||||
if (swap.order_id !== id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
`no swap was found with the id: ${swap_id} related to order: ${id}`
|
||||
)
|
||||
}
|
||||
|
||||
await swapService.cancel(swap_id)
|
||||
|
||||
const order = await orderService.retrieve(id, {
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
|
||||
res.json({ order })
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
@@ -62,6 +62,30 @@ export default app => {
|
||||
middlewares.wrap(require("./create-fulfillment").default)
|
||||
)
|
||||
|
||||
/**
|
||||
* Cancel a fulfillment related to an order.
|
||||
*/
|
||||
route.post(
|
||||
"/:id/fulfillments/:fulfillment_id/cancel",
|
||||
middlewares.wrap(require("./cancel-fulfillment").default)
|
||||
)
|
||||
|
||||
/**
|
||||
* Cancel a fulfillment related to a swap.
|
||||
*/
|
||||
route.post(
|
||||
"/:id/swaps/:swap_id/fulfillments/:fulfillment_id/cancel",
|
||||
middlewares.wrap(require("./cancel-fulfillment-swap").default)
|
||||
)
|
||||
|
||||
/**
|
||||
* Cancel a fulfillment related to a claim.
|
||||
*/
|
||||
route.post(
|
||||
"/:id/claims/:claim_id/fulfillments/:fulfillment_id/cancel",
|
||||
middlewares.wrap(require("./cancel-fulfillment-claim").default)
|
||||
)
|
||||
|
||||
/**
|
||||
* Create a shipment.
|
||||
*/
|
||||
@@ -104,6 +128,14 @@ export default app => {
|
||||
*/
|
||||
route.post("/:id/swaps", middlewares.wrap(require("./create-swap").default))
|
||||
|
||||
/**
|
||||
* Cancels a swap.
|
||||
*/
|
||||
route.post(
|
||||
"/:id/swaps/:swap_id/cancel",
|
||||
middlewares.wrap(require("./cancel-swap").default)
|
||||
)
|
||||
|
||||
/**
|
||||
* Receives the inventory to return from a swap
|
||||
*/
|
||||
@@ -141,6 +173,14 @@ export default app => {
|
||||
*/
|
||||
route.post("/:id/claims", middlewares.wrap(require("./create-claim").default))
|
||||
|
||||
/**
|
||||
* Cancels a claim
|
||||
*/
|
||||
route.post(
|
||||
"/:id/claims/:claim_id/cancel",
|
||||
middlewares.wrap(require("./cancel-claim").default)
|
||||
)
|
||||
|
||||
/**
|
||||
* Updates a claim
|
||||
*/
|
||||
@@ -193,6 +233,7 @@ export const defaultRelations = [
|
||||
"gift_card_transactions",
|
||||
"claims",
|
||||
"claims.return_order",
|
||||
"claims.return_order.shipping_method",
|
||||
"claims.shipping_methods",
|
||||
"claims.shipping_address",
|
||||
"claims.additional_items",
|
||||
|
||||
@@ -140,7 +140,7 @@ export default async (req, res) => {
|
||||
if (typeof value.refund !== "undefined" && value.refund < 0) {
|
||||
returnObj.refund_amount = 0
|
||||
} else {
|
||||
if (value.refund) {
|
||||
if (value.refund >= 0) {
|
||||
returnObj.refund_amount = value.refund
|
||||
}
|
||||
}
|
||||
@@ -149,7 +149,10 @@ export default async (req, res) => {
|
||||
.withTransaction(manager)
|
||||
.retrieve(id)
|
||||
|
||||
const evaluatedNoNotification = value.no_notification !== undefined ? value.no_notification : order.no_notification
|
||||
const evaluatedNoNotification =
|
||||
value.no_notification !== undefined
|
||||
? value.no_notification
|
||||
: order.no_notification
|
||||
returnObj.no_notification = evaluatedNoNotification
|
||||
|
||||
const createdReturn = await returnService
|
||||
@@ -161,13 +164,13 @@ export default async (req, res) => {
|
||||
.withTransaction(manager)
|
||||
.fulfill(createdReturn.id)
|
||||
}
|
||||
|
||||
|
||||
await eventBus
|
||||
.withTransaction(manager)
|
||||
.emit("order.return_requested", {
|
||||
id,
|
||||
return_id: createdReturn.id,
|
||||
no_notification: evaluatedNoNotification
|
||||
no_notification: evaluatedNoNotification,
|
||||
})
|
||||
|
||||
return {
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
import { result } from "lodash"
|
||||
import { MedusaError, Validator } from "medusa-core-utils"
|
||||
import { defaultFields, defaultRelations } from "../orders"
|
||||
|
||||
/**
|
||||
* @oas [post] /returns/{id}/cancel
|
||||
* operationId: "PostReturnsReturnCancel"
|
||||
* summary: "Cancel a Return"
|
||||
* description: "Registers a Return as canceled."
|
||||
* parameters:
|
||||
* - (path) id=* {string} The id of the Return.
|
||||
* tags:
|
||||
* - Return
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* properties:
|
||||
* return:
|
||||
* $ref: "#/components/schemas/order"
|
||||
*/
|
||||
export default async (req, res) => {
|
||||
const { id } = req.params
|
||||
|
||||
try {
|
||||
const returnService = req.scope.resolve("returnService")
|
||||
const orderService = req.scope.resolve("orderService")
|
||||
|
||||
let result = await returnService.cancel(id)
|
||||
|
||||
if (result.swap_id) {
|
||||
const swapService = req.scope.resolve("swapService")
|
||||
result = await swapService.retrieve(result.swap_id)
|
||||
} else if (result.claim_order_id) {
|
||||
const claimService = req.scope.resolve("claimService")
|
||||
result = await claimService.retrieve(result.claim_order_id)
|
||||
}
|
||||
|
||||
const order = await orderService.retrieve(result.order_id, {
|
||||
select: defaultFields,
|
||||
relations: defaultRelations,
|
||||
})
|
||||
|
||||
res.status(200).json({ order })
|
||||
} catch (err) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
@@ -16,5 +16,10 @@ export default app => {
|
||||
middlewares.wrap(require("./receive-return").default)
|
||||
)
|
||||
|
||||
route.post(
|
||||
"/:id/cancel",
|
||||
middlewares.wrap(require("./cancel-return").default)
|
||||
)
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { MedusaError, Validator } from "medusa-core-utils"
|
||||
|
||||
/**
|
||||
* @oas [post] /returns/{id}receive
|
||||
* @oas [post] /returns/{id}/receive
|
||||
* operationId: "PostReturnsReturnReceive"
|
||||
* summary: "Receive a Return"
|
||||
* description: "Registers a Return as received. Updates statuses on Orders and Swaps accordingly."
|
||||
|
||||
@@ -72,7 +72,7 @@ describe("GET /admin/swaps/:id", () => {
|
||||
|
||||
it("returns swap", () => {
|
||||
expect(subject.status).toEqual(200)
|
||||
expect(subject.body.swap.id).toEqual(IdMap.getId("test-swap"))
|
||||
expect(subject.body.swap.id).toEqual("test-swap")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -78,7 +78,7 @@ describe("POST /store/carts/:id", () => {
|
||||
})
|
||||
|
||||
it("returns the created order", () => {
|
||||
expect(subject.body.data.id).toEqual(IdMap.getId("test-swap"))
|
||||
expect(subject.body.data.id).toEqual("test-swap")
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import middlewares from "../../../middlewares"
|
||||
|
||||
const route = Router()
|
||||
|
||||
export default (app) => {
|
||||
export default app => {
|
||||
app.use("/swaps", route)
|
||||
|
||||
route.get(
|
||||
@@ -19,6 +19,7 @@ export const defaultRelations = [
|
||||
"order",
|
||||
"additional_items",
|
||||
"return_order",
|
||||
"return_order.shipping_method",
|
||||
"fulfillments",
|
||||
"payment",
|
||||
"shipping_address",
|
||||
|
||||
@@ -4,11 +4,13 @@ export { Cart } from "./models/cart"
|
||||
export { ClaimImage } from "./models/claim-image"
|
||||
export { ClaimItem } from "./models/claim-item"
|
||||
export { ClaimTag } from "./models/claim-tag"
|
||||
export { ClaimOrder } from "./models/claim-order"
|
||||
export { Country } from "./models/country"
|
||||
export { Currency } from "./models/currency"
|
||||
export { Customer } from "./models/customer"
|
||||
export { DiscountRule } from "./models/discount-rule"
|
||||
export { Discount } from "./models/discount"
|
||||
export { Fulfillment } from "./models/fulfillment"
|
||||
export { FulfillmentItem } from "./models/fulfillment-item"
|
||||
export { FulfillmentProvider } from "./models/fulfillment-provider"
|
||||
export { GiftCardTransaction } from "./models/gift-card-transaction"
|
||||
@@ -43,4 +45,3 @@ export { Swap } from "./models/swap"
|
||||
export { User } from "./models/user"
|
||||
export { DraftOrder } from "./models/draft-order"
|
||||
export { ReturnReason } from "./models/return-reason"
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
|
||||
export class ensureCancellationFieldsExist1625560513367
|
||||
implements MigrationInterface {
|
||||
name = "ensureCancellationFieldsExist1625560513367"
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "swap" ADD "canceled_at" TIMESTAMP WITH TIME ZONE`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "return_status_enum" RENAME TO "return_status_enum_old"`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "return_status_enum" AS ENUM('requested', 'received', 'requires_action', 'canceled')`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "return" ALTER COLUMN "status" DROP DEFAULT`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "return" ALTER COLUMN "status" TYPE "return_status_enum" USING "status"::"text"::"return_status_enum"`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "return" ALTER COLUMN "status" SET DEFAULT 'requested'`
|
||||
)
|
||||
await queryRunner.query(`DROP TYPE "return_status_enum_old"`)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`CREATE TYPE "return_status_enum_old" AS ENUM('requested', 'received', 'requires_action')`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "return" ALTER COLUMN "status" DROP DEFAULT`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "return" ALTER COLUMN "status" TYPE "return_status_enum_old" USING "status"::"text"::"return_status_enum_old"`
|
||||
)
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "return" ALTER COLUMN "status" SET DEFAULT 'requested'`
|
||||
)
|
||||
await queryRunner.query(`DROP TYPE "return_status_enum"`)
|
||||
await queryRunner.query(
|
||||
`ALTER TYPE "return_status_enum_old" RENAME TO "return_status_enum"`
|
||||
)
|
||||
await queryRunner.query(`ALTER TABLE "swap" DROP COLUMN "canceled_at"`)
|
||||
}
|
||||
}
|
||||
@@ -218,6 +218,10 @@ export class ClaimOrder {
|
||||
* refund_amount:
|
||||
* description: "The amount that will be refunded in conjunction with the claim"
|
||||
* type: integer
|
||||
* canceled_at:
|
||||
* description: "The date with timezone at which the Swap was canceled."
|
||||
* type: string
|
||||
* format: date-time
|
||||
* created_at:
|
||||
* type: string
|
||||
* format: date-time
|
||||
|
||||
@@ -28,6 +28,7 @@ export enum ReturnStatus {
|
||||
REQUESTED = "requested",
|
||||
RECEIVED = "received",
|
||||
REQUIRES_ACTION = "requires_action",
|
||||
CANCELED = "canceled",
|
||||
}
|
||||
|
||||
@Entity()
|
||||
@@ -85,7 +86,7 @@ export class Return {
|
||||
@OneToOne(
|
||||
() => ShippingMethod,
|
||||
method => method.return_order,
|
||||
{ eager: true, cascade: true }
|
||||
{ cascade: true }
|
||||
)
|
||||
shipping_method: ShippingMethod
|
||||
|
||||
|
||||
@@ -131,6 +131,9 @@ export class Swap {
|
||||
@DeleteDateColumn({ type: resolveDbType("timestamptz") })
|
||||
deleted_at: Date
|
||||
|
||||
@Column({ type: resolveDbType("timestamptz"), nullable: true })
|
||||
canceled_at: Date
|
||||
|
||||
@Column({ type: "boolean", nullable: true })
|
||||
no_notification: Boolean
|
||||
|
||||
@@ -228,6 +231,10 @@ export class Swap {
|
||||
* description: "The date with timezone at which the resource was last updated."
|
||||
* type: string
|
||||
* format: date-time
|
||||
* canceled_at:
|
||||
* description: "The date with timezone at which the Swap was canceled."
|
||||
* type: string
|
||||
* format: date-time
|
||||
* no_notification:
|
||||
* description: "If set to true, no notification will be sent related to this swap"
|
||||
* type: boolean
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
export const ClaimServiceMock = {
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
retrieve: jest.fn().mockImplementation(data => {
|
||||
return Promise.resolve({ order_id: IdMap.getId("test-order") })
|
||||
}),
|
||||
|
||||
cancel: jest.fn().mockImplementation(f => {
|
||||
return Promise.resolve({ f })
|
||||
}),
|
||||
|
||||
cancelFulfillment: jest.fn().mockImplementation(f => {
|
||||
return Promise.resolve({ f })
|
||||
}),
|
||||
}
|
||||
|
||||
const mock = jest.fn().mockImplementation(() => {
|
||||
return ClaimServiceMock
|
||||
})
|
||||
|
||||
export default mock
|
||||
@@ -0,0 +1,26 @@
|
||||
import { IdMap } from "medusa-test-utils"
|
||||
|
||||
export const FulfillmentServiceMock = {
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
retrieve: jest.fn().mockImplementation(data => {
|
||||
switch (data) {
|
||||
case IdMap.getId("order-fulfillment"):
|
||||
return Promise.resolve({ order_id: IdMap.getId("test-order") })
|
||||
case IdMap.getId("swap-fulfillment"):
|
||||
return Promise.resolve({ swap_id: IdMap.getId("test-swap") })
|
||||
case IdMap.getId("claim-fulfillment"):
|
||||
return Promise.resolve({ claim_order_id: IdMap.getId("test-claim") })
|
||||
}
|
||||
}),
|
||||
cancelFulfillment: jest.fn().mockImplementation(data => {
|
||||
return Promise.resolve({ order_id: IdMap.getId("test-order") })
|
||||
}),
|
||||
}
|
||||
|
||||
const mock = jest.fn().mockImplementation(() => {
|
||||
return FulfillmentServiceMock
|
||||
})
|
||||
|
||||
export default mock
|
||||
@@ -182,6 +182,11 @@ export const OrderServiceMock = {
|
||||
}
|
||||
return Promise.resolve(undefined)
|
||||
}),
|
||||
|
||||
cancelFulfillment: jest.fn().mockImplementation(f => {
|
||||
return Promise.resolve({ f })
|
||||
}),
|
||||
|
||||
archive: jest.fn().mockImplementation(order => {
|
||||
if (order === IdMap.getId("processed-order")) {
|
||||
orders.processedOrder.status = "archived"
|
||||
|
||||
@@ -11,6 +11,21 @@ export const SwapServiceMock = {
|
||||
return Promise.resolve()
|
||||
}),
|
||||
retrieve: jest.fn().mockImplementation(data => {
|
||||
switch (data) {
|
||||
case IdMap.getId("test-swap"):
|
||||
return Promise.resolve({
|
||||
id: "test-swap",
|
||||
order_id: IdMap.getId("test-order"),
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({ id: "test-swap" })
|
||||
}
|
||||
}),
|
||||
cancel: jest.fn().mockImplementation(f => {
|
||||
return Promise.resolve({ f })
|
||||
}),
|
||||
|
||||
cancelFulfillment: jest.fn().mockImplementation(f => {
|
||||
return Promise.resolve({ id: IdMap.getId("test-swap") })
|
||||
}),
|
||||
list: jest.fn().mockImplementation((...args) => {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import _ from "lodash"
|
||||
import { IdMap, MockRepository, MockManager } from "medusa-test-utils"
|
||||
import ClaimService from "../claim"
|
||||
import { InventoryServiceMock } from "../__mocks__/inventory"
|
||||
@@ -68,6 +67,7 @@ describe("ClaimService", () => {
|
||||
|
||||
const lineItemService = {
|
||||
generate: jest.fn((d, _, q) => ({ variant_id: d, quantity: q })),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
withTransaction: function() {
|
||||
withTransactionMock("lineItem")
|
||||
return this
|
||||
@@ -338,6 +338,7 @@ describe("ClaimService", () => {
|
||||
|
||||
const lineItemService = {
|
||||
update: jest.fn(),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
withTransaction: function() {
|
||||
withTransactionMock("lineItem")
|
||||
return this
|
||||
@@ -407,6 +408,16 @@ describe("ClaimService", () => {
|
||||
).rejects.toThrow(`Cannot fulfill a claim without a shipping method.`)
|
||||
})
|
||||
|
||||
it("fails if claim is canceled", async () => {
|
||||
claimRepo.setFindOne(() =>
|
||||
Promise.resolve({ ...claim, canceled_at: new Date() })
|
||||
)
|
||||
|
||||
await expect(
|
||||
claimService.createFulfillment("claim_id", {})
|
||||
).rejects.toThrow("Canceled claim cannot be fulfilled")
|
||||
})
|
||||
|
||||
it("fails if already fulfilled", async () => {
|
||||
claimRepo.setFindOne(() =>
|
||||
Promise.resolve({ ...claim, fulfillment_status: "fulfilled" })
|
||||
@@ -426,6 +437,76 @@ describe("ClaimService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe("cancelFulfillment", () => {
|
||||
const claimRepo = MockRepository({
|
||||
findOne: () => Promise.resolve({}),
|
||||
save: f => Promise.resolve(f),
|
||||
})
|
||||
|
||||
const fulfillmentService = {
|
||||
cancelFulfillment: jest.fn().mockImplementation(f => {
|
||||
switch (f) {
|
||||
case IdMap.getId("no-claim"):
|
||||
return Promise.resolve({})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
claim_order_id: IdMap.getId("claim-id"),
|
||||
})
|
||||
}
|
||||
}),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
const claimService = new ClaimService({
|
||||
manager: MockManager,
|
||||
claimRepository: claimRepo,
|
||||
fulfillmentService,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully cancels fulfillment and corrects claim status", async () => {
|
||||
await claimService.cancelFulfillment(IdMap.getId("claim"))
|
||||
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledWith(
|
||||
IdMap.getId("claim")
|
||||
)
|
||||
|
||||
expect(claimRepo.save).toHaveBeenCalledTimes(1)
|
||||
expect(claimRepo.save).toHaveBeenCalledWith({
|
||||
fulfillment_status: "canceled",
|
||||
})
|
||||
})
|
||||
|
||||
it("fails to cancel fulfillment when not related to a claim", async () => {
|
||||
await expect(
|
||||
claimService.cancelFulfillment(IdMap.getId("no-claim"))
|
||||
).rejects.toThrow(`Fufillment not related to a claim`)
|
||||
})
|
||||
})
|
||||
|
||||
describe("processRefund", () => {
|
||||
const claimRepo = MockRepository({
|
||||
findOne: () => Promise.resolve({ canceled_at: new Date() }),
|
||||
})
|
||||
|
||||
const claimService = new ClaimService({
|
||||
manager: MockManager,
|
||||
claimRepository: claimRepo,
|
||||
})
|
||||
|
||||
it("fails when claim is canceled", async () => {
|
||||
await expect(
|
||||
claimService.processRefund(IdMap.getId("claim-id"))
|
||||
).rejects.toThrow("Canceled claim cannot be processed")
|
||||
})
|
||||
})
|
||||
|
||||
describe("createShipment", () => {
|
||||
const fulfillmentService = {
|
||||
createShipment: jest.fn(() => {
|
||||
@@ -446,6 +527,7 @@ describe("ClaimService", () => {
|
||||
|
||||
const lineItemService = {
|
||||
update: jest.fn(),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
withTransaction: function() {
|
||||
withTransactionMock("lineItem")
|
||||
return this
|
||||
@@ -507,6 +589,35 @@ describe("ClaimService", () => {
|
||||
shipped_quantity: 1,
|
||||
})
|
||||
})
|
||||
|
||||
it("fails if claim is canceled", async () => {
|
||||
claimRepo.setFindOne(() => Promise.resolve({ canceled_at: new Date() }))
|
||||
|
||||
await expect(
|
||||
claimService.createShipment("claim", "ful_123", ["track1234"], {})
|
||||
).rejects.toThrow("Canceled claim cannot be fulfilled as shipped")
|
||||
})
|
||||
})
|
||||
|
||||
describe("update", () => {
|
||||
const claimRepo = MockRepository({
|
||||
findOne: () => Promise.resolve({ canceled_at: new Date() }),
|
||||
})
|
||||
|
||||
const claimService = new ClaimService({
|
||||
manager: MockManager,
|
||||
claimRepository: claimRepo,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("fails when claim is canceled", async () => {
|
||||
await expect(
|
||||
claimService.update(IdMap.getId("claim-id"))
|
||||
).rejects.toThrow("Canceled claim cannot be updated")
|
||||
})
|
||||
})
|
||||
|
||||
describe("cancel", () => {
|
||||
@@ -526,7 +637,31 @@ describe("ClaimService", () => {
|
||||
},
|
||||
}
|
||||
|
||||
const claimRepo = MockRepository()
|
||||
const now = new Date()
|
||||
const ret_order = { id: "ret", status: "canceled" }
|
||||
const fulfillment = { id: "ful_21", canceled_at: now }
|
||||
|
||||
const claimRepo = MockRepository({
|
||||
findOne: q => {
|
||||
const claim = {
|
||||
return_order: { ...ret_order },
|
||||
fulfillments: [{ ...fulfillment }],
|
||||
}
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("fail-fulfillment"):
|
||||
claim.fulfillments[0].canceled_at = undefined
|
||||
return Promise.resolve(claim)
|
||||
case IdMap.getId("fail-return"):
|
||||
claim.return_order.status = "requested"
|
||||
return Promise.resolve(claim)
|
||||
case IdMap.getId("fail-refund"):
|
||||
claim.refund_amount = 123
|
||||
return Promise.resolve(claim)
|
||||
default:
|
||||
return Promise.resolve(claim)
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const claimService = new ClaimService({
|
||||
manager: MockManager,
|
||||
@@ -540,62 +675,26 @@ describe("ClaimService", () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("calls fulfillment service", async () => {
|
||||
claimRepo.setFindOne(() =>
|
||||
Promise.resolve({
|
||||
return_order: {
|
||||
id: "ret",
|
||||
status: "requested",
|
||||
},
|
||||
fulfillments: [
|
||||
{
|
||||
id: "ful_21",
|
||||
},
|
||||
],
|
||||
})
|
||||
)
|
||||
|
||||
await claimService.cancel("claim")
|
||||
|
||||
expect(withTransactionMock).toHaveBeenCalledTimes(3)
|
||||
expect(withTransactionMock).toHaveBeenCalledWith("fulfillment")
|
||||
expect(withTransactionMock).toHaveBeenCalledWith("return")
|
||||
expect(withTransactionMock).toHaveBeenCalledWith("eventBus")
|
||||
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledWith({
|
||||
id: "ful_21",
|
||||
})
|
||||
|
||||
expect(returnService.cancel).toHaveBeenCalledTimes(1)
|
||||
expect(returnService.cancel).toHaveBeenCalledWith("ret")
|
||||
})
|
||||
|
||||
it("fails if fulfillment is shipped", async () => {
|
||||
claimRepo.setFindOne(() =>
|
||||
Promise.resolve({
|
||||
fulfillment_status: "shipped",
|
||||
})
|
||||
)
|
||||
|
||||
await expect(claimService.cancel("id")).rejects.toThrow(
|
||||
"Cannot cancel a claim that has been shipped."
|
||||
it("fails if fulfillment isn't canceled", async () => {
|
||||
await expect(
|
||||
claimService.cancel(IdMap.getId("fail-fulfillment"))
|
||||
).rejects.toThrow(
|
||||
"All fulfillments must be canceled before the claim can be canceled"
|
||||
)
|
||||
})
|
||||
|
||||
it("fails if return is received", async () => {
|
||||
claimRepo.setFindOne(() =>
|
||||
Promise.resolve({
|
||||
return_order: {
|
||||
id: "ret",
|
||||
status: "received",
|
||||
},
|
||||
})
|
||||
it("fails if return isn't canceled", async () => {
|
||||
await expect(
|
||||
claimService.cancel(IdMap.getId("fail-return"))
|
||||
).rejects.toThrow(
|
||||
"Return must be canceled before the claim can be canceled"
|
||||
)
|
||||
})
|
||||
|
||||
await expect(claimService.cancel("id")).rejects.toThrow(
|
||||
"Cannot cancel a claim that has a received return."
|
||||
)
|
||||
it("fails if associated with a refund", async () => {
|
||||
await expect(
|
||||
claimService.cancel(IdMap.getId("fail-refund"))
|
||||
).rejects.toThrow("Claim with a refund cannot be canceled")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -94,10 +94,72 @@ describe("FulfillmentService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe("cancelFulfillment", () => {
|
||||
const fulfillmentRepository = MockRepository({
|
||||
findOne: () =>
|
||||
Promise.resolve({
|
||||
canceled_at: new Date(),
|
||||
items: [{ item_id: 1, quantity: 2 }],
|
||||
}),
|
||||
save: f => f,
|
||||
})
|
||||
|
||||
const lineItemService = {
|
||||
retrieve: jest
|
||||
.fn()
|
||||
.mockImplementation(() =>
|
||||
Promise.resolve({ id: 1, fulfilled_quantity: 2 })
|
||||
),
|
||||
update: jest.fn(),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
const fulfillmentProviderService = {
|
||||
cancelFulfillment: f => f,
|
||||
}
|
||||
|
||||
const fulfillmentService = new FulfillmentService({
|
||||
manager: MockManager,
|
||||
fulfillmentProviderService,
|
||||
fulfillmentRepository,
|
||||
lineItemService,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("correctly cancels fulfillment", async () => {
|
||||
await fulfillmentService.cancelFulfillment(IdMap.getId("fulfillment"))
|
||||
|
||||
expect(fulfillmentRepository.save).toHaveBeenCalledTimes(1)
|
||||
expect(fulfillmentRepository.save).toHaveBeenCalledWith({
|
||||
canceled_at: expect.any(Date),
|
||||
items: expect.any(Array),
|
||||
})
|
||||
|
||||
expect(lineItemService.retrieve).toHaveBeenCalledTimes(1)
|
||||
expect(lineItemService.retrieve).toHaveBeenCalledWith(1)
|
||||
expect(lineItemService.update).toHaveBeenCalledTimes(1)
|
||||
expect(lineItemService.update).toHaveBeenCalledWith(1, {
|
||||
fulfilled_quantity: 0,
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("createShipment", () => {
|
||||
const trackingLinkRepository = MockRepository({ create: c => c })
|
||||
const fulfillmentRepository = MockRepository({
|
||||
findOne: () => Promise.resolve({ id: IdMap.getId("fulfillment") }),
|
||||
findOne: q => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ canceled_at: new Date() })
|
||||
default:
|
||||
return Promise.resolve({ id: IdMap.getId("fulfillment") })
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const fulfillmentService = new FulfillmentService({
|
||||
@@ -130,5 +192,15 @@ describe("FulfillmentService", () => {
|
||||
shipped_at: now,
|
||||
})
|
||||
})
|
||||
|
||||
it("fails when status is canceled", async () => {
|
||||
await expect(
|
||||
fulfillmentService.createShipment(
|
||||
IdMap.getId("canceled"),
|
||||
[({ tracking_number: "1234" }, { tracking_number: "2345" })],
|
||||
{}
|
||||
)
|
||||
).rejects.toThrow("Fulfillment has been canceled")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -524,6 +524,10 @@ describe("OrderService", () => {
|
||||
payment_status: "awaiting",
|
||||
status: "pending",
|
||||
})
|
||||
case IdMap.getId("canceled-order"):
|
||||
return Promise.resolve({
|
||||
status: "canceled",
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
fulfillment_status: "not_fulfilled",
|
||||
@@ -593,9 +597,17 @@ describe("OrderService", () => {
|
||||
"Can't update shipping, billing, items and payment method when order is processed"
|
||||
)
|
||||
})
|
||||
|
||||
it("throws if order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.update(IdMap.getId("canceled-order"), {})
|
||||
).rejects.toThrow("A canceled order cannot be updated")
|
||||
})
|
||||
})
|
||||
|
||||
describe("cancel", () => {
|
||||
const now = new Date()
|
||||
|
||||
const orderRepo = MockRepository({
|
||||
findOneWithRelations: (rel, q) => {
|
||||
switch (q.where.id) {
|
||||
@@ -610,7 +622,7 @@ describe("OrderService", () => {
|
||||
fulfillment_status: "not_fulfilled",
|
||||
payment_status: "awaiting",
|
||||
status: "pending",
|
||||
fulfillments: [{ id: "fulfillment_test" }],
|
||||
fulfillments: [{ id: "fulfillment_test", canceled_at: now }],
|
||||
payments: [{ id: "payment_test" }],
|
||||
items: [
|
||||
{ id: "item_1", variant_id: "variant-1", quantity: 12 },
|
||||
@@ -665,11 +677,6 @@ describe("OrderService", () => {
|
||||
id: "payment_test",
|
||||
})
|
||||
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledWith({
|
||||
id: "fulfillment_test",
|
||||
})
|
||||
|
||||
expect(inventoryService.adjustInventory).toHaveBeenCalledTimes(2)
|
||||
expect(inventoryService.adjustInventory).toHaveBeenCalledWith(
|
||||
"variant-1",
|
||||
@@ -685,7 +692,7 @@ describe("OrderService", () => {
|
||||
fulfillment_status: "canceled",
|
||||
payment_status: "canceled",
|
||||
status: "canceled",
|
||||
fulfillments: [{ id: "fulfillment_test" }],
|
||||
fulfillments: [{ id: "fulfillment_test", canceled_at: now }],
|
||||
payments: [{ id: "payment_test" }],
|
||||
items: [
|
||||
{
|
||||
@@ -701,12 +708,6 @@ describe("OrderService", () => {
|
||||
],
|
||||
})
|
||||
})
|
||||
|
||||
it("throws if order payment is captured", async () => {
|
||||
await expect(
|
||||
orderService.cancel(IdMap.getId("paid-order"))
|
||||
).rejects.toThrow("Can't cancel an order with a processed payment")
|
||||
})
|
||||
})
|
||||
|
||||
describe("capturePayment", () => {
|
||||
@@ -718,7 +719,8 @@ describe("OrderService", () => {
|
||||
payment_status: "awaiting",
|
||||
payments: [{ id: "payment_fail", captured_at: null }],
|
||||
})
|
||||
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ status: "canceled" })
|
||||
default:
|
||||
return Promise.resolve({
|
||||
fulfillment_status: "not_fulfilled",
|
||||
@@ -790,6 +792,12 @@ describe("OrderService", () => {
|
||||
payments: [{ id: "payment_fail", captured_at: null }],
|
||||
})
|
||||
})
|
||||
|
||||
it("fails if order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.capturePayment(IdMap.getId("canceled"))
|
||||
).rejects.toThrow("A canceled order cannot capture payment")
|
||||
})
|
||||
})
|
||||
|
||||
describe("createFulfillment", () => {
|
||||
@@ -828,6 +836,8 @@ describe("OrderService", () => {
|
||||
switch (q.where.id) {
|
||||
case "partial":
|
||||
return Promise.resolve(partialOrder)
|
||||
case "canceled":
|
||||
return Promise.resolve({ status: "canceled", ...order })
|
||||
default:
|
||||
return Promise.resolve(order)
|
||||
}
|
||||
@@ -963,6 +973,16 @@ describe("OrderService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
it("fails if order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.createFulfillment("canceled", [
|
||||
{
|
||||
item_id: "item_1",
|
||||
quantity: 1,
|
||||
},
|
||||
])
|
||||
).rejects.toThrow("A canceled order cannot be fulfilled")
|
||||
})
|
||||
it.each([
|
||||
[true, true],
|
||||
[false, false],
|
||||
@@ -989,6 +1009,60 @@ describe("OrderService", () => {
|
||||
)
|
||||
})
|
||||
|
||||
describe("cancelFulfillment", () => {
|
||||
const orderRepo = MockRepository({
|
||||
findOneWithRelations: () => Promise.resolve({}),
|
||||
save: f => Promise.resolve(f),
|
||||
})
|
||||
|
||||
const fulfillmentService = {
|
||||
cancelFulfillment: jest.fn().mockImplementation(f => {
|
||||
switch (f) {
|
||||
case IdMap.getId("no-order"):
|
||||
return Promise.resolve({})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
order_id: IdMap.getId("order-id"),
|
||||
})
|
||||
}
|
||||
}),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
const orderService = new OrderService({
|
||||
manager: MockManager,
|
||||
orderRepository: orderRepo,
|
||||
fulfillmentService,
|
||||
eventBusService,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully cancels fulfillment and corrects order status", async () => {
|
||||
await orderService.cancelFulfillment(IdMap.getId("order"))
|
||||
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledWith(
|
||||
IdMap.getId("order")
|
||||
)
|
||||
|
||||
expect(orderRepo.save).toHaveBeenCalledTimes(1)
|
||||
expect(orderRepo.save).toHaveBeenCalledWith({
|
||||
fulfillment_status: "canceled",
|
||||
})
|
||||
})
|
||||
|
||||
it("fails to cancel fulfillment when not related to an order", async () => {
|
||||
await expect(
|
||||
orderService.cancelFulfillment(IdMap.getId("no-order"))
|
||||
).rejects.toThrow(`Fufillment not related to an order`)
|
||||
})
|
||||
})
|
||||
|
||||
describe("registerReturnReceived", () => {
|
||||
const order = {
|
||||
items: [
|
||||
@@ -1007,6 +1081,8 @@ describe("OrderService", () => {
|
||||
const orderRepo = MockRepository({
|
||||
findOneWithRelations: (rel, q) => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ status: "canceled", ...order })
|
||||
default:
|
||||
return Promise.resolve(order)
|
||||
}
|
||||
@@ -1077,6 +1153,179 @@ describe("OrderService", () => {
|
||||
"return"
|
||||
)
|
||||
})
|
||||
|
||||
it("fails when order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.registerReturnReceived(IdMap.getId("canceled"), {})
|
||||
).rejects.toThrow("A canceled order cannot be registered as received")
|
||||
})
|
||||
})
|
||||
|
||||
describe("completeOrder", () => {
|
||||
const orderRepo = MockRepository({
|
||||
findOneWithRelations: (rel, q) => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ status: "canceled" })
|
||||
default:
|
||||
return Promise.resolve({ id: IdMap.getId("order") })
|
||||
}
|
||||
},
|
||||
save: jest.fn().mockImplementation(f => f),
|
||||
})
|
||||
|
||||
const eventBus = {
|
||||
emit: () =>
|
||||
Promise.resolve({
|
||||
finished: () => Promise.resolve({}),
|
||||
}),
|
||||
}
|
||||
|
||||
const orderService = new OrderService({
|
||||
manager: MockManager,
|
||||
orderRepository: orderRepo,
|
||||
eventBusService: eventBus,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully creates order", async () => {
|
||||
await orderService.completeOrder(IdMap.getId("order"))
|
||||
|
||||
expect(orderRepo.save).toHaveBeenCalledTimes(1)
|
||||
expect(orderRepo.save).toHaveBeenCalledWith({
|
||||
id: IdMap.getId("order"),
|
||||
status: "completed",
|
||||
})
|
||||
})
|
||||
|
||||
it("fails when order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.completeOrder(IdMap.getId("canceled"))
|
||||
).rejects.toThrow("A canceled order cannot be completed")
|
||||
})
|
||||
})
|
||||
|
||||
describe("addShippingMethod", () => {
|
||||
const orderRepo = MockRepository({
|
||||
findOneWithRelations: (rel, q) => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ status: "canceled" })
|
||||
default:
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("order"),
|
||||
shipping_methods: [
|
||||
{ shipping_option: { profile_id: IdMap.getId("method1") } },
|
||||
],
|
||||
})
|
||||
}
|
||||
},
|
||||
save: jest.fn().mockImplementation(f => f),
|
||||
})
|
||||
|
||||
const optionService = {
|
||||
createShippingMethod: jest
|
||||
.fn()
|
||||
.mockImplementation((optionId, data, config) =>
|
||||
Promise.resolve({ shipping_option: { profile_id: optionId } })
|
||||
),
|
||||
deleteShippingMethod: jest
|
||||
.fn()
|
||||
.mockImplementation(() => Promise.resolve({})),
|
||||
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
const orderService = new OrderService({
|
||||
manager: MockManager,
|
||||
orderRepository: orderRepo,
|
||||
eventBusService: eventBusService,
|
||||
shippingOptionService: optionService,
|
||||
totalsService,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully adds shipping method", async () => {
|
||||
await orderService.addShippingMethod(
|
||||
IdMap.getId("order"),
|
||||
IdMap.getId("option"),
|
||||
{ some: "data" },
|
||||
{}
|
||||
)
|
||||
|
||||
expect(optionService.createShippingMethod).toHaveBeenCalledTimes(1)
|
||||
expect(optionService.createShippingMethod).toHaveBeenCalledWith(
|
||||
IdMap.getId("option"),
|
||||
{ some: "data" },
|
||||
{
|
||||
order: {
|
||||
id: IdMap.getId("order"),
|
||||
shipping_methods: [
|
||||
{
|
||||
shipping_option: {
|
||||
profile_id: IdMap.getId("method1"),
|
||||
},
|
||||
},
|
||||
],
|
||||
subtotal: 0,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
expect(optionService.deleteShippingMethod).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it("successfully removes shipping method if same option profile", async () => {
|
||||
await orderService.addShippingMethod(
|
||||
IdMap.getId("order"),
|
||||
IdMap.getId("method1"),
|
||||
{ some: "data" }
|
||||
)
|
||||
|
||||
expect(optionService.createShippingMethod).toHaveBeenCalledTimes(1)
|
||||
expect(optionService.createShippingMethod).toHaveBeenCalledWith(
|
||||
IdMap.getId("method1"),
|
||||
{ some: "data" },
|
||||
{
|
||||
order: {
|
||||
id: IdMap.getId("order"),
|
||||
shipping_methods: [
|
||||
{
|
||||
shipping_option: {
|
||||
profile_id: IdMap.getId("method1"),
|
||||
},
|
||||
},
|
||||
],
|
||||
subtotal: 0,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
expect(optionService.deleteShippingMethod).toHaveBeenCalledTimes(1)
|
||||
expect(optionService.deleteShippingMethod).toHaveBeenCalledWith({
|
||||
shipping_option: {
|
||||
profile_id: IdMap.getId("method1"),
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("fails if order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.addShippingMethod(
|
||||
IdMap.getId("canceled"),
|
||||
IdMap.getId("option"),
|
||||
{ some: "data" }
|
||||
)
|
||||
).rejects.toThrow("A shipping method cannot be added to a canceled order")
|
||||
})
|
||||
})
|
||||
|
||||
describe("createShipment", () => {
|
||||
@@ -1111,6 +1360,8 @@ describe("OrderService", () => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("partial"):
|
||||
return Promise.resolve(partialOrder)
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ status: "canceled" })
|
||||
default:
|
||||
return Promise.resolve(order)
|
||||
}
|
||||
@@ -1184,6 +1435,18 @@ describe("OrderService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
it("fails when order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.createShipment(
|
||||
IdMap.getId(
|
||||
"canceled",
|
||||
IdMap.getId("fulfillment"),
|
||||
[{ tracking_number: "1234" }],
|
||||
{}
|
||||
)
|
||||
)
|
||||
).rejects.toThrow("A canceled order cannot be fulfilled as shipped")
|
||||
})
|
||||
it.each([
|
||||
[true, true],
|
||||
[false, false],
|
||||
@@ -1213,32 +1476,37 @@ describe("OrderService", () => {
|
||||
|
||||
const orderRepo = MockRepository({
|
||||
findOneWithRelations: (rel, q) => {
|
||||
if (q.where.id === IdMap.getId("cannot")) {
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("order"),
|
||||
payments: [
|
||||
{
|
||||
id: "payment",
|
||||
},
|
||||
],
|
||||
total: 100,
|
||||
refunded_total: 100,
|
||||
})
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("cannot"):
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("order"),
|
||||
payments: [
|
||||
{
|
||||
id: "payment",
|
||||
},
|
||||
],
|
||||
total: 100,
|
||||
refunded_total: 100,
|
||||
})
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({
|
||||
status: "canceled",
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("order_123"),
|
||||
payments: [
|
||||
{
|
||||
id: "payment",
|
||||
},
|
||||
],
|
||||
total: 100,
|
||||
paid_total: 100,
|
||||
refundable_amount: 100,
|
||||
refunded_total: 0,
|
||||
no_notification: true,
|
||||
})
|
||||
}
|
||||
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("order_123"),
|
||||
payments: [
|
||||
{
|
||||
id: "payment",
|
||||
},
|
||||
],
|
||||
total: 100,
|
||||
paid_total: 100,
|
||||
refundable_amount: 100,
|
||||
refunded_total: 0,
|
||||
no_notification: true,
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
@@ -1286,6 +1554,16 @@ describe("OrderService", () => {
|
||||
)
|
||||
).rejects.toThrow("Cannot refund more than the original order amount")
|
||||
})
|
||||
it("fails when order is canceled", async () => {
|
||||
await expect(
|
||||
orderService.createRefund(
|
||||
IdMap.getId("canceled"),
|
||||
100,
|
||||
"discount",
|
||||
"note"
|
||||
)
|
||||
).rejects.toThrow("A canceled order cannot be refunded")
|
||||
})
|
||||
|
||||
it.each([
|
||||
[false, false],
|
||||
|
||||
@@ -145,39 +145,45 @@ describe("ReturnService", () => {
|
||||
describe("receive", () => {
|
||||
const returnRepository = MockRepository({
|
||||
findOne: query => {
|
||||
if (query.where.id === IdMap.getId("test-return-2")) {
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("test-return-2"),
|
||||
status: "requested",
|
||||
order: {
|
||||
id: IdMap.getId("test-order"),
|
||||
items: [
|
||||
{ id: IdMap.getId("test-line"), quantity: 10 },
|
||||
{ id: IdMap.getId("test-line-2"), quantity: 10 },
|
||||
],
|
||||
},
|
||||
items: [
|
||||
{
|
||||
item_id: IdMap.getId("test-line"),
|
||||
quantity: 10,
|
||||
switch (query.where.id) {
|
||||
case IdMap.getId("test-return-2"):
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("test-return-2"),
|
||||
status: "requested",
|
||||
order: {
|
||||
id: IdMap.getId("test-order"),
|
||||
items: [
|
||||
{ id: IdMap.getId("test-line"), quantity: 10 },
|
||||
{ id: IdMap.getId("test-line-2"), quantity: 10 },
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
items: [
|
||||
{
|
||||
item_id: IdMap.getId("test-line"),
|
||||
quantity: 10,
|
||||
},
|
||||
],
|
||||
})
|
||||
case IdMap.getId("test-return-3"):
|
||||
return Promise.resolve({
|
||||
status: "canceled",
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("test-return"),
|
||||
status: "requested",
|
||||
order: {
|
||||
id: IdMap.getId("test-order"),
|
||||
items: [{ id: IdMap.getId("test-line"), quantity: 10 }],
|
||||
},
|
||||
items: [
|
||||
{
|
||||
item_id: IdMap.getId("test-line"),
|
||||
quantity: 10,
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
return Promise.resolve({
|
||||
id: IdMap.getId("test-return"),
|
||||
status: "requested",
|
||||
order: {
|
||||
id: IdMap.getId("test-order"),
|
||||
items: [{ id: IdMap.getId("test-line"), quantity: 10 }],
|
||||
},
|
||||
items: [
|
||||
{
|
||||
item_id: IdMap.getId("test-line"),
|
||||
quantity: 10,
|
||||
},
|
||||
],
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
@@ -349,5 +355,121 @@ describe("ReturnService", () => {
|
||||
received_at: expect.anything(),
|
||||
})
|
||||
})
|
||||
|
||||
it("fails to receive a return which has been canceled", async () => {
|
||||
await expect(
|
||||
returnService.receive(IdMap.getId("test-return-3"), [
|
||||
{ item_id: IdMap.getId("test-line"), quantity: 10 },
|
||||
{ item_id: IdMap.getId("test-line-2"), quantity: 10 },
|
||||
])
|
||||
).rejects.toThrow("Cannot receive a canceled return")
|
||||
})
|
||||
})
|
||||
|
||||
describe("canceled", () => {
|
||||
const returnRepository = MockRepository({
|
||||
findOne: query => {
|
||||
switch (query.where.id) {
|
||||
case IdMap.getId("test-return"):
|
||||
return Promise.resolve({
|
||||
status: "pending",
|
||||
refund_amount: 0,
|
||||
})
|
||||
case IdMap.getId("test-return-2"):
|
||||
return Promise.resolve({
|
||||
status: "received",
|
||||
refund_amount: 0,
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({})
|
||||
}
|
||||
},
|
||||
save: f => f,
|
||||
})
|
||||
|
||||
const returnService = new ReturnService({
|
||||
manager: MockManager,
|
||||
returnRepository,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully cancels return", async () => {
|
||||
await returnService.cancel(IdMap.getId("test-return"))
|
||||
|
||||
expect(returnRepository.save).toHaveBeenCalledTimes(1)
|
||||
expect(returnRepository.save).toHaveBeenCalledWith({
|
||||
status: "canceled",
|
||||
refund_amount: 0,
|
||||
})
|
||||
})
|
||||
|
||||
it("fails to cancel return when already received", async () => {
|
||||
await expect(
|
||||
returnService.cancel(IdMap.getId("test-return-2"))
|
||||
).rejects.toThrow("Can't cancel a return which has been returned")
|
||||
})
|
||||
})
|
||||
|
||||
describe("fulfilled", () => {
|
||||
const returnRepository = MockRepository({
|
||||
findOne: query => {
|
||||
switch (query.where.id) {
|
||||
case IdMap.getId("test-return"):
|
||||
return Promise.resolve({
|
||||
status: "canceled",
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({})
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const returnService = new ReturnService({
|
||||
manager: MockManager,
|
||||
returnRepository,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("fails to fulfill when return is canceled", async () => {
|
||||
await expect(
|
||||
returnService.fulfill(IdMap.getId("test-return"))
|
||||
).rejects.toThrow("Cannot fulfill a canceled return")
|
||||
})
|
||||
})
|
||||
|
||||
describe("update", () => {
|
||||
const returnRepository = MockRepository({
|
||||
findOne: query => {
|
||||
switch (query.where.id) {
|
||||
case IdMap.getId("test-return"):
|
||||
return Promise.resolve({
|
||||
status: "canceled",
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({})
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const returnService = new ReturnService({
|
||||
manager: MockManager,
|
||||
returnRepository,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("fails to update when return is canceled", async () => {
|
||||
await expect(
|
||||
returnService.update(IdMap.getId("test-return"), {})
|
||||
).rejects.toThrow("Cannot update a canceled return")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import paymentService from "medusa-interfaces/dist/payment-service"
|
||||
import { IdMap, MockRepository, MockManager } from "medusa-test-utils"
|
||||
import SwapService from "../swap"
|
||||
import { InventoryServiceMock } from "../__mocks__/inventory"
|
||||
@@ -172,6 +173,7 @@ describe("SwapService", () => {
|
||||
const lineItemService = {
|
||||
create: jest.fn().mockImplementation(d => Promise.resolve(d)),
|
||||
update: jest.fn().mockImplementation(d => Promise.resolve(d)),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
@@ -241,26 +243,42 @@ describe("SwapService", () => {
|
||||
other: "data",
|
||||
}
|
||||
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: (_, query) => {
|
||||
switch (query.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({
|
||||
canceled_at: new Date(),
|
||||
})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
...existing,
|
||||
order_id: IdMap.getId("test"),
|
||||
cart_id: IdMap.getId("swap-cart"),
|
||||
})
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
eventBusService,
|
||||
swapRepository: swapRepo,
|
||||
})
|
||||
|
||||
it("fails if cart already created", async () => {
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: () =>
|
||||
Promise.resolve({
|
||||
...existing,
|
||||
order_id: IdMap.getId("test"),
|
||||
cart_id: IdMap.getId("swap-cart"),
|
||||
}),
|
||||
})
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
eventBusService,
|
||||
swapRepository: swapRepo,
|
||||
})
|
||||
const res = swapService.createCart(IdMap.getId("swap-1"))
|
||||
|
||||
await expect(res).rejects.toThrow(
|
||||
"A cart has already been created for the swap"
|
||||
)
|
||||
})
|
||||
|
||||
it("fails if swap is canceled", async () => {
|
||||
await expect(
|
||||
swapService.createCart(IdMap.getId("canceled"))
|
||||
).rejects.toThrow("Canceled swap cannot be used to create a cart")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -280,6 +298,7 @@ describe("SwapService", () => {
|
||||
quantity,
|
||||
}
|
||||
}),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
}
|
||||
const swapRepo = MockRepository()
|
||||
const returnService = {
|
||||
@@ -441,8 +460,16 @@ describe("SwapService", () => {
|
||||
}
|
||||
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: (rels, q) =>
|
||||
Promise.resolve(q.where.id === IdMap.getId("empty") ? {} : existing),
|
||||
findOneWithRelations: (rels, q) => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ canceled_at: new Date() })
|
||||
case IdMap.getId("empty"):
|
||||
return Promise.resolve({})
|
||||
default:
|
||||
return Promise.resolve(existing)
|
||||
}
|
||||
},
|
||||
})
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
@@ -474,6 +501,12 @@ describe("SwapService", () => {
|
||||
false
|
||||
)
|
||||
})
|
||||
|
||||
it("fails to receive return when swap is canceled", async () => {
|
||||
await expect(
|
||||
swapService.receiveReturn(IdMap.getId("canceled"))
|
||||
).rejects.toThrow("Canceled swap cannot be registered as received")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -511,6 +544,7 @@ describe("SwapService", () => {
|
||||
|
||||
const lineItemService = {
|
||||
update: jest.fn(),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
@@ -563,7 +597,77 @@ describe("SwapService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe("failure", () => {})
|
||||
describe("failure", () => {
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: () =>
|
||||
Promise.resolve({
|
||||
canceled_at: new Date(),
|
||||
}),
|
||||
})
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
swapRepository: swapRepo,
|
||||
})
|
||||
|
||||
it("fails when swap has been canceled", async () => {
|
||||
await expect(
|
||||
swapService.createFulfillment(IdMap.getId("swap"), {})
|
||||
).rejects.toThrow("Canceled swap cannot be fulfilled")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("cancelFulfillment", () => {
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: () => Promise.resolve({}),
|
||||
save: f => Promise.resolve(f),
|
||||
})
|
||||
|
||||
const fulfillmentService = {
|
||||
cancelFulfillment: jest.fn().mockImplementation(f => {
|
||||
switch (f) {
|
||||
case IdMap.getId("no-swap"):
|
||||
return Promise.resolve({})
|
||||
default:
|
||||
return Promise.resolve({
|
||||
swap_id: IdMap.getId("swap-id"),
|
||||
})
|
||||
}
|
||||
}),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
swapRepository: swapRepo,
|
||||
fulfillmentService,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully cancels fulfillment and corrects swap status", async () => {
|
||||
await swapService.cancelFulfillment(IdMap.getId("swap"))
|
||||
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledTimes(1)
|
||||
expect(fulfillmentService.cancelFulfillment).toHaveBeenCalledWith(
|
||||
IdMap.getId("swap")
|
||||
)
|
||||
|
||||
expect(swapRepo.save).toHaveBeenCalledTimes(1)
|
||||
expect(swapRepo.save).toHaveBeenCalledWith({
|
||||
fulfillment_status: "canceled",
|
||||
})
|
||||
})
|
||||
|
||||
it("fails to cancel fulfillment when not related to a swap", async () => {
|
||||
await expect(
|
||||
swapService.cancelFulfillment(IdMap.getId("no-swap"))
|
||||
).rejects.toThrow(`Fufillment not related to a swap`)
|
||||
})
|
||||
})
|
||||
|
||||
describe("createShipment", () => {
|
||||
@@ -631,6 +735,7 @@ describe("SwapService", () => {
|
||||
|
||||
const lineItemService = {
|
||||
update: jest.fn(),
|
||||
retrieve: () => Promise.resolve({}),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
@@ -677,7 +782,25 @@ describe("SwapService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe("failure", () => {})
|
||||
describe("failure", () => {
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: () =>
|
||||
Promise.resolve({ canceled_at: new Date() }),
|
||||
})
|
||||
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
swapRepository: swapRepo,
|
||||
})
|
||||
|
||||
it("fails when swap is canceled", async () => {
|
||||
await expect(
|
||||
swapService.createShipment(
|
||||
IdMap.getId("swap", IdMap.getId("fulfillment"), [], {})
|
||||
)
|
||||
).rejects.toThrow("Canceled swap cannot be fulfilled as shipped")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("registerCartCompletion", () => {
|
||||
@@ -794,11 +917,19 @@ describe("SwapService", () => {
|
||||
}
|
||||
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: () => Promise.resolve(existing),
|
||||
findOneWithRelations: (rels, q) => {
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("canceled"):
|
||||
return Promise.resolve({ canceled_at: new Date() })
|
||||
default:
|
||||
return Promise.resolve(existing)
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
swapRepo: swapRepo,
|
||||
eventBusService,
|
||||
swapRepository: swapRepo,
|
||||
totalsService,
|
||||
@@ -808,6 +939,11 @@ describe("SwapService", () => {
|
||||
inventoryService,
|
||||
})
|
||||
|
||||
it("fails to register cart completion when swap is canceled", async () => {
|
||||
await expect(
|
||||
swapService.registerCartCompletion(IdMap.getId("canceled"))
|
||||
).rejects.toThrow("Cart related to canceled swap cannot be completed")
|
||||
})
|
||||
it("throws an error because inventory is to low", async () => {
|
||||
try {
|
||||
await swapService.registerCartCompletion(IdMap.getId("swap"))
|
||||
@@ -867,6 +1003,8 @@ describe("SwapService", () => {
|
||||
return Promise.resolve(existing(0, false))
|
||||
case "not_conf":
|
||||
return Promise.resolve(existing(1, false, false))
|
||||
case "canceled":
|
||||
return Promise.resolve({ canceled_at: new Date() })
|
||||
default:
|
||||
return Promise.resolve(existing(1, false))
|
||||
}
|
||||
@@ -938,6 +1076,12 @@ describe("SwapService", () => {
|
||||
})
|
||||
})
|
||||
|
||||
it("fails as swap is canceled", async () => {
|
||||
await expect(swapService.processDifference("canceled")).rejects.toThrow(
|
||||
"Canceled swap cannot be processed"
|
||||
)
|
||||
})
|
||||
|
||||
it("zero", async () => {
|
||||
await swapService.processDifference("0")
|
||||
expect(swapRepo.save).toHaveBeenCalledWith({
|
||||
@@ -980,6 +1124,10 @@ describe("SwapService", () => {
|
||||
order_id: IdMap.getId("order"),
|
||||
return_order: { status: "received" },
|
||||
})
|
||||
case "canceled":
|
||||
return Promise.resolve({
|
||||
canceled_at: new Date(),
|
||||
})
|
||||
default:
|
||||
return Promise.resolve()
|
||||
}
|
||||
@@ -1002,6 +1150,109 @@ describe("SwapService", () => {
|
||||
|
||||
expect(eventBusService.emit).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
it("fails to register as received when swap is canceled", async () => {
|
||||
await expect(swapService.registerReceived("canceled")).rejects.toThrow(
|
||||
"Canceled swap cannot be registered as received"
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("cancel", () => {
|
||||
const now = new Date()
|
||||
const payment = { id: IdMap.getId("payment") }
|
||||
const return_order = { status: "canceled" }
|
||||
const fulfillment = { canceled_at: now }
|
||||
|
||||
const paymentProviderService = {
|
||||
cancelPayment: jest.fn(() => Promise.resolve({})),
|
||||
withTransaction: function() {
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
const swapRepo = MockRepository({
|
||||
findOneWithRelations: (_, q) => {
|
||||
const swap = {
|
||||
payment: { ...payment },
|
||||
return_order: { ...return_order },
|
||||
fulfillments: [{ ...fulfillment }, { ...fulfillment }],
|
||||
}
|
||||
switch (q.where.id) {
|
||||
case IdMap.getId("fail-fulfillment"):
|
||||
swap.fulfillments[1].canceled_at = undefined
|
||||
return Promise.resolve(swap)
|
||||
case IdMap.getId("fail-return"):
|
||||
swap.return_order.status = "received"
|
||||
return Promise.resolve(swap)
|
||||
case IdMap.getId("fail-refund-1"):
|
||||
swap.payment_status = "difference_refunded"
|
||||
return Promise.resolve(swap)
|
||||
case IdMap.getId("fail-refund-2"):
|
||||
swap.payment_status = "partially_refunded"
|
||||
return Promise.resolve(swap)
|
||||
case IdMap.getId("fail-refund-3"):
|
||||
swap.payment_status = "refunded"
|
||||
return Promise.resolve(swap)
|
||||
default:
|
||||
return Promise.resolve(swap)
|
||||
}
|
||||
},
|
||||
save: f => f,
|
||||
})
|
||||
|
||||
const swapService = new SwapService({
|
||||
manager: MockManager,
|
||||
swapRepository: swapRepo,
|
||||
paymentProviderService,
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
it("successfully cancels valid swap", async () => {
|
||||
await swapService.cancel(IdMap.getId("complete"))
|
||||
|
||||
expect(swapRepo.save).toHaveBeenCalledTimes(1)
|
||||
expect(swapRepo.save).toHaveBeenCalledWith({
|
||||
payment_status: "canceled",
|
||||
fulfillment_status: "canceled",
|
||||
canceled_at: expect.any(Date),
|
||||
fulfillments: expect.anything(),
|
||||
payment: expect.anything(),
|
||||
return_order: expect.anything(),
|
||||
})
|
||||
expect(paymentProviderService.cancelPayment).toHaveBeenCalledTimes(1)
|
||||
expect(paymentProviderService.cancelPayment).toHaveBeenCalledWith({
|
||||
id: IdMap.getId("payment"),
|
||||
})
|
||||
})
|
||||
|
||||
it("fails to cancel swap when fulfillment not canceled", async () => {
|
||||
await expect(
|
||||
swapService.cancel(IdMap.getId("fail-fulfillment"))
|
||||
).rejects.toThrow(
|
||||
"All fulfillments must be canceled before the swap can be canceled"
|
||||
)
|
||||
})
|
||||
|
||||
it("fails to cancel swap when return not canceled", async () => {
|
||||
await expect(
|
||||
swapService.cancel(IdMap.getId("fail-return"))
|
||||
).rejects.toThrow(
|
||||
"Return must be canceled before the swap can be cancele"
|
||||
)
|
||||
})
|
||||
|
||||
it.each([["fail-refund-1"], ["fail-refund-2"], ["fail-refund-3"]])(
|
||||
"fails to cancel swap when contains refund",
|
||||
async input => {
|
||||
await expect(swapService.cancel(IdMap.getId(input))).rejects.toThrow(
|
||||
"Swap with a refund cannot be canceled"
|
||||
)
|
||||
}
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -106,7 +106,20 @@ class ClaimService extends BaseService {
|
||||
const claimRepo = manager.getCustomRepository(this.claimRepository_)
|
||||
const claim = await this.retrieve(id, { relations: ["shipping_methods"] })
|
||||
|
||||
const { claim_items, shipping_methods, metadata, no_notification } = data
|
||||
if (claim.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled claim cannot be updated"
|
||||
)
|
||||
}
|
||||
|
||||
const {
|
||||
claim_items,
|
||||
shipping_methods,
|
||||
metadata,
|
||||
fulfillment_status,
|
||||
no_notification,
|
||||
} = data
|
||||
|
||||
if (metadata) {
|
||||
claim.metadata = this.setMetadata_(claim, metadata)
|
||||
@@ -189,6 +202,23 @@ class ClaimService extends BaseService {
|
||||
...rest
|
||||
} = data
|
||||
|
||||
for (const item of claim_items) {
|
||||
const line = await this.lineItemService_.retrieve(item.item_id, {
|
||||
relations: ["order", "swap", "claim_order"],
|
||||
})
|
||||
|
||||
if (
|
||||
line.order?.canceled_at ||
|
||||
line.swap?.canceled_at ||
|
||||
line.claim_order?.canceled_at
|
||||
) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
`Cannot create a claim on a canceled item.`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
let addressId = shipping_address_id || order.shipping_address_id
|
||||
if (shipping_address) {
|
||||
const addressRepo = manager.getCustomRepository(this.addressRepo_)
|
||||
@@ -345,9 +375,19 @@ class ClaimService extends BaseService {
|
||||
],
|
||||
})
|
||||
|
||||
if (claim.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled claim cannot be fulfilled"
|
||||
)
|
||||
}
|
||||
|
||||
const order = claim.order
|
||||
|
||||
if (claim.fulfillment_status !== "not_fulfilled") {
|
||||
if (
|
||||
claim.fulfillment_status !== "not_fulfilled" &&
|
||||
claim.fulfillment_status !== "canceled"
|
||||
) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"The claim has already been fulfilled."
|
||||
@@ -444,12 +484,42 @@ class ClaimService extends BaseService {
|
||||
})
|
||||
}
|
||||
|
||||
async cancelFulfillment(fulfillmentId) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const canceled = await this.fulfillmentService_
|
||||
.withTransaction(manager)
|
||||
.cancelFulfillment(fulfillmentId)
|
||||
|
||||
if (!canceled.claim_order_id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`Fufillment not related to a claim`
|
||||
)
|
||||
}
|
||||
|
||||
const claim = await this.retrieve(canceled.claim_order_id)
|
||||
|
||||
claim.fulfillment_status = "canceled"
|
||||
|
||||
const claimRepo = manager.getCustomRepository(this.claimRepository_)
|
||||
const updated = await claimRepo.save(claim)
|
||||
return updated
|
||||
})
|
||||
}
|
||||
|
||||
async processRefund(id) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const claim = await this.retrieve(id, {
|
||||
relations: ["order", "order.payments"],
|
||||
})
|
||||
|
||||
if (claim.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled claim cannot be processed"
|
||||
)
|
||||
}
|
||||
|
||||
if (claim.type !== "refund") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
@@ -495,6 +565,12 @@ class ClaimService extends BaseService {
|
||||
relations: ["additional_items"],
|
||||
})
|
||||
|
||||
if (claim.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled claim cannot be fulfilled as shipped"
|
||||
)
|
||||
}
|
||||
const evaluatedNoNotification =
|
||||
no_notification !== undefined ? no_notification : claim.no_notification
|
||||
|
||||
@@ -543,39 +619,35 @@ class ClaimService extends BaseService {
|
||||
async cancel(id) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const claim = await this.retrieve(id, {
|
||||
relations: ["return_order", "fulfillments"],
|
||||
relations: ["return_order", "fulfillments", "order", "order.refunds"],
|
||||
})
|
||||
|
||||
if (
|
||||
claim.fulfillment_status === "shipped" ||
|
||||
claim.fulfillment_status === "partially_shipped"
|
||||
) {
|
||||
if (claim.refund_amount) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`Cannot cancel a claim that has been shipped.`
|
||||
"Claim with a refund cannot be canceled"
|
||||
)
|
||||
}
|
||||
|
||||
if (claim?.return_order?.status === "received") {
|
||||
if (claim.fulfillments) {
|
||||
for (const f of claim.fulfillments) {
|
||||
if (!f.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"All fulfillments must be canceled before the claim can be canceled"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (claim.return_order && claim.return_order.status !== "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`Cannot cancel a claim that has a received return.`
|
||||
"Return must be canceled before the claim can be canceled"
|
||||
)
|
||||
}
|
||||
|
||||
if (claim.return_order) {
|
||||
await this.returnService_
|
||||
.withTransaction(manager)
|
||||
.cancel(claim.return_order.id)
|
||||
}
|
||||
|
||||
await Promise.all(
|
||||
claim.fulfillments.map(f =>
|
||||
this.fulfillmentService_.withTransaction(manager).cancelFulfillment(f)
|
||||
)
|
||||
)
|
||||
|
||||
claim.fulfillment_status = "canceled"
|
||||
claim.canceled_at = new Date()
|
||||
|
||||
const claimRepo = manager.getCustomRepository(this.claimRepository_)
|
||||
const result = await claimRepo.save(claim)
|
||||
|
||||
@@ -195,6 +195,7 @@ class FulfillmentService extends BaseService {
|
||||
})
|
||||
|
||||
let result = await fulfillmentRepository.save(ful)
|
||||
|
||||
result.data = await this.fulfillmentProviderService_.createFulfillment(
|
||||
shipping_method,
|
||||
items,
|
||||
@@ -211,7 +212,9 @@ class FulfillmentService extends BaseService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels a fulfillment with the fulfillment provider.
|
||||
* Cancels a fulfillment with the fulfillment provider. Will decrement the
|
||||
* fulfillment_quantity on the line items associated with the fulfillment.
|
||||
* Throws if the fulfillment has already been shipped.
|
||||
* @param {Fulfillment|string} fulfillmentOrId - the fulfillment object or id.
|
||||
* @return {Promise} the result of the save operation
|
||||
*
|
||||
@@ -222,17 +225,36 @@ class FulfillmentService extends BaseService {
|
||||
if (typeof fulfillmentOrId === "object") {
|
||||
id = fulfillmentOrId.id
|
||||
}
|
||||
const fulfillment = await this.retrieve(id)
|
||||
const fulfillment = await this.retrieve(id, {
|
||||
relations: ["items", "claim_order", "swap"],
|
||||
})
|
||||
|
||||
if (fulfillment.shipped_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`The fulfillment has already been shipped. Shipped fulfillments cannot be canceled`
|
||||
)
|
||||
}
|
||||
|
||||
await this.fulfillmentProviderService_.cancelFulfillment(fulfillment)
|
||||
|
||||
fulfillment.status = "canceled"
|
||||
fulfillment.canceled_at = new Date()
|
||||
|
||||
const lineItemService = this.lineItemService_.withTransaction(manager)
|
||||
|
||||
for (const fItem of fulfillment.items) {
|
||||
const item = await lineItemService.retrieve(fItem.item_id)
|
||||
const fulfilledQuantity = item.fulfilled_quantity - fItem.quantity
|
||||
await lineItemService.update(item.id, {
|
||||
fulfilled_quantity: fulfilledQuantity,
|
||||
})
|
||||
}
|
||||
|
||||
const fulfillmentRepo = manager.getCustomRepository(
|
||||
this.fulfillmentRepository_
|
||||
)
|
||||
const result = await fulfillmentRepo.save(fulfillment)
|
||||
return result
|
||||
const canceled = await fulfillmentRepo.save(fulfillment)
|
||||
return canceled
|
||||
})
|
||||
}
|
||||
|
||||
@@ -266,6 +288,13 @@ class FulfillmentService extends BaseService {
|
||||
relations: ["items"],
|
||||
})
|
||||
|
||||
if (fulfillment.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Fulfillment has been canceled"
|
||||
)
|
||||
}
|
||||
|
||||
const now = new Date()
|
||||
fulfillment.shipped_at = now
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { BaseService } from "medusa-interfaces"
|
||||
import { MedusaError } from "medusa-core-utils"
|
||||
const fs = require("fs")
|
||||
|
||||
class InventoryService extends BaseService {
|
||||
constructor({ manager, productVariantService }) {
|
||||
|
||||
@@ -10,6 +10,7 @@ class OrderService extends BaseService {
|
||||
PAYMENT_CAPTURE_FAILED: "order.payment_capture_failed",
|
||||
SHIPMENT_CREATED: "order.shipment_created",
|
||||
FULFILLMENT_CREATED: "order.fulfillment_created",
|
||||
FULFILLMENT_CANCELED: "order.fulfillment_canceled",
|
||||
RETURN_REQUESTED: "order.return_requested",
|
||||
ITEMS_RETURNED: "order.items_returned",
|
||||
RETURN_ACTION_REQUIRED: "order.return_action_required",
|
||||
@@ -408,6 +409,13 @@ class OrderService extends BaseService {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const order = await this.retrieve(orderId)
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot be completed"
|
||||
)
|
||||
}
|
||||
|
||||
// Run all other registered events
|
||||
const completeOrderJob = await this.eventBus_.emit(
|
||||
OrderService.Events.COMPLETED,
|
||||
@@ -618,6 +626,13 @@ class OrderService extends BaseService {
|
||||
const order = await this.retrieve(orderId, { relations: ["items"] })
|
||||
const shipment = await this.fulfillmentService_.retrieve(fulfillmentId)
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot be fulfilled as shipped"
|
||||
)
|
||||
}
|
||||
|
||||
if (!shipment || shipment.order_id !== orderId) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
@@ -773,6 +788,13 @@ class OrderService extends BaseService {
|
||||
})
|
||||
const { shipping_methods } = order
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A shipping method cannot be added to a canceled order"
|
||||
)
|
||||
}
|
||||
|
||||
const newMethod = await this.shippingOptionService_
|
||||
.withTransaction(manager)
|
||||
.createShippingMethod(optionId, data, { order, ...config })
|
||||
@@ -814,6 +836,13 @@ class OrderService extends BaseService {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const order = await this.retrieve(orderId)
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot be updated"
|
||||
)
|
||||
}
|
||||
|
||||
if (
|
||||
(update.payment || update.items) &&
|
||||
(order.fulfillment_status !== "not_fulfilled" ||
|
||||
@@ -893,23 +922,36 @@ class OrderService extends BaseService {
|
||||
async cancel(orderId) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const order = await this.retrieve(orderId, {
|
||||
relations: ["fulfillments", "payments", "items"],
|
||||
relations: [
|
||||
"fulfillments",
|
||||
"payments",
|
||||
"returns",
|
||||
"claims",
|
||||
"swaps",
|
||||
"items",
|
||||
],
|
||||
})
|
||||
|
||||
if (order.payment_status !== "awaiting") {
|
||||
if (order.refunds?.length > 0) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Can't cancel an order with a processed payment"
|
||||
"Order with refund(s) cannot be canceled"
|
||||
)
|
||||
}
|
||||
|
||||
await Promise.all(
|
||||
order.fulfillments.map(fulfillment =>
|
||||
this.fulfillmentService_
|
||||
.withTransaction(manager)
|
||||
.cancelFulfillment(fulfillment)
|
||||
)
|
||||
)
|
||||
const throwErrorIf = (arr, pred, type) =>
|
||||
arr?.filter(pred).find(_ => {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`All ${type} must be canceled before canceling an order`
|
||||
)
|
||||
})
|
||||
const notCanceled = o => !o.canceled_at
|
||||
|
||||
throwErrorIf(order.fulfillments, notCanceled, "fulfillments")
|
||||
throwErrorIf(order.returns, r => r.status !== "canceled", "returns")
|
||||
throwErrorIf(order.swaps, notCanceled, "swaps")
|
||||
throwErrorIf(order.claims, notCanceled, "claims")
|
||||
|
||||
for (const item of order.items) {
|
||||
await this.inventoryService_
|
||||
@@ -950,6 +992,13 @@ class OrderService extends BaseService {
|
||||
const orderRepo = manager.getCustomRepository(this.orderRepository_)
|
||||
const order = await this.retrieve(orderId, { relations: ["payments"] })
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot capture payment"
|
||||
)
|
||||
}
|
||||
|
||||
const payments = []
|
||||
for (const p of order.payments) {
|
||||
if (p.captured_at === null) {
|
||||
@@ -1075,6 +1124,13 @@ class OrderService extends BaseService {
|
||||
],
|
||||
})
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot be fulfilled"
|
||||
)
|
||||
}
|
||||
|
||||
if (!order.shipping_methods?.length) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
@@ -1124,6 +1180,7 @@ class OrderService extends BaseService {
|
||||
const orderRepo = manager.getCustomRepository(this.orderRepository_)
|
||||
|
||||
order.fulfillments = [...order.fulfillments, ...fulfillments]
|
||||
|
||||
const result = await orderRepo.save(order)
|
||||
|
||||
const evaluatedNoNotification =
|
||||
@@ -1143,6 +1200,43 @@ class OrderService extends BaseService {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels a fulfillment (if related to an order)
|
||||
* @param {string} fulfillmentId - the ID of the fulfillment to cancel
|
||||
* @returns updated order
|
||||
*/
|
||||
async cancelFulfillment(fulfillmentId) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const canceled = await this.fulfillmentService_
|
||||
.withTransaction(manager)
|
||||
.cancelFulfillment(fulfillmentId)
|
||||
|
||||
if (!canceled.order_id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`Fufillment not related to an order`
|
||||
)
|
||||
}
|
||||
|
||||
const order = await this.retrieve(canceled.order_id)
|
||||
|
||||
order.fulfillment_status = "canceled"
|
||||
|
||||
const orderRepo = manager.getCustomRepository(this.orderRepository_)
|
||||
const updated = await orderRepo.save(order)
|
||||
|
||||
await this.eventBus_
|
||||
.withTransaction(manager)
|
||||
.emit(OrderService.Events.FULFILLMENT_CANCELED, {
|
||||
id: order.id,
|
||||
fulfillment_id: canceled.id,
|
||||
no_notification: canceled.no_notification,
|
||||
})
|
||||
|
||||
return updated
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the order line items, given an array of items.
|
||||
* @param {Order} order - the order to get line items from
|
||||
@@ -1208,6 +1302,13 @@ class OrderService extends BaseService {
|
||||
relations: ["payments"],
|
||||
})
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot be refunded"
|
||||
)
|
||||
}
|
||||
|
||||
if (refundAmount > order.refundable_amount) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
@@ -1312,6 +1413,13 @@ class OrderService extends BaseService {
|
||||
relations: ["items", "returns", "payments"],
|
||||
})
|
||||
|
||||
if (order.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"A canceled order cannot be registered as received"
|
||||
)
|
||||
}
|
||||
|
||||
if (!receivedReturn || receivedReturn.order_id !== orderId) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_FOUND,
|
||||
|
||||
@@ -321,7 +321,6 @@ class PaymentProviderService extends BaseService {
|
||||
async cancelPayment(paymentObj) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const payment = await this.retrievePayment(paymentObj.id)
|
||||
|
||||
const provider = this.retrieveProvider(payment.provider_id)
|
||||
payment.data = await provider.cancelPayment(payment)
|
||||
|
||||
|
||||
@@ -116,6 +116,31 @@ class ReturnService extends BaseService {
|
||||
return returnRepo.find(query)
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels a return if possible. Returns can be canceled if it has not been received.
|
||||
* @param {string} returnId - the id of the return to cancel.
|
||||
* @return {Promise<Return>} the updated Return
|
||||
*/
|
||||
async cancel(returnId) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const ret = await this.retrieve(returnId)
|
||||
|
||||
if (ret.status === "received") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Can't cancel a return which has been returned"
|
||||
)
|
||||
}
|
||||
|
||||
const retRepo = manager.getCustomRepository(this.returnRepository_)
|
||||
|
||||
ret.status = "canceled"
|
||||
|
||||
const result = retRepo.save(ret)
|
||||
return result
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that an order has the statuses necessary to complete a return.
|
||||
* fulfillment_status cannot be not_fulfilled or returned.
|
||||
@@ -236,6 +261,13 @@ class ReturnService extends BaseService {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const ret = await this.retrieve(returnId)
|
||||
|
||||
if (ret.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Cannot update a canceled return"
|
||||
)
|
||||
}
|
||||
|
||||
const { metadata, ...rest } = update
|
||||
|
||||
if ("metadata" in update) {
|
||||
@@ -272,6 +304,23 @@ class ReturnService extends BaseService {
|
||||
delete data.order_id
|
||||
}
|
||||
|
||||
for (const item of data.items) {
|
||||
const line = await this.lineItemService_.retrieve(item.item_id, {
|
||||
relations: ["order", "swap", "claim_order"],
|
||||
})
|
||||
|
||||
if (
|
||||
line.order?.canceled_at ||
|
||||
line.swap?.canceled_at ||
|
||||
line.claim_order?.canceled_at
|
||||
) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
`Cannot create a return for a canceled item.`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const order = await this.orderService_
|
||||
.withTransaction(manager)
|
||||
.retrieve(orderId, {
|
||||
@@ -370,6 +419,13 @@ class ReturnService extends BaseService {
|
||||
],
|
||||
})
|
||||
|
||||
if (returnOrder.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Cannot fulfill a canceled return"
|
||||
)
|
||||
}
|
||||
|
||||
let returnData = { ...returnOrder }
|
||||
|
||||
const items = await this.lineItemService_.list({
|
||||
@@ -429,6 +485,13 @@ class ReturnService extends BaseService {
|
||||
relations: ["items", "swap", "swap.additional_items"],
|
||||
})
|
||||
|
||||
if (returnObj.status === "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Cannot receive a canceled return"
|
||||
)
|
||||
}
|
||||
|
||||
let orderId = returnObj.order_id
|
||||
// check if return is requested on a swap
|
||||
if (returnObj.swap) {
|
||||
|
||||
@@ -314,6 +314,24 @@ class SwapService extends BaseService {
|
||||
)
|
||||
}
|
||||
|
||||
for (const item of returnItems) {
|
||||
const line = await this.lineItemService_.retrieve(item.item_id, {
|
||||
relations: ["order", "swap", "claim_order"],
|
||||
})
|
||||
console.log(line)
|
||||
|
||||
if (
|
||||
line.order?.canceled_at ||
|
||||
line.swap?.canceled_at ||
|
||||
line.claim_order?.canceled_at
|
||||
) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.INVALID_DATA,
|
||||
`Cannot create a swap on a canceled item.`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const newItems = await Promise.all(
|
||||
additionalItems.map(({ variant_id, quantity }) => {
|
||||
return this.lineItemService_.generate(
|
||||
@@ -364,6 +382,13 @@ class SwapService extends BaseService {
|
||||
relations: ["payment", "order", "order.payments"],
|
||||
})
|
||||
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled swap cannot be processed"
|
||||
)
|
||||
}
|
||||
|
||||
if (!swap.confirmed_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
@@ -515,6 +540,13 @@ class SwapService extends BaseService {
|
||||
],
|
||||
})
|
||||
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled swap cannot be used to create a cart"
|
||||
)
|
||||
}
|
||||
|
||||
if (swap.cart_id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.DUPLICATE_ERROR,
|
||||
@@ -625,6 +657,13 @@ class SwapService extends BaseService {
|
||||
return swap
|
||||
}
|
||||
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Cart related to canceled swap cannot be completed"
|
||||
)
|
||||
}
|
||||
|
||||
const cart = swap.cart
|
||||
|
||||
const items = swap.cart.items
|
||||
@@ -716,6 +755,13 @@ class SwapService extends BaseService {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const swap = await this.retrieve(swapId, { relations: ["return_order"] })
|
||||
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled swap cannot be registered as received"
|
||||
)
|
||||
}
|
||||
|
||||
const returnId = swap.return_order && swap.return_order.id
|
||||
if (!returnId) {
|
||||
throw new MedusaError(
|
||||
@@ -739,6 +785,64 @@ class SwapService extends BaseService {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels a given swap if possible. A swap can only be canceled if all
|
||||
* related returns, fulfillments, and payments have been canceled. If a swap
|
||||
* is associated with a refund, it cannot be canceled.
|
||||
* @param {string} swapId - the id of the swap to cancel.
|
||||
* @returns {Promise<Swap>} the canceled swap.
|
||||
*/
|
||||
async cancel(swapId) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const swap = await this.retrieve(swapId, {
|
||||
relations: ["payment", "fulfillments", "return_order"],
|
||||
})
|
||||
|
||||
if (
|
||||
swap.payment_status === "difference_refunded" ||
|
||||
swap.payment_status === "partially_refunded" ||
|
||||
swap.payment_status === "refunded"
|
||||
) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Swap with a refund cannot be canceled"
|
||||
)
|
||||
}
|
||||
|
||||
if (swap.fulfillments) {
|
||||
for (const f of swap.fulfillments) {
|
||||
if (!f.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"All fulfillments must be canceled before the swap can be canceled"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (swap.return_order && swap.return_order.status !== "canceled") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Return must be canceled before the swap can be canceled"
|
||||
)
|
||||
}
|
||||
|
||||
swap.payment_status = "canceled"
|
||||
swap.fulfillment_status = "canceled"
|
||||
swap.canceled_at = new Date()
|
||||
|
||||
if (swap.payment) {
|
||||
await this.paymentProviderService_
|
||||
.withTransaction(manager)
|
||||
.cancelPayment(swap.payment)
|
||||
}
|
||||
|
||||
const swapRepo = manager.getCustomRepository(this.swapRepository_)
|
||||
const result = await swapRepo.save(swap)
|
||||
return result
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Fulfills the addtional items associated with the swap. Will call the
|
||||
* fulfillment providers associated with the shipping methods.
|
||||
@@ -770,7 +874,17 @@ class SwapService extends BaseService {
|
||||
})
|
||||
const order = swap.order
|
||||
|
||||
if (swap.fulfillment_status !== "not_fulfilled") {
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled swap cannot be fulfilled"
|
||||
)
|
||||
}
|
||||
|
||||
if (
|
||||
swap.fulfillment_status !== "not_fulfilled" &&
|
||||
swap.fulfillment_status !== "canceled"
|
||||
) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"The swap was already fulfilled"
|
||||
@@ -861,6 +975,34 @@ class SwapService extends BaseService {
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels a fulfillment (if related to a swap)
|
||||
* @param {string} fulfillmentId - the ID of the fulfillment to cancel
|
||||
* @returns updated swap
|
||||
*/
|
||||
async cancelFulfillment(fulfillmentId) {
|
||||
return this.atomicPhase_(async manager => {
|
||||
const canceled = await this.fulfillmentService_
|
||||
.withTransaction(manager)
|
||||
.cancelFulfillment(fulfillmentId)
|
||||
|
||||
if (!canceled.swap_id) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
`Fufillment not related to a swap`
|
||||
)
|
||||
}
|
||||
|
||||
const swap = await this.retrieve(canceled.swap_id)
|
||||
|
||||
swap.fulfillment_status = "canceled"
|
||||
|
||||
const swapRepo = manager.getCustomRepository(this.swapRepository_)
|
||||
const updated = await swapRepo.save(swap)
|
||||
return updated
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks a fulfillment as shipped and attaches tracking numbers.
|
||||
* @param {string} swapId - the id of the swap that has been shipped.
|
||||
@@ -887,6 +1029,12 @@ class SwapService extends BaseService {
|
||||
relations: ["additional_items"],
|
||||
})
|
||||
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled swap cannot be fulfilled as shipped"
|
||||
)
|
||||
}
|
||||
const evaluatedNoNotification =
|
||||
no_notification !== undefined ? no_notification : swap.no_notification
|
||||
|
||||
@@ -969,6 +1117,13 @@ class SwapService extends BaseService {
|
||||
relations: ["return_order", "return_order.items"],
|
||||
})
|
||||
|
||||
if (swap.canceled_at) {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
"Canceled swap cannot be registered as received"
|
||||
)
|
||||
}
|
||||
|
||||
if (swap.return_order.status !== "received") {
|
||||
throw new MedusaError(
|
||||
MedusaError.Types.NOT_ALLOWED,
|
||||
|
||||
+54
-36
@@ -1407,10 +1407,10 @@
|
||||
"@types/yargs" "^15.0.0"
|
||||
chalk "^3.0.0"
|
||||
|
||||
"@medusajs/medusa-cli@^1.1.16":
|
||||
version "1.1.16"
|
||||
resolved "https://registry.yarnpkg.com/@medusajs/medusa-cli/-/medusa-cli-1.1.16.tgz#3ddcd5b16388a387c430116b962bb27a933ee85e"
|
||||
integrity sha512-QvE7IYkR3NFiy4seZklfX+Xs/dJannVLbKfxLQbxCV2Sso3ZtJbSJt1BpTUwDxYjOFWXyTxRRjO1kEnA1yqCBA==
|
||||
"@medusajs/medusa-cli@1.1.16-dev-1631019393655":
|
||||
version "1.1.16-dev-1631019393655"
|
||||
resolved "http://localhost:4873/@medusajs%2fmedusa-cli/-/medusa-cli-1.1.16-dev-1631019393655.tgz#68fc30f7053df428cd7a4e5a443326371818a20d"
|
||||
integrity sha512-5wUVfTJahuHBbY4U5iuwSKbE/Dn3S/fC8MWVpP5R/JFNK484zR3On1qBL0I9tXtsUd9CmB+jKI59w6D49wJ29A==
|
||||
dependencies:
|
||||
"@babel/polyfill" "^7.8.7"
|
||||
"@babel/runtime" "^7.9.6"
|
||||
@@ -1428,8 +1428,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.20-dev-1631019393655"
|
||||
medusa-telemetry "0.0.3-dev-1631019393655"
|
||||
netrc-parser "^3.1.6"
|
||||
open "^8.0.6"
|
||||
ora "^5.4.1"
|
||||
@@ -2046,10 +2046,10 @@ babel-preset-jest@^25.5.0:
|
||||
babel-plugin-jest-hoist "^25.5.0"
|
||||
babel-preset-current-node-syntax "^0.1.2"
|
||||
|
||||
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.13-dev-1631019393655:
|
||||
version "1.1.13-dev-1631019393655"
|
||||
resolved "http://localhost:4873/babel-preset-medusa-package/-/babel-preset-medusa-package-1.1.13-dev-1631019393655.tgz#95b20e00ae34b6b1d5a3be2dbd17c4bf45c1895e"
|
||||
integrity sha512-cpaVSi2+M8LFlZjfcazmp1GHB+lEgDNZNlX8J9RdB5/LWZwWRrqFGVyv//8hXp7AKiFFTtayJmpgBAEFfLhdcA==
|
||||
dependencies:
|
||||
"@babel/plugin-proposal-class-properties" "^7.12.1"
|
||||
"@babel/plugin-proposal-decorators" "^7.12.1"
|
||||
@@ -3021,6 +3021,11 @@ doctrine@^3.0.0:
|
||||
dependencies:
|
||||
esutils "^2.0.2"
|
||||
|
||||
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@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
|
||||
@@ -3868,6 +3873,14 @@ global-dirs@^2.0.1:
|
||||
dependencies:
|
||||
ini "1.3.7"
|
||||
|
||||
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"
|
||||
@@ -5441,50 +5454,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.20-dev-1631019393655:
|
||||
version "1.1.20-dev-1631019393655"
|
||||
resolved "http://localhost:4873/medusa-core-utils/-/medusa-core-utils-1.1.20-dev-1631019393655.tgz#edd5e25518677799647eef32ccc8ddb4f244026e"
|
||||
integrity sha512-Ko+gjpe4pHwQMI6Gv4MxMlzWbQbCL9bnN8MX5eHwLJoGcPzt57y5/RWujJo99nUuNthUDiJ14EFXQHVQu45bmQ==
|
||||
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.21-dev-1631019393655:
|
||||
version "1.1.21-dev-1631019393655"
|
||||
resolved "http://localhost:4873/medusa-interfaces/-/medusa-interfaces-1.1.21-dev-1631019393655.tgz#c2a72b6751a802438ed0f9010ed0cfecff1d1a2d"
|
||||
integrity sha512-I8BEdvmVKorakTU5myw8IyTLp9OcO40OkNdZmZj29Q4oRU4scwP3i+5bXd6xW0ML5t5hbMUT9TKU9n7oZNIvug==
|
||||
dependencies:
|
||||
medusa-core-utils "^1.1.20"
|
||||
medusa-core-utils "1.1.20-dev-1631019393655"
|
||||
|
||||
medusa-telemetry@^0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/medusa-telemetry/-/medusa-telemetry-0.0.3.tgz#c11e5e0f3cc969f3eaee41d1c24f78a5c0715362"
|
||||
integrity sha512-Qb/sgOwO8t2Sjjo4nKyBa6hKZ/SjniT4eEWenygEaJDqXZhfogVYGhWc5gn4tLlFFNEHXzDTlrqX2LvzfEJWIw==
|
||||
medusa-telemetry@0.0.3-dev-1631019393655:
|
||||
version "0.0.3-dev-1631019393655"
|
||||
resolved "http://localhost:4873/medusa-telemetry/-/medusa-telemetry-0.0.3-dev-1631019393655.tgz#dc6abef74c631520d4d8c81a4175ac795d72fbda"
|
||||
integrity sha512-I8a8iTTmL0u5/SYnTw02xn3JiFa2PDclRyDL5pAl8gFgCzVCWD+fm+ik51kMMhbNhK7GWobs4h5xxA4W6eCcAQ==
|
||||
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.23-dev-1631019393655:
|
||||
version "1.1.23-dev-1631019393655"
|
||||
resolved "http://localhost:4873/medusa-test-utils/-/medusa-test-utils-1.1.23-dev-1631019393655.tgz#1daf3913cfe8a9586863e4b80dabbb7344ebba48"
|
||||
integrity sha512-5qsKVr2whQi03lGPmy2+/tAD1KuFsqrAcaaEp+u42Jjg6acDV1rrcTgFLj+lplRBOC2qFzMEU0cBFuGKNmYhpg==
|
||||
dependencies:
|
||||
"@babel/plugin-transform-classes" "^7.9.5"
|
||||
medusa-core-utils "^1.1.20"
|
||||
medusa-core-utils "1.1.20-dev-1631019393655"
|
||||
randomatic "^3.1.1"
|
||||
|
||||
merge-descriptors@1.0.1:
|
||||
@@ -5561,6 +5567,13 @@ mimic-response@^1.0.0, mimic-response@^1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
|
||||
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
|
||||
|
||||
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"
|
||||
@@ -6437,6 +6450,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=
|
||||
|
||||
progress@^2.0.0:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
|
||||
@@ -171,6 +171,11 @@
|
||||
dependencies:
|
||||
"@babel/highlight" "^7.14.5"
|
||||
|
||||
"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.12.7", "@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.11.0":
|
||||
version "7.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
|
||||
@@ -180,11 +185,6 @@
|
||||
invariant "^2.2.4"
|
||||
semver "^5.5.0"
|
||||
|
||||
"@babel/compat-data@^7.12.7", "@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.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7":
|
||||
version "7.14.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08"
|
||||
@@ -290,6 +290,15 @@
|
||||
jsesc "^2.5.1"
|
||||
source-map "^0.5.0"
|
||||
|
||||
"@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.15.4"
|
||||
jsesc "^2.5.1"
|
||||
source-map "^0.5.0"
|
||||
|
||||
"@babel/helper-annotate-as-pure@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
|
||||
@@ -304,6 +313,21 @@
|
||||
dependencies:
|
||||
"@babel/types" "^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.4"
|
||||
|
||||
"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
|
||||
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.15.4"
|
||||
"@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"
|
||||
@@ -343,6 +367,18 @@
|
||||
browserslist "^4.16.6"
|
||||
semver "^6.3.0"
|
||||
|
||||
"@babel/helper-create-class-features-plugin@^7.10.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/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-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6":
|
||||
version "7.14.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542"
|
||||
@@ -402,6 +438,13 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.14.5"
|
||||
|
||||
"@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.15.4"
|
||||
|
||||
"@babel/helper-function-name@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
|
||||
@@ -420,6 +463,15 @@
|
||||
"@babel/template" "^7.14.5"
|
||||
"@babel/types" "^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.15.4"
|
||||
"@babel/template" "^7.15.4"
|
||||
"@babel/types" "^7.15.4"
|
||||
|
||||
"@babel/helper-get-function-arity@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
|
||||
@@ -434,6 +486,20 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.14.5"
|
||||
|
||||
"@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/types" "^7.15.4"
|
||||
|
||||
"@babel/helper-hoist-variables@^7.10.4", "@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.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"
|
||||
@@ -469,6 +535,13 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.15.0"
|
||||
|
||||
"@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.15.4"
|
||||
|
||||
"@babel/helper-module-imports@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
|
||||
@@ -490,6 +563,13 @@
|
||||
dependencies:
|
||||
"@babel/types" "^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.15.4"
|
||||
|
||||
"@babel/helper-module-transforms@^7.10.4":
|
||||
version "7.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
|
||||
@@ -503,6 +583,20 @@
|
||||
"@babel/types" "^7.11.0"
|
||||
lodash "^4.17.19"
|
||||
|
||||
"@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.15.4":
|
||||
version "7.15.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c"
|
||||
integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==
|
||||
dependencies:
|
||||
"@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.14.9"
|
||||
"@babel/template" "^7.15.4"
|
||||
"@babel/traverse" "^7.15.4"
|
||||
"@babel/types" "^7.15.4"
|
||||
|
||||
"@babel/helper-module-transforms@^7.12.1":
|
||||
version "7.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c"
|
||||
@@ -546,6 +640,13 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.14.5"
|
||||
|
||||
"@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.4"
|
||||
|
||||
"@babel/helper-plugin-utils@7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
|
||||
@@ -563,6 +664,15 @@
|
||||
dependencies:
|
||||
lodash "^4.17.19"
|
||||
|
||||
"@babel/helper-remap-async-to-generator@^7.10.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.15.4"
|
||||
"@babel/helper-wrap-function" "^7.15.4"
|
||||
"@babel/types" "^7.15.4"
|
||||
|
||||
"@babel/helper-remap-async-to-generator@^7.12.1":
|
||||
version "7.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd"
|
||||
@@ -611,6 +721,16 @@
|
||||
"@babel/traverse" "^7.15.0"
|
||||
"@babel/types" "^7.15.0"
|
||||
|
||||
"@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.15.4"
|
||||
"@babel/helper-optimise-call-expression" "^7.15.4"
|
||||
"@babel/traverse" "^7.15.4"
|
||||
"@babel/types" "^7.15.4"
|
||||
|
||||
"@babel/helper-simple-access@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
|
||||
@@ -640,6 +760,13 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.14.8"
|
||||
|
||||
"@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/types" "^7.15.4"
|
||||
|
||||
"@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
|
||||
version "7.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
|
||||
@@ -668,6 +795,13 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.14.5"
|
||||
|
||||
"@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.15.4"
|
||||
|
||||
"@babel/helper-validator-identifier@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
|
||||
@@ -708,6 +842,16 @@
|
||||
"@babel/traverse" "^7.14.5"
|
||||
"@babel/types" "^7.14.5"
|
||||
|
||||
"@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.15.4"
|
||||
"@babel/template" "^7.15.4"
|
||||
"@babel/traverse" "^7.15.4"
|
||||
"@babel/types" "^7.15.4"
|
||||
|
||||
"@babel/helpers@^7.12.5":
|
||||
version "7.12.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e"
|
||||
@@ -775,6 +919,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595"
|
||||
integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==
|
||||
|
||||
"@babel/parser@^7.15.4":
|
||||
version "7.15.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549"
|
||||
integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==
|
||||
|
||||
"@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"
|
||||
@@ -1195,7 +1344,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
|
||||
"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
|
||||
integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
|
||||
@@ -1216,7 +1365,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-arrow-functions@^7.14.5":
|
||||
"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a"
|
||||
integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==
|
||||
@@ -1232,7 +1381,7 @@
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
"@babel/helper-remap-async-to-generator" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-async-to-generator@^7.14.5":
|
||||
"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67"
|
||||
integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==
|
||||
@@ -1248,7 +1397,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-block-scoped-functions@^7.14.5":
|
||||
"@babel/plugin-transform-block-scoped-functions@^7.12.1", "@babel/plugin-transform-block-scoped-functions@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4"
|
||||
integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==
|
||||
@@ -1262,6 +1411,13 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-block-scoping@^7.12.1":
|
||||
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-block-scoping@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939"
|
||||
@@ -1283,7 +1439,7 @@
|
||||
"@babel/helper-split-export-declaration" "^7.10.4"
|
||||
globals "^11.1.0"
|
||||
|
||||
"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.14.9":
|
||||
"@babel/plugin-transform-classes@^7.12.1":
|
||||
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==
|
||||
@@ -1316,7 +1472,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-computed-properties@^7.14.5":
|
||||
"@babel/plugin-transform-computed-properties@^7.12.1", "@babel/plugin-transform-computed-properties@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f"
|
||||
integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==
|
||||
@@ -1330,7 +1486,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-destructuring@^7.14.7":
|
||||
"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.7":
|
||||
version "7.14.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576"
|
||||
integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==
|
||||
@@ -1345,7 +1501,7 @@
|
||||
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
|
||||
"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a"
|
||||
integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==
|
||||
@@ -1360,7 +1516,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-duplicate-keys@^7.14.5":
|
||||
"@babel/plugin-transform-duplicate-keys@^7.12.1", "@babel/plugin-transform-duplicate-keys@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954"
|
||||
integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==
|
||||
@@ -1375,7 +1531,7 @@
|
||||
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-exponentiation-operator@^7.14.5":
|
||||
"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493"
|
||||
integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==
|
||||
@@ -1390,6 +1546,13 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-for-of@^7.12.1":
|
||||
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"
|
||||
|
||||
"@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"
|
||||
@@ -1405,7 +1568,7 @@
|
||||
"@babel/helper-function-name" "^7.10.4"
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-function-name@^7.14.5":
|
||||
"@babel/plugin-transform-function-name@^7.12.1", "@babel/plugin-transform-function-name@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2"
|
||||
integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==
|
||||
@@ -1434,7 +1597,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-literals@^7.14.5":
|
||||
"@babel/plugin-transform-literals@^7.12.1", "@babel/plugin-transform-literals@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78"
|
||||
integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==
|
||||
@@ -1448,7 +1611,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-member-expression-literals@^7.14.5":
|
||||
"@babel/plugin-transform-member-expression-literals@^7.12.1", "@babel/plugin-transform-member-expression-literals@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7"
|
||||
integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==
|
||||
@@ -1464,7 +1627,7 @@
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
|
||||
"@babel/plugin-transform-modules-amd@^7.14.5":
|
||||
"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7"
|
||||
integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==
|
||||
@@ -1483,6 +1646,16 @@
|
||||
"@babel/helper-simple-access" "^7.10.4"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
|
||||
"@babel/plugin-transform-modules-commonjs@^7.12.1":
|
||||
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.4"
|
||||
"@babel/helper-plugin-utils" "^7.14.5"
|
||||
"@babel/helper-simple-access" "^7.15.4"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
|
||||
"@babel/plugin-transform-modules-commonjs@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97"
|
||||
@@ -1493,16 +1666,6 @@
|
||||
"@babel/helper-simple-access" "^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==
|
||||
dependencies:
|
||||
"@babel/helper-module-transforms" "^7.15.0"
|
||||
"@babel/helper-plugin-utils" "^7.14.5"
|
||||
"@babel/helper-simple-access" "^7.14.8"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
|
||||
"@babel/plugin-transform-modules-systemjs@^7.10.4":
|
||||
version "7.10.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
|
||||
@@ -1513,6 +1676,17 @@
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
|
||||
"@babel/plugin-transform-modules-systemjs@^7.12.1":
|
||||
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.15.4"
|
||||
"@babel/helper-module-transforms" "^7.15.4"
|
||||
"@babel/helper-plugin-utils" "^7.14.5"
|
||||
"@babel/helper-validator-identifier" "^7.14.9"
|
||||
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"
|
||||
@@ -1532,7 +1706,7 @@
|
||||
"@babel/helper-module-transforms" "^7.10.4"
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-modules-umd@^7.14.5":
|
||||
"@babel/plugin-transform-modules-umd@^7.12.1", "@babel/plugin-transform-modules-umd@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0"
|
||||
integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==
|
||||
@@ -1547,6 +1721,13 @@
|
||||
dependencies:
|
||||
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1":
|
||||
version "7.14.9"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2"
|
||||
integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==
|
||||
dependencies:
|
||||
"@babel/helper-create-regexp-features-plugin" "^7.14.5"
|
||||
|
||||
"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7":
|
||||
version "7.14.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e"
|
||||
@@ -1554,13 +1735,6 @@
|
||||
dependencies:
|
||||
"@babel/helper-create-regexp-features-plugin" "^7.14.5"
|
||||
|
||||
"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9":
|
||||
version "7.14.9"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2"
|
||||
integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==
|
||||
dependencies:
|
||||
"@babel/helper-create-regexp-features-plugin" "^7.14.5"
|
||||
|
||||
"@babel/plugin-transform-new-target@^7.10.4":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
|
||||
@@ -1568,7 +1742,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-new-target@^7.14.5":
|
||||
"@babel/plugin-transform-new-target@^7.12.1", "@babel/plugin-transform-new-target@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8"
|
||||
integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==
|
||||
@@ -1583,7 +1757,7 @@
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
"@babel/helper-replace-supers" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-object-super@^7.14.5":
|
||||
"@babel/plugin-transform-object-super@^7.12.1", "@babel/plugin-transform-object-super@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45"
|
||||
integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==
|
||||
@@ -1620,7 +1794,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-property-literals@^7.14.5":
|
||||
"@babel/plugin-transform-property-literals@^7.12.1", "@babel/plugin-transform-property-literals@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34"
|
||||
integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==
|
||||
@@ -1674,7 +1848,7 @@
|
||||
dependencies:
|
||||
regenerator-transform "^0.14.2"
|
||||
|
||||
"@babel/plugin-transform-regenerator@^7.14.5":
|
||||
"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f"
|
||||
integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==
|
||||
@@ -1688,7 +1862,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-reserved-words@^7.14.5":
|
||||
"@babel/plugin-transform-reserved-words@^7.12.1", "@babel/plugin-transform-reserved-words@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304"
|
||||
integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==
|
||||
@@ -1734,7 +1908,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-shorthand-properties@^7.14.5":
|
||||
"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58"
|
||||
integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==
|
||||
@@ -1749,7 +1923,7 @@
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
"@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
|
||||
|
||||
"@babel/plugin-transform-spread@^7.14.6":
|
||||
"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.14.6":
|
||||
version "7.14.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
|
||||
integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
|
||||
@@ -1765,7 +1939,7 @@
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
"@babel/helper-regex" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-sticky-regex@^7.14.5":
|
||||
"@babel/plugin-transform-sticky-regex@^7.12.7", "@babel/plugin-transform-sticky-regex@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9"
|
||||
integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==
|
||||
@@ -1780,7 +1954,7 @@
|
||||
"@babel/helper-annotate-as-pure" "^7.10.4"
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-template-literals@^7.14.5":
|
||||
"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93"
|
||||
integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==
|
||||
@@ -1794,7 +1968,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-typeof-symbol@^7.14.5":
|
||||
"@babel/plugin-transform-typeof-symbol@^7.12.1", "@babel/plugin-transform-typeof-symbol@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4"
|
||||
integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==
|
||||
@@ -1817,7 +1991,7 @@
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-unicode-escapes@^7.14.5":
|
||||
"@babel/plugin-transform-unicode-escapes@^7.12.1", "@babel/plugin-transform-unicode-escapes@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b"
|
||||
integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==
|
||||
@@ -1832,7 +2006,7 @@
|
||||
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
|
||||
"@babel/helper-plugin-utils" "^7.10.4"
|
||||
|
||||
"@babel/plugin-transform-unicode-regex@^7.14.5":
|
||||
"@babel/plugin-transform-unicode-regex@^7.12.1", "@babel/plugin-transform-unicode-regex@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e"
|
||||
integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==
|
||||
@@ -2168,6 +2342,15 @@
|
||||
"@babel/parser" "^7.14.5"
|
||||
"@babel/types" "^7.14.5"
|
||||
|
||||
"@babel/template@^7.15.4":
|
||||
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.15.4"
|
||||
"@babel/types" "^7.15.4"
|
||||
|
||||
"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5":
|
||||
version "7.12.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.7.tgz#572a722408681cef17d6b0bef69ef2e728ca69f1"
|
||||
@@ -2228,6 +2411,21 @@
|
||||
debug "^4.1.0"
|
||||
globals "^11.1.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.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/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
|
||||
version "7.12.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13"
|
||||
@@ -2253,6 +2451,14 @@
|
||||
"@babel/helper-validator-identifier" "^7.14.5"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@babel/types@^7.15.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"
|
||||
|
||||
"@bcoe/v8-coverage@^0.2.3":
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
||||
@@ -5079,16 +5285,16 @@ browserslist@^4.14.5:
|
||||
escalade "^3.1.1"
|
||||
node-releases "^1.1.75"
|
||||
|
||||
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==
|
||||
browserslist@^4.17.0:
|
||||
version "4.17.0"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c"
|
||||
integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==
|
||||
dependencies:
|
||||
caniuse-lite "^1.0.30001248"
|
||||
colorette "^1.2.2"
|
||||
electron-to-chromium "^1.3.793"
|
||||
caniuse-lite "^1.0.30001254"
|
||||
colorette "^1.3.0"
|
||||
electron-to-chromium "^1.3.830"
|
||||
escalade "^3.1.1"
|
||||
node-releases "^1.1.73"
|
||||
node-releases "^1.1.75"
|
||||
|
||||
bser@2.1.1:
|
||||
version "2.1.1"
|
||||
@@ -5315,10 +5521,10 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001219, can
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz#45b941bbd833cb0fa53861ff2bae746b3c6ca5d4"
|
||||
integrity sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==
|
||||
|
||||
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.30001124, caniuse-lite@^1.0.30001254:
|
||||
version "1.0.30001255"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz#f3b09b59ab52e39e751a569523618f47c4298ca0"
|
||||
integrity sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==
|
||||
|
||||
caniuse-lite@^1.0.30001251:
|
||||
version "1.0.30001252"
|
||||
@@ -6055,14 +6261,6 @@ core-js-compat@^3.14.0, core-js-compat@^3.15.0:
|
||||
browserslist "^4.16.6"
|
||||
semver "7.0.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==
|
||||
dependencies:
|
||||
browserslist "^4.16.7"
|
||||
semver "7.0.0"
|
||||
|
||||
core-js-compat@^3.6.2:
|
||||
version "3.6.5"
|
||||
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
|
||||
@@ -6071,6 +6269,14 @@ core-js-compat@^3.6.2:
|
||||
browserslist "^4.8.5"
|
||||
semver "7.0.0"
|
||||
|
||||
core-js-compat@^3.7.0:
|
||||
version "3.17.3"
|
||||
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e"
|
||||
integrity sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==
|
||||
dependencies:
|
||||
browserslist "^4.17.0"
|
||||
semver "7.0.0"
|
||||
|
||||
core-js-pure@^3.15.0:
|
||||
version "3.15.2"
|
||||
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce"
|
||||
@@ -6838,16 +7044,16 @@ 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.562, electron-to-chromium@^1.3.830:
|
||||
version "1.3.835"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.835.tgz#98fa4402ab7bc6afbe4953a8ca9b63cb3a6bf08b"
|
||||
integrity sha512-rHQszGg2KLMqOWPNTpwCnlp7Kb85haJa8j089DJCreZueykoSN/in+EMlay3SSDMNKR4VGPvfskxofHV18xVJg==
|
||||
|
||||
electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723:
|
||||
version "1.3.775"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.775.tgz#046517d1f2cea753e06fff549995b9dc45e20082"
|
||||
integrity sha512-EGuiJW4yBPOTj2NtWGZcX93ZE8IGj33HJAx4d3ouE2zOfW2trbWU+t1e0yzLr1qQIw81++txbM3BH52QwSRE6Q==
|
||||
|
||||
electron-to-chromium@^1.3.793:
|
||||
version "1.3.807"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.807.tgz#c2eb803f4f094869b1a24151184ffbbdbf688b1f"
|
||||
integrity sha512-p8uxxg2a23zRsvQ2uwA/OOI+O4BQxzaR7YKMIGGGQCpYmkFX2CVF5f0/hxLMV7yCr7nnJViCwHLhPfs52rIYCA==
|
||||
|
||||
electron-to-chromium@^1.3.811:
|
||||
version "1.3.826"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.826.tgz#dbe356b1546b39d83bcd47e675a9c5f61dadaed2"
|
||||
@@ -7674,7 +7880,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
|
||||
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.0, get-intrinsic@^1.1.1:
|
||||
get-intrinsic@^1.0.2, 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==
|
||||
@@ -8680,7 +8886,7 @@ interpret@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
|
||||
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
|
||||
|
||||
invariant@^2.2.2:
|
||||
invariant@^2.2.2, invariant@^2.2.4:
|
||||
version "2.2.4"
|
||||
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
|
||||
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
|
||||
@@ -10108,7 +10314,7 @@ loglevel@^1.6.8:
|
||||
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
|
||||
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
|
||||
|
||||
loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
|
||||
loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
||||
@@ -10912,21 +11118,16 @@ node-readfiles@^0.2.0:
|
||||
dependencies:
|
||||
es6-promise "^3.2.1"
|
||||
|
||||
node-releases@^1.1.60, node-releases@^1.1.75:
|
||||
version "1.1.75"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
|
||||
integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
|
||||
|
||||
node-releases@^1.1.61, 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.75:
|
||||
version "1.1.75"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
|
||||
integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
|
||||
|
||||
nopt@^4.0.1:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
|
||||
@@ -12803,7 +13004,7 @@ regexp.prototype.flags@^1.2.0:
|
||||
call-bind "^1.0.2"
|
||||
define-properties "^1.1.3"
|
||||
|
||||
regexpu-core@^4.7.1:
|
||||
regexpu-core@^4.7.0, 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==
|
||||
@@ -15630,14 +15831,14 @@ yocto-queue@^0.1.0:
|
||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
z-schema@^4.2.3:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-4.2.3.tgz#85f7eea7e6d4fe59a483462a98f511bd78fe9882"
|
||||
integrity sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==
|
||||
z-schema@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.1.tgz#f4d4efb1e8763c968b5539e42d11b6a47e91da62"
|
||||
integrity sha512-Gp8xU2lULhREqTWj9t4BEAeA7M835n4fWJ9KjGWksV3wmLUdOJo2hAr+QYvkVZIGOOTyeN274g1f95dKRsgYgQ==
|
||||
dependencies:
|
||||
lodash.get "^4.4.2"
|
||||
lodash.isequal "^4.5.0"
|
||||
validator "^12.0.0"
|
||||
validator "^13.6.0"
|
||||
optionalDependencies:
|
||||
commander "^2.7.1"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user