@getjones/test-infra 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/package.json +1 -1
  2. package/src/common/commonFlows/records/records.js +45 -1
  3. package/src/common/consts/accountSettings.js +10 -0
  4. package/src/common/consts/constantsForRecordsSortingAndFilters.js +40 -0
  5. package/src/common/consts/ocrStatuses.js +6 -0
  6. package/src/defaults/configs/polices.js +8 -5
  7. package/src/factory/records/records.js +5 -19
  8. package/src/saas/internal-api/coi/consts/hashes.js +4 -0
  9. package/src/saas/internal-api/coi/index.js +2 -1
  10. package/src/saas/internal-api/coi/models/submit.coi.model.js +16 -6
  11. package/src/saas/internal-api/coi/utils/utils.js +29 -7
  12. package/src/saas/internal-api/compliance/api/audit/audit.service.js +13 -1
  13. package/src/saas/internal-api/contractors/api/contractors.api.js +28 -4
  14. package/src/saas/internal-api/contractors/api/contractors.service.js +73 -2
  15. package/src/saas/internal-api/contractors/models/edit.contractor.model.js +3 -1
  16. package/src/saas/internal-api/contractors/models/link.request.model.js +10 -0
  17. package/src/saas/internal-api/contractors/models/subscription.contractor.model.js +13 -0
  18. package/src/saas/internal-api/dbEmails/api/db.emails.service.js +9 -0
  19. package/src/saas/internal-api/dbEmails/utils/util.js +7 -2
  20. package/src/saas/internal-api/reports/consts/consts.js +2 -1
  21. package/src/saas/internal-api/requests/api/requests.api.js +28 -4
  22. package/src/saas/internal-api/requests/api/requests.service.js +61 -9
  23. package/src/saas/internal-api/requests/index.js +2 -0
  24. package/src/saas/internal-api/requests/models/create.request.model.js +1 -2
  25. package/src/saas/internal-api/requests/models/draft.request.criteria.model.js +18 -0
  26. package/.npmrc.bak +0 -2
  27. package/package.json.bak +0 -30
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getjones/test-infra",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "Providing internal and openapi interface",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -3,8 +3,11 @@ const { expect } = require('chai');
3
3
  const threadScheduler = require('../../../saas/internal-api/thread-scheduler/runner');
4
4
  const timeUtils = require('../../utils/timeUtils');
5
5
  const httpResponseStatusCodes = require('../../../common/httpResponseStatusCodes.json');
6
+ const ocrStatuses = require('../../consts/ocrStatuses');
6
7
  const contractors = require('../../../saas/internal-api/contractors');
7
8
  const compliance = require('../../../saas/internal-api/compliance');
9
+ const requests = require('../../../saas/internal-api/requests');
10
+ const dbEmails = require('../../../saas/internal-api/dbEmails');
8
11
 
9
12
  const makeRecordNotResponsive = async function(recordId, context, { isTenant } = {}) {
10
13
  const offsetInDaysList = isTenant ?
@@ -16,6 +19,25 @@ const makeRecordNotResponsive = async function(recordId, context, { isTenant } =
16
19
  }
17
20
  };
18
21
 
