@awell-health/awell-extensions 1.0.222 → 1.0.223

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. package/dist/extensions/markdown.json +1 -1
  2. package/dist/extensions/twilio/index.js +2 -1
  3. package/dist/extensions/twilio/index.js.map +1 -1
  4. package/dist/extensions/twilio/v2/actions/index.d.ts +1 -0
  5. package/dist/extensions/twilio/v2/actions/index.js +3 -1
  6. package/dist/extensions/twilio/v2/actions/index.js.map +1 -1
  7. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/datapoints.d.ts +14 -0
  8. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/datapoints.js +19 -0
  9. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/datapoints.js.map +1 -0
  10. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/fields.d.ts +51 -0
  11. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/fields.js +45 -0
  12. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/fields.js.map +1 -0
  13. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/index.d.ts +2 -0
  14. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/index.js +9 -0
  15. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/index.js.map +1 -0
  16. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/index.d.ts +1 -0
  17. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/index.js +6 -0
  18. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/index.js.map +1 -0
  19. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.d.ts +4 -0
  20. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.js +106 -0
  21. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.js.map +1 -0
  22. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.test.d.ts +1 -0
  23. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.test.js +198 -0
  24. package/dist/extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.test.js.map +1 -0
  25. package/dist/src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.d.ts +8 -7
  26. package/dist/src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.js +32 -19
  27. package/dist/src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.js.map +1 -1
  28. package/dist/src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.test.js +83 -21
  29. package/dist/src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.test.js.map +1 -1
  30. package/dist/src/utils/getNextDateWithinBusinessHours/index.d.ts +1 -1
  31. package/dist/src/utils/getNextDateWithinBusinessHours/index.js +2 -1
  32. package/dist/src/utils/getNextDateWithinBusinessHours/index.js.map +1 -1
  33. package/package.json +2 -1
@@ -120,7 +120,7 @@
120
120
  "changelog": "# Transform changelog\n\n## March 2024\n\n- Added \"Generate dynamic URL\" action\n\n## January 2024\n\n- Added \"Parse number to text with dictionary\" action"
121
121
  },
122
122
  "twilio": {
123
- "readme": "---\ntitle: Twilio\ndescription: Twilio is a customer engagement platform used by hundreds of thousands of businesses and more than ten million developers worldwide to build unique, personalized experiences for their customers.\n---\n# Twilio\n\nTwilio is a customer engagement platform used by hundreds of thousands of businesses and more than ten million developers worldwide to build unique, personalized experiences for their customers.\n\nThey are known for democratizing channels like voice, text, chat, video, and email through APIs, making it easy for every organization to build meaningful interactions with customers on the channels they prefer.\n\n## Extension settings\n\nIn order to set up this extension, you will need:\n\n1. A Twilio API key or auth token which can be found in the Twilio console.\n2. Your account SID which can be found in the Twilio console.\n3. A phone number to send the message from. This must be a Twilio phone number that you own.\n\n## Custom Actions\n\n### Send SMS\n\nSend an SMS with Twilio to a recipient of your liking.\n\n### Get messages\n\nGet a list of text messages matching the given criteria. Only the last 50 messages are returned.\n",
123
+ "readme": "---\ntitle: Twilio\ndescription: Twilio is a customer engagement platform used by hundreds of thousands of businesses and more than ten million developers worldwide to build unique, personalized experiences for their customers.\n---\n# Twilio\n\nTwilio is a customer engagement platform used by hundreds of thousands of businesses and more than ten million developers worldwide to build unique, personalized experiences for their customers.\n\nThey are known for democratizing channels like voice, text, chat, video, and email through APIs, making it easy for every organization to build meaningful interactions with customers on the channels they prefer.\n\n## Extension settings\n\nIn order to set up this extension, you will need:\n\n1. A Twilio API key or auth token which can be found in the Twilio console.\n2. Your account SID which can be found in the Twilio console.\n3. A phone number to send the message from. This must be a Twilio phone number that you own.\n\n## Custom Actions\n\n### Send SMS\n\nSend an SMS with Twilio to a recipient of your liking.\n\n### Get messages\n\nGet a list of text messages matching the given criteria. Only the last 50 messages are returned.\n\n## Send SMS during working hours\n\nThis action allows for the scheduling of SMS messages to be sent within the \"daily operational hours\" of 9 AM to 5 PM. It ensures that text messages are dispatched at appropriate times during the day, avoiding early morning or late-night disturbances to recipients.\n\n**Here's how it works:**\n\n- If the action is activate during business hours (9 AM to 5 PM), the SMS is sent immediately.\n- If activated before 9 AM, the SMS is scheduled to be sent at 9 AM on the same day.\n- If activated after 5 PM, the SMS is scheduled to be sent at 9 AM the following day.\n\nThis setup ensures that all messages reach your respondents during reasonable daytime hours, enhancing the likelihood of a timely and considerate communication. It's important to mention that messages will still be dispatched over the weekend, but they will adhere to the \"business hours\" schedule of 9 AM to 5 PM.\n\nNote that scheduling messages with Twilio is only possible if you send text messages using a MessagingServiceSid.\n\n\n\n\n\n\n",
124
124
  "changelog": "# Twilio changelog\n\n## v2 2024-02-22\n\n1. Add capability to search for messages using all the allowed filters provided by Twilio API. Check here: https://www.twilio.com/docs/messaging/api/message-resource#read-multiple-message-resources\n\n## v2 2023-06-23\n\nFull description: https://github.com/awell-health/awell-extensions/issues/157\n\n1. \"Send SMS\" action\n 1. Change label from \"Send SMS\" to \"Send SMS (with from number)\"\n 2. Throw error when \"From\" number in both settings and in fields is not provided\n2. Add new action \"Send SMS (with Messaging Service)\"\n\n## v2\n\nCompared to v1 (pre-beta release), the extension only has one custom action \"Send SMS\" instead of two. The Custom Action allows for:\n\n1. Sending a text message to a recipient (phone number) stored in a data point, including patient profile data points.\n2. Sending a text message to a fixed recipient (phone number).\n"
125
125
  },
