@spottoai/types-package 1.0.2-beta.428 → 1.0.2-beta.429

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 (60) hide show
  1. package/dist/azure/dataProtection.d.ts +40 -0
  2. package/dist/azure/dataProtection.d.ts.map +1 -1
  3. package/dist/azure/metrics.d.ts +2 -27
  4. package/dist/azure/metrics.d.ts.map +1 -1
  5. package/dist/azure/reportEvidence.d.ts +7 -5
  6. package/dist/azure/reportEvidence.d.ts.map +1 -1
  7. package/dist/azure/reportEvidence.js.map +1 -1
  8. package/dist/azure/reportEvidenceValidation.d.ts.map +1 -1
  9. package/dist/azure/reportEvidenceValidation.js +5 -1
  10. package/dist/azure/reportEvidenceValidation.js.map +1 -1
  11. package/dist/azure/reportEvidenceValidationHelpers.d.ts +3 -16
  12. package/dist/azure/reportEvidenceValidationHelpers.d.ts.map +1 -1
  13. package/dist/azure/reportEvidenceValidationHelpers.js +79 -95
  14. package/dist/azure/reportEvidenceValidationHelpers.js.map +1 -1
  15. package/dist/azure/resilienceFacts.d.ts +100 -0
  16. package/dist/azure/resilienceFacts.d.ts.map +1 -0
  17. package/dist/azure/resilienceFacts.js +20 -0
  18. package/dist/azure/resilienceFacts.js.map +1 -0
  19. package/dist/azure/resilienceFactsValidation.d.ts +4 -0
  20. package/dist/azure/resilienceFactsValidation.d.ts.map +1 -0
  21. package/dist/azure/resilienceFactsValidation.js +70 -0
  22. package/dist/azure/resilienceFactsValidation.js.map +1 -0
  23. package/dist/azure/views.d.ts +7 -0
  24. package/dist/azure/views.d.ts.map +1 -1
  25. package/dist/azure/views.js.map +1 -1
  26. package/dist/common/boundedRows.d.ts +7 -0
  27. package/dist/common/boundedRows.d.ts.map +1 -0
  28. package/dist/common/boundedRows.js +3 -0
  29. package/dist/common/boundedRows.js.map +1 -0
  30. package/dist/common/metricStats.d.ts +29 -0
  31. package/dist/common/metricStats.d.ts.map +1 -0
  32. package/dist/common/metricStats.js +3 -0
  33. package/dist/common/metricStats.js.map +1 -0
  34. package/dist/common/utilizationStories.d.ts +516 -0
  35. package/dist/common/utilizationStories.d.ts.map +1 -0
  36. package/dist/common/utilizationStories.js +21 -0
  37. package/dist/common/utilizationStories.js.map +1 -0
  38. package/dist/common/utilizationStoriesValidation.d.ts +48 -0
  39. package/dist/common/utilizationStoriesValidation.d.ts.map +1 -0
  40. package/dist/common/utilizationStoriesValidation.js +552 -0
  41. package/dist/common/utilizationStoriesValidation.js.map +1 -0
  42. package/dist/common/validationHelpers.d.ts +18 -0
  43. package/dist/common/validationHelpers.d.ts.map +1 -0
  44. package/dist/common/validationHelpers.js +36 -0
  45. package/dist/common/validationHelpers.js.map +1 -0
  46. package/dist/esm/azure/reportEvidenceValidation.js +5 -1
  47. package/dist/esm/azure/reportEvidenceValidationHelpers.js +2 -18
  48. package/dist/esm/azure/resilienceFacts.js +16 -0
  49. package/dist/esm/azure/resilienceFactsValidation.js +64 -0
  50. package/dist/esm/common/boundedRows.js +1 -0
  51. package/dist/esm/common/metricStats.js +1 -0
  52. package/dist/esm/common/utilizationStories.js +17 -0
  53. package/dist/esm/common/utilizationStoriesValidation.js +514 -0
  54. package/dist/esm/common/validationHelpers.js +18 -0
  55. package/dist/esm/index.js +4 -0
  56. package/dist/index.d.ts +4 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +4 -0
  59. package/dist/index.js.map +1 -1
  60. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationHelpers.d.ts","sourceRoot":"","sources":["../../src/common/validationHelpers.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,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"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ 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 isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ exports.isRecord = isRecord;
