@spottoai/types-package 1.0.2-beta.415 → 1.0.2-beta.417

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 +9 -1
  2. package/dist/azure/reportEvidence.d.ts.map +1 -1
  3. package/dist/azure/reportEvidence.js +2 -1
  4. package/dist/azure/reportEvidence.js.map +1 -1
  5. package/dist/azure/reportEvidenceValidation.d.ts.map +1 -1
  6. package/dist/azure/reportEvidenceValidation.js +16 -0
  7. package/dist/azure/reportEvidenceValidation.js.map +1 -1
  8. package/dist/esm/azure/reportEvidence.js +2 -1
  9. package/dist/esm/azure/reportEvidenceValidation.js +16 -0
  10. package/dist/esm/scheduler/bastionSchedule.js +1 -0
  11. package/dist/esm/scheduler/bastionScheduleProfile.js +206 -0
  12. package/dist/esm/scheduler/bastionScheduleValidation.js +401 -0
  13. package/dist/esm/scheduler/index.js +3 -0
  14. package/dist/scheduler/bastionSchedule.d.ts +113 -0
  15. package/dist/scheduler/bastionSchedule.d.ts.map +1 -0
  16. package/dist/scheduler/bastionSchedule.js +3 -0
  17. package/dist/scheduler/bastionSchedule.js.map +1 -0
  18. package/dist/scheduler/bastionScheduleProfile.d.ts +24 -0
  19. package/dist/scheduler/bastionScheduleProfile.d.ts.map +1 -0
  20. package/dist/scheduler/bastionScheduleProfile.js +210 -0
  21. package/dist/scheduler/bastionScheduleProfile.js.map +1 -0
  22. package/dist/scheduler/bastionScheduleValidation.d.ts +10 -0
  23. package/dist/scheduler/bastionScheduleValidation.d.ts.map +1 -0
  24. package/dist/scheduler/bastionScheduleValidation.js +412 -0
  25. package/dist/scheduler/bastionScheduleValidation.js.map +1 -0
  26. package/dist/scheduler/index.d.ts +3 -0
  27. package/dist/scheduler/index.d.ts.map +1 -1
  28. package/dist/scheduler/index.js +3 -0
  29. package/dist/scheduler/index.js.map +1 -1
  30. package/dist/scheduler/scheduler.d.ts +14 -10
  31. package/dist/scheduler/scheduler.d.ts.map +1 -1
  32. package/package.json +3 -2
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readSupportedBastionScheduleProfileV1 = readSupportedBastionScheduleProfileV1;
4
+ const MAX_IDENTIFIER_LENGTH = 2048;
5
+ const MAX_ETAG_LENGTH = 4096;
6
+ const MAX_LOCATION_LENGTH = 128;
7
+ const MAX_IP_CONFIGURATION_NAME_LENGTH = 80;
8
+ const MAX_TAG_COUNT = 50;
9
+ const MAX_TAG_NAME_LENGTH = 512;
10
+ const MAX_TAG_VALUE_LENGTH = 256;
11
+ function isPlainRecord(value) {
12
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
13
+ return false;
14
+ const prototype = Reflect.getPrototypeOf(value);
15
+ return prototype === Object.prototype || prototype === null;
16
+ }
17
+ function hasOnlyFields(value, fields) {
18
+ const allowed = new Set(fields);
19
+ return Object.keys(value).every(field => allowed.has(field));
20
+ }
21
+ function readString(value, maximumLength) {
22
+ if (typeof value !== 'string' || value.trim().length === 0 || value.length > maximumLength)
23
+ return undefined;
24
+ return value.trim();
25
+ }
26
+ function normalizeResourceId(value) {
27
+ const resourceId = readString(value, MAX_IDENTIFIER_LENGTH);
28
+ if (!resourceId || resourceId.includes('\\') || resourceId.includes('//') || resourceId.endsWith('/'))
29
+ return undefined;
30
+ return resourceId.toLowerCase();
31
+ }
32
+ function readBastionSubscriptionId(resourceId) {
33
+ return /^\/subscriptions\/([a-z0-9-]+)\/resourcegroups\/[a-z0-9._()-]+\/providers\/microsoft\.network\/bastionhosts\/[a-z0-9._()-]+$/.exec(resourceId)?.[1];
34
+ }
35
+ function readBoolean(value) {
36
+ return value === undefined ? false : typeof value === 'boolean' ? value : undefined;
37
+ }
38
+ function readTags(value) {
39
+ if (value === undefined)
40
+ return {};
41
+ if (!isPlainRecord(value) || Object.keys(value).length > MAX_TAG_COUNT)
42
+ return undefined;
43
+ const entries = [];
44
+ for (const key of Object.keys(value).sort()) {
45
+ const tagValue = value[key];
46
+ if (key.length === 0 || key.length > MAX_TAG_NAME_LENGTH || typeof tagValue !== 'string' || tagValue.length > MAX_TAG_VALUE_LENGTH) {
47
+ return undefined;
48
+ }
49
+ entries.push([key, tagValue]);
50
+ }
51
+ return Object.fromEntries(entries);
52
+ }
53
+ function readZones(value) {
54
+ if (value === undefined)
55
+ return undefined;
56
+ if (!Array.isArray(value) ||
57
+ value.length < 1 ||
58
+ value.length > 3 ||
59
+ !value.every(zone => typeof zone === 'string' && /^[1-3]$/.test(zone)) ||
60
+ new Set(value).size !== value.length) {
61
+ return false;
62
+ }
63
+ return [...value].sort();
64
+ }
65
+ function readSku(value) {
66
+ if (!isPlainRecord(value) || !hasOnlyFields(value, ['name']))
67
+ return undefined;
68
+ const name = value['name'];
69
+ return name === 'Basic' || name === 'Standard' || name === 'Premium' ? name : undefined;
70
+ }
71
+ /** Normalizes an eligible public dedicated Azure Bastion profile for schedule readiness and recovery. */
72
+ function readSupportedBastionScheduleProfileV1(value, expectedResourceId) {
73
+ try {
74
+ if (!isPlainRecord(value) ||
75
+ !hasOnlyFields(value, ['name', 'id', 'etag', 'type', 'location', 'tags', 'sku', 'properties', 'systemData', 'zones'])) {
76
+ return undefined;
77
+ }
78
+ const normalizedExpectedResourceId = normalizeResourceId(expectedResourceId);
79
+ const normalizedSourceResourceId = normalizeResourceId(value['id']);
80
+ const bastionSubscriptionId = normalizedSourceResourceId ? readBastionSubscriptionId(normalizedSourceResourceId) : undefined;
81
+ const resourceType = readString(value['type'], MAX_IDENTIFIER_LENGTH)?.toLowerCase();
82
+ const sourceEtag = readString(value['etag'], MAX_ETAG_LENGTH);
83
+ const location = readString(value['location'], MAX_LOCATION_LENGTH)?.toLowerCase();
84
+ const tags = readTags(value['tags']);
85
+ const skuName = readSku(value['sku']);
86
+ const zones = readZones(value['zones']);
87
+ if (!normalizedExpectedResourceId ||
88
+ normalizedSourceResourceId !== normalizedExpectedResourceId ||
89
+ !bastionSubscriptionId ||
90
+ resourceType !== 'microsoft.network/bastionhosts' ||
91
+ !sourceEtag ||
92
+ !location ||
93
+ !tags ||
94
+ !skuName ||
95
+ zones === false) {
96
+ return undefined;
97
+ }
98
+ if (!isPlainRecord(value['properties']) ||
99
+ !hasOnlyFields(value['properties'], [
100
+ 'provisioningState',
101
+ 'dnsName',
102
+ 'publicUri',
103
+ 'scaleUnits',
104
+ 'disableCopyPaste',
105
+ 'enableFileCopy',
106
+ 'enableIpConnect',
107
+ 'enableShareableLink',
108
+ 'enableTunneling',
109
+ 'enableKerberos',
110
+ 'enableSessionRecording',
111
+ 'enablePrivateOnlyBastion',
112
+ 'ipConfigurations',
113
+ 'networkAcls',
114
+ 'virtualNetwork',
115
+ ]) ||
116
+ value['properties']['provisioningState'] !== 'Succeeded' ||
117
+ value['properties']['networkAcls'] !== undefined ||
118
+ value['properties']['virtualNetwork'] !== undefined) {
119
+ return undefined;
120
+ }
121
+ const properties = value['properties'];
122
+ const scaleUnits = properties['scaleUnits'];
123
+ if (typeof scaleUnits !== 'number' ||
124
+ !Number.isInteger(scaleUnits) ||
125
+ (skuName === 'Basic' ? scaleUnits !== 2 : scaleUnits < 2 || scaleUnits > 50)) {
126
+ return undefined;
127
+ }
128
+ const disableCopyPaste = readBoolean(properties['disableCopyPaste']);
129
+ const enableFileCopy = readBoolean(properties['enableFileCopy']);
130
+ const enableIpConnect = readBoolean(properties['enableIpConnect']);
131
+ const enableShareableLink = readBoolean(properties['enableShareableLink']);
132
+ const enableTunneling = readBoolean(properties['enableTunneling']);
133
+ const enableKerberos = readBoolean(properties['enableKerberos']);
134
+ const enableSessionRecording = readBoolean(properties['enableSessionRecording']);
135
+ const enablePrivateOnlyBastion = readBoolean(properties['enablePrivateOnlyBastion']);
136
+ if (disableCopyPaste === undefined ||
137
+ enableFileCopy === undefined ||
138
+ enableIpConnect === undefined ||
139
+ enableShareableLink === undefined ||
140
+ enableTunneling === undefined ||
141
+ enableKerberos === undefined ||
142
+ enableSessionRecording !== false ||
143
+ enablePrivateOnlyBastion !== false ||
144
+ (skuName === 'Basic' && (enableFileCopy || enableIpConnect || enableShareableLink || enableTunneling || enableKerberos))) {
145
+ return undefined;
146
+ }
147
+ const configurations = properties['ipConfigurations'];
148
+ if (!Array.isArray(configurations) || configurations.length !== 1)
149
+ return undefined;
150
+ const configuration = configurations[0];
151
+ if (!isPlainRecord(configuration) ||
152
+ !hasOnlyFields(configuration, ['name', 'id', 'etag', 'type', 'properties']) ||
153
+ !isPlainRecord(configuration['properties']) ||
154
+ !hasOnlyFields(configuration['properties'], ['provisioningState', 'privateIPAllocationMethod', 'publicIPAddress', 'subnet']) ||
155
+ (configuration['properties']['provisioningState'] !== undefined && configuration['properties']['provisioningState'] !== 'Succeeded') ||
156
+ configuration['properties']['privateIPAllocationMethod'] !== 'Dynamic') {
157
+ return undefined;
158
+ }
159
+ const ipConfigurationName = readString(configuration['name'], MAX_IP_CONFIGURATION_NAME_LENGTH);
160
+ const publicIp = configuration['properties']['publicIPAddress'];
161
+ const subnet = configuration['properties']['subnet'];
162
+ if (!ipConfigurationName ||
163
+ !isPlainRecord(publicIp) ||
164
+ !hasOnlyFields(publicIp, ['id']) ||
165
+ !isPlainRecord(subnet) ||
166
+ !hasOnlyFields(subnet, ['id'])) {
167
+ return undefined;
168
+ }
169
+ const publicIpId = normalizeResourceId(publicIp['id']);
170
+ const subnetId = normalizeResourceId(subnet['id']);
171
+ const publicIpMatch = publicIpId
172
+ ? /^\/subscriptions\/([a-z0-9-]+)\/resourcegroups\/[a-z0-9._()-]+\/providers\/microsoft\.network\/publicipaddresses\/[a-z0-9._()-]+$/.exec(publicIpId)
173
+ : undefined;
174
+ const subnetMatch = subnetId
175
+ ? /^\/subscriptions\/([a-z0-9-]+)\/resourcegroups\/[a-z0-9._()-]+\/providers\/microsoft\.network\/virtualnetworks\/[a-z0-9._()-]+\/subnets\/azurebastionsubnet$/.exec(subnetId)
176
+ : undefined;
177
+ if (!publicIpId ||
178
+ !publicIpMatch ||
179
+ publicIpMatch[1] !== bastionSubscriptionId ||
180
+ !subnetId ||
181
+ !subnetMatch ||
182
+ subnetMatch[1] !== bastionSubscriptionId) {
183
+ return undefined;
184
+ }
185
+ return {
186
+ skuName,
187
+ location,
188
+ ...(zones ? { zones } : {}),
189
+ scaleUnits,
190
+ disableCopyPaste,
191
+ enableFileCopy,
192
+ enableIpConnect,
193
+ enableShareableLink,
194
+ enableTunneling,
195
+ enableKerberos,
196
+ enableSessionRecording: false,
197
+ enablePrivateOnlyBastion: false,
198
+ tags,
199
+ ipConfigurationName,
200
+ publicIpId,
201
+ subnetId,
202
+ virtualNetworkId: subnetId.slice(0, subnetId.lastIndexOf('/subnets/')),
203
+ sourceEtag,
204
+ };
205
+ }
206
+ catch {
207
+ return undefined;
208
+ }
209
+ }
210
+ //# sourceMappingURL=bastionScheduleProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bastionScheduleProfile.js","sourceRoot":"","sources":["../../src/scheduler/bastionScheduleProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { BastionAvailabilityStatusV1, BastionAvailabilityWeeklyScheduleDefinition, BastionAvailabilityWeeklyScheduleWriteRequest, BastionPauseResponse, BastionRestoreNowResponse, BastionScheduleControlV1, BastionScheduleReadinessV1, BastionScheduleRun } from './bastionSchedule';
2
+ export declare function isBastionAvailabilityWeeklyScheduleWriteRequest(value: unknown): value is BastionAvailabilityWeeklyScheduleWriteRequest;
3
+ export declare function isBastionAvailabilityWeeklyScheduleDefinition(value: unknown): value is BastionAvailabilityWeeklyScheduleDefinition;
4
+ export declare function isBastionScheduleRun(value: unknown): value is BastionScheduleRun;
5
+ export declare function isBastionScheduleControlV1(value: unknown): value is BastionScheduleControlV1;
6
+ export declare function isBastionScheduleReadinessV1(value: unknown): value is BastionScheduleReadinessV1;
7
+ export declare function isBastionAvailabilityStatusV1(value: unknown): value is BastionAvailabilityStatusV1;
8
+ export declare function isBastionPauseResponse(value: unknown): value is BastionPauseResponse;
9
+ export declare function isBastionRestoreNowResponse(value: unknown): value is BastionRestoreNowResponse;
10
+ //# sourceMappingURL=bastionScheduleValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bastionScheduleValidation.d.ts","sourceRoot":"","sources":["../../src/scheduler/bastionScheduleValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAE3B,2CAA2C,EAC3C,6CAA6C,EAC7C,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAqN3B,wBAAgB,+CAA+C,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,6CAA6C,CAmCtI;AAED,wBAAgB,6CAA6C,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,2CAA2C,CA6DlI;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAkEhF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAsB5F;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,0BAA0B,CAiChG;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,2BAA2B,CAkClG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CASpF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAS9F"}
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isBastionAvailabilityWeeklyScheduleWriteRequest = isBastionAvailabilityWeeklyScheduleWriteRequest;
4
+ exports.isBastionAvailabilityWeeklyScheduleDefinition = isBastionAvailabilityWeeklyScheduleDefinition;
5
+ exports.isBastionScheduleRun = isBastionScheduleRun;
6
+ exports.isBastionScheduleControlV1 = isBastionScheduleControlV1;
7
+ exports.isBastionScheduleReadinessV1 = isBastionScheduleReadinessV1;
8
+ exports.isBastionAvailabilityStatusV1 = isBastionAvailabilityStatusV1;
9
+ exports.isBastionPauseResponse = isBastionPauseResponse;
10
+ exports.isBastionRestoreNowResponse = isBastionRestoreNowResponse;
11
+ const MAX_ID_LENGTH = 2048;
12
+ const MAX_NAME_LENGTH = 120;
13
+ const MAX_NOTES_LENGTH = 1000;
14
+ const MAX_ACTION_COUNT = 64;
15
+ const MAX_WINDOWS = 14;
16
+ const MAX_WRITE_REQUEST_BYTES = 32 * 1024;
17
+ const MAX_PUBLIC_DTO_BYTES = 16 * 1024;
18
+ const MINUTES_PER_WEEK = 7 * 24 * 60;
19
+ const readinessStatuses = new Set(['confirmed', 'missing', 'unknown', 'unsupported']);
20
+ const readinessReasonCodes = new Set([
21
+ 'feature-disabled',
22
+ 'resource-not-found',
23
+ 'unsupported-profile',
24
+ 'unsupported-region',
25
+ 'missing-permission',
26
+ 'permission-unknown',
27
+ 'management-lock',
28
+ ]);
29
+ const availabilityPhases = new Set(['available', 'removing', 'absent', 'restoring']);
30
+ const availabilityResults = new Set(['succeeded', 'skipped', 'blocked', 'failed', 'pending']);
31
+ const availabilityReasonCodes = new Set([
32
+ ...readinessReasonCodes,
33
+ 'active-sessions',
34
+ 'session-state-unknown',
35
+ 'snapshot-failed',
36
+ 'active-snapshot-missing',
37
+ 'source-drift',
38
+ 'dependency-missing',
39
+ 'dependency-drift',
40
+ 'stale-run',
41
+ 'continuation-overdue',
42
+ 'azure-operation-failed',
43
+ 'restore-timeout',
44
+ ]);
45
+ function isPlainRecord(value) {
46
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
47
+ return false;
48
+ }
49
+ try {
50
+ const prototype = Object.getPrototypeOf(value);
51
+ return prototype === Object.prototype || prototype === null;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ function hasExactFields(value, requiredFields, optionalFields = []) {
58
+ if (!isPlainRecord(value)) {
59
+ return false;
60
+ }
61
+ try {
62
+ const allowedFields = new Set([...requiredFields, ...optionalFields]);
63
+ const keys = Object.keys(value);
64
+ return requiredFields.every(field => Object.prototype.hasOwnProperty.call(value, field)) && keys.every(field => allowedFields.has(field));
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ function utf8ByteLength(value) {
71
+ let bytes = 0;
72
+ for (let index = 0; index < value.length; index += 1) {
73
+ const code = value.charCodeAt(index);
74
+ if (code <= 0x7f) {
75
+ bytes += 1;
76
+ }
77
+ else if (code <= 0x7ff) {
78
+ bytes += 2;
79
+ }
80
+ else if (code >= 0xd800 &&
81
+ code <= 0xdbff &&
82
+ index + 1 < value.length &&
83
+ value.charCodeAt(index + 1) >= 0xdc00 &&
84
+ value.charCodeAt(index + 1) <= 0xdfff) {
85
+ bytes += 4;
86
+ index += 1;
87
+ }
88
+ else {
89
+ bytes += 3;
90
+ }
91
+ }
92
+ return bytes;
93
+ }
94
+ function isWithinJsonSize(value, maximumBytes) {
95
+ try {
96
+ const json = JSON.stringify(value);
97
+ return typeof json === 'string' && utf8ByteLength(json) <= maximumBytes;
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ function isBoundedString(value, maximumLength, allowEmpty = false) {
104
+ return typeof value === 'string' && value.length <= maximumLength && (allowEmpty || value.trim().length > 0);
105
+ }
106
+ function isPositiveSafeInteger(value) {
107
+ return Number.isSafeInteger(value) && typeof value === 'number' && value > 0;
108
+ }
109
+ function isIsoUtcTimestamp(value) {
110
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(value)) {
111
+ return false;
112
+ }
113
+ const parsed = new Date(value);
114
+ if (!Number.isFinite(parsed.getTime())) {
115
+ return false;
116
+ }
117
+ const normalizedInput = value.includes('.')
118
+ ? value.replace(/\.(\d{1,3})Z$/, (_, fraction) => `.${fraction.padEnd(3, '0')}Z`)
119
+ : value.replace('Z', '.000Z');
120
+ return parsed.toISOString() === normalizedInput;
121
+ }
122
+ function localTimeToMinutes(value) {
123
+ if (typeof value !== 'string' || !/^(?:[01]\d|2[0-3]):[0-5]\d$/.test(value)) {
124
+ return undefined;
125
+ }
126
+ const [hours, minutes] = value.split(':');
127
+ return Number(hours) * 60 + Number(minutes);
128
+ }
129
+ function isUniqueBoundedStringArray(value, minimumLength, maximumLength) {
130
+ if (!Array.isArray(value) ||
131
+ value.length < minimumLength ||
132
+ value.length > maximumLength ||
133
+ !value.every(item => isBoundedString(item, MAX_ID_LENGTH))) {
134
+ return false;
135
+ }
136
+ return new Set(value).size === value.length;
137
+ }
138
+ function isAvailabilityConfiguration(value) {
139
+ if (!hasExactFields(value, ['accessWindows'])) {
140
+ return false;
141
+ }
142
+ const windows = value.accessWindows;
143
+ if (!Array.isArray(windows) || windows.length < 1 || windows.length > MAX_WINDOWS) {
144
+ return false;
145
+ }
146
+ const windowIds = new Set();
147
+ const intervals = [];
148
+ for (const window of windows) {
149
+ if (!hasExactFields(window, ['windowId', 'daysOfWeek', 'accessStartTimeLocal', 'accessEndTimeLocal']) ||
150
+ !isBoundedString(window.windowId, MAX_ID_LENGTH) ||
151
+ windowIds.has(window.windowId)) {
152
+ return false;
153
+ }
154
+ windowIds.add(window.windowId);
155
+ if (!Array.isArray(window.daysOfWeek) ||
156
+ window.daysOfWeek.length < 1 ||
157
+ window.daysOfWeek.length > 7 ||
158
+ !window.daysOfWeek.every(day => Number.isInteger(day) && typeof day === 'number' && day >= 0 && day <= 6) ||
159
+ new Set(window.daysOfWeek).size !== window.daysOfWeek.length) {
160
+ return false;
161
+ }
162
+ const startTime = localTimeToMinutes(window.accessStartTimeLocal);
163
+ const endTime = localTimeToMinutes(window.accessEndTimeLocal);
164
+ if (startTime === undefined || endTime === undefined || startTime === endTime) {
165
+ return false;
166
+ }
167
+ for (const day of window.daysOfWeek) {
168
+ const start = day * 24 * 60 + startTime;
169
+ const end = day * 24 * 60 + endTime + (endTime <= startTime ? 24 * 60 : 0);
170
+ intervals.push({ start, end });
171
+ }
172
+ }
173
+ return !intervals.some((left, leftIndex) => intervals.some((right, rightIndex) => {
174
+ if (rightIndex <= leftIndex) {
175
+ return false;
176
+ }
177
+ return [-MINUTES_PER_WEEK, 0, MINUTES_PER_WEEK].some(offset => {
178
+ const shiftedStart = right.start + offset;
179
+ const shiftedEnd = right.end + offset;
180
+ return left.start < shiftedEnd && shiftedStart < left.end;
181
+ });
182
+ }));
183
+ }
184
+ function isBastionAvailabilityWeeklyScheduleWriteRequest(value) {
185
+ if (!isWithinJsonSize(value, MAX_WRITE_REQUEST_BYTES) ||
186
+ !hasExactFields(value, [
187
+ 'definitionType',
188
+ 'name',
189
+ 'providerName',
190
+ 'providerScopeId',
191
+ 'cloudAccountId',
192
+ 'resourceId',
193
+ 'timezone',
194
+ 'acknowledgementVersion',
195
+ 'configuration',
196
+ ], ['targetResourceType', 'notes'])) {
197
+ return false;
198
+ }
199
+ return (value.definitionType === 'bastion-availability-weekly' &&
200
+ isBoundedString(value.name, MAX_NAME_LENGTH) &&
201
+ isBoundedString(value.providerName, MAX_ID_LENGTH) &&
202
+ isBoundedString(value.providerScopeId, MAX_ID_LENGTH) &&
203
+ isBoundedString(value.cloudAccountId, MAX_ID_LENGTH) &&
204
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
205
+ isBoundedString(value.timezone, MAX_ID_LENGTH) &&
206
+ (value.targetResourceType === undefined || value.targetResourceType === 'Microsoft.Network/bastionHosts') &&
207
+ (value.notes === undefined || isBoundedString(value.notes, MAX_NOTES_LENGTH, true)) &&
208
+ value.acknowledgementVersion === 'bastion-delete-recreate-v1' &&
209
+ isAvailabilityConfiguration(value.configuration));
210
+ }
211
+ function isBastionAvailabilityWeeklyScheduleDefinition(value) {
212
+ if (!isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) ||
213
+ !hasExactFields(value, [
214
+ 'definitionId',
215
+ 'definitionClass',
216
+ 'definitionType',
217
+ 'companyId',
218
+ 'providerName',
219
+ 'providerScopeId',
220
+ 'cloudAccountId',
221
+ 'resourceId',
222
+ 'targetResourceType',
223
+ 'name',
224
+ 'timezone',
225
+ 'status',
226
+ 'definitionRevision',
227
+ 'acknowledgementVersion',
228
+ 'configuration',
229
+ 'createdAtUtc',
230
+ 'updatedAtUtc',
231
+ ], ['notes', 'compiledScheduleIds', 'nextRunUtc', 'lastRunAtUtc', 'lastSuccessfulRunAtUtc', 'lastRunStatus', 'createdByUserId', 'updatedByUserId'])) {
232
+ return false;
233
+ }
234
+ return (value.definitionId !== undefined &&
235
+ isBoundedString(value.definitionId, MAX_ID_LENGTH) &&
236
+ value.definitionClass === 'composite' &&
237
+ value.definitionType === 'bastion-availability-weekly' &&
238
+ isBoundedString(value.companyId, MAX_ID_LENGTH) &&
239
+ isBoundedString(value.providerName, MAX_ID_LENGTH) &&
240
+ isBoundedString(value.providerScopeId, MAX_ID_LENGTH) &&
241
+ isBoundedString(value.cloudAccountId, MAX_ID_LENGTH) &&
242
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
243
+ value.targetResourceType === 'Microsoft.Network/bastionHosts' &&
244
+ isBoundedString(value.name, MAX_NAME_LENGTH) &&
245
+ isBoundedString(value.timezone, MAX_ID_LENGTH) &&
246
+ (value.status === 'active' || value.status === 'paused') &&
247
+ isPositiveSafeInteger(value.definitionRevision) &&
248
+ value.acknowledgementVersion === 'bastion-delete-recreate-v1' &&
249
+ isAvailabilityConfiguration(value.configuration) &&
250
+ (value.notes === undefined || isBoundedString(value.notes, MAX_NOTES_LENGTH, true)) &&
251
+ (value.compiledScheduleIds === undefined || isUniqueBoundedStringArray(value.compiledScheduleIds, 0, 28)) &&
252
+ (value.nextRunUtc === undefined || isIsoUtcTimestamp(value.nextRunUtc)) &&
253
+ (value.lastRunAtUtc === undefined || isIsoUtcTimestamp(value.lastRunAtUtc)) &&
254
+ (value.lastSuccessfulRunAtUtc === undefined || isIsoUtcTimestamp(value.lastSuccessfulRunAtUtc)) &&
255
+ (value.lastRunStatus === undefined ||
256
+ value.lastRunStatus === 'success' ||
257
+ value.lastRunStatus === 'dispatch-failed' ||
258
+ value.lastRunStatus === 'dispatching') &&
259
+ isIsoUtcTimestamp(value.createdAtUtc) &&
260
+ isIsoUtcTimestamp(value.updatedAtUtc) &&
261
+ (value.createdByUserId === undefined || isBoundedString(value.createdByUserId, MAX_ID_LENGTH)) &&
262
+ (value.updatedByUserId === undefined || isBoundedString(value.updatedByUserId, MAX_ID_LENGTH)));
263
+ }
264
+ function isBastionScheduleRun(value) {
265
+ if (!isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) ||
266
+ !isPlainRecord(value) ||
267
+ (value['compiledOperation'] !== 'remove' && value['compiledOperation'] !== 'restore')) {
268
+ return false;
269
+ }
270
+ const commonRequiredFields = [
271
+ 'scheduleId',
272
+ 'scheduleRunId',
273
+ 'targetType',
274
+ 'selectorType',
275
+ 'scheduleType',
276
+ 'providerScopeId',
277
+ 'cloudAccountId',
278
+ 'resourceId',
279
+ 'definitionId',
280
+ 'definitionClass',
281
+ 'definitionType',
282
+ 'compiledRuleId',
283
+ 'compiledOperation',
284
+ 'definitionRevision',
285
+ 'scheduledForUtc',
286
+ ];
287
+ const requiredFields = value['compiledOperation'] === 'remove'
288
+ ? [...commonRequiredFields, 'controlGeneration']
289
+ : commonRequiredFields;
290
+ if (!hasExactFields(value, requiredFields, [
291
+ 'scheduleName',
292
+ 'scheduleGroupId',
293
+ 'scheduleGroupType',
294
+ 'targetCount',
295
+ 'createdByUserId',
296
+ 'updatedByUserId',
297
+ ])) {
298
+ return false;
299
+ }
300
+ return (isBoundedString(value.scheduleId, MAX_ID_LENGTH) &&
301
+ isBoundedString(value.scheduleRunId, MAX_ID_LENGTH) &&
302
+ (value.scheduleName === undefined || isBoundedString(value.scheduleName, MAX_NAME_LENGTH)) &&
303
+ value.targetType === 'resource-operation' &&
304
+ value.selectorType === 'single-resource' &&
305
+ value.scheduleType === 'recurring' &&
306
+ isBoundedString(value.providerScopeId, MAX_ID_LENGTH) &&
307
+ isBoundedString(value.cloudAccountId, MAX_ID_LENGTH) &&
308
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
309
+ isBoundedString(value.definitionId, MAX_ID_LENGTH) &&
310
+ value.definitionClass === 'composite' &&
311
+ value.definitionType === 'bastion-availability-weekly' &&
312
+ isBoundedString(value.compiledRuleId, MAX_ID_LENGTH) &&
313
+ isPositiveSafeInteger(value.definitionRevision) &&
314
+ isIsoUtcTimestamp(value.scheduledForUtc) &&
315
+ (value.scheduleGroupId === undefined || isBoundedString(value.scheduleGroupId, MAX_ID_LENGTH)) &&
316
+ (value.scheduleGroupType === undefined || value.scheduleGroupType === 'resource-schedule-definition') &&
317
+ (value.targetCount === undefined || value.targetCount === 1) &&
318
+ (value.createdByUserId === undefined || isBoundedString(value.createdByUserId, MAX_ID_LENGTH)) &&
319
+ (value.updatedByUserId === undefined || isBoundedString(value.updatedByUserId, MAX_ID_LENGTH)) &&
320
+ (value.compiledOperation === 'restore' || isPositiveSafeInteger(value.controlGeneration)));
321
+ }
322
+ function isBastionScheduleControlV1(value) {
323
+ return (isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) &&
324
+ hasExactFields(value, [
325
+ 'schemaVersion',
326
+ 'companyId',
327
+ 'resourceId',
328
+ 'definitionId',
329
+ 'definitionRevision',
330
+ 'controlGeneration',
331
+ 'desiredStatus',
332
+ 'updatedAtUtc',
333
+ ]) &&
334
+ value.schemaVersion === 1 &&
335
+ isBoundedString(value.companyId, MAX_ID_LENGTH) &&
336
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
337
+ isBoundedString(value.definitionId, MAX_ID_LENGTH) &&
338
+ isPositiveSafeInteger(value.definitionRevision) &&
339
+ isPositiveSafeInteger(value.controlGeneration) &&
340
+ (value.desiredStatus === 'active' || value.desiredStatus === 'paused') &&
341
+ isIsoUtcTimestamp(value.updatedAtUtc));
342
+ }
343
+ function isBastionScheduleReadinessV1(value) {
344
+ if (!isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) ||
345
+ !hasExactFields(value, ['schemaVersion', 'status', 'companyId', 'cloudAccountId', 'subscriptionId', 'resourceId', 'requiredActions', 'missingActions', 'checkedAtUtc'], ['reasonCode'])) {
346
+ return false;
347
+ }
348
+ const requiredActions = value.requiredActions;
349
+ const missingActions = value.missingActions;
350
+ if (value.schemaVersion !== 1 ||
351
+ typeof value.status !== 'string' ||
352
+ !readinessStatuses.has(value.status) ||
353
+ !isBoundedString(value.companyId, MAX_ID_LENGTH) ||
354
+ !isBoundedString(value.cloudAccountId, MAX_ID_LENGTH) ||
355
+ !isBoundedString(value.subscriptionId, MAX_ID_LENGTH) ||
356
+ !isBoundedString(value.resourceId, MAX_ID_LENGTH) ||
357
+ !isUniqueBoundedStringArray(requiredActions, 1, MAX_ACTION_COUNT) ||
358
+ !isUniqueBoundedStringArray(missingActions, 0, MAX_ACTION_COUNT) ||
359
+ !missingActions.every(action => requiredActions.includes(action)) ||
360
+ (value.status === 'confirmed' && missingActions.length !== 0) ||
361
+ (value.status === 'missing' && missingActions.length === 0) ||
362
+ !isIsoUtcTimestamp(value.checkedAtUtc)) {
363
+ return false;
364
+ }
365
+ return value.reasonCode === undefined || (typeof value.reasonCode === 'string' && readinessReasonCodes.has(value.reasonCode));
366
+ }
367
+ function isBastionAvailabilityStatusV1(value) {
368
+ return (isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) &&
369
+ hasExactFields(value, [
370
+ 'schemaVersion',
371
+ 'companyId',
372
+ 'resourceId',
373
+ 'definitionId',
374
+ 'definitionRevision',
375
+ 'phase',
376
+ 'lastOperation',
377
+ 'lastResult',
378
+ 'restoreAvailable',
379
+ 'updatedAtUtc',
380
+ ], ['reasonCode', 'snapshotCapturedAtUtc']) &&
381
+ value.schemaVersion === 1 &&
382
+ isBoundedString(value.companyId, MAX_ID_LENGTH) &&
383
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
384
+ isBoundedString(value.definitionId, MAX_ID_LENGTH) &&
385
+ isPositiveSafeInteger(value.definitionRevision) &&
386
+ typeof value.phase === 'string' &&
387
+ availabilityPhases.has(value.phase) &&
388
+ (value.lastOperation === 'remove' || value.lastOperation === 'restore') &&
389
+ typeof value.lastResult === 'string' &&
390
+ availabilityResults.has(value.lastResult) &&
391
+ (value.reasonCode === undefined || (typeof value.reasonCode === 'string' && availabilityReasonCodes.has(value.reasonCode))) &&
392
+ (value.snapshotCapturedAtUtc === undefined || isIsoUtcTimestamp(value.snapshotCapturedAtUtc)) &&
393
+ typeof value.restoreAvailable === 'boolean' &&
394
+ isIsoUtcTimestamp(value.updatedAtUtc));
395
+ }
396
+ function isBastionPauseResponse(value) {
397
+ return (isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) &&
398
+ hasExactFields(value, ['status', 'resourceId', 'controlGeneration', 'requestedAtUtc']) &&
399
+ (value.status === 'paused' || value.status === 'pause-pending') &&
400
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
401
+ isPositiveSafeInteger(value.controlGeneration) &&
402
+ isIsoUtcTimestamp(value.requestedAtUtc));
403
+ }
404
+ function isBastionRestoreNowResponse(value) {
405
+ return (isWithinJsonSize(value, MAX_PUBLIC_DTO_BYTES) &&
406
+ hasExactFields(value, ['accepted', 'scheduleRunId', 'resourceId', 'requestedAtUtc']) &&
407
+ typeof value.accepted === 'boolean' &&
408
+ isBoundedString(value.scheduleRunId, MAX_ID_LENGTH) &&
409
+ isBoundedString(value.resourceId, MAX_ID_LENGTH) &&
410
+ isIsoUtcTimestamp(value.requestedAtUtc));
411
+ }
412
+ //# sourceMappingURL=bastionScheduleValidation.js.map