diff --git a/packages/medusa-fulfillment-manual/dist/services/manual-fulfillment.js b/packages/medusa-fulfillment-manual/dist/services/manual-fulfillment.js index 6ffcf58127..5efa9f900a 100644 --- a/packages/medusa-fulfillment-manual/dist/services/manual-fulfillment.js +++ b/packages/medusa-fulfillment-manual/dist/services/manual-fulfillment.js @@ -5,9 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports["default"] = void 0; -var _medusaInterfaces = _interopRequireDefault(require("medusa-interfaces")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } +var _medusaInterfaces = require("medusa-interfaces"); function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return !!right[Symbol.hasInstance](left); } else { return left instanceof right; } } @@ -23,7 +21,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } +function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } @@ -35,8 +33,8 @@ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.g function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var ManualFulfillmentService = /*#__PURE__*/function (_BaseFulfillmentServi) { - _inherits(ManualFulfillmentService, _BaseFulfillmentServi); +var ManualFulfillmentService = /*#__PURE__*/function (_FulfillmentService) { + _inherits(ManualFulfillmentService, _FulfillmentService); var _super = _createSuper(ManualFulfillmentService); @@ -61,11 +59,7 @@ var ManualFulfillmentService = /*#__PURE__*/function (_BaseFulfillmentServi) { }, { key: "validateOption", value: function validateOption(data) { - if (data.id === "manual-fulfillment") { - return true; - } - - return false; + return true; } }, { key: "canCalculate", @@ -86,7 +80,7 @@ var ManualFulfillmentService = /*#__PURE__*/function (_BaseFulfillmentServi) { }]); return ManualFulfillmentService; -}(_medusaInterfaces["default"]); +}(_medusaInterfaces.FulfillmentService); _defineProperty(ManualFulfillmentService, "identifier", "manual"); diff --git a/packages/medusa-fulfillment-manual/package.json b/packages/medusa-fulfillment-manual/package.json index a6fdd9c7a6..6b30f4e652 100644 --- a/packages/medusa-fulfillment-manual/package.json +++ b/packages/medusa-fulfillment-manual/package.json @@ -1,6 +1,6 @@ { "name": "medusa-fulfillment-manual", - "version": "1.0", + "version": "1.0.0", "description": "A manual fulfillment provider for Medusa", "main": "index.js", "repository": { @@ -34,4 +34,4 @@ "express": "^4.17.1", "medusa-core-utils": "^0.3.0" } -} \ No newline at end of file +} diff --git a/packages/medusa-interfaces/src/index.js b/packages/medusa-interfaces/src/index.js index a5711e18ed..b8e739ddda 100644 --- a/packages/medusa-interfaces/src/index.js +++ b/packages/medusa-interfaces/src/index.js @@ -3,3 +3,4 @@ export { default as BaseModel } from "./base-model" export { default as PaymentService } from "./payment-service" export { default as FulfillmentService } from "./fulfillment-service" export { default as FileService } from "./file-service" +export { default as OauthService } from "./oauth-service" diff --git a/packages/medusa-interfaces/src/oauth-service.js b/packages/medusa-interfaces/src/oauth-service.js new file mode 100644 index 0000000000..6b4947b57a --- /dev/null +++ b/packages/medusa-interfaces/src/oauth-service.js @@ -0,0 +1,25 @@ +import BaseService from "./base-service" + +/** + * Interface for file connectors + * @interface + */ +class BaseOauthService extends BaseService { + constructor() { + super() + } + + generateToken() { + throw Error("generateToken must be overridden by the child class") + } + + refreshToken() { + throw Error("refreshToken must be overridden by the child class") + } + + destroyToken() { + throw Error("destroyToken must be overridden by the child class") + } +} + +export default BaseOauthService diff --git a/packages/medusa-plugin-brightpearl/package.json b/packages/medusa-plugin-brightpearl/package.json index 3add66aa9a..99c44f15ed 100644 --- a/packages/medusa-plugin-brightpearl/package.json +++ b/packages/medusa-plugin-brightpearl/package.json @@ -25,7 +25,8 @@ "cross-env": "^5.2.1", "eslint": "^6.8.0", "jest": "^25.5.2", - "medusa-test-utils": "^0.3.0" + "medusa-test-utils": "^0.3.0", + "prettier": "^2.0.5" }, "scripts": { "build": "babel src -d dist", @@ -37,6 +38,7 @@ "axios": "^0.19.2", "express": "^4.17.1", "medusa-core-utils": "^0.3.0", - "medusa-interfaces": "^0.3.0" + "medusa-interfaces": "^0.3.0", + "randomatic": "^3.1.1" } } diff --git a/packages/medusa-plugin-brightpearl/src/services/brightpearl.js b/packages/medusa-plugin-brightpearl/src/services/brightpearl.js index 41ef40b996..50594f5e77 100644 --- a/packages/medusa-plugin-brightpearl/src/services/brightpearl.js +++ b/packages/medusa-plugin-brightpearl/src/services/brightpearl.js @@ -2,7 +2,17 @@ import { BaseService } from "medusa-interfaces" import Brightpearl from "../utils/brightpearl" class BrightpearlService extends BaseService { - constructor({ totalsService, productVariantService, regionService, orderService, discountService }, options) { + constructor( + { + oauthService, + totalsService, + productVariantService, + regionService, + orderService, + discountService, + }, + options + ) { super() this.options = options @@ -11,92 +21,122 @@ class BrightpearlService extends BaseService { this.orderService_ = orderService this.totalsService_ = totalsService this.discountService_ = discountService + this.oauthService_ = oauthService + } - this.brightpearl_ = new Brightpearl({ - account: options.account, - datacenter: options.datacenter, - app_ref: options.app_ref, - token: options.token + async getClient() { + if (this.brightpearlClient_) { + return this.brightpearlClient_ + } + + const authData = await this.oauthService_.retrieveByName("brightpearl") + const { data } = authData + + if (!data || !data.access_token) { + throw new MedusaError( + MedusaError.Types.NOT_ALLOWED, + "You must authenticate the Brightpearl app in settings before continuing" + ) + } + + const client = new Brightpearl({ + url: data.api_domain, + auth_type: data.token_type, + access_token: data.access_token, }) + + this.brightpearlClient_ = client + return client } async verifyWebhooks() { + const brightpearl = await this.getClient() const hooks = [ { subscribeTo: "product.modified.on-hand-modified", httpMethod: "POST", uriTemplate: `${this.options.backend_url}/brightpearl/inventory-update`, - bodyTemplate: '{"account": "${account-code}", "lifecycleEvent": "${lifecycle-event}", "resourceType": "${resource-type}", "id": "${resource-id}" }', + bodyTemplate: + '{"account": "${account-code}", "lifecycleEvent": "${lifecycle-event}", "resourceType": "${resource-type}", "id": "${resource-id}" }', contentType: "application/json", idSetAccepted: false, - } + }, ] - const installedHooks = await this.brightpearl_.webhooks.list().catch(() => []) + const installedHooks = await brightpearl.webhooks.list().catch(() => []) for (const hook of hooks) { - const isInstalled = installedHooks.find(i => - i.subscribeTo === hook.subscribeTo && - i.httpMethod === hook.httpMethod && - i.uriTemplate === hook.uriTemplate && - i.bodyTemplate === hook.bodyTemplate && - i.contentType === hook.contentType && - i.idSetAccepted === hook.idSetAccepted + const isInstalled = installedHooks.find( + (i) => + i.subscribeTo === hook.subscribeTo && + i.httpMethod === hook.httpMethod && + i.uriTemplate === hook.uriTemplate && + i.bodyTemplate === hook.bodyTemplate && + i.contentType === hook.contentType && + i.idSetAccepted === hook.idSetAccepted ) if (!isInstalled) { - await this.brightpearl_.webhooks.create(hook) + await brightpearl.webhooks.create(hook) } } } async syncInventory() { + const client = await this.getClient() const variants = await this.productVariantService_.list() - return Promise.all(variants.map(async v => { - const brightpearlProduct = await this.retrieveProductBySKU(v.sku) - if (!brightpearlProduct) { - return - } + return Promise.all( + variants.map(async (v) => { + const brightpearlProduct = await this.retrieveProductBySKU(v.sku) + if (!brightpearlProduct) { + return + } - const { productId } = brightpearlProduct - const availability = await this.brightpearl_.products.retrieveAvailability(productId) - const onHand = availability[productId].total.onHand - - return this.productVariantService_.update(v._id, { - inventory_quantity: onHand + const { productId } = brightpearlProduct + const availability = await client.products.retrieveAvailability( + productId + ) + const onHand = availability[productId].total.onHand + + return this.productVariantService_.update(v._id, { + inventory_quantity: onHand, + }) }) - })) + ) } async updateInventory(productId) { - const brightpearlProduct = await this.brightpearl_.products.retrieve(productId) - const availability = await this.brightpearl_.products.retrieveAvailability(productId) + const client = await this.getClient() + const brightpearlProduct = await client.products.retrieve(productId) + const availability = await client.products.retrieveAvailability(productId) const onHand = availability[productId].total.onHand const sku = brightpearlProduct.identity.sku - const [ variant ] = await this.productVariantService_.list({ sku }) + const [variant] = await this.productVariantService_.list({ sku }) if (variant && variant.manage_inventory) { await this.productVariantService_.update(variant._id, { - inventory_quantity: onHand + inventory_quantity: onHand, }) } } async createGoodsOutNote(fromOrder, shipment) { - const id = fromOrder.metadata && fromOrder.metadata.brightpearl_sales_order_id + const client = await this.getClient() + const id = + fromOrder.metadata && fromOrder.metadata.brightpearl_sales_order_id if (!id) { return } - const order = await this.brightpearl_.orders.retrieve(id) - const productRows = shipment.item_ids.map(id => { + const order = await client.orders.retrieve(id) + const productRows = shipment.item_ids.map((id) => { const row = order.rows.find(({ externalRef }) => externalRef === id) return { productId: row.productId, salesOrderRowId: row.id, - quantity: row.quantity + quantity: row.quantity, } }) @@ -107,36 +147,39 @@ class BrightpearlService extends BaseService { warehouseId: this.options.warehouse, transfer: false, products: productRows, - } + }, ], priority: false, } - return this.brightpearl_.warehouses.createGoodsOutNote(id, goodsOut) + return client.warehouses.createGoodsOutNote(id, goodsOut) } - registerGoodsOutShipped(noteId, shipment) { - return this.brightpearl_.warehouses.registerGoodsOutEvent(noteId, { + async registerGoodsOutShipped(noteId, shipment) { + const client = await this.getClient() + return client.warehouses.registerGoodsOutEvent(noteId, { events: [ { eventCode: "SHW", occured: new Date(), eventOwnerId: this.options.event_owner, - } - ] + }, + ], }) } - registerGoodsOutTrackingNumber(noteId, shipment) { - return this.brightpearl_.warehouses.updateGoodsOutNote(noteId, { + async registerGoodsOutTrackingNumber(noteId, shipment) { + const client = await this.getClient() + return client.warehouses.updateGoodsOutNote(noteId, { priority: false, shipping: { reference: shipment.tracking_number, - } + }, }) } async createSalesOrder(fromOrder) { + const client = await this.getClient() let customer = await this.retrieveCustomerByEmail(fromOrder.email) // All sales orders must have a customer @@ -147,7 +190,7 @@ class BrightpearlService extends BaseService { const { shipping_address } = fromOrder const order = { currency: { - code: fromOrder.currency_code + code: fromOrder.currency_code, }, externalRef: fromOrder._id, customer: { @@ -160,7 +203,7 @@ class BrightpearlService extends BaseService { countryIsoCode: shipping_address.country_code, telephone: shipping_address.phone, email: fromOrder.email, - } + }, }, delivery: { shippingMethodId: 0, @@ -172,18 +215,22 @@ class BrightpearlService extends BaseService { countryIsoCode: shipping_address.country_code, telephone: shipping_address.phone, email: fromOrder.email, - } + }, }, - rows: await this.getBrightpearlRows(fromOrder) + rows: await this.getBrightpearlRows(fromOrder), } - return this.brightpearl_.orders.create(order) - .then(async salesOrderId => { - const order = await this.brightpearl_.orders.retrieve(salesOrderId) - const resResult = await this.brightpearl_.warehouses.createReservation(order, this.options.warehouse) + return client.orders + .create(order) + .then(async (salesOrderId) => { + const order = await client.orders.retrieve(salesOrderId) + const resResult = await client.warehouses.createReservation( + order, + this.options.warehouse + ) return salesOrderId }) - .then(async salesOrderId => { + .then(async (salesOrderId) => { const paymentMethod = fromOrder.payment_method const paymentType = "AUTH" const payment = { @@ -200,23 +247,31 @@ class BrightpearlService extends BaseService { if (paymentType === "AUTH") { const today = new Date() const authExpire = today.setDate(today.getDate() + 7) - payment.amountAuthorized = await this.totalsService_.getTotal(fromOrder) + payment.amountAuthorized = await this.totalsService_.getTotal( + fromOrder + ) payment.authorizationExpiry = new Date(authExpire) } else { // For captured } - await this.brightpearl_.payments.create(payment) + await client.payments.create(payment) return salesOrderId }) .then((salesOrderId) => { - return this.orderService_.setMetadata(fromOrder._id, "brightpearl_sales_order_id", salesOrderId) + return this.orderService_.setMetadata( + fromOrder._id, + "brightpearl_sales_order_id", + salesOrderId + ) }) } async createCapturedPayment(fromOrder) { - const soId = fromOrder.metadata && fromOrder.metadata.brightpearl_sales_order_id + const client = await this.getClient() + const soId = + fromOrder.metadata && fromOrder.metadata.brightpearl_sales_order_id if (!soId) { return } @@ -234,43 +289,54 @@ class BrightpearlService extends BaseService { paymentType, } - await this.brightpearl_.payments.create(payment) + await client.payments.create(payment) } - async getBrightpearlRows(fromOrder) { + async getBrightpearlRows(fromOrder) { const region = await this.regionService_.retrieve(fromOrder.region_id) - const discount = fromOrder.discounts.find(({ discount_rule }) => discount_rule.type !== "free_shipping") + const discount = fromOrder.discounts.find( + ({ discount_rule }) => discount_rule.type !== "free_shipping" + ) let lineDiscounts = [] if (discount) { - lineDiscounts = this.discountService_.getLineDiscounts(fromOrder, discount) + lineDiscounts = this.discountService_.getLineDiscounts( + fromOrder, + discount + ) } - const lines = await Promise.all(fromOrder.items.map(async item => { - const bpProduct = await this.retrieveProductBySKU(item.content.variant.sku) + const lines = await Promise.all( + fromOrder.items.map(async (item) => { + const bpProduct = await this.retrieveProductBySKU( + item.content.variant.sku + ) - const discount = lineDiscounts.find(l => l.item._id.equals(item._id)) || { amount: 0 } + const discount = lineDiscounts.find((l) => + l.item._id.equals(item._id) + ) || { amount: 0 } - const row = {} - if (bpProduct) { - row.productId = bpProduct.productId - } else { - row.name = item.title - } - row.net = item.content.unit_price * item.quantity - discount.amount - row.tax = row.net * fromOrder.tax_rate - row.quantity = item.quantity - row.taxCode = region.tax_code - row.externalRef = item._id - row.nominalCode = this.options.sales_account_code || "4000" + const row = {} + if (bpProduct) { + row.productId = bpProduct.productId + } else { + row.name = item.title + } + row.net = item.content.unit_price * item.quantity - discount.amount + row.tax = row.net * fromOrder.tax_rate + row.quantity = item.quantity + row.taxCode = region.tax_code + row.externalRef = item._id + row.nominalCode = this.options.sales_account_code || "4000" - return row - })) + return row + }) + ) const shippingTotal = this.totalsService_.getShippingTotal(fromOrder) const shippingMethods = fromOrder.shipping_methods if (shippingMethods.length > 0) { lines.push({ - name: `Shipping: ${shippingMethods.map(m => m.name).join(" + ")}`, + name: `Shipping: ${shippingMethods.map((m) => m.name).join(" + ")}`, quantity: 1, net: shippingTotal, tax: shippingTotal * fromOrder.tax_rate, @@ -281,17 +347,19 @@ class BrightpearlService extends BaseService { return lines } - retrieveCustomerByEmail(email) { - return this.brightpearl_.customers.retrieveByEmail(email).then(customers => { + async retrieveCustomerByEmail(email) { + const client = await this.getClient() + return client.customers.retrieveByEmail(email).then((customers) => { if (!customers.length) { return null } - return customers.find(c => c.primaryEmail === email) + return customers.find((c) => c.primaryEmail === email) }) } - retrieveProductBySKU(sku) { - return this.brightpearl_.products.retrieveBySKU(sku).then(products => { + async retrieveProductBySKU(sku) { + const client = await this.getClient() + return client.products.retrieveBySKU(sku).then((products) => { if (!products.length) { return null } @@ -300,21 +368,22 @@ class BrightpearlService extends BaseService { } async createCustomer(fromOrder) { - const address = await this.brightpearl_.addresses.create({ + const client = await this.getClient() + const address = await client.addresses.create({ addressLine1: fromOrder.shipping_address.address_1, addressLine2: fromOrder.shipping_address.address_2, postalCode: fromOrder.shipping_address.postal_code, countryIsoCode: fromOrder.shipping_address.country_code, }) - const customer = await this.brightpearl_.customers.create({ + const customer = await client.customers.create({ firstName: fromOrder.shipping_address.first_name, lastName: fromOrder.shipping_address.last_name, postAddressIds: { DEF: address, BIL: address, DEL: address, - } + }, }) return { contactId: customer } diff --git a/packages/medusa-plugin-brightpearl/src/services/oauth.js b/packages/medusa-plugin-brightpearl/src/services/oauth.js new file mode 100644 index 0000000000..1041043c60 --- /dev/null +++ b/packages/medusa-plugin-brightpearl/src/services/oauth.js @@ -0,0 +1,40 @@ +import randomize from "randomatic" +import { OauthService } from "medusa-interfaces" +import Brightpearl from "../utils/brightpearl" + +const CLIENT_SECRET = process.env.BP_CLIENT_SECRET || "" + +class BrightpearlOauth extends OauthService { + constructor({}, options) { + super() + + this.account_ = options.account + } + + static getAppDetails(options) { + const client_id = "medusa-dev" + const client_secret = CLIENT_SECRET + const state = randomize("A0", 16) + const redirect = "https://localhost:8000/a/oauth/brightpearl" + return { + application_name: "brightpearl", + display_name: "Brightpearl", + install_url: `https://oauth.brightpearl.com/authorize/${options.account}?response_type=code&client_id=${client_id}&redirect_uri=${redirect}&state=${state}`, + state, + } + } + + async generateToken(code) { + const params = { + client_id: "medusa-dev", + client_secret: CLIENT_SECRET, + redirect: "https://localhost:8000/a/oauth/brightpearl", + code, + } + + const data = await Brightpearl.createToken(this.account_, params) + return data + } +} + +export default BrightpearlOauth diff --git a/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js b/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js index 2a0c87ae61..1c6702b9d9 100644 --- a/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js +++ b/packages/medusa-plugin-brightpearl/src/utils/brightpearl.js @@ -1,12 +1,33 @@ import axios from "axios" +import qs from "querystring" class BrightpearlClient { + static createToken(account, data) { + const params = { + grant_type: "authorization_code", + code: data.code, + client_id: data.client_id, + client_secret: data.client_secret, + redirect_uri: data.redirect, + } + + return axios({ + url: `https://ws-eu1.brightpearl.com/${account}/oauth/token`, + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + }, + data: qs.stringify(params), + }).then(({ data }) => data) + } + constructor(options) { this.client_ = axios.create({ - baseURL: `https://${options.datacenter}.brightpearl.com/public-api/${options.account}`, + baseURL: `${options.url}/public-api/${options.account}`, headers: { - 'brightpearl-app-ref': options.app_ref, - 'brightpearl-account-token': options.token + "brightpearl-app-ref": "medusa-dev", + "brightpearl-dev-ref": "sebrindom", + Authorization: `${options.auth_type} ${options.access_token}`, }, }) @@ -22,7 +43,7 @@ class BrightpearlClient { buildSearchResults_(response) { const { results, metaData } = response // Map the column names to the columns - return results.map(resColumns => { + return results.map((resColumns) => { const object = {} for (let i = 0; i < resColumns.length; i++) { const fieldName = metaData.columns[i].name @@ -35,99 +56,108 @@ class BrightpearlClient { buildWebhookEndpoints = () => { return { list: () => { - return this.client_.request({ - url: `/integration-service/webhook`, - method: "GET", - }) - .then(({ data }) => data.response) + return this.client_ + .request({ + url: `/integration-service/webhook`, + method: "GET", + }) + .then(({ data }) => data.response) }, create: (data) => { return this.client_.request({ url: `/integration-service/webhook`, method: "POST", - data + data, }) - } + }, } } buildPaymentEndpoints = () => { return { create: (payment) => { - return this.client_.request({ - url: `/accounting-service/customer-payment`, - method: "POST", - data: payment - }) - .then(({ data }) => data.response) - } + return this.client_ + .request({ + url: `/accounting-service/customer-payment`, + method: "POST", + data: payment, + }) + .then(({ data }) => data.response) + }, } } buildWarehouseEndpoints = () => { return { retrieveReservation: (orderId) => { - return this.client_.request({ - url: `/warehouse-service/order/${orderId}/reservation`, - method: "GET", - }) - .then(({ data }) => data.response) + return this.client_ + .request({ + url: `/warehouse-service/order/${orderId}/reservation`, + method: "GET", + }) + .then(({ data }) => data.response) }, createGoodsOutNote: (orderId, data) => { - return this.client_.request({ - url: `/warehouse-service/order/${orderId}/goods-note/goods-out`, - method: "POST", - data, - }).then(({ data }) => data.response) + return this.client_ + .request({ + url: `/warehouse-service/order/${orderId}/goods-note/goods-out`, + method: "POST", + data, + }) + .then(({ data }) => data.response) }, updateGoodsOutNote: (noteId, update) => { return this.client_.request({ url: `/warehouse-service/goods-note/goods-out/${noteId}`, method: "PUT", - data: update + data: update, }) }, registerGoodsOutEvent: (noteId, data) => { return this.client_.request({ url: `/warehouse-service/goods-note/goods-out/${noteId}/event`, method: "POST", - data + data, }) }, createReservation: (order, warehouse) => { const id = order.id - const data = order.rows.map(r => ({ + const data = order.rows.map((r) => ({ productId: r.productId, salesOrderRowId: r.id, - quantity: r.quantity + quantity: r.quantity, })) - return this.client_.request({ - url: `/warehouse-service/order/${id}/reservation/warehouse/${warehouse}`, - method: "POST", - data: { - products: data - } - }).then(({ data }) => data.response) - } + return this.client_ + .request({ + url: `/warehouse-service/order/${id}/reservation/warehouse/${warehouse}`, + method: "POST", + data: { + products: data, + }, + }) + .then(({ data }) => data.response) + }, } } buildOrderEndpoints = () => { return { retrieve: (orderId) => { - return this.client_.request({ - url: `/order-service/sales-order/${orderId}`, - method: "GET", - }) - .then(({ data }) => data.response.length && data.response[0]) - .catch(err => console.log(err)) + return this.client_ + .request({ + url: `/order-service/sales-order/${orderId}`, + method: "GET", + }) + .then(({ data }) => data.response.length && data.response[0]) + .catch((err) => console.log(err)) }, create: (order) => { - return this.client_.request({ - url: `/order-service/sales-order`, - method: "POST", - data: order - }) + return this.client_ + .request({ + url: `/order-service/sales-order`, + method: "POST", + data: order, + }) .then(({ data }) => data.response) }, } @@ -136,61 +166,66 @@ class BrightpearlClient { buildAddressEndpoints = () => { return { create: (address) => { - return this.client_.request({ - url: `/contact-service/postal-address`, - method: "POST", - data: address - }) - .then(({ data }) => data.response) - } + return this.client_ + .request({ + url: `/contact-service/postal-address`, + method: "POST", + data: address, + }) + .then(({ data }) => data.response) + }, } } - buildProductEndpoints = () => { + buildProductEndpoints = () => { return { - retrieveAvailability: productId => { - return this.client_.request({ - url: `/warehouse-service/product-availability/${productId}`, - }) - .then(({ data }) => data.response && data.response) + retrieveAvailability: (productId) => { + return this.client_ + .request({ + url: `/warehouse-service/product-availability/${productId}`, + }) + .then(({ data }) => data.response && data.response) }, retrieve: (productId) => { - return this.client_.request({ - url: `/product-service/product/${productId}`, - }) - .then(({ data }) => data.response && data.response[0]) + return this.client_ + .request({ + url: `/product-service/product/${productId}`, + }) + .then(({ data }) => data.response && data.response[0]) }, retrieveBySKU: (sku) => { - return this.client_.request({ - url: `/product-service/product-search?SKU=${sku}`, - }) - .then(({ data }) => { - return this.buildSearchResults_(data.response) - }) - } + return this.client_ + .request({ + url: `/product-service/product-search?SKU=${sku}`, + }) + .then(({ data }) => { + return this.buildSearchResults_(data.response) + }) + }, } } - buildCustomerEndpoints = () => { return { retrieveByEmail: (email) => { - return this.client_.request({ - url: `/contact-service/contact-search?primaryEmail=${email}`, - }) - .then(({data }) => { - return this.buildSearchResults_(data.response) - }) + return this.client_ + .request({ + url: `/contact-service/contact-search?primaryEmail=${email}`, + }) + .then(({ data }) => { + return this.buildSearchResults_(data.response) + }) }, create: (customerData) => { - return this.client_.request({ - url: `/contact-service/contact`, - method: "POST", - data: customerData - }) + return this.client_ + .request({ + url: `/contact-service/contact`, + method: "POST", + data: customerData, + }) .then(({ data }) => data.response) - } + }, } } } diff --git a/packages/medusa-plugin-brightpearl/utils/brightpearl.js b/packages/medusa-plugin-brightpearl/utils/brightpearl.js index 8e988a96c0..d55a57bc07 100644 --- a/packages/medusa-plugin-brightpearl/utils/brightpearl.js +++ b/packages/medusa-plugin-brightpearl/utils/brightpearl.js @@ -7,6 +7,8 @@ exports["default"] = void 0; var _axios = _interopRequireDefault(require("axios")); +var _querystring = _interopRequireDefault(require("querystring")); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return !!right[Symbol.hasInstance](left); } else { return left instanceof right; } } @@ -20,6 +22,30 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var BrightpearlClient = /*#__PURE__*/function () { + _createClass(BrightpearlClient, null, [{ + key: "createToken", + value: function createToken(account, data) { + var params = { + grant_type: "authorization_code", + code: data.code, + client_id: data.client_id, + client_secret: data.client_secret, + redirect_uri: data.redirect + }; + return (0, _axios["default"])({ + url: "https://ws-eu1.brightpearl.com/".concat(account, "/oauth/token"), + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded" + }, + data: _querystring["default"].stringify(params) + }).then(function (_ref) { + var data = _ref.data; + return data; + }); + } + }]); + function BrightpearlClient(options) { var _this = this; @@ -31,8 +57,8 @@ var BrightpearlClient = /*#__PURE__*/function () { return _this.client_.request({ url: "/integration-service/webhook", method: "GET" - }).then(function (_ref) { - var data = _ref.data; + }).then(function (_ref2) { + var data = _ref2.data; return data.response; }); }, @@ -53,8 +79,8 @@ var BrightpearlClient = /*#__PURE__*/function () { url: "/accounting-service/customer-payment", method: "POST", data: payment - }).then(function (_ref2) { - var data = _ref2.data; + }).then(function (_ref3) { + var data = _ref3.data; return data.response; }); } @@ -67,8 +93,8 @@ var BrightpearlClient = /*#__PURE__*/function () { return _this.client_.request({ url: "/warehouse-service/order/".concat(orderId, "/reservation"), method: "GET" - }).then(function (_ref3) { - var data = _ref3.data; + }).then(function (_ref4) { + var data = _ref4.data; return data.response; }); }, @@ -77,8 +103,8 @@ var BrightpearlClient = /*#__PURE__*/function () { url: "/warehouse-service/order/".concat(orderId, "/goods-note/goods-out"), method: "POST", data: data - }).then(function (_ref4) { - var data = _ref4.data; + }).then(function (_ref5) { + var data = _ref5.data; return data.response; }); }, @@ -111,8 +137,8 @@ var BrightpearlClient = /*#__PURE__*/function () { data: { products: data } - }).then(function (_ref5) { - var data = _ref5.data; + }).then(function (_ref6) { + var data = _ref6.data; return data.response; }); } @@ -125,8 +151,8 @@ var BrightpearlClient = /*#__PURE__*/function () { return _this.client_.request({ url: "/order-service/sales-order/".concat(orderId), method: "GET" - }).then(function (_ref6) { - var data = _ref6.data; + }).then(function (_ref7) { + var data = _ref7.data; return data.response.length && data.response[0]; })["catch"](function (err) { return console.log(err); @@ -137,8 +163,8 @@ var BrightpearlClient = /*#__PURE__*/function () { url: "/order-service/sales-order", method: "POST", data: order - }).then(function (_ref7) { - var data = _ref7.data; + }).then(function (_ref8) { + var data = _ref8.data; return data.response; }); } @@ -152,8 +178,8 @@ var BrightpearlClient = /*#__PURE__*/function () { url: "/contact-service/postal-address", method: "POST", data: address - }).then(function (_ref8) { - var data = _ref8.data; + }).then(function (_ref9) { + var data = _ref9.data; return data.response; }); } @@ -165,24 +191,24 @@ var BrightpearlClient = /*#__PURE__*/function () { retrieveAvailability: function retrieveAvailability(productId) { return _this.client_.request({ url: "/warehouse-service/product-availability/".concat(productId) - }).then(function (_ref9) { - var data = _ref9.data; + }).then(function (_ref10) { + var data = _ref10.data; return data.response && data.response; }); }, retrieve: function retrieve(productId) { return _this.client_.request({ url: "/product-service/product/".concat(productId) - }).then(function (_ref10) { - var data = _ref10.data; + }).then(function (_ref11) { + var data = _ref11.data; return data.response && data.response[0]; }); }, retrieveBySKU: function retrieveBySKU(sku) { return _this.client_.request({ url: "/product-service/product-search?SKU=".concat(sku) - }).then(function (_ref11) { - var data = _ref11.data; + }).then(function (_ref12) { + var data = _ref12.data; return _this.buildSearchResults_(data.response); }); } @@ -194,8 +220,8 @@ var BrightpearlClient = /*#__PURE__*/function () { retrieveByEmail: function retrieveByEmail(email) { return _this.client_.request({ url: "/contact-service/contact-search?primaryEmail=".concat(email) - }).then(function (_ref12) { - var data = _ref12.data; + }).then(function (_ref13) { + var data = _ref13.data; return _this.buildSearchResults_(data.response); }); }, @@ -204,8 +230,8 @@ var BrightpearlClient = /*#__PURE__*/function () { url: "/contact-service/contact", method: "POST", data: customerData - }).then(function (_ref13) { - var data = _ref13.data; + }).then(function (_ref14) { + var data = _ref14.data; return data.response; }); } @@ -213,10 +239,11 @@ var BrightpearlClient = /*#__PURE__*/function () { }); this.client_ = _axios["default"].create({ - baseURL: "https://".concat(options.datacenter, ".brightpearl.com/public-api/").concat(options.account), + baseURL: "".concat(options.url, "/public-api/").concat(options.account), headers: { - 'brightpearl-app-ref': options.app_ref, - 'brightpearl-account-token': options.token + "brightpearl-app-ref": "medusa-dev", + "brightpearl-dev-ref": "sebrindom", + Authorization: "".concat(options.auth_type, " ").concat(options.access_token) } }); this.webhooks = this.buildWebhookEndpoints(); diff --git a/packages/medusa-plugin-discount-generator/package.json b/packages/medusa-plugin-discount-generator/package.json index 881ca8af58..2f6aaafd69 100644 --- a/packages/medusa-plugin-discount-generator/package.json +++ b/packages/medusa-plugin-discount-generator/package.json @@ -14,6 +14,7 @@ "@babel/core": "^7.7.5", "@babel/node": "^7.7.4", "@babel/plugin-proposal-class-properties": "^7.7.4", + "@babel/plugin-transform-classes": "^7.9.5", "@babel/plugin-transform-instanceof": "^7.8.3", "@babel/plugin-transform-runtime": "^7.7.6", "@babel/preset-env": "^7.7.5", diff --git a/packages/medusa-plugin-discount-generator/yarn.lock b/packages/medusa-plugin-discount-generator/yarn.lock index 65165c0f1a..6926ea6a9d 100644 --- a/packages/medusa-plugin-discount-generator/yarn.lock +++ b/packages/medusa-plugin-discount-generator/yarn.lock @@ -497,7 +497,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.10.4": +"@babel/plugin-transform-classes@^7.10.4", "@babel/plugin-transform-classes@^7.9.5": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== diff --git a/packages/medusa-plugin-economic/yarn.lock b/packages/medusa-plugin-economic/yarn.lock index 4bd7a1e1cb..2e47e396b1 100644 --- a/packages/medusa-plugin-economic/yarn.lock +++ b/packages/medusa-plugin-economic/yarn.lock @@ -881,44 +881,6 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@hapi/address@^2.1.2": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/formula@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd" - integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA== - -"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - -"@hapi/joi@^16.1.8": - version "16.1.8" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839" - integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg== - dependencies: - "@hapi/address" "^2.1.2" - "@hapi/formula" "^1.2.0" - "@hapi/hoek" "^8.2.4" - "@hapi/pinpoint" "^1.0.2" - "@hapi/topo" "^3.1.3" - -"@hapi/pinpoint@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13" - integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ== - -"@hapi/topo@^3.1.3": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.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" @@ -1500,19 +1462,6 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" - integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bluebird@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - body-parser@1.19.0, body-parser@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -1589,11 +1538,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -bson@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.4.tgz#f76870d799f15b854dffb7ee32f0a874797f7e89" - integrity sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q== - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1934,7 +1878,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0: +debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -2002,11 +1946,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -denque@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" - integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3516,11 +3455,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== - "js-tokens@^3.0.0 || ^4.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" @@ -3623,11 +3557,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -kareem@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87" - integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw== - keygrip@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc" @@ -3765,33 +3694,6 @@ 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.3.0: - 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-interfaces@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-0.1.39.tgz#633db3c8c6afd7fec9ae24496737369d840105cf" - integrity sha512-byKIcK7o3L4shmGn+pgZAUyLrT991zCqK4jWXIleQJbGImQy6TmdXido+tEzFptVBJWMIQ8BWnP/b7r29D8EXA== - dependencies: - mongoose "^5.8.0" - -medusa-test-utils@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-0.1.39.tgz#b7c166006a2fa4f02e52ab3bfafc19a3ae787f3e" - integrity sha512-M/Br8/HYvl7x2oLnme4NxdQwoyV0XUyOWiCyvPp7q1HUTB684lhJf1MikZVrcSjsh2L1rpyi3GRbKdf4cpJWvw== - dependencies: - mongoose "^5.8.0" - -memory-pager@^1.0.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" - integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -3888,57 +3790,6 @@ moment@^2.27.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== -mongodb@3.5.9: - version "3.5.9" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.5.9.tgz#799b72be8110b7e71a882bb7ce0d84d05429f772" - integrity sha512-vXHBY1CsGYcEPoVWhwgxIBeWqP3dSu9RuRDsoLRPTITrcrgm1f0Ubu1xqF9ozMwv53agmEiZm0YGo+7WL3Nbug== - dependencies: - bl "^2.2.0" - bson "^1.1.4" - denque "^1.4.1" - require_optional "^1.0.1" - safe-buffer "^5.1.2" - optionalDependencies: - saslprep "^1.0.0" - -mongoose-legacy-pluralize@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" - integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== - -mongoose@^5.8.0: - version "5.9.23" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.9.23.tgz#cb16687fbd19082bbbf0b8fab4778e2e4d85e7b1" - integrity sha512-fMYlMRJz0T6Ax2K2P0jt+kxXd4qaRxyfZCha1YBMczmA2EBlT5SnBlcDyJ4YQa4/z+GoDh06uH090w7BfBcdWg== - dependencies: - bson "^1.1.4" - kareem "2.3.1" - mongodb "3.5.9" - mongoose-legacy-pluralize "1.0.2" - mpath "0.7.0" - mquery "3.2.2" - ms "2.1.2" - regexp-clone "1.0.0" - safe-buffer "5.2.1" - sift "7.0.1" - sliced "1.0.1" - -mpath@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.7.0.tgz#20e8102e276b71709d6e07e9f8d4d0f641afbfb8" - integrity sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg== - -mquery@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7" - integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q== - dependencies: - bluebird "3.5.1" - debug "3.1.0" - regexp-clone "^1.0.0" - safe-buffer "5.1.2" - sliced "1.0.1" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3949,7 +3800,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -4437,7 +4288,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.2, readable-stream@^2.3.5: +readable-stream@^2.0.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -4496,11 +4347,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-clone@1.0.0, regexp-clone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" - integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== - regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -4597,14 +4443,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -require_optional@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" - integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== - dependencies: - resolve-from "^2.0.0" - semver "^5.1.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -4612,11 +4450,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4693,7 +4526,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4725,13 +4558,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -saslprep@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" - integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== - dependencies: - sparse-bitfield "^3.0.3" - saxes@^3.1.9: version "3.1.11" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" @@ -4739,7 +4565,7 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4832,11 +4658,6 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -sift@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" - integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g== - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -4866,11 +4687,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sliced@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" - integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4940,13 +4756,6 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sparse-bitfield@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" - integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= - dependencies: - memory-pager "^1.0.2" - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" diff --git a/packages/medusa-plugin-slack-notification/yarn.lock b/packages/medusa-plugin-slack-notification/yarn.lock index 4bd7a1e1cb..2e47e396b1 100644 --- a/packages/medusa-plugin-slack-notification/yarn.lock +++ b/packages/medusa-plugin-slack-notification/yarn.lock @@ -881,44 +881,6 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@hapi/address@^2.1.2": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/formula@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd" - integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA== - -"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - -"@hapi/joi@^16.1.8": - version "16.1.8" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839" - integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg== - dependencies: - "@hapi/address" "^2.1.2" - "@hapi/formula" "^1.2.0" - "@hapi/hoek" "^8.2.4" - "@hapi/pinpoint" "^1.0.2" - "@hapi/topo" "^3.1.3" - -"@hapi/pinpoint@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13" - integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ== - -"@hapi/topo@^3.1.3": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.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" @@ -1500,19 +1462,6 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" - integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bluebird@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - body-parser@1.19.0, body-parser@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -1589,11 +1538,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -bson@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.4.tgz#f76870d799f15b854dffb7ee32f0a874797f7e89" - integrity sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q== - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1934,7 +1878,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0: +debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -2002,11 +1946,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -denque@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" - integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3516,11 +3455,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== - "js-tokens@^3.0.0 || ^4.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" @@ -3623,11 +3557,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -kareem@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87" - integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw== - keygrip@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.3.tgz#399d709f0aed2bab0a059e0cdd3a5023a053e1dc" @@ -3765,33 +3694,6 @@ 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.3.0: - 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-interfaces@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-0.1.39.tgz#633db3c8c6afd7fec9ae24496737369d840105cf" - integrity sha512-byKIcK7o3L4shmGn+pgZAUyLrT991zCqK4jWXIleQJbGImQy6TmdXido+tEzFptVBJWMIQ8BWnP/b7r29D8EXA== - dependencies: - mongoose "^5.8.0" - -medusa-test-utils@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-0.1.39.tgz#b7c166006a2fa4f02e52ab3bfafc19a3ae787f3e" - integrity sha512-M/Br8/HYvl7x2oLnme4NxdQwoyV0XUyOWiCyvPp7q1HUTB684lhJf1MikZVrcSjsh2L1rpyi3GRbKdf4cpJWvw== - dependencies: - mongoose "^5.8.0" - -memory-pager@^1.0.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" - integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -3888,57 +3790,6 @@ moment@^2.27.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== -mongodb@3.5.9: - version "3.5.9" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.5.9.tgz#799b72be8110b7e71a882bb7ce0d84d05429f772" - integrity sha512-vXHBY1CsGYcEPoVWhwgxIBeWqP3dSu9RuRDsoLRPTITrcrgm1f0Ubu1xqF9ozMwv53agmEiZm0YGo+7WL3Nbug== - dependencies: - bl "^2.2.0" - bson "^1.1.4" - denque "^1.4.1" - require_optional "^1.0.1" - safe-buffer "^5.1.2" - optionalDependencies: - saslprep "^1.0.0" - -mongoose-legacy-pluralize@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" - integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== - -mongoose@^5.8.0: - version "5.9.23" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.9.23.tgz#cb16687fbd19082bbbf0b8fab4778e2e4d85e7b1" - integrity sha512-fMYlMRJz0T6Ax2K2P0jt+kxXd4qaRxyfZCha1YBMczmA2EBlT5SnBlcDyJ4YQa4/z+GoDh06uH090w7BfBcdWg== - dependencies: - bson "^1.1.4" - kareem "2.3.1" - mongodb "3.5.9" - mongoose-legacy-pluralize "1.0.2" - mpath "0.7.0" - mquery "3.2.2" - ms "2.1.2" - regexp-clone "1.0.0" - safe-buffer "5.2.1" - sift "7.0.1" - sliced "1.0.1" - -mpath@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.7.0.tgz#20e8102e276b71709d6e07e9f8d4d0f641afbfb8" - integrity sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg== - -mquery@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7" - integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q== - dependencies: - bluebird "3.5.1" - debug "3.1.0" - regexp-clone "^1.0.0" - safe-buffer "5.1.2" - sliced "1.0.1" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3949,7 +3800,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -4437,7 +4288,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.2, readable-stream@^2.3.5: +readable-stream@^2.0.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -4496,11 +4347,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-clone@1.0.0, regexp-clone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" - integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== - regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -4597,14 +4443,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -require_optional@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" - integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== - dependencies: - resolve-from "^2.0.0" - semver "^5.1.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -4612,11 +4450,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4693,7 +4526,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4725,13 +4558,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -saslprep@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" - integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== - dependencies: - sparse-bitfield "^3.0.3" - saxes@^3.1.9: version "3.1.11" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" @@ -4739,7 +4565,7 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4832,11 +4658,6 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -sift@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" - integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g== - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -4866,11 +4687,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sliced@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" - integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4940,13 +4756,6 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sparse-bitfield@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" - integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= - dependencies: - memory-pager "^1.0.2" - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" diff --git a/packages/medusa/src/api/routes/admin/apps/authorize-app.js b/packages/medusa/src/api/routes/admin/apps/authorize-app.js new file mode 100644 index 0000000000..bd47844fb0 --- /dev/null +++ b/packages/medusa/src/api/routes/admin/apps/authorize-app.js @@ -0,0 +1,25 @@ +import { MedusaError, Validator } from "medusa-core-utils" + +export default async (req, res) => { + const schema = Validator.object().keys({ + application_name: Validator.string().required(), + state: Validator.string().required(), + code: Validator.string().required(), + }) + + const { value, error } = schema.validate(req.body) + if (error) { + throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details) + } + try { + const oauthService = req.scope.resolve("oauthService") + const data = await oauthService.generateToken( + value.application_name, + value.code, + value.state + ) + res.status(200).json({ apps: data }) + } catch (err) { + throw err + } +} diff --git a/packages/medusa/src/api/routes/admin/apps/index.js b/packages/medusa/src/api/routes/admin/apps/index.js new file mode 100644 index 0000000000..33af4ab43e --- /dev/null +++ b/packages/medusa/src/api/routes/admin/apps/index.js @@ -0,0 +1,16 @@ +import { Router } from "express" +import middlewares from "../../../middlewares" + +const route = Router() + +export default app => { + app.use("/apps", route) + + route.get("/", middlewares.wrap(require("./list").default)) + route.post( + "/authorizations", + middlewares.wrap(require("./authorize-app").default) + ) + + return app +} diff --git a/packages/medusa/src/api/routes/admin/apps/list.js b/packages/medusa/src/api/routes/admin/apps/list.js new file mode 100644 index 0000000000..bf925616f8 --- /dev/null +++ b/packages/medusa/src/api/routes/admin/apps/list.js @@ -0,0 +1,12 @@ +import { MedusaError, Validator } from "medusa-core-utils" + +export default async (req, res) => { + try { + const oauthService = req.scope.resolve("oauthService") + const data = await oauthService.list({}) + + res.status(200).json({ apps: data }) + } catch (err) { + throw err + } +} diff --git a/packages/medusa/src/api/routes/admin/index.js b/packages/medusa/src/api/routes/admin/index.js index b1a3e05ee9..ea345ee3f7 100644 --- a/packages/medusa/src/api/routes/admin/index.js +++ b/packages/medusa/src/api/routes/admin/index.js @@ -13,6 +13,7 @@ import orderRoutes from "./orders" import storeRoutes from "./store" import uploadRoutes from "./uploads" import customerRoutes from "./customers" +import appRoutes from "./apps" const route = Router() @@ -40,6 +41,7 @@ export default (app, container, config) => { // Calls all middleware that has been registered to run after authentication. middlewareService.usePostAuthentication(app) + appRoutes(route) productRoutes(route) userRoutes(route) regionRoutes(route) diff --git a/packages/medusa/src/loaders/plugins.js b/packages/medusa/src/loaders/plugins.js index bcc2e92d4e..b328214246 100644 --- a/packages/medusa/src/loaders/plugins.js +++ b/packages/medusa/src/loaders/plugins.js @@ -5,6 +5,7 @@ import { PaymentService, FulfillmentService, FileService, + OauthService, } from "medusa-interfaces" import { getConfigFile, createRequireFromPath } from "medusa-core-utils" import _ from "lodash" @@ -47,14 +48,16 @@ export default async ({ rootDirectory, container, app }) => { version: createFileContentHash(process.cwd(), `**`), }) - resolved.forEach(pluginDetails => { - registerModels(pluginDetails, container) - registerServices(pluginDetails, container) - registerMedusaApi(pluginDetails, container) - registerApi(pluginDetails, app) - registerCoreRouters(pluginDetails, container) - registerSubscribers(pluginDetails, container) - }) + await Promise.all( + resolved.map(async pluginDetails => { + registerModels(pluginDetails, container) + await registerServices(pluginDetails, container) + registerMedusaApi(pluginDetails, container) + registerApi(pluginDetails, app) + registerCoreRouters(pluginDetails, container) + registerSubscribers(pluginDetails, container) + }) + ) await Promise.all( resolved.map(async pluginDetails => runLoaders(pluginDetails, container)) @@ -156,58 +159,80 @@ function registerApi(pluginDetails, app) { * registered * @return {void} */ -function registerServices(pluginDetails, container) { +async function registerServices(pluginDetails, container) { const files = glob.sync(`${pluginDetails.resolve}/services/[!__]*`, {}) - files.forEach(fn => { - const loaded = require(fn).default - const name = formatRegistrationName(fn) + await Promise.all( + files.map(async fn => { + const loaded = require(fn).default + const name = formatRegistrationName(fn) - if (!(loaded.prototype instanceof BaseService)) { - const logger = container.resolve("logger") - const message = `Services must inherit from BaseService, please check ${fn}` - logger.error(message) - throw new Error(message) - } + if (!(loaded.prototype instanceof BaseService)) { + const logger = container.resolve("logger") + const message = `Services must inherit from BaseService, please check ${fn}` + logger.error(message) + throw new Error(message) + } - if (loaded.prototype instanceof PaymentService) { - // Register our payment providers to paymentProviders - container.registerAdd( - "paymentProviders", - asFunction(cradle => new loaded(cradle, pluginDetails.options)) - ) + if (loaded.prototype instanceof PaymentService) { + // Register our payment providers to paymentProviders + container.registerAdd( + "paymentProviders", + asFunction(cradle => new loaded(cradle, pluginDetails.options)) + ) - // Add the service directly to the container in order to make simple - // resolution if we already know which payment provider we need to use - container.register({ - [name]: asFunction(cradle => new loaded(cradle, pluginDetails.options)), - [`pp_${loaded.identifier}`]: aliasTo(name), - }) - } else if (loaded.prototype instanceof FulfillmentService) { - // Register our payment providers to paymentProviders - container.registerAdd( - "fulfillmentProviders", - asFunction(cradle => new loaded(cradle, pluginDetails.options)) - ) + // Add the service directly to the container in order to make simple + // resolution if we already know which payment provider we need to use + container.register({ + [name]: asFunction( + cradle => new loaded(cradle, pluginDetails.options) + ), + [`pp_${loaded.identifier}`]: aliasTo(name), + }) + } else if (loaded.prototype instanceof OauthService) { + const oauthService = container.resolve("oauthService") - // Add the service directly to the container in order to make simple - // resolution if we already know which payment provider we need to use - container.register({ - [name]: asFunction(cradle => new loaded(cradle, pluginDetails.options)), - [`fp_${loaded.identifier}`]: aliasTo(name), - }) - } else if (loaded.prototype instanceof FileService) { - // Add the service directly to the container in order to make simple - // resolution if we already know which payment provider we need to use - container.register({ - [name]: asFunction(cradle => new loaded(cradle, pluginDetails.options)), - [`fileService`]: aliasTo(name), - }) - } else { - container.register({ - [name]: asFunction(cradle => new loaded(cradle, pluginDetails.options)), - }) - } - }) + const appDetails = loaded.getAppDetails(pluginDetails.options) + await oauthService.registerOauthApp(appDetails) + + const name = appDetails.application_name + container.register({ + [`${name}Oauth`]: asFunction( + cradle => new loaded(cradle, pluginDetails.options) + ), + }) + } else if (loaded.prototype instanceof FulfillmentService) { + // Register our payment providers to paymentProviders + container.registerAdd( + "fulfillmentProviders", + asFunction(cradle => new loaded(cradle, pluginDetails.options)) + ) + + // Add the service directly to the container in order to make simple + // resolution if we already know which payment provider we need to use + container.register({ + [name]: asFunction( + cradle => new loaded(cradle, pluginDetails.options) + ), + [`fp_${loaded.identifier}`]: aliasTo(name), + }) + } else if (loaded.prototype instanceof FileService) { + // Add the service directly to the container in order to make simple + // resolution if we already know which payment provider we need to use + container.register({ + [name]: asFunction( + cradle => new loaded(cradle, pluginDetails.options) + ), + [`fileService`]: aliasTo(name), + }) + } else { + container.register({ + [name]: asFunction( + cradle => new loaded(cradle, pluginDetails.options) + ), + }) + } + }) + ) } /** diff --git a/packages/medusa/src/models/oauth.js b/packages/medusa/src/models/oauth.js new file mode 100644 index 0000000000..7729e8e87e --- /dev/null +++ b/packages/medusa/src/models/oauth.js @@ -0,0 +1,16 @@ +import mongoose from "mongoose" +import { BaseModel } from "medusa-interfaces" + +class OauthModel extends BaseModel { + static modelName = "Oauth" + + static schema = { + display_name: { type: String, required: true }, + application_name: { type: String, required: true, unique: true }, + install_url: { type: String, required: true }, + uninstall_url: { type: String, default: "" }, + data: { type: mongoose.Schema.Types.Mixed, default: {} }, + } +} + +export default OauthModel diff --git a/packages/medusa/src/services/oauth.js b/packages/medusa/src/services/oauth.js new file mode 100644 index 0000000000..5bbfad13e6 --- /dev/null +++ b/packages/medusa/src/services/oauth.js @@ -0,0 +1,110 @@ +import _ from "lodash" +import { Validator, MedusaError } from "medusa-core-utils" +import { OauthService } from "medusa-interfaces" + +class Oauth extends OauthService { + static Events = { + TOKEN_GENERATED: "oauth.token_generated", + TOKEN_REFRESHED: "oauth.token_refreshed", + } + + constructor(cradle) { + super() + this.container_ = cradle + this.model_ = cradle.oauthModel + this.eventBus_ = cradle.eventBusService + } + + retrieveByName(appName) { + return this.model_.findOne({ + application_name: appName, + }) + } + + list(selector) { + return this.model_.find(selector) + } + + create(data) { + return this.model_.create({ + display_name: data.display_name, + application_name: data.application_name, + install_url: data.install_url, + uninstall_url: data.uninstall_url, + }) + } + + update(id, update) { + return this.model_.updateOne( + { + _id: id, + }, + update + ) + } + + async registerOauthApp(appDetails) { + const { application_name } = appDetails + const existing = await this.retrieveByName(application_name) + if (existing) { + return + } + + return this.create(appDetails) + } + + async generateToken(appName, code, state) { + const app = await this.retrieveByName(appName) + const service = this.container_[`${app.application_name}Oauth`] + if (!service) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + `An OAuth handler for ${app.display_name} could not be found make sure the plugin is installed` + ) + } + + if (!app.state === state) { + throw new MedusaError( + MedusaError.Types.NOT_ALLOWED, + `${app.display_name} could not match state` + ) + } + + const authData = await service.generateToken(code) + + return this.update(app._id, { + data: authData, + }).then(result => { + this.eventBus_.emit( + `${Oauth.Events.TOKEN_GENERATED}.${appName}`, + authData + ) + return result + }) + } + + async refreshToken(appName, refreshToken) { + const app = await this.retrieveByName(appName) + const service = this.container_[`${app.application_name}Oauth`] + if (!service) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + `An OAuth handler for ${app.display_name} could not be found make sure the plugin is installed` + ) + } + + const authData = await service.refreshToken(refreshToken) + + return this.update(app._id, { + data: authData, + }).then(result => { + this.eventBus_.emit( + `${Oauth.Events.TOKEN_REFRESHED}.${appName}`, + authData + ) + return result + }) + } +} + +export default Oauth diff --git a/packages/medusa/yarn.lock b/packages/medusa/yarn.lock index d8c0b200f7..c3775ee84d 100644 --- a/packages/medusa/yarn.lock +++ b/packages/medusa/yarn.lock @@ -4568,14 +4568,6 @@ 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.3.0: - 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-interfaces@^0.1.27: version "0.1.27" resolved "https://registry.yarnpkg.com/medusa-interfaces/-/medusa-interfaces-0.1.27.tgz#e77f9a9f82a7118eac8b35c1498ef8a5cec78898" @@ -4583,13 +4575,6 @@ medusa-interfaces@^0.1.27: dependencies: mongoose "^5.8.0" -medusa-test-utils@^0.3.0: - version "0.1.39" - resolved "https://registry.yarnpkg.com/medusa-test-utils/-/medusa-test-utils-0.1.39.tgz#b7c166006a2fa4f02e52ab3bfafc19a3ae787f3e" - integrity sha512-M/Br8/HYvl7x2oLnme4NxdQwoyV0XUyOWiCyvPp7q1HUTB684lhJf1MikZVrcSjsh2L1rpyi3GRbKdf4cpJWvw== - dependencies: - mongoose "^5.8.0" - memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"