@automate.ax/integration-contracts 0.104.0 → 0.107.0
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.
- package/dist/close/events.d.ts +13 -13
- package/dist/close/schemas.d.ts +9 -9
- package/dist/cloudflare/api.d.ts +93 -0
- package/dist/cloudflare/api.js +250 -0
- package/dist/cloudflare/events.d.ts +1340 -0
- package/dist/cloudflare/events.js +178 -0
- package/dist/cloudflare/index.d.ts +3 -0
- package/dist/cloudflare/index.js +3 -0
- package/dist/cloudflare/schemas.d.ts +608 -0
- package/dist/cloudflare/schemas.js +340 -0
- package/dist/linear/api.d.ts +1 -1
- package/dist/linear/api.js +9 -6
- package/dist/linear/index.d.ts +3479 -782
- package/dist/linear/index.js +249 -13
- package/dist/linear/schemas.d.ts +2721 -28
- package/dist/linear/schemas.js +515 -2
- package/dist/notion/index.js +2 -2
- package/dist/notion/schemas.d.ts +2140 -58
- package/dist/notion/schemas.js +41 -2
- package/dist/outlook/schemas.d.ts +2 -2
- package/dist/resend/action-schemas.d.ts +9 -9
- package/dist/resend/index.d.ts +36 -36
- package/dist/resend/schemas.d.ts +40 -40
- package/dist/slack/event-schemas.d.ts +583 -583
- package/dist/slack/index.d.ts +303 -303
- package/dist/slack/schemas.d.ts +1 -1
- package/dist/teams/schemas.d.ts +5 -5
- package/dist/triggers.d.ts +2 -1
- package/dist/whatsapp/index.d.ts +2 -2
- package/dist/whatsapp/schemas.d.ts +5 -5
- package/package.json +8 -2
- package/src/cloudflare/api.ts +340 -0
- package/src/cloudflare/events.ts +212 -0
- package/src/cloudflare/index.ts +3 -0
- package/src/cloudflare/schemas.ts +359 -0
- package/src/linear/api.ts +10 -6
- package/src/linear/index.ts +249 -26
- package/src/linear/schemas.ts +688 -2
- package/src/notion/index.ts +2 -2
- package/src/notion/schemas.ts +58 -4
- package/src/triggers.ts +2 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { encodableSchema } from "@automate.ax/codec";
|
|
3
|
+
import { fromCloudflare } from "./api.js";
|
|
4
|
+
import { CLOUDFLARE_ALERT_TYPE_SCHEMA, CLOUDFLARE_NOTIFICATION_FILTERS_SCHEMA, } from "./schemas.js";
|
|
5
|
+
const PROVIDER_EVENT_SCHEMA = z.looseObject({
|
|
6
|
+
account_id: z.string().optional(),
|
|
7
|
+
alert_correlation_id: z.string().optional(),
|
|
8
|
+
alert_event: z.string().optional(),
|
|
9
|
+
alert_type: CLOUDFLARE_ALERT_TYPE_SCHEMA.optional(),
|
|
10
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
11
|
+
name: z.string().optional(),
|
|
12
|
+
policy_id: z.string().optional(),
|
|
13
|
+
policy_name: z.string().optional(),
|
|
14
|
+
text: z.string().optional(),
|
|
15
|
+
ts: z.union([z.number(), z.string()]).optional(),
|
|
16
|
+
});
|
|
17
|
+
export const CLOUDFLARE_EVENT_SCHEMA = z.object({
|
|
18
|
+
accountId: z.string().optional(),
|
|
19
|
+
alertCorrelationId: z.string().optional(),
|
|
20
|
+
alertEvent: z.string().optional(),
|
|
21
|
+
alertType: CLOUDFLARE_ALERT_TYPE_SCHEMA,
|
|
22
|
+
data: z.record(z.string(), encodableSchema).prefault({}),
|
|
23
|
+
name: z.string().optional(),
|
|
24
|
+
policyId: z.string().optional(),
|
|
25
|
+
policyName: z.string().optional(),
|
|
26
|
+
text: z.string().optional(),
|
|
27
|
+
timestamp: z.union([z.number(), z.string()]).optional(),
|
|
28
|
+
});
|
|
29
|
+
const LAYER_4_DDOS_DATA_SCHEMA = z.object({
|
|
30
|
+
accountName: z.string().optional(),
|
|
31
|
+
accountTag: z.string().optional(),
|
|
32
|
+
action: z.string().optional(),
|
|
33
|
+
attackId: z.string().optional(),
|
|
34
|
+
attackVector: z.string().optional(),
|
|
35
|
+
dashboardLink: z.string().optional(),
|
|
36
|
+
maxRate: z.string().optional(),
|
|
37
|
+
megabitsPerSecond: z.number().optional(),
|
|
38
|
+
mitigation: z.string().optional(),
|
|
39
|
+
packetsPerSecond: z.number().optional(),
|
|
40
|
+
protocol: z.string().optional(),
|
|
41
|
+
ruleDescription: z.string().optional(),
|
|
42
|
+
ruleId: z.string().optional(),
|
|
43
|
+
ruleName: z.string().optional(),
|
|
44
|
+
rulesetId: z.string().optional(),
|
|
45
|
+
rulesetOverrideId: z.string().optional(),
|
|
46
|
+
startTime: z.string().optional(),
|
|
47
|
+
targetId: z.string().optional(),
|
|
48
|
+
targetIp: z.string().optional(),
|
|
49
|
+
targetPort: z.number().optional(),
|
|
50
|
+
});
|
|
51
|
+
const LAYER_7_DDOS_DATA_SCHEMA = z.object({
|
|
52
|
+
accountName: z.string().optional(),
|
|
53
|
+
accountTag: z.string().optional(),
|
|
54
|
+
action: z.string().optional(),
|
|
55
|
+
attackId: z.string().optional(),
|
|
56
|
+
attackType: z.string().optional(),
|
|
57
|
+
dashboardLink: z.string().optional(),
|
|
58
|
+
maxRate: z.string().optional(),
|
|
59
|
+
mitigation: z.string().optional(),
|
|
60
|
+
requestsPerSecond: z.number().optional(),
|
|
61
|
+
ruleDescription: z.string().optional(),
|
|
62
|
+
ruleId: z.string().optional(),
|
|
63
|
+
ruleLink: z.string().optional(),
|
|
64
|
+
rulesetId: z.string().optional(),
|
|
65
|
+
rulesetOverrideId: z.string().optional(),
|
|
66
|
+
startTime: z.string().optional(),
|
|
67
|
+
targetHostname: z.string().optional(),
|
|
68
|
+
zoneName: z.string().optional(),
|
|
69
|
+
zoneTag: z.string().optional(),
|
|
70
|
+
});
|
|
71
|
+
const SSL_DATA_SCHEMA = z.object({
|
|
72
|
+
accountName: z.string().optional(),
|
|
73
|
+
accountTag: z.string().optional(),
|
|
74
|
+
certificateId: z.string().optional(),
|
|
75
|
+
certificatePackId: z.string().optional(),
|
|
76
|
+
certificateStatus: z.string().optional(),
|
|
77
|
+
eventType: z.string().optional(),
|
|
78
|
+
hostnames: z.string().optional(),
|
|
79
|
+
packCa: z.string().optional(),
|
|
80
|
+
packId: z.string().optional(),
|
|
81
|
+
packStatus: z.string().optional(),
|
|
82
|
+
packValidation: z.string().optional(),
|
|
83
|
+
zoneName: z.string().optional(),
|
|
84
|
+
zoneTag: z.string().optional(),
|
|
85
|
+
});
|
|
86
|
+
const HEALTH_CHECK_DATA_SCHEMA = z.object({
|
|
87
|
+
accountName: z.string().optional(),
|
|
88
|
+
accountTag: z.string().optional(),
|
|
89
|
+
failingRegions: z.string().optional(),
|
|
90
|
+
healthCheckId: z.string().optional(),
|
|
91
|
+
healthCheckName: z.string().optional(),
|
|
92
|
+
newHealthStatus: z.string().optional(),
|
|
93
|
+
newStatus: z.string().optional(),
|
|
94
|
+
oldStatus: z.string().optional(),
|
|
95
|
+
originIp: z.string().optional(),
|
|
96
|
+
reason: z.string().optional(),
|
|
97
|
+
statusChangeTime: z.string().optional(),
|
|
98
|
+
timeSinceLastFailure: z.string().optional(),
|
|
99
|
+
zoneName: z.string().optional(),
|
|
100
|
+
zoneTag: z.string().optional(),
|
|
101
|
+
});
|
|
102
|
+
const ACCESS_CERTIFICATE_DATA_SCHEMA = z.object({
|
|
103
|
+
accountName: z.string().optional(),
|
|
104
|
+
accountTag: z.string().optional(),
|
|
105
|
+
certificateId: z.string().optional(),
|
|
106
|
+
daysTilExpiration: z.number().optional(),
|
|
107
|
+
hostnames: z.string().optional(),
|
|
108
|
+
zoneName: z.string().optional(),
|
|
109
|
+
zoneTag: z.string().optional(),
|
|
110
|
+
});
|
|
111
|
+
/**
|
|
112
|
+
* Builds one alert-type-specific Cloudflare event schema.
|
|
113
|
+
*
|
|
114
|
+
* @param alertType - Exact Cloudflare policy alert type.
|
|
115
|
+
* @param data - Stable documented alert data schema.
|
|
116
|
+
*/
|
|
117
|
+
function semanticEvent(alertType, data) {
|
|
118
|
+
return CLOUDFLARE_EVENT_SCHEMA.extend({ alertType, data });
|
|
119
|
+
}
|
|
120
|
+
export const CLOUDFLARE_LAYER_4_DDOS_EVENT_SCHEMA = semanticEvent(z.literal("advanced_ddos_attack_l4_alert"), LAYER_4_DDOS_DATA_SCHEMA);
|
|
121
|
+
export const CLOUDFLARE_LAYER_7_DDOS_EVENT_SCHEMA = semanticEvent(z.literal("advanced_ddos_attack_l7_alert"), LAYER_7_DDOS_DATA_SCHEMA);
|
|
122
|
+
export const CLOUDFLARE_SSL_CERTIFICATE_EVENT_SCHEMA = semanticEvent(z.literal("dedicated_ssl_certificate_event_type"), SSL_DATA_SCHEMA);
|
|
123
|
+
export const CLOUDFLARE_ORIGIN_HEALTH_CHECK_EVENT_SCHEMA = semanticEvent(z.literal("health_check_status_notification"), HEALTH_CHECK_DATA_SCHEMA);
|
|
124
|
+
export const CLOUDFLARE_ACCESS_CERTIFICATE_EVENT_SCHEMA = semanticEvent(z.literal("access_custom_certificate_expiration_type"), ACCESS_CERTIFICATE_DATA_SCHEMA);
|
|
125
|
+
export const CLOUDFLARE_TRIGGER_CONFIG_SCHEMA = z.object({
|
|
126
|
+
accountId: z.string().trim().min(1),
|
|
127
|
+
alertTypes: CLOUDFLARE_ALERT_TYPE_SCHEMA.array()
|
|
128
|
+
.min(1)
|
|
129
|
+
.refine((alertTypes) => new Set(alertTypes).size === alertTypes.length, "Choose each alert type once."),
|
|
130
|
+
filters: CLOUDFLARE_NOTIFICATION_FILTERS_SCHEMA.optional(),
|
|
131
|
+
});
|
|
132
|
+
export const cloudflareTriggerContracts = {
|
|
133
|
+
"cloudflare.accessCertificate.expiring": {
|
|
134
|
+
configSchema: CLOUDFLARE_TRIGGER_CONFIG_SCHEMA,
|
|
135
|
+
eventSchema: CLOUDFLARE_ACCESS_CERTIFICATE_EVENT_SCHEMA,
|
|
136
|
+
},
|
|
137
|
+
"cloudflare.layer4DdosAttack": {
|
|
138
|
+
configSchema: CLOUDFLARE_TRIGGER_CONFIG_SCHEMA,
|
|
139
|
+
eventSchema: CLOUDFLARE_LAYER_4_DDOS_EVENT_SCHEMA,
|
|
140
|
+
},
|
|
141
|
+
"cloudflare.layer7DdosAttack": {
|
|
142
|
+
configSchema: CLOUDFLARE_TRIGGER_CONFIG_SCHEMA,
|
|
143
|
+
eventSchema: CLOUDFLARE_LAYER_7_DDOS_EVENT_SCHEMA,
|
|
144
|
+
},
|
|
145
|
+
"cloudflare.notification": {
|
|
146
|
+
configSchema: CLOUDFLARE_TRIGGER_CONFIG_SCHEMA,
|
|
147
|
+
eventSchema: CLOUDFLARE_EVENT_SCHEMA,
|
|
148
|
+
},
|
|
149
|
+
"cloudflare.originHealthCheckStatusChanged": {
|
|
150
|
+
configSchema: CLOUDFLARE_TRIGGER_CONFIG_SCHEMA,
|
|
151
|
+
eventSchema: CLOUDFLARE_ORIGIN_HEALTH_CHECK_EVENT_SCHEMA,
|
|
152
|
+
},
|
|
153
|
+
"cloudflare.sslCertificate.event": {
|
|
154
|
+
configSchema: CLOUDFLARE_TRIGGER_CONFIG_SCHEMA,
|
|
155
|
+
eventSchema: CLOUDFLARE_SSL_CERTIFICATE_EVENT_SCHEMA,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Normalizes an authenticated Cloudflare notification webhook.
|
|
160
|
+
*
|
|
161
|
+
* @param value - Untrusted provider webhook payload.
|
|
162
|
+
* @param expectedAlertType - Alert type owned by the authenticated source.
|
|
163
|
+
*/
|
|
164
|
+
export function normalizeCloudflareEvent(value, expectedAlertType) {
|
|
165
|
+
const event = PROVIDER_EVENT_SCHEMA.parse(value);
|
|
166
|
+
return CLOUDFLARE_EVENT_SCHEMA.parse({
|
|
167
|
+
accountId: event.account_id,
|
|
168
|
+
alertCorrelationId: event.alert_correlation_id,
|
|
169
|
+
alertEvent: event.alert_event,
|
|
170
|
+
alertType: event.alert_type ?? expectedAlertType,
|
|
171
|
+
data: fromCloudflare(event.data ?? {}),
|
|
172
|
+
name: event.name,
|
|
173
|
+
policyId: event.policy_id,
|
|
174
|
+
policyName: event.policy_name,
|
|
175
|
+
text: event.text,
|
|
176
|
+
timestamp: event.ts,
|
|
177
|
+
});
|
|
178
|
+
}
|