6
+ const isString = (value) => typeof value === 'string' && value.trim().length > 0;
7
+ exports.isString = isString;
8
+ const isOptionalString = (value) => value === undefined || (0, exports.isString)(value);
9
+ exports.isOptionalString = isOptionalString;
10
+ const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
11
+ exports.isFiniteNumber = isFiniteNumber;
12
+ const isOptionalFiniteNumber = (value) => value === undefined || (0, exports.isFiniteNumber)(value);
13
+ exports.isOptionalFiniteNumber = isOptionalFiniteNumber;
14
+ const isOptionalBoolean = (value) => value === undefined || typeof value === 'boolean';
15
+ exports.isOptionalBoolean = isOptionalBoolean;
16
+ const isCount = (value) => (0, exports.isFiniteNumber)(value) && Number.isInteger(value) && value >= 0;
17
+ exports.isCount = isCount;
18
+ const isDateTime = (value) => (0, exports.isString)(value) && Number.isFinite(Date.parse(value));
19
+ exports.isDateTime = isDateTime;
20
+ const isStringArray = (value) => Array.isArray(value) && value.every(exports.isString);
21
+ exports.isStringArray = isStringArray;
22
+ const isCountRecord = (value) => (0, exports.isRecord)(value) && Object.values(value).every(exports.isCount);
23
+ exports.isCountRecord = isCountRecord;
24
+ const countTotal = (value) => Object.values(value).reduce((total, count) => total + count, 0);
25
+ exports.countTotal = countTotal;
26
+ const hasOptionalStrings = (value, keys) => keys.every(key => (0, exports.isOptionalString)(value[key]));
27
+ exports.hasOptionalStrings = hasOptionalStrings;
28
+ const hasOptionalNumbers = (value, keys) => keys.every(key => (0, exports.isOptionalFiniteNumber)(value[key]));
29
+ exports.hasOptionalNumbers = hasOptionalNumbers;
30
+ const isBoundedRows = (value, limit, isRow) => {
31
+ if (!(0, exports.isRecord)(value) || !(0, exports.isCount)(value.totalCount) || !(0, exports.isCount)(value.omittedCount) || !Array.isArray(value.rows))
32
+ return false;
33
+ return value.rows.length <= limit && value.rows.every(isRow) && value.totalCount === value.rows.length + value.omittedCount;
34
+ };
35
+ exports.isBoundedRows = isBoundedRows;
36
+ //# sourceMappingURL=validationHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationHelpers.js","sourceRoot":"","sources":["../../src/common/validationHelpers.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { isReportDailySpend } from './reportDailySpendValidation.js';
3
3
  import { isReportSavingsBasis, isReportSpendProjection } from './reportSpendValidation.js';
4
4
  import { REPORT_EVIDENCE_LIMITS, } from './reportEvidence.js';
5
5
  import { countTotal, hasOptionalNumbers, hasOptionalStrings, hasRequiredRecords, isBoundedRows, isCommitmentExpirySummary, isCostSummary, isCount, isCountRecord, isDateTime, isEvidenceReference, isFiniteNumber, isOptionalBoolean, isOptionalFiniteNumber, isOptionalString, isProjectionRows, isRecommendationSummary, isRecord, isResourceSummary, isRetirementSummary, isSourceFileStatus, isString, isStringArray, isTagCoverage, } from './reportEvidenceValidationHelpers.js';
