@dual-os/atlassian-api 0.0.0-stage → 6.0.4
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/LICENSE +4 -0
- package/Runner.js +5537 -0
- package/Runner.js.map +59 -0
- package/bundle-inventory.json +1 -0
- package/dist/_virtual/_rolldown/runtime.js +10 -0
- package/dist/_virtual/_rolldown/runtime.js.map +9 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +17 -0
- package/dist/auth.js.map +9 -0
- package/dist/generated/http.d.ts +81 -0
- package/dist/generated/http.d.ts.map +1 -0
- package/dist/generated/http.js +64 -0
- package/dist/generated/http.js.map +9 -0
- package/dist/generated/operations.d.ts +15048 -0
- package/dist/generated/operations.d.ts.map +1 -0
- package/dist/generated/operations.js +4586 -0
- package/dist/generated/operations.js.map +9 -0
- package/dist/generated/plugin.d.ts +3239 -0
- package/dist/generated/plugin.d.ts.map +1 -0
- package/dist/generated/plugin.js +10953 -0
- package/dist/generated/plugin.js.map +10 -0
- package/dist/triggers.d.ts +218 -0
- package/dist/triggers.d.ts.map +1 -0
- package/dist/triggers.js +17 -0
- package/dist/triggers.js.map +9 -0
- package/dual-plugin.json +1 -0
- package/licenses/@dual-os_sdk@0.9.0/LICENSE +4 -0
- package/licenses/@effect_platform-node-shared@4.1.2/LICENSE +21 -0
- package/licenses/@effect_platform-node@4.1.2/LICENSE +21 -0
- package/licenses/effect@4.1.2/LICENSE +21 -0
- package/package.json +1 -6
- package/plugin-0h23empw.js +1380 -0
- package/plugin-0h23empw.js.map +18 -0
- package/plugin-2jdfj02n.js +18 -0
- package/plugin-2jdfj02n.js.map +10 -0
- package/plugin-5bkpgknn.js +21541 -0
- package/plugin-5bkpgknn.js.map +10 -0
- package/plugin-djnvvdd5.js +281 -0
- package/plugin-djnvvdd5.js.map +10 -0
- package/plugin-e49xr86e.js +19129 -0
- package/plugin-e49xr86e.js.map +158 -0
- package/plugin-td2nw44v.js +62 -0
- package/plugin-td2nw44v.js.map +10 -0
- package/plugin.json +61 -0
- package/README.md +0 -3
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
pipe,
|
|
4
|
+
none,
|
|
5
|
+
some,
|
|
6
|
+
match,
|
|
7
|
+
getOrElse,
|
|
8
|
+
fromUndefinedOr,
|
|
9
|
+
has,
|
|
10
|
+
get2,
|
|
11
|
+
append,
|
|
12
|
+
isReadonlyArrayNonEmpty,
|
|
13
|
+
contains,
|
|
14
|
+
empty,
|
|
15
|
+
flatMap2,
|
|
16
|
+
reduce,
|
|
17
|
+
some2,
|
|
18
|
+
hours,
|
|
19
|
+
toMillis,
|
|
20
|
+
currentTimeMillis,
|
|
21
|
+
slice,
|
|
22
|
+
startsWith,
|
|
23
|
+
mapError,
|
|
24
|
+
fnUntraced,
|
|
25
|
+
fn,
|
|
26
|
+
decodeUnknownEffect,
|
|
27
|
+
decodeEffect,
|
|
28
|
+
optionalKey,
|
|
29
|
+
Unknown,
|
|
30
|
+
String3,
|
|
31
|
+
Struct,
|
|
32
|
+
Record,
|
|
33
|
+
StructWithRest,
|
|
34
|
+
ArraySchema,
|
|
35
|
+
Literals,
|
|
36
|
+
Finite,
|
|
37
|
+
isGreaterThanOrEqualTo,
|
|
38
|
+
Int,
|
|
39
|
+
NonEmptyString,
|
|
40
|
+
URLFromString,
|
|
41
|
+
Json,
|
|
42
|
+
paginate,
|
|
43
|
+
runCollect,
|
|
44
|
+
Action_exports,
|
|
45
|
+
Trigger_exports
|
|
46
|
+
} from "./plugin-e49xr86e.js";
|
|
47
|
+
import {
|
|
48
|
+
confluenceBlogPost_getBlogPosts2,
|
|
49
|
+
confluencePage_getPages2
|
|
50
|
+
} from "./plugin-5bkpgknn.js";
|
|
51
|
+
|
|
52
|
+
// dist/triggers.js
|
|
53
|
+
var EventType = Literals([
|
|
54
|
+
"board_configuration_changed",
|
|
55
|
+
"board_created",
|
|
56
|
+
"board_deleted",
|
|
57
|
+
"board_updated",
|
|
58
|
+
"comment_created",
|
|
59
|
+
"comment_deleted",
|
|
60
|
+
"comment_updated",
|
|
61
|
+
"jira:issue_created",
|
|
62
|
+
"jira:issue_deleted",
|
|
63
|
+
"jira:issue_updated",
|
|
64
|
+
"issuelink_created",
|
|
65
|
+
"issuelink_deleted",
|
|
66
|
+
"option_attachments_changed",
|
|
67
|
+
"option_issuelinks_changed",
|
|
68
|
+
"option_subtasks_changed",
|
|
69
|
+
"option_timetracking_changed",
|
|
70
|
+
"option_unassigned_issues_changed",
|
|
71
|
+
"option_voting_changed",
|
|
72
|
+
"option_watching_changed",
|
|
73
|
+
"project_created",
|
|
74
|
+
"project_deleted",
|
|
75
|
+
"project_updated",
|
|
76
|
+
"sprint_closed",
|
|
77
|
+
"sprint_created",
|
|
78
|
+
"sprint_deleted",
|
|
79
|
+
"sprint_started",
|
|
80
|
+
"sprint_updated",
|
|
81
|
+
"user_created",
|
|
82
|
+
"user_deleted",
|
|
83
|
+
"user_updated",
|
|
84
|
+
"jira:version_created",
|
|
85
|
+
"jira:version_deleted",
|
|
86
|
+
"jira:version_moved",
|
|
87
|
+
"jira:version_released",
|
|
88
|
+
"jira:version_unreleased",
|
|
89
|
+
"jira:version_updated",
|
|
90
|
+
"worklog_created",
|
|
91
|
+
"worklog_deleted",
|
|
92
|
+
"worklog_updated"
|
|
93
|
+
]);
|
|
94
|
+
var Event = StructWithRest(Struct({
|
|
95
|
+
timestamp: Finite,
|
|
96
|
+
webhookEvent: String3
|
|
97
|
+
}), [Record(String3, Unknown)]);
|
|
98
|
+
var DELIVERY_MAX_AGE = hours(1);
|
|
99
|
+
var event = Trigger_exports.webhook("event", {
|
|
100
|
+
description: "Triggers on Jira webhook events. A Jira administrator creates the webhook under System, WebHooks with this trigger's callback URL, the same events and a secret, then enters that secret here.",
|
|
101
|
+
name: "Jira event",
|
|
102
|
+
config: Struct({
|
|
103
|
+
events: optionalKey(ArraySchema(EventType)),
|
|
104
|
+
secret: NonEmptyString.annotate({ description: "The secret set on the Jira webhook; deliveries without a matching X-Hub-Signature are rejected" })
|
|
105
|
+
}),
|
|
106
|
+
output: Event
|
|
107
|
+
});
|
|
108
|
+
var automationRule = Trigger_exports.webhook("jira-automation-rule", {
|
|
109
|
+
description: "Triggers when a Jira automation rule's Send web request action posts JSON to this trigger's callback URL with the header X-Dual-Token set to this trigger's token. Identical bodies count as one event.",
|
|
110
|
+
name: "Jira automation rule",
|
|
111
|
+
config: Struct({ token: NonEmptyString.annotate({ description: "The value of the rule's X-Dual-Token header; deliveries without a matching token are rejected" }) }),
|
|
112
|
+
output: Json
|
|
113
|
+
});
|
|
114
|
+
var ConfluencePage = StructWithRest(Struct({
|
|
115
|
+
id: NonEmptyString,
|
|
116
|
+
version: StructWithRest(Struct({ number: Int.check(isGreaterThanOrEqualTo(1)) }), [Record(String3, Unknown)])
|
|
117
|
+
}), [Record(String3, Unknown)]);
|
|
118
|
+
var contentBatch = Struct({
|
|
119
|
+
_links: optionalKey(Struct({ next: optionalKey(String3) })),
|
|
120
|
+
results: ArraySchema(ConfluencePage)
|
|
121
|
+
});
|
|
122
|
+
var invalidContent = mapError((cause) => Action_exports.ActionHandlerError.make({
|
|
123
|
+
cause,
|
|
124
|
+
message: "Invalid Confluence content collection"
|
|
125
|
+
}));
|
|
126
|
+
var contentVersions = Record(String3, ArraySchema(Int));
|
|
127
|
+
var contentConfig = Struct({
|
|
128
|
+
event: Literals([
|
|
129
|
+
"created",
|
|
130
|
+
"updated",
|
|
131
|
+
"changed"
|
|
132
|
+
]),
|
|
133
|
+
spaceId: optionalKey(Int)
|
|
134
|
+
});
|
|
135
|
+
var confluencePageEvent = Trigger_exports.polling("confluence-page-event", {
|
|
136
|
+
description: "Polls Confluence Cloud pages, optionally in one space, and reports created pages and new versions after a silent first check. Deletions are not reported.",
|
|
137
|
+
name: "Confluence page event",
|
|
138
|
+
config: contentConfig,
|
|
139
|
+
output: ConfluencePage,
|
|
140
|
+
state: Struct({ pages: contentVersions })
|
|
141
|
+
});
|
|
142
|
+
var triggers2 = [
|
|
143
|
+
Trigger_exports.polling("confluence-blog-post-event", {
|
|
144
|
+
description: "Polls Confluence Cloud blog posts, optionally in one space, and reports created posts and new versions after a silent first check. Deletions are not reported.",
|
|
145
|
+
name: "Confluence blog post event",
|
|
146
|
+
config: contentConfig,
|
|
147
|
+
output: ConfluencePage,
|
|
148
|
+
state: Struct({ posts: contentVersions })
|
|
149
|
+
}),
|
|
150
|
+
confluencePageEvent,
|
|
151
|
+
event,
|
|
152
|
+
automationRule
|
|
153
|
+
];
|
|
154
|
+
var handlers2 = {
|
|
155
|
+
"confluence-blog-post-event": { poll: fn("Confluence.blogPostEvent.poll")(function* (input, context) {
|
|
156
|
+
const result = yield* pollContent("blogpost", input.config, (options) => confluenceBlogPost_getBlogPosts2.run(options, context), context.auth.current.methodId, input.state?.posts);
|
|
157
|
+
return {
|
|
158
|
+
events: result.events,
|
|
159
|
+
state: { posts: result.versions }
|
|
160
|
+
};
|
|
161
|
+
}) },
|
|
162
|
+
"confluence-page-event": { poll: fn("Confluence.pageEvent.poll")(function* (input, context) {
|
|
163
|
+
const result = yield* pollContent("page", input.config, (options) => confluencePage_getPages2.run(options, context), context.auth.current.methodId, input.state?.pages);
|
|
164
|
+
return {
|
|
165
|
+
events: result.events,
|
|
166
|
+
state: { pages: result.versions }
|
|
167
|
+
};
|
|
168
|
+
}) },
|
|
169
|
+
event: {
|
|
170
|
+
parse: fn("Jira.event.parse")(function* (input) {
|
|
171
|
+
const payload = yield* decodeUnknownEffect(Event)(input.request.body);
|
|
172
|
+
const wanted = input.config.events ?? [];
|
|
173
|
+
if (isReadonlyArrayNonEmpty(wanted) && !some2(wanted, (type) => type === payload.webhookEvent))
|
|
174
|
+
return {
|
|
175
|
+
events: [],
|
|
176
|
+
state: undefined
|
|
177
|
+
};
|
|
178
|
+
return {
|
|
179
|
+
events: [{
|
|
180
|
+
key: yield* Trigger_exports.bodyDigest(input.request.rawBody ?? ""),
|
|
181
|
+
payload
|
|
182
|
+
}],
|
|
183
|
+
state: undefined
|
|
184
|
+
};
|
|
185
|
+
}),
|
|
186
|
+
verify: fn("Jira.event.verify")(function* (input) {
|
|
187
|
+
const signature = input.request.headers?.["x-hub-signature"];
|
|
188
|
+
if (!(signature !== undefined && startsWith("sha256=")(signature) && (yield* Trigger_exports.verifyHmac({
|
|
189
|
+
algorithm: "sha256",
|
|
190
|
+
encoding: "hex",
|
|
191
|
+
message: input.request.rawBody ?? "",
|
|
192
|
+
secret: input.config.secret,
|
|
193
|
+
signature: slice(7)(signature)
|
|
194
|
+
}))))
|
|
195
|
+
return yield* Action_exports.ActionHandlerError.make({
|
|
196
|
+
message: "Invalid Jira webhook signature",
|
|
197
|
+
status: 401
|
|
198
|
+
});
|
|
199
|
+
const delivered = yield* decodeUnknownEffect(Event)(input.request.body);
|
|
200
|
+
const now = yield* currentTimeMillis;
|
|
201
|
+
if (Math.abs(now - delivered.timestamp) > toMillis(DELIVERY_MAX_AGE))
|
|
202
|
+
return yield* Action_exports.ActionHandlerError.make({
|
|
203
|
+
message: "Stale Jira webhook delivery",
|
|
204
|
+
status: 401
|
|
205
|
+
});
|
|
206
|
+
})
|
|
207
|
+
},
|
|
208
|
+
"jira-automation-rule": {
|
|
209
|
+
parse: fn("Jira.automationRule.parse")(function* (input) {
|
|
210
|
+
const payload = yield* decodeUnknownEffect(Json)(input.request.body);
|
|
211
|
+
return {
|
|
212
|
+
events: [{
|
|
213
|
+
key: yield* Trigger_exports.bodyDigest(input.request.rawBody ?? ""),
|
|
214
|
+
payload
|
|
215
|
+
}],
|
|
216
|
+
state: undefined
|
|
217
|
+
};
|
|
218
|
+
}),
|
|
219
|
+
verify: fn("Jira.automationRule.verify")(function* (input) {
|
|
220
|
+
if (!(yield* Trigger_exports.verifyToken(input.config.token, input.request.headers?.["x-dual-token"])))
|
|
221
|
+
return yield* Action_exports.ActionHandlerError.make({
|
|
222
|
+
message: "Invalid Jira automation rule token",
|
|
223
|
+
status: 401
|
|
224
|
+
});
|
|
225
|
+
})
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
var pollContent = fnUntraced(function* (kind, config, list, methodId, saved) {
|
|
229
|
+
if (methodId === "server" || methodId === "server-pat")
|
|
230
|
+
return yield* Action_exports.ActionHandlerError.make({ message: "Confluence polling requires a Cloud or OAuth connection" });
|
|
231
|
+
const batches = yield* pipe(paginate({
|
|
232
|
+
cursor: none(),
|
|
233
|
+
visited: empty()
|
|
234
|
+
}, fnUntraced(function* (pageState) {
|
|
235
|
+
const response = yield* list({
|
|
236
|
+
...match(pageState.cursor, {
|
|
237
|
+
onNone: () => ({}),
|
|
238
|
+
onSome: (cursor) => ({ cursor })
|
|
239
|
+
}),
|
|
240
|
+
limit: 250,
|
|
241
|
+
...match(fromUndefinedOr(config.spaceId), {
|
|
242
|
+
onNone: () => ({}),
|
|
243
|
+
onSome: (spaceId) => ({ "space-id": [spaceId] })
|
|
244
|
+
})
|
|
245
|
+
});
|
|
246
|
+
const batch = yield* invalidContent(decodeUnknownEffect(contentBatch)(response));
|
|
247
|
+
const next = batch._links?.next;
|
|
248
|
+
if (next === undefined)
|
|
249
|
+
return [[batch], none()];
|
|
250
|
+
const cursor = (yield* invalidContent(decodeEffect(URLFromString)(startsWith("/")(next) ? `https://confluence.invalid${next}` : next))).searchParams.get("cursor");
|
|
251
|
+
if (cursor === null || cursor === "" || contains(pageState.visited, cursor))
|
|
252
|
+
return yield* Action_exports.ActionHandlerError.make({ message: "Confluence returned an invalid or repeated next cursor" });
|
|
253
|
+
return [[batch], some({
|
|
254
|
+
cursor: some(cursor),
|
|
255
|
+
visited: append(pageState.visited, cursor)
|
|
256
|
+
})];
|
|
257
|
+
})), runCollect);
|
|
258
|
+
return reduce(flatMap2(batches, (batch) => batch.results), {
|
|
259
|
+
events: empty(),
|
|
260
|
+
versions: saved ?? {}
|
|
261
|
+
}, (current, payload) => {
|
|
262
|
+
const versions = getOrElse(get2(current.versions, payload.id), () => []);
|
|
263
|
+
if (contains(versions, payload.version.number))
|
|
264
|
+
return current;
|
|
265
|
+
const created = !has(current.versions, payload.id);
|
|
266
|
+
return {
|
|
267
|
+
events: saved !== undefined && (config.event === "changed" || created && config.event === "created" || !created && config.event === "updated") ? append(current.events, {
|
|
268
|
+
key: `${kind}:${payload.id}:${payload.version.number}`,
|
|
269
|
+
payload
|
|
270
|
+
}) : current.events,
|
|
271
|
+
versions: {
|
|
272
|
+
...current.versions,
|
|
273
|
+
[payload.id]: append(versions, payload.version.number)
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
export { triggers2, handlers2 };
|
|
279
|
+
|
|
280
|
+
//# debugId=B05B65EA86CC202E64756E2164756E21
|
|
281
|
+
//# sourceMappingURL=plugin-djnvvdd5.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../bundle-input/dist/triggers.js"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { confluenceBlogPost_getBlogPosts, confluencePage_getPages } from \"./generated/operations.js\";\nimport { Array, Clock, Duration, Effect, Option, Record, Schema, Stream, String, pipe } from \"effect\";\nimport { Action, Trigger } from \"@dual-os/sdk\";\n//#region src/triggers.ts\nconst EventType = Schema.Literals([\n\t\"board_configuration_changed\",\n\t\"board_created\",\n\t\"board_deleted\",\n\t\"board_updated\",\n\t\"comment_created\",\n\t\"comment_deleted\",\n\t\"comment_updated\",\n\t\"jira:issue_created\",\n\t\"jira:issue_deleted\",\n\t\"jira:issue_updated\",\n\t\"issuelink_created\",\n\t\"issuelink_deleted\",\n\t\"option_attachments_changed\",\n\t\"option_issuelinks_changed\",\n\t\"option_subtasks_changed\",\n\t\"option_timetracking_changed\",\n\t\"option_unassigned_issues_changed\",\n\t\"option_voting_changed\",\n\t\"option_watching_changed\",\n\t\"project_created\",\n\t\"project_deleted\",\n\t\"project_updated\",\n\t\"sprint_closed\",\n\t\"sprint_created\",\n\t\"sprint_deleted\",\n\t\"sprint_started\",\n\t\"sprint_updated\",\n\t\"user_created\",\n\t\"user_deleted\",\n\t\"user_updated\",\n\t\"jira:version_created\",\n\t\"jira:version_deleted\",\n\t\"jira:version_moved\",\n\t\"jira:version_released\",\n\t\"jira:version_unreleased\",\n\t\"jira:version_updated\",\n\t\"worklog_created\",\n\t\"worklog_deleted\",\n\t\"worklog_updated\"\n]);\nconst Event = Schema.StructWithRest(Schema.Struct({\n\ttimestamp: Schema.Finite,\n\twebhookEvent: Schema.String\n}), [Schema.Record(Schema.String, Schema.Unknown)]);\nconst DELIVERY_MAX_AGE = Duration.hours(1);\nconst event = Trigger.webhook(\"event\", {\n\tdescription: \"Triggers on Jira webhook events. A Jira administrator creates the webhook under System, WebHooks with this trigger's callback URL, the same events and a secret, then enters that secret here.\",\n\tname: \"Jira event\",\n\tconfig: Schema.Struct({\n\t\tevents: Schema.optionalKey(Schema.Array(EventType)),\n\t\tsecret: Schema.NonEmptyString.annotate({ description: \"The secret set on the Jira webhook; deliveries without a matching X-Hub-Signature are rejected\" })\n\t}),\n\toutput: Event\n});\nconst automationRule = Trigger.webhook(\"jira-automation-rule\", {\n\tdescription: \"Triggers when a Jira automation rule's Send web request action posts JSON to this trigger's callback URL with the header X-Dual-Token set to this trigger's token. Identical bodies count as one event.\",\n\tname: \"Jira automation rule\",\n\tconfig: Schema.Struct({ token: Schema.NonEmptyString.annotate({ description: \"The value of the rule's X-Dual-Token header; deliveries without a matching token are rejected\" }) }),\n\toutput: Schema.Json\n});\nconst ConfluencePage = Schema.StructWithRest(Schema.Struct({\n\tid: Schema.NonEmptyString,\n\tversion: Schema.StructWithRest(Schema.Struct({ number: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)) }), [Schema.Record(Schema.String, Schema.Unknown)])\n}), [Schema.Record(Schema.String, Schema.Unknown)]);\nconst contentBatch = Schema.Struct({\n\t_links: Schema.optionalKey(Schema.Struct({ next: Schema.optionalKey(Schema.String) })),\n\tresults: Schema.Array(ConfluencePage)\n});\nconst invalidContent = Effect.mapError((cause) => Action.ActionHandlerError.make({\n\tcause,\n\tmessage: \"Invalid Confluence content collection\"\n}));\nconst contentVersions = Schema.Record(Schema.String, Schema.Array(Schema.Int));\nconst contentConfig = Schema.Struct({\n\tevent: Schema.Literals([\n\t\t\"created\",\n\t\t\"updated\",\n\t\t\"changed\"\n\t]),\n\tspaceId: Schema.optionalKey(Schema.Int)\n});\nconst confluencePageEvent = Trigger.polling(\"confluence-page-event\", {\n\tdescription: \"Polls Confluence Cloud pages, optionally in one space, and reports created pages and new versions after a silent first check. Deletions are not reported.\",\n\tname: \"Confluence page event\",\n\tconfig: contentConfig,\n\toutput: ConfluencePage,\n\tstate: Schema.Struct({ pages: contentVersions })\n});\nconst triggers = [\n\tTrigger.polling(\"confluence-blog-post-event\", {\n\t\tdescription: \"Polls Confluence Cloud blog posts, optionally in one space, and reports created posts and new versions after a silent first check. Deletions are not reported.\",\n\t\tname: \"Confluence blog post event\",\n\t\tconfig: contentConfig,\n\t\toutput: ConfluencePage,\n\t\tstate: Schema.Struct({ posts: contentVersions })\n\t}),\n\tconfluencePageEvent,\n\tevent,\n\tautomationRule\n];\nconst handlers = {\n\t\"confluence-blog-post-event\": { poll: Effect.fn(\"Confluence.blogPostEvent.poll\")(function* (input, context) {\n\t\tconst result = yield* pollContent(\"blogpost\", input.config, (options) => confluenceBlogPost_getBlogPosts.run(options, context), context.auth.current.methodId, input.state?.posts);\n\t\treturn {\n\t\t\tevents: result.events,\n\t\t\tstate: { posts: result.versions }\n\t\t};\n\t}) },\n\t\"confluence-page-event\": { poll: Effect.fn(\"Confluence.pageEvent.poll\")(function* (input, context) {\n\t\tconst result = yield* pollContent(\"page\", input.config, (options) => confluencePage_getPages.run(options, context), context.auth.current.methodId, input.state?.pages);\n\t\treturn {\n\t\t\tevents: result.events,\n\t\t\tstate: { pages: result.versions }\n\t\t};\n\t}) },\n\tevent: {\n\t\tparse: Effect.fn(\"Jira.event.parse\")(function* (input) {\n\t\t\tconst payload = yield* Schema.decodeUnknownEffect(Event)(input.request.body);\n\t\t\tconst wanted = input.config.events ?? [];\n\t\t\tif (Array.isReadonlyArrayNonEmpty(wanted) && !Array.some(wanted, (type) => type === payload.webhookEvent)) return {\n\t\t\t\tevents: [],\n\t\t\t\tstate: void 0\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tevents: [{\n\t\t\t\t\tkey: yield* Trigger.bodyDigest(input.request.rawBody ?? \"\"),\n\t\t\t\t\tpayload\n\t\t\t\t}],\n\t\t\t\tstate: void 0\n\t\t\t};\n\t\t}),\n\t\tverify: Effect.fn(\"Jira.event.verify\")(function* (input) {\n\t\t\tconst signature = input.request.headers?.[\"x-hub-signature\"];\n\t\t\tif (!(signature !== void 0 && String.startsWith(\"sha256=\")(signature) && (yield* Trigger.verifyHmac({\n\t\t\t\talgorithm: \"sha256\",\n\t\t\t\tencoding: \"hex\",\n\t\t\t\tmessage: input.request.rawBody ?? \"\",\n\t\t\t\tsecret: input.config.secret,\n\t\t\t\tsignature: String.slice(7)(signature)\n\t\t\t})))) return yield* Action.ActionHandlerError.make({\n\t\t\t\tmessage: \"Invalid Jira webhook signature\",\n\t\t\t\tstatus: 401\n\t\t\t});\n\t\t\tconst delivered = yield* Schema.decodeUnknownEffect(Event)(input.request.body);\n\t\t\tconst now = yield* Clock.currentTimeMillis;\n\t\t\tif (Math.abs(now - delivered.timestamp) > Duration.toMillis(DELIVERY_MAX_AGE)) return yield* Action.ActionHandlerError.make({\n\t\t\t\tmessage: \"Stale Jira webhook delivery\",\n\t\t\t\tstatus: 401\n\t\t\t});\n\t\t})\n\t},\n\t\"jira-automation-rule\": {\n\t\tparse: Effect.fn(\"Jira.automationRule.parse\")(function* (input) {\n\t\t\tconst payload = yield* Schema.decodeUnknownEffect(Schema.Json)(input.request.body);\n\t\t\treturn {\n\t\t\t\tevents: [{\n\t\t\t\t\tkey: yield* Trigger.bodyDigest(input.request.rawBody ?? \"\"),\n\t\t\t\t\tpayload\n\t\t\t\t}],\n\t\t\t\tstate: void 0\n\t\t\t};\n\t\t}),\n\t\tverify: Effect.fn(\"Jira.automationRule.verify\")(function* (input) {\n\t\t\tif (!(yield* Trigger.verifyToken(input.config.token, input.request.headers?.[\"x-dual-token\"]))) return yield* Action.ActionHandlerError.make({\n\t\t\t\tmessage: \"Invalid Jira automation rule token\",\n\t\t\t\tstatus: 401\n\t\t\t});\n\t\t})\n\t}\n};\nconst pollContent = Effect.fnUntraced(function* (kind, config, list, methodId, saved) {\n\tif (methodId === \"server\" || methodId === \"server-pat\") return yield* Action.ActionHandlerError.make({ message: \"Confluence polling requires a Cloud or OAuth connection\" });\n\tconst batches = yield* pipe(Stream.paginate({\n\t\tcursor: Option.none(),\n\t\tvisited: Array.empty()\n\t}, Effect.fnUntraced(function* (pageState) {\n\t\tconst response = yield* list({\n\t\t\t...Option.match(pageState.cursor, {\n\t\t\t\tonNone: () => ({}),\n\t\t\t\tonSome: (cursor) => ({ cursor })\n\t\t\t}),\n\t\t\tlimit: 250,\n\t\t\t...Option.match(Option.fromUndefinedOr(config.spaceId), {\n\t\t\t\tonNone: () => ({}),\n\t\t\t\tonSome: (spaceId) => ({ \"space-id\": [spaceId] })\n\t\t\t})\n\t\t});\n\t\tconst batch = yield* invalidContent(Schema.decodeUnknownEffect(contentBatch)(response));\n\t\tconst next = batch._links?.next;\n\t\tif (next === void 0) return [[batch], Option.none()];\n\t\tconst cursor = (yield* invalidContent(Schema.decodeEffect(Schema.URLFromString)(String.startsWith(\"/\")(next) ? `https://confluence.invalid${next}` : next))).searchParams.get(\"cursor\");\n\t\tif (cursor === null || cursor === \"\" || Array.contains(pageState.visited, cursor)) return yield* Action.ActionHandlerError.make({ message: \"Confluence returned an invalid or repeated next cursor\" });\n\t\treturn [[batch], Option.some({\n\t\t\tcursor: Option.some(cursor),\n\t\t\tvisited: Array.append(pageState.visited, cursor)\n\t\t})];\n\t})), Stream.runCollect);\n\treturn Array.reduce(Array.flatMap(batches, (batch) => batch.results), {\n\t\tevents: Array.empty(),\n\t\tversions: saved ?? {}\n\t}, (current, payload) => {\n\t\tconst versions = Option.getOrElse(Record.get(current.versions, payload.id), () => []);\n\t\tif (Array.contains(versions, payload.version.number)) return current;\n\t\tconst created = !Record.has(current.versions, payload.id);\n\t\treturn {\n\t\t\tevents: saved !== void 0 && (config.event === \"changed\" || created && config.event === \"created\" || !created && config.event === \"updated\") ? Array.append(current.events, {\n\t\t\t\tkey: `${kind}:${payload.id}:${payload.version.number}`,\n\t\t\t\tpayload\n\t\t\t}) : current.events,\n\t\t\tversions: {\n\t\t\t\t...current.versions,\n\t\t\t\t[payload.id]: Array.append(versions, payload.version.number)\n\t\t\t}\n\t\t};\n\t});\n});\n//#endregion\nexport { handlers, triggers };\n\n//# sourceMappingURL=triggers.js.map"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "B05B65EA86CC202E64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|