@spottoai/types-package 1.0.2-beta.353 → 1.0.2-beta.356

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 (182) hide show
  1. package/README.md +17 -0
  2. package/dist/aws/commitments-planning.d.ts +3 -0
  3. package/dist/aws/commitments-planning.d.ts.map +1 -0
  4. package/dist/aws/commitments-planning.js +6 -0
  5. package/dist/aws/commitments-planning.js.map +1 -0
  6. package/dist/aws/commitmentsPlanningValidation.d.ts.map +1 -1
  7. package/dist/aws/commitmentsPlanningValidation.js +2 -0
  8. package/dist/aws/commitmentsPlanningValidation.js.map +1 -1
  9. package/dist/aws/index.d.ts +2 -0
  10. package/dist/aws/index.d.ts.map +1 -1
  11. package/dist/aws/index.js +2 -0
  12. package/dist/aws/index.js.map +1 -1
  13. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.d.ts +4 -0
  14. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.d.ts.map +1 -0
  15. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.js +513 -0
  16. package/dist/aws/portalCommitmentsPlanningPublicArtifactValidation.js.map +1 -0
  17. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.d.ts +13 -0
  18. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.d.ts.map +1 -0
  19. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.js +5 -0
  20. package/dist/aws/portalCommitmentsPlanningPublicArtifacts.js.map +1 -0
  21. package/dist/aws/portalPublicArtifactHistoryTypes.d.ts +5 -0
  22. package/dist/aws/portalPublicArtifactHistoryTypes.d.ts.map +1 -1
  23. package/dist/aws/portalPublicArtifactHistoryTypes.js +6 -0
  24. package/dist/aws/portalPublicArtifactHistoryTypes.js.map +1 -1
  25. package/dist/aws/portalPublicArtifacts.d.ts +2 -1
  26. package/dist/aws/portalPublicArtifacts.d.ts.map +1 -1
  27. package/dist/aws/portalPublicArtifacts.js.map +1 -1
  28. package/dist/aws/publicArtifacts.d.ts +1 -1
  29. package/dist/aws/publicArtifacts.d.ts.map +1 -1
  30. package/dist/aws/publicArtifacts.js +1 -0
  31. package/dist/aws/publicArtifacts.js.map +1 -1
  32. package/dist/aws/relationships.d.ts +4 -0
  33. package/dist/aws/relationships.d.ts.map +1 -0
  34. package/dist/aws/relationships.js +6 -0
  35. package/dist/aws/relationships.js.map +1 -0
  36. package/dist/azure/commitmentsPlanning.d.ts +3 -1
  37. package/dist/azure/commitmentsPlanning.d.ts.map +1 -1
  38. package/dist/esm/accounts/accounts.js +115 -0
  39. package/dist/esm/accounts/azureSpSetup.js +1 -0
  40. package/dist/esm/accounts/azureSpSetupDurable.js +1 -0
  41. package/dist/esm/accounts/index.js +5 -0
  42. package/dist/esm/accounts/readPermissions.js +198 -0
  43. package/dist/esm/accounts/validation.js +1 -0
  44. package/dist/esm/accounts/writePermissions.js +43 -0
  45. package/dist/esm/ai/index.js +2 -0
  46. package/dist/esm/assessments/artifact.js +1 -0
  47. package/dist/esm/assessments/catalogue.js +12 -0
  48. package/dist/esm/assessments/common.js +1 -0
  49. package/dist/esm/assessments/evidence.js +1 -0
  50. package/dist/esm/assessments/export.js +1 -0
  51. package/dist/esm/assessments/index.js +10 -0
  52. package/dist/esm/assessments/queue.js +2 -0
  53. package/dist/esm/assessments/review.js +1 -0
  54. package/dist/esm/assessments/run.js +1 -0
  55. package/dist/esm/assessments/sow.js +1 -0
  56. package/dist/esm/assessments/status.js +23 -0
  57. package/dist/esm/aws/commitments-planning.js +1 -0
  58. package/dist/esm/aws/commitmentsPlanningValidation.js +121 -0
  59. package/dist/esm/aws/estates.js +21 -0
  60. package/dist/esm/aws/index.js +18 -0
  61. package/dist/esm/aws/onboarding.js +1 -0
  62. package/dist/esm/aws/pluginPublicArtifactBodyValidation.js +217 -0
  63. package/dist/esm/aws/pluginPublicArtifactEvidence.js +1 -0
  64. package/dist/esm/aws/pluginPublicArtifactManifestValidation.js +255 -0
  65. package/dist/esm/aws/pluginPublicArtifactSectionValidation.js +464 -0
  66. package/dist/esm/aws/pluginPublicArtifactValidation.js +2 -0
  67. package/dist/esm/aws/pluginPublicArtifactValidationHelpers.js +216 -0
  68. package/dist/esm/aws/pluginPublicArtifacts.js +109 -0
  69. package/dist/esm/aws/portalCommitmentsPlanningPublicArtifactValidation.js +509 -0
  70. package/dist/esm/aws/portalCommitmentsPlanningPublicArtifacts.js +1 -0
  71. package/dist/esm/aws/portalPublicArtifactCurrentValidation.js +328 -0
  72. package/dist/esm/aws/portalPublicArtifactEvidenceValidation.js +294 -0
  73. package/dist/esm/aws/portalPublicArtifactHistoryAiValidation.js +368 -0
  74. package/dist/esm/aws/portalPublicArtifactHistoryTypes.js +40 -0
  75. package/dist/esm/aws/portalPublicArtifactNestedEvidence.js +1 -0
  76. package/dist/esm/aws/portalPublicArtifactNestedEvidenceValidation.js +397 -0
  77. package/dist/esm/aws/portalPublicArtifactValidation.js +2 -0
  78. package/dist/esm/aws/portalPublicArtifactValidationCommon.js +139 -0
  79. package/dist/esm/aws/portalPublicArtifacts.js +73 -0
  80. package/dist/esm/aws/portalRelationshipPublicArtifactValidation.js +334 -0
  81. package/dist/esm/aws/portalRelationshipPublicArtifacts.js +59 -0
  82. package/dist/esm/aws/portalRelationshipResourceNodeTypes.js +1 -0
  83. package/dist/esm/aws/portalRelationshipResourceNodeValidation.js +368 -0
  84. package/dist/esm/aws/publicArtifacts.js +13 -0
  85. package/dist/esm/aws/relationships.js +1 -0
  86. package/dist/esm/aws/requests.js +19 -0
  87. package/dist/esm/azure/activityLogs.js +2 -0
  88. package/dist/esm/azure/advisorScore.js +1 -0
  89. package/dist/esm/azure/benefits.js +1 -0
  90. package/dist/esm/azure/billingGeneration.js +1 -0
  91. package/dist/esm/azure/billingPlots.js +4 -0
  92. package/dist/esm/azure/budgets.js +1 -0
  93. package/dist/esm/azure/commitmentsPlanning.js +1 -0
  94. package/dist/esm/azure/common.js +1 -0
  95. package/dist/esm/azure/configs.js +1 -0
  96. package/dist/esm/azure/costComposition.js +1 -0
  97. package/dist/esm/azure/dataProtection.js +5 -0
  98. package/dist/esm/azure/governance.js +14 -0
  99. package/dist/esm/azure/licensing.js +1 -0
  100. package/dist/esm/azure/metrics.js +1 -0
  101. package/dist/esm/azure/payloads.js +1 -0
  102. package/dist/esm/azure/portalArtifacts.js +1 -0
  103. package/dist/esm/azure/prices.js +1 -0
  104. package/dist/esm/azure/publicIpAddresses.js +2 -0
  105. package/dist/esm/azure/recommendationAudit.js +16 -0
  106. package/dist/esm/azure/recommendationState.js +1 -0
  107. package/dist/esm/azure/recommendationTracks.js +40 -0
  108. package/dist/esm/azure/recommendationWorkflow.js +13 -0
  109. package/dist/esm/azure/recommendations.js +10 -0
  110. package/dist/esm/azure/regulatoryCompliance.js +6 -0
  111. package/dist/esm/azure/relationships.js +2 -0
  112. package/dist/esm/azure/reportingTemplates.js +1 -0
  113. package/dist/esm/azure/reports.js +12 -0
  114. package/dist/esm/azure/resourceHealth.js +12 -0
  115. package/dist/esm/azure/resourceOptimization.js +1 -0
  116. package/dist/esm/azure/resources.js +1 -0
  117. package/dist/esm/azure/reviewChecklist.js +1 -0
  118. package/dist/esm/azure/secureScore.js +1 -0
  119. package/dist/esm/azure/security.js +1 -0
  120. package/dist/esm/azure/serviceRetirement.js +1 -0
  121. package/dist/esm/azure/serviceRetirementState.js +1 -0
  122. package/dist/esm/azure/serviceRetirementWorkManagement.js +1 -0
  123. package/dist/esm/azure/storage-inventory.js +1 -0
  124. package/dist/esm/azure/subscriptions.js +1 -0
  125. package/dist/esm/azure/views.js +32 -0
  126. package/dist/esm/azure/workManagement.js +4 -0
  127. package/dist/esm/common/artifactGeneration.js +1 -0
  128. package/dist/esm/common/capabilityPassport.js +214 -0
  129. package/dist/esm/common/index.js +7 -0
  130. package/dist/esm/common/pagination.js +1 -0
  131. package/dist/esm/common/provider.js +11 -0
  132. package/dist/esm/common/providerSyncProgress.js +1 -0
  133. package/dist/esm/common/relationships.js +1 -0
  134. package/dist/esm/common/syncProgress.js +1 -0
  135. package/dist/esm/company/billingAccount.js +1 -0
  136. package/dist/esm/company/company.js +1 -0
  137. package/dist/esm/company/companyHierarchy.js +1 -0
  138. package/dist/esm/company/companyNotes.js +38 -0
  139. package/dist/esm/company/customProperties.js +1 -0
  140. package/dist/esm/company/index.js +6 -0
  141. package/dist/esm/company/notification.js +43 -0
  142. package/dist/esm/company/survey.js +1 -0
  143. package/dist/esm/customProperties/customProperties.js +1 -0
  144. package/dist/esm/customProperties/index.js +1 -0
  145. package/dist/esm/entries/aws.js +3 -0
  146. package/dist/esm/entries/commitments-planning.js +3 -0
  147. package/dist/esm/entries/provider.js +3 -0
  148. package/dist/esm/entries/recommendations.js +3 -0
  149. package/dist/esm/entries/relationships.js +3 -0
  150. package/dist/esm/entries/root.js +3 -0
  151. package/dist/esm/events/actionGroups.js +1 -0
  152. package/dist/esm/events/alertDefinitionRun.js +1 -0
  153. package/dist/esm/events/baseAlert.js +1 -0
  154. package/dist/esm/events/cost.js +1 -0
  155. package/dist/esm/events/costAnomalies.js +1 -0
  156. package/dist/esm/events/costViews.js +1 -0
  157. package/dist/esm/events/eventStatus.js +1 -0
  158. package/dist/esm/events/index.js +8 -0
  159. package/dist/esm/events/quickAlerts.js +2 -0
  160. package/dist/esm/features-and-permissions/access.js +1 -0
  161. package/dist/esm/features-and-permissions/index.js +1 -0
  162. package/dist/esm/feedbacks/feedback.js +1 -0
  163. package/dist/esm/identity/apikey.js +1 -0
  164. package/dist/esm/identity/index.js +1 -0
  165. package/dist/esm/index.js +54 -0
  166. package/dist/esm/index.vite.js +48 -0
  167. package/dist/esm/integrations/autotask.js +1 -0
  168. package/dist/esm/integrations/azureDevOps.js +1 -0
  169. package/dist/esm/integrations/github.js +1 -0
  170. package/dist/esm/integrations/halo.js +1 -0
  171. package/dist/esm/integrations/index.js +5 -0
  172. package/dist/esm/integrations/integrationTickets.js +1 -0
  173. package/dist/esm/package.json +3 -0
  174. package/dist/esm/scheduler/index.js +1 -0
  175. package/dist/esm/scheduler/scheduler.js +1 -0
  176. package/dist/esm/tags/index.js +1 -0
  177. package/dist/esm/tags/tags.js +6 -0
  178. package/dist/esm/unknown/services.js +1 -0
  179. package/dist/esm/users/companyUser.js +2 -0
  180. package/dist/esm/users/index.js +2 -0
  181. package/dist/esm/users/user.js +1 -0
  182. package/package.json +23 -6