6
+ import { isReportingStories, isStoryFingerprintRows } from '../common/utilizationStoriesValidation.js';
6
7
  export const isReportSecureScoreEvidence = (value) => {
7
8
  if (!isRecord(value) || !['available', 'unavailable', 'stale'].includes(value.status))
8
9
  return false;
@@ -260,6 +261,8 @@ const isReportingProjection = (value) => {
260
261
  return false;
261
262
  if (value.spend !== undefined && !isReportSpendProjection(value.spend))
262
263
  return false;
264
+ if (value.stories !== undefined && !isReportingStories(value.stories))
265
+ return false;
263
266
  if (value.costChangePeriods !== undefined &&
264
267
  (!isBoundedRows(value.costChangePeriods, REPORT_EVIDENCE_LIMITS.costChangePeriods, isCostChangePeriod) ||
265
268
  new Set(value.costChangePeriods.rows.map(period => period.period)).size !== value.costChangePeriods.rows.length)) {
@@ -448,7 +451,8 @@ export const isSubscriptionReportHistory = (value) => {
448
451
  !isDateTime(period.sourceGeneratedAt) ||
449
452
  !isHistoryMetrics(period.metrics) ||
450
453
  !isBoundedRows(period.recommendations, REPORT_EVIDENCE_LIMITS.historyRecommendations, isRecommendationFingerprint) ||
451
- (period.comparisonIdentities !== undefined && !isHistoryComparisonIdentities(period.comparisonIdentities))) {
454
+ (period.comparisonIdentities !== undefined && !isHistoryComparisonIdentities(period.comparisonIdentities)) ||
455
+ (period.stories !== undefined && !isStoryFingerprintRows(period.stories))) {
452
456
  return false;
453
457
  }
454
458
  if (period.recommendations.omittedCount === 0 &&
@@ -1,22 +1,6 @@
1
1
  import { REPORT_EVIDENCE_LIMITS } from './reportEvidence.js';
2
- export const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
3
- export const isString = (value) => typeof value === 'string' && value.trim().length > 0;
4
- export const isOptionalString = (value) => value === undefined || isString(value);
5
- export const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
6
- export const isOptionalFiniteNumber = (value) => value === undefined || isFiniteNumber(value);
7
- export const isOptionalBoolean = (value) => value === undefined || typeof value === 'boolean';
8
- export const isCount = (value) => isFiniteNumber(value) && Number.isInteger(value) && value >= 0;
9
- export const isDateTime = (value) => isString(value) && Number.isFinite(Date.parse(value));
10
- export const isStringArray = (value) => Array.isArray(value) && value.every(isString);
11
- export const isCountRecord = (value) => isRecord(value) && Object.values(value).every(isCount);
12
- export const countTotal = (value) => Object.values(value).reduce((total, count) => total + count, 0);
13
- export const hasOptionalStrings = (value, keys) => keys.every(key => isOptionalString(value[key]));
14
- export const hasOptionalNumbers = (value, keys) => keys.every(key => isOptionalFiniteNumber(value[key]));
15
- export const isBoundedRows = (value, limit, isRow) => {
16
- if (!isRecord(value) || !isCount(value.totalCount) || !isCount(value.omittedCount) || !Array.isArray(value.rows))
17
- return false;
18
- return value.rows.length <= limit && value.rows.every(isRow) && value.totalCount === value.rows.length + value.omittedCount;
19
- };
2
+ import { isBoundedRows, isCount, isCountRecord, isFiniteNumber, isOptionalFiniteNumber, isOptionalString, isRecord, isString, isStringArray, hasOptionalNumbers, hasOptionalStrings, } from '../common/validationHelpers.js';
3
+ export { isRecord, isString, isOptionalString, isFiniteNumber, isOptionalFiniteNumber, isOptionalBoolean, isCount, isDateTime, isStringArray, isCountRecord, countTotal, hasOptionalStrings, hasOptionalNumbers, isBoundedRows, } from '../common/validationHelpers.js';
20
4
  export const isProjectionRows = (value, limit = REPORT_EVIDENCE_LIMITS.detailRows) => isBoundedRows(value, limit, isRecord);
21
5
  export const hasRequiredRecords = (value, keys) => keys.every(key => isRecord(value[key]));
22
6
  export const isSourceFileStatus = (value) => isRecord(value) &&
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Resilience facts: the small per-resource property reads the resilience story needs that no other collection
3
+ * carries — storage blob-service data-protection settings and lifecycle management, Azure SQL database backup
4
+ * retention and failover groups. Collected in the reliability component beside the data-protection posture and
5
+ * published as `azure-portal/subscriptions/{id}/resilience-facts.json`. Consumed by the cloud-engine
6
+ * `ProtectionProfileBuilder` (`data-protection:<selector>` capability sources) and available to the resilience story page.
7
+ *
8
+ * Spec: `Specs/reporting/utilization-stories-types-package.md` (parent: core `specs/reporting/utilization-stories.md`).
9
+ * Additive: consumers tolerate unknown fields. Field semantics: `undefined` = not read (the request failed, was not
10
+ * applicable or was skipped) and resolves to an `unknown` capability; `null` = read and absent/disabled. A failed
11
+ * read must never be presented as "disabled".
12
+ */
13
+ export const RESILIENCE_FACTS_SCHEMA_VERSION = 1;
14
+ export const RESILIENCE_FACTS_SOURCE = 'AzureResilienceFacts';
15
+ export const RESILIENCE_FACTS_PORTAL_FILE = 'resilience-facts.json';
16
+ export const RESILIENCE_FACTS_RAW_FILE = 'data-protection/resilience-facts.json.gz';
@@ -0,0 +1,64 @@
1
+ import { isCount, isDateTime, isFiniteNumber, isRecord, isString, isStringArray } from '../common/validationHelpers.js';
2
+ import { RESILIENCE_FACTS_SCHEMA_VERSION, RESILIENCE_FACTS_SOURCE, } from './resilienceFacts.js';
3
+ const STATUSES = new Set(['collected', 'partial', 'failed', 'not-applicable']);
4
+ const isNullableBoolean = (value) => value === null || typeof value === 'boolean';
5
+ const isNullableNumber = (value) => value === null || isFiniteNumber(value);
6
+ const isOptionalNullableNumber = (value) => value === undefined || isNullableNumber(value);
7
+ const isOptionalNullableString = (value) => value === undefined || value === null || isString(value);
8
+ const isRetention = (value) => value === undefined || value === null || (isRecord(value) && typeof value.enabled === 'boolean' && isOptionalNullableNumber(value.days));
9
+ const isOptionalNullableBoolean = (value) => value === undefined || isNullableBoolean(value);
10
+ const isStorageFacts = (value) => isRecord(value) &&
11
+ isRetention(value.blobSoftDelete) &&
12
+ isRetention(value.containerSoftDelete) &&
13
+ isOptionalNullableBoolean(value.versioning) &&
14
+ isRetention(value.changeFeed) &&
15
+ isRetention(value.pointInTimeRestore) &&
16
+ isOptionalNullableString(value.kind) &&
17
+ (value.managementPolicy === undefined ||
18
+ value.managementPolicy === null ||
19
+ (isRecord(value.managementPolicy) &&
20
+ typeof value.managementPolicy.present === 'boolean' &&
21
+ (value.managementPolicy.ruleCount === undefined || isCount(value.managementPolicy.ruleCount))));
22
+ const isSqlFacts = (value) => isRecord(value) &&
23
+ isOptionalNullableNumber(value.shortTermRetentionDays) &&
24
+ isOptionalNullableNumber(value.diffBackupIntervalHours) &&
25
+ (value.longTermRetention === undefined ||
26
+ value.longTermRetention === null ||
27
+ (isRecord(value.longTermRetention) &&
28
+ typeof value.longTermRetention.enabled === 'boolean' &&
29
+ isOptionalNullableString(value.longTermRetention.weekly) &&
30
+ isOptionalNullableString(value.longTermRetention.monthly) &&
31
+ isOptionalNullableString(value.longTermRetention.yearly) &&
32
+ isOptionalNullableNumber(value.longTermRetention.weekOfYear))) &&
33
+ (value.failoverGroup === undefined ||
34
+ value.failoverGroup === null ||
35
+ (isRecord(value.failoverGroup) &&
36
+ isString(value.failoverGroup.id) &&
37
+ isString(value.failoverGroup.name) &&
38
+ isStringArray(value.failoverGroup.partnerServers) &&
39
+ isOptionalNullableString(value.failoverGroup.readWriteFailoverPolicy) &&
40
+ isOptionalNullableString(value.failoverGroup.role))) &&
41
+ isOptionalNullableString(value.backupStorageRedundancy);
42
+ export const isResilienceFactsItem = (value) => isRecord(value) &&
43
+ isString(value.resourceId) &&
44
+ isString(value.resourceType) &&
45
+ isString(value.status) &&
46
+ STATUSES.has(value.status) &&
47
+ isDateTime(value.observedAt) &&
48
+ isCount(value.requestCount) &&
49
+ (value.errors === undefined || isStringArray(value.errors)) &&
50
+ (value.storage === undefined || isStorageFacts(value.storage)) &&
51
+ (value.sql === undefined || isSqlFacts(value.sql));
52
+ export const isResilienceFactsProjection = (value) => isRecord(value) &&
53
+ value.schemaVersion === RESILIENCE_FACTS_SCHEMA_VERSION &&
54
+ value.source === RESILIENCE_FACTS_SOURCE &&
55
+ isString(value.subscriptionId) &&
56
+ (value.tenantId === undefined || isString(value.tenantId)) &&
57
+ isDateTime(value.generatedAt) &&
58
+ isRecord(value.summary) &&
59
+ (value.summary.notApplicable === undefined || isCount(value.summary.notApplicable)) &&
60
+ ['storageAccounts', 'sqlDatabases', 'sqlServers', 'collected', 'partial', 'failed', 'requestCount'].every(key => isCount(value.summary[key])) &&
61
+ Array.isArray(value.items) &&
62
+ value.items.every(isResilienceFactsItem) &&
63
+ Array.isArray(value.issues) &&
64
+ value.issues.every(issue => isRecord(issue) && (issue.severity === 'warning' || issue.severity === 'error') && isString(issue.code) && isString(issue.message));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ export const STORY_KEYS = [
2
+ 'oversized-resources',
3
+ 'right-sku',
4
+ 'schedule-candidates',
5
+ 'resilience-recovery',
6
+ 'hybrid-benefit',
7
+ 'commitments',
8
+ ];
9
+ export const STORY_LIMITS = {
10
+ sectionRows: 1000,
11
+ sampleRows: 50,
12
+ windowDays: 30,
13
+ weeklyGridDays: 7,
14
+ weeklyGridHours: 24,
15
+ /** Story fingerprints retained per monthly history period (all stories together). */
16
+ historyFingerprints: 2000,
17
+ };