medusa-plugin-sendgrid-typescript
Version:
SendGrid transactional emails typescript
785 lines (784 loc) • 32.2 kB
TypeScript
import SendGrid from "@sendgrid/mail";
import { AttachmentsArray, NewLineItem, SendGridData } from "../types/generic";
import { PluginOptions } from "../types";
import { AbstractNotificationService, CartService, ClaimService, FulfillmentProviderService, GiftCardService, LineItem, LineItemService, Logger, Order, OrderService, ProductVariantService, Return, ReturnItem, ReturnService, StoreService, SwapService, TotalsService } from "@medusajs/medusa";
export declare class SendGridService extends AbstractNotificationService {
static identifier: string;
options_: PluginOptions;
storeService_: StoreService;
lineItemService_: LineItemService;
orderService_: OrderService;
cartService_: CartService;
claimService_: ClaimService;
returnService_: ReturnService;
swapService_: SwapService;
fulfillmentService_: any;
fulfillmentProviderService_: FulfillmentProviderService;
totalsService_: TotalsService;
productVariantService_: ProductVariantService;
giftCardService_: GiftCardService;
logger_: Logger;
constructor({ storeService, orderService, returnService, swapService, cartService, lineItemService, claimService, fulfillmentService, fulfillmentProviderService, totalsService, productVariantService, giftCardService, logger, }: {
storeService: StoreService;
orderService: OrderService;
returnService: ReturnService;
swapService: SwapService;
cartService: CartService;
lineItemService: LineItemService;
claimService: ClaimService;
fulfillmentService: any;
fulfillmentProviderService: FulfillmentProviderService;
totalsService: TotalsService;
productVariantService: ProductVariantService;
giftCardService: GiftCardService;
logger: Logger;
}, options: PluginOptions);
fetchAttachments(event: string, data?: Record<any, any>, attachmentGenerator?: any): Promise<AttachmentsArray[]>;
fetchData(event: string, eventData: Record<string, unknown>, attachmentGenerator: any): Promise<Record<any, any>>;
getLocalizedTemplateId(event: string, locale: string, subject?: boolean): string | null | undefined;
getTemplateId(event: string, subject?: boolean): any;
getSubjectVariable(template: string): string[];
sendNotification(event: string, eventData: Record<string, unknown>, attachmentGenerator?: any): Promise<{
to: any;
status: any;
data: {
template_id: any;
from: string | {
name?: string | undefined;
email: string;
};
to: any;
bcc: import("@sendgrid/helpers/classes/email-address").EmailData | import("@sendgrid/helpers/classes/email-address").EmailData[] | undefined;
dynamic_template_data: Record<any, any>;
has_attachments: boolean;
};
}>;
resendNotification(notification: SendGridData, config: {
to?: string;
}, attachmentGenerator?: any): Promise<{
to: string;
status: string;
data: Record<string, unknown>;
}>;
sendEmail(options: SendGrid.MailDataRequired | SendGrid.MailDataRequired[]): Promise<[SendGrid.ClientResponse, {}]>;
orderShipmentCreatedData({ id, fulfillment_id }: Record<string, unknown>, attachmentGenerator?: any): Promise<{
locale: {} | null;
order: Order;
date: any;
email: string;
fulfillment: any;
tracking_links: any;
tracking_number: any;
}>;
orderCanceledData({ id }: Record<string, unknown>): Promise<{
locale: {} | null;
has_discounts: number;
has_gift_cards: number;
date: string;
items: {
thumbnail: string;
price: string;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
quantity: number;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
discounts: {
is_giftcard: boolean;
code: string;
descriptor: string;
}[];
subtotal: string;
gift_card_total: string;
tax_total: string;
discount_total: string;
shipping_total: string;
total: string;
object: "order";
status: import("@medusajs/medusa").OrderStatus;
fulfillment_status: import("@medusajs/medusa").FulfillmentStatus;
payment_status: import("@medusajs/medusa").PaymentStatus;
display_id: number;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
customer_id: string;
customer: import("@medusajs/medusa").Customer;
email: string;
billing_address_id: string;
billing_address: import("@medusajs/medusa").Address;
shipping_address_id: string;
shipping_address: import("@medusajs/medusa").Address;
region_id: string;
region: import("@medusajs/medusa").Region;
currency_code: string;
currency: import("@medusajs/medusa").Currency;
tax_rate: number | null;
gift_cards: import("@medusajs/medusa").GiftCard[];
shipping_methods: import("@medusajs/medusa").ShippingMethod[];
payments: import("@medusajs/medusa").Payment[];
fulfillments: import("@medusajs/medusa").Fulfillment[];
returns: Return[];
claims: import("@medusajs/medusa").ClaimOrder[];
refunds: import("@medusajs/medusa").Refund[];
swaps: import("@medusajs/medusa").Swap[];
draft_order_id: string;
draft_order: import("@medusajs/medusa").DraftOrder;
edits: import("@medusajs/medusa").OrderEdit[];
gift_card_transactions: import("@medusajs/medusa").GiftCardTransaction[];
canceled_at: Date;
metadata: Record<string, unknown>;
no_notification: boolean;
idempotency_key: string;
external_id: string | null;
sales_channel_id: string | null;
sales_channel: import("@medusajs/medusa").SalesChannel;
sales_channels?: import("@medusajs/medusa").SalesChannel[] | undefined;
shipping_tax_total: number | null;
raw_discount_total: number;
item_tax_total: number | null;
refunded_total: number;
paid_total: number;
refundable_amount: number;
gift_card_tax_total: number;
returnable_items?: LineItem[] | undefined;
id: string;
created_at: Date;
updated_at: Date;
}>;
orderPlacedData({ id }: Record<string, unknown>): Promise<{
locale: {} | null;
has_discounts: number;
has_gift_cards: number;
date: string;
items: NewLineItem[];
discounts: {
is_giftcard: boolean;
code: string;
descriptor: string;
}[];
subtotal_ex_tax: string;
subtotal: string;
gift_card_total: string;
tax_total: string;
discount_total: string;
shipping_total: string;
total: string;
object: "order";
status: import("@medusajs/medusa").OrderStatus;
fulfillment_status: import("@medusajs/medusa").FulfillmentStatus;
payment_status: import("@medusajs/medusa").PaymentStatus;
display_id: number;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
customer_id: string;
customer: import("@medusajs/medusa").Customer;
email: string;
billing_address_id: string;
billing_address: import("@medusajs/medusa").Address;
shipping_address_id: string;
shipping_address: import("@medusajs/medusa").Address;
region_id: string;
region: import("@medusajs/medusa").Region;
currency_code: string;
currency: import("@medusajs/medusa").Currency;
tax_rate: number | null;
gift_cards: import("@medusajs/medusa").GiftCard[];
shipping_methods: import("@medusajs/medusa").ShippingMethod[];
payments: import("@medusajs/medusa").Payment[];
fulfillments: import("@medusajs/medusa").Fulfillment[];
returns: Return[];
claims: import("@medusajs/medusa").ClaimOrder[];
refunds: import("@medusajs/medusa").Refund[];
swaps: import("@medusajs/medusa").Swap[];
draft_order_id: string;
draft_order: import("@medusajs/medusa").DraftOrder;
edits: import("@medusajs/medusa").OrderEdit[];
gift_card_transactions: import("@medusajs/medusa").GiftCardTransaction[];
canceled_at: Date;
metadata: Record<string, unknown>;
no_notification: boolean;
idempotency_key: string;
external_id: string | null;
sales_channel_id: string | null;
sales_channel: import("@medusajs/medusa").SalesChannel;
sales_channels?: import("@medusajs/medusa").SalesChannel[] | undefined;
shipping_tax_total: number | null;
raw_discount_total: number;
item_tax_total: number | null;
refunded_total: number;
paid_total: number;
refundable_amount: number;
gift_card_tax_total: number;
returnable_items?: LineItem[] | undefined;
id: string;
created_at: Date;
updated_at: Date;
}>;
gcCreatedData({ id }: Record<string, unknown>): Promise<{
locale: {} | null;
email: unknown;
display_value: string;
message: unknown;
code: string;
value: number;
balance: number;
region_id: string;
region: import("@medusajs/medusa").Region;
order_id: string;
order: Order;
is_disabled: boolean;
ends_at: Date;
tax_rate: number | null;
metadata: Record<string, unknown>;
deleted_at: Date | null;
id: string;
created_at: Date;
updated_at: Date;
}>;
returnRequestedData({ id, return_id }: Record<string, unknown>): Promise<{
locale: {} | null;
has_shipping: boolean;
email: string;
items: (Omit<ReturnItem, "beforeUpdate" | "afterUpdateOrLoad"> & {
totals: any;
price: string;
tax_lines: any;
thumbnail: string;
})[];
subtotal: string;
shipping_total: string;
refund_amount: string;
return_request: {
refund_amount: string;
status: import("@medusajs/medusa").ReturnStatus;
items: ReturnItem[];
swap_id: string | null;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string | null;
claim_order: import("@medusajs/medusa").ClaimOrder;
order_id: string | null;
order: Order;
shipping_method: import("@medusajs/medusa").ShippingMethod;
location_id: string | null;
shipping_data: Record<string, unknown>;
received_at: Date;
no_notification: boolean | null;
metadata: Record<string, unknown> | null;
idempotency_key: string | null;
id: string;
created_at: Date;
updated_at: Date;
};
order: Order;
date: string;
}>;
swapReceivedData({ id }: Record<string, unknown>): Promise<{
locale: {} | null;
swap: import("@medusajs/medusa").Swap;
order: Order;
return_request: Return;
date: string;
swap_link: string;
email: string;
items: {
totals: {
unit_price: number;
quantity: number;
subtotal: number;
tax_total: number;
total: number;
original_total: number;
original_tax_total: number;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
discount_total: number;
raw_discount_total: number;
};
price: string;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
thumbnail: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
quantity: number;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
return_items: {
totals: {
unit_price: number;
quantity: number;
subtotal: number;
tax_total: number;
total: number;
original_total: number;
original_tax_total: number;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
discount_total: number;
raw_discount_total: number;
};
price: string;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
thumbnail: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
quantity: number;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
return_total: string;
tax_total: string;
refund_amount: string;
additional_total: string;
}>;
swapCreatedData({ id }: Record<string, unknown>): Promise<{
locale: {} | null;
swap: import("@medusajs/medusa").Swap;
order: Order;
return_request: Omit<Return, "items"> & {
items: (Omit<ReturnItem, "item"> & {
item?: LineItem | undefined;
})[];
};
date: string;
swap_link: string | undefined;
email: string;
items: {
totals: {
unit_price: number;
quantity: number;
subtotal: number;
tax_total: number;
total: number;
original_total: number;
original_tax_total: number;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
discount_total: number;
raw_discount_total: number;
};
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
price: string;
discounted_price: string;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
thumbnail: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
quantity: number;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
return_items: {
totals: {
unit_price: number;
quantity: number;
subtotal: number;
tax_total: number;
total: number;
original_total: number;
original_tax_total: number;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
discount_total: number;
raw_discount_total: number;
};
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
price: string;
discounted_price: string;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
thumbnail: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
quantity: number;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
return_total: string;
refund_amount: string;
additional_total: string;
}>;
itemsReturnedData(data: Record<string, unknown>): Promise<{
locale: {} | null;
has_shipping: boolean;
email: string;
items: (Omit<ReturnItem, "beforeUpdate" | "afterUpdateOrLoad"> & {
totals: any;
price: string;
tax_lines: any;
thumbnail: string;
})[];
subtotal: string;
shipping_total: string;
refund_amount: string;
return_request: {
refund_amount: string;
status: import("@medusajs/medusa").ReturnStatus;
items: ReturnItem[];
swap_id: string | null;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string | null;
claim_order: import("@medusajs/medusa").ClaimOrder;
order_id: string | null;
order: Order;
shipping_method: import("@medusajs/medusa").ShippingMethod;
location_id: string | null;
shipping_data: Record<string, unknown>;
received_at: Date;
no_notification: boolean | null;
metadata: Record<string, unknown> | null;
idempotency_key: string | null;
id: string;
created_at: Date;
updated_at: Date;
};
order: Order;
date: string;
}>;
swapShipmentCreatedData({ id, fulfillment_id }: Record<string, unknown>): Promise<{
locale: {} | null;
swap: import("@medusajs/medusa").Swap;
order: Order;
items: {
thumbnail: string;
price: string;
discounted_price: string;
quantity: number;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
date: string;
email: string;
tax_amount: string;
paid_total: string;
return_total: string;
refund_amount: string;
additional_total: string;
fulfillment: any;
tracking_links: any;
tracking_number: any;
}>;
claimShipmentCreatedData({ id, fulfillment_id }: Record<string, unknown>): Promise<{
locale: {} | null;
email: string;
claim: import("@medusajs/medusa").ClaimOrder;
order: Order;
fulfillment: any;
tracking_links: any;
tracking_number: any;
}>;
restockNotificationData({ variant_id, emails }: Record<string, unknown>): Promise<{
product: {
thumbnail: string | null;
title: string;
subtitle: string | null;
description: string | null;
handle: string | null;
is_giftcard: boolean;
status: import("@medusajs/medusa").ProductStatus;
images: import("@medusajs/medusa").Image[];
options: import("@medusajs/medusa").ProductOption[];
variants: import("@medusajs/medusa").ProductVariant[];
categories: import("@medusajs/medusa").ProductCategory[];
profile_id: string;
profile: import("@medusajs/medusa").ShippingProfile;
profiles: import("@medusajs/medusa").ShippingProfile[];
weight: number | null;
length: number | null;
height: number | null;
width: number | null;
hs_code: string | null;
origin_country: string | null;
mid_code: string | null;
material: string | null;
collection_id: string | null;
collection: import("@medusajs/medusa").ProductCollection;
type_id: string | null;
type: import("@medusajs/medusa").ProductType;
tags: import("@medusajs/medusa").ProductTag[];
discountable: boolean;
external_id: string | null;
metadata: Record<string, unknown> | null;
sales_channels: import("@medusajs/medusa").SalesChannel[];
deleted_at: Date | null;
id: string;
created_at: Date;
updated_at: Date;
};
variant: import("@medusajs/medusa").ProductVariant;
variant_id: string;
emails: unknown;
}>;
userPasswordResetData(data: Record<string, unknown>): Record<string, unknown>;
customerPasswordResetData(data: Record<string, unknown>): Record<string, unknown>;
orderRefundCreatedData({ id, refund_id }: Record<string, unknown>): Promise<{
order: Order;
refund: import("@medusajs/medusa").Refund | undefined;
refund_amount: string;
email: string;
}>;
processItems_(items: LineItem[], taxRate: number, currencyCode: string): {
thumbnail: string;
price: string;
cart_id: string;
cart: import("@medusajs/medusa").Cart;
order_id: string | null;
order: Order;
swap_id: string;
swap: import("@medusajs/medusa").Swap;
claim_order_id: string;
claim_order: import("@medusajs/medusa").ClaimOrder;
tax_lines: import("@medusajs/medusa").LineItemTaxLine[];
adjustments: import("@medusajs/medusa").LineItemAdjustment[];
original_item_id?: string | null | undefined;
order_edit_id?: string | null | undefined;
order_edit?: import("@medusajs/medusa").OrderEdit | null | undefined;
title: string;
description: string | null;
is_return: boolean;
is_giftcard: boolean;
should_merge: boolean;
allow_discounts: boolean;
has_shipping: boolean | null;
unit_price: number;
variant_id: string | null;
variant: import("@medusajs/medusa").ProductVariant;
product_id: string | null;
quantity: number;
fulfilled_quantity: number | null;
returned_quantity: number | null;
shipped_quantity: number | null;
metadata: Record<string, unknown>;
includes_tax: boolean;
refundable?: number | null | undefined;
subtotal?: number | null | undefined;
tax_total?: number | null | undefined;
total?: number | null | undefined;
original_total?: number | null | undefined;
original_tax_total?: number | null | undefined;
discount_total?: number | null | undefined;
raw_discount_total?: number | null | undefined;
gift_card_total?: number | null | undefined;
id: string;
created_at: Date;
updated_at: Date;
}[];
humanPrice_(amount: number | null | undefined, currency: string): string;
normalizeThumbUrl_(url?: string | null): string;
extractLocale(fromOrder: Order): Promise<{} | null>;
}
export default SendGridService;