126
126
  "wellinks-public": {
@@ -16,7 +16,8 @@ exports.Twilio = {
16
16
  actions: {
17
17
  sendSms: actions_1.sendSms,
18
18
  sendSmsWithMessagingService: actions_1.sendSmsWithMessagingService,
19
- getMessages: actions_1.getMessages
19
+ getMessages: actions_1.getMessages,
20
+ sendSmsDuringBusinessHours: actions_1.sendSmsDuringBusinessHours,
20
21
  },
21
22
  settings: settings_1.settings,
22
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../extensions/twilio/index.ts"],"names":[],"mappings":";;;AACA,mEAAoE;AACpE,0CAAgF;AAChF,yCAAqC;AAExB,QAAA,MAAM,GAAc;IAC/B,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,0DAA0D;IACpE,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,0BAAQ,CAAC,aAAa;IAChC,MAAM,EAAE;QACN,UAAU,EAAE,4BAAU,CAAC,KAAK;KAC7B;IACD,OAAO,EAAE;QACP,OAAO,EAAP,iBAAO;QACP,2BAA2B,EAA3B,qCAA2B;QAC3B,WAAW,EAAX,qBAAW;KACZ;IACD,QAAQ,EAAR,mBAAQ;CACT,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../extensions/twilio/index.ts"],"names":[],"mappings":";;;AACA,mEAAoE;AACpE,0CAKqB;AACrB,yCAAqC;AAExB,QAAA,MAAM,GAAc;IAC/B,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,0DAA0D;IACpE,WAAW,EAAE,sDAAsD;IACnE,QAAQ,EAAE,0BAAQ,CAAC,aAAa;IAChC,MAAM,EAAE;QACN,UAAU,EAAE,4BAAU,CAAC,KAAK;KAC7B;IACD,OAAO,EAAE;QACP,OAAO,EAAP,iBAAO;QACP,2BAA2B,EAA3B,qCAA2B;QAC3B,WAAW,EAAX,qBAAW;QACX,0BAA0B,EAA1B,oCAA0B;KAC3B;IACD,QAAQ,EAAR,mBAAQ;CACT,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export { sendSms } from './sendSms';
2
2
  export { sendSmsWithMessagingService } from './sendSmsWithMessagingSid';
3
3
  export { getMessages } from './getMessages';
4
+ export { sendSmsDuringBusinessHours } from './sendSmsDuringBusinessHours';
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMessages = exports.sendSmsWithMessagingService = exports.sendSms = void 0;
3
+ exports.sendSmsDuringBusinessHours = exports.getMessages = exports.sendSmsWithMessagingService = exports.sendSms = void 0;
4
4
  var sendSms_1 = require("./sendSms");
5
5
  Object.defineProperty(exports, "sendSms", { enumerable: true, get: function () { return sendSms_1.sendSms; } });
6
6
  var sendSmsWithMessagingSid_1 = require("./sendSmsWithMessagingSid");
7
7
  Object.defineProperty(exports, "sendSmsWithMessagingService", { enumerable: true, get: function () { return sendSmsWithMessagingSid_1.sendSmsWithMessagingService; } });
8
8
  var getMessages_1 = require("./getMessages");
9
9
  Object.defineProperty(exports, "getMessages", { enumerable: true, get: function () { return getMessages_1.getMessages; } });
10
+ var sendSmsDuringBusinessHours_1 = require("./sendSmsDuringBusinessHours");
11
+ Object.defineProperty(exports, "sendSmsDuringBusinessHours", { enumerable: true, get: function () { return sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours; } });
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../extensions/twilio/v2/actions/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmC;AAA1B,kGAAA,OAAO,OAAA;AAChB,qEAAuE;AAA9D,sIAAA,2BAA2B,OAAA;AACpC,6CAA2C;AAAlC,0GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../extensions/twilio/v2/actions/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmC;AAA1B,kGAAA,OAAO,OAAA;AAChB,qEAAuE;AAA9D,sIAAA,2BAA2B,OAAA;AACpC,6CAA2C;AAAlC,0GAAA,WAAW,OAAA;AACpB,2EAAyE;AAAhE,wIAAA,0BAA0B,OAAA"}
@@ -0,0 +1,14 @@
1
+ export declare const dataPoints: {
2
+ messageSid: {
3
+ key: string;
4
+ valueType: "string";
5
+ };
6
+ scheduled: {
7
+ key: string;
8
+ valueType: "boolean";
9
+ };
10
+ sendAt: {
11
+ key: string;
12
+ valueType: "date";
13
+ };
14
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dataPoints = void 0;
4
+ exports.dataPoints = {
5
+ messageSid: {
6
+ // unique string to identify the Message resource, can be used to cancel the message if needed
7
+ key: 'messageSid',
8
+ valueType: 'string',
9
+ },
10
+ scheduled: {
11
+ key: 'scheduled',
12
+ valueType: 'boolean',
13
+ },
14
+ sendAt: {
15
+ key: 'sendAt',
16
+ valueType: 'date',
17
+ },
18
+ };
19
+ //# sourceMappingURL=datapoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datapoints.js","sourceRoot":"","sources":["../../../../../../../extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/datapoints.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAG;IACxB,UAAU,EAAE;QACV,8FAA8F;QAC9F,GAAG,EAAE,YAAY;QACjB,SAAS,EAAE,QAAQ;KACpB;IACD,SAAS,EAAE;QACT,GAAG,EAAE,WAAW;QAChB,SAAS,EAAE,SAAS;KACrB;IACD,MAAM,EAAE;QACN,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,MAAM;KAClB;CAC4C,CAAA"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { FieldType, StringType } from '@awell-health/extensions-core';
3
+ export declare const fields: {
4
+ messagingServiceSid: {
5
+ label: string;
6
+ id: string;
7
+ type: FieldType.STRING;
8
+ required: false;
9
+ description: string;
10
+ };
11
+ recipient: {
12
+ id: string;
13
+ label: string;
14
+ type: FieldType.STRING;
15
+ stringType: StringType.PHONE;
16
+ description: string;
17
+ required: true;
18
+ };
19
+ message: {
20
+ id: string;
21
+ label: string;
22
+ description: string;
23
+ type: FieldType.TEXT;
24
+ required: true;
25
+ };
26
+ timeZone: {
27
+ id: string;
28
+ label: string;
29
+ description: string;
30
+ type: FieldType.TEXT;
31
+ required: false;
32
+ };
33
+ };
34
+ export declare const FieldsValidationSchema: z.ZodObject<{
35
+ recipient: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, import("libphonenumber-js").PhoneNumber | import("libphonenumber-js").ParseError, string>, import("libphonenumber-js").PhoneNumber | import("libphonenumber-js").ParseError, string>, import("libphonenumber-js").E164Number, string>;
36
+ messagingServiceSid: z.ZodOptional<z.ZodString>;
37
+ message: z.ZodString;
38
+ timeZone: z.ZodOptional<z.ZodString>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ message: string;
41
+ recipient: string & {
42
+ __tag?: "E164Number" | undefined;
43
+ };
44
+ messagingServiceSid?: string | undefined;
45
+ timeZone?: string | undefined;
46
+ }, {
47
+ message: string;
48
+ recipient: string;
49
+ messagingServiceSid?: string | undefined;
50
+ timeZone?: string | undefined;
51
+ }>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldsValidationSchema = exports.fields = void 0;
4
+ const zod_1 = require("zod");
5
+ const extensions_core_1 = require("@awell-health/extensions-core");
6
+ const extensions_core_2 = require("@awell-health/extensions-core");
7
+ const validation_1 = require("../../../../common/validation");
8
+ exports.fields = {
9
+ messagingServiceSid: {
10
+ label: 'Messaging Service SID',
11
+ id: 'messagingServiceSid',
12
+ type: extensions_core_2.FieldType.STRING,
13
+ required: false,
14
+ description: 'The SID of the Messaging Service you want to associate with the Message. If left blank, the SID specified in the settings will be used.',
15
+ },
16
+ recipient: {
17
+ id: 'recipient',
18
+ label: '"To" phone number',
19
+ type: extensions_core_2.FieldType.STRING,
20
+ stringType: extensions_core_2.StringType.PHONE,
21
+ description: 'The phone number you would like to send the text message to.',
22
+ required: true,
23
+ },
24
+ message: {
25
+ id: 'message',
26
+ label: 'Message',
27
+ description: 'The message you would like to send.',
28
+ type: extensions_core_2.FieldType.TEXT,
29
+ required: true,
30
+ },
31
+ timeZone: {
32
+ id: 'timeZone',
33
+ label: 'Timezone',
34
+ description: 'Specify the IANA time zone to determine if the current time (in UTC) falls within business hours in your timezone. The default time zone used for this check is UTC.',
35
+ type: extensions_core_2.FieldType.TEXT,
36
+ required: false,
37
+ },
38
+ };
39
+ exports.FieldsValidationSchema = zod_1.z.object({
40
+ recipient: extensions_core_1.E164PhoneValidationSchema,
41
+ messagingServiceSid: zod_1.z.string().optional(),
42
+ message: validation_1.MessageValidationSchema,
43
+ timeZone: zod_1.z.string().optional(),
44
+ });
45
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../../../../../extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/fields.ts"],"names":[],"mappings":";;;AAAA,6BAAwC;AACxC,mEAAyE;AACzE,mEAIsC;AACtC,8DAAuE;AAE1D,QAAA,MAAM,GAAG;IACpB,mBAAmB,EAAE;QACnB,KAAK,EAAE,uBAAuB;QAC9B,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,2BAAS,CAAC,MAAM;QACtB,QAAQ,EAAE,KAAK;QACf,WAAW,EACT,yIAAyI;KAC5I;IACD,SAAS,EAAE;QACT,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,2BAAS,CAAC,MAAM;QACtB,UAAU,EAAE,4BAAU,CAAC,KAAK;QAC5B,WAAW,EAAE,8DAA8D;QAC3E,QAAQ,EAAE,IAAI;KACf;IACD,OAAO,EAAE;QACP,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,qCAAqC;QAClD,IAAI,EAAE,2BAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,IAAI;KACf;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EACT,sKAAsK;QACxK,IAAI,EAAE,2BAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,KAAK;KAChB;CAC8B,CAAA;AAEpB,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,SAAS,EAAE,2CAAyB;IACpC,mBAAmB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,oCAAuB;IAChC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACkB,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { FieldsValidationSchema, fields } from './fields';
2
+ export { dataPoints } from './datapoints';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dataPoints = exports.fields = exports.FieldsValidationSchema = void 0;
4
+ var fields_1 = require("./fields");
5
+ Object.defineProperty(exports, "FieldsValidationSchema", { enumerable: true, get: function () { return fields_1.FieldsValidationSchema; } });
6
+ Object.defineProperty(exports, "fields", { enumerable: true, get: function () { return fields_1.fields; } });
7
+ var datapoints_1 = require("./datapoints");
8
+ Object.defineProperty(exports, "dataPoints", { enumerable: true, get: function () { return datapoints_1.dataPoints; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../extensions/twilio/v2/actions/sendSmsDuringBusinessHours/config/index.ts"],"names":[],"mappings":";;;AAAA,mCAAyD;AAAhD,gHAAA,sBAAsB,OAAA;AAAE,gGAAA,MAAM,OAAA;AACvC,2CAAyC;AAAhC,wGAAA,UAAU,OAAA"}
@@ -0,0 +1 @@
1
+ export { sendSmsDuringBusinessHours } from './sendSmsDuringBusinessHours';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendSmsDuringBusinessHours = void 0;
4
+ var sendSmsDuringBusinessHours_1 = require("./sendSmsDuringBusinessHours");
5
+ Object.defineProperty(exports, "sendSmsDuringBusinessHours", { enumerable: true, get: function () { return sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../extensions/twilio/v2/actions/sendSmsDuringBusinessHours/index.ts"],"names":[],"mappings":";;;AAAA,2EAAyE;AAAhE,wIAAA,0BAA0B,OAAA"}
@@ -0,0 +1,4 @@
1
+ import { type Action } from '@awell-health/extensions-core';
2
+ import { type settings } from '../../../settings';
3
+ import { fields } from './config';
4
+ export declare const sendSmsDuringBusinessHours: Action<typeof fields, typeof settings>;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.sendSmsDuringBusinessHours = void 0;
7
+ const zod_1 = require("zod");
8
+ const zod_validation_error_1 = require("zod-validation-error");
9
+ const twilio_1 = __importDefault(require("../../../common/sdk/twilio"));
10
+ const extensions_core_1 = require("@awell-health/extensions-core");
11
+ const settings_1 = require("../../../settings");
12
+ const config_1 = require("./config");
13
+ const lodash_1 = require("lodash");
14
+ const getNextDateWithinBusinessHours_1 = require("../../../../../src/utils/getNextDateWithinBusinessHours");
15
+ const date_fns_1 = require("date-fns");
16
+ exports.sendSmsDuringBusinessHours = {
17
+ key: 'sendSmsDuringBusinessHours',
18
+ title: 'Send SMS during business hours',
19
+ description: 'Send a text message during business hours from a given telephone number to a recipient of your choice.',
20
+ category: extensions_core_1.Category.COMMUNICATION,
21
+ fields: config_1.fields,
22
+ dataPoints: config_1.dataPoints,
23
+ previewable: false,
24
+ onActivityCreated: async (payload, onComplete, onError) => {
25
+ try {
26
+ const { settings: { accountSid, authToken, messagingServiceSid: defaultMessagingServiceSid, }, fields: { recipient, message, messagingServiceSid, timeZone }, } = (0, extensions_core_1.validate)({
27
+ schema: zod_1.z
28
+ .object({
29
+ settings: settings_1.SettingsValidationSchema,
30
+ fields: config_1.FieldsValidationSchema,
31
+ })
32
+ .superRefine((value, ctx) => {
33
+ // if both `from` values missing - throw error
34
+ if ((0, lodash_1.isNil)(value.settings.messagingServiceSid) &&
35
+ (0, lodash_1.isNil)(value.fields.messagingServiceSid)) {
36
+ ctx.addIssue({
37
+ code: zod_1.z.ZodIssueCode.custom,
38
+ fatal: true,
39
+ message: '"Messaging Service SID" is missing in both settings and in the action field.',
40
+ });
41
+ }
42
+ }),
43
+ payload,
44
+ });
45
+ const client = (0, twilio_1.default)(accountSid, authToken, {
46
+ region: 'IE1',
47
+ accountSid,
48
+ });
49
+ const tz = (0, lodash_1.isEmpty)(timeZone) ? 'UTC' : timeZone;
50
+ const now = new Date();
51
+ const isBetweenBusinessHours = (0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(now, tz);
52
+ const scheduleType = isBetweenBusinessHours ? undefined : 'fixed';
53
+ const sendAt = isBetweenBusinessHours
54
+ ? undefined
55
+ : (0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(now, tz);
56
+ const scheduled = isBetweenBusinessHours ? 'false' : 'true';
57
+ const res = await client.messages.create({
58
+ body: message,
59
+ messagingServiceSid: messagingServiceSid !== null && messagingServiceSid !== void 0 ? messagingServiceSid : defaultMessagingServiceSid,
60
+ to: recipient,
61
+ scheduleType,
62
+ sendAt,
63
+ });
64
+ await onComplete({
65
+ data_points: {
66
+ messageSid: res.sid,
67
+ scheduled,
68
+ sendAt: sendAt ? (0, date_fns_1.formatISO)(sendAt) : (0, date_fns_1.formatISO)(now),
69
+ },
70
+ });
71
+ }
72
+ catch (err) {
73
+ if (err instanceof zod_1.ZodError) {
74
+ const error = (0, zod_validation_error_1.fromZodError)(err);
75
+ await onError({
76
+ events: [
77
+ {
78
+ date: new Date().toISOString(),
79
+ text: { en: error.message },
80
+ error: {
81
+ category: 'BAD_REQUEST',
82
+ message: error.message,
83
+ },
84
+ },
85
+ ],
86
+ });
87
+ }
88
+ else {
89
+ const message = err.message;
90
+ await onError({
91
+ events: [
92
+ {
93
+ date: new Date().toISOString(),
94
+ text: { en: message },
95
+ error: {
96
+ category: 'SERVER_ERROR',
97
+ message,
98
+ },
99
+ },
100
+ ],
101
+ });
102
+ }
103
+ }
104
+ },
105
+ };
106
+ //# sourceMappingURL=sendSmsDuringBusinessHours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendSmsDuringBusinessHours.js","sourceRoot":"","sources":["../../../../../../extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sendSmsDuringBusinessHours_1 = require("./sendSmsDuringBusinessHours");
7
+ const twilio_1 = __importDefault(require("../../../common/sdk/twilio"));
8
+ const tests_1 = require("../../../../../src/tests");
9
+ describe('Send SMS during business hours', () => {
10
+ const onComplete = jest.fn();
11
+ const onError = jest.fn();
12
+ const getLastTwilioClient = () => { var _a; return (_a = twilio_1.default.mock.results.at(-1)) === null || _a === void 0 ? void 0 : _a.value; };
13
+ beforeEach(() => {
14
+ onComplete.mockClear();
15
+ onError.mockClear();
16
+ jest.useFakeTimers();
17
+ });
18
+ afterEach(() => {
19
+ jest.useRealTimers();
20
+ });
21
+ test('Should call the onComplete callback and not schedule the message if current date is between business hours', async () => {
22
+ const mockDate = '2024-01-01T10:00:00Z'; // between business hours
23
+ jest.setSystemTime(new Date(mockDate));
24
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated((0, tests_1.generateTestPayload)({
25
+ fields: {
26
+ message: 'Message content',
27
+ recipient: '+32494000000',
28
+ messagingServiceSid: '',
29
+ timeZone: undefined,
30
+ },
31
+ settings: {
32
+ accountSid: 'AC-accountSid',
33
+ authToken: 'authToken',
34
+ fromNumber: '+19144542596',
35
+ messagingServiceSid: 'service-id-settings',
36
+ },
37
+ }), onComplete, onError);
38
+ expect(onComplete).toHaveBeenCalledWith({
39
+ data_points: {
40
+ scheduled: 'false',
41
+ sendAt: mockDate,
42
+ messageSid: '123',
43
+ },
44
+ });
45
+ expect(onError).not.toHaveBeenCalled();
46
+ });
47
+ test('Should call the onComplete callback and schedule the message if current date is before business hours', async () => {
48
+ const mockDate = '2024-01-01T08:59:00Z'; // before business hours
49
+ jest.setSystemTime(new Date(mockDate));
50
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated((0, tests_1.generateTestPayload)({
51
+ fields: {
52
+ message: 'Message content',
53
+ recipient: '+32494000000',
54
+ messagingServiceSid: '',
55
+ timeZone: undefined,
56
+ },
57
+ settings: {
58
+ accountSid: 'AC-accountSid',
59
+ authToken: 'authToken',
60
+ fromNumber: '+19144542596',
61
+ messagingServiceSid: 'service-id-settings',
62
+ },
63
+ }), onComplete, onError);
64
+ expect(onComplete).toHaveBeenCalledWith({
65
+ data_points: {
66
+ scheduled: 'true',
67
+ sendAt: '2024-01-01T09:00:00Z',
68
+ messageSid: '123',
69
+ },
70
+ });
71
+ expect(onError).not.toHaveBeenCalled();
72
+ });
73
+ test('Should call the onComplete callback and schedule the message if current date is after business hours', async () => {
74
+ const mockDate = '2024-01-01T17:01:00Z'; // after business hours
75
+ jest.setSystemTime(new Date(mockDate));
76
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated((0, tests_1.generateTestPayload)({
77
+ fields: {
78
+ message: 'Message content',
79
+ recipient: '+32494000000',
80
+ messagingServiceSid: '',
81
+ timeZone: undefined,
82
+ },
83
+ settings: {
84
+ accountSid: 'AC-accountSid',
85
+ authToken: 'authToken',
86
+ fromNumber: '+19144542596',
87
+ messagingServiceSid: 'service-id-settings',
88
+ },
89
+ }), onComplete, onError);
90
+ expect(onComplete).toHaveBeenCalledWith({
91
+ data_points: {
92
+ scheduled: 'true',
93
+ sendAt: '2024-01-02T09:00:00Z',
94
+ messageSid: '123',
95
+ },
96
+ });
97
+ expect(onError).not.toHaveBeenCalled();
98
+ });
99
+ test('Should call the onError callback when there is no recipient', async () => {
100
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated((0, tests_1.generateTestPayload)({
101
+ fields: {
102
+ message: 'Message content',
103
+ recipient: '',
104
+ messagingServiceSid: '',
105
+ timeZone: undefined,
106
+ },
107
+ settings: {
108
+ accountSid: 'AC-accountSid',
109
+ authToken: 'authToken',
110
+ fromNumber: undefined,
111
+ messagingServiceSid: 'service-id-settings',
112
+ },
113
+ }), onComplete, onError);
114
+ expect(onComplete).not.toHaveBeenCalled();
115
+ expect(onError).toHaveBeenCalled();
116
+ });
117
+ test('Should call the onError callback when there is no message', async () => {
118
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated((0, tests_1.generateTestPayload)({
119
+ fields: {
120
+ message: '',
121
+ recipient: '+19144542596',
122
+ messagingServiceSid: '',
123
+ timeZone: undefined,
124
+ },
125
+ settings: {
126
+ accountSid: 'AC-accountSid',
127
+ authToken: 'authToken',
128
+ fromNumber: undefined,
129
+ messagingServiceSid: 'service-id-settings',
130
+ },
131
+ }), onComplete, onError);
132
+ expect(onComplete).not.toHaveBeenCalled();
133
+ expect(onError).toHaveBeenCalled();
134
+ });
135
+ describe("'Messaging Service SID'", () => {
136
+ const basePayload = (0, tests_1.generateTestPayload)({
137
+ fields: {
138
+ message: 'Message content',
139
+ recipient: '+32494000000',
140
+ messagingServiceSid: 'service-id-fields',
141
+ timeZone: undefined,
142
+ },
143
+ settings: {
144
+ accountSid: 'AC-accountSid',
145
+ authToken: 'authToken',
146
+ fromNumber: undefined,
147
+ messagingServiceSid: 'service-id-settings',
148
+ },
149
+ });
150
+ test('Should use one provided in action fields', async () => {
151
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated(basePayload, onComplete, onError);
152
+ expect(getLastTwilioClient().messages.create.mock.calls.at(-1)[0]
153
+ .messagingServiceSid).toEqual(basePayload.fields.messagingServiceSid);
154
+ expect(onComplete).toHaveBeenCalled();
155
+ expect(onError).not.toHaveBeenCalled();
156
+ });
157
+ test('Should fallback to settings if no messagingServiceSid is provided', async () => {
158
+ const payloadWithoutFrom = {
159
+ ...basePayload,
160
+ fields: {
161
+ message: 'Message content',
162
+ recipient: '+32494000000',
163
+ messagingServiceSid: undefined,
164
+ timeZone: undefined,
165
+ },
166
+ };
167
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated(payloadWithoutFrom, onComplete, onError);
168
+ expect(getLastTwilioClient().messages.create.mock.calls.at(-1)[0]
169
+ .messagingServiceSid).toEqual(payloadWithoutFrom.settings.messagingServiceSid);
170
+ expect(onComplete).toHaveBeenCalled();
171
+ expect(onError).not.toHaveBeenCalled();
172
+ });
173
+ test('Should throw error if no messagingServiceSid is provided in both settings and fields', async () => {
174
+ const payloadWithoutFrom = {
175
+ ...basePayload,
176
+ settings: { ...basePayload.settings, messagingServiceSid: undefined },
177
+ fields: {
178
+ ...basePayload.fields,
179
+ messagingServiceSid: undefined,
180
+ timeZone: undefined,
181
+ },
182
+ };
183
+ await sendSmsDuringBusinessHours_1.sendSmsDuringBusinessHours.onActivityCreated(payloadWithoutFrom, onComplete, onError);
184
+ expect(onComplete).not.toHaveBeenCalled();
185
+ expect(onError).toHaveBeenCalledWith({
186
+ events: expect.arrayContaining([
187
+ expect.objectContaining({
188
+ error: {
189
+ category: 'BAD_REQUEST',
190
+ message: 'Validation error: "Messaging Service SID" is missing in both settings and in the action field.',
191
+ },
192
+ }),
193
+ ]),
194
+ });
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=sendSmsDuringBusinessHours.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendSmsDuringBusinessHours.test.js","sourceRoot":"","sources":["../../../../../../extensions/twilio/v2/actions/sendSmsDuringBusinessHours/sendSmsDuringBusinessHours.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- type ISOString = string;
1
+ export declare const isDateBetweenBusinessHours: (date: Date, targetTimeZone?: string) => boolean;
2
2
  /**
3
- * Function doesn't take into account weekends.
4
- * Just checks that within any given day it's between 9 AM and 5 PM.
5
- * - If that's the case, return the reference date
6
- * - If not, return reference date + 1 day at 9 AM
3
+ * Adjusts the given ISO date string to the next available time within business hours,
4
+ * taking into account the specified time zone.
5
+ *
6
+ * @param date - The date to adjust.
7
+ * @param targetTimeZone - The IANA time zone identifier string, such as "America/New_York".
8
+ * @returns The next date between business hours in UTC
7
9
  */
8
- export declare const getNextDateWithinBusinessHours: (referenceDateAsISOString: ISOString) => ISOString;
9
- export {};
10
+ export declare const getNextDateWithinBusinessHours: (date: Date, targetTimeZone?: string) => Date;
@@ -1,31 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getNextDateWithinBusinessHours = void 0;
3
+ exports.getNextDateWithinBusinessHours = exports.isDateBetweenBusinessHours = void 0;
4
4
  const date_fns_1 = require("date-fns");
5
+ const date_fns_tz_1 = require("date-fns-tz");
5
6
  const START_HOUR_WORKING_DAY = 9; // 9 AM
6
7
  const END_HOUR_WORKING_DAY = 17; // 5 PM
8
+ const isDateBetweenBusinessHours = (date, // assuming all dates we receive are dates in UTC
9
+ targetTimeZone = 'UTC') => {
10
+ const referenceDate = (0, date_fns_tz_1.utcToZonedTime)(date, targetTimeZone);
11
+ const hoursOfDate = referenceDate.getHours();
12
+ if (hoursOfDate >= START_HOUR_WORKING_DAY &&
13
+ hoursOfDate < END_HOUR_WORKING_DAY) {
14
+ return true;
15
+ }
16
+ return false;
17
+ };
18
+ exports.isDateBetweenBusinessHours = isDateBetweenBusinessHours;
7
19
  /**
8
- * Function doesn't take into account weekends.
9
- * Just checks that within any given day it's between 9 AM and 5 PM.
10
- * - If that's the case, return the reference date
11
- * - If not, return reference date + 1 day at 9 AM
20
+ * Adjusts the given ISO date string to the next available time within business hours,
21
+ * taking into account the specified time zone.
22
+ *
23
+ * @param date - The date to adjust.
24
+ * @param targetTimeZone - The IANA time zone identifier string, such as "America/New_York".
25
+ * @returns The next date between business hours in UTC
12
26
  */
13
- const getNextDateWithinBusinessHours = (referenceDateAsISOString) => {
14
- const referenceDate = new Date(referenceDateAsISOString);
15
- if (!(0, date_fns_1.isValid)(referenceDate)) {
16
- throw new Error('Reference date is not a valid date');
17
- }
18
- const hourOfReferenceDate = referenceDate.getHours();
19
- // If before 9 AM, return 9 AM of the same day
20
- if (hourOfReferenceDate < START_HOUR_WORKING_DAY) {
21
- return (0, date_fns_1.formatISO)((0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(referenceDate), START_HOUR_WORKING_DAY));
27
+ const getNextDateWithinBusinessHours = (date, // assuming all dates we receive are dates in UTC
28
+ targetTimeZone = 'UTC') => {
29
+ // Convert date to the specified timezone
30
+ const referenceDateInTimeZone = (0, date_fns_tz_1.utcToZonedTime)(date, targetTimeZone);
31
+ const hours = referenceDateInTimeZone.getHours();
32
+ // If before 9 AM in the specified timezone, adjust to 9 AM of the same day in that timezone, then convert back to UTC
33
+ if (hours < START_HOUR_WORKING_DAY) {
34
+ return (0, date_fns_tz_1.zonedTimeToUtc)((0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(referenceDateInTimeZone), START_HOUR_WORKING_DAY), targetTimeZone);
22
35
  }
23
- // If after 5 PM, return 9 AM of the next day
24
- else if (hourOfReferenceDate >= END_HOUR_WORKING_DAY) {
25
- return (0, date_fns_1.formatISO)((0, date_fns_1.setHours)((0, date_fns_1.startOfDay)((0, date_fns_1.addDays)(referenceDate, 1)), START_HOUR_WORKING_DAY));
36
+ // If after 5 PM in the specified timezone, adjust to 9 AM of the next day in that timezone, then convert back to UTC
37
+ else if (hours >= END_HOUR_WORKING_DAY) {
38
+ return (0, date_fns_tz_1.zonedTimeToUtc)((0, date_fns_1.setHours)((0, date_fns_1.startOfDay)((0, date_fns_1.addDays)(referenceDateInTimeZone, 1)), START_HOUR_WORKING_DAY), targetTimeZone);
26
39
  }
27
- // If between 9 AM and 5 PM, return the reference date
28
- return (0, date_fns_1.formatISO)(referenceDate);
40
+ // If between 9 AM and 5 PM in the specified timezone, return the reference date itself, already in UTC
41
+ return date;
29
42
  };
30
43
  exports.getNextDateWithinBusinessHours = getNextDateWithinBusinessHours;
31
44
  //# sourceMappingURL=getNextDateWithinBusinessHours.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNextDateWithinBusinessHours.js","sourceRoot":"","sources":["../../../../src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.ts"],"names":[],"mappings":";;;AAAA,uCAA4E;AAE5E,MAAM,sBAAsB,GAAG,CAAC,CAAA,CAAC,OAAO;AACxC,MAAM,oBAAoB,GAAG,EAAE,CAAA,CAAC,OAAO;AAIvC;;;;;GAKG;AACI,MAAM,8BAA8B,GAAG,CAC5C,wBAAmC,EACxB,EAAE;IACb,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,wBAAwB,CAAC,CAAA;IAExD,IAAI,CAAC,IAAA,kBAAO,EAAC,aAAa,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;KACtD;IAED,MAAM,mBAAmB,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAA;IAEpD,8CAA8C;IAC9C,IAAI,mBAAmB,GAAG,sBAAsB,EAAE;QAChD,OAAO,IAAA,oBAAS,EACd,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC,CAC5D,CAAA;KACF;IACD,6CAA6C;SACxC,IAAI,mBAAmB,IAAI,oBAAoB,EAAE;QACpD,OAAO,IAAA,oBAAS,EACd,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAA,kBAAO,EAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,sBAAsB,CAAC,CACxE,CAAA;KACF;IACD,sDAAsD;IACtD,OAAO,IAAA,oBAAS,EAAC,aAAa,CAAC,CAAA;AACjC,CAAC,CAAA;AAzBY,QAAA,8BAA8B,kCAyB1C"}
1
+ {"version":3,"file":"getNextDateWithinBusinessHours.js","sourceRoot":"","sources":["../../../../src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.ts"],"names":[],"mappings":";;;AAAA,uCAAwD;AACxD,6CAA4D;AAE5D,MAAM,sBAAsB,GAAG,CAAC,CAAA,CAAC,OAAO;AACxC,MAAM,oBAAoB,GAAG,EAAE,CAAA,CAAC,OAAO;AAEhC,MAAM,0BAA0B,GAAG,CACxC,IAAU,EAAE,iDAAiD;AAC7D,iBAAyB,KAAK,EACrB,EAAE;IACX,MAAM,aAAa,GAAG,IAAA,4BAAc,EAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IAC1D,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAA;IAE5C,IACE,WAAW,IAAI,sBAAsB;QACrC,WAAW,GAAG,oBAAoB,EAClC;QACA,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAfY,QAAA,0BAA0B,8BAetC;AAED;;;;;;;GAOG;AACI,MAAM,8BAA8B,GAAG,CAC5C,IAAU,EAAE,iDAAiD;AAC7D,iBAAyB,KAAK,EACxB,EAAE;IACR,yCAAyC;IACzC,MAAM,uBAAuB,GAAG,IAAA,4BAAc,EAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACpE,MAAM,KAAK,GAAG,uBAAuB,CAAC,QAAQ,EAAE,CAAA;IAEhD,sHAAsH;IACtH,IAAI,KAAK,GAAG,sBAAsB,EAAE;QAClC,OAAO,IAAA,4BAAc,EACnB,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,uBAAuB,CAAC,EAAE,sBAAsB,CAAC,EACrE,cAAc,CACf,CAAA;KACF;IACD,qHAAqH;SAChH,IAAI,KAAK,IAAI,oBAAoB,EAAE;QACtC,OAAO,IAAA,4BAAc,EACnB,IAAA,mBAAQ,EACN,IAAA,qBAAU,EAAC,IAAA,kBAAO,EAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAC/C,sBAAsB,CACvB,EACD,cAAc,CACf,CAAA;KACF;IAED,uGAAuG;IACvG,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AA5BY,QAAA,8BAA8B,kCA4B1C"}
@@ -1,30 +1,92 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const getNextDateWithinBusinessHours_1 = require("./getNextDateWithinBusinessHours"); // Adjust the import path as necessary
3
+ const getNextDateWithinBusinessHours_1 = require("./getNextDateWithinBusinessHours");
4
4
  const date_fns_1 = require("date-fns");
5
- describe('getNextDateWithinBusinessHours', () => {
6
- it('returns should throw an error when reference date is not a valid ISO8601 date', () => {
7
- const mockDateString = 'hello';
8
- expect(() => {
9
- (0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDateString);
10
- }).toThrowError();
5
+ describe('isDateBetweenBusinessHours', () => {
6
+ describe('Default (UTC) timezone', () => {
7
+ it('should return true for a date within business hours', () => {
8
+ const date = new Date('2024-01-01T10:00:00Z');
9
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date)).toBe(true);
10
+ });
11
+ it('should return false for a date before business hours', () => {
12
+ const date = new Date('2024-01-01T08:59:00Z');
13
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date)).toBe(false);
14
+ });
15
+ it('should return false for a date after business hours', () => {
16
+ const date = new Date('2024-01-01T17:01:00Z');
17
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date)).toBe(false);
18
+ });
19
+ it('should return true for a date exactly at the start of business hours', () => {
20
+ const date = new Date('2024-01-01T09:00:00Z');
21
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date)).toBe(true);
22
+ });
23
+ it('should return false for a date exactly at the end of business hours', () => {
24
+ const date = new Date('2024-01-01T17:00:00Z');
25
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date)).toBe(false);
26
+ });
11
27
  });
12
- it('returns the current date in ISO format if that date is within working hours', () => {
13
- const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 10); // 10 AM is within working hours
14
- const mockDateString = (0, date_fns_1.formatISO)(mockDate);
15
- expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDateString)).toEqual((0, date_fns_1.formatISO)(mockDate));
28
+ describe('"Europe/Brussels/ timezone', () => {
29
+ const timeZone = 'Europe/Brussels';
30
+ it('should return true for a date within business hours', () => {
31
+ // 10 AM UTC is 11 AM Belgium time and is within business hours
32
+ const date = new Date('2024-01-01T10:00:00Z');
33
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date, timeZone)).toBe(true);
34
+ });
35
+ it('should return false for a date before business hours', () => {
36
+ // 7 AM UTC is 8 AM Belgium time and is before business hours
37
+ const date = new Date('2024-01-01T07:59:00Z');
38
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date, timeZone)).toBe(false);
39
+ });
40
+ it('should return false for a date after business hours', () => {
41
+ // 4 PM UTC is 5 PM Belgium time and is after business hours
42
+ const date = new Date('2024-01-01T16:01:00Z');
43
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date, timeZone)).toBe(false);
44
+ });
45
+ it('should return true for a date exactly at the start of business hours', () => {
46
+ // 8 AM UTC is 9 PM Belgium time and is at the start of business hours
47
+ const date = new Date('2024-01-01T08:00:00Z');
48
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date, timeZone)).toBe(true);
49
+ });
50
+ it('should return false for a date exactly at the end of business hours', () => {
51
+ // 4 PM UTC is 5 PM Belgium time and is at the end of business hours
52
+ const date = new Date('2024-01-01T16:00:00Z');
53
+ expect((0, getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours)(date, timeZone)).toBe(false);
54
+ });
16
55
  });
17
- it('returns the next day at 9 AM in ISO format when the date is after working hours', () => {
18
- const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 18); // 6 PM is after working hours
19
- const mockDateString = (0, date_fns_1.formatISO)(mockDate);
20
- const expectedDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)((0, date_fns_1.addDays)(mockDate, 1)), 9);
21
- expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDateString)).toEqual((0, date_fns_1.formatISO)(expectedDate));
56
+ });
57
+ describe('getNextDateWithinBusinessHours', () => {
58
+ describe('Default (UTC) timezone', () => {
59
+ it('returns the current date in ISO format if that date is within working hours', () => {
60
+ const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 10); // 10 AM is within working hours
61
+ expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDate)).toEqual(mockDate);
62
+ });
63
+ it('returns the next day at 9 AM in ISO format when the date is after working hours', () => {
64
+ const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 18); // 5 PM onwards is after working hours
65
+ const expectedDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)((0, date_fns_1.addDays)(mockDate, 1)), 9);
66
+ expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDate)).toEqual(expectedDate);
67
+ });
68
+ it('returns today at 9 AM in ISO format when the date is before working hours', () => {
69
+ const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 8); // 8 AM is before working hours
70
+ const expectedDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(mockDate), 9); // Should return 9 AM of the same day
71
+ expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDate)).toEqual(expectedDate);
72
+ });
22
73
  });
