From 14525e9e1d441b1b36e36968827a32edcf1ac664 Mon Sep 17 00:00:00 2001 From: sgruse Date: Mon, 25 Mar 2019 14:17:58 -0700 Subject: [PATCH 1/3] Refactored car club forms --- dist/clubs/drivers-club/mailer/index.d.ts | 22 +- dist/clubs/drivers-club/mailer/index.js | 58 +-- .../drivers-club/mailer/templates/index.d.ts | 20 +- .../drivers-club/mailer/templates/index.js | 130 +++++-- package-lock.json | 290 ++++----------- package.json | 4 +- src/clubs/drivers-club/mailer/index.ts | 58 +-- .../drivers-club/mailer/templates/index.ts | 138 +++++-- src/clubs/otto/mailer/templates/index.ts | 352 ++++++++++++++++++ 9 files changed, 714 insertions(+), 358 deletions(-) create mode 100644 src/clubs/otto/mailer/templates/index.ts diff --git a/dist/clubs/drivers-club/mailer/index.d.ts b/dist/clubs/drivers-club/mailer/index.d.ts index 4c72ab5..bb8d9e2 100644 --- a/dist/clubs/drivers-club/mailer/index.d.ts +++ b/dist/clubs/drivers-club/mailer/index.d.ts @@ -1,14 +1,14 @@ import * as core from 'club-hub-core'; -export declare const buildEventEmails: (message: core.Message.Model, user: core.User.Model, event: core.Event.Model) => Promise; +export declare const buildEventEmails: (message: core.Message.Model, club: core.Club.Model, user: core.User.Model, event: core.Event.Model) => Promise; export declare const buildOnboardingEmail: (message: core.Message.Model, user: core.User.Model, club: core.Club.Model, password: string) => Promise; -export declare const buildFormEmail: (message: core.Message.Model, form: any, event?: core.Event.Model) => Promise; -export declare const buildServiceEmails: (message: core.Message.Model, user: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation?: core.Event.Reservation) => Promise; +export declare const buildFormEmail: (message: core.Message.Model, club: core.Club.Model, form: any, event?: core.Event.Model) => Promise; +export declare const buildServiceEmails: (message: core.Message.Model, club: core.Club.Model, user: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation?: core.Event.Reservation) => Promise; export declare const buildWelcomeEmail: (member: core.User.Model, club: core.Club.Model, password: string) => Promise; -export declare const sendMembershipApplicationEmail: (memberInfo: any) => Promise; -export declare const sendMembershipInquiryEmail: (memberInfo: any) => Promise; -export declare const sendMembershipInquiryResponseEmail: (memberInfo: any) => Promise; -export declare const buildServiceRequestEmail: (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation) => Promise; -export declare const sendProviderRequestEmail: (form: any) => Promise; -export declare const buildRSVPEmail: (member: core.User.Model, event: core.Event.Model) => Promise; -export declare const sendMemberUnRSVPEmail: (member: core.User.Model, event: core.Event.Model) => Promise; -export declare const sendPublicRSVPEmail: (event: core.Event.Model, form: any) => Promise; +export declare const sendMembershipApplicationEmail: (memberInfo: any, club: core.Club.Model) => Promise; +export declare const sendMembershipInquiryEmail: (memberInfo: any, club: core.Club.Model) => Promise; +export declare const sendMembershipInquiryResponseEmail: (memberInfo: any, club: core.Club.Model) => Promise; +export declare const buildServiceRequestEmail: (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation, club: core.Club.Model) => Promise; +export declare const sendProviderRequestEmail: (form: any, club: core.Club.Model) => Promise; +export declare const buildRSVPEmail: (member: core.User.Model, event: core.Event.Model, club: core.Club.Model) => Promise; +export declare const sendMemberUnRSVPEmail: (member: core.User.Model, event: core.Event.Model, club: core.Club.Model) => Promise; +export declare const sendPublicRSVPEmail: (event: core.Event.Model, form: any, club: core.Club.Model) => Promise; diff --git a/dist/clubs/drivers-club/mailer/index.js b/dist/clubs/drivers-club/mailer/index.js index f62c39b..34efcb7 100644 --- a/dist/clubs/drivers-club/mailer/index.js +++ b/dist/clubs/drivers-club/mailer/index.js @@ -10,13 +10,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge Object.defineProperty(exports, "__esModule", { value: true }); const core = require("club-hub-core"); const templates = require("./templates"); -exports.buildEventEmails = (message, user, event) => __awaiter(this, void 0, void 0, function* () { +exports.buildEventEmails = (message, club, user, event) => __awaiter(this, void 0, void 0, function* () { const methodName = '[buildEventEmails] -'; switch (message.content.type) { case core.Message.Type.Rsvp: - return yield exports.buildRSVPEmail(user, event); + return yield exports.buildRSVPEmail(user, event, club); case core.Message.Type.UnRsvp: - return yield exports.sendMemberUnRSVPEmail(user, event); + return yield exports.sendMemberUnRSVPEmail(user, event, club); default: throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`); } @@ -30,30 +30,30 @@ exports.buildOnboardingEmail = (message, user, club, password) => __awaiter(this throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`); } }); -exports.buildFormEmail = (message, form, event) => __awaiter(this, void 0, void 0, function* () { +exports.buildFormEmail = (message, club, form, event) => __awaiter(this, void 0, void 0, function* () { const methodName = '[buildFormEmail] -'; switch (message.content.type) { case core.Message.Type.Application: - return yield exports.sendMembershipApplicationEmail(form); + return yield exports.sendMembershipApplicationEmail(form, club); case core.Message.Type.MembershipInquiry: - return yield exports.sendMembershipInquiryEmail(form); + return yield exports.sendMembershipInquiryEmail(form, club); case core.Message.Type.MembershipInquiryRes: - return yield exports.sendMembershipInquiryResponseEmail(form); + return yield exports.sendMembershipInquiryResponseEmail(form, club); case core.Message.Type.PublicRsvp: - return yield exports.sendPublicRSVPEmail(event, form); + return yield exports.sendPublicRSVPEmail(event, form, club); case core.Message.Type.NewProviderRequest: - return yield exports.sendProviderRequestEmail(form); + return yield exports.sendProviderRequestEmail(form, club); default: throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`); } }); -exports.buildServiceEmails = (message, user, provider, event, reservation) => __awaiter(this, void 0, void 0, function* () { +exports.buildServiceEmails = (message, club, user, provider, event, reservation) => __awaiter(this, void 0, void 0, function* () { const methodName = '[buildServiceEmails] -'; switch (message.content.type) { case core.Message.Type.ServiceRequest: - return exports.buildServiceRequestEmail(user, provider, event, reservation); + return exports.buildServiceRequestEmail(user, provider, event, reservation, club); case core.Message.Type.NewProviderRequest: - return exports.sendProviderRequestEmail(provider); + return exports.sendProviderRequestEmail(provider, club); default: throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`); } @@ -61,28 +61,30 @@ exports.buildServiceEmails = (message, user, provider, event, reservation) => __ exports.buildWelcomeEmail = (member, club, password) => __awaiter(this, void 0, void 0, function* () { return templates.WelcomeEmailTemplate(member, club, password); }); -exports.sendMembershipApplicationEmail = (memberInfo) => __awaiter(this, void 0, void 0, function* () { - return templates.MembershipApplicationTemplate(memberInfo); +exports.sendMembershipApplicationEmail = (memberInfo, club) => __awaiter(this, void 0, void 0, function* () { + return (club.name === core.Constants.Clubs.DRIVERS_CLUB) ? + templates.DcMembershipApplicationTemplate(memberInfo, club) : + templates.OttoMembershipApplicationTemplate(memberInfo, club); }); -exports.sendMembershipInquiryEmail = (memberInfo) => __awaiter(this, void 0, void 0, function* () { - return templates.MembershipInquiryTemplate(memberInfo); +exports.sendMembershipInquiryEmail = (memberInfo, club) => __awaiter(this, void 0, void 0, function* () { + return templates.MembershipInquiryTemplate(memberInfo, club); }); -exports.sendMembershipInquiryResponseEmail = (memberInfo) => __awaiter(this, void 0, void 0, function* () { - return templates.MembershipInquiryResponseTemplate(memberInfo); +exports.sendMembershipInquiryResponseEmail = (memberInfo, club) => __awaiter(this, void 0, void 0, function* () { + return templates.MembershipInquiryResponseTemplate(memberInfo, club); }); -exports.buildServiceRequestEmail = (member, provider, event, reservation) => __awaiter(this, void 0, void 0, function* () { - return templates.ServiceRequestTemplate(member, provider, event, reservation); +exports.buildServiceRequestEmail = (member, provider, event, reservation, club) => __awaiter(this, void 0, void 0, function* () { + return templates.ServiceRequestTemplate(member, provider, event, reservation, club); }); -exports.sendProviderRequestEmail = (form) => __awaiter(this, void 0, void 0, function* () { - return templates.NewProviderTemplate(form); +exports.sendProviderRequestEmail = (form, club) => __awaiter(this, void 0, void 0, function* () { + return templates.NewProviderTemplate(form, club); }); -exports.buildRSVPEmail = (member, event) => __awaiter(this, void 0, void 0, function* () { - return templates.RsvpTemplate(member, event); +exports.buildRSVPEmail = (member, event, club) => __awaiter(this, void 0, void 0, function* () { + return templates.RsvpTemplate(member, event, club); }); -exports.sendMemberUnRSVPEmail = (member, event) => __awaiter(this, void 0, void 0, function* () { +exports.sendMemberUnRSVPEmail = (member, event, club) => __awaiter(this, void 0, void 0, function* () { const methodName = '[sendMemberUnRSVPEmail] -'; - return templates.UnRsvpTemplate(member, event); + return templates.UnRsvpTemplate(member, event, club); }); -exports.sendPublicRSVPEmail = (event, form) => __awaiter(this, void 0, void 0, function* () { - return templates.PublicRsvpTemplate(event, form); +exports.sendPublicRSVPEmail = (event, form, club) => __awaiter(this, void 0, void 0, function* () { + return templates.PublicRsvpTemplate(event, form, club); }); diff --git a/dist/clubs/drivers-club/mailer/templates/index.d.ts b/dist/clubs/drivers-club/mailer/templates/index.d.ts index c81dd17..600c965 100644 --- a/dist/clubs/drivers-club/mailer/templates/index.d.ts +++ b/dist/clubs/drivers-club/mailer/templates/index.d.ts @@ -1,18 +1,20 @@ import * as core from 'club-hub-core'; declare const welcomeEmailTemplate: (member: core.User.Model, club: core.Club.Model, password: string) => string; -declare const membershipApplicationTemplate: (memberInfo: any) => string; -declare const membershipInquiryTemplate: (memberInfo: any) => string; -declare const membershipInquiryResponseTemplate: (memberFormInfo: any, url?: any) => string; -declare const rsvpTemplate: (member: core.User.Model, event: core.Event.Model) => string; -declare const unRsvpTemplate: (member: core.User.Model, event: core.Event.Model) => string; -declare const publicRsvpTemplate: (event: core.Event.Model, memberInfo: any) => string; -declare const serviceRequestTemplate: (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation) => string; -declare const newProviderTemplate: (providerInfo: any) => string; +declare const dcMembershipApplicationTemplate: (memberInfo: any, club: core.Club.Model) => string; +declare const ottoMembershipApplicationTemplate: (memberInfo: any, club: core.Club.Model) => string; +declare const membershipInquiryTemplate: (memberInfo: any, club: core.Club.Model) => string; +declare const membershipInquiryResponseTemplate: (memberFormInfo: any, club: core.Club.Model, url?: any) => string; +declare const rsvpTemplate: (member: core.User.Model, event: core.Event.Model, club: core.Club.Model) => string; +declare const unRsvpTemplate: (member: core.User.Model, event: core.Event.Model, club: core.Club.Model) => string; +declare const publicRsvpTemplate: (event: core.Event.Model, memberInfo: any, club: core.Club.Model) => string; +declare const serviceRequestTemplate: (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation, club: core.Club.Model) => string; +declare const newProviderTemplate: (providerInfo: any, club: core.Club.Model) => string; export { rsvpTemplate as RsvpTemplate }; export { publicRsvpTemplate as PublicRsvpTemplate }; export { unRsvpTemplate as UnRsvpTemplate }; export { serviceRequestTemplate as ServiceRequestTemplate }; -export { membershipApplicationTemplate as MembershipApplicationTemplate }; +export { dcMembershipApplicationTemplate as DcMembershipApplicationTemplate }; +export { ottoMembershipApplicationTemplate as OttoMembershipApplicationTemplate }; export { newProviderTemplate as NewProviderTemplate }; export { welcomeEmailTemplate as WelcomeEmailTemplate }; export { membershipInquiryTemplate as MembershipInquiryTemplate }; diff --git a/dist/clubs/drivers-club/mailer/templates/index.js b/dist/clubs/drivers-club/mailer/templates/index.js index a0b3f8a..c7be68e 100644 --- a/dist/clubs/drivers-club/mailer/templates/index.js +++ b/dist/clubs/drivers-club/mailer/templates/index.js @@ -1,25 +1,28 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const core = require("club-hub-core"); const welcomeEmailTemplate = (member, club, password) => { + const webURL = `https://${club.domain}.tryclubhub.com/`; + const supportEmail = (club.name === core.Constants.Clubs.DRIVERS_CLUB) ? 'info@drivers.club' : 'info@otto.club'; const message = ` -

Hi ${member.firstName} and welcome to Drivers Club! +

Hi ${member.firstName} and welcome to ${club.name}! -

Your new Drivers Club account has been created. This gives you access to the Drivers Club web and mobile apps!

+

Your new ${club.name} account has been created. This gives you access to the ${club.name} web and mobile apps!

-

Please follow the url: https://driversclub.tryclubhub.com/ to login. Your username is: ${member.email}, your temporary password is: ${password}.

+

Please follow the url: ${webURL} to login. Your username is: ${member.email}, your temporary password is: ${password}.

To change your password, please use the "Forgot Password" link on the login screen. An email will then be sent to you with instructions on resetting the password.

-

Please send an email to info@drivers.club if you have any questions!

+

Please send an email to ${supportEmail} if you have any questions!

Best,

-

The Drivers Club team.

+

The ${club.name} team.

`; return message; }; exports.WelcomeEmailTemplate = welcomeEmailTemplate; -const membershipApplicationTemplate = (memberInfo) => { +const dcMembershipApplicationTemplate = (memberInfo, club) => { const message = `

Hi there!

@@ -70,12 +73,75 @@ const membershipApplicationTemplate = (memberInfo) => {

Thanks,

-

Your friends at Drivers Club

+

Your friends at ${club.name}

`; return message; }; -exports.MembershipApplicationTemplate = membershipApplicationTemplate; -const membershipInquiryTemplate = (memberInfo) => { +exports.DcMembershipApplicationTemplate = dcMembershipApplicationTemplate; +const ottoMembershipApplicationTemplate = (memberInfo, club) => { + const fullName = `${memberInfo.firstName} ${memberInfo.middleName} ${memberInfo.lastName}`; + const message = ` +

Hi there!

+ +

A prospective member has completed the new member request form. Details below:

+ +

Member Info

+
    +
  • + ${bulletLine('Name:', fullName)} +
  • +
  • + ${bulletLine('Email', memberInfo.email)} +
  • +
  • + ${bulletLine('Address', memberInfo.address)} +
  • +
  • + ${bulletLine('Address', `${memberInfo.city} ${memberInfo.state.label} ${memberInfo.zip}`)} +
  • +
  • + ${bulletLine('Phone', memberInfo.phoneNumber)} +
  • +
  • + ${bulletLine('Occupation', memberInfo.occupation)} +
  • +
  • + ${bulletLine('Birthday', memberInfo.birthday)} +
  • +
  • + ${bulletLine('Gender', memberInfo.gender.label)} +
  • +
  • + ${bulletLine('Automotive Passion', memberInfo.automotivePassion)} +
  • +
  • + ${bulletLine('Referral', memberInfo.referral)} +
  • +
  • + ${bulletLine('Car Showcase', memberInfo.carShowcase)} +
  • +
  • + ${bulletLine('Hobbies', memberInfo.freeTime)} +
  • +
  • + ${bulletLine('Other Clubs', memberInfo.otherClubs)} +
  • +
  • + ${bulletLine('Membership Type', `${memberInfo.membershipType.label}`)} +
  • +
  • + ${bulletLine('Additional Information', `${memberInfo.other}`)} +
  • +
+ +

Thanks,

+ +

Your friends at ${club.name}

+ `; + return message; +}; +exports.OttoMembershipApplicationTemplate = ottoMembershipApplicationTemplate; +const membershipInquiryTemplate = (memberInfo, club) => { const message = `

Hi there!

@@ -96,35 +162,37 @@ const membershipInquiryTemplate = (memberInfo) => {

Thanks,

-

Your friends at Drivers Club

+

Your friends at ${club.name}

`; return message; }; exports.MembershipInquiryTemplate = membershipInquiryTemplate; -const membershipInquiryResponseTemplate = (memberFormInfo, url) => { +const membershipInquiryResponseTemplate = (memberFormInfo, club, url) => { + const applicationURL = `https://${club.domain}.tryclubhub.com/forms/application`; + const admin = (club.name === core.Constants.Clubs.DRIVERS_CLUB) ? 'Amanda Friedman' : 'Eli Kogan'; const message = `

Dear ${memberFormInfo.firstName},

-

Thank you for contacting Drivers Club regarding ${memberFormInfo.membership.label} membership!

+

Thank you for contacting ${club.name} regarding ${memberFormInfo.membership.label} membership!

We would like to learn more about your automotive passions.

-

Please click this link to begin the formal application process.

+

Please click this link to begin the formal application process.

Sincerely,

-

Amanda Friedman

+

${admin}

General Manager

`; return message; }; exports.MembershipInquiryResponseTemplate = membershipInquiryResponseTemplate; -const rsvpTemplate = (member, event) => { +const rsvpTemplate = (member, event, club) => { const fullName = `${member.firstName} ${member.lastName}`; const message = `

Hi there!

-

A Drivers Club member has RSVP'd to an event. Details below:

+

A Club member has RSVP'd to an event. Details below:

Member Info

    @@ -151,18 +219,18 @@ const rsvpTemplate = (member, event) => {

    Thanks,

    -

    Your friends at Drivers Club

    +

    Your friends at ${club.name}

    `; return message; }; exports.RsvpTemplate = rsvpTemplate; -const unRsvpTemplate = (member, event) => { +const unRsvpTemplate = (member, event, club) => { const fullName = `${member.firstName} ${member.lastName}`; const eventPrice = (event.price) ? event.price.toString() : 'Free'; const message = `

    Hi there!

    -

    A Drivers Club member has cancelled their RSVP to an event. Details below:

    +

    A Club member has cancelled their RSVP to an event. Details below:

    Member Info

      @@ -192,12 +260,12 @@ const unRsvpTemplate = (member, event) => {

      Thanks,

      -

      Your friends at Drivers Club

      +

      Your friends at ${club.name}

      `; return message; }; exports.UnRsvpTemplate = unRsvpTemplate; -const publicRsvpTemplate = (event, memberInfo) => { +const publicRsvpTemplate = (event, memberInfo, club) => { const fullName = `${memberInfo.firstName} ${memberInfo.lastName}`; const plusOneText = memberInfo.plusOne ? 'Yes' : 'No'; const eventPrice = (event.price) ? event.price.toString() : 'Free'; @@ -228,18 +296,18 @@ const publicRsvpTemplate = (event, memberInfo) => { ${bulletLine('Price', eventPrice)}
    • - ${linkLine('Event', event.shortLink)} + ${linkLine('Event', event.shortLink, club)}

    Thanks,

    -

    Your friends at Drivers Club

    +

    Your friends at ${club.name}

    `; return message; }; exports.PublicRsvpTemplate = publicRsvpTemplate; -const serviceRequestTemplate = (member, provider, event, reservation) => { +const serviceRequestTemplate = (member, provider, event, reservation, club) => { const fullName = `${member.firstName} ${member.lastName}`; const reservationMeta = reservation.meta; const vehicle = member.meta.car.vehicles.find((vehicle) => vehicle._id.toString() === reservationMeta.vehicleID.toString()); @@ -248,7 +316,7 @@ const serviceRequestTemplate = (member, provider, event, reservation) => { const message = `

    Hi there!

    -

    A Drivers Club member has submitted a new service request. Details below:

    +

    A Club member has submitted a new service request. Details below:

    Provider Info

      @@ -291,16 +359,16 @@ const serviceRequestTemplate = (member, provider, event, reservation) => {

      Thanks,

      -

      Your friends at Drivers Club

      +

      Your friends at ${club.name}

      `; return message; }; exports.ServiceRequestTemplate = serviceRequestTemplate; -const newProviderTemplate = (providerInfo) => { +const newProviderTemplate = (providerInfo, club) => { const message = `

      Hi there!

      -

      A member has submitted a request to add a new Drivers Club provider. Details below:

      +

      A member has submitted a request to add a new ${club.name} provider. Details below:

      Provider Info

        @@ -335,7 +403,7 @@ const newProviderTemplate = (providerInfo) => {

        Thanks,

        -

        Your friends at Drivers Club

        +

        Your friends at ${club.name}

        `; return message; }; @@ -343,8 +411,8 @@ exports.NewProviderTemplate = newProviderTemplate; const bulletLine = (boldText, text) => { return `

        ${boldText}

        ${text}

        `; }; -const linkLine = (boldText, shortLink) => { - return `

        ${boldText}

        Event Link`; +const linkLine = (boldText, shortLink, club) => { + return `

        ${boldText}

        Event Link`; }; const regularText = (text) => { return `

        ${text}

        `; diff --git a/package-lock.json b/package-lock.json index 10afd86..6d3010d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -313,7 +313,6 @@ "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", "dev": true, - "optional": true, "requires": { "file-type": "^3.1.0" } @@ -1406,7 +1405,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, - "optional": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -1617,7 +1615,6 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, - "optional": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -1627,8 +1624,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "optional": true + "dev": true }, "buffer-crc32": { "version": "0.2.13", @@ -1646,8 +1642,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true, - "optional": true + "dev": true }, "buffer-from": { "version": "1.1.1", @@ -1786,8 +1781,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true, - "optional": true + "dev": true }, "caseless": { "version": "0.12.0", @@ -1800,7 +1794,6 @@ "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", "dev": true, - "optional": true, "requires": { "get-proxy": "^1.0.1", "is-obj": "^1.0.0", @@ -1812,8 +1805,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true, - "optional": true + "dev": true } } }, @@ -2070,8 +2062,8 @@ } }, "club-hub-core": { - "version": "git+https://git@github.com/meshhq/club-hub-core.git#575c57977ca408bb02e59f66ef68325fb4d5b941", - "from": "git+https://git@github.com/meshhq/club-hub-core.git#0.0.28", + "version": "git+https://git@github.com/meshhq/club-hub-core.git#97e1e66d41a9cda92a13b0a94fc8bbe06b7f2e9e", + "from": "git+https://git@github.com/meshhq/club-hub-core.git#0.0.35", "requires": { "axios": "^0.18.0" }, @@ -2091,8 +2083,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true, - "optional": true + "dev": true }, "coa": { "version": "1.0.4", @@ -2323,7 +2314,6 @@ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, - "optional": true, "requires": { "capture-stack-trace": "^1.0.0" } @@ -2573,7 +2563,6 @@ "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", "dev": true, - "optional": true, "requires": { "buffer-to-vinyl": "^1.0.0", "concat-stream": "^1.4.6", @@ -2590,22 +2579,19 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "optional": true + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true, - "optional": true + "dev": true }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -2615,7 +2601,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, - "optional": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -2629,7 +2614,6 @@ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", "dev": true, - "optional": true, "requires": { "extend": "^3.0.0", "glob": "^5.0.3", @@ -2646,7 +2630,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -2659,7 +2642,6 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, - "optional": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -2672,7 +2654,6 @@ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", "dev": true, - "optional": true, "requires": { "convert-source-map": "^1.1.1", "graceful-fs": "^4.1.2", @@ -2685,22 +2666,19 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true, - "optional": true + "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true + "dev": true }, "ordered-read-streams": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", "dev": true, - "optional": true, "requires": { "is-stream": "^1.0.1", "readable-stream": "^2.0.1" @@ -2710,22 +2688,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true, - "optional": true + "dev": true }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true + "dev": true }, "through2-filter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", "dev": true, - "optional": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" @@ -2736,7 +2711,6 @@ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", "dev": true, - "optional": true, "requires": { "extend-shallow": "^2.0.1" } @@ -2746,7 +2720,6 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, - "optional": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -2758,7 +2731,6 @@ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "dev": true, - "optional": true, "requires": { "duplexify": "^3.2.0", "glob-stream": "^5.3.2", @@ -2786,7 +2758,6 @@ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", "dev": true, - "optional": true, "requires": { "is-tar": "^1.0.0", "object-assign": "^2.0.0", @@ -2800,36 +2771,31 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true, - "optional": true + "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true, - "optional": true + "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -2841,15 +2807,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true + "dev": true }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, - "optional": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -2860,7 +2824,6 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, - "optional": true, "requires": { "clone": "^0.2.0", "clone-stats": "^0.0.1" @@ -2873,7 +2836,6 @@ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", "dev": true, - "optional": true, "requires": { "is-bzip2": "^1.0.0", "object-assign": "^2.0.0", @@ -2888,36 +2850,31 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true, - "optional": true + "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true, - "optional": true + "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -2929,15 +2886,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true + "dev": true }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, - "optional": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -2948,7 +2903,6 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, - "optional": true, "requires": { "clone": "^0.2.0", "clone-stats": "^0.0.1" @@ -2961,7 +2915,6 @@ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", "dev": true, - "optional": true, "requires": { "is-gzip": "^1.0.0", "object-assign": "^2.0.0", @@ -2975,36 +2928,31 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true, - "optional": true + "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true, - "optional": true + "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -3016,15 +2964,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true + "dev": true }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, - "optional": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -3035,7 +2981,6 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, - "optional": true, "requires": { "clone": "^0.2.0", "clone-stats": "^0.0.1" @@ -3048,7 +2993,6 @@ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", "dev": true, - "optional": true, "requires": { "is-zip": "^1.0.0", "read-all-stream": "^3.0.0", @@ -3063,29 +3007,25 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "optional": true + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true, - "optional": true + "dev": true }, "replace-ext": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true, - "optional": true + "dev": true }, "vinyl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, - "optional": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -3107,8 +3047,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true + "dev": true }, "deep-is": { "version": "0.1.3", @@ -3382,7 +3321,6 @@ "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", "dev": true, - "optional": true, "requires": { "caw": "^1.0.1", "concat-stream": "^1.4.7", @@ -3405,22 +3343,19 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "optional": true + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true, - "optional": true + "dev": true }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -3430,7 +3365,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, - "optional": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -3444,7 +3378,6 @@ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", "dev": true, - "optional": true, "requires": { "extend": "^3.0.0", "glob": "^5.0.3", @@ -3461,7 +3394,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -3474,7 +3406,6 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, - "optional": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -3487,7 +3418,6 @@ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", "dev": true, - "optional": true, "requires": { "convert-source-map": "^1.1.1", "graceful-fs": "^4.1.2", @@ -3500,22 +3430,19 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true, - "optional": true + "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true + "dev": true }, "ordered-read-streams": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", "dev": true, - "optional": true, "requires": { "is-stream": "^1.0.1", "readable-stream": "^2.0.1" @@ -3525,22 +3452,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true, - "optional": true + "dev": true }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true + "dev": true }, "through2-filter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", "dev": true, - "optional": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" @@ -3551,7 +3475,6 @@ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", "dev": true, - "optional": true, "requires": { "extend-shallow": "^2.0.1" } @@ -3561,7 +3484,6 @@ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, - "optional": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -3573,7 +3495,6 @@ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "dev": true, - "optional": true, "requires": { "duplexify": "^3.2.0", "glob-stream": "^5.3.2", @@ -4363,7 +4284,6 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, - "optional": true, "requires": { "pend": "~1.2.0" } @@ -4409,15 +4329,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true, - "optional": true + "dev": true }, "filenamify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", "dev": true, - "optional": true, "requires": { "filename-reserved-regex": "^1.0.0", "strip-outer": "^1.0.0", @@ -4690,8 +4608,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "optional": true + "dev": true }, "fs-exists-sync": { "version": "0.1.0", @@ -4748,8 +4665,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -4773,15 +4689,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4798,22 +4712,19 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4944,8 +4855,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4959,7 +4869,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4976,7 +4885,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4985,15 +4893,13 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5014,7 +4920,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5103,8 +5008,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5118,7 +5022,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5214,8 +5117,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5257,7 +5159,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5279,7 +5180,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5328,15 +5228,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true + "dev": true } } }, @@ -5454,7 +5352,6 @@ "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", "dev": true, - "optional": true, "requires": { "rc": "^1.1.2" } @@ -5733,7 +5630,6 @@ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "dev": true, - "optional": true, "requires": { "create-error-class": "^3.0.1", "duplexer2": "^0.1.4", @@ -5757,7 +5653,6 @@ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, - "optional": true, "requires": { "readable-stream": "^2.0.2" } @@ -6029,7 +5924,6 @@ "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", "dev": true, - "optional": true, "requires": { "archive-type": "^3.0.0", "decompress": "^3.0.0", @@ -7068,8 +6962,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", - "dev": true, - "optional": true + "dev": true } } }, @@ -8284,8 +8177,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", - "dev": true, - "optional": true + "dev": true }, "is-data-descriptor": { "version": "0.1.4", @@ -8391,8 +8283,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", - "dev": true, - "optional": true + "dev": true }, "is-html": { "version": "1.0.0", @@ -8442,8 +8333,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true, - "optional": true + "dev": true }, "is-negated-glob": { "version": "1.0.0", @@ -8484,8 +8374,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true, - "optional": true + "dev": true }, "is-path-cwd": { "version": "1.0.0", @@ -8549,8 +8438,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true, - "optional": true + "dev": true }, "is-relative": { "version": "1.0.0", @@ -8565,8 +8453,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true, - "optional": true + "dev": true }, "is-stream": { "version": "1.1.0", @@ -8585,8 +8472,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", - "dev": true, - "optional": true + "dev": true }, "is-typedarray": { "version": "1.0.0", @@ -8616,8 +8502,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true, - "optional": true + "dev": true }, "is-utf8": { "version": "0.2.1", @@ -8647,8 +8532,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", - "dev": true, - "optional": true + "dev": true }, "isarray": { "version": "2.0.1", @@ -9645,8 +9529,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "optional": true + "dev": true }, "lpad-align": { "version": "1.1.2", @@ -10445,8 +10328,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true, - "optional": true + "dev": true }, "nodemailer": { "version": "0.7.1", @@ -11663,8 +11545,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "optional": true + "dev": true }, "preserve": { "version": "0.2.0", @@ -11872,7 +11753,6 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "optional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11884,8 +11764,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true + "dev": true } } }, @@ -11894,7 +11773,6 @@ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", "dev": true, - "optional": true, "requires": { "pinkie-promise": "^2.0.0", "readable-stream": "^2.0.0" @@ -12519,7 +12397,6 @@ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "dev": true, - "optional": true, "requires": { "commander": "~2.8.1" }, @@ -12529,7 +12406,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "dev": true, - "optional": true, "requires": { "graceful-readlink": ">= 1.0.0" } @@ -13186,8 +13062,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true, - "optional": true + "dev": true }, "static-extend": { "version": "0.1.2", @@ -13327,7 +13202,6 @@ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", "dev": true, - "optional": true, "requires": { "chalk": "^1.0.0", "get-stdin": "^4.0.1", @@ -13342,7 +13216,6 @@ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", "dev": true, - "optional": true, "requires": { "is-relative": "^0.1.0" } @@ -13351,15 +13224,13 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true, - "optional": true + "dev": true }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true + "dev": true } } }, @@ -13376,15 +13247,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true + "dev": true }, "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, - "optional": true, "requires": { "escape-string-regexp": "^1.0.2" } @@ -13482,7 +13351,6 @@ "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", "dev": true, - "optional": true, "requires": { "chalk": "^1.0.0" } @@ -13635,7 +13503,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, - "optional": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -13669,7 +13536,6 @@ "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", "dev": true, - "optional": true, "requires": { "os-tmpdir": "^1.0.0", "uuid": "^2.0.1" @@ -13679,8 +13545,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true, - "optional": true + "dev": true } } }, @@ -13778,8 +13643,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true, - "optional": true + "dev": true }, "title-case": { "version": "1.1.2", @@ -13811,8 +13675,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true, - "optional": true + "dev": true }, "to-fast-properties": { "version": "1.0.3", @@ -13917,7 +13780,6 @@ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", "dev": true, - "optional": true, "requires": { "escape-string-regexp": "^1.0.2" } @@ -14535,8 +14397,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true, - "optional": true + "dev": true }, "upath": { "version": "1.1.0", @@ -14597,7 +14458,6 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, - "optional": true, "requires": { "prepend-http": "^1.0.1" } @@ -14711,7 +14571,6 @@ "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", "dev": true, - "optional": true, "requires": { "object-assign": "^4.0.1", "readable-stream": "^2.0.0" @@ -14782,7 +14641,6 @@ "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", "dev": true, - "optional": true, "requires": { "wrap-fn": "^0.1.0" } @@ -14861,7 +14719,6 @@ "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", "dev": true, - "optional": true, "requires": { "co": "3.1.0" } @@ -15020,7 +14877,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, - "optional": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/package.json b/package.json index 884ef40..e6f6204 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,10 @@ "index.js" ], "dependencies": { + "club-hub-core": "https://git@github.com/meshhq/club-hub-core.git#0.0.35", "feather-icons": "^4.17.0", "handlebars": "^4.1.0", - "uninstall": "0.0.0", - "club-hub-core": "https://git@github.com/meshhq/club-hub-core.git#0.0.28" + "uninstall": "0.0.0" }, "devDependencies": { "typescript": "^3.3.3", diff --git a/src/clubs/drivers-club/mailer/index.ts b/src/clubs/drivers-club/mailer/index.ts index 3a5e121..072700f 100644 --- a/src/clubs/drivers-club/mailer/index.ts +++ b/src/clubs/drivers-club/mailer/index.ts @@ -10,14 +10,14 @@ import * as templates from './templates' * @param user User document. * @param event Event document. */ -export const buildEventEmails = async (message: core.Message.Model, user: core.User.Model, event: core.Event.Model): Promise => { +export const buildEventEmails = async (message: core.Message.Model, club: core.Club.Model, user: core.User.Model, event: core.Event.Model): Promise => { const methodName = '[buildEventEmails] -' switch(message.content.type) { case core.Message.Type.Rsvp: - return await buildRSVPEmail(user, event) + return await buildRSVPEmail(user, event, club) case core.Message.Type.UnRsvp: - return await sendMemberUnRSVPEmail(user, event) + return await sendMemberUnRSVPEmail(user, event, club) default: throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`) } @@ -49,20 +49,20 @@ export const buildOnboardingEmail = async (message: core.Message.Model, user: co * @param club Club document. * @param form The form submitted by the user. */ -export const buildFormEmail = async (message: core.Message.Model, form: any, event?: core.Event.Model): Promise => { +export const buildFormEmail = async (message: core.Message.Model, club: core.Club.Model, form: any, event?: core.Event.Model): Promise => { const methodName = '[buildFormEmail] -' switch (message.content.type) { case core.Message.Type.Application: - return await sendMembershipApplicationEmail(form) + return await sendMembershipApplicationEmail(form, club) case core.Message.Type.MembershipInquiry: - return await sendMembershipInquiryEmail(form) + return await sendMembershipInquiryEmail(form, club) case core.Message.Type.MembershipInquiryRes: - return await sendMembershipInquiryResponseEmail(form) + return await sendMembershipInquiryResponseEmail(form, club) case core.Message.Type.PublicRsvp: - return await sendPublicRSVPEmail(event, form) + return await sendPublicRSVPEmail(event, form, club) case core.Message.Type.NewProviderRequest: - return await sendProviderRequestEmail(form) + return await sendProviderRequestEmail(form, club) default: throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`) } @@ -75,14 +75,14 @@ export const buildFormEmail = async (message: core.Message.Model, form: any, eve * @param provider * @param reservation */ -export const buildServiceEmails = async (message: core.Message.Model, user: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation?: core.Event.Reservation): Promise => { +export const buildServiceEmails = async (message: core.Message.Model, club: core.Club.Model, user: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation?: core.Event.Reservation): Promise => { const methodName = '[buildServiceEmails] -' switch (message.content.type) { case core.Message.Type.ServiceRequest: - return buildServiceRequestEmail(user, provider, event, reservation) + return buildServiceRequestEmail(user, provider, event, reservation, club) case core.Message.Type.NewProviderRequest: - return sendProviderRequestEmail(provider) + return sendProviderRequestEmail(provider, club) default: throw new Error(`${methodName} received an unsupported message type: ${message.content.type}`) } @@ -99,24 +99,26 @@ export const buildWelcomeEmail = async (member: core.User.Model, club: core.Club * Sends an email to the drivers club admin with the new member application info. * @param memberInfo Form information. */ -export const sendMembershipApplicationEmail = async (memberInfo: any): Promise => { - return templates.MembershipApplicationTemplate(memberInfo) +export const sendMembershipApplicationEmail = async (memberInfo: any, club: core.Club.Model): Promise => { + return (club.name === core.Constants.Clubs.DRIVERS_CLUB) ? + templates.DcMembershipApplicationTemplate(memberInfo, club) : + templates.OttoMembershipApplicationTemplate(memberInfo, club) } /** * Sends an email to the Drivers Club admin with membership inquiry information. * @param memberInfo Form information. */ -export const sendMembershipInquiryEmail = async (memberInfo: any): Promise => { - return templates.MembershipInquiryTemplate(memberInfo) +export const sendMembershipInquiryEmail = async (memberInfo: any, club: core.Club.Model): Promise => { + return templates.MembershipInquiryTemplate(memberInfo, club) } /** * Sends a response email to perspective member letting them know their application is being reviewed. * @param memberInfo Form information. */ -export const sendMembershipInquiryResponseEmail = async (memberInfo: any): Promise => { - return templates.MembershipInquiryResponseTemplate(memberInfo) +export const sendMembershipInquiryResponseEmail = async (memberInfo: any, club: core.Club.Model): Promise => { + return templates.MembershipInquiryResponseTemplate(memberInfo, club) } //-------------------------------------------------- @@ -130,16 +132,16 @@ export const sendMembershipInquiryResponseEmail = async (memberInfo: any): Promi * @param reservation Reservation model (sub document of the event model). * */ -export const buildServiceRequestEmail = async (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation): Promise => { - return templates.ServiceRequestTemplate(member, provider, event, reservation) +export const buildServiceRequestEmail = async (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation, club: core.Club.Model): Promise => { + return templates.ServiceRequestTemplate(member, provider, event, reservation, club) } /** * Sends an email to an admin letting them know a member wants a service provider added. * @param provider Calendar model. */ -export const sendProviderRequestEmail = async (form: any): Promise => { - return templates.NewProviderTemplate(form) +export const sendProviderRequestEmail = async (form: any, club: core.Club.Model): Promise => { + return templates.NewProviderTemplate(form, club) } //-------------------------------------------------- @@ -151,8 +153,8 @@ export const sendProviderRequestEmail = async (form: any): Promise => { * @param member User model. * @param event Event model. */ -export const buildRSVPEmail = async (member: core.User.Model, event: core.Event.Model): Promise => { - return templates.RsvpTemplate(member, event) +export const buildRSVPEmail = async (member: core.User.Model, event: core.Event.Model, club: core.Club.Model): Promise => { + return templates.RsvpTemplate(member, event, club) } /** @@ -160,9 +162,9 @@ export const buildRSVPEmail = async (member: core.User.Model, event: core.Event. * @param member User model. * @param event Event model. */ -export const sendMemberUnRSVPEmail = async (member: core.User.Model, event: core.Event.Model): Promise => { +export const sendMemberUnRSVPEmail = async (member: core.User.Model, event: core.Event.Model, club: core.Club.Model): Promise => { const methodName = '[sendMemberUnRSVPEmail] -' - return templates.UnRsvpTemplate(member, event) + return templates.UnRsvpTemplate(member, event, club) } /** @@ -173,6 +175,6 @@ export const sendMemberUnRSVPEmail = async (member: core.User.Model, event: core * @param plusOne Boolean. * @param event Event model. */ -export const sendPublicRSVPEmail = async (event: core.Event.Model, form: any): Promise => { - return templates.PublicRsvpTemplate(event, form) +export const sendPublicRSVPEmail = async (event: core.Event.Model, form: any, club: core.Club.Model): Promise => { + return templates.PublicRsvpTemplate(event, form, club) } diff --git a/src/clubs/drivers-club/mailer/templates/index.ts b/src/clubs/drivers-club/mailer/templates/index.ts index 467313e..42087a6 100644 --- a/src/clubs/drivers-club/mailer/templates/index.ts +++ b/src/clubs/drivers-club/mailer/templates/index.ts @@ -7,25 +7,29 @@ import { Model } from 'mongoose'; //------------------------------------------------------ const welcomeEmailTemplate = (member: core.User.Model, club: core.Club.Model, password: string) => { + + const webURL = `https://${club.domain}.tryclubhub.com/` + const supportEmail = (club.name === core.Constants.Clubs.DRIVERS_CLUB) ? 'info@drivers.club' : 'info@otto.club' + const message = ` -

        Hi ${member.firstName} and welcome to Drivers Club! +

        Hi ${member.firstName} and welcome to ${club.name}! -

        Your new Drivers Club account has been created. This gives you access to the Drivers Club web and mobile apps!

        +

        Your new ${club.name} account has been created. This gives you access to the ${club.name} web and mobile apps!

        -

        Please follow the url: https://driversclub.tryclubhub.com/ to login. Your username is: ${member.email}, your temporary password is: ${password}.

        +

        Please follow the url: ${webURL} to login. Your username is: ${member.email}, your temporary password is: ${password}.

        To change your password, please use the "Forgot Password" link on the login screen. An email will then be sent to you with instructions on resetting the password.

        -

        Please send an email to info@drivers.club if you have any questions!

        +

        Please send an email to ${supportEmail} if you have any questions!

        Best,

        -

        The Drivers Club team.

        +

        The ${club.name} team.

        ` return message } -const membershipApplicationTemplate = (memberInfo: any) => { +const dcMembershipApplicationTemplate = (memberInfo: any, club: core.Club.Model) => { const message = `

        Hi there!

        @@ -76,12 +80,77 @@ const membershipApplicationTemplate = (memberInfo: any) => {

        Thanks,

        -

        Your friends at Drivers Club

        +

        Your friends at ${club.name}

        + ` + return message +} + +const ottoMembershipApplicationTemplate = (memberInfo: any, club: core.Club.Model) => { + + const fullName = `${memberInfo.firstName} ${memberInfo.middleName} ${memberInfo.lastName}` + + const message = ` +

        Hi there!

        + +

        A prospective member has completed the new member request form. Details below:

        + +

        Member Info

        +
          +
        • + ${bulletLine('Name:', fullName)} +
        • +
        • + ${bulletLine('Email', memberInfo.email)} +
        • +
        • + ${bulletLine('Address', memberInfo.address)} +
        • +
        • + ${bulletLine('Address', `${memberInfo.city} ${memberInfo.state.label} ${memberInfo.zip}`)} +
        • +
        • + ${bulletLine('Phone', memberInfo.phoneNumber)} +
        • +
        • + ${bulletLine('Occupation', memberInfo.occupation)} +
        • +
        • + ${bulletLine('Birthday', memberInfo.birthday)} +
        • +
        • + ${bulletLine('Gender', memberInfo.gender.label)} +
        • +
        • + ${bulletLine('Automotive Passion', memberInfo.automotivePassion)} +
        • +
        • + ${bulletLine('Referral', memberInfo.referral)} +
        • +
        • + ${bulletLine('Car Showcase', memberInfo.carShowcase)} +
        • +
        • + ${bulletLine('Hobbies', memberInfo.freeTime)} +
        • +
        • + ${bulletLine('Other Clubs', memberInfo.otherClubs)} +
        • +
        • + ${bulletLine('Membership Type', `${memberInfo.membershipType.label}`)} +
        • +
        • + ${bulletLine('Additional Information', `${memberInfo.other}`)} +
        • +
        + +

        Thanks,

        + +

        Your friends at ${club.name}

        ` return message } -const membershipInquiryTemplate = (memberInfo: any) => { +const membershipInquiryTemplate = (memberInfo: any, club: core.Club.Model) => { const message = `

        Hi there!

        @@ -102,24 +171,28 @@ const membershipInquiryTemplate = (memberInfo: any) => {

        Thanks,

        -

        Your friends at Drivers Club

        +

        Your friends at ${club.name}

        ` return message } -const membershipInquiryResponseTemplate = (memberFormInfo: any, url?: any) => { +const membershipInquiryResponseTemplate = (memberFormInfo: any, club: core.Club.Model, url?: any) => { + + const applicationURL = `https://${club.domain}.tryclubhub.com/forms/application` + const admin = (club.name === core.Constants.Clubs.DRIVERS_CLUB) ? 'Amanda Friedman' : 'Eli Kogan' + const message = `

        Dear ${memberFormInfo.firstName},

        -

        Thank you for contacting Drivers Club regarding ${memberFormInfo.membership.label} membership!

        +

        Thank you for contacting ${club.name} regarding ${memberFormInfo.membership.label} membership!

        We would like to learn more about your automotive passions.

        -

        Please click this link to begin the formal application process.

        +

        Please click this link to begin the formal application process.

        Sincerely,

        -

        Amanda Friedman

        +

        ${admin}

        General Manager

        ` return message @@ -129,12 +202,12 @@ const membershipInquiryResponseTemplate = (memberFormInfo: any, url?: any) => { // RSVP TEMPLATES //------------------------------------------------------ -const rsvpTemplate = (member: core.User.Model, event: core.Event.Model) => { - const fullName = `${member.firstName} ${member.lastName}` +const rsvpTemplate = (member: core.User.Model, event: core.Event.Model, club: core.Club.Model) => { + const fullName = `${member.firstName} ${member.lastName}` const message = `

        Hi there!

        -

        A Drivers Club member has RSVP'd to an event. Details below:

        +

        A Club member has RSVP'd to an event. Details below:

        Member Info

          @@ -161,12 +234,12 @@ const rsvpTemplate = (member: core.User.Model, event: core.Event.Model) => {

          Thanks,

          -

          Your friends at Drivers Club

          +

          Your friends at ${club.name}

          ` return message } -const unRsvpTemplate = (member: core.User.Model, event: core.Event.Model) => { +const unRsvpTemplate = (member: core.User.Model, event: core.Event.Model, club: core.Club.Model) => { // Format the members name. const fullName = `${member.firstName} ${member.lastName}` const eventPrice = (event.price) ? event.price.toString() : 'Free' @@ -174,7 +247,7 @@ const unRsvpTemplate = (member: core.User.Model, event: core.Event.Model) => { const message = `

          Hi there!

          -

          A Drivers Club member has cancelled their RSVP to an event. Details below:

          +

          A Club member has cancelled their RSVP to an event. Details below:

          Member Info

            @@ -204,12 +277,12 @@ const unRsvpTemplate = (member: core.User.Model, event: core.Event.Model) => {

            Thanks,

            -

            Your friends at Drivers Club

            +

            Your friends at ${club.name}

            ` return message } -const publicRsvpTemplate = (event: core.Event.Model, memberInfo: any) => { +const publicRsvpTemplate = (event: core.Event.Model, memberInfo: any, club: core.Club.Model) => { // Format the members name. const fullName = `${memberInfo.firstName} ${memberInfo.lastName}` const plusOneText = memberInfo.plusOne ? 'Yes' : 'No' @@ -242,13 +315,13 @@ const publicRsvpTemplate = (event: core.Event.Model, memberInfo: any) => { ${bulletLine('Price', eventPrice)}
          • - ${linkLine('Event', event.shortLink)} + ${linkLine('Event', event.shortLink, club)}

          Thanks,

          -

          Your friends at Drivers Club

          +

          Your friends at ${club.name}

          ` return message } @@ -257,7 +330,7 @@ const publicRsvpTemplate = (event: core.Event.Model, memberInfo: any) => { // SERVICE TEMPLATES //------------------------------------------------------ -const serviceRequestTemplate = (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation) => { +const serviceRequestTemplate = (member: core.User.Model, provider: core.Calendar.Model, event: core.Event.Model, reservation: core.Event.Reservation, club: core.Club.Model) => { // Format the members name. const fullName = `${member.firstName} ${member.lastName}` @@ -272,7 +345,7 @@ const serviceRequestTemplate = (member: core.User.Model, provider: core.Calendar const message = `

          Hi there!

          -

          A Drivers Club member has submitted a new service request. Details below:

          +

          A Club member has submitted a new service request. Details below:

          Provider Info

            @@ -315,16 +388,16 @@ const serviceRequestTemplate = (member: core.User.Model, provider: core.Calendar

            Thanks,

            -

            Your friends at Drivers Club

            +

            Your friends at ${club.name}

            ` return message } -const newProviderTemplate = (providerInfo: any) => { +const newProviderTemplate = (providerInfo: any, club: core.Club.Model) => { const message = `

            Hi there!

            -

            A member has submitted a request to add a new Drivers Club provider. Details below:

            +

            A member has submitted a request to add a new ${club.name} provider. Details below:

            Provider Info

              @@ -359,7 +432,7 @@ const newProviderTemplate = (providerInfo: any) => {

              Thanks,

              -

              Your friends at Drivers Club

              +

              Your friends at ${club.name}

              ` return message } @@ -372,8 +445,8 @@ const bulletLine = (boldText: string, text: string): string => { return `

              ${boldText}

              ${text}

              ` } -const linkLine = (boldText: string, shortLink: string): string => { - return `

              ${boldText}

              Event Link` +const linkLine = (boldText: string, shortLink: string, club: core.Club.Model): string => { + return `

              ${boldText}

              Event Link` } const regularText = (text: string): string => { @@ -384,7 +457,8 @@ export {rsvpTemplate as RsvpTemplate} export {publicRsvpTemplate as PublicRsvpTemplate} export {unRsvpTemplate as UnRsvpTemplate} export {serviceRequestTemplate as ServiceRequestTemplate} -export {membershipApplicationTemplate as MembershipApplicationTemplate} +export {dcMembershipApplicationTemplate as DcMembershipApplicationTemplate} +export {ottoMembershipApplicationTemplate as OttoMembershipApplicationTemplate} export {newProviderTemplate as NewProviderTemplate} export {welcomeEmailTemplate as WelcomeEmailTemplate} export {membershipInquiryTemplate as MembershipInquiryTemplate} diff --git a/src/clubs/otto/mailer/templates/index.ts b/src/clubs/otto/mailer/templates/index.ts new file mode 100644 index 0000000..2e6a111 --- /dev/null +++ b/src/clubs/otto/mailer/templates/index.ts @@ -0,0 +1,352 @@ +import * as Factory from 'factory' +import * as Faker from 'faker' +import { Event, Member, ServiceData, Service } from '../../firebase/types' +import { dateFromTimestamp, DateInterface } from '../../helpers/dateHelper' +import {NewMemberRegistrationForm, NewProviderInfo, ApplicationInformation, MemberInquiryForm, VehicleInfo} from '../../interfaces/firebase' +import { DRIVERS_CLUB_WEB_URL } from '../../constants' + +//------------------------------------------------------ +// NEW RSVP TEMPLATE +//------------------------------------------------------ + +const membershipInquiryTemplate = (memberInfo: MemberInquiryForm) => { + const message = ` +

              Hi there!

              +

              A prospective member has completed the membership inquiry form. Details below:

              +

              Member Info

              +
                +
              • + ${bulletLine('Name:', `${memberInfo.firstName} ${memberInfo.lastName}`)} +
              • +
              • + ${bulletLine('Email', memberInfo.email)} +
              • +
              • + ${bulletLine('Desired Membership', memberInfo.membership.label)} +
              • +
              +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const membershipInquiryResponseTemplate = (memberInfo: MemberInquiryForm) => { + const message = ` +

              Dear ${memberInfo.firstName},

              +

              Thank you for contacting Otto Car Club regarding ${memberInfo.membership} membership!

              +

              We would like to learn more about your automotive passions.

              +

              Please click this link to begin the formal application process.

              +

              Sincerely,

              +

              Amanda Friedman

              +

              General Manager

              + ` + return message +} + +const rsvpTemplate = (member: Member, event: Event) => { + const fullName = `${member.firstName} ${member.lastName}` + const message = ` +

              Hi there!

              +

              A Otto Car Club member has RSVP'd to an event. Details below:

              +

              Member Info

              +
                +
              • + ${bulletLine('Name:', fullName)} +
              • +
              • + ${bulletLine('Email:', member.email)} +
              • +
              • + ${bulletLine('Phone:', member.phoneNumber)} +
              • +
              +

              Event Info

              +
                +
              • + ${bulletLine('Event:', event.name)} +
              • +
              • + ${bulletLine('Price', event.price)} +
              • +
              • + ${bulletLine('ID', event.id)} +
              • +
              + +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const unRsvpTemplate = (member: Member, event: Event) => { + const fullName = `${member.firstName} ${member.lastName}` + const message = ` +

              Hi there!

              +

              A Otto Car Club member has cancelled their RSVP to an event. Details below:

              +

              Member Info

              +
                +
              • + ${bulletLine('Name:', fullName)} +
              • +
              • + ${bulletLine('Email:', member.email)} +
              • +
              • + ${bulletLine('Phone:', member.phoneNumber)} +
              • +
              +

              Event Info

              +
                +
              • + ${bulletLine('Event:', event.name)} +
              • +
              • + ${bulletLine('Price', event.price)} +
              • +
              • + ${bulletLine('ID', event.id)} +
              • +
              + +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const serviceRequestTemplate = (serviceData: ServiceData) => { + const fullName = `${serviceData.member.firstName} ${serviceData.member.lastName}` + const date: DateInterface = dateFromTimestamp(serviceData.service.date) + const message = ` +

              Hi there!

              +

              A Otto Car Club member has submitted a new service request. Details below:

              +

              Provider Info

              +
                +
              • + ${bulletLine('Name:', serviceData.provider.companyName)} +
              • +
              • + ${bulletLine('Email', serviceData.provider.email)} +
              • +
              • + ${bulletLine('Phone', serviceData.provider.phoneNumber)} +
              • +
              +

              Member Info

              +
                +
              • + ${bulletLine('Name:', fullName)} +
              • +
              • + ${bulletLine('Email', serviceData.member.email)} +
              • +
              • + ${bulletLine('Phone', serviceData.member.phoneNumber)} +
              • +
              +

              Service Info

              +
                +
              • + ${bulletLine('Vehicle:', serviceData.vehicle.model)} +
              • +
              • + ${bulletLine('Vin:', serviceData.vehicle.vin)} +
              • +
              • + ${bulletLine('Date', date.fullDate)} +
              • +
              • + ${bulletLine('Notes', serviceData.service.notes)} +
              • +
              + +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const membershipApplicationTemplate = (memberInfo: ApplicationInformation) => { + const message = ` +

              Hi there!

              +

              A prospective member has completed the new member request form. Details below:

              +

              Member Info

              +
                +
              • + ${bulletLine('Name:', `${memberInfo.firstName} ${memberInfo.lastName}`)} +
              • +
              • + ${bulletLine('Occupation', memberInfo.occupation)} +
              • +
              • + ${bulletLine('Date of birth', memberInfo.dob)} +
              • +
              • + ${bulletLine('Gender', memberInfo.gender)} +
              • +
              • + ${bulletLine('Address', `${memberInfo.city} ${memberInfo.state} ${memberInfo.zip}`)} +
              • +
              • + ${bulletLine('Email', memberInfo.email)} +
              • +
              • + ${bulletLine('Phone', memberInfo.phone)} +
              • +
              • + ${bulletLine('Referral', memberInfo.referral)} +
              • +
              • + ${bulletLine('Favorite automotive activity', memberInfo.activity)} +
              • +
              • + ${bulletLine('Membership type', memberInfo.membershipType)} +
              • +
              • + ${bulletLine('Member spends free time doing', memberInfo.freeTime)} +
              • +
              • + ${bulletLine('Additional memberships', `${memberInfo.otherMemberships}`)} +
              • +
              • + ${bulletLine('Additional member information', `${memberInfo.otherInfo}`)} +
              • +
              +
              + Vehicle List: + ${buildVehicleList(memberInfo.vehicles)} +
              +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const newProviderTemplate = (provider: NewProviderInfo) => { + const message = ` +

              Hi there!

              +

              A member has submitted a request to add a new Otto Car Club provider. Details below:

              +

              Provider Info

              +
                +
              • + ${bulletLine('Name:', provider.companyName)} +
              • +
              • + ${bulletLine('Contact', provider.contactName)} +
              • +
              • + ${bulletLine('Email',provider.email)} +
              • +
              • + ${bulletLine('Phone', provider.phoneNumber)} +
              • +
              • + ${bulletLine('Street', provider.street)} +
              • +
              • + ${bulletLine('City', provider.city)} +
              • +
              • + ${bulletLine('State', provider.state)} +
              • +
              • + ${bulletLine('Zip', provider.zip)} +
              • +
              +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const welcomeEmailTemplate = (member: Member, password: string) => { + const message = ` +

              Hi ${member.firstName} and welcome to Otto Car Club! +

              Your new Otto Car Club account has been created. This gives you access to the Otto Car Club web and mobile apps!

              +

              Please follow the url: ${DRIVERS_CLUB_WEB_URL} to login. Your username is: ${member.email}, your temporary password is: ${password}.

              + +

              To change your password, please use the "Forgot Password" link on the login screen. An email will then be sent to you with instructions on resetting the password.

              +

              Please send an email to info@ottocarclub.club if you have any questions!

              +

              Best,

              +

              The Otto Car Club team.

              + ` + return message +} + +const publicRsvpTemplate = (memberName: string, memberEmail: string, plusOne: boolean, event: any) => { + const plusOneText = plusOne ? 'Yes' : 'No' + const message = ` +

              Hi there!

              +

              A public person has RSVP'd to an event. Details below:

              +

              Member Info

              +
                +
              • + ${bulletLine('Name:', memberName)} +
              • +
              • + ${bulletLine('Email:', memberEmail)} +
              • +
              • + ${bulletLine('Plus One:', plusOneText)} +
              • +
              +

              Event Info

              +
                +
              • + ${bulletLine('Event:', event.name)} +
              • +
              • + ${bulletLine('Price', event.price)} +
              • +
              • + ${linkLine('Event', event.id)} +
              • +
              + +

              Thanks,

              +

              Your friends at Otto Car Club

              + ` + return message +} + +const bulletLine = (boldText: string, text: string): string => { + return `

              ${boldText}

              ${text}

              ` +} + +const linkLine = (boldText: string, id: string): string => { + return `

              ${boldText}

              Event Link` +} + +const regularText = (text: string): string => { + return `

              ${text}

              ` +} + +const buildVehicleList = (vehicleList: VehicleInfo[]) => { + if (!vehicleList) { + return + } + return vehicleList.map((vehicle: VehicleInfo) => { + return ( + ` +
                +
              • ${bulletLine('Year', vehicle.year)}
              • +
              • ${bulletLine('Model', vehicle.model)}
              • +
              • ${bulletLine('Make', vehicle.make)}
              • +
              • ${bulletLine('Notes', vehicle.notes)}
              • +
              + ` + ) + }) +} + +export {rsvpTemplate as RsvpTemplate} +export {publicRsvpTemplate as PublicRsvpTemplate} +export {unRsvpTemplate as UnRsvpTemplate} +export {serviceRequestTemplate as ServiceRequestTemplate} +export {membershipApplicationTemplate as MembershipApplicationTemplate} +export {newProviderTemplate as NewProviderTemplate} +export {welcomeEmailTemplate as WelcomeEmailTemplate} +export {membershipInquiryTemplate as MembershipInquiryTemplate} +export {membershipInquiryResponseTemplate as MembershipInquiryResponseTemplate} \ No newline at end of file From 828a3de7d347de21de352c70fde74e49dc755dcf Mon Sep 17 00:00:00 2001 From: sgruse Date: Mon, 25 Mar 2019 14:24:45 -0700 Subject: [PATCH 2/3] Added otto form logic --- .../mailer/index.d.ts | 0 .../{drivers-club => dc-otto}/mailer/index.js | 0 .../mailer/templates/index.d.ts | 0 .../mailer/templates/index.js | 0 dist/index.d.ts | 2 +- dist/index.js | 2 +- .../{drivers-club => dc-otto}/mailer/index.ts | 4 +- .../mailer/templates/index.ts | 0 src/clubs/otto/mailer/templates/index.ts | 352 ------------------ src/index.ts | 2 +- 10 files changed, 5 insertions(+), 357 deletions(-) rename dist/clubs/{drivers-club => dc-otto}/mailer/index.d.ts (100%) rename dist/clubs/{drivers-club => dc-otto}/mailer/index.js (100%) rename dist/clubs/{drivers-club => dc-otto}/mailer/templates/index.d.ts (100%) rename dist/clubs/{drivers-club => dc-otto}/mailer/templates/index.js (100%) rename src/clubs/{drivers-club => dc-otto}/mailer/index.ts (97%) rename src/clubs/{drivers-club => dc-otto}/mailer/templates/index.ts (100%) delete mode 100644 src/clubs/otto/mailer/templates/index.ts diff --git a/dist/clubs/drivers-club/mailer/index.d.ts b/dist/clubs/dc-otto/mailer/index.d.ts similarity index 100% rename from dist/clubs/drivers-club/mailer/index.d.ts rename to dist/clubs/dc-otto/mailer/index.d.ts diff --git a/dist/clubs/drivers-club/mailer/index.js b/dist/clubs/dc-otto/mailer/index.js similarity index 100% rename from dist/clubs/drivers-club/mailer/index.js rename to dist/clubs/dc-otto/mailer/index.js diff --git a/dist/clubs/drivers-club/mailer/templates/index.d.ts b/dist/clubs/dc-otto/mailer/templates/index.d.ts similarity index 100% rename from dist/clubs/drivers-club/mailer/templates/index.d.ts rename to dist/clubs/dc-otto/mailer/templates/index.d.ts diff --git a/dist/clubs/drivers-club/mailer/templates/index.js b/dist/clubs/dc-otto/mailer/templates/index.js similarity index 100% rename from dist/clubs/drivers-club/mailer/templates/index.js rename to dist/clubs/dc-otto/mailer/templates/index.js diff --git a/dist/index.d.ts b/dist/index.d.ts index 34a92aa..f692647 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,5 +1,5 @@ import * as core from 'club-hub-core'; -import * as DCEmails from './clubs/drivers-club/mailer/index'; +import * as DCEmails from './clubs/dc-otto/mailer/index'; export { DCEmails }; export declare const CompileGenericEmail: (content: string, club: core.Club.Model) => Promise; export declare const CompileEventEmail: (event: core.Event.Model, club: core.Club.Model, link: string) => Promise; diff --git a/dist/index.js b/dist/index.js index 5c0af48..449b8a5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const Handlebars = require("handlebars"); -const DCEmails = require("./clubs/drivers-club/mailer/index"); +const DCEmails = require("./clubs/dc-otto/mailer/index"); exports.DCEmails = DCEmails; const transform = require("./transform/transform"); exports.CompileGenericEmail = (content, club) => { diff --git a/src/clubs/drivers-club/mailer/index.ts b/src/clubs/dc-otto/mailer/index.ts similarity index 97% rename from src/clubs/drivers-club/mailer/index.ts rename to src/clubs/dc-otto/mailer/index.ts index 072700f..9d1b48c 100644 --- a/src/clubs/drivers-club/mailer/index.ts +++ b/src/clubs/dc-otto/mailer/index.ts @@ -96,7 +96,7 @@ export const buildWelcomeEmail = async (member: core.User.Model, club: core.Club } /** - * Sends an email to the drivers club admin with the new member application info. + * Sends an email to the club admin with the new member application info. * @param memberInfo Form information. */ export const sendMembershipApplicationEmail = async (memberInfo: any, club: core.Club.Model): Promise => { @@ -106,7 +106,7 @@ export const sendMembershipApplicationEmail = async (memberInfo: any, club: core } /** - * Sends an email to the Drivers Club admin with membership inquiry information. + * Sends an email to the club admin with membership inquiry information. * @param memberInfo Form information. */ export const sendMembershipInquiryEmail = async (memberInfo: any, club: core.Club.Model): Promise => { diff --git a/src/clubs/drivers-club/mailer/templates/index.ts b/src/clubs/dc-otto/mailer/templates/index.ts similarity index 100% rename from src/clubs/drivers-club/mailer/templates/index.ts rename to src/clubs/dc-otto/mailer/templates/index.ts diff --git a/src/clubs/otto/mailer/templates/index.ts b/src/clubs/otto/mailer/templates/index.ts deleted file mode 100644 index 2e6a111..0000000 --- a/src/clubs/otto/mailer/templates/index.ts +++ /dev/null @@ -1,352 +0,0 @@ -import * as Factory from 'factory' -import * as Faker from 'faker' -import { Event, Member, ServiceData, Service } from '../../firebase/types' -import { dateFromTimestamp, DateInterface } from '../../helpers/dateHelper' -import {NewMemberRegistrationForm, NewProviderInfo, ApplicationInformation, MemberInquiryForm, VehicleInfo} from '../../interfaces/firebase' -import { DRIVERS_CLUB_WEB_URL } from '../../constants' - -//------------------------------------------------------ -// NEW RSVP TEMPLATE -//------------------------------------------------------ - -const membershipInquiryTemplate = (memberInfo: MemberInquiryForm) => { - const message = ` -

              Hi there!

              -

              A prospective member has completed the membership inquiry form. Details below:

              -

              Member Info

              -
                -
              • - ${bulletLine('Name:', `${memberInfo.firstName} ${memberInfo.lastName}`)} -
              • -
              • - ${bulletLine('Email', memberInfo.email)} -
              • -
              • - ${bulletLine('Desired Membership', memberInfo.membership.label)} -
              • -
              -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const membershipInquiryResponseTemplate = (memberInfo: MemberInquiryForm) => { - const message = ` -

              Dear ${memberInfo.firstName},

              -

              Thank you for contacting Otto Car Club regarding ${memberInfo.membership} membership!

              -

              We would like to learn more about your automotive passions.

              -

              Please click this link to begin the formal application process.

              -

              Sincerely,

              -

              Amanda Friedman

              -

              General Manager

              - ` - return message -} - -const rsvpTemplate = (member: Member, event: Event) => { - const fullName = `${member.firstName} ${member.lastName}` - const message = ` -

              Hi there!

              -

              A Otto Car Club member has RSVP'd to an event. Details below:

              -

              Member Info

              -
                -
              • - ${bulletLine('Name:', fullName)} -
              • -
              • - ${bulletLine('Email:', member.email)} -
              • -
              • - ${bulletLine('Phone:', member.phoneNumber)} -
              • -
              -

              Event Info

              -
                -
              • - ${bulletLine('Event:', event.name)} -
              • -
              • - ${bulletLine('Price', event.price)} -
              • -
              • - ${bulletLine('ID', event.id)} -
              • -
              - -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const unRsvpTemplate = (member: Member, event: Event) => { - const fullName = `${member.firstName} ${member.lastName}` - const message = ` -

              Hi there!

              -

              A Otto Car Club member has cancelled their RSVP to an event. Details below:

              -

              Member Info

              -
                -
              • - ${bulletLine('Name:', fullName)} -
              • -
              • - ${bulletLine('Email:', member.email)} -
              • -
              • - ${bulletLine('Phone:', member.phoneNumber)} -
              • -
              -

              Event Info

              -
                -
              • - ${bulletLine('Event:', event.name)} -
              • -
              • - ${bulletLine('Price', event.price)} -
              • -
              • - ${bulletLine('ID', event.id)} -
              • -
              - -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const serviceRequestTemplate = (serviceData: ServiceData) => { - const fullName = `${serviceData.member.firstName} ${serviceData.member.lastName}` - const date: DateInterface = dateFromTimestamp(serviceData.service.date) - const message = ` -

              Hi there!

              -

              A Otto Car Club member has submitted a new service request. Details below:

              -

              Provider Info

              -
                -
              • - ${bulletLine('Name:', serviceData.provider.companyName)} -
              • -
              • - ${bulletLine('Email', serviceData.provider.email)} -
              • -
              • - ${bulletLine('Phone', serviceData.provider.phoneNumber)} -
              • -
              -

              Member Info

              -
                -
              • - ${bulletLine('Name:', fullName)} -
              • -
              • - ${bulletLine('Email', serviceData.member.email)} -
              • -
              • - ${bulletLine('Phone', serviceData.member.phoneNumber)} -
              • -
              -

              Service Info

              -
                -
              • - ${bulletLine('Vehicle:', serviceData.vehicle.model)} -
              • -
              • - ${bulletLine('Vin:', serviceData.vehicle.vin)} -
              • -
              • - ${bulletLine('Date', date.fullDate)} -
              • -
              • - ${bulletLine('Notes', serviceData.service.notes)} -
              • -
              - -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const membershipApplicationTemplate = (memberInfo: ApplicationInformation) => { - const message = ` -

              Hi there!

              -

              A prospective member has completed the new member request form. Details below:

              -

              Member Info

              -
                -
              • - ${bulletLine('Name:', `${memberInfo.firstName} ${memberInfo.lastName}`)} -
              • -
              • - ${bulletLine('Occupation', memberInfo.occupation)} -
              • -
              • - ${bulletLine('Date of birth', memberInfo.dob)} -
              • -
              • - ${bulletLine('Gender', memberInfo.gender)} -
              • -
              • - ${bulletLine('Address', `${memberInfo.city} ${memberInfo.state} ${memberInfo.zip}`)} -
              • -
              • - ${bulletLine('Email', memberInfo.email)} -
              • -
              • - ${bulletLine('Phone', memberInfo.phone)} -
              • -
              • - ${bulletLine('Referral', memberInfo.referral)} -
              • -
              • - ${bulletLine('Favorite automotive activity', memberInfo.activity)} -
              • -
              • - ${bulletLine('Membership type', memberInfo.membershipType)} -
              • -
              • - ${bulletLine('Member spends free time doing', memberInfo.freeTime)} -
              • -
              • - ${bulletLine('Additional memberships', `${memberInfo.otherMemberships}`)} -
              • -
              • - ${bulletLine('Additional member information', `${memberInfo.otherInfo}`)} -
              • -
              -
              - Vehicle List: - ${buildVehicleList(memberInfo.vehicles)} -
              -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const newProviderTemplate = (provider: NewProviderInfo) => { - const message = ` -

              Hi there!

              -

              A member has submitted a request to add a new Otto Car Club provider. Details below:

              -

              Provider Info

              -
                -
              • - ${bulletLine('Name:', provider.companyName)} -
              • -
              • - ${bulletLine('Contact', provider.contactName)} -
              • -
              • - ${bulletLine('Email',provider.email)} -
              • -
              • - ${bulletLine('Phone', provider.phoneNumber)} -
              • -
              • - ${bulletLine('Street', provider.street)} -
              • -
              • - ${bulletLine('City', provider.city)} -
              • -
              • - ${bulletLine('State', provider.state)} -
              • -
              • - ${bulletLine('Zip', provider.zip)} -
              • -
              -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const welcomeEmailTemplate = (member: Member, password: string) => { - const message = ` -

              Hi ${member.firstName} and welcome to Otto Car Club! -

              Your new Otto Car Club account has been created. This gives you access to the Otto Car Club web and mobile apps!

              -

              Please follow the url: ${DRIVERS_CLUB_WEB_URL} to login. Your username is: ${member.email}, your temporary password is: ${password}.

              - -

              To change your password, please use the "Forgot Password" link on the login screen. An email will then be sent to you with instructions on resetting the password.

              -

              Please send an email to info@ottocarclub.club if you have any questions!

              -

              Best,

              -

              The Otto Car Club team.

              - ` - return message -} - -const publicRsvpTemplate = (memberName: string, memberEmail: string, plusOne: boolean, event: any) => { - const plusOneText = plusOne ? 'Yes' : 'No' - const message = ` -

              Hi there!

              -

              A public person has RSVP'd to an event. Details below:

              -

              Member Info

              -
                -
              • - ${bulletLine('Name:', memberName)} -
              • -
              • - ${bulletLine('Email:', memberEmail)} -
              • -
              • - ${bulletLine('Plus One:', plusOneText)} -
              • -
              -

              Event Info

              -
                -
              • - ${bulletLine('Event:', event.name)} -
              • -
              • - ${bulletLine('Price', event.price)} -
              • -
              • - ${linkLine('Event', event.id)} -
              • -
              - -

              Thanks,

              -

              Your friends at Otto Car Club

              - ` - return message -} - -const bulletLine = (boldText: string, text: string): string => { - return `

              ${boldText}

              ${text}

              ` -} - -const linkLine = (boldText: string, id: string): string => { - return `

              ${boldText}

              Event Link` -} - -const regularText = (text: string): string => { - return `

              ${text}

              ` -} - -const buildVehicleList = (vehicleList: VehicleInfo[]) => { - if (!vehicleList) { - return - } - return vehicleList.map((vehicle: VehicleInfo) => { - return ( - ` -
                -
              • ${bulletLine('Year', vehicle.year)}
              • -
              • ${bulletLine('Model', vehicle.model)}
              • -
              • ${bulletLine('Make', vehicle.make)}
              • -
              • ${bulletLine('Notes', vehicle.notes)}
              • -
              - ` - ) - }) -} - -export {rsvpTemplate as RsvpTemplate} -export {publicRsvpTemplate as PublicRsvpTemplate} -export {unRsvpTemplate as UnRsvpTemplate} -export {serviceRequestTemplate as ServiceRequestTemplate} -export {membershipApplicationTemplate as MembershipApplicationTemplate} -export {newProviderTemplate as NewProviderTemplate} -export {welcomeEmailTemplate as WelcomeEmailTemplate} -export {membershipInquiryTemplate as MembershipInquiryTemplate} -export {membershipInquiryResponseTemplate as MembershipInquiryResponseTemplate} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 16bfda4..8c59d46 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import * as Handlebars from 'handlebars' import * as core from 'club-hub-core' // Drivers Club Specific Emails. -import * as DCEmails from './clubs/drivers-club/mailer/index' +import * as DCEmails from './clubs/dc-otto/mailer/index' export { DCEmails } // Transform From 63071f7bd1e40d871a683ed7160c2f62a7af0653 Mon Sep 17 00:00:00 2001 From: sgruse Date: Mon, 25 Mar 2019 14:34:01 -0700 Subject: [PATCH 3/3] Updated export --- dist/index.d.ts | 4 ++-- dist/index.js | 4 ++-- src/index.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index f692647..ea37dc0 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,6 @@ import * as core from 'club-hub-core'; -import * as DCEmails from './clubs/dc-otto/mailer/index'; -export { DCEmails }; +import * as CarClub from './clubs/dc-otto/mailer/index'; +export { CarClub }; export declare const CompileGenericEmail: (content: string, club: core.Club.Model) => Promise; export declare const CompileEventEmail: (event: core.Event.Model, club: core.Club.Model, link: string) => Promise; export declare const CompilePostEmail: (post: core.Post.Model, club: core.Club.Model, link: string) => Promise; diff --git a/dist/index.js b/dist/index.js index 449b8a5..40544d2 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,8 +2,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const Handlebars = require("handlebars"); -const DCEmails = require("./clubs/dc-otto/mailer/index"); -exports.DCEmails = DCEmails; +const CarClub = require("./clubs/dc-otto/mailer/index"); +exports.CarClub = CarClub; const transform = require("./transform/transform"); exports.CompileGenericEmail = (content, club) => { const eventInfo = transform.BuildGenericContent(content, club); diff --git a/src/index.ts b/src/index.ts index 8c59d46..5761595 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,8 +4,8 @@ import * as Handlebars from 'handlebars' import * as core from 'club-hub-core' // Drivers Club Specific Emails. -import * as DCEmails from './clubs/dc-otto/mailer/index' -export { DCEmails } +import * as CarClub from './clubs/dc-otto/mailer/index' +export { CarClub } // Transform import * as transform from './transform/transform'