@spottoai/types-package 1.0.2-beta.406 → 1.0.2-beta.408

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 (32) hide show
  1. package/dist/azure/reportEvidence.d.ts +516 -0
  2. package/dist/azure/reportEvidence.d.ts.map +1 -0
  3. package/dist/azure/reportEvidence.js +17 -0
  4. package/dist/azure/reportEvidence.js.map +1 -0
  5. package/dist/azure/reportEvidenceValidation.d.ts +5 -0
  6. package/dist/azure/reportEvidenceValidation.d.ts.map +1 -0
  7. package/dist/azure/reportEvidenceValidation.js +385 -0
  8. package/dist/azure/reportEvidenceValidation.js.map +1 -0
  9. package/dist/azure/reportEvidenceValidationHelpers.d.ts +27 -0
  10. package/dist/azure/reportEvidenceValidationHelpers.d.ts.map +1 -0
  11. package/dist/azure/reportEvidenceValidationHelpers.js +134 -0
  12. package/dist/azure/reportEvidenceValidationHelpers.js.map +1 -0
  13. package/dist/environment/validation.d.ts.map +1 -1
  14. package/dist/environment/validation.js +28 -3
  15. package/dist/environment/validation.js.map +1 -1
  16. package/dist/esm/azure/reportEvidence.js +13 -0
  17. package/dist/esm/azure/reportEvidenceValidation.js +378 -0
  18. package/dist/esm/azure/reportEvidenceValidationHelpers.js +106 -0
  19. package/dist/esm/environment/validation.js +29 -4
  20. package/dist/esm/index.js +2 -0
  21. package/dist/events/alertDefinitionRun.d.ts +4 -0
  22. package/dist/events/alertDefinitionRun.d.ts.map +1 -1
  23. package/dist/events/baseAlert.d.ts +1 -0
  24. package/dist/events/baseAlert.d.ts.map +1 -1
  25. package/dist/events/quickAlerts.d.ts +13 -4
  26. package/dist/events/quickAlerts.d.ts.map +1 -1
  27. package/dist/events/quickAlerts.js.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -1
  32. package/package.json +1 -1
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTenantReportEvidencePack = exports.isSubscriptionReportHistory = exports.isSubscriptionReportEvidencePack = void 0;
4
+ const reportEvidence_1 = require("./reportEvidence");
5
+ const reportEvidenceValidationHelpers_1 = require("./reportEvidenceValidationHelpers");
6
+ const isCompactRecommendationResource = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
7
+ (0, reportEvidenceValidationHelpers_1.isString)(value.id) &&
8
+ ['name', 'type', 'resourceGroup', 'location', 'currency', 'currencySymbol'].every(key => (0, reportEvidenceValidationHelpers_1.isOptionalString)(value[key])) &&
9
+ ['spend', 'spendAmortized'].every(key => (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value[key])) &&
10
+ (value.savings === undefined ||
11
+ ((0, reportEvidenceValidationHelpers_1.isRecord)(value.savings) && (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.savings.minAmount) && (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.savings.maxAmount)));
12
+ const isCompactRecommendation = (value) => {
13
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) || !(0, reportEvidenceValidationHelpers_1.isRecord)(value.recommendation) || !Array.isArray(value.resources))
14
+ return false;
15
+ const recommendation = value.recommendation;
16
+ if (!(0, reportEvidenceValidationHelpers_1.isString)(recommendation.id) ||
17
+ !(0, reportEvidenceValidationHelpers_1.isString)(recommendation.title) ||
18
+ recommendation.resolved === true ||
19
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.resourcesCount) ||
20
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.omittedResourceCount) ||
21
+ value.resources.length > reportEvidence_1.REPORT_EVIDENCE_LIMITS.recommendationResources ||
22
+ !value.resources.every(isCompactRecommendationResource) ||
23
+ value.resourcesCount !== value.resources.length + value.omittedResourceCount) {
24
+ return false;
25
+ }
26
+ if (!(0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(recommendation, [
27
+ 'name',
28
+ 'headline',
29
+ 'plainSummary',
30
+ 'bottomLine',
31
+ 'description',
32
+ 'remediation',
33
+ 'impactReason',
34
+ 'effortReason',
35
+ 'potentialBenefits',
36
+ 'considerations',
37
+ 'technicalPlaybook',
38
+ 'category',
39
+ 'subCategory',
40
+ 'impact',
41
+ 'effort',
42
+ 'severity',
43
+ 'risk',
44
+ 'priority',
45
+ 'priorityLabel',
46
+ 'priorityTier',
47
+ 'manualPriority',
48
+ 'costImpactUnit',
49
+ ]) ||
50
+ !(0, reportEvidenceValidationHelpers_1.hasOptionalNumbers)(recommendation, [
51
+ 'effortHours',
52
+ 'costImpact',
53
+ 'potentialMonthlySavings',
54
+ 'confidencePercentage',
55
+ 'adjustedScore',
56
+ 'finalScore',
57
+ 'normalizedScore',
58
+ ]) ||
59
+ !(0, reportEvidenceValidationHelpers_1.isOptionalBoolean)(recommendation.resolved) ||
60
+ !(0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['currency', 'currencySymbol'])) {
61
+ return false;
62
+ }
63
+ return (value.savings === undefined ||
64
+ ((0, reportEvidenceValidationHelpers_1.isRecord)(value.savings) && (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.savings.minAmount) && (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.savings.maxAmount)));
65
+ };
66
+ const isCostSavingsCategory = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
67
+ (0, reportEvidenceValidationHelpers_1.isString)(value.key) &&
68
+ (0, reportEvidenceValidationHelpers_1.isString)(value.label) &&
69
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.recommendationCount) &&
70
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.resourceCount) &&
71
+ ['currentMonthlyCost', 'potentialMonthlyCost', 'minimumMonthlySavings', 'maximumMonthlySavings'].every(key => (0, reportEvidenceValidationHelpers_1.isFiniteNumber)(value[key]));
72
+ const hasRequiredCountKeys = (value, keys) => (0, reportEvidenceValidationHelpers_1.isCountRecord)(value) && keys.every(key => Object.prototype.hasOwnProperty.call(value, key));
73
+ const isRecommendationPortfolio = (value) => {
74
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value))
75
+ return false;
76
+ const impactBands = new Set(['High', 'Medium', 'Low', 'Unknown']);
77
+ const effortBands = new Set(['Low', 'Medium', 'High', 'Unknown']);
78
+ if (!(0, reportEvidenceValidationHelpers_1.isCount)(value.sourceRecommendationCount) ||
79
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.activeRecommendationCount) ||
80
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.resolvedRecommendationCount) ||
81
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.highImpactCount) ||
82
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.quickWinCount) ||
83
+ value.sourceRecommendationCount !== value.activeRecommendationCount + value.resolvedRecommendationCount ||
84
+ value.highImpactCount > value.activeRecommendationCount ||
85
+ value.quickWinCount > value.activeRecommendationCount ||
86
+ !(0, reportEvidenceValidationHelpers_1.isCountRecord)(value.byCategory) ||
87
+ !hasRequiredCountKeys(value.byImpact, ['High', 'Medium', 'Low', 'Unknown']) ||
88
+ !hasRequiredCountKeys(value.byEffort, ['Low', 'Medium', 'High', 'Unknown']) ||
89
+ (0, reportEvidenceValidationHelpers_1.countTotal)(value.byCategory) !== value.activeRecommendationCount ||
90
+ (0, reportEvidenceValidationHelpers_1.countTotal)(value.byImpact) !== value.activeRecommendationCount ||
91
+ (0, reportEvidenceValidationHelpers_1.countTotal)(value.byEffort) !== value.activeRecommendationCount ||
92
+ !Array.isArray(value.impactEffortMatrix) ||
93
+ value.impactEffortMatrix.length !== 16 ||
94
+ !value.impactEffortMatrix.every(row => (0, reportEvidenceValidationHelpers_1.isRecord)(row) &&
95
+ (0, reportEvidenceValidationHelpers_1.isString)(row.impact) &&
96
+ impactBands.has(row.impact) &&
97
+ (0, reportEvidenceValidationHelpers_1.isString)(row.effort) &&
98
+ effortBands.has(row.effort) &&
99
+ (0, reportEvidenceValidationHelpers_1.isCount)(row.count)) ||
100
+ new Set(value.impactEffortMatrix.map(row => `${row.impact}|${row.effort}`)).size !== 16 ||
101
+ value.impactEffortMatrix.reduce((total, row) => total + row.count, 0) !== value.activeRecommendationCount ||
102
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.affectedResources) ||
103
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.affectedResources.count) ||
104
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.affectedResources.identifiedCount) ||
105
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.affectedResources.largestReportedRecommendationCount) ||
106
+ (value.affectedResources.basis !== 'exact' && value.affectedResources.basis !== 'lower-bound')) {
107
+ return false;
108
+ }
109
+ if (value.affectedResources.count < value.affectedResources.identifiedCount ||
110
+ value.affectedResources.count < value.affectedResources.largestReportedRecommendationCount ||
111
+ (value.affectedResources.basis === 'exact' && value.affectedResources.count !== value.affectedResources.identifiedCount)) {
112
+ return false;
113
+ }
114
+ if (value.costSavings === undefined)
115
+ return true;
116
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value.costSavings) || !(0, reportEvidenceValidationHelpers_1.isString)(value.costSavings.currency) || !(0, reportEvidenceValidationHelpers_1.isCount)(value.costSavings.contributingRecommendationCount)) {
117
+ return false;
118
+ }
119
+ const monthly = value.costSavings.monthly;
120
+ const annual = value.costSavings.annual;
121
+ return ((0, reportEvidenceValidationHelpers_1.isRecord)(monthly) &&
122
+ ['currentCost', 'potentialCost', 'minimumSavings', 'maximumSavings'].every(key => (0, reportEvidenceValidationHelpers_1.isFiniteNumber)(monthly[key])) &&
123
+ (0, reportEvidenceValidationHelpers_1.isRecord)(annual) &&
124
+ (0, reportEvidenceValidationHelpers_1.isFiniteNumber)(annual.minimumSavings) &&
125
+ (0, reportEvidenceValidationHelpers_1.isFiniteNumber)(annual.maximumSavings) &&
126
+ (0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.costSavings.categories, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isCostSavingsCategory) &&
127
+ (0, reportEvidenceValidationHelpers_1.isOptionalString)(value.costSavings.currencySymbol) &&
128
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(monthly.minimumSavingsPercent) &&
129
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(monthly.maximumSavingsPercent) &&
130
+ (value.costSavings.basis === undefined ||
131
+ ((0, reportEvidenceValidationHelpers_1.isRecord)(value.costSavings.basis) &&
132
+ (0, reportEvidenceValidationHelpers_1.isString)(value.costSavings.basis.categoryScope) &&
133
+ (0, reportEvidenceValidationHelpers_1.isString)(value.costSavings.basis.projection) &&
134
+ (0, reportEvidenceValidationHelpers_1.isString)(value.costSavings.basis.observedPeriod) &&
135
+ typeof value.costSavings.basis.excludesEstimatedRows === 'boolean' &&
136
+ (0, reportEvidenceValidationHelpers_1.isString)(value.costSavings.basis.appliesTo) &&
137
+ typeof value.costSavings.basis.containsLegacySavings === 'boolean')));
138
+ };
139
+ const isResourceExample = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) && (0, reportEvidenceValidationHelpers_1.isString)(value.name) && (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['type', 'resourceGroup', 'location']);
140
+ const isSnapshot = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) && (0, reportEvidenceValidationHelpers_1.isString)(value.name) && (0, reportEvidenceValidationHelpers_1.isOptionalString)(value.resourceGroup) && (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.createdTime);
141
+ const isAppliedTagCost = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) && (0, reportEvidenceValidationHelpers_1.isString)(value.tagKey) && (0, reportEvidenceValidationHelpers_1.isString)(value.tagValue) && (0, reportEvidenceValidationHelpers_1.isCount)(value.resourceCount) && (0, reportEvidenceValidationHelpers_1.isFiniteNumber)(value.spend30Days);
142
+ const isInventoryResource = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
143
+ (0, reportEvidenceValidationHelpers_1.isString)(value.id) &&
144
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['name', 'type', 'resourceGroup', 'location']) &&
145
+ (0, reportEvidenceValidationHelpers_1.hasOptionalNumbers)(value, ['spend30Days', 'spend30DaysAmortized', 'createdTime']);
146
+ const isInventory = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
147
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.totalResources) &&
148
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.untaggedResourceCount) &&
149
+ value.untaggedResourceCount <= value.totalResources &&
150
+ (0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.untaggedExamples, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isResourceExample) &&
151
+ (0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.snapshots, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isSnapshot) &&
152
+ (0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.appliedTagCosts, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isAppliedTagCost) &&
153
+ (0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.topSpendResources, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isInventoryResource);
154
+ const isPrivilegedAccess = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
155
+ (0, reportEvidenceValidationHelpers_1.isString)(value.principalId) &&
156
+ (0, reportEvidenceValidationHelpers_1.isString)(value.displayName) &&
157
+ (0, reportEvidenceValidationHelpers_1.isString)(value.roleName) &&
158
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['userPrincipalName', 'scope', 'scopeType', 'lastLogonDate', 'mfaStatus']);
159
+ const isGovernance = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
160
+ (0, reportEvidenceValidationHelpers_1.isOptionalString)(value.generatedAt) &&
161
+ (value.coverage === undefined || (0, reportEvidenceValidationHelpers_1.isRecord)(value.coverage)) &&
162
+ (0, reportEvidenceValidationHelpers_1.hasRequiredRecords)(value, ['policySummary', 'rbacSummary', 'globalAdministratorSummary']) &&
163
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(value.complianceRows) &&
164
+ (0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.privilegedAccessRows, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isPrivilegedAccess) &&
165
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(value.findings) &&
166
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(value.limitations);
167
+ const isCommitments = (value) => {
168
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) || !(0, reportEvidenceValidationHelpers_1.isRecord)(value.inventorySummary) || !(0, reportEvidenceValidationHelpers_1.isCountRecord)(value.inventorySummary.statusCounts))
169
+ return false;
170
+ if (!(0, reportEvidenceValidationHelpers_1.isCount)(value.inventorySummary.totalCount) || !(0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.inventory, reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows, isCommitmentInventoryRow)) {
171
+ return false;
172
+ }
173
+ if (value.inventorySummary.totalCount !== value.inventory.totalCount ||
174
+ (0, reportEvidenceValidationHelpers_1.countTotal)(value.inventorySummary.statusCounts) !== value.inventorySummary.totalCount) {
175
+ return false;
176
+ }
177
+ return ['coverage', 'obsoleteCandidates', 'reallocationOpportunities', 'purchaseRecommendations', 'renewals'].every(key => (0, reportEvidenceValidationHelpers_1.isProjectionRows)(value[key]));
178
+ };
179
+ function isCommitmentInventoryRow(value) {
180
+ return ((0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
181
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, [
182
+ 'id',
183
+ 'benefitType',
184
+ 'type',
185
+ 'displayName',
186
+ 'status',
187
+ 'expiryDate',
188
+ 'skuName',
189
+ 'skuDescription',
190
+ 'location',
191
+ 'term',
192
+ ]) &&
193
+ (0, reportEvidenceValidationHelpers_1.hasOptionalNumbers)(value, ['daysToExpiry', 'reservedQuantity']) &&
194
+ (0, reportEvidenceValidationHelpers_1.isOptionalBoolean)(value.renew) &&
195
+ (value.annualCommittedCost === undefined || (0, reportEvidenceValidationHelpers_1.isRecord)(value.annualCommittedCost)) &&
196
+ (value.doNotRenewAnnualImpact === undefined || (0, reportEvidenceValidationHelpers_1.isRecord)(value.doNotRenewAnnualImpact)));
197
+ }
198
+ const isReportingProjection = (value) => {
199
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) || !(0, reportEvidenceValidationHelpers_1.isRecord)(value.dashboard) || !isRecommendationPortfolio(value.recommendationPortfolio))
200
+ return false;
201
+ if (!(0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.recommendations, reportEvidence_1.REPORT_EVIDENCE_LIMITS.currentRecommendations, isCompactRecommendation) ||
202
+ value.recommendations.totalCount !==
203
+ value.recommendationPortfolio.activeRecommendationCount ||
204
+ !(0, reportEvidenceValidationHelpers_1.isProjectionRows)(value.serviceRetirements) ||
205
+ !isInventory(value.inventory) ||
206
+ !isGovernance(value.governance) ||
207
+ !isCommitments(value.commitmentsPlanning)) {
208
+ return false;
209
+ }
210
+ const patch = value.patchManagement;
211
+ const protection = value.dataProtection;
212
+ const health = value.resourceHealth;
213
+ const uptime = value.serverUptime;
214
+ const publicIps = value.publicIpAddresses;
215
+ const activity = value.activity;
216
+ return ((0, reportEvidenceValidationHelpers_1.isRecord)(patch) &&
217
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(patch.machines) &&
218
+ (0, reportEvidenceValidationHelpers_1.isRecord)(protection) &&
219
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(protection.items) &&
220
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(protection.issues) &&
221
+ (0, reportEvidenceValidationHelpers_1.isRecord)(health) &&
222
+ (0, reportEvidenceValidationHelpers_1.isRecord)(health.events) &&
223
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(health.events.events) &&
224
+ (0, reportEvidenceValidationHelpers_1.isRecord)(health.availabilityStatuses) &&
225
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(health.availabilityStatuses.statuses) &&
226
+ (0, reportEvidenceValidationHelpers_1.isRecord)(uptime) &&
227
+ ['workspaces', 'gaps', 'servers'].every(key => (0, reportEvidenceValidationHelpers_1.isProjectionRows)(uptime[key])) &&
228
+ (0, reportEvidenceValidationHelpers_1.isRecord)(publicIps) &&
229
+ (0, reportEvidenceValidationHelpers_1.isProjectionRows)(publicIps.items) &&
230
+ (0, reportEvidenceValidationHelpers_1.isRecord)(activity) &&
231
+ ['changes', 'security', 'health', 'suppressed'].every(key => (0, reportEvidenceValidationHelpers_1.isProjectionRows)(activity[key])));
232
+ };
233
+ const isSubscriptionReportEvidencePack = (value) => {
234
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) || !(0, reportEvidenceValidationHelpers_1.isDateTime)(value.generatedAt)) {
235
+ return false;
236
+ }
237
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value.generation) ||
238
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.scope) ||
239
+ !(0, reportEvidenceValidationHelpers_1.isString)(value.scope.subscriptionId) ||
240
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.coverage) ||
241
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.coverage.sourceFiles) ||
242
+ !(0, reportEvidenceValidationHelpers_1.isStringArray)(value.coverage.gaps) ||
243
+ !Object.values(value.coverage.sourceFiles).every(reportEvidenceValidationHelpers_1.isSourceFileStatus) ||
244
+ !(0, reportEvidenceValidationHelpers_1.isResourceSummary)(value.estate) ||
245
+ !(0, reportEvidenceValidationHelpers_1.isCostSummary)(value.cost) ||
246
+ !(0, reportEvidenceValidationHelpers_1.isRecommendationSummary)(value.recommendations) ||
247
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.security) ||
248
+ !(0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.security.secureScore) ||
249
+ (value.security.governance !== undefined &&
250
+ (!(0, reportEvidenceValidationHelpers_1.isRecord)(value.security.governance) || !(0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.security.governance.findingCount))) ||
251
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.reliability) ||
252
+ !(0, reportEvidenceValidationHelpers_1.isRetirementSummary)(value.reliability.serviceRetirements) ||
253
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.reliability.recommendationCount) ||
254
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.commitments) ||
255
+ !(0, reportEvidenceValidationHelpers_1.isCommitmentExpirySummary)(value.commitments.expiries) ||
256
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.performance) ||
257
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.performance.recommendationCount) ||
258
+ !(0, reportEvidenceValidationHelpers_1.isStringArray)(value.performance.topRecommendationIds) ||
259
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.operationalExcellence) ||
260
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.operationalExcellence.recommendationCount) ||
261
+ !(0, reportEvidenceValidationHelpers_1.isTagCoverage)(value.operationalExcellence.tagCoverage) ||
262
+ !isReportingProjection(value.reporting) ||
263
+ !Array.isArray(value.evidence) ||
264
+ !value.evidence.every(reportEvidenceValidationHelpers_1.isEvidenceReference)) {
265
+ return false;
266
+ }
267
+ if (!(0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value.generation, ['sourceRunId', 'sourceGeneratedAt']) ||
268
+ !(0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value.scope, ['companyId', 'tenantId', 'displayName', 'currency', 'currencySymbol'])) {
269
+ return false;
270
+ }
271
+ return (value.reliability.relationshipGraph === undefined ||
272
+ ((0, reportEvidenceValidationHelpers_1.isRecord)(value.reliability.relationshipGraph) &&
273
+ (0, reportEvidenceValidationHelpers_1.hasOptionalNumbers)(value.reliability.relationshipGraph, ['totalNodes', 'totalEdges', 'unresolvedCount', 'buildMs'])));
274
+ };
275
+ exports.isSubscriptionReportEvidencePack = isSubscriptionReportEvidencePack;
276
+ const isRecommendationFingerprint = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
277
+ (0, reportEvidenceValidationHelpers_1.isString)(value.id) &&
278
+ (0, reportEvidenceValidationHelpers_1.isString)(value.title) &&
279
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['category', 'impact', 'severity', 'currency']) &&
280
+ (0, reportEvidenceValidationHelpers_1.isOptionalBoolean)(value.resolved) &&
281
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.affectedResourceCount) &&
282
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.potentialMonthlySavings) &&
283
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.maximumMonthlySavings) &&
284
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.costImpact);
285
+ const isHistoryMetrics = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
286
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['subscriptionName', 'currency', 'currencySymbol']) &&
287
+ (0, reportEvidenceValidationHelpers_1.hasOptionalNumbers)(value, ['secureScore', 'advisorScore', 'spend30Days', 'spend30DaysAmortized']) &&
288
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.resourceCount) &&
289
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.recommendationCount) &&
290
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.impactedResourceCount) &&
291
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.securityRecommendationCount) &&
292
+ (0, reportEvidenceValidationHelpers_1.isCount)(value.securityImpactedResourceCount) &&
293
+ value.securityRecommendationCount <= value.recommendationCount &&
294
+ value.securityImpactedResourceCount <= value.impactedResourceCount &&
295
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(value.maximumMonthlySavings);
296
+ const isSubscriptionReportHistory = (value) => {
297
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) ||
298
+ !(0, reportEvidenceValidationHelpers_1.isString)(value.subscriptionId) ||
299
+ !(0, reportEvidenceValidationHelpers_1.isDateTime)(value.generatedAt) ||
300
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.retention) ||
301
+ value.retention.maxPeriods !== reportEvidence_1.REPORT_EVIDENCE_LIMITS.historyPeriods ||
302
+ !Array.isArray(value.periods) ||
303
+ value.periods.length > reportEvidence_1.REPORT_EVIDENCE_LIMITS.historyPeriods) {
304
+ return false;
305
+ }
306
+ const periods = new Set();
307
+ for (const period of value.periods) {
308
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(period) ||
309
+ !(0, reportEvidenceValidationHelpers_1.isString)(period.period) ||
310
+ !/^\d{4}-(0[1-9]|1[0-2])$/u.test(period.period) ||
311
+ periods.has(period.period) ||
312
+ !(0, reportEvidenceValidationHelpers_1.isString)(period.sourceRunId) ||
313
+ !(0, reportEvidenceValidationHelpers_1.isDateTime)(period.sourceGeneratedAt) ||
314
+ !isHistoryMetrics(period.metrics) ||
315
+ !(0, reportEvidenceValidationHelpers_1.isBoundedRows)(period.recommendations, reportEvidence_1.REPORT_EVIDENCE_LIMITS.historyRecommendations, isRecommendationFingerprint)) {
316
+ return false;
317
+ }
318
+ if (period.recommendations.omittedCount === 0 &&
319
+ period.metrics.recommendationCount !== period.recommendations.rows.filter(row => row.resolved !== true).length) {
320
+ return false;
321
+ }
322
+ periods.add(period.period);
323
+ }
324
+ return true;
325
+ };
326
+ exports.isSubscriptionReportHistory = isSubscriptionReportHistory;
327
+ const isTenantMfaSummary = (value) => {
328
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) || typeof value.countsAreLowerBounds !== 'boolean' || !(0, reportEvidenceValidationHelpers_1.isRecord)(value.enforcement))
329
+ return false;
330
+ const enforcement = value.enforcement;
331
+ const enforcementKeys = ['enforced', 'conditionallyEnforced', 'notEnforced', 'unknown'];
332
+ if (!(0, reportEvidenceValidationHelpers_1.isCount)(value.enumeratedUsers) ||
333
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.activeUsers) ||
334
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.disabledUsers) ||
335
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.assessedActiveUsers) ||
336
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.enforcementKnownUsers) ||
337
+ !(0, reportEvidenceValidationHelpers_1.isCount)(value.enforcementUnknownUsers) ||
338
+ !(0, reportEvidenceValidationHelpers_1.isOptionalString)(value.assessmentState) ||
339
+ !['mfaCapableUsers', 'notMfaCapableUsers', 'unknownRegistrationUsers'].every(key => value[key] === undefined || (0, reportEvidenceValidationHelpers_1.isCount)(value[key])) ||
340
+ Object.keys(enforcement).some(key => !enforcementKeys.includes(key)) ||
341
+ !enforcementKeys.every(key => (0, reportEvidenceValidationHelpers_1.isCount)(enforcement[key]))) {
342
+ return false;
343
+ }
344
+ return (value.enumeratedUsers === value.assessedActiveUsers + value.disabledUsers &&
345
+ value.activeUsers === value.enforcementKnownUsers + value.enforcementUnknownUsers &&
346
+ value.activeUsers === (0, reportEvidenceValidationHelpers_1.countTotal)(enforcement) &&
347
+ value.enforcementUnknownUsers === enforcement.unknown &&
348
+ (value.countsAreLowerBounds || value.assessedActiveUsers === value.activeUsers));
349
+ };
350
+ const isTenantCoverage = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
351
+ Object.values(value).every(section => (0, reportEvidenceValidationHelpers_1.isRecord)(section) &&
352
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(section, ['state', 'source', 'reason', 'message', 'lastAttemptedAt', 'lastSuccessfulAt']) &&
353
+ (section.requiredPermissions === undefined || (0, reportEvidenceValidationHelpers_1.isStringArray)(section.requiredPermissions)) &&
354
+ (!Array.isArray(section.requiredPermissions) || section.requiredPermissions.length <= 10) &&
355
+ (0, reportEvidenceValidationHelpers_1.isOptionalFiniteNumber)(section.maximumSourceLagHours));
356
+ const isTenantPrincipal = (value) => (0, reportEvidenceValidationHelpers_1.isRecord)(value) &&
357
+ (0, reportEvidenceValidationHelpers_1.isString)(value.principalId) &&
358
+ (0, reportEvidenceValidationHelpers_1.isString)(value.principalType) &&
359
+ (0, reportEvidenceValidationHelpers_1.isString)(value.assignmentSource) &&
360
+ (0, reportEvidenceValidationHelpers_1.isStringArray)(value.assignmentModes) &&
361
+ value.assignmentModes.length <= 4 &&
362
+ typeof value.isPimBacked === 'boolean' &&
363
+ (0, reportEvidenceValidationHelpers_1.isString)(value.lastActivatedEvidence) &&
364
+ (0, reportEvidenceValidationHelpers_1.hasOptionalStrings)(value, ['displayName', 'userPrincipalName', 'mfaStatus', 'lastActivatedAt']) &&
365
+ (0, reportEvidenceValidationHelpers_1.isOptionalBoolean)(value.accountEnabled);
366
+ const isTenantReportEvidencePack = (value) => {
367
+ if (!(0, reportEvidenceValidationHelpers_1.isRecord)(value) ||
368
+ !(0, reportEvidenceValidationHelpers_1.isDateTime)(value.generatedAt) ||
369
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.scope) ||
370
+ !(0, reportEvidenceValidationHelpers_1.isString)(value.scope.tenantId) ||
371
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.mfa) ||
372
+ (value.mfa.summary !== undefined && !isTenantMfaSummary(value.mfa.summary)) ||
373
+ (value.mfa.tenantPolicy !== undefined && !(0, reportEvidenceValidationHelpers_1.isRecord)(value.mfa.tenantPolicy)) ||
374
+ (value.mfa.coverage !== undefined && !isTenantCoverage(value.mfa.coverage)) ||
375
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.globalAdmins) ||
376
+ !(0, reportEvidenceValidationHelpers_1.isRecord)(value.globalAdmins.summary) ||
377
+ !isTenantCoverage(value.globalAdmins.coverage) ||
378
+ !(0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.globalAdmins.warnings, reportEvidence_1.REPORT_EVIDENCE_LIMITS.tenantGlobalAdministrators, reportEvidenceValidationHelpers_1.isRecord) ||
379
+ !(0, reportEvidenceValidationHelpers_1.isBoundedRows)(value.globalAdmins.principals, reportEvidence_1.REPORT_EVIDENCE_LIMITS.tenantGlobalAdministrators, isTenantPrincipal)) {
380
+ return false;
381
+ }
382
+ return true;
383
+ };
384
+ exports.isTenantReportEvidencePack = isTenantReportEvidencePack;
385
+ //# sourceMappingURL=reportEvidenceValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportEvidenceValidation.js","sourceRoot":"","sources":["../../src/azure/reportEvidenceValidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type ReportBoundedRows } from './reportEvidence';
2
+ export type JsonRecord = Record<string, unknown>;
3
+ export declare const isRecord: (value: unknown) => value is JsonRecord;
4
+ export declare const isString: (value: unknown) => value is string;
5
+ export declare const isOptionalString: (value: unknown) => boolean;
6
+ export declare const isFiniteNumber: (value: unknown) => value is number;
7
+ export declare const isOptionalFiniteNumber: (value: unknown) => boolean;
8
+ export declare const isOptionalBoolean: (value: unknown) => boolean;
9
+ export declare const isCount: (value: unknown) => value is number;
10
+ export declare const isDateTime: (value: unknown) => value is string;
11
+ export declare const isStringArray: (value: unknown) => value is string[];
12
+ export declare const isCountRecord: (value: unknown) => value is Record<string, number>;
13
+ export declare const countTotal: (value: Record<string, number>) => number;
14
+ export declare const hasOptionalStrings: (value: JsonRecord, keys: readonly string[]) => boolean;
15
+ export declare const hasOptionalNumbers: (value: JsonRecord, keys: readonly string[]) => boolean;
16
+ export declare const isBoundedRows: <T>(value: unknown, limit: number, isRow: (row: unknown) => row is T) => value is ReportBoundedRows<T>;
17
+ export declare const isProjectionRows: (value: unknown, limit?: 50) => boolean;
18
+ export declare const hasRequiredRecords: (value: JsonRecord, keys: readonly string[]) => boolean;
19
+ export declare const isSourceFileStatus: (value: unknown) => boolean;
20
+ export declare const isTagCoverage: (value: unknown) => boolean;
21
+ export declare const isResourceSummary: (value: unknown) => boolean;
22
+ export declare const isCostSummary: (value: unknown) => boolean;
23
+ export declare const isRecommendationSummary: (value: unknown) => boolean;
24
+ export declare const isRetirementSummary: (value: unknown) => boolean;
25
+ export declare const isCommitmentExpirySummary: (value: unknown) => boolean;
26
+ export declare const isEvidenceReference: (value: unknown) => boolean;
27
+ //# sourceMappingURL=reportEvidenceValidationHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportEvidenceValidationHelpers.d.ts","sourceRoot":"","sources":["../../src/azure/reportEvidenceValidationHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UAAkF,CAAC;AACtI,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAA8D,CAAC;AAClH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,OAAiD,CAAC;AACpG,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAA6D,CAAC;AACvH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,OAAuD,CAAC;AAChH,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,OAA4D,CAAC;AAChH,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAwE,CAAC;AAC3H,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAA+D,CAAC;AACrH,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,EAAmD,CAAC;AAClH,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAA2D,CAAC;AACzI,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAyE,CAAC;AACrI,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,EAAE,MAAM,SAAS,MAAM,EAAE,KAAG,OAA0D,CAAC;AAC3I,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,EAAE,MAAM,SAAS,MAAM,EAAE,KAAG,OAAgE,CAAC;AAEjJ,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,OAAO,OAAO,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,IAAI,CAAC,KAAG,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAG/H,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,EAAE,UAAyC,KAAG,OAAgD,CAAC;AAC9I,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,EAAE,MAAM,SAAS,MAAM,EAAE,KAAG,OAAkD,CAAC;AAEnI,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,KAAG,OAKtB,CAAC;AAE/B,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAM0C,CAAC;AAW1F,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,OAeA,CAAC;AAEpD,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OAsB9C,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,OAWtD,CAAC;AAEJ,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,OAalD,CAAC;AAEJ,eAAO,MAAM,yBAAyB,GAAI,OAAO,OAAO,KAAG,OAUxD,CAAC;AAEJ,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,OAKc,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isEvidenceReference = exports.isCommitmentExpirySummary = exports.isRetirementSummary = exports.isRecommendationSummary = exports.isCostSummary = exports.isResourceSummary = exports.isTagCoverage = exports.isSourceFileStatus = exports.hasRequiredRecords = exports.isProjectionRows = exports.isBoundedRows = exports.hasOptionalNumbers = exports.hasOptionalStrings = exports.countTotal = exports.isCountRecord = exports.isStringArray = exports.isDateTime = exports.isCount = exports.isOptionalBoolean = exports.isOptionalFiniteNumber = exports.isFiniteNumber = exports.isOptionalString = exports.isString = exports.isRecord = void 0;
4
+ const reportEvidence_1 = require("./reportEvidence");
5
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ exports.isRecord = isRecord;
7
+ const isString = (value) => typeof value === 'string' && value.trim().length > 0;
8
+ exports.isString = isString;
9
+ const isOptionalString = (value) => value === undefined || (0, exports.isString)(value);
10
+ exports.isOptionalString = isOptionalString;
11
+ const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
12
+ exports.isFiniteNumber = isFiniteNumber;
13
+ const isOptionalFiniteNumber = (value) => value === undefined || (0, exports.isFiniteNumber)(value);
14
+ exports.isOptionalFiniteNumber = isOptionalFiniteNumber;
15
+ const isOptionalBoolean = (value) => value === undefined || typeof value === 'boolean';
16
+ exports.isOptionalBoolean = isOptionalBoolean;
17
+ const isCount = (value) => (0, exports.isFiniteNumber)(value) && Number.isInteger(value) && value >= 0;
18
+ exports.isCount = isCount;
19
+ const isDateTime = (value) => (0, exports.isString)(value) && Number.isFinite(Date.parse(value));
20
+ exports.isDateTime = isDateTime;
21
+ const isStringArray = (value) => Array.isArray(value) && value.every(exports.isString);
22
+ exports.isStringArray = isStringArray;
23
+ const isCountRecord = (value) => (0, exports.isRecord)(value) && Object.values(value).every(exports.isCount);
24
+ exports.isCountRecord = isCountRecord;
25
+ const countTotal = (value) => Object.values(value).reduce((total, count) => total + count, 0);
26
+ exports.countTotal = countTotal;
27
+ const hasOptionalStrings = (value, keys) => keys.every(key => (0, exports.isOptionalString)(value[key]));
28
+ exports.hasOptionalStrings = hasOptionalStrings;
29
+ const hasOptionalNumbers = (value, keys) => keys.every(key => (0, exports.isOptionalFiniteNumber)(value[key]));
30
+ exports.hasOptionalNumbers = hasOptionalNumbers;
31
+ const isBoundedRows = (value, limit, isRow) => {
32
+ if (!(0, exports.isRecord)(value) || !(0, exports.isCount)(value.totalCount) || !(0, exports.isCount)(value.omittedCount) || !Array.isArray(value.rows))
33
+ return false;
34
+ return value.rows.length <= limit && value.rows.every(isRow) && value.totalCount === value.rows.length + value.omittedCount;
35
+ };
36
+ exports.isBoundedRows = isBoundedRows;
37
+ const isProjectionRows = (value, limit = reportEvidence_1.REPORT_EVIDENCE_LIMITS.detailRows) => (0, exports.isBoundedRows)(value, limit, exports.isRecord);
38
+ exports.isProjectionRows = isProjectionRows;
39
+ const hasRequiredRecords = (value, keys) => keys.every(key => (0, exports.isRecord)(value[key]));
40
+ exports.hasRequiredRecords = hasRequiredRecords;
41
+ const isSourceFileStatus = (value) => (0, exports.isRecord)(value) &&
42
+ (0, exports.isString)(value.path) &&
43
+ typeof value.available === 'boolean' &&
44
+ (value.recordCount === undefined || (0, exports.isCount)(value.recordCount)) &&
45
+ (0, exports.isOptionalString)(value.note);
46
+ exports.isSourceFileStatus = isSourceFileStatus;
47
+ const isTagCoverage = (value) => (0, exports.isRecord)(value) &&
48
+ (0, exports.isCount)(value.withTags) &&
49
+ (0, exports.isCount)(value.withoutTags) &&
50
+ (0, exports.isFiniteNumber)(value.coveragePercentage) &&
51
+ Array.isArray(value.topTagKeys) &&
52
+ value.topTagKeys.every(row => (0, exports.isRecord)(row) && (0, exports.isString)(row.key) && (0, exports.isCount)(row.count));
53
+ exports.isTagCoverage = isTagCoverage;
54
+ const isTopSpendResource = (value) => (0, exports.isRecord)(value) &&
55
+ (0, exports.isString)(value.id) &&
56
+ (0, exports.isString)(value.name) &&
57
+ (0, exports.isString)(value.type) &&
58
+ (0, exports.isOptionalString)(value.location) &&
59
+ (0, exports.isFiniteNumber)(value.spend30Days) &&
60
+ (0, exports.isOptionalFiniteNumber)(value.spend30DaysAmortized);
61
+ const isResourceSummary = (value) => (0, exports.isRecord)(value) &&
62
+ (0, exports.isCount)(value.total) &&
63
+ Array.isArray(value.byType) &&
64
+ value.byType.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.summaryDimensions &&
65
+ value.byType.every(row => (0, exports.isRecord)(row) && (0, exports.isString)(row.type) && (0, exports.isCount)(row.count) && (0, exports.isOptionalFiniteNumber)(row.spend30Days)) &&
66
+ Array.isArray(value.byLocation) &&
67
+ value.byLocation.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.summaryDimensions &&
68
+ value.byLocation.every(row => (0, exports.isRecord)(row) && (0, exports.isString)(row.location) && (0, exports.isCount)(row.count) && (0, exports.isOptionalFiniteNumber)(row.spend30Days)) &&
69
+ (0, exports.isRecord)(value.tagCoverage) &&
70
+ (0, exports.isTagCoverage)(value.tagCoverage) &&
71
+ Array.isArray(value.tagCoverage.topTagKeys) &&
72
+ value.tagCoverage.topTagKeys.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.summaryRows &&
73
+ Array.isArray(value.topSpendResources) &&
74
+ value.topSpendResources.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.summaryRows &&
75
+ value.topSpendResources.every(isTopSpendResource);
76
+ exports.isResourceSummary = isResourceSummary;
77
+ const isCostSummary = (value) => {
78
+ if (!(0, exports.isRecord)(value) || !(0, exports.isRecord)(value.sourceMetadata) || !Array.isArray(value.topSpendResources))
79
+ return false;
80
+ if (!(0, exports.hasOptionalStrings)(value, ['currency', 'currencySymbol']) ||
81
+ !(0, exports.hasOptionalNumbers)(value, ['spend30Days', 'spend30DaysAmortized', 'totalRetailCost', 'miscCost', 'rollingCostRecordCount']) ||
82
+ (value.budget !== undefined && !(0, exports.isRecord)(value.budget)) ||
83
+ !(0, exports.isString)(value.sourceMetadata.spend30DaysSource) ||
84
+ !(0, exports.isString)(value.sourceMetadata.spend30DaysAmortizedSource) ||
85
+ !(0, exports.isString)(value.sourceMetadata.totalRetailCostSource) ||
86
+ !(0, exports.isString)(value.sourceMetadata.rollingCostFile) ||
87
+ !(0, exports.isOptionalFiniteNumber)(value.sourceMetadata.rollingCostRecordCount) ||
88
+ !value.topSpendResources.every(isTopSpendResource)) {
89
+ return false;
90
+ }
91
+ return (value.period === undefined ||
92
+ ((0, exports.isRecord)(value.period) &&
93
+ value.period.type === 'rolling_30_days' &&
94
+ (0, exports.isString)(value.period.source) &&
95
+ (0, exports.hasOptionalStrings)(value.period, ['startDate', 'endDate'])));
96
+ };
97
+ exports.isCostSummary = isCostSummary;
98
+ const isRecommendationSummary = (value) => (0, exports.isRecord)(value) &&
99
+ (0, exports.isCount)(value.total) &&
100
+ (0, exports.isCountRecord)(value.byPillar) &&
101
+ (0, exports.isCountRecord)(value.byImpact) &&
102
+ (0, exports.isCountRecord)(value.byEffort) &&
103
+ (0, exports.isStringArray)(value.topRecommendationIds) &&
104
+ value.topRecommendationIds.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.topRecommendationIds &&
105
+ (0, exports.isRecord)(value.topRecommendationIdsByPillar) &&
106
+ Object.values(value.topRecommendationIdsByPillar).every(ids => (0, exports.isStringArray)(ids) && ids.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.topRecommendationIdsPerPillar);
107
+ exports.isRecommendationSummary = isRecommendationSummary;
108
+ const isRetirementSummary = (value) => (0, exports.isRecord)(value) &&
109
+ (0, exports.isCount)(value.total) &&
110
+ (0, exports.isCount)(value.sourceRecordCount) &&
111
+ (0, exports.isCount)(value.excludedUnlinked) &&
112
+ (0, exports.isCount)(value.excludedCommitmentExpiries) &&
113
+ (0, exports.isCount)(value.within180Days) &&
114
+ (0, exports.isCount)(value.expiredOrPastDue) &&
115
+ Array.isArray(value.upcoming) &&
116
+ value.upcoming.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.upcomingEvents &&
117
+ value.upcoming.every(row => (0, exports.isRecord)(row) && (0, exports.isOptionalString)(row.id) && (0, exports.isOptionalString)(row.title) && (0, exports.isOptionalString)(row.retirementDate) && (0, exports.isCount)(row.resourceCount));
118
+ exports.isRetirementSummary = isRetirementSummary;
119
+ const isCommitmentExpirySummary = (value) => (0, exports.isRecord)(value) &&
120
+ (0, exports.isCount)(value.total) &&
121
+ (0, exports.isCount)(value.sourceRecordCount) &&
122
+ (0, exports.isCount)(value.within180Days) &&
123
+ (0, exports.isCount)(value.expiredOrPastDue) &&
124
+ Array.isArray(value.upcoming) &&
125
+ value.upcoming.length <= reportEvidence_1.REPORT_EVIDENCE_LIMITS.upcomingEvents &&
126
+ value.upcoming.every(row => (0, exports.isRecord)(row) && (0, exports.isOptionalString)(row.id) && (0, exports.isOptionalString)(row.title) && (0, exports.isOptionalString)(row.expiryDate) && (0, exports.isCount)(row.resourceCount));
127
+ exports.isCommitmentExpirySummary = isCommitmentExpirySummary;
128
+ const isEvidenceReference = (value) => (0, exports.isRecord)(value) &&
129
+ (0, exports.isString)(value.source) &&
130
+ (0, exports.isString)(value.summary) &&
131
+ (value.value === undefined || ['string', 'number', 'boolean'].includes(typeof value.value)) &&
132
+ (typeof value.value !== 'number' || Number.isFinite(value.value));
133
+ exports.isEvidenceReference = isEvidenceReference;
134
+ //# sourceMappingURL=reportEvidenceValidationHelpers.js.map