23
- it('returns today at 9 AM in ISO format when the date is before working hours', () => {
24
- const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 8); // 8 AM is before working hours
25
- const mockDateString = (0, date_fns_1.formatISO)(mockDate);
26
- const expectedDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(mockDate), 9); // Should return 9 AM of the same day
27
- expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDateString)).toEqual((0, date_fns_1.formatISO)(expectedDate));
74
+ describe('"Europe/Brussels" timezone', () => {
75
+ const timeZone = 'Europe/Brussels';
76
+ it('returns the current date in ISO format if that date is within working hours', () => {
77
+ const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 8); // 8 AM UTC is 9 AM in Belgium
78
+ expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDate, timeZone)).toEqual(mockDate);
79
+ });
80
+ it('returns the next day at 9 AM in ISO format when the date is after working hours', () => {
81
+ const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 16); // 4 PM UTC is 5 PM in Belgium and is after working hours
82
+ const expectedDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)((0, date_fns_1.addDays)(mockDate, 1)), 8); // should return 8 AM of the next day in UTC (which is 9 AM Belgium time)
83
+ expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDate, timeZone)).toEqual(expectedDate);
84
+ });
85
+ it('returns today at 9 AM in ISO format when the date is before working hours', () => {
86
+ const mockDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(new Date()), 7); // 7 AM UTC is 8 AM in Belgum and is before working hours
87
+ const expectedDate = (0, date_fns_1.setHours)((0, date_fns_1.startOfDay)(mockDate), 8); // should return 8 AM of the same day in UTC (which is 9 AM Belgium time)
88
+ expect((0, getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours)(mockDate, timeZone)).toEqual(expectedDate);
89
+ });
28
90
  });