22
+ const editRequestAndRecordDetails = async function(request, recordConfig, context) {
23
+ const tabModel = new requests.models.TabModel(request.tab.type);
24
+ const recordDetailsModel = contractors.services.getContractorDetailsModel(recordConfig);
25
+ const record = new contractors.models.edit.ContractorModel(
26
+ request.record.contractorId,
27
+ request.record.recordType,
28
+ recordConfig.company,
29
+ recordConfig.emailAddress,
30
+ recordDetailsModel
31
+ );
32
+ const requestEditModel = new requests.models.RequestModel(request.id, record, tabModel, {});
33
+
34
+ const editRequestResponse = await requests.services.editRequestAndRecordDetails(requestEditModel, context);
35
+
36
+ if (editRequestResponse.status !== httpResponseStatusCodes.OK) {
37
+ throw Error(`Failed to edit record ${recordCompany}\n${editRequestResponse.data.message}`);
38
+ }
39
+ };
40
+
19
41
  const updateInviteDate = async function(recordId, inviteDate, context) {
20
42
  await timeUtils.waitFor(1).seconds;
21
43
  const updateResponse = await contractors.services.updateInviteDate(recordId, inviteDate, context);
@@ -92,11 +114,33 @@ const getHistoryEvents = async function(recordId, context) {
92
114
  return recordHistory.data.map(item => item.itemTitle).reverse();
93
115
  };
94
116
 
117
+ const waitForOcrStatus = async function(recordId, context, { expectedStatus = ocrStatuses.SUCCESS } = {}) {
118
+ let { data: recordOcrStatus } = await contractors.services.getRecordOcrStatus(recordId, context);
119
+ let maxRetries = 25;
120
+ while (recordOcrStatus !== expectedStatus && recordOcrStatus !== ocrStatuses.FAILED && maxRetries > 0) {
121
+ await timeUtils.waitFor(5).seconds;
122
+ recordOcrStatus = (await contractors.services.getRecordOcrStatus(recordId, context)).data;
123
+ maxRetries--;
124
+ }
125
+
126
+ if (recordOcrStatus !== expectedStatus) {
127
+ throw new Error(`Record OCR status not is as expected. Expected: ${expectedStatus}, Actual: ${recordOcrStatus}`);
128
+ }
129
+ };
130
+
131
+ const generateSubscriptionModelFromMail = async function(recipients) {
132
+ const data = await dbEmails.services.getSubscriptionData(recipients);
133
+ return contractors.services.getSubscriptionModel(data);
134
+ };
135
+
95
136
  module.exports = {
96
137
  makeRecordNotResponsive,
97
138
  runOverAllRenewalDatesForRecord,
139
+ editRequestAndRecordDetails,
98
140
  updateInviteDate,
99
141
  updatePolicyExpiryDateForRecord,
100
142
  getHistoryEvents,
101
- updateLastInviteActionDate
143
+ updateLastInviteActionDate,
144
+ waitForOcrStatus,
145
+ generateSubscriptionModelFromMail
102
146
  };
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ isOcrEnabled: {
3
+ on: { isOcrEnabled: true },
4
+ off: { isOcrEnabled: false }
5
+ },
6
+ isAccountRequirementsEnabled: {
7
+ on: { isAccountRequirementsEnabled: true },
8
+ off: { isAccountRequirementsEnabled: false }
9
+ }
10
+ };
@@ -0,0 +1,40 @@
1
+ const activeRecordSortBy = {
2
+ companyName: 'SORT_BY_COMPANYNAME',
3
+ recordId: 'SORT_BY_RECORD_ID',
4
+ vendorStatus: 'SORT_BY_VENDOR_STATUS',
5
+ minPolicyExpired: 'SORT_BY_MIN_POLICY_EXP',
6
+ insuranceStatus: 'SORT_BY_INSURANCE_STATUS'
7
+ };
8
+
9
+ const recordComplianceStatuses = {
10
+ compliant: 'COMPLIANT_STATUS',
11
+ notCompliant: 'NOT_COMPLIANT_STATUS',
12
+ noCOIRequired: 'NO_COI_REQUIRED',
13
+ awaitingNewCOI: 'WAITING_NEW_COI_STATUS',
14
+ waived: 'WAIVED_STATUS',
15
+ underReview: 'UNDER_REVIEW',
16
+ expired: 'Expired',
17
+ notResponsive: 'NotResponsive'
18
+ };
19
+
20
+ const draftRecordSortBy = {
21
+ companyName: 'SORT_BY_COMPANY_NAME',
22
+ recordId: 'SORT_BY_RECORD_ID',
23
+ missingData: 'SORT_BY_MISSING_DATA',
24
+ coi: 'SORT_BY_COI'
25
+ };
26
+
27
+ const draftCompletionStatus = {
28
+ missingContact: 'missingContact',
29
+ missingRequirements: 'missingRequirements',
30
+ missingCoi: 'missingCoi',
31
+ readyForCoiRequest: 'readyForCoiRequest',
32
+ readyForReview: 'readyForReview'
33
+ };
34
+
35
+ module.exports = {
36
+ recordComplianceStatuses,
37
+ activeRecordSortBy,
38
+ draftRecordSortBy,
39
+ draftCompletionStatus
40
+ };
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ SUCCESS: 'SUCCESS',
3
+ FAILED: 'FAILED',
4
+ IN_PROGRESS: 'IN_PROGRESS',
5
+ UNKNOWN: 'UNKNOWN'
6
+ };
@@ -48,14 +48,17 @@ const attributeNames = {
48
48
  occur: 'Occur',
49
49
  text: 'text',
50
50
  limit: 'limit',
51
- AdditionalInsuredEndorsement: 'Additional Insured Endorsement',
52
- PrimaryNonContributoryProvision: 'Primary Non-Contributory Provision',
53
- PrimaryNonContributoryEndorsement: 'Primary Non-Contributory Endorsement',
51
+ additionalInsuredEndorsement: 'Additional Insured Endorsement',
52
+ primaryNonContributoryProvision: 'Primary Non-Contributory Provision',
53
+ primaryNonContributoryEndorsement: 'Primary Non-Contributory Endorsement',
54
54
  indemnityPeriod: 'Indemnity Period',
55
55
  actualLossSustained: 'Actual Loss Sustained',
56
56
  extraExpense: 'Extra Expense',
57
- combinedSingleLimit: 'Combined Single Limit'
58
-
57
+ combinedSingleLimit: 'Combined Single Limit',
58
+ followsForm: 'Follows Form',
59
+ followFormEndorsement: 'Follow-Form Endorsement',
60
+ waiverOfSubrogation: 'Waiver of Subrogation',
61
+ waiverOfSubrogationEndorsement: 'Waiver of Subrogation Endorsement'
59
62
  };
60
63
 