@@ -0,0 +1,509 @@
1
+ import { validateAwsCommitmentsPlanningViewIdentity } from './commitmentsPlanningValidation.js';
2
+ import { AWS_PORTAL_COMMITMENTS_PLANNING_LOGICAL_NAME, } from './portalCommitmentsPlanningPublicArtifacts.js';
3
+ import { asRecord, assertExactKeys, assertPublicJson, assertValue, validatePortalEnvelope } from './portalPublicArtifactValidationCommon.js';
4
+ const TOP_LEVEL_KEYS = [
5
+ 'schemaVersion',
6
+ 'portalSchemaVersion',
7
+ 'provider',
8
+ 'accountId',
9
+ 'artifactType',
10
+ 'artifactGeneration',
11
+ 'logicalName',
12
+ 'version',
13
+ 'generatedAt',
14
+ 'month',
15
+ 'providerScope',
16
+ 'utilizationSummary',
17
+ 'expirySummary',
18
+ 'inventory',
19
+ 'resourceCoverage',
20
+ 'obsoleteCandidates',
21
+ 'reallocationOpportunities',
22
+ 'pricingContext',
23
+ 'termStrategy',
24
+ 'freshness',
25
+ 'vendorRecommendations',
26
+ 'purchaseRecommendations',
27
+ 'diagnostics',
28
+ 'coverage',
29
+ 'renewals',
30
+ 'risk',
31
+ 'retirementImpact',
32
+ 'phasedOptions',
33
+ ];
34
+ /** Validates one untrusted immutable AWS Commitments Planning Portal artifact. */
35
+ export function validateAwsPortalCommitmentsPlanningArtifact(value) {
36
+ const artifact = asRecord(value, 'artifact');
37
+ const { accountId } = validatePortalEnvelope(artifact, 'commitments-planning', TOP_LEVEL_KEYS);
38
+ assertValue(artifact.logicalName, AWS_PORTAL_COMMITMENTS_PLANNING_LOGICAL_NAME, 'artifact.logicalName');
39
+ validateAwsCommitmentsPlanningViewIdentity(artifact, accountId);
40
+ validateBody(artifact);
41
+ assertPublicJson(artifact, 'artifact');
42
+ return value;
43
+ }
44
+ function validateBody(artifact) {
45
+ exact(artifact.providerScope, ['providerName', 'providerScopeId'], 'artifact.providerScope');
46
+ validateUtilizationSummary(artifact.utilizationSummary, 'artifact.utilizationSummary');
47
+ exact(artifact.expirySummary, ['expired', 'expiring30d', 'expiring60d', 'expiring90d', 'expiring180d'], 'artifact.expirySummary');
48
+ records(artifact.inventory, 'artifact.inventory', validateInventory);
49
+ records(artifact.resourceCoverage, 'artifact.resourceCoverage', validateResourceCoverage);
50
+ records(artifact.obsoleteCandidates, 'artifact.obsoleteCandidates', validateObsoleteCandidate);
51
+ optionalRecords(artifact.reallocationOpportunities, 'artifact.reallocationOpportunities', validateReallocation);
52
+ validatePricingContext(artifact.pricingContext, 'artifact.pricingContext');
53
+ records(artifact.termStrategy, 'artifact.termStrategy', validateTermStrategy);
54
+ optionalRecord(artifact.freshness, 'artifact.freshness', validateFreshness);
55
+ optionalRecords(artifact.vendorRecommendations, 'artifact.vendorRecommendations', validateVendorRecommendation);
56
+ optionalRecords(artifact.purchaseRecommendations, 'artifact.purchaseRecommendations', validatePurchaseRecommendation);
57
+ optionalRecord(artifact.diagnostics, 'artifact.diagnostics', validateDiagnostics);
58
+ optionalRecords(artifact.coverage, 'artifact.coverage', validateCoverage);
59
+ optionalRecords(artifact.renewals, 'artifact.renewals', validateRenewal);
60
+ optionalRecord(artifact.risk, 'artifact.risk', validateRisk);
61
+ optionalRecords(artifact.retirementImpact, 'artifact.retirementImpact', validateRetirementImpact);
62
+ optionalRecords(artifact.phasedOptions, 'artifact.phasedOptions', validatePhasedOption);
63
+ }
64
+ function validateUtilizationSummary(value, field) {
65
+ const summary = exact(value, ['total', 'withData', 'sevenDayAverage', 'thirtyDayAverage', 'sevenDayAggregates', 'thirtyDayAggregates', 'byBenefitType'], field);
66
+ optionalRecords(summary.sevenDayAggregates, `${field}.sevenDayAggregates`, validateWeightedAggregate);
67
+ optionalRecords(summary.thirtyDayAggregates, `${field}.thirtyDayAggregates`, validateWeightedAggregate);
68
+ records(summary.byBenefitType, `${field}.byBenefitType`, (entry, itemField) => {
69
+ const item = exact(entry, ['benefitType', 'total', 'withData', 'sevenDayAverage', 'thirtyDayAverage', 'sevenDayAggregates', 'thirtyDayAggregates'], itemField);
70
+ optionalRecords(item.sevenDayAggregates, `${itemField}.sevenDayAggregates`, validateWeightedAggregate);
71
+ optionalRecords(item.thirtyDayAggregates, `${itemField}.thirtyDayAggregates`, validateWeightedAggregate);
72
+ });
73
+ }
74
+ function validateWeightedAggregate(value, field) {
75
+ exact(value, ['used', 'reserved', 'percentage', 'sampleCount', 'unit', 'currency'], field);
76
+ }
77
+ function validateInventory(value, field) {
78
+ const item = exact(value, [
79
+ 'id',
80
+ 'benefitType',
81
+ 'commitmentFamily',
82
+ 'sourceKind',
83
+ 'sourceId',
84
+ 'provider',
85
+ 'shape',
86
+ 'scope',
87
+ 'appliedScopeType',
88
+ 'appliedScopeProperties',
89
+ 'type',
90
+ 'displayName',
91
+ 'status',
92
+ 'purchaseDate',
93
+ 'expiryDate',
94
+ 'daysToExpiry',
95
+ 'reservedQuantity',
96
+ 'commitmentAmount',
97
+ 'commitmentCurrencyCode',
98
+ 'commitmentGrain',
99
+ 'commitmentUnit',
100
+ 'skuName',
101
+ 'skuDescription',
102
+ 'location',
103
+ 'term',
104
+ 'termMonths',
105
+ 'billingPlan',
106
+ 'appliedScopeDisplayName',
107
+ 'provisioningState',
108
+ 'renew',
109
+ 'purchasedQuantity',
110
+ 'usedQuantity',
111
+ 'remainingQuantity',
112
+ 'totalReservedQuantity',
113
+ 'reservedHours',
114
+ 'usedHours',
115
+ 'utilization',
116
+ 'coveragePercent',
117
+ 'annualCommittedCost',
118
+ 'optimizationImpact',
119
+ 'doNotRenewAnnualImpact',
120
+ 'riskLevel',
121
+ 'confidence',
122
+ 'linkedRecommendationIds',
123
+ 'renewalDecisionIds',
124
+ 'retirementImpactIds',
125
+ ], field);
126
+ optionalRecord(item.shape, `${field}.shape`, validateShape);
127
+ validateAppliedScope(item.appliedScopeProperties, `${field}.appliedScopeProperties`);
128
+ optionalRecord(item.utilization, `${field}.utilization`, (entry, itemField) => exact(entry, ['trend', 'oneDay', 'sevenDay', 'thirtyDay', 'source'], itemField));
129
+ optionalMoney(item.annualCommittedCost, `${field}.annualCommittedCost`);
130
+ optionalMoney(item.optimizationImpact, `${field}.optimizationImpact`);
131
+ optionalMoney(item.doNotRenewAnnualImpact, `${field}.doNotRenewAnnualImpact`);
132
+ }
133
+ function validateResourceCoverage(value, field) {
134
+ const item = exact(value, [
135
+ 'resourceId',
136
+ 'resourceName',
137
+ 'resourceType',
138
+ 'month',
139
+ 'windowStart',
140
+ 'windowEnd',
141
+ 'currency',
142
+ 'benefitIds',
143
+ 'benefitNames',
144
+ 'basis',
145
+ 'coveredQuantity',
146
+ 'eligibleQuantity',
147
+ 'coveredCost',
148
+ 'eligibleCost',
149
+ 'uncoveredCost',
150
+ 'coveragePercent',
151
+ 'recommendationIds',
152
+ 'recommendationType',
153
+ 'recommendedAction',
154
+ 'eligibility',
155
+ 'recommendationImpact',
156
+ 'source',
157
+ 'benefitBreakdown',
158
+ ], field);
159
+ optionalRecord(item.eligibility, `${field}.eligibility`, validateEligibility);
160
+ optionalRecord(item.recommendationImpact, `${field}.recommendationImpact`, (entry, itemField) => exact(entry, ['amount', 'currency', 'source'], itemField));
161
+ optionalRecord(item.source, `${field}.source`, validateSource);
162
+ optionalRecords(item.benefitBreakdown, `${field}.benefitBreakdown`, (entry, itemField) => exact(entry, ['benefitId', 'benefitName', 'coveredQuantity', 'coveredCost'], itemField));
163
+ }
164
+ function validateObsoleteCandidate(value, field) {
165
+ const item = exact(value, ['id', 'candidateType', 'reasonCodes', 'suggestedAction', 'confidence', 'impactEstimate', 'relatedBenefitIds'], field);
166
+ optionalRecord(item.impactEstimate, `${field}.impactEstimate`, (entry, itemField) => exact(entry, ['amount', 'currency', 'currencySymbol', 'source', 'notes', 'windowStart', 'windowEnd', 'flags'], itemField));
167
+ }
168
+ function validateReallocation(value, field) {
169
+ const item = exact(value, [
170
+ 'id',
171
+ 'fromResource',
172
+ 'toResource',
173
+ 'estimatedNetSavings',
174
+ 'currency',
175
+ 'source',
176
+ 'confidence',
177
+ 'assumptions',
178
+ 'benefitIds',
179
+ 'benefitNames',
180
+ 'recommendationIds',
181
+ 'obsoleteCandidateIds',
182
+ ], field);
183
+ validateReallocationResource(item.fromResource, `${field}.fromResource`);
184
+ validateReallocationResource(item.toResource, `${field}.toResource`);
185
+ }
186
+ function validateReallocationResource(value, field) {
187
+ exact(value, ['resourceId', 'resourceName', 'resourceType'], field);
188
+ }
189
+ function validatePurchaseRecommendation(value, field) {
190
+ const item = exact(value, [
191
+ 'id',
192
+ 'groupKey',
193
+ 'commitmentFamily',
194
+ 'action',
195
+ 'eligibility',
196
+ 'currentShape',
197
+ 'targetShape',
198
+ 'blockers',
199
+ 'unlockActions',
200
+ 'purchaseScope',
201
+ 'appliedScopeProperties',
202
+ 'source',
203
+ 'title',
204
+ 'description',
205
+ 'confidence',
206
+ 'riskLevel',
207
+ 'location',
208
+ 'skuName',
209
+ 'normalizedSkuName',
210
+ 'resourceType',
211
+ 'vmSizeFlexibilityGroup',
212
+ 'termMonths',
213
+ 'quantity',
214
+ 'coverageState',
215
+ 'estimatedAnnualSavings',
216
+ 'estimatedAnnualCost',
217
+ 'estimatedTermSavings',
218
+ 'estimatedTermCost',
219
+ 'termOptions',
220
+ 'impactedResources',
221
+ 'sourceRecommendationIds',
222
+ 'linkedCommitmentIds',
223
+ 'notes',
224
+ ], field);
225
+ optionalRecord(item.eligibility, `${field}.eligibility`, validateEligibility);
226
+ optionalRecord(item.currentShape, `${field}.currentShape`, validateShape);
227
+ validateShape(item.targetShape, `${field}.targetShape`);
228
+ optionalRecords(item.blockers, `${field}.blockers`, validateBlocker);
229
+ optionalRecords(item.unlockActions, `${field}.unlockActions`, validateUnlockAction);
230
+ validateAppliedScope(item.appliedScopeProperties, `${field}.appliedScopeProperties`);
231
+ validateSource(item.source, `${field}.source`);
232
+ optionalMoney(item.estimatedAnnualSavings, `${field}.estimatedAnnualSavings`);
233
+ optionalMoney(item.estimatedAnnualCost, `${field}.estimatedAnnualCost`);
234
+ optionalMoney(item.estimatedTermSavings, `${field}.estimatedTermSavings`);
235
+ optionalMoney(item.estimatedTermCost, `${field}.estimatedTermCost`);
236
+ optionalRecords(item.termOptions, `${field}.termOptions`, validateTermOption);
237
+ optionalRecords(item.impactedResources, `${field}.impactedResources`, validateResourceReference);
238
+ }
239
+ function validateEligibility(value, field) {
240
+ const eligibility = exact(value, [
241
+ 'status',
242
+ 'action',
243
+ 'currentShape',
244
+ 'targetShape',
245
+ 'targetSelectionStrategy',
246
+ 'targetSelectionReason',
247
+ 'blockers',
248
+ 'unlockActions',
249
+ 'source',
250
+ 'confidence',
251
+ ], field);
252
+ optionalRecord(eligibility.currentShape, `${field}.currentShape`, validateShape);
253
+ optionalRecord(eligibility.targetShape, `${field}.targetShape`, validateShape);
254
+ optionalRecords(eligibility.blockers, `${field}.blockers`, validateBlocker);
255
+ optionalRecords(eligibility.unlockActions, `${field}.unlockActions`, validateUnlockAction);
256
+ optionalRecord(eligibility.source, `${field}.source`, validateSource);
257
+ }
258
+ function validateShape(value, field) {
259
+ const shape = exact(value, [
260
+ 'provider',
261
+ 'resourceType',
262
+ 'commitmentFamily',
263
+ 'skuName',
264
+ 'normalizedSkuName',
265
+ 'location',
266
+ 'region',
267
+ 'availabilityZone',
268
+ 'platform',
269
+ 'reservationProductName',
270
+ 'reservedResourceType',
271
+ 'meterCategory',
272
+ 'meterSubCategory',
273
+ 'meterName',
274
+ 'unit',
275
+ 'attributes',
276
+ ], field);
277
+ if (shape.attributes !== undefined)
278
+ asRecord(shape.attributes, `${field}.attributes`);
279
+ }
280
+ function validateAppliedScope(value, field) {
281
+ exact(value, ['accountId', 'region', 'availabilityZone'], field);
282
+ }
283
+ function validateSource(value, field) {
284
+ exact(value, ['sourceKind', 'sourceId', 'sourceName', 'generatedAt', 'observedAt', 'notes'], field);
285
+ }
286
+ function validateBlocker(value, field) {
287
+ exact(value, ['code', 'message', 'source', 'sourceUrl', 'severity'], field);
288
+ }
289
+ function validateUnlockAction(value, field) {
290
+ exact(value, ['id', 'label', 'description', 'actionType', 'order', 'source'], field);
291
+ }
292
+ function validateTermOption(value, field) {
293
+ const option = exact(value, [
294
+ 'termMonths',
295
+ 'currentMonthly',
296
+ 'targetMonthly',
297
+ 'potentialMonthlySavings',
298
+ 'estimatedAnnualSavings',
299
+ 'estimatedAnnualCost',
300
+ 'estimatedTermSavings',
301
+ 'estimatedTermCost',
302
+ ], field);
303
+ optionalMoney(option.estimatedAnnualSavings, `${field}.estimatedAnnualSavings`);
304
+ optionalMoney(option.estimatedAnnualCost, `${field}.estimatedAnnualCost`);
305
+ optionalMoney(option.estimatedTermSavings, `${field}.estimatedTermSavings`);
306
+ optionalMoney(option.estimatedTermCost, `${field}.estimatedTermCost`);
307
+ }
308
+ function validateVendorRecommendation(value, field) {
309
+ const item = exact(value, [
310
+ 'id',
311
+ 'commitmentFamily',
312
+ 'source',
313
+ 'action',
314
+ 'title',
315
+ 'description',
316
+ 'confidence',
317
+ 'riskLevel',
318
+ 'estimatedAnnualSavings',
319
+ 'estimatedAnnualCost',
320
+ 'impactedResources',
321
+ 'linkedCommitmentIds',
322
+ ], field);
323
+ validateSource(item.source, `${field}.source`);
324
+ optionalMoney(item.estimatedAnnualSavings, `${field}.estimatedAnnualSavings`);
325
+ optionalMoney(item.estimatedAnnualCost, `${field}.estimatedAnnualCost`);
326
+ optionalRecords(item.impactedResources, `${field}.impactedResources`, validateResourceReference);
327
+ }
328
+ function validateDiagnostics(value, field) {
329
+ const diagnostics = exact(value, ['purchaseRecommendations'], field);
330
+ optionalRecord(diagnostics.purchaseRecommendations, `${field}.purchaseRecommendations`, (entry, itemField) => {
331
+ const recommendation = exact(entry, ['generatedAt', 'inputCounts', 'outputCounts', 'suppressedCounts', 'notes'], itemField);
332
+ optionalOpenRecord(recommendation.inputCounts, `${itemField}.inputCounts`);
333
+ optionalOpenRecord(recommendation.suppressedCounts, `${itemField}.suppressedCounts`);
334
+ optionalRecord(recommendation.outputCounts, `${itemField}.outputCounts`, (output, outputField) => {
335
+ const counts = exact(output, ['total', 'byAction', 'byStatus', 'bySourceKind', 'unattributed'], outputField);
336
+ optionalOpenRecord(counts.byAction, `${outputField}.byAction`);
337
+ optionalOpenRecord(counts.byStatus, `${outputField}.byStatus`);
338
+ optionalOpenRecord(counts.bySourceKind, `${outputField}.bySourceKind`);
339
+ });
340
+ });
341
+ }
342
+ function validateCoverage(value, field) {
343
+ const item = exact(value, [
344
+ 'commitmentFamily',
345
+ 'basis',
346
+ 'windowStart',
347
+ 'windowEnd',
348
+ 'eligibleCost',
349
+ 'coveredCost',
350
+ 'uncoveredCost',
351
+ 'coveragePercent',
352
+ 'impactedResources',
353
+ 'source',
354
+ ], field);
355
+ optionalMoney(item.eligibleCost, `${field}.eligibleCost`);
356
+ optionalMoney(item.coveredCost, `${field}.coveredCost`);
357
+ optionalMoney(item.uncoveredCost, `${field}.uncoveredCost`);
358
+ optionalRecords(item.impactedResources, `${field}.impactedResources`, validateResourceReference);
359
+ optionalRecord(item.source, `${field}.source`, validateSource);
360
+ }
361
+ function validateRenewal(value, field) {
362
+ const item = exact(value, [
363
+ 'id',
364
+ 'commitmentId',
365
+ 'commitmentFamily',
366
+ 'action',
367
+ 'title',
368
+ 'expiryDate',
369
+ 'daysToExpiry',
370
+ 'confidence',
371
+ 'riskLevel',
372
+ 'estimatedAnnualSavings',
373
+ 'estimatedAnnualCostDelta',
374
+ 'modernizationTarget',
375
+ 'impactedResources',
376
+ 'recommendationsToReview',
377
+ 'source',
378
+ ], field);
379
+ optionalMoney(item.estimatedAnnualSavings, `${field}.estimatedAnnualSavings`);
380
+ optionalMoney(item.estimatedAnnualCostDelta, `${field}.estimatedAnnualCostDelta`);
381
+ optionalRecord(item.modernizationTarget, `${field}.modernizationTarget`, (entry, itemField) => exact(entry, ['currentSku', 'targetSku', 'currentFamily', 'targetFamily', 'reasonCodes'], itemField));
382
+ optionalRecords(item.impactedResources, `${field}.impactedResources`, validateResourceReference);
383
+ optionalRecords(item.recommendationsToReview, `${field}.recommendationsToReview`, validateReviewSummary);
384
+ optionalRecord(item.source, `${field}.source`, validateSource);
385
+ }
386
+ function validateReviewSummary(value, field) {
387
+ const item = exact(value, [
388
+ 'id',
389
+ 'name',
390
+ 'category',
391
+ 'subCategory',
392
+ 'impact',
393
+ 'effort',
394
+ 'risk',
395
+ 'priorityTier',
396
+ 'headline',
397
+ 'plainSummary',
398
+ 'normalizedScore',
399
+ 'finalScore',
400
+ 'estimatedSavings',
401
+ 'resourceIds',
402
+ 'reasons',
403
+ ], field);
404
+ optionalMoney(item.estimatedSavings, `${field}.estimatedSavings`);
405
+ }
406
+ function validateRisk(value, field) {
407
+ exact(value, ['overallRisk', 'overcommitmentRisk', 'undercoverageRisk', 'staleDataRisk', 'currency', 'expectedWaste', 'expectedUncoveredCost', 'notes'], field);
408
+ }
409
+ function validateRetirementImpact(value, field) {
410
+ const item = exact(value, [
411
+ 'id',
412
+ 'commitmentId',
413
+ 'commitmentFamily',
414
+ 'scenario',
415
+ 'title',
416
+ 'effectiveDate',
417
+ 'incrementalMonthlyCost',
418
+ 'incrementalAnnualCost',
419
+ 'impactedResources',
420
+ 'linkedRetirementIds',
421
+ 'confidence',
422
+ 'riskLevel',
423
+ 'source',
424
+ ], field);
425
+ optionalMoney(item.incrementalMonthlyCost, `${field}.incrementalMonthlyCost`);
426
+ optionalMoney(item.incrementalAnnualCost, `${field}.incrementalAnnualCost`);
427
+ optionalRecords(item.impactedResources, `${field}.impactedResources`, validateResourceReference);
428
+ optionalRecord(item.source, `${field}.source`, validateSource);
429
+ }
430
+ function validatePhasedOption(value, field) {
431
+ const item = exact(value, [
432
+ 'id',
433
+ 'label',
434
+ 'commitmentFamily',
435
+ 'action',
436
+ 'termMonths',
437
+ 'quantity',
438
+ 'hourlyCommitmentAmount',
439
+ 'annualCommitmentCost',
440
+ 'estimatedAnnualSavings',
441
+ 'expectedCoveragePercent',
442
+ 'expectedWastePercent',
443
+ 'confidence',
444
+ 'riskLevel',
445
+ 'impactedResources',
446
+ 'source',
447
+ ], field);
448
+ optionalMoney(item.hourlyCommitmentAmount, `${field}.hourlyCommitmentAmount`);
449
+ optionalMoney(item.annualCommitmentCost, `${field}.annualCommitmentCost`);
450
+ optionalMoney(item.estimatedAnnualSavings, `${field}.estimatedAnnualSavings`);
451
+ optionalRecords(item.impactedResources, `${field}.impactedResources`, validateResourceReference);
452
+ optionalRecord(item.source, `${field}.source`, validateSource);
453
+ }
454
+ function validateFreshness(value, field) {
455
+ const freshness = exact(value, ['status', 'generatedAt', 'entries', 'warnings'], field);
456
+ records(freshness.entries, `${field}.entries`, (entry, itemField) => exact(entry, ['section', 'status', 'generatedAt', 'observedAt', 'lastSuccessfulSyncAt', 'reason', 'sourceKind'], itemField));
457
+ }
458
+ function validatePricingContext(value, field) {
459
+ exact(value, ['source', 'currency', 'assumptions', 'confidenceNotes', 'calculatorDeepLink'], field);
460
+ }
461
+ function validateTermStrategy(value, field) {
462
+ const scenario = exact(value, [
463
+ 'scenarioId',
464
+ 'termMonths',
465
+ 'breakMonth',
466
+ 'policyInputs',
467
+ 'projectedGrossSavings',
468
+ 'projectedBreakCost',
469
+ 'projectedNetSavings',
470
+ 'annualizedProjectedNetSavings',
471
+ 'breakEvenMonth',
472
+ 'recommended',
473
+ 'currency',
474
+ 'notes',
475
+ ], field);
476
+ exact(scenario.policyInputs, ['earlyTerminationFeePercent', 'rollingCancellationCap', 'exchangeAllowed', 'policyVersion'], `${field}.policyInputs`);
477
+ }
478
+ function validateMoney(value, field) {
479
+ exact(value, ['amount', 'currency', 'source', 'windowStart', 'windowEnd', 'flags'], field);
480
+ }
481
+ function validateResourceReference(value, field) {
482
+ exact(value, ['resourceId', 'resourceName', 'resourceType', 'location'], field);
483
+ }
484
+ function exact(value, allowed, field) {
485
+ const record = asRecord(value, field);
486
+ assertExactKeys(record, allowed, field);
487
+ return record;
488
+ }
489
+ function records(value, field, validate) {
490
+ if (!Array.isArray(value))
491
+ throw new Error(`${field} must be an array.`);
492
+ value.forEach((entry, index) => validate(entry, `${field}[${index}]`));
493
+ }
494
+ function optionalRecords(value, field, validate) {
495
+ if (value !== undefined)
496
+ records(value, field, validate);
497
+ }
498
+ function optionalRecord(value, field, validate) {
499
+ if (value !== undefined)
500
+ validate(value, field);
501
+ }
502
+ function optionalOpenRecord(value, field) {
503
+ if (value !== undefined)
504
+ asRecord(value, field);
505
+ }
506
+ function optionalMoney(value, field) {
507
+ if (value !== undefined)
508
+ validateMoney(value, field);
509
+ }
@@ -0,0 +1 @@
1
+ export const AWS_PORTAL_COMMITMENTS_PLANNING_LOGICAL_NAME = 'commitments-planning.json.gz';