29
91
  });
30
92
  //# sourceMappingURL=getNextDateWithinBusinessHours.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getNextDateWithinBusinessHours.test.js","sourceRoot":"","sources":["../../../../src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.test.ts"],"names":[],"mappings":";;AAAA,qFAAiF,CAAC,sCAAsC;AACxH,uCAAmE;AAEnE,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,cAAc,GAAG,OAAO,CAAA;QAE9B,MAAM,CAAC,GAAG,EAAE;YACV,IAAA,+DAA8B,EAAC,cAAc,CAAC,CAAA;QAChD,CAAC,CAAC,CAAC,YAAY,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,QAAQ,GAAG,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,gCAAgC;QACtF,MAAM,cAAc,GAAG,IAAA,oBAAS,EAAC,QAAQ,CAAC,CAAA;QAE1C,MAAM,CAAC,IAAA,+DAA8B,EAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAC5D,IAAA,oBAAS,EAAC,QAAQ,CAAC,CACpB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,QAAQ,GAAG,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,8BAA8B;QACpF,MAAM,cAAc,GAAG,IAAA,oBAAS,EAAC,QAAQ,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAA,kBAAO,EAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAElE,MAAM,CAAC,IAAA,+DAA8B,EAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAC5D,IAAA,oBAAS,EAAC,YAAY,CAAC,CACxB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,QAAQ,GAAG,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;QACpF,MAAM,cAAc,GAAG,IAAA,oBAAS,EAAC,QAAQ,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAA,mBAAQ,EAAC,IAAA,qBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,qCAAqC;QAE5F,MAAM,CAAC,IAAA,+DAA8B,EAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAC5D,IAAA,oBAAS,EAAC,YAAY,CAAC,CACxB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"getNextDateWithinBusinessHours.test.js","sourceRoot":"","sources":["../../../../src/utils/getNextDateWithinBusinessHours/getNextDateWithinBusinessHours.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export { getNextDateWithinBusinessHours } from './getNextDateWithinBusinessHours';