61
64
  module.exports = {
@@ -13,6 +13,7 @@ const { complianceStatuses, getAuditConfigByStatus } = require('../../common/uti
13
13
  const httpResponseStatusCodes = require('../../common/httpResponseStatusCodes.json');
14
14
  const activationStatuses = require('../../common/consts/activationStatuses');
15
15
  const timeUtils = require('../../common/utils/timeUtils');
16
+ const recordFlows = require('../../common/commonFlows/records/records');
16
17
 
17
18
  const filePath = path.join(__dirname, '../../resources/coi/coi.pdf');
18
19
 
@@ -36,24 +37,7 @@ const prepareRecord = async (recordCompany, recordEmail, status, tabId, requirem
36
37
  const projectId = requestData.projectInfo.projectId;
37
38
  const recordId = requestData.record.contractorId;
38
39
 
39
- if (recordConfig) {
40
- const tabModel = new requests.models.TabModel(requestData.tab.type);
41
- const recordDetailsModel = contractors.services.getContractorDetailsModel(recordConfig);
42
- const record = new contractors.models.edit.ContractorModel(
43
- recordId,
44
- requestData.record.recordType,
45
- recordConfig.company,
46
- recordConfig.emailAddress,
47
- recordDetailsModel
48
- );
49
- const requestEditModel = new requests.models.RequestModel(requestData.id, record, tabModel, {});
50
-
51
- const editRequestResponse = await requests.services.editRequestAndRecordDetails(requestEditModel, context);
52
-
53
- if (editRequestResponse.status !== httpResponseStatusCodes.OK) {
54
- throw Error(`Failed to edit record ${recordCompany}\n${editRequestResponse.data.message}`);
55
- }
56
- }
40
+ recordConfig && await recordFlows.editRequestAndRecordDetails(requestData, recordConfig, context);
57
41
 
58
42
  const coiUpload = await coi.utils.uploadCoi(
59
43
  recordId,
@@ -136,7 +120,7 @@ const prepareAwaitingNewCoiRecord = async (recordCompany, recordEmail, tabId, re
136
120
  const prepareUnderReviewRecord = (recordCompany, recordEmail, tabId, requirementId, context, { recordConfig } = {}) => {
137
121
  return prepareRecord(recordCompany, recordEmail, complianceStatuses.underReview, tabId, requirementId, context, { recordConfig });
138
122
  };
139
- const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail, requirementId, uploadCoi } = {}) => {
123
+ const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail, requirementId, uploadCoi, recordConfig } = {}) => {
140
124
  const requestData = await requests.services.getOrCreateRequest(
141
125
  context,
142
126
  tabId,
@@ -153,6 +137,8 @@ const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail,
153
137
  throw Error(`Failed to create record ${recordCompany}\n${requestData}`);
154
138
  }
155
139
 
140
+ recordConfig && await recordFlows.editRequestAndRecordDetails(requestData, recordConfig, context);
141
+
156
142
  if (uploadCoi) {
157
143
  const recordId = requestData.record.contractorId;
158
144
 
@@ -0,0 +1,4 @@
1
+ const defaultCoiHashValue = '79c8e018c43de2d8f4c6b489dde08cc3e21abe30f3e5f3a26ee4a0bca1ca6226';
2
+ const realCoiHashValue = '71de8e0b212168cb513c9f38af63f6b4f6186f950412b9e1e0ea84e1e54e47ce';
3
+
4
+ module.exports = { defaultCoiHashValue, realCoiHashValue };
@@ -7,7 +7,8 @@ const models = {
7
7
  const utils = require('./utils/utils');
8
8
 
9
9
  const consts = {
10
- UPLOADER_TYPES: require('./consts/uploaderTypes')
10
+ UPLOADER_TYPES: require('./consts/uploaderTypes'),
11
+ HASHES: require('./consts/hashes')
11
12
  };
12
13
 
13
14
  module.exports = { services, models, utils, consts };
@@ -1,9 +1,19 @@
1
- function SubmitCoiModel(contractorId, fileIds, uploadedBy, uploaderEmail, isContractorExist = true) {
2
- this.contractorId = contractorId;
3
- this.chosenIds = fileIds;
4
- this.uploadedBy = uploadedBy;
5
- this.uploaderEmail = uploaderEmail;
6
- this.isContractorExist = isContractorExist;
1
+ class SubmitCoiModel {
2
+ constructor({
3
+ recordId: contractorId,
4
+ fileIds,
5
+ uploadedBy,
6
+ uploaderEmail,
7
+ recordDateModified: contractorDateModified,
8
+ isContractorExist = true
9
+ }) {
10
+ this.contractorId = contractorId;
11
+ this.chosenIds = fileIds;
12
+ this.uploadedBy = uploadedBy;
13
+ this.uploaderEmail = uploaderEmail;
14
+ this.isContractorExist = isContractorExist;
15
+ this.contractorDateModified = contractorDateModified;
16
+ }
7
17
  }
8
18
 
9
19
  module.exports = { SubmitCoiModel };
@@ -2,36 +2,58 @@ const fs = require('fs');
2
2
 
3
3
  const services = require('../api/coi.service');
4
4
  const { SubmitCoiModel } = require('../models/submit.coi.model');
5
+ const { getContractorById } = require('../../contractors/api/contractors.service');
6
+ const { getIcsCookie } = require('../../auth/api/auth.service');
5
7
 
6
8
  const uploadFileToStorage = (recordId, filePath) => {
7
9
  const fileData = fs.createReadStream(filePath);
8
10
  return services.uploadToS3(recordId, fileData);
9
11
  };
10
12
 
11
- const submitCoiFilesUpload = (recordId, fileIds, uploaderType, uploaderEmail) => {
12
- const submitCoiModel = new SubmitCoiModel(
13
+ const submitCoiFilesUpload = ({
14
+ recordId,
15
+ fileIds,
16
+ uploadedBy,
17
+ uploaderEmail,
18
+ recordDateModified
19
+ }) => {
20
+ const submitCoiModel = new SubmitCoiModel({
13
21
  recordId,
14
22
  fileIds,
15
- uploaderType,
16
- uploaderEmail
17
- );
23
+ uploadedBy,
24
+ uploaderEmail,
25
+ recordDateModified
26
+ });
18
27
  return services.submitCoi(submitCoiModel);
19
28
  };
20
29
 
21
30
  const uploadCoi = async (
22
31
  recordId,
23
32
  filePath,
24
- uploaderType,
33
+ uploadedBy,
25
34
  uploaderEmail,
26
35
  {
27
36
  markAsScaned, // Should be passed with context
28
37
  context
29
38
  } = {}
30
39
  ) => {
40
+ if (!context) {
41
+ context = await getIcsCookie();
42
+ }
43
+
44
+ const recordResponse = await getContractorById(recordId, context);
45
+ const recordDateModified = recordResponse.data.dateModified;
31
46
  const uploadResponse = await uploadFileToStorage(recordId, filePath);
32
47
  const fileId = uploadResponse.data.fileId;
33
48
 
34
- const submitResponse = fileId && await submitCoiFilesUpload(recordId, [fileId], uploaderType, uploaderEmail);
49
+ const submitResponse = fileId && await submitCoiFilesUpload({
50
+ recordId,
51
+ fileIds: [fileId],
52
+ uploadedBy,
53
+ uploaderEmail,
54
+ recordDateModified
55
+ });
56
+
35
57
  const uploadedCoi = !!submitResponse.data.fileName && { id: fileId, name: submitResponse.data.fileName };
36
58
 
37
59
  if (uploadedCoi.name && markAsScaned && context) {
@@ -207,6 +207,17 @@ const getComplianceJson = async function(recordId, context) {
207
207
  return getComplianceJsonResponse.data;
208
208
  };
209
209
 
210
+ const getCurrentAuditUniqueCoiId = async function(recordId, auditorContext) {
211
+ const recordDetailsResponse = await getAuditRecordModel(recordId, auditorContext);
212
+
213
+ if (recordDetailsResponse.status !== httpResponseStatusCodes.OK) {
214
+ throw Error(`Failed to get audit record\n${recordDetailsResponse}`);
215
+ }
216
+
217
+ const { uniqueId: uniqueCoiId } = recordDetailsResponse.data.certificateDetails;
218
+ return uniqueCoiId;
219
+ };
220
+
210
221
  module.exports = {
211
222
  audit,
212
223
  submitAudit,
@@ -226,5 +237,6 @@ module.exports = {
226
237
  putAuditOnHold,
227
238
  resumeAudit,
228
239
  getAuditIfIsOnHold,
229
- updateComplianceAuditActionsDate
240
+ updateComplianceAuditActionsDate,
241
+ getCurrentAuditUniqueCoiId
230
242
  };
@@ -1,12 +1,13 @@
1
+ const { backendUrl } = require('../../../../env').getEnv();
2
+
1
3
  const requests = require('../../../../common/requests/cookieAuth/requests');
2
4
  const internalRequests = require('../../../../common/requests/internalAuth/requests');
3
5
 
4
- const { backendUrl } = require('../../../../env').getEnv();
5
-
6
6
  const Endpoints = {
7
7
  get: `${backendUrl}/saas/contractors`,
8
8
  getContractorById: contractorId => `${backendUrl}/saas/contractor/${contractorId}`,
9
9
  getRecordHistory: contractorId => `${backendUrl}/saas/record/${contractorId}/history`,
10
+ getRecordOcrStatus: contractorId => `${backendUrl}/saas/contractor/${contractorId}/ocr/status`,
10
11
  delete: contractorId => `${backendUrl}/saas/contractor/${contractorId}`,
11
12
  archive: contractorId => `${backendUrl}/saas/contractor/${contractorId}/archive`,
12
13
  restore: contractorId => `${backendUrl}/saas/contractor/${contractorId}/restore`,
@@ -17,6 +18,8 @@ const Endpoints = {
17
18
  requestNewCoiExpired: requestId => `${backendUrl}/saas/coi/${requestId}/expired`,
18
19
  muteNotifications: `${backendUrl}/saas/record/notifications/mute`,
19
20
  unmuteNotifications: `${backendUrl}/saas/record/notifications/unmute`,
21
+ unsubscribe: `${backendUrl}/record/email/unsubscribe`,
22
+ subscribe: `${backendUrl}/record/email/subscribe`,
20
23
  changeRequirement: `${backendUrl}/saas/contractor/requirement`,
21
24
  updateVendorExpiryDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/expiry-date`,
22
25
  updateContractorInviteDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/invite-date`,
@@ -28,7 +31,8 @@ const Endpoints = {
28
31
  linkedProjectsCount: recordId => `${backendUrl}/saas/record/count/${recordId}/linked-projects`,
29
32
  verifyInviteLink: encryptedData => `${backendUrl}/vendor-app/verify-link?data=${encryptedData}`,
30
33
  getBasicDetailsById: recordId => `${backendUrl}/jcsc/record/${recordId}`,
31
- getRecordsFromInsuredName: (insuredName, accountIds) => `${backendUrl}/jcsc/record/insured-name/${insuredName}?accountIds=${accountIds}`
34
+ getRecordsFromInsuredName: (insuredName, accountIds) => `${backendUrl}/jcsc/record/insured-name/${insuredName}?accountIds=${accountIds}`,
35
+ linkDraftRequest: `${backendUrl}/saas/account/record/link-draft`
32
36
  };
33
37
 
34
38
  const getContractorsByAccountId = (params, context) => {
@@ -43,6 +47,10 @@ const getRecordHistory = (contractorId, context) => {
43
47
  return requests.getRequestHandler(Endpoints.getRecordHistory(contractorId), {}, context);
44
48
  };
45
49
 
50
+ const getRecordOcrStatus = (contractorId, context) => {
51
+ return requests.getRequestHandler(Endpoints.getRecordOcrStatus(contractorId), {}, context);
52
+ };
53
+
46
54
  const deleteByContractorId = (contractorId, context) => {
47
55
  return requests.deleteRequestHandler(Endpoints.delete(contractorId), context);
48
56
  };
@@ -69,6 +77,14 @@ const unmuteNotifications = (recordModifyDateVerificationModel, context) => {
69
77
  return requests.postRequestHandler(Endpoints.unmuteNotifications, recordModifyDateVerificationModel, context);
70
78
  };
71
79
 
80
+ const unsubscribe = subscriptionModel => {
81
+ return requests.postRequestHandler(Endpoints.unsubscribe, subscriptionModel);
82
+ };
83
+
84
+ const subscribe = subscriptionModel => {
85
+ return requests.postRequestHandler(Endpoints.subscribe, subscriptionModel);
86
+ };
87
+
72
88
  const changeRequirement = (recordModifyDateVerificationModel, context) => {
73
89
  return requests.putRequestHandler(Endpoints.changeRequirement, recordModifyDateVerificationModel, context);
74
90
  };
@@ -150,12 +166,17 @@ const getRecordsFromInsuredName = (insuredName, accountIds) => {
150
166
  return internalRequests.getRequestHandler(Endpoints.getRecordsFromInsuredName(insuredName, accountIdsStr));
151
167
  };
152
168
 
169
+ const linkDraftRequestToAccountRecord = async (linkRequestModel, context) => {
170
+ return requests.postRequestHandler(Endpoints.linkDraftRequest, linkRequestModel, context);
171
+ };
172
+
153
173
  module.exports = {
154
174
  changeRequirement,
155
175
  assignRequirement,
156
176
  getContractorsByAccountId,
157
177
  getContractorById,
158
178
  getRecordHistory,
179
+ getRecordOcrStatus,
159
180
  deleteByContractorId,
160
181
  archiveRecord,
161
182
  restoreRecord,
@@ -171,9 +192,12 @@ module.exports = {
171
192
  resendInvitation,
172
193
  muteNotifications,
173
194
  unmuteNotifications,
195
+ unsubscribe,
196
+ subscribe,
174
197
  getLinkedProjectsCount,
175
198
  updateLastInviteActionDate,
176
199
  getInviteLinkStatus,
177
200
  getBasicDetailsById,
178
- getRecordsFromInsuredName
201
+ getRecordsFromInsuredName,
202
+ linkDraftRequestToAccountRecord
179
203
  };
@@ -4,11 +4,12 @@ const { validateType } = require('../../../../common/validations/typeValidations
4
4
  const { RecordModifyDateVerificationModel } = require('../models/verification.contractor.model');
5
5
  const { AssignRequirementModel } = require('../models/assign.requirement.model');
6
6
  const { ContractorDetailsModel } = require('../models/edit.contractor.model');
7
+ const { LinkRequestModel } = require('../models/link.request.model');
8
+ const { SubscriptionModel } = require('../models/subscription.contractor.model');
7
9
  const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
8
10
  const { waitFor } = require('../../../../common/utils/timeUtils');
9
11
  const activationStatuses = require('../../../../common/consts/activationStatuses');
10
12
  const utils = require('../utils');
11
- const requestService = require('../../requests/api/requests.service');
12
13
 
13
14
  const getContractorsByAccountId = async (accountId, context, activationStatus = null) => {
14
15
  if (activationStatus) {
@@ -26,6 +27,10 @@ const getRecordHistory = (contractorId, context) => {
26
27
  return contractorsAPI.getRecordHistory(contractorId, context);
27
28
  };
28
29
 
30
+ const getRecordOcrStatus = (recordId, context) => {
31
+ return contractorsAPI.getRecordOcrStatus(recordId, context);
32
+ };
33
+
29
34
  const archiveRecord = (recordVerificationModel, context) => {
30
35
  validateType(recordVerificationModel, RecordModifyDateVerificationModel);
31
36
  return contractorsAPI.archiveRecord(recordVerificationModel, context);
@@ -100,11 +105,59 @@ const muteNotifications = (recordModifyDateVerificationModel, context) => {
100
105
  return contractorsAPI.muteNotifications(recordModifyDateVerificationModel, context);
101
106
  };
102
107
 
108
+ const muteNotificationsByRecordId = async (recordId, context) => {
109
+ const recordModifyDateVerificationModel = await getRecordVerificationModel(recordId, context);
110
+ const muteResponse = await contractorsAPI.muteNotifications(recordModifyDateVerificationModel, context);
111
+
112
+ if (muteResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
113
+ throw new Error(`Failed to mute record: ${muteResponse.statusText}`);
114
+ }
115
+
116
+ return muteResponse;
117
+ };
118
+
103
119
  const unmuteNotifications = (recordModifyDateVerificationModel, context) => {
104
120
  validateType(recordModifyDateVerificationModel, RecordModifyDateVerificationModel);
105
121
  return contractorsAPI.unmuteNotifications(recordModifyDateVerificationModel, context);
106
122
  };
107
123
 
124
+ const unmuteNotificationsByRecordId = async (recordId, context) => {
125
+ const recordModifyDateVerificationModel = await getRecordVerificationModel(recordId, context);
126
+ const unmuteResponse = await contractorsAPI.unmuteNotifications(recordModifyDateVerificationModel, context);
127
+
128
+ if (unmuteResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
129
+ throw new Error(`Failed to unmute record: ${unmuteResponse.statusText}`);
130
+ }
131
+
132
+ return unmuteResponse;
133
+ };
134
+
135
+ const unsubscribe = async (subscriptionModel, { expectError } = {}) => {
136
+ validateType(subscriptionModel, SubscriptionModel);
137
+ const unsubscribeResponse = await contractorsAPI.unsubscribe(subscriptionModel);
138
+
139
+ if (unsubscribeResponse.status !== httpResponseStatusCodes.OK && !expectError) {
140
+ throw new Error(`Failed to unsubscribe record: ${unsubscribeResponse.statusText}`);
141
+ }
142
+
143
+ return unsubscribeResponse;
144
+ };
145
+
146
+ const subscribe = async (subscriptionModel, { expectError } = {}) => {
147
+ validateType(subscriptionModel, SubscriptionModel);
148
+ const subscribeResponse = await contractorsAPI.subscribe(subscriptionModel);
149
+
150
+ if (subscribeResponse.status !== httpResponseStatusCodes.OK && !expectError) {
151
+ throw new Error(`Failed to subscribe record: ${subscribeResponse.statusText}`);
152
+ }
153
+
154
+ return subscribeResponse;
155
+ };
156
+
157
+ const getSubscriptionModel = (data, { recaptchaResponse = 'recaptchaResponse' } = {}) => {
158
+ return new SubscriptionModel(data, recaptchaResponse);
159
+ };
160
+
108
161
  const deleteByContractorId = (contractorId, context) => {
109
162
  return contractorsAPI.deleteByContractorId(contractorId, context);
110
163
  };
@@ -210,11 +263,23 @@ const getRecordsFromInsuredName = async (insuredName, accountIds) => {
210
263
  return response.data;
211
264
  };
212
265
 
266
+ const linkDraftRequestToAccountRecord = async (requestToLink, targetAccountRecord, context, { shouldExpectError } = {}) => {
267
+ const linkRequestModel = new LinkRequestModel(requestToLink, targetAccountRecord);
268
+ const linkRequestResponse = await contractorsAPI.linkDraftRequestToAccountRecord(linkRequestModel, context);
269
+
270
+ if (linkRequestResponse.status !== httpResponseStatusCodes.OK && !shouldExpectError) {
271
+ throw Error(`Failed to link request - ${requestToLink.id} to accountRecord ${targetAccountRecord.id}\n${linkRequestResponse}`);
272
+ } else {
273
+ return linkRequestResponse;
274
+ }
275
+ };
276
+
213
277
  module.exports = {
214
278
  changeRequirement,
215
279
  getContractorsByAccountId,
216
280
  getContractorById,
217
281
  getRecordHistory,
282
+ getRecordOcrStatus,
218
283
  archiveRecord,
219
284
  restoreRecord,
220
285
  editContractor,
@@ -228,7 +293,12 @@ module.exports = {
228
293
  requestNewCoiExpired,
229
294
  resendInvitation,
230
295
  muteNotifications,
296
+ muteNotificationsByRecordId,
231
297
  unmuteNotifications,
298
+ unmuteNotificationsByRecordId,
299
+ unsubscribe,
300
+ subscribe,
301
+ getSubscriptionModel,
232
302
  deleteByContractorId,
233
303
  deleteAllRecordsInAccount,
234
304
  deleteAllActiveRecordsInAccount,
@@ -243,5 +313,6 @@ module.exports = {
243
313
  getInviteLinkStatus,
244
314
  getContractorDetailsModel,
245
315
  getBasicDetailsById,
246
- getRecordsFromInsuredName
316
+ getRecordsFromInsuredName,
317
+ linkDraftRequestToAccountRecord
247
318
  };
@@ -1,13 +1,15 @@
1
1
  const { validateType } = require('../../../../common/validations/typeValidations');
2
2
 
3
3
  class ContractorModel {
4
- constructor(contractorId, recordType, company, emailAddress, additionalDetails) {
4
+ constructor(contractorId, recordType, company, emailAddress, additionalDetails, { dateModified, contractorOverrideDateModified } = {}) {
5
5
  validateType(additionalDetails, ContractorDetailsModel);
6
6
 
7
7
  this.contractorId = contractorId;
8
8
  this.recordType = recordType;
9
9
  this.company = company;
10
10
  this.emailAddress = emailAddress;
11
+ this.dateModified = dateModified;
12
+ this.contractorOverrideDateModified = contractorOverrideDateModified;
11
13
 
12
14
  for (const detail in additionalDetails) {
13
15
  if (additionalDetails[detail]) {
@@ -0,0 +1,10 @@
1
+ class LinkRequestModel {
2
+ constructor(requestToLink, targetAccountRecord) {
3
+ this.request = requestToLink;
4
+ this.accountRecord = targetAccountRecord;
5
+ }
6
+ }
7
+
8
+ module.exports = {
9
+ LinkRequestModel
10
+ };
@@ -0,0 +1,13 @@
1
+ class SubscriptionModel {
2
+ constructor(
3
+ data,
4
+ recaptchaResponse
5
+ ) {
6
+ this.data = data;
7
+ this.recaptchaResponse = recaptchaResponse;
8
+ }
9
+ }
10
+
11
+ module.exports = {
12
+ SubscriptionModel
13
+ };
@@ -137,11 +137,20 @@ const waitForMail = async (emailModel, { maxSecondToWait = 30 } = {}) => {
137
137
  return foundMails;
138
138
  };
139
139
 
140
+ const getSubscriptionData = async function(recipients) {
141
+ const regex = util.getUnsubscribeButtonUrlRegex();
142
+ const unsubscribeButtonUrl = await getLastMessage({ recipients, regex, returnType: 'url' });
143
+
144
+ const data = util.getEncryptedDataFromLink(unsubscribeButtonUrl);
145
+ return decodeURIComponent(data);
146
+ };
147
+
140
148
  module.exports = {
141
149
  util,
142
150
  waitForMail,
143
151
  getAllMessages,
144
152
  getLastMessage,
153
+ getSubscriptionData,
145
154
  deleteMultipleMessages,
146
155
  deleteAllMessages
147
156
  };
@@ -66,9 +66,13 @@ const getMailActionButtonUrlRegex = () => {
66
66
  return /(https:\/\/[a-zA-Z0-9.].*[a-zA-Z.]+\/CheckCustomersInviteLinkJSON\?data=[^"]+)/g;
67
67
  };
68
68
 
69
- const getEncryptedDataFromLink = link => {
69
+ const getUnsubscribeButtonUrlRegex = () => {
70
+ return /(\/[a-zA-Z0-9.].*[a-zA-Z.]+\/vendor-app\/email\/unsubscribe\?data=[^"]+)/g;
71
+ };
72
+
73
+ const getEncryptedDataFromLink = (link, { removeLastTwoCharts } = {}) => {
70
74
  const encryptedData = link.split('data=').pop();
71
- return encryptedData.slice(0, -2);
75
+ return removeLastTwoCharts ? encryptedData.slice(0, -2) : encryptedData;
72
76
  };
73
77
 
74
78
  module.exports = {
@@ -78,5 +82,6 @@ module.exports = {
78
82
  logRetrievedEmailInfo,
79
83
  getEmailTextInSubject,
80
84
  getMailActionButtonUrlRegex,
85
+ getUnsubscribeButtonUrlRegex,
81
86
  getEncryptedDataFromLink
82
87
  };
@@ -37,7 +37,8 @@ const XlsxReportTypes = {
37
37
  USER_MANAGEMENT_REPORT: 'UserManagementReport',
38
38
  COVERAGE_GAPS_REPORT: 'CoverageGapsReport',
39
39
  EXPIRING_RECORDS_REPORT: 'ExpiringRecordsReport',
40
- COMPLIANCE_STATUS_BY_POLICY_REPORT: 'ComplianceStatusByPolicy'
40
+ COMPLIANCE_STATUS_BY_POLICY_REPORT: 'ComplianceStatusByPolicy',
41
+ NOT_COMPLIANT_REPORT: 'NotCompliantReport'
41
42
  };
42
43
 
43
44
  const ScheduledReportFrequency = {
@@ -8,6 +8,7 @@ const Endpoints = {
8
8
  edit: contractorId => `${backendUrl}/saas/requests/${contractorId}/update`,
9
9
  saveDraftRequest: `${backendUrl}/saas/requests/draft/save`,
10
10
  activateDraftRequest: `${backendUrl}/saas/requests/draft/activate`,
11
+ draftRequestList: `${backendUrl}/saas/requests/draft`,
11
12
  getById: requestId => `${backendUrl}/saas/request/${requestId}`,
12
13
  getAccountRequests: accountId => `${backendUrl}/saas/requests/${accountId}`,
13
14
  getByTabId: `${backendUrl}/saas/requests`,
@@ -16,7 +17,10 @@ const Endpoints = {
16
17
  getAutocompleteAutoSelect: `${backendUrl}/saas/request/auto/selection`,
17
18
  getTabTenantRequestsInProject: projectId => `${backendUrl}/saas/project/${projectId}/tenants/companies`,
18
19
  innerPageRequests: `${backendUrl}/saas/requests/chart-filter`,
19
- homePageRequests: `${backendUrl}/saas/requests/actionable`
20
+ homePageRequests: `${backendUrl}/saas/requests/actionable`,
21
+ draftFilterCounters: tabId => `${backendUrl}/saas/tab/${tabId}/requests/draft/filter/counter`,
22
+ activityStatusCounter: tabId => `${backendUrl}/saas/tab/${tabId}/requests/activity-status/count`,
23
+ requestsCounters: tabId => `${backendUrl}/saas/tab/${tabId}/requests/counters`
20
24
  };
21
25
 
22
26
  const createRequest = (createRequestModel, context) => {
@@ -57,8 +61,8 @@ const getRequestsByAccountId = (accountId, context, params) => {
57
61
  return requests.getRequestHandler(Endpoints.getAccountRequests(accountId), params, context);
58
62
  };
59
63
 
60
- const getRequestsByTabId = (tabId, context, activityStatus) => {
61
- const body = { tabId, activityStatus };
64
+ const getRequestsByTabId = (tabId, context, activityStatus, sortBy = null, filterByStatus = null, filterByExpiryStatus = null, filterByResponsivenessStatus = null) => {
65
+ const body = { tabId, activityStatus, sortBy, filterByStatus, filterByExpiryStatus, filterByResponsivenessStatus };
62
66
  return requests.postRequestHandler(Endpoints.getByTabId, body, context);
63
67
  };
64
68
 
@@ -78,6 +82,22 @@ const getHomePageRequests = (requestListCriteriaModel, context) => {
78
82
  return requests.postRequestHandler(Endpoints.homePageRequests, requestListCriteriaModel, context);
79
83
  };
80
84
 
85
+ const getDraftRequestList = (draftRequestCriteriaModel, context) => {
86
+ return requests.postRequestHandler(Endpoints.draftRequestList, draftRequestCriteriaModel, context);
87
+ };
88
+
89
+ const getDraftFilterCountersByTabId = (tabId, context) => {
90
+ return requests.getRequestHandler(Endpoints.draftFilterCounters(tabId), {}, context);
91
+ };
92
+
93
+ const getActivityStatusCounterByTabId = (tabId, context) => {
94
+ return requests.getRequestHandler(Endpoints.activityStatusCounter(tabId), {}, context);
95
+ };
96
+
97
+ const getRequestsCountersByTabId = (tabId, context) => {
98
+ return requests.getRequestHandler(Endpoints.requestsCounters(tabId), {}, context);
99
+ };
100
+
81
101
  module.exports = {
82
102
  createRequest,
83
103
  addRequestToRecord,
@@ -92,5 +112,9 @@ module.exports = {
92
112
  getAutocompleteAutoSelect,
93
113
  getTabTenantRequestsInProject,
94
114
  getInnerPageRequests,
95
- getHomePageRequests
115
+ getHomePageRequests,
116
+ getDraftRequestList,
117
+ getDraftFilterCountersByTabId,
118
+ getActivityStatusCounterByTabId,
119
+ getRequestsCountersByTabId
96
120
  };
@@ -1,10 +1,12 @@
1
1
  const requestsAPI = require('./requests.api');
2
2
  const { CreateRequestModel, ContractorInfo } = require('../models/create.request.model');
3
+ const { DraftRequestCriteriaModel } = require('../models/draft.request.criteria.model');
3
4
  const { RequestListCriteriaModel } = require('../models/requestListCriteriaModel');
4
5
  const { DraftRequestReportModel } = require('../models/draft.request.report.model');
5
6
  const { RequestModel } = require('../models/edit.request.model');
6
7
  const { validateType } = require('../../../../common/validations/typeValidations');
7
8
  const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
9
+ const activationStatuses = require('../../../../common/consts/activationStatuses');
8
10
 
9
11
  const createRequest = async (createRequestModel, context) => {
10
12
  validateType(createRequestModel, CreateRequestModel);
@@ -30,7 +32,7 @@ const activateDraftRequest = (draftRequestReportModel, context) => {
30
32
  return requestsAPI.activateDraftRequest(draftRequestReportModel, context);
31
33
  };
32
34
 
33
- const activateByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified } = {}) => {
35
+ const activateByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified, shouldSucceed = true } = {}) => {
34
36
  const emailAddress = email || request.record.emailAddress;
35
37
  const selectedRequirementsId = requirementId || request.record.requirementId;
36
38
  const additionalEmails = additionalEmailList || request.record.additionalEmails;
@@ -47,7 +49,13 @@ const activateByRequest = async (request, context, { email, requirementId, addit
47
49
  }
48
50
  );
49
51
 
50
- return activateDraftRequest(draftRequestReportModel, context);
52
+ const activationResponse = await activateDraftRequest(draftRequestReportModel, context);
53
+
54
+ if (activationResponse.status !== httpResponseStatusCodes.NO_CONTENT && shouldSucceed) {
55
+ throw Error(`Failed to activate record: ${activationResponse.data}`);
56
+ }
57
+
58
+ return activationResponse;
51
59
  };
52
60
 
53
61
  const saveDraftRequest = (draftRequestReportModel, context) => {
@@ -86,8 +94,8 @@ const getAutocompleteAutoSelect = async (params, context) => {
86
94
  return autoSelectedRequest.data;
87
95
  };
88
96
 
89
- const getRequestsByTabId = (tabId, context, activityStatus = 'Active') => {
90
- return requestsAPI.getRequestsByTabId(tabId, context, activityStatus);
97
+ const getRequestsByTabId = (tabId, context, activityStatus = activationStatuses.ACTIVE, sortBy = null, filterByStatus = null, filterByExpiryStatus = null, filterByResponsivenessStatus = null) => {
98
+ return requestsAPI.getRequestsByTabId(tabId, context, activityStatus, sortBy, filterByStatus, filterByExpiryStatus, filterByResponsivenessStatus);
91
99
  };
92
100
 
93
101
  const getRequestById = (requestId, context) => {
@@ -104,7 +112,7 @@ const getRequestsByAccountId = (accountId, context, activationStatus) => {
104
112
  return requestsAPI.getRequestsByAccountId(accountId, context, params);
105
113
  };
106
114
 
107
- const getCreateRequestModel = (requirementId, contractor, { tabId, publicLink, sendMail, requirementDateModified, isDraft } = {}) => {
115
+ const getCreateRequestModel = (requirementId, contractor, { tabId, publicLink, requirementDateModified, isDraft } = {}) => {
108
116
  const { recordType, email, companyName, additionalEmails } = contractor;
109
117
  const contractorInfoModel = new ContractorInfo(recordType, email, companyName, additionalEmails, isDraft);
110
118
 
@@ -115,13 +123,12 @@ const getCreateRequestModel = (requirementId, contractor, { tabId, publicLink, s
115
123
  {
116
124
  tabId,
117
125
  publicLink,
118
- sendMail,
119
126
  requirementDateModified
120
127
  }
121
128
  );
122
129
  };
123
130
 
124
- const getOrCreateRequest = async (context, tabId, requirementId, contractor, activationStatus, { sendMail, requirementDateModified } = {}) => {
131
+ const getOrCreateRequest = async (context, tabId, requirementId, contractor, activationStatus, { requirementDateModified } = {}) => {
125
132
  const { data: existingRequests } = await getRequestsByTabId(tabId, context, activationStatus);
126
133
 
127
134
  const filteredRequests = Array.isArray(existingRequests) ? existingRequests.filter(({ record }) =>
@@ -133,7 +140,7 @@ const getOrCreateRequest = async (context, tabId, requirementId, contractor, act
133
140
 
134
141
  const isDraft = activationStatus === 'Draft' ? true : false;
135
142
 
136
- const createContractorModel = getCreateRequestModel(requirementId, contractor, { tabId, sendMail, requirementDateModified, isDraft });
143
+ const createContractorModel = getCreateRequestModel(requirementId, contractor, { tabId, requirementDateModified, isDraft });
137
144
  const createContractorResponse = await createRequest(createContractorModel, context);
138
145
  return createContractorResponse.data;
139
146
  };
@@ -195,6 +202,47 @@ const getRequestByName = async (recordName, tabId, context) => {
195
202
  return request;
196
203
  };
197
204
 
205
+ const getDraftRequestList = async (draftRequestCriteriaModel, context) => {
206
+ validateType(draftRequestCriteriaModel, DraftRequestCriteriaModel);
207
+ const response = await requestsAPI.getDraftRequestList(draftRequestCriteriaModel, context);
208
+
209
+ if (response.status !== httpResponseStatusCodes.OK) {
210
+ throw Error(`Failed to get draft request list - ${response.status}`);
211
+ }
212
+
213
+ return response.data;
214
+ };
215
+
216
+ const getDraftFilterCountersByTabId = async (tabId, context) => {
217
+ const response = await requestsAPI.getDraftFilterCountersByTabId(tabId, context);
218
+
219
+ if (response.status !== httpResponseStatusCodes.OK) {
220
+ throw Error(`Failed to get the draft filter counters - ${response.status}`);
221
+ }
222
+
223
+ return response.data;
224
+ };
225
+
226
+ const getActivityStatusCounterByTabId = async (tabId, context) => {
227
+ const response = await requestsAPI.getActivityStatusCounterByTabId(tabId, context);
228
+
229
+ if (response.status !== httpResponseStatusCodes.OK) {
230
+ throw Error(`Failed to get the requests counter by activity status - ${response.status}`);
231
+ }
232
+
233
+ return response.data;
234
+ };
235
+
236
+ const getRequestsCountersByTabId = async (tabId, context) => {
237
+ const response = await requestsAPI.getRequestsCountersByTabId(tabId, context);
238
+
239
+ if (response.status !== httpResponseStatusCodes.OK) {
240
+ throw Error(`Failed to get requests counter - ${response.status}`);
241
+ }
242
+
243
+ return response.data;
244
+ };
245
+
198
246
  module.exports = {
199
247
  createRequest,
200
248
  getAutocompleteAutoSelect,
@@ -216,5 +264,9 @@ module.exports = {
216
264
  getInnerPageRequests,
217
265
  getHomePageRequests,
218
266
  getAllRequestsByName,
219
- getRequestByName
267
+ getRequestByName,
268
+ getDraftRequestList,
269
+ getDraftFilterCountersByTabId,
270
+ getActivityStatusCounterByTabId,
271
+ getRequestsCountersByTabId
220
272
  };
@@ -4,6 +4,7 @@ const { TenantRequestModel, RequestModel, TabModel } = require('./models/edit.re
4
4
  const { CreateRequestModel, ContractorInfo } = require('./models/create.request.model');
5
5
  const { RequestListCriteriaModel } = require('./models/requestListCriteriaModel');
6
6
  const { DraftRequestReportModel } = require('./models/draft.request.report.model');
7
+ const { DraftRequestCriteriaModel } = require('./models/draft.request.criteria.model');
7
8
 
8
9
  const models = {
9
10
  TenantRequestModel,
@@ -12,6 +13,7 @@ const models = {
12
13
  CreateRequestModel,
13
14
  ContractorInfo,
14
15
  DraftRequestReportModel,
16
+ DraftRequestCriteriaModel,
15
17
  RequestListCriteriaModel
16
18
  };
17
19
 
@@ -6,11 +6,10 @@ const { validateType, validateDateString } = require('../../../../common/validat
6
6
  const superUserEmail = credentials.superUser;
7
7
 
8
8
  class CreateRequestModel {
9
- constructor(requirementId, inviterEmail, vendorInfo, { tabId = null, sendMail = false, publicLink, requirementDateModified } = {}) {
9
+ constructor(requirementId, inviterEmail, vendorInfo, { tabId = null, publicLink, requirementDateModified } = {}) {
10
10
  this.reqId = requirementId;
11
11
  this.inviterEmail = inviterEmail || superUserEmail;
12
12
  this.vendorInfo = vendorInfo;
13
- this.disableMail = !sendMail;
14
13
  this.tabId = tabId;
15
14
  this.publicLink = publicLink;
16
15
  this.dateModified = requirementDateModified;
@@ -0,0 +1,18 @@
1
+ class DraftRequestCriteriaModel {
2
+ constructor(tabId, {
3
+ draftCompletionStatusesFilter = [],
4
+ sortBy = null,
5
+ pageNumber = 1,
6
+ isDescending = true
7
+ } = {}) {
8
+ this.tabId = tabId;
9
+ this.draftCompletionStatusesFilter = draftCompletionStatusesFilter;
10
+ this.sortBy = sortBy;
11
+ this.pageNumber = pageNumber;
12
+ this.isDescending = isDescending;
13
+ }
14
+ }
15
+
16
+ module.exports = {
17
+ DraftRequestCriteriaModel
18
+ };
package/.npmrc.bak DELETED
@@ -1,2 +0,0 @@
1
- @getjones:registry=https://registry.npmjs.org/
2
- //registry.npmjs.org/:_authToken=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
package/package.json.bak DELETED
@@ -1,30 +0,0 @@
1
- {
2
- "name": "@getjones/test-infra",
3
- "version": "3.0.0",
4
- "description": "Providing internal and openapi interface",
5
- "main": "src/index.js",
6
- "scripts": {
7
- "test": "mocha \"./tests/**/*.test.js\" --slow 3000 --timeout 10000 --exit --inlineDiffs --bail",
8
- "eslint-fix": "eslint \"./src/**/*.js\" --fix"
9
- },
10
- "author": "",
11
- "license": "ISC",
12
- "dependencies": {
13
- "axios": "^0.21.1",
14
- "axios-file": "^1.0.17",
15
- "chai": "^4.3.4",
16
- "dotenv": "^8.2.0",
17
- "enum": "^3.0.4",
18
- "form-data": "^4.0.0",
19
- "mocha": "^8.3.2"
20
- },
21
- "devDependencies": {
22
- "babel-eslint": "^10.0.3",
23
- "eslint": "^6.8.0",
24
- "eslint-plugin-import": "^2.19.1",
25
- "mocha-spec-json-output-reporter": "^1.1.7"
26
- },
27
- "directories": {
28
- "test": "tests"
29
- }
30
- }