1
+ export { getNextDateWithinBusinessHours, isDateBetweenBusinessHours, } from './getNextDateWithinBusinessHours';
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getNextDateWithinBusinessHours = void 0;
3
+ exports.isDateBetweenBusinessHours = exports.getNextDateWithinBusinessHours = void 0;
4
4
  var getNextDateWithinBusinessHours_1 = require("./getNextDateWithinBusinessHours");
5
5
  Object.defineProperty(exports, "getNextDateWithinBusinessHours", { enumerable: true, get: function () { return getNextDateWithinBusinessHours_1.getNextDateWithinBusinessHours; } });
6
+ Object.defineProperty(exports, "isDateBetweenBusinessHours", { enumerable: true, get: function () { return getNextDateWithinBusinessHours_1.isDateBetweenBusinessHours; } });
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/getNextDateWithinBusinessHours/index.ts"],"names":[],"mappings":";;;AAAA,mFAAiF;AAAxE,gJAAA,8BAA8B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/getNextDateWithinBusinessHours/index.ts"],"names":[],"mappings":";;;AAAA,mFAGyC;AAFvC,gJAAA,8BAA8B,OAAA;AAC9B,4IAAA,0BAA0B,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awell-health/awell-extensions",
3
- "version": "1.0.222",
3
+ "version": "1.0.223",
4
4
  "packageManager": "yarn@3.4.1",
5
5
  "main": "dist/src/index.js",
6
6
  "repository": {
@@ -76,6 +76,7 @@
76
76
  "body-parser": "^1.20.2",
77
77
  "cheerio": "^1.0.0-rc.12",
78
78
  "date-fns": "^2.29.3",
79
+ "date-fns-tz": "^2.0.1",
79
80
  "docusign-esign": "^6.3.0",
80
81
  "driver-license-validator": "2.0.2",
81
82
  "express": "^4.18.2",