@trigger.dev/sdk 2.0.10 → 2.0.12

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 CHANGED
@@ -1,201 +1,21 @@
1
- Apache License
2
- Version 2.0, January 2004
3
- http://www.apache.org/licenses/
4
-
5
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
-
7
- 1. Definitions.
8
-
9
- "License" shall mean the terms and conditions for use, reproduction,
10
- and distribution as defined by Sections 1 through 9 of this document.
11
-
12
- "Licensor" shall mean the copyright owner or entity authorized by
13
- the copyright owner that is granting the License.
14
-
15
- "Legal Entity" shall mean the union of the acting entity and all
16
- other entities that control, are controlled by, or are under common
17
- control with that entity. For the purposes of this definition,
18
- "control" means (i) the power, direct or indirect, to cause the
19
- direction or management of such entity, whether by contract or
20
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
- outstanding shares, or (iii) beneficial ownership of such entity.
22
-
23
- "You" (or "Your") shall mean an individual or Legal Entity
24
- exercising permissions granted by this License.
25
-
26
- "Source" form shall mean the preferred form for making modifications,
27
- including but not limited to software source code, documentation
28
- source, and configuration files.
29
-
30
- "Object" form shall mean any form resulting from mechanical
31
- transformation or translation of a Source form, including but
32
- not limited to compiled object code, generated documentation,
33
- and conversions to other media types.
34
-
35
- "Work" shall mean the work of authorship, whether in Source or
36
- Object form, made available under the License, as indicated by a
37
- copyright notice that is included in or attached to the work
38
- (an example is provided in the Appendix below).
39
-
40
- "Derivative Works" shall mean any work, whether in Source or Object
41
- form, that is based on (or derived from) the Work and for which the
42
- editorial revisions, annotations, elaborations, or other modifications
43
- represent, as a whole, an original work of authorship. For the purposes
44
- of this License, Derivative Works shall not include works that remain
45
- separable from, or merely link (or bind by name) to the interfaces of,
46
- the Work and Derivative Works thereof.
47
-
48
- "Contribution" shall mean any work of authorship, including
49
- the original version of the Work and any modifications or additions
50
- to that Work or Derivative Works thereof, that is intentionally
51
- submitted to Licensor for inclusion in the Work by the copyright owner
52
- or by an individual or Legal Entity authorized to submit on behalf of
53
- the copyright owner. For the purposes of this definition, "submitted"
54
- means any form of electronic, verbal, or written communication sent
55
- to the Licensor or its representatives, including but not limited to
56
- communication on electronic mailing lists, source code control systems,
57
- and issue tracking systems that are managed by, or on behalf of, the
58
- Licensor for the purpose of discussing and improving the Work, but
59
- excluding communication that is conspicuously marked or otherwise
60
- designated in writing by the copyright owner as "Not a Contribution."
61
-
62
- "Contributor" shall mean Licensor and any individual or Legal Entity
63
- on behalf of whom a Contribution has been received by Licensor and
64
- subsequently incorporated within the Work.
65
-
66
- 2. Grant of Copyright License. Subject to the terms and conditions of
67
- this License, each Contributor hereby grants to You a perpetual,
68
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
- copyright license to reproduce, prepare Derivative Works of,
70
- publicly display, publicly perform, sublicense, and distribute the
71
- Work and such Derivative Works in Source or Object form.
72
-
73
- 3. Grant of Patent License. Subject to the terms and conditions of
74
- this License, each Contributor hereby grants to You a perpetual,
75
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
- (except as stated in this section) patent license to make, have made,
77
- use, offer to sell, sell, import, and otherwise transfer the Work,
78
- where such license applies only to those patent claims licensable
79
- by such Contributor that are necessarily infringed by their
80
- Contribution(s) alone or by combination of their Contribution(s)
81
- with the Work to which such Contribution(s) was submitted. If You
82
- institute patent litigation against any entity (including a
83
- cross-claim or counterclaim in a lawsuit) alleging that the Work
84
- or a Contribution incorporated within the Work constitutes direct
85
- or contributory patent infringement, then any patent licenses
86
- granted to You under this License for that Work shall terminate
87
- as of the date such litigation is filed.
88
-
89
- 4. Redistribution. You may reproduce and distribute copies of the
90
- Work or Derivative Works thereof in any medium, with or without
91
- modifications, and in Source or Object form, provided that You
92
- meet the following conditions:
93
-
94
- (a) You must give any other recipients of the Work or
95
- Derivative Works a copy of this License; and
96
-
97
- (b) You must cause any modified files to carry prominent notices
98
- stating that You changed the files; and
99
-
100
- (c) You must retain, in the Source form of any Derivative Works
101
- that You distribute, all copyright, patent, trademark, and
102
- attribution notices from the Source form of the Work,
103
- excluding those notices that do not pertain to any part of
104
- the Derivative Works; and
105
-
106
- (d) If the Work includes a "NOTICE" text file as part of its
107
- distribution, then any Derivative Works that You distribute must
108
- include a readable copy of the attribution notices contained
109
- within such NOTICE file, excluding those notices that do not
110
- pertain to any part of the Derivative Works, in at least one
111
- of the following places: within a NOTICE text file distributed
112
- as part of the Derivative Works; within the Source form or
113
- documentation, if provided along with the Derivative Works; or,
114
- within a display generated by the Derivative Works, if and
115
- wherever such third-party notices normally appear. The contents
116
- of the NOTICE file are for informational purposes only and
117
- do not modify the License. You may add Your own attribution
118
- notices within Derivative Works that You distribute, alongside
119
- or as an addendum to the NOTICE text from the Work, provided
120
- that such additional attribution notices cannot be construed
121
- as modifying the License.
122
-
123
- You may add Your own copyright statement to Your modifications and
124
- may provide additional or different license terms and conditions
125
- for use, reproduction, or distribution of Your modifications, or
126
- for any such Derivative Works as a whole, provided Your use,
127
- reproduction, and distribution of the Work otherwise complies with
128
- the conditions stated in this License.
129
-
130
- 5. Submission of Contributions. Unless You explicitly state otherwise,
131
- any Contribution intentionally submitted for inclusion in the Work
132
- by You to the Licensor shall be under the terms and conditions of
133
- this License, without any additional terms or conditions.
134
- Notwithstanding the above, nothing herein shall supersede or modify
135
- the terms of any separate license agreement you may have executed
136
- with Licensor regarding such Contributions.
137
-
138
- 6. Trademarks. This License does not grant permission to use the trade
139
- names, trademarks, service marks, or product names of the Licensor,
140
- except as required for reasonable and customary use in describing the
141
- origin of the Work and reproducing the content of the NOTICE file.
142
-
143
- 7. Disclaimer of Warranty. Unless required by applicable law or
144
- agreed to in writing, Licensor provides the Work (and each
145
- Contributor provides its Contributions) on an "AS IS" BASIS,
146
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
- implied, including, without limitation, any warranties or conditions
148
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
- PARTICULAR PURPOSE. You are solely responsible for determining the
150
- appropriateness of using or redistributing the Work and assume any
151
- risks associated with Your exercise of permissions under this License.
152
-
153
- 8. Limitation of Liability. In no event and under no legal theory,
154
- whether in tort (including negligence), contract, or otherwise,
155
- unless required by applicable law (such as deliberate and grossly
156
- negligent acts) or agreed to in writing, shall any Contributor be
157
- liable to You for damages, including any direct, indirect, special,
158
- incidental, or consequential damages of any character arising as a
159
- result of this License or out of the use or inability to use the
160
- Work (including but not limited to damages for loss of goodwill,
161
- work stoppage, computer failure or malfunction, or any and all
162
- other commercial damages or losses), even if such Contributor
163
- has been advised of the possibility of such damages.
164
-
165
- 9. Accepting Warranty or Additional Liability. While redistributing
166
- the Work or Derivative Works thereof, You may choose to offer,
167
- and charge a fee for, acceptance of support, warranty, indemnity,
168
- or other liability obligations and/or rights consistent with this
169
- License. However, in accepting such obligations, You may act only
170
- on Your own behalf and on Your sole responsibility, not on behalf
171
- of any other Contributor, and only if You agree to indemnify,
172
- defend, and hold each Contributor harmless for any liability
173
- incurred by, or claims asserted against, such Contributor by reason
174
- of your accepting any such warranty or additional liability.
175
-
176
- END OF TERMS AND CONDITIONS
177
-
178
- APPENDIX: How to apply the Apache License to your work.
179
-
180
- To apply the Apache License to your work, attach the following
181
- boilerplate notice, with the fields enclosed by brackets "[]"
182
- replaced with your own identifying information. (Don't include
183
- the brackets!) The text should be enclosed in the appropriate
184
- comment syntax for the file format. We also recommend that a
185
- file or class name and description of purpose be included on the
186
- same "printed page" as the copyright notice for easier
187
- identification within third-party archives.
188
-
189
- Copyright [yyyy] [name of copyright owner]
190
-
191
- Licensed under the Apache License, Version 2.0 (the "License");
192
- you may not use this file except in compliance with the License.
193
- You may obtain a copy of the License at
194
-
195
- http://www.apache.org/licenses/LICENSE-2.0
196
-
197
- Unless required by applicable law or agreed to in writing, software
198
- distributed under the License is distributed on an "AS IS" BASIS,
199
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
- See the License for the specific language governing permissions and
201
- limitations under the License.
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Trigger.dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _trigger_dev_core from '@trigger.dev/core';
2
- import { CreateRunBody, RunTaskBodyInput, CompleteTaskBodyInput, FailTaskBodyInput, SendEvent, SendEventOptions, UpdateTriggerSourceBody, TriggerSource, RegisterTriggerBody, RegisterSourceEvent, ScheduleMetadata, GetRunOptionsWithTaskDetails, GetRunsOptions, LogLevel, RuntimeEnvironmentType, DisplayProperty, TriggerMetadata, EventFilter, HandleTriggerSource, Logger, NormalizedResponse, Prettify, IntervalOptions, CronOptions, ScheduledPayload, ServerTask, CachedTask, FetchRequestInit, FetchRetryOptions, ConnectionAuth, SerializableJson, RunTaskOptions, IntegrationMetadata, QueueOptions, IntegrationConfig, JobMetadata, MissingConnectionNotificationPayload, MissingConnectionResolvedNotificationPayload, ErrorWithStack, ApiEventLog, RedactString } from '@trigger.dev/core';
2
+ import { RunTaskBodyInput, CompleteTaskBodyInput, FailTaskBodyInput, SendEvent, SendEventOptions, UpdateTriggerSourceBody, TriggerSource, RegisterTriggerBody, RegisterSourceEvent, ScheduleMetadata, GetRunOptionsWithTaskDetails, GetRunsOptions, LogLevel, RuntimeEnvironmentType, DisplayProperty, TriggerMetadata, EventFilter, HandleTriggerSource, Logger, NormalizedResponse, Prettify, IntervalOptions, CronOptions, ScheduledPayload, ServerTask, CachedTask, FetchRequestInit, FetchRetryOptions, ConnectionAuth, SerializableJson, RunTaskOptions, IntegrationMetadata, QueueOptions, IntegrationConfig, JobMetadata, MissingConnectionNotificationPayload, MissingConnectionResolvedNotificationPayload, ErrorWithStack, ApiEventLog, RedactString } from '@trigger.dev/core';
3
3
  export { EventFilter, Logger, NormalizedRequest, RedactString } from '@trigger.dev/core';
4
4
  import * as zod from 'zod';
5
5
  import { z } from 'zod';
@@ -21,15 +21,6 @@ declare class ApiClient {
21
21
  url: string;
22
22
  name: string;
23
23
  }): Promise<EndpointRecord>;
24
- createRun(params: CreateRunBody): Promise<{
25
- data: {
26
- id: string;
27
- };
28
- ok: true;
29
- } | {
30
- error: string;
31
- ok: false;
32
- }>;
33
24
  runTask(runId: string, task: RunTaskBodyInput): Promise<{
34
25
  id: string;
35
26
  name: string;
@@ -138,6 +129,21 @@ declare class ApiClient {
138
129
  context?: _trigger_dev_core.DeserializedJson | undefined;
139
130
  deliverAt?: Date | null | undefined;
140
131
  deliveredAt?: Date | null | undefined;
132
+ cancelledAt?: Date | null | undefined;
133
+ }>;
134
+ cancelEvent(eventId: string): Promise<{
135
+ id: string;
136
+ name: string;
137
+ payload: ((string | number | boolean | {
138
+ [key: string]: _trigger_dev_core.DeserializedJson;
139
+ } | _trigger_dev_core.DeserializedJson[]) & (string | number | boolean | {
140
+ [key: string]: _trigger_dev_core.DeserializedJson;
141
+ } | _trigger_dev_core.DeserializedJson[] | undefined)) | null;
142
+ timestamp: Date;
143
+ context?: _trigger_dev_core.DeserializedJson | undefined;
144
+ deliverAt?: Date | null | undefined;
145
+ deliveredAt?: Date | null | undefined;
146
+ cancelledAt?: Date | null | undefined;
141
147
  }>;
142
148
  updateSource(client: string, key: string, source: UpdateTriggerSourceBody): Promise<TriggerSource>;
143
149
  registerTrigger(client: string, id: string, key: string, payload: RegisterTriggerBody): Promise<RegisterSourceEvent>;
@@ -565,6 +571,21 @@ declare class TriggerClient {
565
571
  context?: _trigger_dev_core.DeserializedJson | undefined;
566
572
  deliverAt?: Date | null | undefined;
567
573
  deliveredAt?: Date | null | undefined;
574
+ cancelledAt?: Date | null | undefined;
575
+ }>;
576
+ cancelEvent(eventId: string): Promise<{
577
+ id: string;
578
+ name: string;
579
+ payload: ((string | number | boolean | {
580
+ [key: string]: _trigger_dev_core.DeserializedJson;
581
+ } | _trigger_dev_core.DeserializedJson[]) & (string | number | boolean | {
582
+ [key: string]: _trigger_dev_core.DeserializedJson;
583
+ } | _trigger_dev_core.DeserializedJson[] | undefined)) | null;
584
+ timestamp: Date;
585
+ context?: _trigger_dev_core.DeserializedJson | undefined;
586
+ deliverAt?: Date | null | undefined;
587
+ deliveredAt?: Date | null | undefined;
588
+ cancelledAt?: Date | null | undefined;
568
589
  }>;
569
590
  registerSchedule(id: string, key: string, schedule: ScheduleMetadata): Promise<{
570
591
  id: string;
@@ -814,6 +835,38 @@ declare class IO {
814
835
  context?: _trigger_dev_core.DeserializedJson | undefined;
815
836
  deliverAt?: Date | null | undefined;
816
837
  deliveredAt?: Date | null | undefined;
838
+ cancelledAt?: Date | null | undefined;
839
+ }>;
840
+ getEvent(key: string | any[], id: string): Promise<{
841
+ id: string;
842
+ name: string;
843
+ createdAt: Date;
844
+ updatedAt: Date;
845
+ runs: {
846
+ id: string;
847
+ status: "PENDING" | "CANCELED" | "SUCCESS" | "QUEUED" | "WAITING_ON_CONNECTIONS" | "PREPROCESSING" | "STARTED" | "FAILURE" | "TIMED_OUT" | "ABORTED";
848
+ startedAt?: Date | null | undefined;
849
+ completedAt?: Date | null | undefined;
850
+ }[];
851
+ }>;
852
+ /** `io.cancelEvent()` allows you to cancel an event that was previously sent with `io.sendEvent()`. This will prevent any Jobs from running that are listening for that event if the event was sent with a delay
853
+ * @param key
854
+ * @param eventId
855
+ * @returns
856
+ */
857
+ cancelEvent(key: string | any[], eventId: string): Promise<{
858
+ id: string;
859
+ name: string;
860
+ payload: ((string | number | boolean | {
861
+ [key: string]: _trigger_dev_core.DeserializedJson;
862
+ } | _trigger_dev_core.DeserializedJson[]) & (string | number | boolean | {
863
+ [key: string]: _trigger_dev_core.DeserializedJson;
864
+ } | _trigger_dev_core.DeserializedJson[] | undefined)) | null;
865
+ timestamp: Date;
866
+ context?: _trigger_dev_core.DeserializedJson | undefined;
867
+ deliverAt?: Date | null | undefined;
868
+ deliveredAt?: Date | null | undefined;
869
+ cancelledAt?: Date | null | undefined;
817
870
  }>;
818
871
  updateSource(key: string | any[], options: {
819
872
  key: string;
package/dist/index.js CHANGED
@@ -131,7 +131,7 @@ var Job = class {
131
131
  trigger: this.trigger.toJSON(),
132
132
  integrations: this.integrations,
133
133
  startPosition: "latest",
134
- enabled: typeof this.options.enabled === "boolean" ? this.options.enabled : true,
134
+ enabled: this.enabled,
135
135
  preprocessRuns: this.trigger.preprocessRuns,
136
136
  internal
137
137
  };
@@ -189,20 +189,6 @@ var ApiClient = class {
189
189
  }
190
190
  return await response.json();
191
191
  }
192
- async createRun(params) {
193
- const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
194
- __privateGet(this, _logger).debug("Creating run", {
195
- params
196
- });
197
- return await zodfetch(import_core.CreateRunResponseBodySchema, `${__privateGet(this, _apiUrl)}/api/v1/runs`, {
198
- method: "POST",
199
- headers: {
200
- "Content-Type": "application/json",
201
- Authorization: `Bearer ${apiKey}`
202
- },
203
- body: JSON.stringify(params)
204
- });
205
- }
206
192
  async runTask(runId, task) {
207
193
  const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
208
194
  __privateGet(this, _logger).debug("Running Task", {
@@ -265,6 +251,19 @@ var ApiClient = class {
265
251
  })
266
252
  });
267
253
  }
254
+ async cancelEvent(eventId) {
255
+ const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
256
+ __privateGet(this, _logger).debug("Cancelling event", {
257
+ eventId
258
+ });
259
+ return await zodfetch(import_core.ApiEventLogSchema, `${__privateGet(this, _apiUrl)}/api/v1/events/${eventId}/cancel`, {
260
+ method: "POST",
261
+ headers: {
262
+ "Content-Type": "application/json",
263
+ Authorization: `Bearer ${apiKey}`
264
+ }
265
+ });
266
+ }
268
267
  async updateSource(client, key, source) {
269
268
  const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
270
269
  __privateGet(this, _logger).debug("activating http source", {
@@ -675,6 +674,38 @@ var IO = class {
675
674
  return await this._triggerClient.sendEvent(event, options);
676
675
  });
677
676
  }
677
+ async getEvent(key, id) {
678
+ return await this.runTask(key, {
679
+ name: "getEvent",
680
+ params: {
681
+ id
682
+ },
683
+ properties: [
684
+ {
685
+ label: "id",
686
+ text: id
687
+ }
688
+ ]
689
+ }, async (task) => {
690
+ return await this._triggerClient.getEvent(id);
691
+ });
692
+ }
693
+ async cancelEvent(key, eventId) {
694
+ return await this.runTask(key, {
695
+ name: "cancelEvent",
696
+ params: {
697
+ eventId
698
+ },
699
+ properties: [
700
+ {
701
+ label: "id",
702
+ text: eventId
703
+ }
704
+ ]
705
+ }, async (task) => {
706
+ return await this._triggerClient.cancelEvent(eventId);
707
+ });
708
+ }
678
709
  async updateSource(key, options) {
679
710
  return this.runTask(key, {
680
711
  name: "Update Source",
@@ -1375,9 +1406,6 @@ var TriggerClient = class {
1375
1406
  };
1376
1407
  }
1377
1408
  attach(job) {
1378
- if (!job.enabled) {
1379
- return;
1380
- }
1381
1409
  __privateGet(this, _registeredJobs)[job.id] = job;
1382
1410
  job.trigger.attachToJob(this, job);
1383
1411
  }
@@ -1495,6 +1523,9 @@ var TriggerClient = class {
1495
1523
  async sendEvent(event, options) {
1496
1524
  return __privateGet(this, _client).sendEvent(event, options);
1497
1525
  }
1526
+ async cancelEvent(eventId) {
1527
+ return __privateGet(this, _client).cancelEvent(eventId);
1528
+ }
1498
1529
  async registerSchedule(id, key, schedule) {
1499
1530
  return __privateGet(this, _client).registerSchedule(this.id, id, key, schedule);
1500
1531
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/job.ts","../src/triggerClient.ts","../src/apiClient.ts","../src/errors.ts","../src/io.ts","../src/ioWithIntegrations.ts","../src/retry.ts","../src/triggers/eventTrigger.ts","../src/integrations.ts","../src/triggers/externalSource.ts","../src/triggers/dynamic.ts","../src/triggers/scheduled.ts","../src/triggers/notifications.ts"],"sourcesContent":["export * from \"./job\";\nexport * from \"./triggerClient\";\nexport * from \"./integrations\";\nexport * from \"./triggers/eventTrigger\";\nexport * from \"./triggers/externalSource\";\nexport * from \"./triggers/dynamic\";\nexport * from \"./triggers/scheduled\";\nexport * from \"./triggers/notifications\";\nexport * from \"./io\";\nexport * from \"./types\";\n\nimport { ServerTask } from \"@trigger.dev/core\";\nimport { RedactString } from \"./types\";\nexport { isTriggerError } from \"./errors\";\n\nexport type { NormalizedRequest, EventFilter } from \"@trigger.dev/core\";\n\nexport type Task = ServerTask;\n\nimport { ApiEventLog } from \"@trigger.dev/core\";\nexport type SentEvent = ApiEventLog;\n\n/*\n * This function is used to create a redacted string that can be used in the headers of a fetch request.\n * It is used to prevent the string from being logged in trigger.dev.\n * You can use it like this:\n *\n * await io.backgroundFetch<SomeResponseType>(\"https://example.com\", {\n * headers: {\n * Authorization: redactString`Bearer ${ACCESS_TOKEN}`,\n * },\n * })\n */\nexport function redactString(\n strings: TemplateStringsArray,\n ...interpolations: string[]\n): RedactString {\n return {\n __redactedString: true,\n strings: strings.raw as string[],\n interpolations,\n };\n}\n","export function slugifyId(input: string): string {\n // Replace any number of spaces with a single dash\n const replaceSpacesWithDash = input.toLowerCase().replace(/\\s+/g, \"-\");\n\n // Remove any non-URL-safe characters\n const removeNonUrlSafeChars = replaceSpacesWithDash.replace(/[^a-zA-Z0-9-._~]/g, \"\");\n\n return removeNonUrlSafeChars;\n}\n","import { IntegrationConfig, JobMetadata, LogLevel, QueueOptions } from \"@trigger.dev/core\";\nimport { IOWithIntegrations, IntegrationClient, TriggerIntegration } from \"./integrations\";\nimport { TriggerClient } from \"./triggerClient\";\nimport type { EventSpecification, Trigger, TriggerContext, TriggerEventType } from \"./types\";\nimport { slugifyId } from \"./utils\";\n\nexport type JobOptions<\n TTrigger extends Trigger<EventSpecification<any>>,\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>> = {},\n> = {\n /** The `id` property is used to uniquely identify the Job. Only change this if you want to create a new Job. */\n id: string;\n /** The `name` of the Job that you want to appear in the dashboard and logs. You can change this without creating a new Job. */\n name: string;\n /** The `version` property is used to version your Job. A new version will be created if you change this property. We recommend using [semantic versioning](https://www.baeldung.com/cs/semantic-versioning), e.g. `1.0.3`. */\n version: string;\n /** The `trigger` property is used to define when the Job should run. There are currently the following Trigger types:\n - [cronTrigger](https://trigger.dev/docs/sdk/crontrigger)\n - [intervalTrigger](https://trigger.dev/docs/sdk/intervaltrigger)\n - [eventTrigger](https://trigger.dev/docs/sdk/eventtrigger)\n - [DynamicTrigger](https://trigger.dev/docs/sdk/dynamictrigger)\n - [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule)\n - integration Triggers, like webhooks. See the [integrations](https://trigger.dev/docs/integrations) page for more information. */\n trigger: TTrigger;\n /** The `logLevel` property is an optional property that specifies the level of\n logging for the Job. The level is inherited from the client if you omit this property. */\n logLevel?: LogLevel;\n /** Imports the specified integrations into the Job. The integrations will be available on the `io` object in the `run()` function with the same name as the key. For example:\n ```ts\n client.defineJob({\n //... other options\n integrations: {\n slack,\n gh: github,\n },\n run: async (payload, io, ctx) => {\n //slack is available on io.slack\n io.slack.postMessage(...);\n //github is available on io.gh\n io.gh.addIssueLabels(...);\n }\n });\n ``` */\n integrations?: TIntegrations;\n /** @deprecated This property is deprecated and no longer effects the execution of the Job\n * */\n queue?: QueueOptions | string;\n /** The `enabled` property is used to enable or disable the Job. If you disable a Job, it will not run. */\n enabled?: boolean;\n /** This function gets called automatically when a Run is Triggered.\n * This is where you put the code you want to run for a Job. You can use normal code in here and you can also use Tasks. You can return a value from this function and it will be sent back to the Trigger API.\n * @param payload The payload of the event\n * @param io An object that contains the integrations that you specified in the `integrations` property and other useful functions like delays and running Tasks.\n * @param context An object that contains information about the Organization, Job, Run and more.\n */\n run: (\n payload: TriggerEventType<TTrigger>,\n io: IOWithIntegrations<TIntegrations>,\n context: TriggerContext\n ) => Promise<any>;\n};\n\nexport type JobPayload<TJob> = TJob extends Job<Trigger<EventSpecification<infer TEvent>>, any>\n ? TEvent\n : never;\n\nexport type JobIO<TJob> = TJob extends Job<any, infer TIntegrations>\n ? IOWithIntegrations<TIntegrations>\n : never;\n\n/** A [Job](https://trigger.dev/docs/documentation/concepts/jobs) is used to define the [Trigger](https://trigger.dev/docs/documentation/concepts/triggers), metadata, and what happens when it runs. */\nexport class Job<\n TTrigger extends Trigger<EventSpecification<any>>,\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>> = {},\n> {\n readonly options: JobOptions<TTrigger, TIntegrations>;\n\n client: TriggerClient;\n\n constructor(\n /** An instance of [TriggerClient](/sdk/triggerclient) that is used to send events\n to the Trigger API. */\n client: TriggerClient,\n options: JobOptions<TTrigger, TIntegrations>\n ) {\n this.client = client;\n this.options = options;\n this.#validate();\n\n client.attach(this);\n }\n\n get id() {\n return slugifyId(this.options.id);\n }\n\n get enabled() {\n return typeof this.options.enabled === \"boolean\" ? this.options.enabled : true;\n }\n\n get name() {\n return this.options.name;\n }\n\n get trigger() {\n return this.options.trigger;\n }\n\n get version() {\n return this.options.version;\n }\n\n get integrations(): Record<string, IntegrationConfig> {\n return Object.keys(this.options.integrations ?? {}).reduce(\n (acc: Record<string, IntegrationConfig>, key) => {\n const integration = this.options.integrations![key];\n\n acc[key] = {\n id: integration.id,\n metadata: integration.metadata,\n authSource: integration.client.usesLocalAuth ? \"LOCAL\" : \"HOSTED\",\n };\n\n return acc;\n },\n {}\n );\n }\n\n get logLevel() {\n return this.options.logLevel;\n }\n\n toJSON(): JobMetadata {\n // @ts-ignore\n const internal = this.options.__internal as JobMetadata[\"internal\"];\n\n return {\n id: this.id,\n name: this.name,\n version: this.version,\n event: this.trigger.event,\n trigger: this.trigger.toJSON(),\n integrations: this.integrations,\n startPosition: \"latest\", // this is deprecated, leaving this for now to make sure newer clients work with older servers\n enabled: typeof this.options.enabled === \"boolean\" ? this.options.enabled : true,\n preprocessRuns: this.trigger.preprocessRuns,\n internal,\n };\n }\n\n // Make sure the id is valid (must only contain alphanumeric characters and dashes)\n // Make sure the version is valid (must be a valid semver version)\n #validate() {\n if (!this.version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/)) {\n throw new Error(\n `Invalid job version: \"${this.version}\". Job versions must be valid semver versions.`\n );\n }\n }\n}\n","import {\n ErrorWithStackSchema,\n GetRunOptionsWithTaskDetails,\n GetRunsOptions,\n HandleTriggerSource,\n HttpSourceRequestHeadersSchema,\n IndexEndpointResponse,\n InitializeTriggerBodySchema,\n LogLevel,\n Logger,\n NormalizedResponse,\n PreprocessRunBody,\n PreprocessRunBodySchema,\n Prettify,\n REGISTER_SOURCE_EVENT,\n RegisterSourceEvent,\n RegisterSourceEventSchema,\n RegisterTriggerBody,\n RunJobBody,\n RunJobBodySchema,\n RunJobResponse,\n ScheduleMetadata,\n SendEvent,\n SendEventOptions,\n SourceMetadata,\n} from \"@trigger.dev/core\";\nimport { ApiClient } from \"./apiClient\";\nimport { CanceledWithTaskError, ResumeWithTaskError, RetryWithTaskError } from \"./errors\";\nimport { IntegrationClient, TriggerIntegration } from \"./integrations\";\nimport { IO } from \"./io\";\nimport { createIOWithIntegrations } from \"./ioWithIntegrations\";\nimport { Job, JobOptions } from \"./job\";\nimport { DynamicTrigger } from \"./triggers/dynamic\";\nimport { EventTrigger } from \"./triggers/eventTrigger\";\nimport { ExternalSource } from \"./triggers/externalSource\";\nimport type {\n EventSpecification,\n Trigger,\n TriggerContext,\n TriggerPreprocessContext,\n} from \"./types\";\n\nconst registerSourceEvent: EventSpecification<RegisterSourceEvent> = {\n name: REGISTER_SOURCE_EVENT,\n title: \"Register Source\",\n source: \"internal\",\n icon: \"register-source\",\n parsePayload: RegisterSourceEventSchema.parse,\n};\n\nexport type TriggerClientOptions = {\n /** The `id` property is used to uniquely identify the client.\n */\n id: string;\n /** The `apiKey` property is the API Key for your Trigger.dev environment. We\n recommend using an environment variable to store your API Key. */\n apiKey?: string;\n /** The `apiUrl` property is an optional property that specifies the API URL. You\n only need to specify this if you are not using Trigger.dev Cloud and are\n running your own Trigger.dev instance. */\n apiUrl?: string;\n /** The `logLevel` property is an optional property that specifies the level of\n logging for the TriggerClient. The level is inherited by all Jobs that use this Client, unless they also specify a `logLevel`. */\n logLevel?: LogLevel;\n /** Very verbose log messages, defaults to false. */\n verbose?: boolean;\n /** Default is unset and off. If set to true it will log to the server's console as well as the Trigger.dev platform */\n ioLogLocalEnabled?: boolean;\n};\n\n/** A [TriggerClient](https://trigger.dev/docs/documentation/concepts/client-adaptors) is used to connect to a specific [Project](https://trigger.dev/docs/documentation/concepts/projects) by using an [API Key](https://trigger.dev/docs/documentation/concepts/environments-apikeys). */\nexport class TriggerClient {\n #options: TriggerClientOptions;\n #registeredJobs: Record<string, Job<Trigger<EventSpecification<any>>, any>> = {};\n #registeredSources: Record<string, SourceMetadata> = {};\n #registeredHttpSourceHandlers: Record<\n string,\n (\n source: HandleTriggerSource,\n request: Request\n ) => Promise<{\n events: Array<SendEvent>;\n response?: NormalizedResponse;\n } | void>\n > = {};\n #registeredDynamicTriggers: Record<\n string,\n DynamicTrigger<EventSpecification<any>, ExternalSource<any, any, any>>\n > = {};\n #jobMetadataByDynamicTriggers: Record<string, Array<{ id: string; version: string }>> = {};\n #registeredSchedules: Record<string, Array<{ id: string; version: string }>> = {};\n\n #client: ApiClient;\n #internalLogger: Logger;\n id: string;\n\n constructor(options: Prettify<TriggerClientOptions>) {\n this.id = options.id;\n this.#options = options;\n this.#client = new ApiClient(this.#options);\n this.#internalLogger = new Logger(\"trigger.dev\", this.#options.verbose ? \"debug\" : \"log\");\n }\n\n async handleRequest(request: Request): Promise<NormalizedResponse> {\n this.#internalLogger.debug(\"handling request\", {\n url: request.url,\n headers: Object.fromEntries(request.headers.entries()),\n method: request.method,\n });\n\n const apiKey = request.headers.get(\"x-trigger-api-key\");\n\n const authorization = this.authorized(apiKey);\n\n switch (authorization) {\n case \"authorized\": {\n break;\n }\n case \"missing-client\": {\n return {\n status: 401,\n body: {\n message: \"Unauthorized: client missing apiKey\",\n },\n };\n }\n case \"missing-header\": {\n return {\n status: 401,\n body: {\n message: \"Unauthorized: missing x-trigger-api-key header\",\n },\n };\n }\n case \"unauthorized\": {\n return {\n status: 401,\n body: {\n message: `Forbidden: client apiKey mismatch: Make sure you are using the correct API Key for your environment`,\n },\n };\n }\n }\n\n if (request.method !== \"POST\") {\n return {\n status: 405,\n body: {\n message: \"Method not allowed (only POST is allowed)\",\n },\n };\n }\n\n const action = request.headers.get(\"x-trigger-action\");\n\n if (!action) {\n return {\n status: 400,\n body: {\n message: \"Missing x-trigger-action header\",\n },\n };\n }\n\n switch (action) {\n case \"PING\": {\n const endpointId = request.headers.get(\"x-trigger-endpoint-id\");\n\n if (!endpointId) {\n return {\n status: 200,\n body: {\n ok: false,\n error: \"Missing endpoint ID\",\n },\n };\n }\n\n if (this.id !== endpointId) {\n return {\n status: 200,\n body: {\n ok: false,\n error: `Endpoint ID mismatch error. Expected ${this.id}, got ${endpointId}`,\n },\n };\n }\n\n return {\n status: 200,\n body: {\n ok: true,\n },\n };\n }\n case \"INDEX_ENDPOINT\": {\n // if the x-trigger-job-id header is set, we return the job with that id\n const jobId = request.headers.get(\"x-trigger-job-id\");\n\n if (jobId) {\n const job = this.#registeredJobs[jobId];\n\n if (!job) {\n return {\n status: 404,\n body: {\n message: \"Job not found\",\n },\n };\n }\n\n return {\n status: 200,\n body: job.toJSON(),\n };\n }\n\n const body: IndexEndpointResponse = {\n jobs: Object.values(this.#registeredJobs).map((job) => job.toJSON()),\n sources: Object.values(this.#registeredSources),\n dynamicTriggers: Object.values(this.#registeredDynamicTriggers).map((trigger) => ({\n id: trigger.id,\n jobs: this.#jobMetadataByDynamicTriggers[trigger.id] ?? [],\n registerSourceJob: {\n id: dynamicTriggerRegisterSourceJobId(trigger.id),\n version: trigger.source.version,\n },\n })),\n dynamicSchedules: Object.entries(this.#registeredSchedules).map(([id, jobs]) => ({\n id,\n jobs,\n })),\n };\n\n // if the x-trigger-job-id header is not set, we return all jobs\n return {\n status: 200,\n body,\n };\n }\n case \"INITIALIZE_TRIGGER\": {\n const json = await request.json();\n const body = InitializeTriggerBodySchema.safeParse(json);\n\n if (!body.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid trigger body\",\n },\n };\n }\n\n const dynamicTrigger = this.#registeredDynamicTriggers[body.data.id];\n\n if (!dynamicTrigger) {\n return {\n status: 404,\n body: {\n message: \"Dynamic trigger not found\",\n },\n };\n }\n\n return {\n status: 200,\n body: dynamicTrigger.registeredTriggerForParams(body.data.params),\n };\n }\n case \"EXECUTE_JOB\": {\n const json = await request.json();\n const execution = RunJobBodySchema.safeParse(json);\n\n if (!execution.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid execution\",\n },\n };\n }\n\n const job = this.#registeredJobs[execution.data.job.id];\n\n if (!job) {\n return {\n status: 404,\n body: {\n message: \"Job not found\",\n },\n };\n }\n\n const results = await this.#executeJob(execution.data, job);\n\n return {\n status: 200,\n body: results,\n };\n }\n case \"PREPROCESS_RUN\": {\n const json = await request.json();\n const body = PreprocessRunBodySchema.safeParse(json);\n\n if (!body.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid body\",\n },\n };\n }\n\n const job = this.#registeredJobs[body.data.job.id];\n\n if (!job) {\n return {\n status: 404,\n body: {\n message: \"Job not found\",\n },\n };\n }\n\n const results = await this.#preprocessRun(body.data, job);\n\n return {\n status: 200,\n body: {\n abort: results.abort,\n properties: results.properties,\n },\n };\n }\n case \"DELIVER_HTTP_SOURCE_REQUEST\": {\n const headers = HttpSourceRequestHeadersSchema.safeParse(\n Object.fromEntries(request.headers.entries())\n );\n\n if (!headers.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid headers\",\n },\n };\n }\n\n const sourceRequestNeedsBody = headers.data[\"x-ts-http-method\"] !== \"GET\";\n\n const sourceRequestInit: RequestInit = {\n method: headers.data[\"x-ts-http-method\"],\n headers: headers.data[\"x-ts-http-headers\"],\n body: sourceRequestNeedsBody ? request.body : undefined,\n };\n\n if (sourceRequestNeedsBody) {\n try {\n // @ts-ignore\n sourceRequestInit.duplex = \"half\";\n } catch (error) {\n // ignore\n }\n }\n\n const sourceRequest = new Request(headers.data[\"x-ts-http-url\"], sourceRequestInit);\n\n const key = headers.data[\"x-ts-key\"];\n const dynamicId = headers.data[\"x-ts-dynamic-id\"];\n const secret = headers.data[\"x-ts-secret\"];\n const params = headers.data[\"x-ts-params\"];\n const data = headers.data[\"x-ts-data\"];\n\n const source = {\n key,\n dynamicId,\n secret,\n params,\n data,\n };\n\n const { response, events } = await this.#handleHttpSourceRequest(source, sourceRequest);\n\n return {\n status: 200,\n body: {\n events,\n response,\n },\n };\n }\n case \"VALIDATE\": {\n return {\n status: 200,\n body: {\n ok: true,\n endpointId: this.id,\n },\n };\n }\n }\n\n return {\n status: 405,\n body: {\n message: \"Method not allowed\",\n },\n };\n }\n\n attach(job: Job<Trigger<any>, any>): void {\n if (!job.enabled) {\n return;\n }\n\n this.#registeredJobs[job.id] = job;\n\n job.trigger.attachToJob(this, job);\n }\n\n attachDynamicTrigger(trigger: DynamicTrigger<any, any>): void {\n this.#registeredDynamicTriggers[trigger.id] = trigger;\n\n new Job(this, {\n id: dynamicTriggerRegisterSourceJobId(trigger.id),\n name: `Register dynamic trigger ${trigger.id}`,\n version: trigger.source.version,\n trigger: new EventTrigger({\n event: registerSourceEvent,\n filter: { dynamicTriggerId: [trigger.id] },\n }),\n integrations: {\n integration: trigger.source.integration,\n },\n run: async (event, io, ctx) => {\n const updates = await trigger.source.register(event.source.params, event, io, ctx);\n\n if (!updates) {\n // TODO: do something here?\n return;\n }\n\n return await io.updateSource(\"update-source\", {\n key: event.source.key,\n ...updates,\n });\n },\n // @ts-ignore\n __internal: true,\n });\n }\n\n attachJobToDynamicTrigger(job: Job<Trigger<any>, any>, trigger: DynamicTrigger<any, any>): void {\n const jobs = this.#jobMetadataByDynamicTriggers[trigger.id] ?? [];\n\n jobs.push({ id: job.id, version: job.version });\n\n this.#jobMetadataByDynamicTriggers[trigger.id] = jobs;\n }\n\n attachSource(options: {\n key: string;\n source: ExternalSource<any, any>;\n event: EventSpecification<any>;\n params: any;\n }): void {\n this.#registeredHttpSourceHandlers[options.key] = async (s, r) => {\n return await options.source.handle(s, r, this.#internalLogger);\n };\n\n let registeredSource = this.#registeredSources[options.key];\n\n if (!registeredSource) {\n registeredSource = {\n channel: options.source.channel,\n key: options.key,\n params: options.params,\n events: [],\n integration: {\n id: options.source.integration.id,\n metadata: options.source.integration.metadata,\n authSource: options.source.integration.client.usesLocalAuth ? \"LOCAL\" : \"HOSTED\",\n },\n registerSourceJob: {\n id: options.key,\n version: options.source.version,\n },\n };\n }\n\n registeredSource.events = Array.from(\n new Set([\n ...registeredSource.events,\n ...(typeof options.event.name === \"string\" ? [options.event.name] : options.event.name),\n ])\n );\n\n this.#registeredSources[options.key] = registeredSource;\n\n new Job(this, {\n id: options.key,\n name: options.key,\n version: options.source.version,\n trigger: new EventTrigger({\n event: registerSourceEvent,\n filter: { source: { key: [options.key] } },\n }),\n integrations: {\n integration: options.source.integration,\n },\n run: async (event, io, ctx) => {\n const updates = await options.source.register(options.params, event, io, ctx);\n\n if (!updates) {\n // TODO: do something here?\n return;\n }\n\n return await io.updateSource(\"update-source\", {\n key: options.key,\n ...updates,\n });\n },\n // @ts-ignore\n __internal: true,\n });\n }\n\n attachDynamicSchedule(key: string, job: Job<Trigger<any>, any>): void {\n const jobs = this.#registeredSchedules[key] ?? [];\n\n jobs.push({ id: job.id, version: job.version });\n\n this.#registeredSchedules[key] = jobs;\n }\n\n async registerTrigger(id: string, key: string, options: RegisterTriggerBody) {\n return this.#client.registerTrigger(this.id, id, key, options);\n }\n\n async getAuth(id: string) {\n return this.#client.getAuth(this.id, id);\n }\n\n /** You can call this function from anywhere in your code to send an event. The other way to send an event is by using [`io.sendEvent()`](https://trigger.dev/docs/sdk/io/sendevent) from inside a `run()` function.\n * @param event The event to send.\n * @param options Options for sending the event.\n * @returns A promise that resolves to the event details\n */\n async sendEvent(event: SendEvent, options?: SendEventOptions) {\n return this.#client.sendEvent(event, options);\n }\n\n async registerSchedule(id: string, key: string, schedule: ScheduleMetadata) {\n return this.#client.registerSchedule(this.id, id, key, schedule);\n }\n\n async unregisterSchedule(id: string, key: string) {\n return this.#client.unregisterSchedule(this.id, id, key);\n }\n\n async getEvent(eventId: string) {\n return this.#client.getEvent(eventId);\n }\n\n async getRun(runId: string, options?: GetRunOptionsWithTaskDetails) {\n return this.#client.getRun(runId, options);\n }\n\n async getRuns(jobSlug: string, options?: GetRunsOptions) {\n return this.#client.getRuns(jobSlug, options);\n }\n\n authorized(\n apiKey?: string | null\n ): \"authorized\" | \"unauthorized\" | \"missing-client\" | \"missing-header\" {\n if (typeof apiKey !== \"string\") {\n return \"missing-header\";\n }\n\n const localApiKey = this.#options.apiKey ?? process.env.TRIGGER_API_KEY;\n\n if (!localApiKey) {\n return \"missing-client\";\n }\n\n return apiKey === localApiKey ? \"authorized\" : \"unauthorized\";\n }\n\n apiKey() {\n return this.#options.apiKey ?? process.env.TRIGGER_API_KEY;\n }\n\n async #preprocessRun(body: PreprocessRunBody, job: Job<Trigger<EventSpecification<any>>, any>) {\n const context = this.#createPreprocessRunContext(body);\n\n const parsedPayload = job.trigger.event.parsePayload(body.event.payload ?? {});\n\n const properties = job.trigger.event.runProperties?.(parsedPayload) ?? [];\n\n return {\n abort: false,\n properties,\n };\n }\n\n async #executeJob(body: RunJobBody, job: Job<Trigger<any>, any>): Promise<RunJobResponse> {\n this.#internalLogger.debug(\"executing job\", {\n execution: body,\n job: job.toJSON(),\n });\n\n const context = this.#createRunContext(body);\n\n const io = new IO({\n id: body.run.id,\n cachedTasks: body.tasks,\n apiClient: this.#client,\n logger: this.#internalLogger,\n client: this,\n context,\n jobLogLevel: job.logLevel ?? this.#options.logLevel ?? \"info\",\n jobLogger: this.#options.ioLogLocalEnabled\n ? new Logger(job.id, job.logLevel ?? this.#options.logLevel ?? \"info\")\n : undefined,\n });\n\n const ioWithConnections = createIOWithIntegrations(\n io,\n body.connections,\n job.options.integrations\n );\n\n try {\n const output = await job.options.run(\n job.trigger.event.parsePayload(body.event.payload ?? {}),\n ioWithConnections,\n context\n );\n\n return { status: \"SUCCESS\", output };\n } catch (error) {\n if (error instanceof ResumeWithTaskError) {\n return { status: \"RESUME_WITH_TASK\", task: error.task };\n }\n\n if (error instanceof RetryWithTaskError) {\n return {\n status: \"RETRY_WITH_TASK\",\n task: error.task,\n error: error.cause,\n retryAt: error.retryAt,\n };\n }\n\n if (error instanceof CanceledWithTaskError) {\n return {\n status: \"CANCELED\",\n task: error.task,\n };\n }\n\n if (error instanceof RetryWithTaskError) {\n const errorWithStack = ErrorWithStackSchema.safeParse(error.cause);\n\n if (errorWithStack.success) {\n return {\n status: \"ERROR\",\n error: errorWithStack.data,\n task: error.task,\n };\n }\n\n return {\n status: \"ERROR\",\n error: { message: \"Unknown error\" },\n task: error.task,\n };\n }\n\n const errorWithStack = ErrorWithStackSchema.safeParse(error);\n\n if (errorWithStack.success) {\n return { status: \"ERROR\", error: errorWithStack.data };\n }\n\n return {\n status: \"ERROR\",\n error: { message: \"Unknown error\" },\n };\n }\n }\n\n #createRunContext(execution: RunJobBody): TriggerContext {\n const { event, organization, environment, job, run, source } = execution;\n\n return {\n event: {\n id: event.id,\n name: event.name,\n context: event.context,\n timestamp: event.timestamp,\n },\n organization,\n environment,\n job,\n run,\n account: execution.account,\n source,\n };\n }\n\n #createPreprocessRunContext(body: PreprocessRunBody): TriggerPreprocessContext {\n const { event, organization, environment, job, run, account } = body;\n\n return {\n event: {\n id: event.id,\n name: event.name,\n context: event.context,\n timestamp: event.timestamp,\n },\n organization,\n environment,\n job,\n run,\n account,\n };\n }\n\n async #handleHttpSourceRequest(\n source: {\n key: string;\n dynamicId?: string;\n secret: string;\n data: any;\n params: any;\n },\n sourceRequest: Request\n ): Promise<{ response: NormalizedResponse; events: SendEvent[] }> {\n this.#internalLogger.debug(\"Handling HTTP source request\", {\n source,\n });\n\n if (source.dynamicId) {\n const dynamicTrigger = this.#registeredDynamicTriggers[source.dynamicId];\n\n if (!dynamicTrigger) {\n this.#internalLogger.debug(\"No dynamic trigger registered for HTTP source\", {\n source,\n });\n\n return {\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n events: [],\n };\n }\n\n const results = await dynamicTrigger.source.handle(\n source,\n sourceRequest,\n this.#internalLogger\n );\n\n if (!results) {\n return {\n events: [],\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n return {\n events: results.events,\n response: results.response ?? {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n const handler = this.#registeredHttpSourceHandlers[source.key];\n\n if (!handler) {\n this.#internalLogger.debug(\"No handler registered for HTTP source\", {\n source,\n });\n\n return {\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n events: [],\n };\n }\n\n const results = await handler(source, sourceRequest);\n\n if (!results) {\n return {\n events: [],\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n return {\n events: results.events,\n response: results.response ?? {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n defineJob<\n TTrigger extends Trigger<EventSpecification<any>>,\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>> = {},\n >(options: JobOptions<TTrigger, TIntegrations>) {\n return new Job<TTrigger, TIntegrations>(this, options);\n }\n}\n\nfunction dynamicTriggerRegisterSourceJobId(id: string) {\n return `register-dynamic-trigger-${id}`;\n}\n","import {\n ApiEventLog,\n ApiEventLogSchema,\n CompleteTaskBodyInput,\n ConnectionAuthSchema,\n CreateRunBody,\n CreateRunResponseBodySchema,\n FailTaskBodyInput,\n GetEventSchema,\n GetRunOptionsWithTaskDetails,\n GetRunSchema,\n GetRunsOptions,\n GetRunsSchema,\n LogLevel,\n Logger,\n RegisterScheduleResponseBodySchema,\n RegisterSourceEvent,\n RegisterSourceEventSchema,\n RegisterTriggerBody,\n RunTaskBodyInput,\n ScheduleMetadata,\n SendEvent,\n SendEventOptions,\n ServerTaskSchema,\n TriggerSource,\n TriggerSourceSchema,\n UpdateTriggerSourceBody,\n urlWithSearchParams,\n} from \"@trigger.dev/core\";\n\nimport fetch, { type RequestInit } from \"node-fetch\";\nimport { z } from \"zod\";\n\nexport type ApiClientOptions = {\n apiKey?: string;\n apiUrl?: string;\n logLevel?: LogLevel;\n};\n\nexport type EndpointRecord = {\n id: string;\n name: string;\n url: string;\n};\n\nexport type HttpSourceRecord = {\n id: string;\n key: string;\n managed: boolean;\n url: string;\n status: \"PENDING\" | \"ACTIVE\" | \"INACTIVE\";\n secret?: string;\n data?: any;\n};\n\nexport type RunRecord = {\n id: string;\n jobId: string;\n callbackUrl: string;\n event: ApiEventLog;\n};\n\nexport class ApiClient {\n #apiUrl: string;\n #options: ApiClientOptions;\n #logger: Logger;\n\n constructor(options: ApiClientOptions) {\n this.#options = options;\n\n this.#apiUrl = this.#options.apiUrl ?? process.env.TRIGGER_API_URL ?? \"https://api.trigger.dev\";\n this.#logger = new Logger(\"trigger.dev\", this.#options.logLevel);\n }\n\n async registerEndpoint(options: { url: string; name: string }): Promise<EndpointRecord> {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Registering endpoint\", {\n url: options.url,\n name: options.name,\n });\n\n const response = await fetch(`${this.#apiUrl}/api/v1/endpoints`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n url: options.url,\n name: options.name,\n }),\n });\n\n if (response.status >= 400 && response.status < 500) {\n const body = await response.json();\n\n throw new Error(body.error);\n }\n\n if (response.status !== 200) {\n throw new Error(`Failed to register entry point, got status code ${response.status}`);\n }\n\n return await response.json();\n }\n\n async createRun(params: CreateRunBody) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Creating run\", {\n params,\n });\n\n return await zodfetch(CreateRunResponseBodySchema, `${this.#apiUrl}/api/v1/runs`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(params),\n });\n }\n\n async runTask(runId: string, task: RunTaskBodyInput) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Running Task\", {\n task,\n });\n\n return await zodfetch(ServerTaskSchema, `${this.#apiUrl}/api/v1/runs/${runId}/tasks`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n \"Idempotency-Key\": task.idempotencyKey,\n },\n body: JSON.stringify(task),\n });\n }\n\n async completeTask(runId: string, id: string, task: CompleteTaskBodyInput) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Complete Task\", {\n task,\n });\n\n return await zodfetch(\n ServerTaskSchema,\n `${this.#apiUrl}/api/v1/runs/${runId}/tasks/${id}/complete`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(task),\n }\n );\n }\n\n async failTask(runId: string, id: string, body: FailTaskBodyInput) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Fail Task\", {\n id,\n runId,\n body,\n });\n\n return await zodfetch(\n ServerTaskSchema,\n `${this.#apiUrl}/api/v1/runs/${runId}/tasks/${id}/fail`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n }\n );\n }\n\n async sendEvent(event: SendEvent, options: SendEventOptions = {}) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Sending event\", {\n event,\n });\n\n return await zodfetch(ApiEventLogSchema, `${this.#apiUrl}/api/v1/events`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ event, options }),\n });\n }\n\n async updateSource(\n client: string,\n key: string,\n source: UpdateTriggerSourceBody\n ): Promise<TriggerSource> {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"activating http source\", {\n source,\n });\n\n const response = await zodfetch(\n TriggerSourceSchema,\n `${this.#apiUrl}/api/v1/${client}/sources/${key}`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(source),\n }\n );\n\n return response;\n }\n\n async registerTrigger(\n client: string,\n id: string,\n key: string,\n payload: RegisterTriggerBody\n ): Promise<RegisterSourceEvent> {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"registering trigger\", {\n id,\n payload,\n });\n\n const response = await zodfetch(\n RegisterSourceEventSchema,\n `${this.#apiUrl}/api/v1/${client}/triggers/${id}/registrations/${key}`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n return response;\n }\n\n async registerSchedule(client: string, id: string, key: string, payload: ScheduleMetadata) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"registering schedule\", {\n id,\n payload,\n });\n\n const response = await zodfetch(\n RegisterScheduleResponseBodySchema,\n `${this.#apiUrl}/api/v1/${client}/schedules/${id}/registrations`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ id: key, ...payload }),\n }\n );\n\n return response;\n }\n\n async unregisterSchedule(client: string, id: string, key: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"unregistering schedule\", {\n id,\n });\n\n const response = await zodfetch(\n z.object({ ok: z.boolean() }),\n `${this.#apiUrl}/api/v1/${client}/schedules/${id}/registrations/${encodeURIComponent(key)}`,\n {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n }\n );\n\n return response;\n }\n\n async getAuth(client: string, id: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"getting auth\", {\n id,\n });\n\n const response = await zodfetch(\n ConnectionAuthSchema,\n `${this.#apiUrl}/api/v1/${client}/auth/${id}`,\n {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n },\n {\n optional: true,\n }\n );\n\n return response;\n }\n\n async getEvent(eventId: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Getting Event\", {\n eventId,\n });\n\n return await zodfetch(GetEventSchema, `${this.#apiUrl}/api/v1/events/${eventId}`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n });\n }\n\n async getRun(runId: string, options?: GetRunOptionsWithTaskDetails) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Getting Run\", {\n runId,\n });\n\n return await zodfetch(\n GetRunSchema,\n urlWithSearchParams(`${this.#apiUrl}/api/v1/runs/${runId}`, options),\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }\n );\n }\n\n async getRuns(jobSlug: string, options?: GetRunsOptions) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Getting Runs\", {\n jobSlug,\n });\n\n return await zodfetch(\n GetRunsSchema,\n urlWithSearchParams(`${this.#apiUrl}/api/v1/jobs/${jobSlug}/runs`, options),\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }\n );\n }\n\n async #apiKey() {\n const apiKey = getApiKey(this.#options.apiKey);\n\n if (apiKey.status === \"invalid\") {\n throw new Error(\"Invalid API key\");\n\n // const chalk = (await import(\"chalk\")).default;\n // const terminalLink = (await import(\"terminal-link\")).default;\n\n // throw new Error(\n // `${chalk.red(\"Trigger.dev error\")}: Invalid API key (\"${chalk.italic(\n // apiKey.apiKey\n // )}\"), please set the TRIGGER_API_KEY environment variable or pass the apiKey option to a valid value. ${terminalLink(\n // \"Get your API key here\",\n // \"https://app.trigger.dev\",\n // {\n // fallback(text, url) {\n // return `${text} 👉 ${url}`;\n // },\n // }\n // )}`\n // );\n } else if (apiKey.status === \"missing\") {\n throw new Error(\"Missing API key\");\n // const chalk = (await import(\"chalk\")).default;\n // const terminalLink = (await import(\"terminal-link\")).default;\n\n // throw new Error(\n // `${chalk.red(\n // \"Trigger.dev error\"\n // )}: Missing an API key, please set the TRIGGER_API_KEY environment variable or pass the apiKey option to the Trigger constructor. ${terminalLink(\n // \"Get your API key here\",\n // \"https://app.trigger.dev\",\n // {\n // fallback(text, url) {\n // return `${text} 👉 ${url}`;\n // },\n // }\n // )}`\n // );\n }\n\n return apiKey.apiKey;\n }\n}\n\nfunction getApiKey(key?: string) {\n const apiKey = key ?? process.env.TRIGGER_API_KEY;\n\n if (!apiKey) {\n return { status: \"missing\" as const };\n }\n\n // Validate the api_key format (should be tr_{env}_XXXXX)\n const isValid = apiKey.match(/^tr_[a-z]+_[a-zA-Z0-9]+$/);\n\n if (!isValid) {\n return { status: \"invalid\" as const, apiKey };\n }\n\n return { status: \"valid\" as const, apiKey };\n}\n\nasync function zodfetch<TResponseBody extends any, TOptional extends boolean = false>(\n schema: z.Schema<TResponseBody>,\n url: string,\n requestInit?: RequestInit,\n options?: {\n errorMessage?: string;\n optional?: TOptional;\n }\n): Promise<TOptional extends true ? TResponseBody | undefined : TResponseBody> {\n const response = await fetch(url, requestInit);\n\n if (\n (!requestInit || requestInit.method === \"GET\") &&\n response.status === 404 &&\n options?.optional\n ) {\n // @ts-ignore\n return;\n }\n\n if (response.status >= 400 && response.status < 500) {\n const body = await response.json();\n\n throw new Error(body.error);\n }\n\n if (response.status !== 200) {\n throw new Error(\n options?.errorMessage ?? `Failed to fetch ${url}, got status code ${response.status}`\n );\n }\n\n const jsonBody = await response.json();\n\n return schema.parse(jsonBody);\n}\n","import { ErrorWithStack, ServerTask } from \"@trigger.dev/core\";\n\nexport class ResumeWithTaskError {\n constructor(public task: ServerTask) {}\n}\n\nexport class RetryWithTaskError {\n constructor(\n public cause: ErrorWithStack,\n public task: ServerTask,\n public retryAt: Date\n ) {}\n}\n\nexport class CanceledWithTaskError {\n constructor(public task: ServerTask) {}\n}\n\n/** Use this function if you're using a `try/catch` block to catch errors.\n * It checks if a thrown error is a special internal error that you should ignore.\n * If this returns `true` then you must rethrow the error: `throw err;`\n * @param err The error to check\n * @returns `true` if the error is a Trigger Error, `false` otherwise.\n */\nexport function isTriggerError(\n err: unknown\n): err is ResumeWithTaskError | RetryWithTaskError | CanceledWithTaskError {\n return (\n err instanceof ResumeWithTaskError ||\n err instanceof RetryWithTaskError ||\n err instanceof CanceledWithTaskError\n );\n}\n","import {\n CachedTask,\n ConnectionAuth,\n CronOptions,\n ErrorWithStackSchema,\n FetchRequestInit,\n FetchRetryOptions,\n IntervalOptions,\n LogLevel,\n Logger,\n RunTaskOptions,\n SendEvent,\n SendEventOptions,\n SerializableJson,\n SerializableJsonSchema,\n ServerTask,\n UpdateTriggerSourceBody,\n} from \"@trigger.dev/core\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { webcrypto } from \"node:crypto\";\nimport { ApiClient } from \"./apiClient\";\nimport {\n CanceledWithTaskError,\n ResumeWithTaskError,\n RetryWithTaskError,\n isTriggerError,\n} from \"./errors\";\nimport { createIOWithIntegrations } from \"./ioWithIntegrations\";\nimport { calculateRetryAt } from \"./retry\";\nimport { TriggerClient } from \"./triggerClient\";\nimport { DynamicTrigger } from \"./triggers/dynamic\";\nimport { ExternalSource, ExternalSourceParams } from \"./triggers/externalSource\";\nimport { DynamicSchedule } from \"./triggers/scheduled\";\nimport { EventSpecification, TaskLogger, TriggerContext } from \"./types\";\n\nexport type IOTask = ServerTask;\n\nexport type IOOptions = {\n id: string;\n apiClient: ApiClient;\n client: TriggerClient;\n context: TriggerContext;\n logger?: Logger;\n logLevel?: LogLevel;\n jobLogger?: Logger;\n jobLogLevel: LogLevel;\n cachedTasks?: Array<CachedTask>;\n};\n\nexport class IO {\n private _id: string;\n private _apiClient: ApiClient;\n private _triggerClient: TriggerClient;\n private _logger: Logger;\n private _jobLogger?: Logger;\n private _jobLogLevel: LogLevel;\n private _cachedTasks: Map<string, CachedTask>;\n private _taskStorage: AsyncLocalStorage<{ taskId: string }>;\n private _context: TriggerContext;\n\n constructor(options: IOOptions) {\n this._id = options.id;\n this._apiClient = options.apiClient;\n this._triggerClient = options.client;\n this._logger = options.logger ?? new Logger(\"trigger.dev\", options.logLevel);\n this._cachedTasks = new Map();\n this._jobLogger = options.jobLogger;\n this._jobLogLevel = options.jobLogLevel;\n\n if (options.cachedTasks) {\n options.cachedTasks.forEach((task) => {\n this._cachedTasks.set(task.idempotencyKey, task);\n });\n }\n\n this._taskStorage = new AsyncLocalStorage();\n this._context = options.context;\n }\n\n /** Used to send log messages to the [Run log](https://trigger.dev/docs/documentation/guides/viewing-runs). */\n get logger() {\n return new IOLogger(async (level, message, data) => {\n let logLevel: LogLevel = \"info\";\n\n switch (level) {\n case \"LOG\": {\n this._jobLogger?.log(message, data);\n logLevel = \"log\";\n break;\n }\n case \"DEBUG\": {\n this._jobLogger?.debug(message, data);\n logLevel = \"debug\";\n break;\n }\n case \"INFO\": {\n this._jobLogger?.info(message, data);\n logLevel = \"info\";\n break;\n }\n case \"WARN\": {\n this._jobLogger?.warn(message, data);\n logLevel = \"warn\";\n break;\n }\n case \"ERROR\": {\n this._jobLogger?.error(message, data);\n logLevel = \"error\";\n break;\n }\n }\n\n if (Logger.satisfiesLogLevel(logLevel, this._jobLogLevel)) {\n await this.runTask(\n [message, level],\n {\n name: \"log\",\n icon: \"log\",\n description: message,\n params: data,\n properties: [{ label: \"Level\", text: level }],\n style: { style: \"minimal\", variant: level.toLowerCase() },\n noop: true,\n },\n async (task) => {}\n );\n }\n });\n }\n\n /** `io.wait()` waits for the specified amount of time before continuing the Job. Delays work even if you're on a serverless platform with timeouts, or if your server goes down. They utilize [resumability](https://trigger.dev/docs/documentation/concepts/resumability) to ensure that the Run can be resumed after the delay.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param seconds The number of seconds to wait. This can be very long, serverless timeouts are not an issue.\n */\n async wait(key: string | any[], seconds: number) {\n return await this.runTask(\n key,\n {\n name: \"wait\",\n icon: \"clock\",\n params: { seconds },\n noop: true,\n delayUntil: new Date(Date.now() + seconds * 1000),\n style: { style: \"minimal\" },\n },\n async (task) => {}\n );\n }\n\n /** `io.backgroundFetch()` fetches data from a URL that can take longer that the serverless timeout. The actual `fetch` request is performed on the Trigger.dev platform, and the response is sent back to you.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param url The URL to fetch from.\n * @param requestInit The options for the request\n * @param retry The options for retrying the request if it fails\n * An object where the key is a status code pattern and the value is a retrying strategy.\n * Supported patterns are:\n * - Specific status codes: 429\n * - Ranges: 500-599\n * - Wildcards: 2xx, 3xx, 4xx, 5xx\n */\n async backgroundFetch<TResponseData>(\n key: string | any[],\n url: string,\n requestInit?: FetchRequestInit,\n retry?: FetchRetryOptions\n ): Promise<TResponseData> {\n const urlObject = new URL(url);\n\n return (await this.runTask(\n key,\n {\n name: `fetch ${urlObject.hostname}${urlObject.pathname}`,\n params: { url, requestInit, retry },\n operation: \"fetch\",\n icon: \"background\",\n noop: false,\n properties: [\n {\n label: \"url\",\n text: url,\n url,\n },\n {\n label: \"method\",\n text: requestInit?.method ?? \"GET\",\n },\n {\n label: \"background\",\n text: \"true\",\n },\n ],\n },\n async (task) => {\n return task.output;\n }\n )) as TResponseData;\n }\n\n /** `io.sendEvent()` allows you to send an event from inside a Job run. The sent even will trigger any Jobs that are listening for that event (based on the name).\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param event The event to send. The event name must match the name of the event that your Jobs are listening for.\n * @param options Options for sending the event.\n */\n async sendEvent(key: string | any[], event: SendEvent, options?: SendEventOptions) {\n return await this.runTask(\n key,\n {\n name: \"sendEvent\",\n params: { event, options },\n properties: [\n {\n label: \"name\",\n text: event.name,\n },\n ...(event?.id ? [{ label: \"ID\", text: event.id }] : []),\n ],\n },\n async (task) => {\n return await this._triggerClient.sendEvent(event, options);\n }\n );\n }\n\n async updateSource(key: string | any[], options: { key: string } & UpdateTriggerSourceBody) {\n return this.runTask(\n key,\n {\n name: \"Update Source\",\n description: \"Update Source\",\n properties: [\n {\n label: \"key\",\n text: options.key,\n },\n ],\n params: options,\n redact: {\n paths: [\"secret\"],\n },\n },\n async (task) => {\n return await this._apiClient.updateSource(this._triggerClient.id, options.key, options);\n }\n );\n }\n\n /** `io.registerInterval()` allows you to register a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that will trigger any jobs it's attached to on a regular interval.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to register a new schedule on.\n * @param id A unique id for the interval. This is used to identify and unregister the interval later.\n * @param options The options for the interval.\n * @returns A promise that has information about the interval.\n */\n async registerInterval(\n key: string | any[],\n dynamicSchedule: DynamicSchedule,\n id: string,\n options: IntervalOptions\n ) {\n return await this.runTask(\n key,\n {\n name: \"register-interval\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n { label: \"seconds\", text: options.seconds.toString() },\n ],\n params: options,\n },\n async (task) => {\n return dynamicSchedule.register(id, {\n type: \"interval\",\n options,\n });\n }\n );\n }\n\n /** `io.unregisterInterval()` allows you to unregister a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that was previously registered with `io.registerInterval()`.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to unregister a schedule on.\n * @param id A unique id for the interval. This is used to identify and unregister the interval later.\n */\n async unregisterInterval(key: string | any[], dynamicSchedule: DynamicSchedule, id: string) {\n return await this.runTask(\n key,\n {\n name: \"unregister-interval\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n ],\n },\n async (task) => {\n return dynamicSchedule.unregister(id);\n }\n );\n }\n\n /** `io.registerCron()` allows you to register a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that will trigger any jobs it's attached to on a regular CRON schedule.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to register a new schedule on.\n * @param id A unique id for the schedule. This is used to identify and unregister the schedule later.\n * @param options The options for the CRON schedule.\n */\n async registerCron(\n key: string | any[],\n dynamicSchedule: DynamicSchedule,\n id: string,\n options: CronOptions\n ) {\n return await this.runTask(\n key,\n {\n name: \"register-cron\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n { label: \"cron\", text: options.cron },\n ],\n params: options,\n },\n async (task) => {\n return dynamicSchedule.register(id, {\n type: \"cron\",\n options,\n });\n }\n );\n }\n\n /** `io.unregisterCron()` allows you to unregister a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that was previously registered with `io.registerCron()`.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to unregister a schedule on.\n * @param id A unique id for the interval. This is used to identify and unregister the interval later.\n */\n async unregisterCron(key: string | any[], dynamicSchedule: DynamicSchedule, id: string) {\n return await this.runTask(\n key,\n {\n name: \"unregister-cron\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n ],\n },\n async (task) => {\n return dynamicSchedule.unregister(id);\n }\n );\n }\n\n /** `io.registerTrigger()` allows you to register a [DynamicTrigger](https://trigger.dev/docs/sdk/dynamictrigger) with the specified trigger params.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param trigger The [DynamicTrigger](https://trigger.dev/docs/sdk/dynamictrigger) to register.\n * @param id A unique id for the trigger. This is used to identify and unregister the trigger later.\n * @param params The params for the trigger.\n */\n async registerTrigger<\n TTrigger extends DynamicTrigger<EventSpecification<any>, ExternalSource<any, any, any>>,\n >(\n key: string | any[],\n trigger: TTrigger,\n id: string,\n params: ExternalSourceParams<TTrigger[\"source\"]>\n ): Promise<{ id: string; key: string } | undefined> {\n return await this.runTask(\n key,\n {\n name: \"register-trigger\",\n properties: [\n { label: \"trigger\", text: trigger.id },\n { label: \"id\", text: id },\n ],\n params: params as any,\n },\n async (task) => {\n const registration = await this.runTask(\n \"register-source\",\n {\n name: \"register-source\",\n },\n async (subtask1) => {\n return trigger.register(id, params);\n }\n );\n\n const connection = await this.getAuth(\"get-auth\", registration.source.clientId);\n\n const io = createIOWithIntegrations(\n // @ts-ignore\n this,\n {\n integration: connection,\n },\n {\n integration: trigger.source.integration,\n }\n );\n\n const updates = await trigger.source.register(params, registration, io, this._context);\n\n if (!updates) {\n // TODO: do something here?\n return;\n }\n\n return await this.updateSource(\"update-source\", {\n key: registration.source.key,\n ...updates,\n });\n }\n );\n }\n\n async getAuth(key: string | any[], clientId?: string): Promise<ConnectionAuth | undefined> {\n if (!clientId) {\n return;\n }\n\n return this.runTask(key, { name: \"get-auth\" }, async (task) => {\n return await this._triggerClient.getAuth(clientId);\n });\n }\n\n /** `io.runTask()` allows you to run a [Task](https://trigger.dev/docs/documentation/concepts/tasks) from inside a Job run. A Task is a resumable unit of a Run that can be retried, resumed and is logged. [Integrations](https://trigger.dev/docs/integrations) use Tasks internally to perform their actions.\n *\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param options The options of how you'd like to run and log the Task. Name is required.\n * @param callback The callback that will be called when the Task is run. The callback receives the Task and the IO as parameters.\n= * @param onError The callback that will be called when the Task fails. The callback receives the error, the Task and the IO as parameters. If you wish to retry then return an object with a `retryAt` property.\n * @returns A Promise that resolves with the returned value of the callback.\n */\n async runTask<TResult extends SerializableJson | void = void, TCallbackResult extends unknown = TResult>(\n key: string | any[],\n options: RunTaskOptions,\n callback: (task: IOTask, io: IO) => Promise<TCallbackResult | TResult>,\n onError?: (\n error: unknown,\n task: IOTask,\n io: IO\n ) => { retryAt: Date; error?: Error; jitter?: number } | Error | undefined | void\n ): Promise<TResult> {\n const parentId = this._taskStorage.getStore()?.taskId;\n\n if (parentId) {\n this._logger.debug(\"Using parent task\", {\n parentId,\n key,\n options,\n });\n }\n\n const idempotencyKey = await generateIdempotencyKey([this._id, parentId ?? \"\", key].flat());\n\n const cachedTask = this._cachedTasks.get(idempotencyKey);\n\n if (cachedTask) {\n this._logger.debug(\"Using cached task\", {\n idempotencyKey,\n cachedTask,\n });\n\n return cachedTask.output as TResult;\n }\n\n const task = await this._apiClient.runTask(this._id, {\n idempotencyKey,\n displayKey: typeof key === \"string\" ? key : undefined,\n noop: false,\n ...options,\n parentId,\n });\n\n if (task.status === \"CANCELED\") {\n this._logger.debug(\"Task canceled\", {\n idempotencyKey,\n task,\n });\n\n throw new CanceledWithTaskError(task);\n }\n\n if (task.status === \"COMPLETED\") {\n this._logger.debug(\"Using task output\", {\n idempotencyKey,\n task,\n });\n\n this.#addToCachedTasks(task);\n\n return task.output as TResult;\n }\n\n if (task.status === \"ERRORED\") {\n this._logger.debug(\"Task errored\", {\n idempotencyKey,\n task,\n });\n\n throw new Error(task.error ?? \"Task errored\");\n }\n\n if (task.status === \"WAITING\") {\n this._logger.debug(\"Task waiting\", {\n idempotencyKey,\n task,\n });\n\n throw new ResumeWithTaskError(task);\n }\n\n if (task.status === \"RUNNING\" && typeof task.operation === \"string\") {\n this._logger.debug(\"Task running operation\", {\n idempotencyKey,\n task,\n });\n\n throw new ResumeWithTaskError(task);\n }\n\n const executeTask = async () => {\n try {\n const result = await callback(task, this);\n\n const output = SerializableJsonSchema.parse(result) as TResult;\n \n this._logger.debug(\"Completing using output\", {\n idempotencyKey,\n task,\n });\n\n const completedTask = await this._apiClient.completeTask(this._id, task.id, {\n output: output ?? undefined,\n properties: task.outputProperties ?? undefined,\n });\n\n if (completedTask.status === \"CANCELED\") {\n throw new CanceledWithTaskError(completedTask);\n }\n\n return output;\n } catch (error) {\n if (isTriggerError(error)) {\n throw error;\n }\n\n if (onError) {\n try {\n const onErrorResult = onError(error, task, this);\n\n if (onErrorResult) {\n if (onErrorResult instanceof Error) {\n error = onErrorResult;\n } else {\n const parsedError = ErrorWithStackSchema.safeParse(onErrorResult.error);\n\n throw new RetryWithTaskError(\n parsedError.success ? parsedError.data : { message: \"Unknown error\" },\n task,\n onErrorResult.retryAt\n );\n }\n }\n } catch (innerError) {\n if (isTriggerError(innerError)) {\n throw innerError;\n }\n\n error = innerError;\n }\n }\n\n const parsedError = ErrorWithStackSchema.safeParse(error);\n\n if (options.retry) {\n const retryAt = calculateRetryAt(options.retry, task.attempts - 1);\n\n if (retryAt) {\n throw new RetryWithTaskError(\n parsedError.success ? parsedError.data : { message: \"Unknown error\" },\n task,\n retryAt\n );\n }\n }\n\n if (parsedError.success) {\n await this._apiClient.failTask(this._id, task.id, {\n error: parsedError.data,\n });\n } else {\n await this._apiClient.failTask(this._id, task.id, {\n error: { message: JSON.stringify(error), name: \"Unknown Error\" },\n });\n }\n\n throw error;\n }\n };\n\n return this._taskStorage.run({ taskId: task.id }, executeTask);\n }\n\n /** `io.try()` allows you to run Tasks and catch any errors that are thrown, it's similar to a normal `try/catch` block but works with [io.runTask()](/sdk/io/runtask).\n * A regular `try/catch` block on its own won't work as expected with Tasks. Internally `runTask()` throws some special errors to control flow execution. This is necessary to deal with resumability, serverless timeouts, and retrying Tasks.\n * @param tryCallback The code you wish to run\n * @param catchCallback Thhis will be called if the Task fails. The callback receives the error\n * @returns A Promise that resolves with the returned value or the error\n */\n async try<TResult, TCatchResult>(\n tryCallback: () => Promise<TResult>,\n catchCallback: (error: unknown) => Promise<TCatchResult>\n ): Promise<TResult | TCatchResult> {\n try {\n return await tryCallback();\n } catch (error) {\n if (isTriggerError(error)) {\n throw error;\n }\n\n return await catchCallback(error);\n }\n }\n\n #addToCachedTasks(task: ServerTask) {\n this._cachedTasks.set(task.idempotencyKey, task);\n }\n}\n\n// Generate a stable idempotency key for the key material, using a stable json stringification\nasync function generateIdempotencyKey(keyMaterial: any[]) {\n const keys = keyMaterial.map((key) => {\n if (typeof key === \"string\") {\n return key;\n }\n\n return stableStringify(key);\n });\n\n const key = keys.join(\":\");\n\n const hash = await webcrypto.subtle.digest(\"SHA-256\", Buffer.from(key));\n\n return Buffer.from(hash).toString(\"hex\");\n}\n\nfunction stableStringify(obj: any): string {\n function sortKeys(obj: any): any {\n if (typeof obj !== \"object\" || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortKeys);\n }\n\n const sortedKeys = Object.keys(obj).sort();\n const sortedObj: { [key: string]: any } = {};\n\n for (const key of sortedKeys) {\n sortedObj[key] = sortKeys(obj[key]);\n }\n\n return sortedObj;\n }\n\n const sortedObj = sortKeys(obj);\n return JSON.stringify(sortedObj);\n}\n\ntype CallbackFunction = (\n level: \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\" | \"LOG\",\n message: string,\n properties?: Record<string, any>\n) => Promise<void>;\n\nexport class IOLogger implements TaskLogger {\n constructor(private callback: CallbackFunction) {}\n\n /** Log: essential messages */\n log(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"LOG\", message, properties);\n }\n\n /** For debugging: the least important log level */\n debug(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"DEBUG\", message, properties);\n }\n\n /** Info: the second least important log level */\n info(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"INFO\", message, properties);\n }\n\n /** Warnings: the third most important log level */\n warn(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"WARN\", message, properties);\n }\n\n /** Error: The second most important log level */\n error(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"ERROR\", message, properties);\n }\n}\n","import { ConnectionAuth, RunTaskOptions } from \"@trigger.dev/core\";\nimport {\n AuthenticatedTask,\n IOWithIntegrations,\n IntegrationClient,\n TriggerIntegration,\n} from \"./integrations\";\nimport { IO } from \"./io\";\n\nexport function createIOWithIntegrations<\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>>,\n>(\n io: IO,\n auths?: Record<string, ConnectionAuth | undefined>,\n integrations?: TIntegrations\n): IOWithIntegrations<TIntegrations> {\n if (!integrations) {\n return io as IOWithIntegrations<TIntegrations>;\n }\n\n const connections = Object.entries(integrations).reduce((acc, [connectionKey, integration]) => {\n let auth = auths?.[connectionKey];\n\n const client = integration.client.usesLocalAuth\n ? integration.client.client\n : auth\n ? integration.client.clientFactory?.(auth)\n : undefined;\n\n if (!client) {\n return acc;\n }\n\n auth = integration.client.usesLocalAuth ? integration.client.auth : auth;\n\n const ioConnection = {\n client,\n } as any;\n\n ioConnection.runTask = async (\n key: string | any[],\n callback: (client: any, task: any, io: IO) => Promise<any>,\n options?: RunTaskOptions\n ) => {\n return await io.runTask(\n key,\n {\n name: \"Task\",\n icon: integration.metadata.id,\n retry: {\n limit: 10,\n minTimeoutInMs: 1000,\n maxTimeoutInMs: 30000,\n factor: 2,\n randomize: true,\n },\n ...options,\n },\n async (ioTask) => {\n return await callback(client, ioTask, io);\n }\n );\n };\n\n if (integration.client.tasks) {\n const tasks: Record<string, AuthenticatedTask<any, any, any, any>> = integration.client.tasks;\n\n Object.keys(tasks).forEach((taskName) => {\n const authenticatedTask = tasks[taskName];\n\n ioConnection[taskName] = async (key: string | string[], params: any) => {\n const options = authenticatedTask.init(params);\n options.connectionKey = connectionKey;\n\n return await io.runTask(\n key,\n options,\n async (ioTask) => {\n return authenticatedTask.run(params, client, ioTask, io, auth);\n },\n authenticatedTask.onError\n );\n };\n });\n }\n\n acc[connectionKey] = ioConnection;\n\n return acc;\n }, {} as any);\n\n return new Proxy(io, {\n get(target, prop, receiver) {\n // We can return the original io back if the prop is __io\n if (prop === \"__io\") {\n return io;\n }\n\n if (prop in connections) {\n return connections[prop];\n }\n\n const value = Reflect.get(target, prop, receiver);\n return typeof value == \"function\" ? value.bind(target) : value;\n },\n }) as IOWithIntegrations<TIntegrations>;\n}\n","import type { RetryOptions } from \"@trigger.dev/core\";\nimport { calculateRetryAt } from \"@trigger.dev/core\";\n\nexport { calculateRetryAt };\nexport type { RetryOptions };\n","import { EventFilter, TriggerMetadata, deepMergeFilters } from \"@trigger.dev/core\";\nimport { z } from \"zod\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, EventSpecificationExample, Trigger } from \"../types\";\n\ntype EventTriggerOptions<TEventSpecification extends EventSpecification<any>> = {\n event: TEventSpecification;\n name?: string | string[];\n source?: string;\n filter?: EventFilter;\n};\n\nexport class EventTrigger<TEventSpecification extends EventSpecification<any>>\n implements Trigger<TEventSpecification>\n{\n #options: EventTriggerOptions<TEventSpecification>;\n\n constructor(options: EventTriggerOptions<TEventSpecification>) {\n this.#options = options;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: this.#options.name ?? this.#options.event.title,\n rule: {\n event: this.#options.name ?? this.#options.event.name,\n source: this.#options.source ?? \"trigger.dev\",\n payload: deepMergeFilters(this.#options.filter ?? {}, this.#options.event.filter ?? {}),\n },\n };\n }\n\n get event() {\n return this.#options.event;\n }\n\n attachToJob(triggerClient: TriggerClient, job: Job<Trigger<TEventSpecification>, any>): void {}\n\n get preprocessRuns() {\n return false;\n }\n}\n\n/** Configuration options for an EventTrigger */\ntype TriggerOptions<TEvent> = {\n /** The name of the event you are subscribing to. Must be an exact match (case sensitive). To trigger on multiple possible events, pass in an array of event names */\n name: string | string[];\n /** A [Zod](https://trigger.dev/docs/documentation/guides/zod) schema that defines the shape of the event payload.\n * The default is `z.any()` which is `any`.\n * */\n schema?: z.Schema<TEvent>;\n /** You can use this to filter events based on the source. */\n source?: string;\n /** Used to filter which events trigger the Job\n * @example\n * filter:\n * ```ts\n * {\n * name: [\"John\", \"Jane\"],\n * age: [18, 21]\n * }\n * ```\n *\n * This filter would match against an event with the following data:\n * ```json\n * {\n * \"name\": \"Jane\",\n * \"age\": 18,\n * \"location\": \"San Francisco\"\n * }\n * ```\n */\n filter?: EventFilter;\n\n examples?: EventSpecificationExample[];\n};\n\n/** `eventTrigger()` is set as a [Job's trigger](https://trigger.dev/docs/sdk/job) to subscribe to an event a Job from [a sent event](https://trigger.dev/docs/sdk/triggerclient/instancemethods/sendevent)\n * @param options options for the EventTrigger\n */\nexport function eventTrigger<TEvent extends any = any>(\n options: TriggerOptions<TEvent>\n): Trigger<EventSpecification<TEvent>> {\n return new EventTrigger({\n name: options.name,\n filter: options.filter,\n event: {\n name: options.name,\n title: \"Event\",\n source: options.source ?? \"trigger.dev\",\n icon: \"custom-event\",\n examples: options.examples,\n parsePayload: (rawPayload: any) => {\n if (options.schema) {\n return options.schema.parse(rawPayload);\n }\n\n return rawPayload as any;\n },\n },\n });\n}\n","import { ConnectionAuth, IntegrationMetadata, RunTaskOptions, ServerTask } from \"@trigger.dev/core\";\nimport { IO, IOTask } from \"./io\";\n\ntype IntegrationRunTaskFunction<TClient> = <TResult>(\n key: string | any[],\n callback: (client: TClient, task: IOTask, io: IO) => Promise<TResult>,\n options?: RunTaskOptions\n) => Promise<TResult>;\n\nexport type ClientFactory<TClient> = (auth: ConnectionAuth) => TClient;\n\nexport interface TriggerIntegration<\n TIntegrationClient extends IntegrationClient<any, any> = IntegrationClient<any, any>,\n> {\n client: TIntegrationClient;\n id: string;\n metadata: IntegrationMetadata;\n}\n\nexport type IntegrationClient<\n TClient,\n TTasks extends Record<string, AuthenticatedTask<TClient, any, any, any>>,\n> =\n | {\n usesLocalAuth: true;\n client: TClient;\n tasks?: TTasks;\n auth: any;\n }\n | {\n usesLocalAuth: false;\n clientFactory: ClientFactory<TClient>;\n tasks?: TTasks;\n };\n\nexport type AuthenticatedTask<TClient, TParams, TResult, TAuth = ConnectionAuth> = {\n run: (\n params: TParams,\n client: TClient,\n task: ServerTask,\n io: IO,\n auth: TAuth\n ) => Promise<TResult>;\n init: (params: TParams) => RunTaskOptions;\n onError?: (\n error: unknown,\n task: ServerTask\n ) => { retryAt: Date; error?: Error } | Error | undefined | void;\n};\n\nexport function authenticatedTask<TClient, TParams, TResult>(options: {\n run: (params: TParams, client: TClient, task: ServerTask, io: IO) => Promise<TResult>;\n init: (params: TParams) => RunTaskOptions;\n}): AuthenticatedTask<TClient, TParams, TResult> {\n return options;\n}\n\ntype ExtractRunFunction<T> = T extends AuthenticatedTask<\n any,\n infer TParams,\n infer TResult,\n infer TAuth\n>\n ? (key: string, params: TParams) => Promise<TResult>\n : never;\n\ntype ExtractTasks<TTasks extends Record<string, AuthenticatedTask<any, any, any, any>>> = {\n [key in keyof TTasks]: ExtractRunFunction<TTasks[key]>;\n};\n\ntype ExtractIntegrationClientClient<TIntegrationClient extends IntegrationClient<any, any>> =\n TIntegrationClient extends {\n usesLocalAuth: true;\n client: infer TClient;\n }\n ? {\n client: TClient;\n runTask: IntegrationRunTaskFunction<TClient>;\n }\n : TIntegrationClient extends {\n usesLocalAuth: false;\n clientFactory: ClientFactory<infer TClient>;\n }\n ? {\n client: TClient;\n runTask: IntegrationRunTaskFunction<TClient>;\n }\n : never;\n\ntype ExtractIntegrationClient<TIntegrationClient extends IntegrationClient<any, any>> =\n ExtractIntegrationClientClient<TIntegrationClient> & ExtractTasks<TIntegrationClient[\"tasks\"]>;\n\nexport type IntegrationIO<TIntegration extends TriggerIntegration<IntegrationClient<any, any>>> =\n ExtractIntegrationClient<TIntegration[\"client\"]>;\n\ntype ExtractIntegrations<\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>>,\n> = {\n [key in keyof TIntegrations]: ExtractIntegrationClient<TIntegrations[key][\"client\"]>;\n};\n\nexport type IOWithIntegrations<\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>>,\n> = IO & ExtractIntegrations<TIntegrations>;\n","import { z } from \"zod\";\n\nimport {\n DisplayProperty,\n EventFilter,\n HandleTriggerSource,\n Logger,\n NormalizedResponse,\n RegisterSourceEvent,\n SendEvent,\n TriggerMetadata,\n UpdateTriggerSourceBody,\n deepMergeFilters,\n} from \"@trigger.dev/core\";\nimport { IOWithIntegrations, IntegrationClient, TriggerIntegration } from \"../integrations\";\nimport { IO } from \"../io\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport type { EventSpecification, Trigger, TriggerContext } from \"../types\";\nimport { slugifyId } from \"../utils\";\n\nexport type HttpSourceEvent = {\n url: string;\n method: string;\n headers: Record<string, string>;\n rawBody?: Buffer | null;\n};\n\ntype SmtpSourceEvent = {\n from: string;\n to: string;\n subject: string;\n body: string;\n};\n\ntype SqsSourceEvent = {\n body: string;\n};\n\ntype ExternalSourceChannelMap = {\n HTTP: {\n event: Request;\n register: {\n url: string;\n };\n };\n SMTP: {\n event: SmtpSourceEvent;\n register: {};\n };\n SQS: {\n event: SqsSourceEvent;\n register: {};\n };\n};\n\ntype ChannelNames = keyof ExternalSourceChannelMap;\n\ntype RegisterFunctionEvent<TChannel extends ChannelNames, TParams extends any> = {\n events: Array<string>;\n missingEvents: Array<string>;\n orphanedEvents: Array<string>;\n source: {\n active: boolean;\n data?: any;\n secret: string;\n } & ExternalSourceChannelMap[TChannel][\"register\"];\n params: TParams;\n};\n\ntype RegisterFunction<\n TIntegration extends TriggerIntegration<IntegrationClient<any, any>>,\n TParams extends any,\n TChannel extends ChannelNames,\n> = (\n event: RegisterFunctionEvent<TChannel, TParams>,\n io: IOWithIntegrations<{ integration: TIntegration }>,\n ctx: TriggerContext\n) => Promise<UpdateTriggerSourceBody | undefined>;\n\nexport type HandlerEvent<TChannel extends ChannelNames, TParams extends any = any> = {\n rawEvent: ExternalSourceChannelMap[TChannel][\"event\"];\n source: HandleTriggerSource & { params: TParams };\n};\n\ntype HandlerFunction<TChannel extends ChannelNames, TParams extends any> = (\n event: HandlerEvent<TChannel, TParams>,\n logger: Logger\n) => Promise<{ events: SendEvent[]; response?: NormalizedResponse } | void>;\n\ntype KeyFunction<TParams extends any> = (params: TParams) => string;\ntype FilterFunction<TParams extends any> = (params: TParams) => EventFilter;\n\ntype ExternalSourceOptions<\n TChannel extends ChannelNames,\n TIntegration extends TriggerIntegration<IntegrationClient<any, any>>,\n TParams extends any,\n> = {\n id: string;\n version: string;\n schema: z.Schema<TParams>;\n integration: TIntegration;\n register: RegisterFunction<TIntegration, TParams, TChannel>;\n filter?: FilterFunction<TParams>;\n handler: HandlerFunction<TChannel, TParams>;\n key: KeyFunction<TParams>;\n properties?: (params: TParams) => DisplayProperty[];\n};\n\nexport class ExternalSource<\n TIntegration extends TriggerIntegration<IntegrationClient<any, any>>,\n TParams extends any,\n TChannel extends ChannelNames = ChannelNames,\n> {\n channel: TChannel;\n\n constructor(\n channel: TChannel,\n private options: ExternalSourceOptions<TChannel, TIntegration, TParams>\n ) {\n this.channel = channel;\n }\n\n async handle(\n source: HandleTriggerSource,\n rawEvent: ExternalSourceChannelMap[TChannel][\"event\"],\n logger: Logger\n ) {\n return this.options.handler(\n {\n source: { ...source, params: source.params as TParams },\n rawEvent,\n },\n logger\n );\n }\n\n filter(params: TParams): EventFilter {\n return this.options.filter?.(params) ?? {};\n }\n\n properties(params: TParams): DisplayProperty[] {\n return this.options.properties?.(params) ?? [];\n }\n\n async register(params: TParams, registerEvent: RegisterSourceEvent, io: IO, ctx: TriggerContext) {\n const { result: event, ommited: source } = omit(registerEvent, \"source\");\n const { result: sourceWithoutChannel, ommited: channel } = omit(source, \"channel\");\n const { result: channelWithoutType } = omit(channel, \"type\");\n\n const updates = await this.options.register(\n {\n ...event,\n source: { ...sourceWithoutChannel, ...channelWithoutType },\n params,\n },\n io as IOWithIntegrations<{ integration: TIntegration }>,\n ctx\n );\n\n return updates;\n }\n\n key(params: TParams): string {\n const parts = [this.options.id, this.channel];\n\n parts.push(this.options.key(params));\n parts.push(this.integration.id);\n\n return parts.join(\"-\");\n }\n\n get integration() {\n return this.options.integration;\n }\n\n get integrationConfig() {\n return {\n id: this.integration.id,\n metadata: this.integration.metadata,\n };\n }\n\n get id() {\n return this.options.id;\n }\n\n get version() {\n return this.options.version;\n }\n}\n\nexport type ExternalSourceParams<TExternalSource extends ExternalSource<any, any, any>> =\n TExternalSource extends ExternalSource<any, infer TParams, any>\n ? TParams & { filter?: EventFilter }\n : never;\n\nexport type ExternalSourceTriggerOptions<\n TEventSpecification extends EventSpecification<any>,\n TEventSource extends ExternalSource<any, any, any>,\n> = {\n event: TEventSpecification;\n source: TEventSource;\n params: ExternalSourceParams<TEventSource>;\n};\n\nexport class ExternalSourceTrigger<\n TEventSpecification extends EventSpecification<any>,\n TEventSource extends ExternalSource<any, any, any>,\n> implements Trigger<TEventSpecification>\n{\n constructor(private options: ExternalSourceTriggerOptions<TEventSpecification, TEventSource>) {}\n\n get event() {\n return this.options.event;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: \"External Source\",\n rule: {\n event: this.event.name,\n payload: deepMergeFilters(\n this.options.source.filter(this.options.params),\n this.event.filter ?? {},\n this.options.params.filter ?? {}\n ),\n source: this.event.source,\n },\n properties: this.options.source.properties(this.options.params),\n };\n }\n\n attachToJob(triggerClient: TriggerClient, job: Job<Trigger<TEventSpecification>, any>) {\n triggerClient.attachSource({\n key: slugifyId(this.options.source.key(this.options.params)),\n source: this.options.source,\n event: this.options.event,\n params: this.options.params,\n });\n }\n\n get preprocessRuns() {\n return true;\n }\n}\n\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n key: K\n): { result: Omit<T, K>; ommited: T[K] } {\n const result: any = {};\n\n for (const k of Object.keys(obj)) {\n if (k === key) continue;\n\n result[k] = obj[k];\n }\n\n return { result, ommited: obj[key] };\n}\n","import {\n RegisterSourceEvent,\n RegisterTriggerBody,\n TriggerMetadata,\n deepMergeFilters,\n} from \"@trigger.dev/core\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, Trigger } from \"../types\";\nimport { slugifyId } from \"../utils\";\nimport { ExternalSource, ExternalSourceParams } from \"./externalSource\";\n\n/** Options for a DynamicTrigger */\nexport type DynamicTriggerOptions<\n TEventSpec extends EventSpecification<any>,\n TExternalSource extends ExternalSource<any, any, any>,\n> = {\n /** Used to uniquely identify a DynamicTrigger */\n id: string;\n /** An event from an [Integration](https://trigger.dev/docs/integrations) package that you want to attach to the DynamicTrigger. The event types will come through to the payload in your Job's run. */\n event: TEventSpec;\n /** An external source fron an [Integration](https://trigger.dev/docs/integrations) package\n * @example \n * ```ts\n * import { events } from \"@trigger.dev/github\";\n * \n * const dynamicOnIssueOpened = new DynamicTrigger(client, {\n id: \"github-issue-opened\",\n event: events.onIssueOpened,\n source: github.sources.repo,\n });\n * ```\n */\n source: TExternalSource;\n};\n\n/** `DynamicTrigger` allows you to define a trigger that can be configured dynamically at runtime. */\nexport class DynamicTrigger<\n TEventSpec extends EventSpecification<any>,\n TExternalSource extends ExternalSource<any, any, any>,\n> implements Trigger<TEventSpec>\n{\n #client: TriggerClient;\n #options: DynamicTriggerOptions<TEventSpec, TExternalSource>;\n source: TExternalSource;\n\n /** `DynamicTrigger` allows you to define a trigger that can be configured dynamically at runtime.\n * @param client The `TriggerClient` instance to use for registering the trigger.\n * @param options The options for the dynamic trigger.\n * */\n constructor(client: TriggerClient, options: DynamicTriggerOptions<TEventSpec, TExternalSource>) {\n this.#client = client;\n this.#options = options;\n this.source = options.source;\n\n client.attachDynamicTrigger(this);\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"dynamic\",\n id: this.#options.id,\n };\n }\n\n get id() {\n return this.#options.id;\n }\n\n get event() {\n return this.#options.event;\n }\n\n registeredTriggerForParams(params: ExternalSourceParams<TExternalSource>): RegisterTriggerBody {\n const key = slugifyId(this.source.key(params));\n\n return {\n rule: {\n event: this.event.name,\n source: this.event.source,\n payload: deepMergeFilters(this.source.filter(params), this.event.filter ?? {}),\n },\n source: {\n key,\n channel: this.source.channel,\n params,\n events: typeof this.event.name === \"string\" ? [this.event.name] : this.event.name,\n integration: {\n id: this.source.integration.id,\n metadata: this.source.integration.metadata,\n authSource: this.source.integration.client.usesLocalAuth ? \"LOCAL\" : \"HOSTED\",\n },\n },\n };\n }\n\n /** Use this method to register a new configuration with the DynamicTrigger.\n * @param key The key for the configuration. This will be used to identify the configuration when it is triggered.\n * @param params The params for the configuration.\n */\n async register(\n key: string,\n params: ExternalSourceParams<TExternalSource>\n ): Promise<RegisterSourceEvent> {\n return this.#client.registerTrigger(this.id, key, this.registeredTriggerForParams(params));\n }\n\n attachToJob(triggerClient: TriggerClient, job: Job<Trigger<TEventSpec>, any>): void {\n triggerClient.attachJobToDynamicTrigger(job, this);\n }\n\n get preprocessRuns() {\n return true;\n }\n}\n","import {\n CronOptions,\n IntervalOptions,\n ScheduleMetadata,\n ScheduledPayload,\n ScheduledPayloadSchema,\n TriggerMetadata,\n currentDate,\n} from \"@trigger.dev/core\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, Trigger } from \"../types\";\nimport cronstrue from \"cronstrue\";\n\ntype ScheduledEventSpecification = EventSpecification<ScheduledPayload>;\n\nconst examples = [\n {\n id: \"now\",\n name: \"Now\",\n icon: \"clock\",\n payload: {\n ts: currentDate.marker,\n lastTimestamp: currentDate.marker,\n },\n },\n];\n\nexport class IntervalTrigger implements Trigger<ScheduledEventSpecification> {\n constructor(private options: IntervalOptions) {}\n\n get event() {\n return {\n name: \"trigger.scheduled\",\n title: \"Schedule\",\n source: \"trigger.dev\",\n icon: \"schedule-interval\",\n examples,\n parsePayload: ScheduledPayloadSchema.parse,\n properties: [\n {\n label: \"Interval\",\n text: `${this.options.seconds}s`,\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<ScheduledEventSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"scheduled\",\n schedule: {\n type: \"interval\",\n options: {\n seconds: this.options.seconds,\n },\n },\n };\n }\n}\n\n/** `intervalTrigger()` is set as a [Job's trigger](/sdk/job) to trigger a Job at a recurring interval.\n * @param options An object containing options about the interval.\n */\nexport function intervalTrigger(options: IntervalOptions) {\n return new IntervalTrigger(options);\n}\n\nexport class CronTrigger implements Trigger<ScheduledEventSpecification> {\n constructor(private options: CronOptions) {}\n\n get event() {\n const humanReadable = cronstrue.toString(this.options.cron, {\n throwExceptionOnParseError: false,\n });\n\n return {\n name: \"trigger.scheduled\",\n title: \"Cron Schedule\",\n source: \"trigger.dev\",\n icon: \"schedule-cron\",\n examples,\n parsePayload: ScheduledPayloadSchema.parse,\n properties: [\n {\n label: \"cron\",\n text: this.options.cron,\n },\n {\n label: \"Schedule\",\n text: humanReadable,\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<ScheduledEventSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"scheduled\",\n schedule: {\n type: \"cron\",\n options: {\n cron: this.options.cron,\n },\n },\n };\n }\n}\n\n/** `cronTrigger()` is set as a [Job's trigger](https://trigger.dev/docs/sdk/job) to trigger a Job on a recurring schedule using a CRON expression.\n * @param options An object containing options about the CRON schedule.\n */\nexport function cronTrigger(options: CronOptions) {\n return new CronTrigger(options);\n}\n\n/** DynamicSchedule options\n * @param id Used to uniquely identify a DynamicSchedule\n */\nexport type DynamicIntervalOptions = { id: string };\n\n/** DynamicSchedule` allows you to define a scheduled trigger that can be configured dynamically at runtime. */\nexport class DynamicSchedule implements Trigger<ScheduledEventSpecification> {\n /**\n * @param client The `TriggerClient` instance to use for registering the trigger.\n * @param options The options for the schedule.\n */\n constructor(\n private client: TriggerClient,\n private options: DynamicIntervalOptions\n ) {}\n\n get id() {\n return this.options.id;\n }\n\n get event() {\n return {\n name: \"trigger.scheduled\",\n title: \"Dynamic Schedule\",\n source: \"trigger.dev\",\n icon: \"schedule-dynamic\",\n examples,\n parsePayload: ScheduledPayloadSchema.parse,\n };\n }\n\n async register(key: string, metadata: ScheduleMetadata) {\n return this.client.registerSchedule(this.id, key, metadata);\n }\n\n async unregister(key: string) {\n return this.client.unregisterSchedule(this.id, key);\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<ScheduledEventSpecification>, any>\n ): void {\n triggerClient.attachDynamicSchedule(this.options.id, job);\n }\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"dynamic\",\n id: this.options.id,\n };\n }\n}\n","import {\n MISSING_CONNECTION_NOTIFICATION,\n MISSING_CONNECTION_RESOLVED_NOTIFICATION,\n MissingConnectionNotificationPayload,\n MissingConnectionNotificationPayloadSchema,\n MissingConnectionResolvedNotificationPayload,\n MissingConnectionResolvedNotificationPayloadSchema,\n TriggerMetadata,\n} from \"@trigger.dev/core\";\nimport { TriggerIntegration } from \"../integrations\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, Trigger } from \"../types\";\n\nexport function missingConnectionNotification(integrations: Array<TriggerIntegration>) {\n return new MissingConnectionNotification({ integrations });\n}\n\nexport function missingConnectionResolvedNotification(integrations: Array<TriggerIntegration>) {\n return new MissingConnectionResolvedNotification({ integrations });\n}\n\ntype MissingConnectionNotificationSpecification =\n EventSpecification<MissingConnectionNotificationPayload>;\n\ntype MissingConnectionNotificationOptions = {\n integrations: Array<TriggerIntegration>;\n};\n\nexport class MissingConnectionNotification\n implements Trigger<MissingConnectionNotificationSpecification>\n{\n constructor(private options: MissingConnectionNotificationOptions) {}\n\n get event() {\n return {\n name: MISSING_CONNECTION_NOTIFICATION,\n title: \"Missing Connection Notification\",\n source: \"trigger.dev\",\n icon: \"connection-alert\",\n parsePayload: MissingConnectionNotificationPayloadSchema.parse,\n properties: [\n {\n label: \"Integrations\",\n text: this.options.integrations.map((i) => i.id).join(\", \"),\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<MissingConnectionNotificationSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: this.event.title,\n rule: {\n event: this.event.name,\n source: \"trigger.dev\",\n payload: {\n client: {\n id: this.options.integrations.map((i) => i.id),\n },\n },\n },\n };\n }\n}\n\ntype MissingConnectionResolvedNotificationSpecification =\n EventSpecification<MissingConnectionResolvedNotificationPayload>;\n\nexport class MissingConnectionResolvedNotification\n implements Trigger<MissingConnectionResolvedNotificationSpecification>\n{\n constructor(private options: MissingConnectionNotificationOptions) {}\n\n get event() {\n return {\n name: MISSING_CONNECTION_RESOLVED_NOTIFICATION,\n title: \"Missing Connection Resolved Notification\",\n source: \"trigger.dev\",\n icon: \"connection-alert\",\n parsePayload: MissingConnectionResolvedNotificationPayloadSchema.parse,\n properties: [\n {\n label: \"Integrations\",\n text: this.options.integrations.map((i) => i.id).join(\", \"),\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<MissingConnectionResolvedNotificationSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: this.event.title,\n rule: {\n event: this.event.name,\n source: \"trigger.dev\",\n payload: {\n client: {\n id: this.options.integrations.map((i) => i.id),\n },\n },\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAO,SAASA,UAAUC,OAAuB;AAE/C,QAAMC,wBAAwBD,MAAME,YAAW,EAAGC,QAAQ,QAAQ,GAAA;AAGlE,QAAMC,wBAAwBH,sBAAsBE,QAAQ,qBAAqB,EAAA;AAEjF,SAAOC;AACT;AARgBL;;;ACIhB;AAmEO,IAAMM,MAAN,MAAMA;EAQXC,YAGEC,QACAC,SACA;AAqEF;AApEE,SAAKD,SAASA;AACd,SAAKC,UAAUA;AACf,0BAAK,wBAAL;AAEAD,WAAOE,OAAO,IAAI;EACpB;EAEA,IAAIC,KAAK;AACP,WAAOC,UAAU,KAAKH,QAAQE,EAAE;EAClC;EAEA,IAAIE,UAAU;AACZ,WAAO,OAAO,KAAKJ,QAAQI,YAAY,YAAY,KAAKJ,QAAQI,UAAU;EAC5E;EAEA,IAAIC,OAAO;AACT,WAAO,KAAKL,QAAQK;EACtB;EAEA,IAAIC,UAAU;AACZ,WAAO,KAAKN,QAAQM;EACtB;EAEA,IAAIC,UAAU;AACZ,WAAO,KAAKP,QAAQO;EACtB;EAEA,IAAIC,eAAkD;AACpD,WAAOC,OAAOC,KAAK,KAAKV,QAAQQ,gBAAgB,CAAC,CAAA,EAAGG,OAClD,CAACC,KAAwCC,QAAQ;AAC/C,YAAMC,cAAc,KAAKd,QAAQQ,aAAcK;AAE/CD,UAAIC,OAAO;QACTX,IAAIY,YAAYZ;QAChBa,UAAUD,YAAYC;QACtBC,YAAYF,YAAYf,OAAOkB,gBAAgB,UAAU;MAC3D;AAEA,aAAOL;IACT,GACA,CAAC,CAAA;EAEL;EAEA,IAAIM,WAAW;AACb,WAAO,KAAKlB,QAAQkB;EACtB;EAEAC,SAAsB;AAEpB,UAAMC,WAAW,KAAKpB,QAAQqB;AAE9B,WAAO;MACLnB,IAAI,KAAKA;MACTG,MAAM,KAAKA;MACXE,SAAS,KAAKA;MACde,OAAO,KAAKhB,QAAQgB;MACpBhB,SAAS,KAAKA,QAAQa,OAAM;MAC5BX,cAAc,KAAKA;MACnBe,eAAe;MACfnB,SAAS,OAAO,KAAKJ,QAAQI,YAAY,YAAY,KAAKJ,QAAQI,UAAU;MAC5EoB,gBAAgB,KAAKlB,QAAQkB;MAC7BJ;IACF;EACF;AAWF;AAzFavB;AAkFX;cAAS,kCAAG;AACV,MAAI,CAAC,KAAKU,QAAQkB,MAAM,uBAAA,GAA0B;AAChD,UAAM,IAAIC,MACR,yBAAyB,KAAKnB,uDAAuD;EAEzF;AACF,GANS;;;ACzJX,IAAAoB,eAyBO;;;ACzBP,kBA4BO;AAEP,wBAAwC;AACxC,iBAAkB;AA/BlB;AA8DO,IAAMC,YAAN,MAAMA;EAKXC,YAAYC,SAA2B;AA4TvC,uBAAM;AAhUN;AACA;AACA;AAGE,uBAAK,UAAWA;AAEhB,uBAAK,SAAU,mBAAK,UAASC,UAAUC,QAAQC,IAAIC,mBAAmB;AACtE,uBAAK,SAAU,IAAIC,mBAAO,eAAe,mBAAK,UAASC,QAAQ;EACjE;EAEA,MAAMC,iBAAiBP,SAAiE;AACtF,UAAMQ,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,wBAAwB;MACzCC,KAAKV,QAAQU;MACbC,MAAMX,QAAQW;IAChB,CAAA;AAEA,UAAMC,WAAW,UAAMC,kBAAAA,SAAM,GAAG,mBAAK,6BAA4B;MAC/DC,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAU;QACnBT,KAAKV,QAAQU;QACbC,MAAMX,QAAQW;MAChB,CAAA;IACF,CAAA;AAEA,QAAIC,SAASQ,UAAU,OAAOR,SAASQ,SAAS,KAAK;AACnD,YAAMH,OAAO,MAAML,SAASS,KAAI;AAEhC,YAAM,IAAIC,MAAML,KAAKM,KAAK;IAC5B;AAEA,QAAIX,SAASQ,WAAW,KAAK;AAC3B,YAAM,IAAIE,MAAM,mDAAmDV,SAASQ,QAAQ;IACtF;AAEA,WAAO,MAAMR,SAASS,KAAI;EAC5B;EAEA,MAAMG,UAAUC,QAAuB;AACrC,UAAMjB,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,gBAAgB;MACjCgB;IACF,CAAA;AAEA,WAAO,MAAMC,SAASC,yCAA6B,GAAG,mBAAK,wBAAuB;MAChFb,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAUM,MAAAA;IACvB,CAAA;EACF;EAEA,MAAMG,QAAQC,OAAeC,MAAwB;AACnD,UAAMtB,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,gBAAgB;MACjCqB;IACF,CAAA;AAEA,WAAO,MAAMJ,SAASK,8BAAkB,GAAG,mBAAK,wBAAuBF,eAAe;MACpFf,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;QACzB,mBAAmBsB,KAAKE;MAC1B;MACAf,MAAMC,KAAKC,UAAUW,IAAAA;IACvB,CAAA;EACF;EAEA,MAAMG,aAAaJ,OAAeK,IAAYJ,MAA6B;AACzE,UAAMtB,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,iBAAiB;MAClCqB;IACF,CAAA;AAEA,WAAO,MAAMJ,SACXK,8BACA,GAAG,mBAAK,wBAAuBF,eAAeK,eAC9C;MACEpB,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAUW,IAAAA;IACvB,CAAA;EAEJ;EAEA,MAAMK,SAASN,OAAeK,IAAYjB,MAAyB;AACjE,UAAMT,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,aAAa;MAC9ByB;MACAL;MACAZ;IACF,CAAA;AAEA,WAAO,MAAMS,SACXK,8BACA,GAAG,mBAAK,wBAAuBF,eAAeK,WAC9C;MACEpB,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAUF,IAAAA;IACvB,CAAA;EAEJ;EAEA,MAAMmB,UAAUC,OAAkBrC,UAA4B,CAAC,GAAG;AAChE,UAAMQ,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,iBAAiB;MAClC4B;IACF,CAAA;AAEA,WAAO,MAAMX,SAASY,+BAAmB,GAAG,mBAAK,0BAAyB;MACxExB,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAU;QAAEkB;QAAOrC;MAAQ,CAAA;IACxC,CAAA;EACF;EAEA,MAAMuC,aACJC,QACAC,KACAC,QACwB;AACxB,UAAMlC,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,0BAA0B;MAC3CiC;IACF,CAAA;AAEA,UAAM9B,WAAW,MAAMc,SACrBiB,iCACA,GAAG,mBAAK,mBAAkBH,kBAAkBC,OAC5C;MACE3B,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAUuB,MAAAA;IACvB,CAAA;AAGF,WAAO9B;EACT;EAEA,MAAMgC,gBACJJ,QACAN,IACAO,KACAI,SAC8B;AAC9B,UAAMrC,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,uBAAuB;MACxCyB;MACAW;IACF,CAAA;AAEA,UAAMjC,WAAW,MAAMc,SACrBoB,uCACA,GAAG,mBAAK,mBAAkBN,mBAAmBN,oBAAoBO,OACjE;MACE3B,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAU0B,OAAAA;IACvB,CAAA;AAGF,WAAOjC;EACT;EAEA,MAAMmC,iBAAiBP,QAAgBN,IAAYO,KAAaI,SAA2B;AACzF,UAAMrC,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,wBAAwB;MACzCyB;MACAW;IACF,CAAA;AAEA,UAAMjC,WAAW,MAAMc,SACrBsB,gDACA,GAAG,mBAAK,mBAAkBR,oBAAoBN,oBAC9C;MACEpB,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;MACAS,MAAMC,KAAKC,UAAU;QAAEe,IAAIO;QAAK,GAAGI;MAAQ,CAAA;IAC7C,CAAA;AAGF,WAAOjC;EACT;EAEA,MAAMqC,mBAAmBT,QAAgBN,IAAYO,KAAa;AAChE,UAAMjC,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,0BAA0B;MAC3CyB;IACF,CAAA;AAEA,UAAMtB,WAAW,MAAMc,SACrBwB,aAAEC,OAAO;MAAEC,IAAIF,aAAEG,QAAO;IAAG,CAAA,GAC3B,GAAG,mBAAK,mBAAkBb,oBAAoBN,oBAAoBoB,mBAAmBb,GAAAA,KACrF;MACE3B,QAAQ;MACRC,SAAS;QACP,gBAAgB;QAChBC,eAAe,UAAUR;MAC3B;IACF,CAAA;AAGF,WAAOI;EACT;EAEA,MAAM2C,QAAQf,QAAgBN,IAAY;AACxC,UAAM1B,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,gBAAgB;MACjCyB;IACF,CAAA;AAEA,UAAMtB,WAAW,MAAMc,SACrB8B,kCACA,GAAG,mBAAK,mBAAkBhB,eAAeN,MACzC;MACEpB,QAAQ;MACRC,SAAS;QACP0C,QAAQ;QACRzC,eAAe,UAAUR;MAC3B;IACF,GACA;MACEkD,UAAU;IACZ,CAAA;AAGF,WAAO9C;EACT;EAEA,MAAM+C,SAASC,SAAiB;AAC9B,UAAMpD,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,iBAAiB;MAClCmD;IACF,CAAA;AAEA,WAAO,MAAMlC,SAASmC,4BAAgB,GAAG,mBAAK,0BAAyBD,WAAW;MAChF9C,QAAQ;MACRC,SAAS;QACPC,eAAe,UAAUR;MAC3B;IACF,CAAA;EACF;EAEA,MAAMsD,OAAOjC,OAAe7B,SAAwC;AAClE,UAAMQ,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,eAAe;MAChCoB;IACF,CAAA;AAEA,WAAO,MAAMH,SACXqC,8BACAC,iCAAoB,GAAG,mBAAK,wBAAuBnC,SAAS7B,OAAAA,GAC5D;MACEc,QAAQ;MACRC,SAAS;QACPC,eAAe,UAAUR;MAC3B;IACF,CAAA;EAEJ;EAEA,MAAMyD,QAAQC,SAAiBlE,SAA0B;AACvD,UAAMQ,SAAS,MAAM,sBAAK,oBAAL;AAErB,uBAAK,SAAQC,MAAM,gBAAgB;MACjCyD;IACF,CAAA;AAEA,WAAO,MAAMxC,SACXyC,+BACAH,iCAAoB,GAAG,mBAAK,wBAAuBE,gBAAgBlE,OAAAA,GACnE;MACEc,QAAQ;MACRC,SAAS;QACPC,eAAe,UAAUR;MAC3B;IACF,CAAA;EAEJ;AA8CF;AA7WaV;AACX;AACA;AACA;AA8TM;YAAO,wCAAG;AACd,QAAMU,SAAS4D,UAAU,mBAAK,UAAS5D,MAAM;AAE7C,MAAIA,OAAOY,WAAW,WAAW;AAC/B,UAAM,IAAIE,MAAM,iBAAA;EAkBlB,WAAWd,OAAOY,WAAW,WAAW;AACtC,UAAM,IAAIE,MAAM,iBAAA;EAiBlB;AAEA,SAAOd,OAAOA;AAChB,GA3Ca;AA8Cf,SAAS4D,UAAU3B,KAAc;AAC/B,QAAMjC,SAASiC,OAAOvC,QAAQC,IAAIkE;AAElC,MAAI,CAAC7D,QAAQ;AACX,WAAO;MAAEY,QAAQ;IAAmB;EACtC;AAGA,QAAMkD,UAAU9D,OAAO+D,MAAM,0BAAA;AAE7B,MAAI,CAACD,SAAS;AACZ,WAAO;MAAElD,QAAQ;MAAoBZ;IAAO;EAC9C;AAEA,SAAO;IAAEY,QAAQ;IAAkBZ;EAAO;AAC5C;AAfS4D;AAiBT,eAAe1C,SACb8C,QACA9D,KACA+D,aACAzE,SAI6E;AAC7E,QAAMY,WAAW,UAAMC,kBAAAA,SAAMH,KAAK+D,WAAAA;AAElC,OACG,CAACA,eAAeA,YAAY3D,WAAW,UACxCF,SAASQ,WAAW,OACpBpB,SAAS0D,UACT;AAEA;EACF;AAEA,MAAI9C,SAASQ,UAAU,OAAOR,SAASQ,SAAS,KAAK;AACnD,UAAMH,OAAO,MAAML,SAASS,KAAI;AAEhC,UAAM,IAAIC,MAAML,KAAKM,KAAK;EAC5B;AAEA,MAAIX,SAASQ,WAAW,KAAK;AAC3B,UAAM,IAAIE,MACRtB,SAAS0E,gBAAgB,mBAAmBhE,wBAAwBE,SAASQ,QAAQ;EAEzF;AAEA,QAAMuD,WAAW,MAAM/D,SAASS,KAAI;AAEpC,SAAOmD,OAAOI,MAAMD,QAAAA;AACtB;AAnCejD;;;AC5bR,IAAMmD,sBAAN,MAAMA;EACXC,YAAmBC,MAAkB;gBAAlBA;EAAmB;AACxC;AAFaF;AAIN,IAAMG,qBAAN,MAAMA;EACXF,YACSG,OACAF,MACAG,SACP;iBAHOD;gBACAF;mBACAG;EACN;AACL;AANaF;AAQN,IAAMG,wBAAN,MAAMA;EACXL,YAAmBC,MAAkB;gBAAlBA;EAAmB;AACxC;AAFaI;AAUN,SAASC,eACdC,KACyE;AACzE,SACEA,eAAeR,uBACfQ,eAAeL,sBACfK,eAAeF;AAEnB;AARgBC;;;ACxBhB,IAAAE,eAiBO;AACP,8BAAkC;AAClC,yBAA0B;;;ACVnB,SAASC,yBAGdC,IACAC,OACAC,cACmC;AACnC,MAAI,CAACA,cAAc;AACjB,WAAOF;EACT;AAEA,QAAMG,cAAcC,OAAOC,QAAQH,YAAAA,EAAcI,OAAO,CAACC,KAAK,CAACC,eAAeC,WAAAA,MAAiB;AAC7F,QAAIC,OAAOT,QAAQO;AAEnB,UAAMG,SAASF,YAAYE,OAAOC,gBAC9BH,YAAYE,OAAOA,SACnBD,OACAD,YAAYE,OAAOE,gBAAgBH,IAAAA,IACnCI;AAEJ,QAAI,CAACH,QAAQ;AACX,aAAOJ;IACT;AAEAG,WAAOD,YAAYE,OAAOC,gBAAgBH,YAAYE,OAAOD,OAAOA;AAEpE,UAAMK,eAAe;MACnBJ;IACF;AAEAI,iBAAaC,UAAU,OACrBC,KACAC,UACAC,YACG;AACH,aAAO,MAAMnB,GAAGgB,QACdC,KACA;QACEG,MAAM;QACNC,MAAMZ,YAAYa,SAASC;QAC3BC,OAAO;UACLC,OAAO;UACPC,gBAAgB;UAChBC,gBAAgB;UAChBC,QAAQ;UACRC,WAAW;QACb;QACA,GAAGV;MACL,GACA,OAAOW,WAAW;AAChB,eAAO,MAAMZ,SAASP,QAAQmB,QAAQ9B,EAAAA;MACxC,CAAA;IAEJ;AAEA,QAAIS,YAAYE,OAAOoB,OAAO;AAC5B,YAAMA,QAA+DtB,YAAYE,OAAOoB;AAExF3B,aAAO4B,KAAKD,KAAAA,EAAOE,QAAQ,CAACC,aAAa;AACvC,cAAMC,qBAAoBJ,MAAMG;AAEhCnB,qBAAamB,YAAY,OAAOjB,KAAwBmB,WAAgB;AACtE,gBAAMjB,UAAUgB,mBAAkBE,KAAKD,MAAAA;AACvCjB,kBAAQX,gBAAgBA;AAExB,iBAAO,MAAMR,GAAGgB,QACdC,KACAE,SACA,OAAOW,WAAW;AAChB,mBAAOK,mBAAkBG,IAAIF,QAAQzB,QAAQmB,QAAQ9B,IAAIU,IAAAA;UAC3D,GACAyB,mBAAkBI,OAAO;QAE7B;MACF,CAAA;IACF;AAEAhC,QAAIC,iBAAiBO;AAErB,WAAOR;EACT,GAAG,CAAC,CAAA;AAEJ,SAAO,IAAIiC,MAAMxC,IAAI;IACnByC,IAAIC,QAAQC,MAAMC,UAAU;AAE1B,UAAID,SAAS,QAAQ;AACnB,eAAO3C;MACT;AAEA,UAAI2C,QAAQxC,aAAa;AACvB,eAAOA,YAAYwC;MACrB;AAEA,YAAME,QAAQC,QAAQL,IAAIC,QAAQC,MAAMC,QAAAA;AACxC,aAAO,OAAOC,SAAS,aAAaA,MAAME,KAAKL,MAAAA,IAAUG;IAC3D;EACF,CAAA;AACF;AAjGgB9C;;;ACRhB,IAAAiD,eAAiC;;;AFDjC;AAiDO,IAAMC,KAAN,MAAMA;EAWXC,YAAYC,SAAoB;AAsjBhC;AArjBE,SAAKC,MAAMD,QAAQE;AACnB,SAAKC,aAAaH,QAAQI;AAC1B,SAAKC,iBAAiBL,QAAQM;AAC9B,SAAKC,UAAUP,QAAQQ,UAAU,IAAIC,oBAAO,eAAeT,QAAQU,QAAQ;AAC3E,SAAKC,eAAe,oBAAIC,IAAAA;AACxB,SAAKC,aAAab,QAAQc;AAC1B,SAAKC,eAAef,QAAQgB;AAE5B,QAAIhB,QAAQiB,aAAa;AACvBjB,cAAQiB,YAAYC,QAAQ,CAACC,SAAS;AACpC,aAAKR,aAAaS,IAAID,KAAKE,gBAAgBF,IAAAA;MAC7C,CAAA;IACF;AAEA,SAAKG,eAAe,IAAIC,0CAAAA;AACxB,SAAKC,WAAWxB,QAAQyB;EAC1B;EAGA,IAAIjB,SAAS;AACX,WAAO,IAAIkB,SAAS,OAAOC,OAAOC,SAASC,SAAS;AAClD,UAAInB,WAAqB;AAEzB,cAAQiB,OAAAA;QACN,KAAK,OAAO;AACV,eAAKd,YAAYiB,IAAIF,SAASC,IAAAA;AAC9BnB,qBAAW;AACX;QACF;QACA,KAAK,SAAS;AACZ,eAAKG,YAAYkB,MAAMH,SAASC,IAAAA;AAChCnB,qBAAW;AACX;QACF;QACA,KAAK,QAAQ;AACX,eAAKG,YAAYmB,KAAKJ,SAASC,IAAAA;AAC/BnB,qBAAW;AACX;QACF;QACA,KAAK,QAAQ;AACX,eAAKG,YAAYoB,KAAKL,SAASC,IAAAA;AAC/BnB,qBAAW;AACX;QACF;QACA,KAAK,SAAS;AACZ,eAAKG,YAAYqB,MAAMN,SAASC,IAAAA;AAChCnB,qBAAW;AACX;QACF;MACF;AAEA,UAAID,oBAAO0B,kBAAkBzB,UAAU,KAAKK,YAAY,GAAG;AACzD,cAAM,KAAKqB,QACT;UAACR;UAASD;WACV;UACEU,MAAM;UACNC,MAAM;UACNC,aAAaX;UACbY,QAAQX;UACRY,YAAY;YAAC;cAAEC,OAAO;cAASC,MAAMhB;YAAM;;UAC3CiB,OAAO;YAAEA,OAAO;YAAWC,SAASlB,MAAMmB,YAAW;UAAG;UACxDC,MAAM;QACR,GACA,OAAO5B,SAAS;QAAC,CAAA;MAErB;IACF,CAAA;EACF;EAMA,MAAM6B,KAAKC,KAAqBC,SAAiB;AAC/C,WAAO,MAAM,KAAKd,QAChBa,KACA;MACEZ,MAAM;MACNC,MAAM;MACNE,QAAQ;QAAEU;MAAQ;MAClBH,MAAM;MACNI,YAAY,IAAIC,KAAKA,KAAKC,IAAG,IAAKH,UAAU,GAAA;MAC5CN,OAAO;QAAEA,OAAO;MAAU;IAC5B,GACA,OAAOzB,SAAS;IAAC,CAAA;EAErB;EAaA,MAAMmC,gBACJL,KACAM,KACAC,aACAC,OACwB;AACxB,UAAMC,YAAY,IAAIC,IAAIJ,GAAAA;AAE1B,WAAQ,MAAM,KAAKnB,QACjBa,KACA;MACEZ,MAAM,SAASqB,UAAUE,WAAWF,UAAUG;MAC9CrB,QAAQ;QAAEe;QAAKC;QAAaC;MAAM;MAClCK,WAAW;MACXxB,MAAM;MACNS,MAAM;MACNN,YAAY;QACV;UACEC,OAAO;UACPC,MAAMY;UACNA;QACF;QACA;UACEb,OAAO;UACPC,MAAMa,aAAaO,UAAU;QAC/B;QACA;UACErB,OAAO;UACPC,MAAM;QACR;;IAEJ,GACA,OAAOxB,SAAS;AACd,aAAOA,KAAK6C;IACd,CAAA;EAEJ;EAOA,MAAMC,UAAUhB,KAAqBiB,OAAkBlE,SAA4B;AACjF,WAAO,MAAM,KAAKoC,QAChBa,KACA;MACEZ,MAAM;MACNG,QAAQ;QAAE0B;QAAOlE;MAAQ;MACzByC,YAAY;QACV;UACEC,OAAO;UACPC,MAAMuB,MAAM7B;QACd;WACI6B,OAAOhE,KAAK;UAAC;YAAEwC,OAAO;YAAMC,MAAMuB,MAAMhE;UAAG;YAAK,CAAA;;IAExD,GACA,OAAOiB,SAAS;AACd,aAAO,MAAM,KAAKd,eAAe4D,UAAUC,OAAOlE,OAAAA;IACpD,CAAA;EAEJ;EAEA,MAAMmE,aAAalB,KAAqBjD,SAAoD;AAC1F,WAAO,KAAKoC,QACVa,KACA;MACEZ,MAAM;MACNE,aAAa;MACbE,YAAY;QACV;UACEC,OAAO;UACPC,MAAM3C,QAAQiD;QAChB;;MAEFT,QAAQxC;MACRoE,QAAQ;QACNC,OAAO;UAAC;;MACV;IACF,GACA,OAAOlD,SAAS;AACd,aAAO,MAAM,KAAKhB,WAAWgE,aAAa,KAAK9D,eAAeH,IAAIF,QAAQiD,KAAKjD,OAAAA;IACjF,CAAA;EAEJ;EASA,MAAMsE,iBACJrB,KACAsB,iBACArE,IACAF,SACA;AACA,WAAO,MAAM,KAAKoC,QAChBa,KACA;MACEZ,MAAM;MACNI,YAAY;QACV;UAAEC,OAAO;UAAYC,MAAM4B,gBAAgBrE;QAAG;QAC9C;UAAEwC,OAAO;UAAMC,MAAMzC;QAAG;QACxB;UAAEwC,OAAO;UAAWC,MAAM3C,QAAQkD,QAAQsB,SAAQ;QAAG;;MAEvDhC,QAAQxC;IACV,GACA,OAAOmB,SAAS;AACd,aAAOoD,gBAAgBE,SAASvE,IAAI;QAClCwE,MAAM;QACN1E;MACF,CAAA;IACF,CAAA;EAEJ;EAOA,MAAM2E,mBAAmB1B,KAAqBsB,iBAAkCrE,IAAY;AAC1F,WAAO,MAAM,KAAKkC,QAChBa,KACA;MACEZ,MAAM;MACNI,YAAY;QACV;UAAEC,OAAO;UAAYC,MAAM4B,gBAAgBrE;QAAG;QAC9C;UAAEwC,OAAO;UAAMC,MAAMzC;QAAG;;IAE5B,GACA,OAAOiB,SAAS;AACd,aAAOoD,gBAAgBK,WAAW1E,EAAAA;IACpC,CAAA;EAEJ;EAQA,MAAM2E,aACJ5B,KACAsB,iBACArE,IACAF,SACA;AACA,WAAO,MAAM,KAAKoC,QAChBa,KACA;MACEZ,MAAM;MACNI,YAAY;QACV;UAAEC,OAAO;UAAYC,MAAM4B,gBAAgBrE;QAAG;QAC9C;UAAEwC,OAAO;UAAMC,MAAMzC;QAAG;QACxB;UAAEwC,OAAO;UAAQC,MAAM3C,QAAQ8E;QAAK;;MAEtCtC,QAAQxC;IACV,GACA,OAAOmB,SAAS;AACd,aAAOoD,gBAAgBE,SAASvE,IAAI;QAClCwE,MAAM;QACN1E;MACF,CAAA;IACF,CAAA;EAEJ;EAOA,MAAM+E,eAAe9B,KAAqBsB,iBAAkCrE,IAAY;AACtF,WAAO,MAAM,KAAKkC,QAChBa,KACA;MACEZ,MAAM;MACNI,YAAY;QACV;UAAEC,OAAO;UAAYC,MAAM4B,gBAAgBrE;QAAG;QAC9C;UAAEwC,OAAO;UAAMC,MAAMzC;QAAG;;IAE5B,GACA,OAAOiB,SAAS;AACd,aAAOoD,gBAAgBK,WAAW1E,EAAAA;IACpC,CAAA;EAEJ;EAQA,MAAM8E,gBAGJ/B,KACAgC,SACA/E,IACAsC,QACkD;AAClD,WAAO,MAAM,KAAKJ,QAChBa,KACA;MACEZ,MAAM;MACNI,YAAY;QACV;UAAEC,OAAO;UAAWC,MAAMsC,QAAQ/E;QAAG;QACrC;UAAEwC,OAAO;UAAMC,MAAMzC;QAAG;;MAE1BsC;IACF,GACA,OAAOrB,SAAS;AACd,YAAM+D,eAAe,MAAM,KAAK9C,QAC9B,mBACA;QACEC,MAAM;MACR,GACA,OAAO8C,aAAa;AAClB,eAAOF,QAAQR,SAASvE,IAAIsC,MAAAA;MAC9B,CAAA;AAGF,YAAM4C,aAAa,MAAM,KAAKC,QAAQ,YAAYH,aAAaI,OAAOC,QAAQ;AAE9E,YAAMC,KAAKC;QAET;QACA;UACEC,aAAaN;QACf;QACA;UACEM,aAAaT,QAAQK,OAAOI;QAC9B;MAAA;AAGF,YAAMC,UAAU,MAAMV,QAAQK,OAAOb,SAASjC,QAAQ0C,cAAcM,IAAI,KAAKhE,QAAQ;AAErF,UAAI,CAACmE,SAAS;AAEZ;MACF;AAEA,aAAO,MAAM,KAAKxB,aAAa,iBAAiB;QAC9ClB,KAAKiC,aAAaI,OAAOrC;QACzB,GAAG0C;MACL,CAAA;IACF,CAAA;EAEJ;EAEA,MAAMN,QAAQpC,KAAqBsC,UAAwD;AACzF,QAAI,CAACA,UAAU;AACb;IACF;AAEA,WAAO,KAAKnD,QAAQa,KAAK;MAAEZ,MAAM;IAAW,GAAG,OAAOlB,SAAS;AAC7D,aAAO,MAAM,KAAKd,eAAegF,QAAQE,QAAAA;IAC3C,CAAA;EACF;EAUA,MAAMnD,QACJa,KACAjD,SACA4F,UACAC,SAKkB;AAClB,UAAMC,WAAW,KAAKxE,aAAayE,SAAQ,GAAIC;AAE/C,QAAIF,UAAU;AACZ,WAAKvF,QAAQwB,MAAM,qBAAqB;QACtC+D;QACA7C;QACAjD;MACF,CAAA;IACF;AAEA,UAAMqB,iBAAiB,MAAM4E,uBAAuB;MAAC,KAAKhG;MAAK6F,YAAY;MAAI7C;MAAKiD,KAAI,CAAA;AAExF,UAAMC,aAAa,KAAKxF,aAAayF,IAAI/E,cAAAA;AAEzC,QAAI8E,YAAY;AACd,WAAK5F,QAAQwB,MAAM,qBAAqB;QACtCV;QACA8E;MACF,CAAA;AAEA,aAAOA,WAAWnC;IACpB;AAEA,UAAM7C,OAAO,MAAM,KAAKhB,WAAWiC,QAAQ,KAAKnC,KAAK;MACnDoB;MACAgF,YAAY,OAAOpD,QAAQ,WAAWA,MAAMqD;MAC5CvD,MAAM;MACN,GAAG/C;MACH8F;IACF,CAAA;AAEA,QAAI3E,KAAKoF,WAAW,YAAY;AAC9B,WAAKhG,QAAQwB,MAAM,iBAAiB;QAClCV;QACAF;MACF,CAAA;AAEA,YAAM,IAAIqF,sBAAsBrF,IAAAA;IAClC;AAEA,QAAIA,KAAKoF,WAAW,aAAa;AAC/B,WAAKhG,QAAQwB,MAAM,qBAAqB;QACtCV;QACAF;MACF,CAAA;AAEA,4BAAK,wCAAL,WAAuBA;AAEvB,aAAOA,KAAK6C;IACd;AAEA,QAAI7C,KAAKoF,WAAW,WAAW;AAC7B,WAAKhG,QAAQwB,MAAM,gBAAgB;QACjCV;QACAF;MACF,CAAA;AAEA,YAAM,IAAIsF,MAAMtF,KAAKe,SAAS,cAAA;IAChC;AAEA,QAAIf,KAAKoF,WAAW,WAAW;AAC7B,WAAKhG,QAAQwB,MAAM,gBAAgB;QACjCV;QACAF;MACF,CAAA;AAEA,YAAM,IAAIuF,oBAAoBvF,IAAAA;IAChC;AAEA,QAAIA,KAAKoF,WAAW,aAAa,OAAOpF,KAAK2C,cAAc,UAAU;AACnE,WAAKvD,QAAQwB,MAAM,0BAA0B;QAC3CV;QACAF;MACF,CAAA;AAEA,YAAM,IAAIuF,oBAAoBvF,IAAAA;IAChC;AAEA,UAAMwF,cAAc,mCAAY;AAC9B,UAAI;AACF,cAAMC,SAAS,MAAMhB,SAASzE,MAAM,IAAI;AAExC,cAAM6C,SAAS6C,oCAAuBC,MAAMF,MAAAA;AAE5C,aAAKrG,QAAQwB,MAAM,2BAA2B;UAC5CV;UACAF;QACF,CAAA;AAEA,cAAM4F,gBAAgB,MAAM,KAAK5G,WAAW6G,aAAa,KAAK/G,KAAKkB,KAAKjB,IAAI;UAC1E8D,QAAQA,UAAUsC;UAClB7D,YAAYtB,KAAK8F,oBAAoBX;QACvC,CAAA;AAEA,YAAIS,cAAcR,WAAW,YAAY;AACvC,gBAAM,IAAIC,sBAAsBO,aAAAA;QAClC;AAEA,eAAO/C;MACT,SAAS9B,OAAP;AACA,YAAIgF,eAAehF,KAAAA,GAAQ;AACzB,gBAAMA;QACR;AAEA,YAAI2D,SAAS;AACX,cAAI;AACF,kBAAMsB,gBAAgBtB,QAAQ3D,OAAOf,MAAM,IAAI;AAE/C,gBAAIgG,eAAe;AACjB,kBAAIA,yBAAyBV,OAAO;AAClCvE,wBAAQiF;cACV,OAAO;AACL,sBAAMC,eAAcC,kCAAqBC,UAAUH,cAAcjF,KAAK;AAEtE,sBAAM,IAAIqF,mBACRH,aAAYI,UAAUJ,aAAYvF,OAAO;kBAAED,SAAS;gBAAgB,GACpET,MACAgG,cAAcM,OAAO;cAEzB;YACF;UACF,SAASC,YAAP;AACA,gBAAIR,eAAeQ,UAAAA,GAAa;AAC9B,oBAAMA;YACR;AAEAxF,oBAAQwF;UACV;QACF;AAEA,cAAMN,cAAcC,kCAAqBC,UAAUpF,KAAAA;AAEnD,YAAIlC,QAAQyD,OAAO;AACjB,gBAAMgE,cAAUE,+BAAiB3H,QAAQyD,OAAOtC,KAAKyG,WAAW,CAAA;AAEhE,cAAIH,SAAS;AACX,kBAAM,IAAIF,mBACRH,YAAYI,UAAUJ,YAAYvF,OAAO;cAAED,SAAS;YAAgB,GACpET,MACAsG,OAAAA;UAEJ;QACF;AAEA,YAAIL,YAAYI,SAAS;AACvB,gBAAM,KAAKrH,WAAW0H,SAAS,KAAK5H,KAAKkB,KAAKjB,IAAI;YAChDgC,OAAOkF,YAAYvF;UACrB,CAAA;QACF,OAAO;AACL,gBAAM,KAAK1B,WAAW0H,SAAS,KAAK5H,KAAKkB,KAAKjB,IAAI;YAChDgC,OAAO;cAAEN,SAASkG,KAAKC,UAAU7F,KAAAA;cAAQG,MAAM;YAAgB;UACjE,CAAA;QACF;AAEA,cAAMH;MACR;IACF,GA9EoB;AAgFpB,WAAO,KAAKZ,aAAa0G,IAAI;MAAEhC,QAAQ7E,KAAKjB;IAAG,GAAGyG,WAAAA;EACpD;EAQA,MAAMsB,IACJC,aACAC,eACiC;AACjC,QAAI;AACF,aAAO,MAAMD,YAAAA;IACf,SAAShG,OAAP;AACA,UAAIgF,eAAehF,KAAAA,GAAQ;AACzB,cAAMA;MACR;AAEA,aAAO,MAAMiG,cAAcjG,KAAAA;IAC7B;EACF;AAKF;AApkBapC;AAikBX;sBAAiB,gCAACqB,MAAkB;AAClC,OAAKR,aAAaS,IAAID,KAAKE,gBAAgBF,IAAAA;AAC7C,GAFiB;AAMnB,eAAe8E,uBAAuBmC,aAAoB;AACxD,QAAMC,OAAOD,YAAYE,IAAI,CAACrF,SAAQ;AACpC,QAAI,OAAOA,SAAQ,UAAU;AAC3B,aAAOA;IACT;AAEA,WAAOsF,gBAAgBtF,IAAAA;EACzB,CAAA;AAEA,QAAMA,MAAMoF,KAAKG,KAAK,GAAA;AAEtB,QAAMC,OAAO,MAAMC,6BAAUC,OAAOC,OAAO,WAAWC,OAAOC,KAAK7F,GAAAA,CAAAA;AAElE,SAAO4F,OAAOC,KAAKL,IAAAA,EAAMjE,SAAS,KAAA;AACpC;AAdeyB;AAgBf,SAASsC,gBAAgBQ,KAAkB;AACzC,WAASC,SAASD,MAAe;AAC/B,QAAI,OAAOA,SAAQ,YAAYA,SAAQ,MAAM;AAC3C,aAAOA;IACT;AAEA,QAAIE,MAAMC,QAAQH,IAAAA,GAAM;AACtB,aAAOA,KAAIT,IAAIU,QAAAA;IACjB;AAEA,UAAMG,aAAaC,OAAOf,KAAKU,IAAAA,EAAKM,KAAI;AACxC,UAAMC,aAAoC,CAAC;AAE3C,eAAWrG,OAAOkG,YAAY;AAC5BG,MAAAA,WAAUrG,OAAO+F,SAASD,KAAI9F,IAAI;IACpC;AAEA,WAAOqG;EACT;AAjBSN;AAmBT,QAAMM,YAAYN,SAASD,GAAAA;AAC3B,SAAOjB,KAAKC,UAAUuB,SAAAA;AACxB;AAtBSf;AA8BF,IAAM7G,WAAN,MAAMA;EACX3B,YAAoB6F,UAA4B;oBAA5BA;EAA6B;EAGjD9D,IAAIF,SAAiBa,YAAiD;AACpE,WAAO,KAAKmD,SAAS,OAAOhE,SAASa,UAAAA;EACvC;EAGAV,MAAMH,SAAiBa,YAAiD;AACtE,WAAO,KAAKmD,SAAS,SAAShE,SAASa,UAAAA;EACzC;EAGAT,KAAKJ,SAAiBa,YAAiD;AACrE,WAAO,KAAKmD,SAAS,QAAQhE,SAASa,UAAAA;EACxC;EAGAR,KAAKL,SAAiBa,YAAiD;AACrE,WAAO,KAAKmD,SAAS,QAAQhE,SAASa,UAAAA;EACxC;EAGAP,MAAMN,SAAiBa,YAAiD;AACtE,WAAO,KAAKmD,SAAS,SAAShE,SAASa,UAAAA;EACzC;AACF;AA3Baf;;;AGtqBb,IAAA6H,eAA+D;AAA/D,IAAAC;AAaO,IAAMC,eAAN,MAAMA;EAKXC,YAAYC,SAAmD;AAF/D,uBAAAH,WAAA;AAGE,uBAAKA,WAAWG;EAClB;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNC,OAAO,mBAAKN,WAASO,QAAQ,mBAAKP,WAASQ,MAAMF;MACjDG,MAAM;QACJD,OAAO,mBAAKR,WAASO,QAAQ,mBAAKP,WAASQ,MAAMD;QACjDG,QAAQ,mBAAKV,WAASU,UAAU;QAChCC,aAASC,+BAAiB,mBAAKZ,WAASa,UAAU,CAAC,GAAG,mBAAKb,WAASQ,MAAMK,UAAU,CAAC,CAAA;MACvF;IACF;EACF;EAEA,IAAIL,QAAQ;AACV,WAAO,mBAAKR,WAASQ;EACvB;EAEAM,YAAYC,eAA8BC,KAAmD;EAAC;EAE9F,IAAIC,iBAAiB;AACnB,WAAO;EACT;AACF;AA9BahB;AAGXD,YAAA;AAkEK,SAASkB,aACdf,SACqC;AACrC,SAAO,IAAIF,aAAa;IACtBM,MAAMJ,QAAQI;IACdM,QAAQV,QAAQU;IAChBL,OAAO;MACLD,MAAMJ,QAAQI;MACdD,OAAO;MACPI,QAAQP,QAAQO,UAAU;MAC1BS,MAAM;MACNC,UAAUjB,QAAQiB;MAClBC,cAAc,CAACC,eAAoB;AACjC,YAAInB,QAAQoB,QAAQ;AAClB,iBAAOpB,QAAQoB,OAAOC,MAAMF,UAAAA;QAC9B;AAEA,eAAOA;MACT;IACF;EACF,CAAA;AACF;AArBgBJ;;;ANxChB,IAAMO,sBAA+D;EACnEC,MAAMC;EACNC,OAAO;EACPC,QAAQ;EACRC,MAAM;EACNC,cAAcC,uCAA0BC;AAC1C;AAhDA,IAAAC,WAAA;AAuEO,IAAMC,gBAAN,MAAMA;EAyBXC,YAAYC,SAAyC;AAifrD,uBAAM;AAaN,uBAAM;AAuFN;AAmBA;AAkBA,uBAAM;AAlpBN,uBAAAH,WAAA;AACA,wCAA8E,CAAC;AAC/E,2CAAqD,CAAC;AACtD,sDASI,CAAC;AACL,mDAGI,CAAC;AACL,sDAAwF,CAAC;AACzF,6CAA+E,CAAC;AAEhF;AACA;AAIE,SAAKI,KAAKD,QAAQC;AAClB,uBAAKJ,WAAWG;AAChB,uBAAK,SAAU,IAAIE,UAAU,mBAAKL,UAAQ;AAC1C,uBAAK,iBAAkB,IAAIM,oBAAO,eAAe,mBAAKN,WAASO,UAAU,UAAU,KAAK;EAC1F;EAEA,MAAMC,cAAcC,SAA+C;AACjE,uBAAK,iBAAgBC,MAAM,oBAAoB;MAC7CC,KAAKF,QAAQE;MACbC,SAASC,OAAOC,YAAYL,QAAQG,QAAQG,QAAO,CAAA;MACnDC,QAAQP,QAAQO;IAClB,CAAA;AAEA,UAAMC,SAASR,QAAQG,QAAQM,IAAI,mBAAA;AAEnC,UAAMC,gBAAgB,KAAKC,WAAWH,MAAAA;AAEtC,YAAQE,eAAAA;MACN,KAAK,cAAc;AACjB;MACF;MACA,KAAK,kBAAkB;AACrB,eAAO;UACLE,QAAQ;UACRC,MAAM;YACJC,SAAS;UACX;QACF;MACF;MACA,KAAK,kBAAkB;AACrB,eAAO;UACLF,QAAQ;UACRC,MAAM;YACJC,SAAS;UACX;QACF;MACF;MACA,KAAK,gBAAgB;AACnB,eAAO;UACLF,QAAQ;UACRC,MAAM;YACJC,SAAS;UACX;QACF;MACF;IACF;AAEA,QAAId,QAAQO,WAAW,QAAQ;AAC7B,aAAO;QACLK,QAAQ;QACRC,MAAM;UACJC,SAAS;QACX;MACF;IACF;AAEA,UAAMC,SAASf,QAAQG,QAAQM,IAAI,kBAAA;AAEnC,QAAI,CAACM,QAAQ;AACX,aAAO;QACLH,QAAQ;QACRC,MAAM;UACJC,SAAS;QACX;MACF;IACF;AAEA,YAAQC,QAAAA;MACN,KAAK,QAAQ;AACX,cAAMC,aAAahB,QAAQG,QAAQM,IAAI,uBAAA;AAEvC,YAAI,CAACO,YAAY;AACf,iBAAO;YACLJ,QAAQ;YACRC,MAAM;cACJI,IAAI;cACJC,OAAO;YACT;UACF;QACF;AAEA,YAAI,KAAKvB,OAAOqB,YAAY;AAC1B,iBAAO;YACLJ,QAAQ;YACRC,MAAM;cACJI,IAAI;cACJC,OAAO,wCAAwC,KAAKvB,WAAWqB;YACjE;UACF;QACF;AAEA,eAAO;UACLJ,QAAQ;UACRC,MAAM;YACJI,IAAI;UACN;QACF;MACF;MACA,KAAK,kBAAkB;AAErB,cAAME,QAAQnB,QAAQG,QAAQM,IAAI,kBAAA;AAElC,YAAIU,OAAO;AACT,gBAAMC,MAAM,mBAAK,iBAAgBD;AAEjC,cAAI,CAACC,KAAK;AACR,mBAAO;cACLR,QAAQ;cACRC,MAAM;gBACJC,SAAS;cACX;YACF;UACF;AAEA,iBAAO;YACLF,QAAQ;YACRC,MAAMO,IAAIC,OAAM;UAClB;QACF;AAEA,cAAMR,OAA8B;UAClCS,MAAMlB,OAAOmB,OAAO,mBAAK,gBAAe,EAAEC,IAAI,CAACJ,QAAQA,IAAIC,OAAM,CAAA;UACjEI,SAASrB,OAAOmB,OAAO,mBAAK,mBAAkB;UAC9CG,iBAAiBtB,OAAOmB,OAAO,mBAAK,2BAA0B,EAAEC,IAAI,CAACG,aAAa;YAChFhC,IAAIgC,QAAQhC;YACZ2B,MAAM,mBAAK,+BAA8BK,QAAQhC,OAAO,CAAA;YACxDiC,mBAAmB;cACjBjC,IAAIkC,kCAAkCF,QAAQhC,EAAE;cAChDmC,SAASH,QAAQzC,OAAO4C;YAC1B;UACF,EAAA;UACAC,kBAAkB3B,OAAOE,QAAQ,mBAAK,qBAAoB,EAAEkB,IAAI,CAAC,CAAC7B,IAAI2B,IAAAA,OAAW;YAC/E3B;YACA2B;UACF,EAAA;QACF;AAGA,eAAO;UACLV,QAAQ;UACRC;QACF;MACF;MACA,KAAK,sBAAsB;AACzB,cAAMmB,OAAO,MAAMhC,QAAQgC,KAAI;AAC/B,cAAMnB,OAAOoB,yCAA4BC,UAAUF,IAAAA;AAEnD,YAAI,CAACnB,KAAKsB,SAAS;AACjB,iBAAO;YACLvB,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,cAAMsB,iBAAiB,mBAAK,4BAA2BvB,KAAKwB,KAAK1C;AAEjE,YAAI,CAACyC,gBAAgB;AACnB,iBAAO;YACLxB,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,eAAO;UACLF,QAAQ;UACRC,MAAMuB,eAAeE,2BAA2BzB,KAAKwB,KAAKE,MAAM;QAClE;MACF;MACA,KAAK,eAAe;AAClB,cAAMP,OAAO,MAAMhC,QAAQgC,KAAI;AAC/B,cAAMQ,YAAYC,8BAAiBP,UAAUF,IAAAA;AAE7C,YAAI,CAACQ,UAAUL,SAAS;AACtB,iBAAO;YACLvB,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,cAAMM,MAAM,mBAAK,iBAAgBoB,UAAUH,KAAKjB,IAAIzB;AAEpD,YAAI,CAACyB,KAAK;AACR,iBAAO;YACLR,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,cAAM4B,UAAU,MAAM,sBAAK,4BAAL,WAAiBF,UAAUH,MAAMjB;AAEvD,eAAO;UACLR,QAAQ;UACRC,MAAM6B;QACR;MACF;MACA,KAAK,kBAAkB;AACrB,cAAMV,OAAO,MAAMhC,QAAQgC,KAAI;AAC/B,cAAMnB,OAAO8B,qCAAwBT,UAAUF,IAAAA;AAE/C,YAAI,CAACnB,KAAKsB,SAAS;AACjB,iBAAO;YACLvB,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,cAAMM,MAAM,mBAAK,iBAAgBP,KAAKwB,KAAKjB,IAAIzB;AAE/C,YAAI,CAACyB,KAAK;AACR,iBAAO;YACLR,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,cAAM4B,UAAU,MAAM,sBAAK,kCAAL,WAAoB7B,KAAKwB,MAAMjB;AAErD,eAAO;UACLR,QAAQ;UACRC,MAAM;YACJ+B,OAAOF,QAAQE;YACfC,YAAYH,QAAQG;UACtB;QACF;MACF;MACA,KAAK,+BAA+B;AAClC,cAAM1C,UAAU2C,4CAA+BZ,UAC7C9B,OAAOC,YAAYL,QAAQG,QAAQG,QAAO,CAAA,CAAA;AAG5C,YAAI,CAACH,QAAQgC,SAAS;AACpB,iBAAO;YACLvB,QAAQ;YACRC,MAAM;cACJC,SAAS;YACX;UACF;QACF;AAEA,cAAMiC,yBAAyB5C,QAAQkC,KAAK,wBAAwB;AAEpE,cAAMW,oBAAiC;UACrCzC,QAAQJ,QAAQkC,KAAK;UACrBlC,SAASA,QAAQkC,KAAK;UACtBxB,MAAMkC,yBAAyB/C,QAAQa,OAAOoC;QAChD;AAEA,YAAIF,wBAAwB;AAC1B,cAAI;AAEFC,8BAAkBE,SAAS;UAC7B,SAAShC,OAAP;UAEF;QACF;AAEA,cAAMiC,gBAAgB,IAAIC,QAAQjD,QAAQkC,KAAK,kBAAkBW,iBAAAA;AAEjE,cAAMK,MAAMlD,QAAQkC,KAAK;AACzB,cAAMiB,YAAYnD,QAAQkC,KAAK;AAC/B,cAAMkB,SAASpD,QAAQkC,KAAK;AAC5B,cAAME,SAASpC,QAAQkC,KAAK;AAC5B,cAAMA,OAAOlC,QAAQkC,KAAK;AAE1B,cAAMnD,SAAS;UACbmE;UACAC;UACAC;UACAhB;UACAF;QACF;AAEA,cAAM,EAAEmB,UAAUC,OAAM,IAAK,MAAM,sBAAK,sDAAL,WAA8BvE,QAAQiE;AAEzE,eAAO;UACLvC,QAAQ;UACRC,MAAM;YACJ4C;YACAD;UACF;QACF;MACF;MACA,KAAK,YAAY;AACf,eAAO;UACL5C,QAAQ;UACRC,MAAM;YACJI,IAAI;YACJD,YAAY,KAAKrB;UACnB;QACF;MACF;IACF;AAEA,WAAO;MACLiB,QAAQ;MACRC,MAAM;QACJC,SAAS;MACX;IACF;EACF;EAEA4C,OAAOtC,KAAmC;AACxC,QAAI,CAACA,IAAIuC,SAAS;AAChB;IACF;AAEA,uBAAK,iBAAgBvC,IAAIzB,MAAMyB;AAE/BA,QAAIO,QAAQiC,YAAY,MAAMxC,GAAAA;EAChC;EAEAyC,qBAAqBlC,SAAyC;AAC5D,uBAAK,4BAA2BA,QAAQhC,MAAMgC;AAE9C,QAAImC,IAAI,MAAM;MACZnE,IAAIkC,kCAAkCF,QAAQhC,EAAE;MAChDZ,MAAM,4BAA4B4C,QAAQhC;MAC1CmC,SAASH,QAAQzC,OAAO4C;MACxBH,SAAS,IAAIoC,aAAa;QACxBC,OAAOlF;QACPmF,QAAQ;UAAEC,kBAAkB;YAACvC,QAAQhC;;QAAI;MAC3C,CAAA;MACAwE,cAAc;QACZC,aAAazC,QAAQzC,OAAOkF;MAC9B;MACAC,KAAK,OAAOL,OAAOM,IAAIC,QAAQ;AAC7B,cAAMC,UAAU,MAAM7C,QAAQzC,OAAOuF,SAAST,MAAM9E,OAAOqD,QAAQyB,OAAOM,IAAIC,GAAAA;AAE9E,YAAI,CAACC,SAAS;AAEZ;QACF;AAEA,eAAO,MAAMF,GAAGI,aAAa,iBAAiB;UAC5CrB,KAAKW,MAAM9E,OAAOmE;UAClB,GAAGmB;QACL,CAAA;MACF;MAEAG,YAAY;IACd,CAAA;EACF;EAEAC,0BAA0BxD,KAA6BO,SAAyC;AAC9F,UAAML,OAAO,mBAAK,+BAA8BK,QAAQhC,OAAO,CAAA;AAE/D2B,SAAKuD,KAAK;MAAElF,IAAIyB,IAAIzB;MAAImC,SAASV,IAAIU;IAAQ,CAAA;AAE7C,uBAAK,+BAA8BH,QAAQhC,MAAM2B;EACnD;EAEAwD,aAAapF,SAKJ;AACP,uBAAK,+BAA8BA,QAAQ2D,OAAO,OAAO0B,GAAGC,MAAM;AAChE,aAAO,MAAMtF,QAAQR,OAAO+F,OAAOF,GAAGC,GAAG,mBAAK,gBAAe;IAC/D;AAEA,QAAIE,mBAAmB,mBAAK,oBAAmBxF,QAAQ2D;AAEvD,QAAI,CAAC6B,kBAAkB;AACrBA,yBAAmB;QACjBC,SAASzF,QAAQR,OAAOiG;QACxB9B,KAAK3D,QAAQ2D;QACbd,QAAQ7C,QAAQ6C;QAChBkB,QAAQ,CAAA;QACRW,aAAa;UACXzE,IAAID,QAAQR,OAAOkF,YAAYzE;UAC/ByF,UAAU1F,QAAQR,OAAOkF,YAAYgB;UACrCC,YAAY3F,QAAQR,OAAOkF,YAAYkB,OAAOC,gBAAgB,UAAU;QAC1E;QACA3D,mBAAmB;UACjBjC,IAAID,QAAQ2D;UACZvB,SAASpC,QAAQR,OAAO4C;QAC1B;MACF;IACF;AAEAoD,qBAAiBzB,SAAS+B,MAAMC,KAC9B,oBAAIC,IAAI;SACHR,iBAAiBzB;SAChB,OAAO/D,QAAQsE,MAAMjF,SAAS,WAAW;QAACW,QAAQsE,MAAMjF;UAAQW,QAAQsE,MAAMjF;KACnF,CAAA;AAGH,uBAAK,oBAAmBW,QAAQ2D,OAAO6B;AAEvC,QAAIpB,IAAI,MAAM;MACZnE,IAAID,QAAQ2D;MACZtE,MAAMW,QAAQ2D;MACdvB,SAASpC,QAAQR,OAAO4C;MACxBH,SAAS,IAAIoC,aAAa;QACxBC,OAAOlF;QACPmF,QAAQ;UAAE/E,QAAQ;YAAEmE,KAAK;cAAC3D,QAAQ2D;;UAAK;QAAE;MAC3C,CAAA;MACAc,cAAc;QACZC,aAAa1E,QAAQR,OAAOkF;MAC9B;MACAC,KAAK,OAAOL,OAAOM,IAAIC,QAAQ;AAC7B,cAAMC,UAAU,MAAM9E,QAAQR,OAAOuF,SAAS/E,QAAQ6C,QAAQyB,OAAOM,IAAIC,GAAAA;AAEzE,YAAI,CAACC,SAAS;AAEZ;QACF;AAEA,eAAO,MAAMF,GAAGI,aAAa,iBAAiB;UAC5CrB,KAAK3D,QAAQ2D;UACb,GAAGmB;QACL,CAAA;MACF;MAEAG,YAAY;IACd,CAAA;EACF;EAEAgB,sBAAsBtC,KAAajC,KAAmC;AACpE,UAAME,OAAO,mBAAK,sBAAqB+B,QAAQ,CAAA;AAE/C/B,SAAKuD,KAAK;MAAElF,IAAIyB,IAAIzB;MAAImC,SAASV,IAAIU;IAAQ,CAAA;AAE7C,uBAAK,sBAAqBuB,OAAO/B;EACnC;EAEA,MAAMsE,gBAAgBjG,IAAY0D,KAAa3D,SAA8B;AAC3E,WAAO,mBAAK,SAAQkG,gBAAgB,KAAKjG,IAAIA,IAAI0D,KAAK3D,OAAAA;EACxD;EAEA,MAAMmG,QAAQlG,IAAY;AACxB,WAAO,mBAAK,SAAQkG,QAAQ,KAAKlG,IAAIA,EAAAA;EACvC;EAOA,MAAMmG,UAAU9B,OAAkBtE,SAA4B;AAC5D,WAAO,mBAAK,SAAQoG,UAAU9B,OAAOtE,OAAAA;EACvC;EAEA,MAAMqG,iBAAiBpG,IAAY0D,KAAa2C,UAA4B;AAC1E,WAAO,mBAAK,SAAQD,iBAAiB,KAAKpG,IAAIA,IAAI0D,KAAK2C,QAAAA;EACzD;EAEA,MAAMC,mBAAmBtG,IAAY0D,KAAa;AAChD,WAAO,mBAAK,SAAQ4C,mBAAmB,KAAKtG,IAAIA,IAAI0D,GAAAA;EACtD;EAEA,MAAM6C,SAASC,SAAiB;AAC9B,WAAO,mBAAK,SAAQD,SAASC,OAAAA;EAC/B;EAEA,MAAMC,OAAOC,OAAe3G,SAAwC;AAClE,WAAO,mBAAK,SAAQ0G,OAAOC,OAAO3G,OAAAA;EACpC;EAEA,MAAM4G,QAAQC,SAAiB7G,SAA0B;AACvD,WAAO,mBAAK,SAAQ4G,QAAQC,SAAS7G,OAAAA;EACvC;EAEAiB,WACEH,QACqE;AACrE,QAAI,OAAOA,WAAW,UAAU;AAC9B,aAAO;IACT;AAEA,UAAMgG,cAAc,mBAAKjH,WAASiB,UAAUiG,QAAQC,IAAIC;AAExD,QAAI,CAACH,aAAa;AAChB,aAAO;IACT;AAEA,WAAOhG,WAAWgG,cAAc,eAAe;EACjD;EAEAhG,SAAS;AACP,WAAO,mBAAKjB,WAASiB,UAAUiG,QAAQC,IAAIC;EAC7C;EAoPAC,UAGElH,SAA8C;AAC9C,WAAO,IAAIoE,IAA6B,MAAMpE,OAAAA;EAChD;AACF;AAlwBaF;AACXD,YAAA;AACA;AACA;AACA;AAUA;AAIA;AACA;AAEA;AACA;AAofM;mBAAc,sCAACsB,MAAyBO,KAAiD;AAC7F,QAAMyF,UAAU,sBAAK,4DAAL,WAAiChG;AAEjD,QAAMiG,gBAAgB1F,IAAIO,QAAQqC,MAAM5E,aAAayB,KAAKmD,MAAM+C,WAAW,CAAC,CAAA;AAE5E,QAAMlE,aAAazB,IAAIO,QAAQqC,MAAMgD,gBAAgBF,aAAAA,KAAkB,CAAA;AAEvE,SAAO;IACLlE,OAAO;IACPC;EACF;AACF,GAXoB;AAad;gBAAW,sCAAChC,OAAkBO,MAAsD;AACxF,qBAAK,iBAAgBnB,MAAM,iBAAiB;IAC1CuC,WAAW3B;IACXO,KAAKA,KAAIC,OAAM;EACjB,CAAA;AAEA,QAAMwF,UAAU,sBAAK,wCAAL,WAAuBhG;AAEvC,QAAMyD,KAAK,IAAI2C,GAAG;IAChBtH,IAAIkB,MAAKwD,IAAI1E;IACbuH,aAAarG,MAAKsG;IAClBC,WAAW,mBAAK;IAChBC,QAAQ,mBAAK;IACb/B,QAAQ;IACRuB;IACAS,aAAalG,KAAImG,YAAY,mBAAKhI,WAASgI,YAAY;IACvDC,WAAW,mBAAKjI,WAASkI,oBACrB,IAAI5H,oBAAOuB,KAAIzB,IAAIyB,KAAImG,YAAY,mBAAKhI,WAASgI,YAAY,MAAA,IAC7DtE;EACN,CAAA;AAEA,QAAMyE,oBAAoBC,yBACxBrD,IACAzD,MAAK+G,aACLxG,KAAI1B,QAAQyE,YAAY;AAG1B,MAAI;AACF,UAAM0D,SAAS,MAAMzG,KAAI1B,QAAQ2E,IAC/BjD,KAAIO,QAAQqC,MAAM5E,aAAayB,MAAKmD,MAAM+C,WAAW,CAAC,CAAA,GACtDW,mBACAb,OAAAA;AAGF,WAAO;MAAEjG,QAAQ;MAAWiH;IAAO;EACrC,SAAS3G,OAAP;AACA,QAAIA,iBAAiB4G,qBAAqB;AACxC,aAAO;QAAElH,QAAQ;QAAoBmH,MAAM7G,MAAM6G;MAAK;IACxD;AAEA,QAAI7G,iBAAiB8G,oBAAoB;AACvC,aAAO;QACLpH,QAAQ;QACRmH,MAAM7G,MAAM6G;QACZ7G,OAAOA,MAAM+G;QACbC,SAAShH,MAAMgH;MACjB;IACF;AAEA,QAAIhH,iBAAiBiH,uBAAuB;AAC1C,aAAO;QACLvH,QAAQ;QACRmH,MAAM7G,MAAM6G;MACd;IACF;AAEA,QAAI7G,iBAAiB8G,oBAAoB;AACvC,YAAMI,kBAAiBC,kCAAqBnG,UAAUhB,MAAM+G,KAAK;AAEjE,UAAIG,gBAAejG,SAAS;AAC1B,eAAO;UACLvB,QAAQ;UACRM,OAAOkH,gBAAe/F;UACtB0F,MAAM7G,MAAM6G;QACd;MACF;AAEA,aAAO;QACLnH,QAAQ;QACRM,OAAO;UAAEJ,SAAS;QAAgB;QAClCiH,MAAM7G,MAAM6G;MACd;IACF;AAEA,UAAMK,iBAAiBC,kCAAqBnG,UAAUhB,KAAAA;AAEtD,QAAIkH,eAAejG,SAAS;AAC1B,aAAO;QAAEvB,QAAQ;QAASM,OAAOkH,eAAe/F;MAAK;IACvD;AAEA,WAAO;MACLzB,QAAQ;MACRM,OAAO;QAAEJ,SAAS;MAAgB;IACpC;EACF;AACF,GArFiB;AAuFjB;sBAAiB,gCAAC0B,WAAuC;AACvD,QAAM,EAAEwB,OAAOsE,cAAcC,aAAanH,KAAKiD,KAAKnF,OAAM,IAAKsD;AAE/D,SAAO;IACLwB,OAAO;MACLrE,IAAIqE,MAAMrE;MACVZ,MAAMiF,MAAMjF;MACZ8H,SAAS7C,MAAM6C;MACf2B,WAAWxE,MAAMwE;IACnB;IACAF;IACAC;IACAnH;IACAiD;IACAoE,SAASjG,UAAUiG;IACnBvJ;EACF;AACF,GAjBiB;AAmBjB;gCAA2B,gCAAC2B,OAAmD;AAC7E,QAAM,EAAEmD,OAAOsE,cAAcC,aAAanH,KAAKiD,KAAKoE,QAAO,IAAK5H;AAEhE,SAAO;IACLmD,OAAO;MACLrE,IAAIqE,MAAMrE;MACVZ,MAAMiF,MAAMjF;MACZ8H,SAAS7C,MAAM6C;MACf2B,WAAWxE,MAAMwE;IACnB;IACAF;IACAC;IACAnH;IACAiD;IACAoE;EACF;AACF,GAhB2B;AAkBrB;6BAAwB,sCAC5BvJ,QAOAiE,eACgE;AAChE,qBAAK,iBAAgBlD,MAAM,gCAAgC;IACzDf;EACF,CAAA;AAEA,MAAIA,OAAOoE,WAAW;AACpB,UAAMlB,iBAAiB,mBAAK,4BAA2BlD,OAAOoE;AAE9D,QAAI,CAAClB,gBAAgB;AACnB,yBAAK,iBAAgBnC,MAAM,iDAAiD;QAC1Ef;MACF,CAAA;AAEA,aAAO;QACLsE,UAAU;UACR5C,QAAQ;UACRC,MAAM;YACJI,IAAI;UACN;QACF;QACAwC,QAAQ,CAAA;MACV;IACF;AAEA,UAAMf,WAAU,MAAMN,eAAelD,OAAO+F,OAC1C/F,QACAiE,eACA,mBAAK,gBAAe;AAGtB,QAAI,CAACT,UAAS;AACZ,aAAO;QACLe,QAAQ,CAAA;QACRD,UAAU;UACR5C,QAAQ;UACRC,MAAM;YACJI,IAAI;UACN;QACF;MACF;IACF;AAEA,WAAO;MACLwC,QAAQf,SAAQe;MAChBD,UAAUd,SAAQc,YAAY;QAC5B5C,QAAQ;QACRC,MAAM;UACJI,IAAI;QACN;MACF;IACF;EACF;AAEA,QAAMyH,UAAU,mBAAK,+BAA8BxJ,OAAOmE;AAE1D,MAAI,CAACqF,SAAS;AACZ,uBAAK,iBAAgBzI,MAAM,yCAAyC;MAClEf;IACF,CAAA;AAEA,WAAO;MACLsE,UAAU;QACR5C,QAAQ;QACRC,MAAM;UACJI,IAAI;QACN;MACF;MACAwC,QAAQ,CAAA;IACV;EACF;AAEA,QAAMf,UAAU,MAAMgG,QAAQxJ,QAAQiE,aAAAA;AAEtC,MAAI,CAACT,SAAS;AACZ,WAAO;MACLe,QAAQ,CAAA;MACRD,UAAU;QACR5C,QAAQ;QACRC,MAAM;UACJI,IAAI;QACN;MACF;IACF;EACF;AAEA,SAAO;IACLwC,QAAQf,QAAQe;IAChBD,UAAUd,QAAQc,YAAY;MAC5B5C,QAAQ;MACRC,MAAM;QACJI,IAAI;MACN;IACF;EACF;AACF,GAvG8B;AAiHhC,SAASY,kCAAkClC,IAAY;AACrD,SAAO,4BAA4BA;AACrC;AAFSkC;;;AOzxBF,SAAS8G,kBAA6CC,SAGZ;AAC/C,SAAOA;AACT;AALgBD;;;AChDhB,IAAAE,eAWO;AAgGA,IAAMC,iBAAN,MAAMA;EAOXC,YACEC,SACQC,SACR;mBADQA;AAER,SAAKD,UAAUA;EACjB;EAEA,MAAME,OACJC,QACAC,UACAC,QACA;AACA,WAAO,KAAKJ,QAAQK,QAClB;MACEH,QAAQ;QAAE,GAAGA;QAAQI,QAAQJ,OAAOI;MAAkB;MACtDH;IACF,GACAC,MAAAA;EAEJ;EAEAG,OAAOD,QAA8B;AACnC,WAAO,KAAKN,QAAQO,SAASD,MAAAA,KAAW,CAAC;EAC3C;EAEAE,WAAWF,QAAoC;AAC7C,WAAO,KAAKN,QAAQQ,aAAaF,MAAAA,KAAW,CAAA;EAC9C;EAEA,MAAMG,SAASH,QAAiBI,eAAoCC,IAAQC,KAAqB;AAC/F,UAAM,EAAEC,QAAQC,OAAOC,SAASb,OAAM,IAAKc,KAAKN,eAAe,QAAA;AAC/D,UAAM,EAAEG,QAAQI,sBAAsBF,SAAShB,QAAO,IAAKiB,KAAKd,QAAQ,SAAA;AACxE,UAAM,EAAEW,QAAQK,mBAAkB,IAAKF,KAAKjB,SAAS,MAAA;AAErD,UAAMoB,UAAU,MAAM,KAAKnB,QAAQS,SACjC;MACE,GAAGK;MACHZ,QAAQ;QAAE,GAAGe;QAAsB,GAAGC;MAAmB;MACzDZ;IACF,GACAK,IACAC,GAAAA;AAGF,WAAOO;EACT;EAEAC,IAAId,QAAyB;AAC3B,UAAMe,QAAQ;MAAC,KAAKrB,QAAQsB;MAAI,KAAKvB;;AAErCsB,UAAME,KAAK,KAAKvB,QAAQoB,IAAId,MAAAA,CAAAA;AAC5Be,UAAME,KAAK,KAAKC,YAAYF,EAAE;AAE9B,WAAOD,MAAMI,KAAK,GAAA;EACpB;EAEA,IAAID,cAAc;AAChB,WAAO,KAAKxB,QAAQwB;EACtB;EAEA,IAAIE,oBAAoB;AACtB,WAAO;MACLJ,IAAI,KAAKE,YAAYF;MACrBK,UAAU,KAAKH,YAAYG;IAC7B;EACF;EAEA,IAAIL,KAAK;AACP,WAAO,KAAKtB,QAAQsB;EACtB;EAEA,IAAIM,UAAU;AACZ,WAAO,KAAK5B,QAAQ4B;EACtB;AACF;AAjFa/B;AAiGN,IAAMgC,wBAAN,MAAMA;EAKX/B,YAAoBE,SAA0E;mBAA1EA;EAA2E;EAE/F,IAAIc,QAAQ;AACV,WAAO,KAAKd,QAAQc;EACtB;EAEAgB,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNC,OAAO;MACPC,MAAM;QACJnB,OAAO,KAAKA,MAAMoB;QAClBC,aAASC,+BACP,KAAKpC,QAAQE,OAAOK,OAAO,KAAKP,QAAQM,MAAM,GAC9C,KAAKQ,MAAMP,UAAU,CAAC,GACtB,KAAKP,QAAQM,OAAOC,UAAU,CAAC,CAAA;QAEjCL,QAAQ,KAAKY,MAAMZ;MACrB;MACAM,YAAY,KAAKR,QAAQE,OAAOM,WAAW,KAAKR,QAAQM,MAAM;IAChE;EACF;EAEA+B,YAAYC,eAA8BC,KAA6C;AACrFD,kBAAcE,aAAa;MACzBpB,KAAKqB,UAAU,KAAKzC,QAAQE,OAAOkB,IAAI,KAAKpB,QAAQM,MAAM,CAAA;MAC1DJ,QAAQ,KAAKF,QAAQE;MACrBY,OAAO,KAAKd,QAAQc;MACpBR,QAAQ,KAAKN,QAAQM;IACvB,CAAA;EACF;EAEA,IAAIoC,iBAAiB;AACnB,WAAO;EACT;AACF;AAxCab;AA0CN,SAASb,KACd2B,KACAvB,KACuC;AACvC,QAAMP,SAAc,CAAC;AAErB,aAAW+B,KAAKC,OAAOC,KAAKH,GAAAA,GAAM;AAChC,QAAIC,MAAMxB;AAAK;AAEfP,WAAO+B,KAAKD,IAAIC;EAClB;AAEA,SAAO;IAAE/B;IAAQE,SAAS4B,IAAIvB;EAAK;AACrC;AAbgBJ;;;ACxPhB,IAAA+B,eAKO;AALP,IAAAC,UAAAC;AAqCO,IAAMC,iBAAN,MAAMA;EAaXC,YAAYC,QAAuBC,SAA6D;AARhG,uBAAAL,UAAA;AACA,uBAAAC,WAAA;AAQE,uBAAKD,UAAUI;AACf,uBAAKH,WAAWI;AAChB,SAAKC,SAASD,QAAQC;AAEtBF,WAAOG,qBAAqB,IAAI;EAClC;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNC,IAAI,mBAAKT,WAASS;IACpB;EACF;EAEA,IAAIA,KAAK;AACP,WAAO,mBAAKT,WAASS;EACvB;EAEA,IAAIC,QAAQ;AACV,WAAO,mBAAKV,WAASU;EACvB;EAEAC,2BAA2BC,QAAoE;AAC7F,UAAMC,MAAMC,UAAU,KAAKT,OAAOQ,IAAID,MAAAA,CAAAA;AAEtC,WAAO;MACLG,MAAM;QACJL,OAAO,KAAKA,MAAMM;QAClBX,QAAQ,KAAKK,MAAML;QACnBY,aAASC,+BAAiB,KAAKb,OAAOc,OAAOP,MAAAA,GAAS,KAAKF,MAAMS,UAAU,CAAC,CAAA;MAC9E;MACAd,QAAQ;QACNQ;QACAO,SAAS,KAAKf,OAAOe;QACrBR;QACAS,QAAQ,OAAO,KAAKX,MAAMM,SAAS,WAAW;UAAC,KAAKN,MAAMM;YAAQ,KAAKN,MAAMM;QAC7EM,aAAa;UACXb,IAAI,KAAKJ,OAAOiB,YAAYb;UAC5Bc,UAAU,KAAKlB,OAAOiB,YAAYC;UAClCC,YAAY,KAAKnB,OAAOiB,YAAYnB,OAAOsB,gBAAgB,UAAU;QACvE;MACF;IACF;EACF;EAMA,MAAMC,SACJb,KACAD,QAC8B;AAC9B,WAAO,mBAAKb,UAAQ4B,gBAAgB,KAAKlB,IAAII,KAAK,KAAKF,2BAA2BC,MAAAA,CAAAA;EACpF;EAEAgB,YAAYC,eAA8BC,KAA0C;AAClFD,kBAAcE,0BAA0BD,KAAK,IAAI;EACnD;EAEA,IAAIE,iBAAiB;AACnB,WAAO;EACT;AACF;AA7Ea/B;AAKXF,WAAA;AACAC,YAAA;;;AC3CF,IAAAiC,eAQO;AAIP,uBAAsB;AAItB,IAAMC,WAAW;EACf;IACEC,IAAI;IACJC,MAAM;IACNC,MAAM;IACNC,SAAS;MACPC,IAAIC,yBAAYC;MAChBC,eAAeF,yBAAYC;IAC7B;EACF;;AAGK,IAAME,kBAAN,MAAMA;EACXC,YAAoBC,SAA0B;mBAA1BA;EAA2B;EAE/C,IAAIC,QAAQ;AACV,WAAO;MACLV,MAAM;MACNW,OAAO;MACPC,QAAQ;MACRX,MAAM;MACNH;MACAe,cAAcC,oCAAuBC;MACrCC,YAAY;QACV;UACEC,OAAO;UACPC,MAAM,GAAG,KAAKT,QAAQU;QACxB;;IAEJ;EACF;EAEAC,YACEC,eACAC,KACM;EAAC;EAET,IAAIC,iBAAiB;AACnB,WAAO;EACT;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNC,UAAU;QACRD,MAAM;QACNhB,SAAS;UACPU,SAAS,KAAKV,QAAQU;QACxB;MACF;IACF;EACF;AACF;AAxCaZ;AA6CN,SAASoB,gBAAgBlB,SAA0B;AACxD,SAAO,IAAIF,gBAAgBE,OAAAA;AAC7B;AAFgBkB;AAIT,IAAMC,cAAN,MAAMA;EACXpB,YAAoBC,SAAsB;mBAAtBA;EAAuB;EAE3C,IAAIC,QAAQ;AACV,UAAMmB,gBAAgBC,iBAAAA,QAAUC,SAAS,KAAKtB,QAAQuB,MAAM;MAC1DC,4BAA4B;IAC9B,CAAA;AAEA,WAAO;MACLjC,MAAM;MACNW,OAAO;MACPC,QAAQ;MACRX,MAAM;MACNH;MACAe,cAAcC,oCAAuBC;MACrCC,YAAY;QACV;UACEC,OAAO;UACPC,MAAM,KAAKT,QAAQuB;QACrB;QACA;UACEf,OAAO;UACPC,MAAMW;QACR;;IAEJ;EACF;EAEAT,YACEC,eACAC,KACM;EAAC;EAET,IAAIC,iBAAiB;AACnB,WAAO;EACT;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNC,UAAU;QACRD,MAAM;QACNhB,SAAS;UACPuB,MAAM,KAAKvB,QAAQuB;QACrB;MACF;IACF;EACF;AACF;AAhDaJ;AAqDN,SAASM,YAAYzB,SAAsB;AAChD,SAAO,IAAImB,YAAYnB,OAAAA;AACzB;AAFgByB;AAUT,IAAMC,kBAAN,MAAMA;EAKX3B,YACU4B,QACA3B,SACR;kBAFQ2B;mBACA3B;EACP;EAEH,IAAIV,KAAK;AACP,WAAO,KAAKU,QAAQV;EACtB;EAEA,IAAIW,QAAQ;AACV,WAAO;MACLV,MAAM;MACNW,OAAO;MACPC,QAAQ;MACRX,MAAM;MACNH;MACAe,cAAcC,oCAAuBC;IACvC;EACF;EAEA,MAAMsB,SAASC,KAAaC,UAA4B;AACtD,WAAO,KAAKH,OAAOI,iBAAiB,KAAKzC,IAAIuC,KAAKC,QAAAA;EACpD;EAEA,MAAME,WAAWH,KAAa;AAC5B,WAAO,KAAKF,OAAOM,mBAAmB,KAAK3C,IAAIuC,GAAAA;EACjD;EAEAlB,YACEC,eACAC,KACM;AACND,kBAAcsB,sBAAsB,KAAKlC,QAAQV,IAAIuB,GAAAA;EACvD;EAEA,IAAIC,iBAAiB;AACnB,WAAO;EACT;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACN1B,IAAI,KAAKU,QAAQV;IACnB;EACF;AACF;AAlDaoC;;;AC5Ib,IAAAS,eAQO;AAMA,SAASC,8BAA8BC,cAAyC;AACrF,SAAO,IAAIC,8BAA8B;IAAED;EAAa,CAAA;AAC1D;AAFgBD;AAIT,SAASG,sCAAsCF,cAAyC;AAC7F,SAAO,IAAIG,sCAAsC;IAAEH;EAAa,CAAA;AAClE;AAFgBE;AAWT,IAAMD,gCAAN,MAAMA;EAGXG,YAAoBC,SAA+C;mBAA/CA;EAAgD;EAEpE,IAAIC,QAAQ;AACV,WAAO;MACLC,MAAMC;MACNC,OAAO;MACPC,QAAQ;MACRC,MAAM;MACNC,cAAcC,wDAA2CC;MACzDC,YAAY;QACV;UACEC,OAAO;UACPC,MAAM,KAAKZ,QAAQL,aAAakB,IAAI,CAACC,MAAMA,EAAEC,EAAE,EAAEC,KAAK,IAAA;QACxD;;IAEJ;EACF;EAEAC,YACEC,eACAC,KACM;EAAC;EAET,IAAIC,iBAAiB;AACnB,WAAO;EACT;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNlB,OAAO,KAAKH,MAAMG;MAClBmB,MAAM;QACJtB,OAAO,KAAKA,MAAMC;QAClBG,QAAQ;QACRmB,SAAS;UACPC,QAAQ;YACNV,IAAI,KAAKf,QAAQL,aAAakB,IAAI,CAACC,MAAMA,EAAEC,EAAE;UAC/C;QACF;MACF;IACF;EACF;AACF;AA7CanB;AAkDN,IAAME,wCAAN,MAAMA;EAGXC,YAAoBC,SAA+C;mBAA/CA;EAAgD;EAEpE,IAAIC,QAAQ;AACV,WAAO;MACLC,MAAMwB;MACNtB,OAAO;MACPC,QAAQ;MACRC,MAAM;MACNC,cAAcoB,gEAAmDlB;MACjEC,YAAY;QACV;UACEC,OAAO;UACPC,MAAM,KAAKZ,QAAQL,aAAakB,IAAI,CAACC,MAAMA,EAAEC,EAAE,EAAEC,KAAK,IAAA;QACxD;;IAEJ;EACF;EAEAC,YACEC,eACAC,KACM;EAAC;EAET,IAAIC,iBAAiB;AACnB,WAAO;EACT;EAEAC,SAA0B;AACxB,WAAO;MACLC,MAAM;MACNlB,OAAO,KAAKH,MAAMG;MAClBmB,MAAM;QACJtB,OAAO,KAAKA,MAAMC;QAClBG,QAAQ;QACRmB,SAAS;UACPC,QAAQ;YACNV,IAAI,KAAKf,QAAQL,aAAakB,IAAI,CAACC,MAAMA,EAAEC,EAAE;UAC/C;QACF;MACF;IACF;EACF;AACF;AA7CajB;;;Ad9CN,SAAS8B,aACdC,YACGC,gBACW;AACd,SAAO;IACLC,kBAAkB;IAClBF,SAASA,QAAQG;IACjBF;EACF;AACF;AATgBF;","names":["slugifyId","input","replaceSpacesWithDash","toLowerCase","replace","removeNonUrlSafeChars","Job","constructor","client","options","attach","id","slugifyId","enabled","name","trigger","version","integrations","Object","keys","reduce","acc","key","integration","metadata","authSource","usesLocalAuth","logLevel","toJSON","internal","__internal","event","startPosition","preprocessRuns","match","Error","import_core","ApiClient","constructor","options","apiUrl","process","env","TRIGGER_API_URL","Logger","logLevel","registerEndpoint","apiKey","debug","url","name","response","fetch","method","headers","Authorization","body","JSON","stringify","status","json","Error","error","createRun","params","zodfetch","CreateRunResponseBodySchema","runTask","runId","task","ServerTaskSchema","idempotencyKey","completeTask","id","failTask","sendEvent","event","ApiEventLogSchema","updateSource","client","key","source","TriggerSourceSchema","registerTrigger","payload","RegisterSourceEventSchema","registerSchedule","RegisterScheduleResponseBodySchema","unregisterSchedule","z","object","ok","boolean","encodeURIComponent","getAuth","ConnectionAuthSchema","Accept","optional","getEvent","eventId","GetEventSchema","getRun","GetRunSchema","urlWithSearchParams","getRuns","jobSlug","GetRunsSchema","getApiKey","TRIGGER_API_KEY","isValid","match","schema","requestInit","errorMessage","jsonBody","parse","ResumeWithTaskError","constructor","task","RetryWithTaskError","cause","retryAt","CanceledWithTaskError","isTriggerError","err","import_core","createIOWithIntegrations","io","auths","integrations","connections","Object","entries","reduce","acc","connectionKey","integration","auth","client","usesLocalAuth","clientFactory","undefined","ioConnection","runTask","key","callback","options","name","icon","metadata","id","retry","limit","minTimeoutInMs","maxTimeoutInMs","factor","randomize","ioTask","tasks","keys","forEach","taskName","authenticatedTask","params","init","run","onError","Proxy","get","target","prop","receiver","value","Reflect","bind","import_core","IO","constructor","options","_id","id","_apiClient","apiClient","_triggerClient","client","_logger","logger","Logger","logLevel","_cachedTasks","Map","_jobLogger","jobLogger","_jobLogLevel","jobLogLevel","cachedTasks","forEach","task","set","idempotencyKey","_taskStorage","AsyncLocalStorage","_context","context","IOLogger","level","message","data","log","debug","info","warn","error","satisfiesLogLevel","runTask","name","icon","description","params","properties","label","text","style","variant","toLowerCase","noop","wait","key","seconds","delayUntil","Date","now","backgroundFetch","url","requestInit","retry","urlObject","URL","hostname","pathname","operation","method","output","sendEvent","event","updateSource","redact","paths","registerInterval","dynamicSchedule","toString","register","type","unregisterInterval","unregister","registerCron","cron","unregisterCron","registerTrigger","trigger","registration","subtask1","connection","getAuth","source","clientId","io","createIOWithIntegrations","integration","updates","callback","onError","parentId","getStore","taskId","generateIdempotencyKey","flat","cachedTask","get","displayKey","undefined","status","CanceledWithTaskError","Error","ResumeWithTaskError","executeTask","result","SerializableJsonSchema","parse","completedTask","completeTask","outputProperties","isTriggerError","onErrorResult","parsedError","ErrorWithStackSchema","safeParse","RetryWithTaskError","success","retryAt","innerError","calculateRetryAt","attempts","failTask","JSON","stringify","run","try","tryCallback","catchCallback","keyMaterial","keys","map","stableStringify","join","hash","webcrypto","subtle","digest","Buffer","from","obj","sortKeys","Array","isArray","sortedKeys","Object","sort","sortedObj","import_core","_options","EventTrigger","constructor","options","toJSON","type","title","name","event","rule","source","payload","deepMergeFilters","filter","attachToJob","triggerClient","job","preprocessRuns","eventTrigger","icon","examples","parsePayload","rawPayload","schema","parse","registerSourceEvent","name","REGISTER_SOURCE_EVENT","title","source","icon","parsePayload","RegisterSourceEventSchema","parse","_options","TriggerClient","constructor","options","id","ApiClient","Logger","verbose","handleRequest","request","debug","url","headers","Object","fromEntries","entries","method","apiKey","get","authorization","authorized","status","body","message","action","endpointId","ok","error","jobId","job","toJSON","jobs","values","map","sources","dynamicTriggers","trigger","registerSourceJob","dynamicTriggerRegisterSourceJobId","version","dynamicSchedules","json","InitializeTriggerBodySchema","safeParse","success","dynamicTrigger","data","registeredTriggerForParams","params","execution","RunJobBodySchema","results","PreprocessRunBodySchema","abort","properties","HttpSourceRequestHeadersSchema","sourceRequestNeedsBody","sourceRequestInit","undefined","duplex","sourceRequest","Request","key","dynamicId","secret","response","events","attach","enabled","attachToJob","attachDynamicTrigger","Job","EventTrigger","event","filter","dynamicTriggerId","integrations","integration","run","io","ctx","updates","register","updateSource","__internal","attachJobToDynamicTrigger","push","attachSource","s","r","handle","registeredSource","channel","metadata","authSource","client","usesLocalAuth","Array","from","Set","attachDynamicSchedule","registerTrigger","getAuth","sendEvent","registerSchedule","schedule","unregisterSchedule","getEvent","eventId","getRun","runId","getRuns","jobSlug","localApiKey","process","env","TRIGGER_API_KEY","defineJob","context","parsedPayload","payload","runProperties","IO","cachedTasks","tasks","apiClient","logger","jobLogLevel","logLevel","jobLogger","ioLogLocalEnabled","ioWithConnections","createIOWithIntegrations","connections","output","ResumeWithTaskError","task","RetryWithTaskError","cause","retryAt","CanceledWithTaskError","errorWithStack","ErrorWithStackSchema","organization","environment","timestamp","account","handler","authenticatedTask","options","import_core","ExternalSource","constructor","channel","options","handle","source","rawEvent","logger","handler","params","filter","properties","register","registerEvent","io","ctx","result","event","ommited","omit","sourceWithoutChannel","channelWithoutType","updates","key","parts","id","push","integration","join","integrationConfig","metadata","version","ExternalSourceTrigger","toJSON","type","title","rule","name","payload","deepMergeFilters","attachToJob","triggerClient","job","attachSource","slugifyId","preprocessRuns","obj","k","Object","keys","import_core","_client","_options","DynamicTrigger","constructor","client","options","source","attachDynamicTrigger","toJSON","type","id","event","registeredTriggerForParams","params","key","slugifyId","rule","name","payload","deepMergeFilters","filter","channel","events","integration","metadata","authSource","usesLocalAuth","register","registerTrigger","attachToJob","triggerClient","job","attachJobToDynamicTrigger","preprocessRuns","import_core","examples","id","name","icon","payload","ts","currentDate","marker","lastTimestamp","IntervalTrigger","constructor","options","event","title","source","parsePayload","ScheduledPayloadSchema","parse","properties","label","text","seconds","attachToJob","triggerClient","job","preprocessRuns","toJSON","type","schedule","intervalTrigger","CronTrigger","humanReadable","cronstrue","toString","cron","throwExceptionOnParseError","cronTrigger","DynamicSchedule","client","register","key","metadata","registerSchedule","unregister","unregisterSchedule","attachDynamicSchedule","import_core","missingConnectionNotification","integrations","MissingConnectionNotification","missingConnectionResolvedNotification","MissingConnectionResolvedNotification","constructor","options","event","name","MISSING_CONNECTION_NOTIFICATION","title","source","icon","parsePayload","MissingConnectionNotificationPayloadSchema","parse","properties","label","text","map","i","id","join","attachToJob","triggerClient","job","preprocessRuns","toJSON","type","rule","payload","client","MISSING_CONNECTION_RESOLVED_NOTIFICATION","MissingConnectionResolvedNotificationPayloadSchema","redactString","strings","interpolations","__redactedString","raw"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/job.ts","../src/triggerClient.ts","../src/apiClient.ts","../src/errors.ts","../src/io.ts","../src/ioWithIntegrations.ts","../src/retry.ts","../src/triggers/eventTrigger.ts","../src/integrations.ts","../src/triggers/externalSource.ts","../src/triggers/dynamic.ts","../src/triggers/scheduled.ts","../src/triggers/notifications.ts"],"sourcesContent":["export * from \"./job\";\nexport * from \"./triggerClient\";\nexport * from \"./integrations\";\nexport * from \"./triggers/eventTrigger\";\nexport * from \"./triggers/externalSource\";\nexport * from \"./triggers/dynamic\";\nexport * from \"./triggers/scheduled\";\nexport * from \"./triggers/notifications\";\nexport * from \"./io\";\nexport * from \"./types\";\n\nimport { ServerTask } from \"@trigger.dev/core\";\nimport { RedactString } from \"./types\";\nexport { isTriggerError } from \"./errors\";\n\nexport type { NormalizedRequest, EventFilter } from \"@trigger.dev/core\";\n\nexport type Task = ServerTask;\n\nimport { ApiEventLog } from \"@trigger.dev/core\";\nexport type SentEvent = ApiEventLog;\n\n/*\n * This function is used to create a redacted string that can be used in the headers of a fetch request.\n * It is used to prevent the string from being logged in trigger.dev.\n * You can use it like this:\n *\n * await io.backgroundFetch<SomeResponseType>(\"https://example.com\", {\n * headers: {\n * Authorization: redactString`Bearer ${ACCESS_TOKEN}`,\n * },\n * })\n */\nexport function redactString(\n strings: TemplateStringsArray,\n ...interpolations: string[]\n): RedactString {\n return {\n __redactedString: true,\n strings: strings.raw as string[],\n interpolations,\n };\n}\n","export function slugifyId(input: string): string {\n // Replace any number of spaces with a single dash\n const replaceSpacesWithDash = input.toLowerCase().replace(/\\s+/g, \"-\");\n\n // Remove any non-URL-safe characters\n const removeNonUrlSafeChars = replaceSpacesWithDash.replace(/[^a-zA-Z0-9-._~]/g, \"\");\n\n return removeNonUrlSafeChars;\n}\n","import { IntegrationConfig, JobMetadata, LogLevel, QueueOptions } from \"@trigger.dev/core\";\nimport { IOWithIntegrations, IntegrationClient, TriggerIntegration } from \"./integrations\";\nimport { TriggerClient } from \"./triggerClient\";\nimport type { EventSpecification, Trigger, TriggerContext, TriggerEventType } from \"./types\";\nimport { slugifyId } from \"./utils\";\n\nexport type JobOptions<\n TTrigger extends Trigger<EventSpecification<any>>,\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>> = {},\n> = {\n /** The `id` property is used to uniquely identify the Job. Only change this if you want to create a new Job. */\n id: string;\n /** The `name` of the Job that you want to appear in the dashboard and logs. You can change this without creating a new Job. */\n name: string;\n /** The `version` property is used to version your Job. A new version will be created if you change this property. We recommend using [semantic versioning](https://www.baeldung.com/cs/semantic-versioning), e.g. `1.0.3`. */\n version: string;\n /** The `trigger` property is used to define when the Job should run. There are currently the following Trigger types:\n - [cronTrigger](https://trigger.dev/docs/sdk/crontrigger)\n - [intervalTrigger](https://trigger.dev/docs/sdk/intervaltrigger)\n - [eventTrigger](https://trigger.dev/docs/sdk/eventtrigger)\n - [DynamicTrigger](https://trigger.dev/docs/sdk/dynamictrigger)\n - [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule)\n - integration Triggers, like webhooks. See the [integrations](https://trigger.dev/docs/integrations) page for more information. */\n trigger: TTrigger;\n /** The `logLevel` property is an optional property that specifies the level of\n logging for the Job. The level is inherited from the client if you omit this property. */\n logLevel?: LogLevel;\n /** Imports the specified integrations into the Job. The integrations will be available on the `io` object in the `run()` function with the same name as the key. For example:\n ```ts\n client.defineJob({\n //... other options\n integrations: {\n slack,\n gh: github,\n },\n run: async (payload, io, ctx) => {\n //slack is available on io.slack\n io.slack.postMessage(...);\n //github is available on io.gh\n io.gh.addIssueLabels(...);\n }\n });\n ``` */\n integrations?: TIntegrations;\n /** @deprecated This property is deprecated and no longer effects the execution of the Job\n * */\n queue?: QueueOptions | string;\n /** The `enabled` property is used to enable or disable the Job. If you disable a Job, it will not run. */\n enabled?: boolean;\n /** This function gets called automatically when a Run is Triggered.\n * This is where you put the code you want to run for a Job. You can use normal code in here and you can also use Tasks. You can return a value from this function and it will be sent back to the Trigger API.\n * @param payload The payload of the event\n * @param io An object that contains the integrations that you specified in the `integrations` property and other useful functions like delays and running Tasks.\n * @param context An object that contains information about the Organization, Job, Run and more.\n */\n run: (\n payload: TriggerEventType<TTrigger>,\n io: IOWithIntegrations<TIntegrations>,\n context: TriggerContext\n ) => Promise<any>;\n};\n\nexport type JobPayload<TJob> = TJob extends Job<Trigger<EventSpecification<infer TEvent>>, any>\n ? TEvent\n : never;\n\nexport type JobIO<TJob> = TJob extends Job<any, infer TIntegrations>\n ? IOWithIntegrations<TIntegrations>\n : never;\n\n/** A [Job](https://trigger.dev/docs/documentation/concepts/jobs) is used to define the [Trigger](https://trigger.dev/docs/documentation/concepts/triggers), metadata, and what happens when it runs. */\nexport class Job<\n TTrigger extends Trigger<EventSpecification<any>>,\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>> = {},\n> {\n readonly options: JobOptions<TTrigger, TIntegrations>;\n\n client: TriggerClient;\n\n constructor(\n /** An instance of [TriggerClient](/sdk/triggerclient) that is used to send events\n to the Trigger API. */\n client: TriggerClient,\n options: JobOptions<TTrigger, TIntegrations>\n ) {\n this.client = client;\n this.options = options;\n this.#validate();\n\n client.attach(this);\n }\n\n get id() {\n return slugifyId(this.options.id);\n }\n\n get enabled() {\n return typeof this.options.enabled === \"boolean\" ? this.options.enabled : true;\n }\n\n get name() {\n return this.options.name;\n }\n\n get trigger() {\n return this.options.trigger;\n }\n\n get version() {\n return this.options.version;\n }\n\n get integrations(): Record<string, IntegrationConfig> {\n return Object.keys(this.options.integrations ?? {}).reduce(\n (acc: Record<string, IntegrationConfig>, key) => {\n const integration = this.options.integrations![key];\n\n acc[key] = {\n id: integration.id,\n metadata: integration.metadata,\n authSource: integration.client.usesLocalAuth ? \"LOCAL\" : \"HOSTED\",\n };\n\n return acc;\n },\n {}\n );\n }\n\n get logLevel() {\n return this.options.logLevel;\n }\n\n toJSON(): JobMetadata {\n // @ts-ignore\n const internal = this.options.__internal as JobMetadata[\"internal\"];\n\n return {\n id: this.id,\n name: this.name,\n version: this.version,\n event: this.trigger.event,\n trigger: this.trigger.toJSON(),\n integrations: this.integrations,\n startPosition: \"latest\", // this is deprecated, leaving this for now to make sure newer clients work with older servers\n enabled: this.enabled,\n preprocessRuns: this.trigger.preprocessRuns,\n internal,\n };\n }\n\n // Make sure the id is valid (must only contain alphanumeric characters and dashes)\n // Make sure the version is valid (must be a valid semver version)\n #validate() {\n if (!this.version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/)) {\n throw new Error(\n `Invalid job version: \"${this.version}\". Job versions must be valid semver versions.`\n );\n }\n }\n}\n","import {\n ErrorWithStackSchema,\n GetRunOptionsWithTaskDetails,\n GetRunsOptions,\n HandleTriggerSource,\n HttpSourceRequestHeadersSchema,\n IndexEndpointResponse,\n InitializeTriggerBodySchema,\n LogLevel,\n Logger,\n NormalizedResponse,\n PreprocessRunBody,\n PreprocessRunBodySchema,\n Prettify,\n REGISTER_SOURCE_EVENT,\n RegisterSourceEvent,\n RegisterSourceEventSchema,\n RegisterTriggerBody,\n RunJobBody,\n RunJobBodySchema,\n RunJobResponse,\n ScheduleMetadata,\n SendEvent,\n SendEventOptions,\n SourceMetadata,\n} from \"@trigger.dev/core\";\nimport { ApiClient } from \"./apiClient\";\nimport { CanceledWithTaskError, ResumeWithTaskError, RetryWithTaskError } from \"./errors\";\nimport { IntegrationClient, TriggerIntegration } from \"./integrations\";\nimport { IO } from \"./io\";\nimport { createIOWithIntegrations } from \"./ioWithIntegrations\";\nimport { Job, JobOptions } from \"./job\";\nimport { DynamicTrigger } from \"./triggers/dynamic\";\nimport { EventTrigger } from \"./triggers/eventTrigger\";\nimport { ExternalSource } from \"./triggers/externalSource\";\nimport type {\n EventSpecification,\n Trigger,\n TriggerContext,\n TriggerPreprocessContext,\n} from \"./types\";\n\nconst registerSourceEvent: EventSpecification<RegisterSourceEvent> = {\n name: REGISTER_SOURCE_EVENT,\n title: \"Register Source\",\n source: \"internal\",\n icon: \"register-source\",\n parsePayload: RegisterSourceEventSchema.parse,\n};\n\nexport type TriggerClientOptions = {\n /** The `id` property is used to uniquely identify the client.\n */\n id: string;\n /** The `apiKey` property is the API Key for your Trigger.dev environment. We\n recommend using an environment variable to store your API Key. */\n apiKey?: string;\n /** The `apiUrl` property is an optional property that specifies the API URL. You\n only need to specify this if you are not using Trigger.dev Cloud and are\n running your own Trigger.dev instance. */\n apiUrl?: string;\n /** The `logLevel` property is an optional property that specifies the level of\n logging for the TriggerClient. The level is inherited by all Jobs that use this Client, unless they also specify a `logLevel`. */\n logLevel?: LogLevel;\n /** Very verbose log messages, defaults to false. */\n verbose?: boolean;\n /** Default is unset and off. If set to true it will log to the server's console as well as the Trigger.dev platform */\n ioLogLocalEnabled?: boolean;\n};\n\n/** A [TriggerClient](https://trigger.dev/docs/documentation/concepts/client-adaptors) is used to connect to a specific [Project](https://trigger.dev/docs/documentation/concepts/projects) by using an [API Key](https://trigger.dev/docs/documentation/concepts/environments-apikeys). */\nexport class TriggerClient {\n #options: TriggerClientOptions;\n #registeredJobs: Record<string, Job<Trigger<EventSpecification<any>>, any>> = {};\n #registeredSources: Record<string, SourceMetadata> = {};\n #registeredHttpSourceHandlers: Record<\n string,\n (\n source: HandleTriggerSource,\n request: Request\n ) => Promise<{\n events: Array<SendEvent>;\n response?: NormalizedResponse;\n } | void>\n > = {};\n #registeredDynamicTriggers: Record<\n string,\n DynamicTrigger<EventSpecification<any>, ExternalSource<any, any, any>>\n > = {};\n #jobMetadataByDynamicTriggers: Record<string, Array<{ id: string; version: string }>> = {};\n #registeredSchedules: Record<string, Array<{ id: string; version: string }>> = {};\n\n #client: ApiClient;\n #internalLogger: Logger;\n id: string;\n\n constructor(options: Prettify<TriggerClientOptions>) {\n this.id = options.id;\n this.#options = options;\n this.#client = new ApiClient(this.#options);\n this.#internalLogger = new Logger(\"trigger.dev\", this.#options.verbose ? \"debug\" : \"log\");\n }\n\n async handleRequest(request: Request): Promise<NormalizedResponse> {\n this.#internalLogger.debug(\"handling request\", {\n url: request.url,\n headers: Object.fromEntries(request.headers.entries()),\n method: request.method,\n });\n\n const apiKey = request.headers.get(\"x-trigger-api-key\");\n\n const authorization = this.authorized(apiKey);\n\n switch (authorization) {\n case \"authorized\": {\n break;\n }\n case \"missing-client\": {\n return {\n status: 401,\n body: {\n message: \"Unauthorized: client missing apiKey\",\n },\n };\n }\n case \"missing-header\": {\n return {\n status: 401,\n body: {\n message: \"Unauthorized: missing x-trigger-api-key header\",\n },\n };\n }\n case \"unauthorized\": {\n return {\n status: 401,\n body: {\n message: `Forbidden: client apiKey mismatch: Make sure you are using the correct API Key for your environment`,\n },\n };\n }\n }\n\n if (request.method !== \"POST\") {\n return {\n status: 405,\n body: {\n message: \"Method not allowed (only POST is allowed)\",\n },\n };\n }\n\n const action = request.headers.get(\"x-trigger-action\");\n\n if (!action) {\n return {\n status: 400,\n body: {\n message: \"Missing x-trigger-action header\",\n },\n };\n }\n\n switch (action) {\n case \"PING\": {\n const endpointId = request.headers.get(\"x-trigger-endpoint-id\");\n\n if (!endpointId) {\n return {\n status: 200,\n body: {\n ok: false,\n error: \"Missing endpoint ID\",\n },\n };\n }\n\n if (this.id !== endpointId) {\n return {\n status: 200,\n body: {\n ok: false,\n error: `Endpoint ID mismatch error. Expected ${this.id}, got ${endpointId}`,\n },\n };\n }\n\n return {\n status: 200,\n body: {\n ok: true,\n },\n };\n }\n case \"INDEX_ENDPOINT\": {\n // if the x-trigger-job-id header is set, we return the job with that id\n const jobId = request.headers.get(\"x-trigger-job-id\");\n\n if (jobId) {\n const job = this.#registeredJobs[jobId];\n\n if (!job) {\n return {\n status: 404,\n body: {\n message: \"Job not found\",\n },\n };\n }\n\n return {\n status: 200,\n body: job.toJSON(),\n };\n }\n\n const body: IndexEndpointResponse = {\n jobs: Object.values(this.#registeredJobs).map((job) => job.toJSON()),\n sources: Object.values(this.#registeredSources),\n dynamicTriggers: Object.values(this.#registeredDynamicTriggers).map((trigger) => ({\n id: trigger.id,\n jobs: this.#jobMetadataByDynamicTriggers[trigger.id] ?? [],\n registerSourceJob: {\n id: dynamicTriggerRegisterSourceJobId(trigger.id),\n version: trigger.source.version,\n },\n })),\n dynamicSchedules: Object.entries(this.#registeredSchedules).map(([id, jobs]) => ({\n id,\n jobs,\n })),\n };\n\n // if the x-trigger-job-id header is not set, we return all jobs\n return {\n status: 200,\n body,\n };\n }\n case \"INITIALIZE_TRIGGER\": {\n const json = await request.json();\n const body = InitializeTriggerBodySchema.safeParse(json);\n\n if (!body.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid trigger body\",\n },\n };\n }\n\n const dynamicTrigger = this.#registeredDynamicTriggers[body.data.id];\n\n if (!dynamicTrigger) {\n return {\n status: 404,\n body: {\n message: \"Dynamic trigger not found\",\n },\n };\n }\n\n return {\n status: 200,\n body: dynamicTrigger.registeredTriggerForParams(body.data.params),\n };\n }\n case \"EXECUTE_JOB\": {\n const json = await request.json();\n const execution = RunJobBodySchema.safeParse(json);\n\n if (!execution.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid execution\",\n },\n };\n }\n\n const job = this.#registeredJobs[execution.data.job.id];\n\n if (!job) {\n return {\n status: 404,\n body: {\n message: \"Job not found\",\n },\n };\n }\n\n const results = await this.#executeJob(execution.data, job);\n\n return {\n status: 200,\n body: results,\n };\n }\n case \"PREPROCESS_RUN\": {\n const json = await request.json();\n const body = PreprocessRunBodySchema.safeParse(json);\n\n if (!body.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid body\",\n },\n };\n }\n\n const job = this.#registeredJobs[body.data.job.id];\n\n if (!job) {\n return {\n status: 404,\n body: {\n message: \"Job not found\",\n },\n };\n }\n\n const results = await this.#preprocessRun(body.data, job);\n\n return {\n status: 200,\n body: {\n abort: results.abort,\n properties: results.properties,\n },\n };\n }\n case \"DELIVER_HTTP_SOURCE_REQUEST\": {\n const headers = HttpSourceRequestHeadersSchema.safeParse(\n Object.fromEntries(request.headers.entries())\n );\n\n if (!headers.success) {\n return {\n status: 400,\n body: {\n message: \"Invalid headers\",\n },\n };\n }\n\n const sourceRequestNeedsBody = headers.data[\"x-ts-http-method\"] !== \"GET\";\n\n const sourceRequestInit: RequestInit = {\n method: headers.data[\"x-ts-http-method\"],\n headers: headers.data[\"x-ts-http-headers\"],\n body: sourceRequestNeedsBody ? request.body : undefined,\n };\n\n if (sourceRequestNeedsBody) {\n try {\n // @ts-ignore\n sourceRequestInit.duplex = \"half\";\n } catch (error) {\n // ignore\n }\n }\n\n const sourceRequest = new Request(headers.data[\"x-ts-http-url\"], sourceRequestInit);\n\n const key = headers.data[\"x-ts-key\"];\n const dynamicId = headers.data[\"x-ts-dynamic-id\"];\n const secret = headers.data[\"x-ts-secret\"];\n const params = headers.data[\"x-ts-params\"];\n const data = headers.data[\"x-ts-data\"];\n\n const source = {\n key,\n dynamicId,\n secret,\n params,\n data,\n };\n\n const { response, events } = await this.#handleHttpSourceRequest(source, sourceRequest);\n\n return {\n status: 200,\n body: {\n events,\n response,\n },\n };\n }\n case \"VALIDATE\": {\n return {\n status: 200,\n body: {\n ok: true,\n endpointId: this.id,\n },\n };\n }\n }\n\n return {\n status: 405,\n body: {\n message: \"Method not allowed\",\n },\n };\n }\n\n attach(job: Job<Trigger<any>, any>): void {\n this.#registeredJobs[job.id] = job;\n\n job.trigger.attachToJob(this, job);\n }\n\n attachDynamicTrigger(trigger: DynamicTrigger<any, any>): void {\n this.#registeredDynamicTriggers[trigger.id] = trigger;\n\n new Job(this, {\n id: dynamicTriggerRegisterSourceJobId(trigger.id),\n name: `Register dynamic trigger ${trigger.id}`,\n version: trigger.source.version,\n trigger: new EventTrigger({\n event: registerSourceEvent,\n filter: { dynamicTriggerId: [trigger.id] },\n }),\n integrations: {\n integration: trigger.source.integration,\n },\n run: async (event, io, ctx) => {\n const updates = await trigger.source.register(event.source.params, event, io, ctx);\n\n if (!updates) {\n // TODO: do something here?\n return;\n }\n\n return await io.updateSource(\"update-source\", {\n key: event.source.key,\n ...updates,\n });\n },\n // @ts-ignore\n __internal: true,\n });\n }\n\n attachJobToDynamicTrigger(job: Job<Trigger<any>, any>, trigger: DynamicTrigger<any, any>): void {\n const jobs = this.#jobMetadataByDynamicTriggers[trigger.id] ?? [];\n\n jobs.push({ id: job.id, version: job.version });\n\n this.#jobMetadataByDynamicTriggers[trigger.id] = jobs;\n }\n\n attachSource(options: {\n key: string;\n source: ExternalSource<any, any>;\n event: EventSpecification<any>;\n params: any;\n }): void {\n this.#registeredHttpSourceHandlers[options.key] = async (s, r) => {\n return await options.source.handle(s, r, this.#internalLogger);\n };\n\n let registeredSource = this.#registeredSources[options.key];\n\n if (!registeredSource) {\n registeredSource = {\n channel: options.source.channel,\n key: options.key,\n params: options.params,\n events: [],\n integration: {\n id: options.source.integration.id,\n metadata: options.source.integration.metadata,\n authSource: options.source.integration.client.usesLocalAuth ? \"LOCAL\" : \"HOSTED\",\n },\n registerSourceJob: {\n id: options.key,\n version: options.source.version,\n },\n };\n }\n\n registeredSource.events = Array.from(\n new Set([\n ...registeredSource.events,\n ...(typeof options.event.name === \"string\" ? [options.event.name] : options.event.name),\n ])\n );\n\n this.#registeredSources[options.key] = registeredSource;\n\n new Job(this, {\n id: options.key,\n name: options.key,\n version: options.source.version,\n trigger: new EventTrigger({\n event: registerSourceEvent,\n filter: { source: { key: [options.key] } },\n }),\n integrations: {\n integration: options.source.integration,\n },\n run: async (event, io, ctx) => {\n const updates = await options.source.register(options.params, event, io, ctx);\n\n if (!updates) {\n // TODO: do something here?\n return;\n }\n\n return await io.updateSource(\"update-source\", {\n key: options.key,\n ...updates,\n });\n },\n // @ts-ignore\n __internal: true,\n });\n }\n\n attachDynamicSchedule(key: string, job: Job<Trigger<any>, any>): void {\n const jobs = this.#registeredSchedules[key] ?? [];\n\n jobs.push({ id: job.id, version: job.version });\n\n this.#registeredSchedules[key] = jobs;\n }\n\n async registerTrigger(id: string, key: string, options: RegisterTriggerBody) {\n return this.#client.registerTrigger(this.id, id, key, options);\n }\n\n async getAuth(id: string) {\n return this.#client.getAuth(this.id, id);\n }\n\n /** You can call this function from anywhere in your code to send an event. The other way to send an event is by using [`io.sendEvent()`](https://trigger.dev/docs/sdk/io/sendevent) from inside a `run()` function.\n * @param event The event to send.\n * @param options Options for sending the event.\n * @returns A promise that resolves to the event details\n */\n async sendEvent(event: SendEvent, options?: SendEventOptions) {\n return this.#client.sendEvent(event, options);\n }\n\n async cancelEvent(eventId: string) {\n return this.#client.cancelEvent(eventId);\n }\n\n async registerSchedule(id: string, key: string, schedule: ScheduleMetadata) {\n return this.#client.registerSchedule(this.id, id, key, schedule);\n }\n\n async unregisterSchedule(id: string, key: string) {\n return this.#client.unregisterSchedule(this.id, id, key);\n }\n\n async getEvent(eventId: string) {\n return this.#client.getEvent(eventId);\n }\n\n async getRun(runId: string, options?: GetRunOptionsWithTaskDetails) {\n return this.#client.getRun(runId, options);\n }\n\n async getRuns(jobSlug: string, options?: GetRunsOptions) {\n return this.#client.getRuns(jobSlug, options);\n }\n\n authorized(\n apiKey?: string | null\n ): \"authorized\" | \"unauthorized\" | \"missing-client\" | \"missing-header\" {\n if (typeof apiKey !== \"string\") {\n return \"missing-header\";\n }\n\n const localApiKey = this.#options.apiKey ?? process.env.TRIGGER_API_KEY;\n\n if (!localApiKey) {\n return \"missing-client\";\n }\n\n return apiKey === localApiKey ? \"authorized\" : \"unauthorized\";\n }\n\n apiKey() {\n return this.#options.apiKey ?? process.env.TRIGGER_API_KEY;\n }\n\n async #preprocessRun(body: PreprocessRunBody, job: Job<Trigger<EventSpecification<any>>, any>) {\n const context = this.#createPreprocessRunContext(body);\n\n const parsedPayload = job.trigger.event.parsePayload(body.event.payload ?? {});\n\n const properties = job.trigger.event.runProperties?.(parsedPayload) ?? [];\n\n return {\n abort: false,\n properties,\n };\n }\n\n async #executeJob(body: RunJobBody, job: Job<Trigger<any>, any>): Promise<RunJobResponse> {\n this.#internalLogger.debug(\"executing job\", {\n execution: body,\n job: job.toJSON(),\n });\n\n const context = this.#createRunContext(body);\n\n const io = new IO({\n id: body.run.id,\n cachedTasks: body.tasks,\n apiClient: this.#client,\n logger: this.#internalLogger,\n client: this,\n context,\n jobLogLevel: job.logLevel ?? this.#options.logLevel ?? \"info\",\n jobLogger: this.#options.ioLogLocalEnabled\n ? new Logger(job.id, job.logLevel ?? this.#options.logLevel ?? \"info\")\n : undefined,\n });\n\n const ioWithConnections = createIOWithIntegrations(\n io,\n body.connections,\n job.options.integrations\n );\n\n try {\n const output = await job.options.run(\n job.trigger.event.parsePayload(body.event.payload ?? {}),\n ioWithConnections,\n context\n );\n\n return { status: \"SUCCESS\", output };\n } catch (error) {\n if (error instanceof ResumeWithTaskError) {\n return { status: \"RESUME_WITH_TASK\", task: error.task };\n }\n\n if (error instanceof RetryWithTaskError) {\n return {\n status: \"RETRY_WITH_TASK\",\n task: error.task,\n error: error.cause,\n retryAt: error.retryAt,\n };\n }\n\n if (error instanceof CanceledWithTaskError) {\n return {\n status: \"CANCELED\",\n task: error.task,\n };\n }\n\n if (error instanceof RetryWithTaskError) {\n const errorWithStack = ErrorWithStackSchema.safeParse(error.cause);\n\n if (errorWithStack.success) {\n return {\n status: \"ERROR\",\n error: errorWithStack.data,\n task: error.task,\n };\n }\n\n return {\n status: \"ERROR\",\n error: { message: \"Unknown error\" },\n task: error.task,\n };\n }\n\n const errorWithStack = ErrorWithStackSchema.safeParse(error);\n\n if (errorWithStack.success) {\n return { status: \"ERROR\", error: errorWithStack.data };\n }\n\n return {\n status: \"ERROR\",\n error: { message: \"Unknown error\" },\n };\n }\n }\n\n #createRunContext(execution: RunJobBody): TriggerContext {\n const { event, organization, environment, job, run, source } = execution;\n\n return {\n event: {\n id: event.id,\n name: event.name,\n context: event.context,\n timestamp: event.timestamp,\n },\n organization,\n environment,\n job,\n run,\n account: execution.account,\n source,\n };\n }\n\n #createPreprocessRunContext(body: PreprocessRunBody): TriggerPreprocessContext {\n const { event, organization, environment, job, run, account } = body;\n\n return {\n event: {\n id: event.id,\n name: event.name,\n context: event.context,\n timestamp: event.timestamp,\n },\n organization,\n environment,\n job,\n run,\n account,\n };\n }\n\n async #handleHttpSourceRequest(\n source: {\n key: string;\n dynamicId?: string;\n secret: string;\n data: any;\n params: any;\n },\n sourceRequest: Request\n ): Promise<{ response: NormalizedResponse; events: SendEvent[] }> {\n this.#internalLogger.debug(\"Handling HTTP source request\", {\n source,\n });\n\n if (source.dynamicId) {\n const dynamicTrigger = this.#registeredDynamicTriggers[source.dynamicId];\n\n if (!dynamicTrigger) {\n this.#internalLogger.debug(\"No dynamic trigger registered for HTTP source\", {\n source,\n });\n\n return {\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n events: [],\n };\n }\n\n const results = await dynamicTrigger.source.handle(\n source,\n sourceRequest,\n this.#internalLogger\n );\n\n if (!results) {\n return {\n events: [],\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n return {\n events: results.events,\n response: results.response ?? {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n const handler = this.#registeredHttpSourceHandlers[source.key];\n\n if (!handler) {\n this.#internalLogger.debug(\"No handler registered for HTTP source\", {\n source,\n });\n\n return {\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n events: [],\n };\n }\n\n const results = await handler(source, sourceRequest);\n\n if (!results) {\n return {\n events: [],\n response: {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n return {\n events: results.events,\n response: results.response ?? {\n status: 200,\n body: {\n ok: true,\n },\n },\n };\n }\n\n defineJob<\n TTrigger extends Trigger<EventSpecification<any>>,\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>> = {},\n >(options: JobOptions<TTrigger, TIntegrations>) {\n return new Job<TTrigger, TIntegrations>(this, options);\n }\n}\n\nfunction dynamicTriggerRegisterSourceJobId(id: string) {\n return `register-dynamic-trigger-${id}`;\n}\n","import {\n ApiEventLog,\n ApiEventLogSchema,\n CompleteTaskBodyInput,\n ConnectionAuthSchema,\n FailTaskBodyInput,\n GetEventSchema,\n GetRunOptionsWithTaskDetails,\n GetRunSchema,\n GetRunsOptions,\n GetRunsSchema,\n LogLevel,\n Logger,\n RegisterScheduleResponseBodySchema,\n RegisterSourceEvent,\n RegisterSourceEventSchema,\n RegisterTriggerBody,\n RunTaskBodyInput,\n ScheduleMetadata,\n SendEvent,\n SendEventOptions,\n ServerTaskSchema,\n TriggerSource,\n TriggerSourceSchema,\n UpdateTriggerSourceBody,\n urlWithSearchParams,\n} from \"@trigger.dev/core\";\n\nimport fetch, { type RequestInit } from \"node-fetch\";\nimport { z } from \"zod\";\n\nexport type ApiClientOptions = {\n apiKey?: string;\n apiUrl?: string;\n logLevel?: LogLevel;\n};\n\nexport type EndpointRecord = {\n id: string;\n name: string;\n url: string;\n};\n\nexport type HttpSourceRecord = {\n id: string;\n key: string;\n managed: boolean;\n url: string;\n status: \"PENDING\" | \"ACTIVE\" | \"INACTIVE\";\n secret?: string;\n data?: any;\n};\n\nexport type RunRecord = {\n id: string;\n jobId: string;\n callbackUrl: string;\n event: ApiEventLog;\n};\n\nexport class ApiClient {\n #apiUrl: string;\n #options: ApiClientOptions;\n #logger: Logger;\n\n constructor(options: ApiClientOptions) {\n this.#options = options;\n\n this.#apiUrl = this.#options.apiUrl ?? process.env.TRIGGER_API_URL ?? \"https://api.trigger.dev\";\n this.#logger = new Logger(\"trigger.dev\", this.#options.logLevel);\n }\n\n async registerEndpoint(options: { url: string; name: string }): Promise<EndpointRecord> {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Registering endpoint\", {\n url: options.url,\n name: options.name,\n });\n\n const response = await fetch(`${this.#apiUrl}/api/v1/endpoints`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n url: options.url,\n name: options.name,\n }),\n });\n\n if (response.status >= 400 && response.status < 500) {\n const body = await response.json();\n\n throw new Error(body.error);\n }\n\n if (response.status !== 200) {\n throw new Error(`Failed to register entry point, got status code ${response.status}`);\n }\n\n return await response.json();\n }\n\n async runTask(runId: string, task: RunTaskBodyInput) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Running Task\", {\n task,\n });\n\n return await zodfetch(ServerTaskSchema, `${this.#apiUrl}/api/v1/runs/${runId}/tasks`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n \"Idempotency-Key\": task.idempotencyKey,\n },\n body: JSON.stringify(task),\n });\n }\n\n async completeTask(runId: string, id: string, task: CompleteTaskBodyInput) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Complete Task\", {\n task,\n });\n\n return await zodfetch(\n ServerTaskSchema,\n `${this.#apiUrl}/api/v1/runs/${runId}/tasks/${id}/complete`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(task),\n }\n );\n }\n\n async failTask(runId: string, id: string, body: FailTaskBodyInput) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Fail Task\", {\n id,\n runId,\n body,\n });\n\n return await zodfetch(\n ServerTaskSchema,\n `${this.#apiUrl}/api/v1/runs/${runId}/tasks/${id}/fail`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n }\n );\n }\n\n async sendEvent(event: SendEvent, options: SendEventOptions = {}) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Sending event\", {\n event,\n });\n\n return await zodfetch(ApiEventLogSchema, `${this.#apiUrl}/api/v1/events`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ event, options }),\n });\n }\n\n async cancelEvent(eventId: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Cancelling event\", {\n eventId,\n });\n\n return await zodfetch(ApiEventLogSchema, `${this.#apiUrl}/api/v1/events/${eventId}/cancel`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n });\n }\n\n async updateSource(\n client: string,\n key: string,\n source: UpdateTriggerSourceBody\n ): Promise<TriggerSource> {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"activating http source\", {\n source,\n });\n\n const response = await zodfetch(\n TriggerSourceSchema,\n `${this.#apiUrl}/api/v1/${client}/sources/${key}`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(source),\n }\n );\n\n return response;\n }\n\n async registerTrigger(\n client: string,\n id: string,\n key: string,\n payload: RegisterTriggerBody\n ): Promise<RegisterSourceEvent> {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"registering trigger\", {\n id,\n payload,\n });\n\n const response = await zodfetch(\n RegisterSourceEventSchema,\n `${this.#apiUrl}/api/v1/${client}/triggers/${id}/registrations/${key}`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n return response;\n }\n\n async registerSchedule(client: string, id: string, key: string, payload: ScheduleMetadata) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"registering schedule\", {\n id,\n payload,\n });\n\n const response = await zodfetch(\n RegisterScheduleResponseBodySchema,\n `${this.#apiUrl}/api/v1/${client}/schedules/${id}/registrations`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ id: key, ...payload }),\n }\n );\n\n return response;\n }\n\n async unregisterSchedule(client: string, id: string, key: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"unregistering schedule\", {\n id,\n });\n\n const response = await zodfetch(\n z.object({ ok: z.boolean() }),\n `${this.#apiUrl}/api/v1/${client}/schedules/${id}/registrations/${encodeURIComponent(key)}`,\n {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n }\n );\n\n return response;\n }\n\n async getAuth(client: string, id: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"getting auth\", {\n id,\n });\n\n const response = await zodfetch(\n ConnectionAuthSchema,\n `${this.#apiUrl}/api/v1/${client}/auth/${id}`,\n {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n },\n {\n optional: true,\n }\n );\n\n return response;\n }\n\n async getEvent(eventId: string) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Getting Event\", {\n eventId,\n });\n\n return await zodfetch(GetEventSchema, `${this.#apiUrl}/api/v1/events/${eventId}`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n });\n }\n\n async getRun(runId: string, options?: GetRunOptionsWithTaskDetails) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Getting Run\", {\n runId,\n });\n\n return await zodfetch(\n GetRunSchema,\n urlWithSearchParams(`${this.#apiUrl}/api/v1/runs/${runId}`, options),\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }\n );\n }\n\n async getRuns(jobSlug: string, options?: GetRunsOptions) {\n const apiKey = await this.#apiKey();\n\n this.#logger.debug(\"Getting Runs\", {\n jobSlug,\n });\n\n return await zodfetch(\n GetRunsSchema,\n urlWithSearchParams(`${this.#apiUrl}/api/v1/jobs/${jobSlug}/runs`, options),\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }\n );\n }\n\n async #apiKey() {\n const apiKey = getApiKey(this.#options.apiKey);\n\n if (apiKey.status === \"invalid\") {\n throw new Error(\"Invalid API key\");\n\n // const chalk = (await import(\"chalk\")).default;\n // const terminalLink = (await import(\"terminal-link\")).default;\n\n // throw new Error(\n // `${chalk.red(\"Trigger.dev error\")}: Invalid API key (\"${chalk.italic(\n // apiKey.apiKey\n // )}\"), please set the TRIGGER_API_KEY environment variable or pass the apiKey option to a valid value. ${terminalLink(\n // \"Get your API key here\",\n // \"https://app.trigger.dev\",\n // {\n // fallback(text, url) {\n // return `${text} 👉 ${url}`;\n // },\n // }\n // )}`\n // );\n } else if (apiKey.status === \"missing\") {\n throw new Error(\"Missing API key\");\n // const chalk = (await import(\"chalk\")).default;\n // const terminalLink = (await import(\"terminal-link\")).default;\n\n // throw new Error(\n // `${chalk.red(\n // \"Trigger.dev error\"\n // )}: Missing an API key, please set the TRIGGER_API_KEY environment variable or pass the apiKey option to the Trigger constructor. ${terminalLink(\n // \"Get your API key here\",\n // \"https://app.trigger.dev\",\n // {\n // fallback(text, url) {\n // return `${text} 👉 ${url}`;\n // },\n // }\n // )}`\n // );\n }\n\n return apiKey.apiKey;\n }\n}\n\nfunction getApiKey(key?: string) {\n const apiKey = key ?? process.env.TRIGGER_API_KEY;\n\n if (!apiKey) {\n return { status: \"missing\" as const };\n }\n\n // Validate the api_key format (should be tr_{env}_XXXXX)\n const isValid = apiKey.match(/^tr_[a-z]+_[a-zA-Z0-9]+$/);\n\n if (!isValid) {\n return { status: \"invalid\" as const, apiKey };\n }\n\n return { status: \"valid\" as const, apiKey };\n}\n\nasync function zodfetch<TResponseBody extends any, TOptional extends boolean = false>(\n schema: z.Schema<TResponseBody>,\n url: string,\n requestInit?: RequestInit,\n options?: {\n errorMessage?: string;\n optional?: TOptional;\n }\n): Promise<TOptional extends true ? TResponseBody | undefined : TResponseBody> {\n const response = await fetch(url, requestInit);\n\n if (\n (!requestInit || requestInit.method === \"GET\") &&\n response.status === 404 &&\n options?.optional\n ) {\n // @ts-ignore\n return;\n }\n\n if (response.status >= 400 && response.status < 500) {\n const body = await response.json();\n\n throw new Error(body.error);\n }\n\n if (response.status !== 200) {\n throw new Error(\n options?.errorMessage ?? `Failed to fetch ${url}, got status code ${response.status}`\n );\n }\n\n const jsonBody = await response.json();\n\n return schema.parse(jsonBody);\n}\n","import { ErrorWithStack, ServerTask } from \"@trigger.dev/core\";\n\nexport class ResumeWithTaskError {\n constructor(public task: ServerTask) {}\n}\n\nexport class RetryWithTaskError {\n constructor(\n public cause: ErrorWithStack,\n public task: ServerTask,\n public retryAt: Date\n ) {}\n}\n\nexport class CanceledWithTaskError {\n constructor(public task: ServerTask) {}\n}\n\n/** Use this function if you're using a `try/catch` block to catch errors.\n * It checks if a thrown error is a special internal error that you should ignore.\n * If this returns `true` then you must rethrow the error: `throw err;`\n * @param err The error to check\n * @returns `true` if the error is a Trigger Error, `false` otherwise.\n */\nexport function isTriggerError(\n err: unknown\n): err is ResumeWithTaskError | RetryWithTaskError | CanceledWithTaskError {\n return (\n err instanceof ResumeWithTaskError ||\n err instanceof RetryWithTaskError ||\n err instanceof CanceledWithTaskError\n );\n}\n","import {\n CachedTask,\n ConnectionAuth,\n CronOptions,\n ErrorWithStackSchema,\n FetchRequestInit,\n FetchRetryOptions,\n IntervalOptions,\n LogLevel,\n Logger,\n RunTaskOptions,\n SendEvent,\n SendEventOptions,\n SerializableJson,\n SerializableJsonSchema,\n ServerTask,\n UpdateTriggerSourceBody,\n} from \"@trigger.dev/core\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { webcrypto } from \"node:crypto\";\nimport { ApiClient } from \"./apiClient\";\nimport {\n CanceledWithTaskError,\n ResumeWithTaskError,\n RetryWithTaskError,\n isTriggerError,\n} from \"./errors\";\nimport { createIOWithIntegrations } from \"./ioWithIntegrations\";\nimport { calculateRetryAt } from \"./retry\";\nimport { TriggerClient } from \"./triggerClient\";\nimport { DynamicTrigger } from \"./triggers/dynamic\";\nimport { ExternalSource, ExternalSourceParams } from \"./triggers/externalSource\";\nimport { DynamicSchedule } from \"./triggers/scheduled\";\nimport { EventSpecification, TaskLogger, TriggerContext } from \"./types\";\n\nexport type IOTask = ServerTask;\n\nexport type IOOptions = {\n id: string;\n apiClient: ApiClient;\n client: TriggerClient;\n context: TriggerContext;\n logger?: Logger;\n logLevel?: LogLevel;\n jobLogger?: Logger;\n jobLogLevel: LogLevel;\n cachedTasks?: Array<CachedTask>;\n};\n\nexport class IO {\n private _id: string;\n private _apiClient: ApiClient;\n private _triggerClient: TriggerClient;\n private _logger: Logger;\n private _jobLogger?: Logger;\n private _jobLogLevel: LogLevel;\n private _cachedTasks: Map<string, CachedTask>;\n private _taskStorage: AsyncLocalStorage<{ taskId: string }>;\n private _context: TriggerContext;\n\n constructor(options: IOOptions) {\n this._id = options.id;\n this._apiClient = options.apiClient;\n this._triggerClient = options.client;\n this._logger = options.logger ?? new Logger(\"trigger.dev\", options.logLevel);\n this._cachedTasks = new Map();\n this._jobLogger = options.jobLogger;\n this._jobLogLevel = options.jobLogLevel;\n\n if (options.cachedTasks) {\n options.cachedTasks.forEach((task) => {\n this._cachedTasks.set(task.idempotencyKey, task);\n });\n }\n\n this._taskStorage = new AsyncLocalStorage();\n this._context = options.context;\n }\n\n /** Used to send log messages to the [Run log](https://trigger.dev/docs/documentation/guides/viewing-runs). */\n get logger() {\n return new IOLogger(async (level, message, data) => {\n let logLevel: LogLevel = \"info\";\n\n switch (level) {\n case \"LOG\": {\n this._jobLogger?.log(message, data);\n logLevel = \"log\";\n break;\n }\n case \"DEBUG\": {\n this._jobLogger?.debug(message, data);\n logLevel = \"debug\";\n break;\n }\n case \"INFO\": {\n this._jobLogger?.info(message, data);\n logLevel = \"info\";\n break;\n }\n case \"WARN\": {\n this._jobLogger?.warn(message, data);\n logLevel = \"warn\";\n break;\n }\n case \"ERROR\": {\n this._jobLogger?.error(message, data);\n logLevel = \"error\";\n break;\n }\n }\n\n if (Logger.satisfiesLogLevel(logLevel, this._jobLogLevel)) {\n await this.runTask(\n [message, level],\n {\n name: \"log\",\n icon: \"log\",\n description: message,\n params: data,\n properties: [{ label: \"Level\", text: level }],\n style: { style: \"minimal\", variant: level.toLowerCase() },\n noop: true,\n },\n async (task) => {}\n );\n }\n });\n }\n\n /** `io.wait()` waits for the specified amount of time before continuing the Job. Delays work even if you're on a serverless platform with timeouts, or if your server goes down. They utilize [resumability](https://trigger.dev/docs/documentation/concepts/resumability) to ensure that the Run can be resumed after the delay.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param seconds The number of seconds to wait. This can be very long, serverless timeouts are not an issue.\n */\n async wait(key: string | any[], seconds: number) {\n return await this.runTask(\n key,\n {\n name: \"wait\",\n icon: \"clock\",\n params: { seconds },\n noop: true,\n delayUntil: new Date(Date.now() + seconds * 1000),\n style: { style: \"minimal\" },\n },\n async (task) => {}\n );\n }\n\n /** `io.backgroundFetch()` fetches data from a URL that can take longer that the serverless timeout. The actual `fetch` request is performed on the Trigger.dev platform, and the response is sent back to you.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param url The URL to fetch from.\n * @param requestInit The options for the request\n * @param retry The options for retrying the request if it fails\n * An object where the key is a status code pattern and the value is a retrying strategy.\n * Supported patterns are:\n * - Specific status codes: 429\n * - Ranges: 500-599\n * - Wildcards: 2xx, 3xx, 4xx, 5xx\n */\n async backgroundFetch<TResponseData>(\n key: string | any[],\n url: string,\n requestInit?: FetchRequestInit,\n retry?: FetchRetryOptions\n ): Promise<TResponseData> {\n const urlObject = new URL(url);\n\n return (await this.runTask(\n key,\n {\n name: `fetch ${urlObject.hostname}${urlObject.pathname}`,\n params: { url, requestInit, retry },\n operation: \"fetch\",\n icon: \"background\",\n noop: false,\n properties: [\n {\n label: \"url\",\n text: url,\n url,\n },\n {\n label: \"method\",\n text: requestInit?.method ?? \"GET\",\n },\n {\n label: \"background\",\n text: \"true\",\n },\n ],\n },\n async (task) => {\n return task.output;\n }\n )) as TResponseData;\n }\n\n /** `io.sendEvent()` allows you to send an event from inside a Job run. The sent even will trigger any Jobs that are listening for that event (based on the name).\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param event The event to send. The event name must match the name of the event that your Jobs are listening for.\n * @param options Options for sending the event.\n */\n async sendEvent(key: string | any[], event: SendEvent, options?: SendEventOptions) {\n return await this.runTask(\n key,\n {\n name: \"sendEvent\",\n params: { event, options },\n properties: [\n {\n label: \"name\",\n text: event.name,\n },\n ...(event?.id ? [{ label: \"ID\", text: event.id }] : []),\n ],\n },\n async (task) => {\n return await this._triggerClient.sendEvent(event, options);\n }\n );\n }\n\n async getEvent(key: string | any[], id: string) {\n return await this.runTask(\n key,\n {\n name: \"getEvent\",\n params: { id },\n properties: [\n {\n label: \"id\",\n text: id,\n },\n ],\n },\n async (task) => {\n return await this._triggerClient.getEvent(id);\n }\n );\n }\n\n /** `io.cancelEvent()` allows you to cancel an event that was previously sent with `io.sendEvent()`. This will prevent any Jobs from running that are listening for that event if the event was sent with a delay\n * @param key\n * @param eventId\n * @returns\n */\n async cancelEvent(key: string | any[], eventId: string) {\n return await this.runTask(\n key,\n {\n name: \"cancelEvent\",\n params: {\n eventId,\n },\n properties: [\n {\n label: \"id\",\n text: eventId,\n },\n ],\n },\n async (task) => {\n return await this._triggerClient.cancelEvent(eventId);\n }\n );\n }\n\n async updateSource(key: string | any[], options: { key: string } & UpdateTriggerSourceBody) {\n return this.runTask(\n key,\n {\n name: \"Update Source\",\n description: \"Update Source\",\n properties: [\n {\n label: \"key\",\n text: options.key,\n },\n ],\n params: options,\n redact: {\n paths: [\"secret\"],\n },\n },\n async (task) => {\n return await this._apiClient.updateSource(this._triggerClient.id, options.key, options);\n }\n );\n }\n\n /** `io.registerInterval()` allows you to register a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that will trigger any jobs it's attached to on a regular interval.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to register a new schedule on.\n * @param id A unique id for the interval. This is used to identify and unregister the interval later.\n * @param options The options for the interval.\n * @returns A promise that has information about the interval.\n */\n async registerInterval(\n key: string | any[],\n dynamicSchedule: DynamicSchedule,\n id: string,\n options: IntervalOptions\n ) {\n return await this.runTask(\n key,\n {\n name: \"register-interval\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n { label: \"seconds\", text: options.seconds.toString() },\n ],\n params: options,\n },\n async (task) => {\n return dynamicSchedule.register(id, {\n type: \"interval\",\n options,\n });\n }\n );\n }\n\n /** `io.unregisterInterval()` allows you to unregister a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that was previously registered with `io.registerInterval()`.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to unregister a schedule on.\n * @param id A unique id for the interval. This is used to identify and unregister the interval later.\n */\n async unregisterInterval(key: string | any[], dynamicSchedule: DynamicSchedule, id: string) {\n return await this.runTask(\n key,\n {\n name: \"unregister-interval\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n ],\n },\n async (task) => {\n return dynamicSchedule.unregister(id);\n }\n );\n }\n\n /** `io.registerCron()` allows you to register a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that will trigger any jobs it's attached to on a regular CRON schedule.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to register a new schedule on.\n * @param id A unique id for the schedule. This is used to identify and unregister the schedule later.\n * @param options The options for the CRON schedule.\n */\n async registerCron(\n key: string | any[],\n dynamicSchedule: DynamicSchedule,\n id: string,\n options: CronOptions\n ) {\n return await this.runTask(\n key,\n {\n name: \"register-cron\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n { label: \"cron\", text: options.cron },\n ],\n params: options,\n },\n async (task) => {\n return dynamicSchedule.register(id, {\n type: \"cron\",\n options,\n });\n }\n );\n }\n\n /** `io.unregisterCron()` allows you to unregister a [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) that was previously registered with `io.registerCron()`.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param dynamicSchedule The [DynamicSchedule](https://trigger.dev/docs/sdk/dynamicschedule) to unregister a schedule on.\n * @param id A unique id for the interval. This is used to identify and unregister the interval later.\n */\n async unregisterCron(key: string | any[], dynamicSchedule: DynamicSchedule, id: string) {\n return await this.runTask(\n key,\n {\n name: \"unregister-cron\",\n properties: [\n { label: \"schedule\", text: dynamicSchedule.id },\n { label: \"id\", text: id },\n ],\n },\n async (task) => {\n return dynamicSchedule.unregister(id);\n }\n );\n }\n\n /** `io.registerTrigger()` allows you to register a [DynamicTrigger](https://trigger.dev/docs/sdk/dynamictrigger) with the specified trigger params.\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param trigger The [DynamicTrigger](https://trigger.dev/docs/sdk/dynamictrigger) to register.\n * @param id A unique id for the trigger. This is used to identify and unregister the trigger later.\n * @param params The params for the trigger.\n */\n async registerTrigger<\n TTrigger extends DynamicTrigger<EventSpecification<any>, ExternalSource<any, any, any>>,\n >(\n key: string | any[],\n trigger: TTrigger,\n id: string,\n params: ExternalSourceParams<TTrigger[\"source\"]>\n ): Promise<{ id: string; key: string } | undefined> {\n return await this.runTask(\n key,\n {\n name: \"register-trigger\",\n properties: [\n { label: \"trigger\", text: trigger.id },\n { label: \"id\", text: id },\n ],\n params: params as any,\n },\n async (task) => {\n const registration = await this.runTask(\n \"register-source\",\n {\n name: \"register-source\",\n },\n async (subtask1) => {\n return trigger.register(id, params);\n }\n );\n\n const connection = await this.getAuth(\"get-auth\", registration.source.clientId);\n\n const io = createIOWithIntegrations(\n // @ts-ignore\n this,\n {\n integration: connection,\n },\n {\n integration: trigger.source.integration,\n }\n );\n\n const updates = await trigger.source.register(params, registration, io, this._context);\n\n if (!updates) {\n // TODO: do something here?\n return;\n }\n\n return await this.updateSource(\"update-source\", {\n key: registration.source.key,\n ...updates,\n });\n }\n );\n }\n\n async getAuth(key: string | any[], clientId?: string): Promise<ConnectionAuth | undefined> {\n if (!clientId) {\n return;\n }\n\n return this.runTask(key, { name: \"get-auth\" }, async (task) => {\n return await this._triggerClient.getAuth(clientId);\n });\n }\n\n /** `io.runTask()` allows you to run a [Task](https://trigger.dev/docs/documentation/concepts/tasks) from inside a Job run. A Task is a resumable unit of a Run that can be retried, resumed and is logged. [Integrations](https://trigger.dev/docs/integrations) use Tasks internally to perform their actions.\n *\n * @param key Should be a stable and unique key inside the `run()`. See [resumability](https://trigger.dev/docs/documentation/concepts/resumability) for more information.\n * @param options The options of how you'd like to run and log the Task. Name is required.\n * @param callback The callback that will be called when the Task is run. The callback receives the Task and the IO as parameters.\n= * @param onError The callback that will be called when the Task fails. The callback receives the error, the Task and the IO as parameters. If you wish to retry then return an object with a `retryAt` property.\n * @returns A Promise that resolves with the returned value of the callback.\n */\n async runTask<\n TResult extends SerializableJson | void = void,\n TCallbackResult extends unknown = TResult,\n >(\n key: string | any[],\n options: RunTaskOptions,\n callback: (task: IOTask, io: IO) => Promise<TCallbackResult | TResult>,\n onError?: (\n error: unknown,\n task: IOTask,\n io: IO\n ) => { retryAt: Date; error?: Error; jitter?: number } | Error | undefined | void\n ): Promise<TResult> {\n const parentId = this._taskStorage.getStore()?.taskId;\n\n if (parentId) {\n this._logger.debug(\"Using parent task\", {\n parentId,\n key,\n options,\n });\n }\n\n const idempotencyKey = await generateIdempotencyKey([this._id, parentId ?? \"\", key].flat());\n\n const cachedTask = this._cachedTasks.get(idempotencyKey);\n\n if (cachedTask) {\n this._logger.debug(\"Using cached task\", {\n idempotencyKey,\n cachedTask,\n });\n\n return cachedTask.output as TResult;\n }\n\n const task = await this._apiClient.runTask(this._id, {\n idempotencyKey,\n displayKey: typeof key === \"string\" ? key : undefined,\n noop: false,\n ...options,\n parentId,\n });\n\n if (task.status === \"CANCELED\") {\n this._logger.debug(\"Task canceled\", {\n idempotencyKey,\n task,\n });\n\n throw new CanceledWithTaskError(task);\n }\n\n if (task.status === \"COMPLETED\") {\n this._logger.debug(\"Using task output\", {\n idempotencyKey,\n task,\n });\n\n this.#addToCachedTasks(task);\n\n return task.output as TResult;\n }\n\n if (task.status === \"ERRORED\") {\n this._logger.debug(\"Task errored\", {\n idempotencyKey,\n task,\n });\n\n throw new Error(task.error ?? \"Task errored\");\n }\n\n if (task.status === \"WAITING\") {\n this._logger.debug(\"Task waiting\", {\n idempotencyKey,\n task,\n });\n\n throw new ResumeWithTaskError(task);\n }\n\n if (task.status === \"RUNNING\" && typeof task.operation === \"string\") {\n this._logger.debug(\"Task running operation\", {\n idempotencyKey,\n task,\n });\n\n throw new ResumeWithTaskError(task);\n }\n\n const executeTask = async () => {\n try {\n const result = await callback(task, this);\n\n const output = SerializableJsonSchema.parse(result) as TResult;\n\n this._logger.debug(\"Completing using output\", {\n idempotencyKey,\n task,\n });\n\n const completedTask = await this._apiClient.completeTask(this._id, task.id, {\n output: output ?? undefined,\n properties: task.outputProperties ?? undefined,\n });\n\n if (completedTask.status === \"CANCELED\") {\n throw new CanceledWithTaskError(completedTask);\n }\n\n return output;\n } catch (error) {\n if (isTriggerError(error)) {\n throw error;\n }\n\n if (onError) {\n try {\n const onErrorResult = onError(error, task, this);\n\n if (onErrorResult) {\n if (onErrorResult instanceof Error) {\n error = onErrorResult;\n } else {\n const parsedError = ErrorWithStackSchema.safeParse(onErrorResult.error);\n\n throw new RetryWithTaskError(\n parsedError.success ? parsedError.data : { message: \"Unknown error\" },\n task,\n onErrorResult.retryAt\n );\n }\n }\n } catch (innerError) {\n if (isTriggerError(innerError)) {\n throw innerError;\n }\n\n error = innerError;\n }\n }\n\n const parsedError = ErrorWithStackSchema.safeParse(error);\n\n if (options.retry) {\n const retryAt = calculateRetryAt(options.retry, task.attempts - 1);\n\n if (retryAt) {\n throw new RetryWithTaskError(\n parsedError.success ? parsedError.data : { message: \"Unknown error\" },\n task,\n retryAt\n );\n }\n }\n\n if (parsedError.success) {\n await this._apiClient.failTask(this._id, task.id, {\n error: parsedError.data,\n });\n } else {\n await this._apiClient.failTask(this._id, task.id, {\n error: { message: JSON.stringify(error), name: \"Unknown Error\" },\n });\n }\n\n throw error;\n }\n };\n\n return this._taskStorage.run({ taskId: task.id }, executeTask);\n }\n\n /** `io.try()` allows you to run Tasks and catch any errors that are thrown, it's similar to a normal `try/catch` block but works with [io.runTask()](/sdk/io/runtask).\n * A regular `try/catch` block on its own won't work as expected with Tasks. Internally `runTask()` throws some special errors to control flow execution. This is necessary to deal with resumability, serverless timeouts, and retrying Tasks.\n * @param tryCallback The code you wish to run\n * @param catchCallback Thhis will be called if the Task fails. The callback receives the error\n * @returns A Promise that resolves with the returned value or the error\n */\n async try<TResult, TCatchResult>(\n tryCallback: () => Promise<TResult>,\n catchCallback: (error: unknown) => Promise<TCatchResult>\n ): Promise<TResult | TCatchResult> {\n try {\n return await tryCallback();\n } catch (error) {\n if (isTriggerError(error)) {\n throw error;\n }\n\n return await catchCallback(error);\n }\n }\n\n #addToCachedTasks(task: ServerTask) {\n this._cachedTasks.set(task.idempotencyKey, task);\n }\n}\n\n// Generate a stable idempotency key for the key material, using a stable json stringification\nasync function generateIdempotencyKey(keyMaterial: any[]) {\n const keys = keyMaterial.map((key) => {\n if (typeof key === \"string\") {\n return key;\n }\n\n return stableStringify(key);\n });\n\n const key = keys.join(\":\");\n\n const hash = await webcrypto.subtle.digest(\"SHA-256\", Buffer.from(key));\n\n return Buffer.from(hash).toString(\"hex\");\n}\n\nfunction stableStringify(obj: any): string {\n function sortKeys(obj: any): any {\n if (typeof obj !== \"object\" || obj === null) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(sortKeys);\n }\n\n const sortedKeys = Object.keys(obj).sort();\n const sortedObj: { [key: string]: any } = {};\n\n for (const key of sortedKeys) {\n sortedObj[key] = sortKeys(obj[key]);\n }\n\n return sortedObj;\n }\n\n const sortedObj = sortKeys(obj);\n return JSON.stringify(sortedObj);\n}\n\ntype CallbackFunction = (\n level: \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\" | \"LOG\",\n message: string,\n properties?: Record<string, any>\n) => Promise<void>;\n\nexport class IOLogger implements TaskLogger {\n constructor(private callback: CallbackFunction) {}\n\n /** Log: essential messages */\n log(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"LOG\", message, properties);\n }\n\n /** For debugging: the least important log level */\n debug(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"DEBUG\", message, properties);\n }\n\n /** Info: the second least important log level */\n info(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"INFO\", message, properties);\n }\n\n /** Warnings: the third most important log level */\n warn(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"WARN\", message, properties);\n }\n\n /** Error: The second most important log level */\n error(message: string, properties?: Record<string, any>): Promise<void> {\n return this.callback(\"ERROR\", message, properties);\n }\n}\n","import { ConnectionAuth, RunTaskOptions } from \"@trigger.dev/core\";\nimport {\n AuthenticatedTask,\n IOWithIntegrations,\n IntegrationClient,\n TriggerIntegration,\n} from \"./integrations\";\nimport { IO } from \"./io\";\n\nexport function createIOWithIntegrations<\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>>,\n>(\n io: IO,\n auths?: Record<string, ConnectionAuth | undefined>,\n integrations?: TIntegrations\n): IOWithIntegrations<TIntegrations> {\n if (!integrations) {\n return io as IOWithIntegrations<TIntegrations>;\n }\n\n const connections = Object.entries(integrations).reduce((acc, [connectionKey, integration]) => {\n let auth = auths?.[connectionKey];\n\n const client = integration.client.usesLocalAuth\n ? integration.client.client\n : auth\n ? integration.client.clientFactory?.(auth)\n : undefined;\n\n if (!client) {\n return acc;\n }\n\n auth = integration.client.usesLocalAuth ? integration.client.auth : auth;\n\n const ioConnection = {\n client,\n } as any;\n\n ioConnection.runTask = async (\n key: string | any[],\n callback: (client: any, task: any, io: IO) => Promise<any>,\n options?: RunTaskOptions\n ) => {\n return await io.runTask(\n key,\n {\n name: \"Task\",\n icon: integration.metadata.id,\n retry: {\n limit: 10,\n minTimeoutInMs: 1000,\n maxTimeoutInMs: 30000,\n factor: 2,\n randomize: true,\n },\n ...options,\n },\n async (ioTask) => {\n return await callback(client, ioTask, io);\n }\n );\n };\n\n if (integration.client.tasks) {\n const tasks: Record<string, AuthenticatedTask<any, any, any, any>> = integration.client.tasks;\n\n Object.keys(tasks).forEach((taskName) => {\n const authenticatedTask = tasks[taskName];\n\n ioConnection[taskName] = async (key: string | string[], params: any) => {\n const options = authenticatedTask.init(params);\n options.connectionKey = connectionKey;\n\n return await io.runTask(\n key,\n options,\n async (ioTask) => {\n return authenticatedTask.run(params, client, ioTask, io, auth);\n },\n authenticatedTask.onError\n );\n };\n });\n }\n\n acc[connectionKey] = ioConnection;\n\n return acc;\n }, {} as any);\n\n return new Proxy(io, {\n get(target, prop, receiver) {\n // We can return the original io back if the prop is __io\n if (prop === \"__io\") {\n return io;\n }\n\n if (prop in connections) {\n return connections[prop];\n }\n\n const value = Reflect.get(target, prop, receiver);\n return typeof value == \"function\" ? value.bind(target) : value;\n },\n }) as IOWithIntegrations<TIntegrations>;\n}\n","import type { RetryOptions } from \"@trigger.dev/core\";\nimport { calculateRetryAt } from \"@trigger.dev/core\";\n\nexport { calculateRetryAt };\nexport type { RetryOptions };\n","import { EventFilter, TriggerMetadata, deepMergeFilters } from \"@trigger.dev/core\";\nimport { z } from \"zod\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, EventSpecificationExample, Trigger } from \"../types\";\n\ntype EventTriggerOptions<TEventSpecification extends EventSpecification<any>> = {\n event: TEventSpecification;\n name?: string | string[];\n source?: string;\n filter?: EventFilter;\n};\n\nexport class EventTrigger<TEventSpecification extends EventSpecification<any>>\n implements Trigger<TEventSpecification>\n{\n #options: EventTriggerOptions<TEventSpecification>;\n\n constructor(options: EventTriggerOptions<TEventSpecification>) {\n this.#options = options;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: this.#options.name ?? this.#options.event.title,\n rule: {\n event: this.#options.name ?? this.#options.event.name,\n source: this.#options.source ?? \"trigger.dev\",\n payload: deepMergeFilters(this.#options.filter ?? {}, this.#options.event.filter ?? {}),\n },\n };\n }\n\n get event() {\n return this.#options.event;\n }\n\n attachToJob(triggerClient: TriggerClient, job: Job<Trigger<TEventSpecification>, any>): void {}\n\n get preprocessRuns() {\n return false;\n }\n}\n\n/** Configuration options for an EventTrigger */\ntype TriggerOptions<TEvent> = {\n /** The name of the event you are subscribing to. Must be an exact match (case sensitive). To trigger on multiple possible events, pass in an array of event names */\n name: string | string[];\n /** A [Zod](https://trigger.dev/docs/documentation/guides/zod) schema that defines the shape of the event payload.\n * The default is `z.any()` which is `any`.\n * */\n schema?: z.Schema<TEvent>;\n /** You can use this to filter events based on the source. */\n source?: string;\n /** Used to filter which events trigger the Job\n * @example\n * filter:\n * ```ts\n * {\n * name: [\"John\", \"Jane\"],\n * age: [18, 21]\n * }\n * ```\n *\n * This filter would match against an event with the following data:\n * ```json\n * {\n * \"name\": \"Jane\",\n * \"age\": 18,\n * \"location\": \"San Francisco\"\n * }\n * ```\n */\n filter?: EventFilter;\n\n examples?: EventSpecificationExample[];\n};\n\n/** `eventTrigger()` is set as a [Job's trigger](https://trigger.dev/docs/sdk/job) to subscribe to an event a Job from [a sent event](https://trigger.dev/docs/sdk/triggerclient/instancemethods/sendevent)\n * @param options options for the EventTrigger\n */\nexport function eventTrigger<TEvent extends any = any>(\n options: TriggerOptions<TEvent>\n): Trigger<EventSpecification<TEvent>> {\n return new EventTrigger({\n name: options.name,\n filter: options.filter,\n event: {\n name: options.name,\n title: \"Event\",\n source: options.source ?? \"trigger.dev\",\n icon: \"custom-event\",\n examples: options.examples,\n parsePayload: (rawPayload: any) => {\n if (options.schema) {\n return options.schema.parse(rawPayload);\n }\n\n return rawPayload as any;\n },\n },\n });\n}\n","import { ConnectionAuth, IntegrationMetadata, RunTaskOptions, ServerTask } from \"@trigger.dev/core\";\nimport { IO, IOTask } from \"./io\";\n\ntype IntegrationRunTaskFunction<TClient> = <TResult>(\n key: string | any[],\n callback: (client: TClient, task: IOTask, io: IO) => Promise<TResult>,\n options?: RunTaskOptions\n) => Promise<TResult>;\n\nexport type ClientFactory<TClient> = (auth: ConnectionAuth) => TClient;\n\nexport interface TriggerIntegration<\n TIntegrationClient extends IntegrationClient<any, any> = IntegrationClient<any, any>,\n> {\n client: TIntegrationClient;\n id: string;\n metadata: IntegrationMetadata;\n}\n\nexport type IntegrationClient<\n TClient,\n TTasks extends Record<string, AuthenticatedTask<TClient, any, any, any>>,\n> =\n | {\n usesLocalAuth: true;\n client: TClient;\n tasks?: TTasks;\n auth: any;\n }\n | {\n usesLocalAuth: false;\n clientFactory: ClientFactory<TClient>;\n tasks?: TTasks;\n };\n\nexport type AuthenticatedTask<TClient, TParams, TResult, TAuth = ConnectionAuth> = {\n run: (\n params: TParams,\n client: TClient,\n task: ServerTask,\n io: IO,\n auth: TAuth\n ) => Promise<TResult>;\n init: (params: TParams) => RunTaskOptions;\n onError?: (\n error: unknown,\n task: ServerTask\n ) => { retryAt: Date; error?: Error } | Error | undefined | void;\n};\n\nexport function authenticatedTask<TClient, TParams, TResult>(options: {\n run: (params: TParams, client: TClient, task: ServerTask, io: IO) => Promise<TResult>;\n init: (params: TParams) => RunTaskOptions;\n}): AuthenticatedTask<TClient, TParams, TResult> {\n return options;\n}\n\ntype ExtractRunFunction<T> = T extends AuthenticatedTask<\n any,\n infer TParams,\n infer TResult,\n infer TAuth\n>\n ? (key: string, params: TParams) => Promise<TResult>\n : never;\n\ntype ExtractTasks<TTasks extends Record<string, AuthenticatedTask<any, any, any, any>>> = {\n [key in keyof TTasks]: ExtractRunFunction<TTasks[key]>;\n};\n\ntype ExtractIntegrationClientClient<TIntegrationClient extends IntegrationClient<any, any>> =\n TIntegrationClient extends {\n usesLocalAuth: true;\n client: infer TClient;\n }\n ? {\n client: TClient;\n runTask: IntegrationRunTaskFunction<TClient>;\n }\n : TIntegrationClient extends {\n usesLocalAuth: false;\n clientFactory: ClientFactory<infer TClient>;\n }\n ? {\n client: TClient;\n runTask: IntegrationRunTaskFunction<TClient>;\n }\n : never;\n\ntype ExtractIntegrationClient<TIntegrationClient extends IntegrationClient<any, any>> =\n ExtractIntegrationClientClient<TIntegrationClient> & ExtractTasks<TIntegrationClient[\"tasks\"]>;\n\nexport type IntegrationIO<TIntegration extends TriggerIntegration<IntegrationClient<any, any>>> =\n ExtractIntegrationClient<TIntegration[\"client\"]>;\n\ntype ExtractIntegrations<\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>>,\n> = {\n [key in keyof TIntegrations]: ExtractIntegrationClient<TIntegrations[key][\"client\"]>;\n};\n\nexport type IOWithIntegrations<\n TIntegrations extends Record<string, TriggerIntegration<IntegrationClient<any, any>>>,\n> = IO & ExtractIntegrations<TIntegrations>;\n","import { z } from \"zod\";\n\nimport {\n DisplayProperty,\n EventFilter,\n HandleTriggerSource,\n Logger,\n NormalizedResponse,\n RegisterSourceEvent,\n SendEvent,\n TriggerMetadata,\n UpdateTriggerSourceBody,\n deepMergeFilters,\n} from \"@trigger.dev/core\";\nimport { IOWithIntegrations, IntegrationClient, TriggerIntegration } from \"../integrations\";\nimport { IO } from \"../io\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport type { EventSpecification, Trigger, TriggerContext } from \"../types\";\nimport { slugifyId } from \"../utils\";\n\nexport type HttpSourceEvent = {\n url: string;\n method: string;\n headers: Record<string, string>;\n rawBody?: Buffer | null;\n};\n\ntype SmtpSourceEvent = {\n from: string;\n to: string;\n subject: string;\n body: string;\n};\n\ntype SqsSourceEvent = {\n body: string;\n};\n\ntype ExternalSourceChannelMap = {\n HTTP: {\n event: Request;\n register: {\n url: string;\n };\n };\n SMTP: {\n event: SmtpSourceEvent;\n register: {};\n };\n SQS: {\n event: SqsSourceEvent;\n register: {};\n };\n};\n\ntype ChannelNames = keyof ExternalSourceChannelMap;\n\ntype RegisterFunctionEvent<TChannel extends ChannelNames, TParams extends any> = {\n events: Array<string>;\n missingEvents: Array<string>;\n orphanedEvents: Array<string>;\n source: {\n active: boolean;\n data?: any;\n secret: string;\n } & ExternalSourceChannelMap[TChannel][\"register\"];\n params: TParams;\n};\n\ntype RegisterFunction<\n TIntegration extends TriggerIntegration<IntegrationClient<any, any>>,\n TParams extends any,\n TChannel extends ChannelNames,\n> = (\n event: RegisterFunctionEvent<TChannel, TParams>,\n io: IOWithIntegrations<{ integration: TIntegration }>,\n ctx: TriggerContext\n) => Promise<UpdateTriggerSourceBody | undefined>;\n\nexport type HandlerEvent<TChannel extends ChannelNames, TParams extends any = any> = {\n rawEvent: ExternalSourceChannelMap[TChannel][\"event\"];\n source: HandleTriggerSource & { params: TParams };\n};\n\ntype HandlerFunction<TChannel extends ChannelNames, TParams extends any> = (\n event: HandlerEvent<TChannel, TParams>,\n logger: Logger\n) => Promise<{ events: SendEvent[]; response?: NormalizedResponse } | void>;\n\ntype KeyFunction<TParams extends any> = (params: TParams) => string;\ntype FilterFunction<TParams extends any> = (params: TParams) => EventFilter;\n\ntype ExternalSourceOptions<\n TChannel extends ChannelNames,\n TIntegration extends TriggerIntegration<IntegrationClient<any, any>>,\n TParams extends any,\n> = {\n id: string;\n version: string;\n schema: z.Schema<TParams>;\n integration: TIntegration;\n register: RegisterFunction<TIntegration, TParams, TChannel>;\n filter?: FilterFunction<TParams>;\n handler: HandlerFunction<TChannel, TParams>;\n key: KeyFunction<TParams>;\n properties?: (params: TParams) => DisplayProperty[];\n};\n\nexport class ExternalSource<\n TIntegration extends TriggerIntegration<IntegrationClient<any, any>>,\n TParams extends any,\n TChannel extends ChannelNames = ChannelNames,\n> {\n channel: TChannel;\n\n constructor(\n channel: TChannel,\n private options: ExternalSourceOptions<TChannel, TIntegration, TParams>\n ) {\n this.channel = channel;\n }\n\n async handle(\n source: HandleTriggerSource,\n rawEvent: ExternalSourceChannelMap[TChannel][\"event\"],\n logger: Logger\n ) {\n return this.options.handler(\n {\n source: { ...source, params: source.params as TParams },\n rawEvent,\n },\n logger\n );\n }\n\n filter(params: TParams): EventFilter {\n return this.options.filter?.(params) ?? {};\n }\n\n properties(params: TParams): DisplayProperty[] {\n return this.options.properties?.(params) ?? [];\n }\n\n async register(params: TParams, registerEvent: RegisterSourceEvent, io: IO, ctx: TriggerContext) {\n const { result: event, ommited: source } = omit(registerEvent, \"source\");\n const { result: sourceWithoutChannel, ommited: channel } = omit(source, \"channel\");\n const { result: channelWithoutType } = omit(channel, \"type\");\n\n const updates = await this.options.register(\n {\n ...event,\n source: { ...sourceWithoutChannel, ...channelWithoutType },\n params,\n },\n io as IOWithIntegrations<{ integration: TIntegration }>,\n ctx\n );\n\n return updates;\n }\n\n key(params: TParams): string {\n const parts = [this.options.id, this.channel];\n\n parts.push(this.options.key(params));\n parts.push(this.integration.id);\n\n return parts.join(\"-\");\n }\n\n get integration() {\n return this.options.integration;\n }\n\n get integrationConfig() {\n return {\n id: this.integration.id,\n metadata: this.integration.metadata,\n };\n }\n\n get id() {\n return this.options.id;\n }\n\n get version() {\n return this.options.version;\n }\n}\n\nexport type ExternalSourceParams<TExternalSource extends ExternalSource<any, any, any>> =\n TExternalSource extends ExternalSource<any, infer TParams, any>\n ? TParams & { filter?: EventFilter }\n : never;\n\nexport type ExternalSourceTriggerOptions<\n TEventSpecification extends EventSpecification<any>,\n TEventSource extends ExternalSource<any, any, any>,\n> = {\n event: TEventSpecification;\n source: TEventSource;\n params: ExternalSourceParams<TEventSource>;\n};\n\nexport class ExternalSourceTrigger<\n TEventSpecification extends EventSpecification<any>,\n TEventSource extends ExternalSource<any, any, any>,\n> implements Trigger<TEventSpecification>\n{\n constructor(private options: ExternalSourceTriggerOptions<TEventSpecification, TEventSource>) {}\n\n get event() {\n return this.options.event;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: \"External Source\",\n rule: {\n event: this.event.name,\n payload: deepMergeFilters(\n this.options.source.filter(this.options.params),\n this.event.filter ?? {},\n this.options.params.filter ?? {}\n ),\n source: this.event.source,\n },\n properties: this.options.source.properties(this.options.params),\n };\n }\n\n attachToJob(triggerClient: TriggerClient, job: Job<Trigger<TEventSpecification>, any>) {\n triggerClient.attachSource({\n key: slugifyId(this.options.source.key(this.options.params)),\n source: this.options.source,\n event: this.options.event,\n params: this.options.params,\n });\n }\n\n get preprocessRuns() {\n return true;\n }\n}\n\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n key: K\n): { result: Omit<T, K>; ommited: T[K] } {\n const result: any = {};\n\n for (const k of Object.keys(obj)) {\n if (k === key) continue;\n\n result[k] = obj[k];\n }\n\n return { result, ommited: obj[key] };\n}\n","import {\n RegisterSourceEvent,\n RegisterTriggerBody,\n TriggerMetadata,\n deepMergeFilters,\n} from \"@trigger.dev/core\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, Trigger } from \"../types\";\nimport { slugifyId } from \"../utils\";\nimport { ExternalSource, ExternalSourceParams } from \"./externalSource\";\n\n/** Options for a DynamicTrigger */\nexport type DynamicTriggerOptions<\n TEventSpec extends EventSpecification<any>,\n TExternalSource extends ExternalSource<any, any, any>,\n> = {\n /** Used to uniquely identify a DynamicTrigger */\n id: string;\n /** An event from an [Integration](https://trigger.dev/docs/integrations) package that you want to attach to the DynamicTrigger. The event types will come through to the payload in your Job's run. */\n event: TEventSpec;\n /** An external source fron an [Integration](https://trigger.dev/docs/integrations) package\n * @example \n * ```ts\n * import { events } from \"@trigger.dev/github\";\n * \n * const dynamicOnIssueOpened = new DynamicTrigger(client, {\n id: \"github-issue-opened\",\n event: events.onIssueOpened,\n source: github.sources.repo,\n });\n * ```\n */\n source: TExternalSource;\n};\n\n/** `DynamicTrigger` allows you to define a trigger that can be configured dynamically at runtime. */\nexport class DynamicTrigger<\n TEventSpec extends EventSpecification<any>,\n TExternalSource extends ExternalSource<any, any, any>,\n> implements Trigger<TEventSpec>\n{\n #client: TriggerClient;\n #options: DynamicTriggerOptions<TEventSpec, TExternalSource>;\n source: TExternalSource;\n\n /** `DynamicTrigger` allows you to define a trigger that can be configured dynamically at runtime.\n * @param client The `TriggerClient` instance to use for registering the trigger.\n * @param options The options for the dynamic trigger.\n * */\n constructor(client: TriggerClient, options: DynamicTriggerOptions<TEventSpec, TExternalSource>) {\n this.#client = client;\n this.#options = options;\n this.source = options.source;\n\n client.attachDynamicTrigger(this);\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"dynamic\",\n id: this.#options.id,\n };\n }\n\n get id() {\n return this.#options.id;\n }\n\n get event() {\n return this.#options.event;\n }\n\n registeredTriggerForParams(params: ExternalSourceParams<TExternalSource>): RegisterTriggerBody {\n const key = slugifyId(this.source.key(params));\n\n return {\n rule: {\n event: this.event.name,\n source: this.event.source,\n payload: deepMergeFilters(this.source.filter(params), this.event.filter ?? {}),\n },\n source: {\n key,\n channel: this.source.channel,\n params,\n events: typeof this.event.name === \"string\" ? [this.event.name] : this.event.name,\n integration: {\n id: this.source.integration.id,\n metadata: this.source.integration.metadata,\n authSource: this.source.integration.client.usesLocalAuth ? \"LOCAL\" : \"HOSTED\",\n },\n },\n };\n }\n\n /** Use this method to register a new configuration with the DynamicTrigger.\n * @param key The key for the configuration. This will be used to identify the configuration when it is triggered.\n * @param params The params for the configuration.\n */\n async register(\n key: string,\n params: ExternalSourceParams<TExternalSource>\n ): Promise<RegisterSourceEvent> {\n return this.#client.registerTrigger(this.id, key, this.registeredTriggerForParams(params));\n }\n\n attachToJob(triggerClient: TriggerClient, job: Job<Trigger<TEventSpec>, any>): void {\n triggerClient.attachJobToDynamicTrigger(job, this);\n }\n\n get preprocessRuns() {\n return true;\n }\n}\n","import {\n CronOptions,\n IntervalOptions,\n ScheduleMetadata,\n ScheduledPayload,\n ScheduledPayloadSchema,\n TriggerMetadata,\n currentDate,\n} from \"@trigger.dev/core\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, Trigger } from \"../types\";\nimport cronstrue from \"cronstrue\";\n\ntype ScheduledEventSpecification = EventSpecification<ScheduledPayload>;\n\nconst examples = [\n {\n id: \"now\",\n name: \"Now\",\n icon: \"clock\",\n payload: {\n ts: currentDate.marker,\n lastTimestamp: currentDate.marker,\n },\n },\n];\n\nexport class IntervalTrigger implements Trigger<ScheduledEventSpecification> {\n constructor(private options: IntervalOptions) {}\n\n get event() {\n return {\n name: \"trigger.scheduled\",\n title: \"Schedule\",\n source: \"trigger.dev\",\n icon: \"schedule-interval\",\n examples,\n parsePayload: ScheduledPayloadSchema.parse,\n properties: [\n {\n label: \"Interval\",\n text: `${this.options.seconds}s`,\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<ScheduledEventSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"scheduled\",\n schedule: {\n type: \"interval\",\n options: {\n seconds: this.options.seconds,\n },\n },\n };\n }\n}\n\n/** `intervalTrigger()` is set as a [Job's trigger](/sdk/job) to trigger a Job at a recurring interval.\n * @param options An object containing options about the interval.\n */\nexport function intervalTrigger(options: IntervalOptions) {\n return new IntervalTrigger(options);\n}\n\nexport class CronTrigger implements Trigger<ScheduledEventSpecification> {\n constructor(private options: CronOptions) {}\n\n get event() {\n const humanReadable = cronstrue.toString(this.options.cron, {\n throwExceptionOnParseError: false,\n });\n\n return {\n name: \"trigger.scheduled\",\n title: \"Cron Schedule\",\n source: \"trigger.dev\",\n icon: \"schedule-cron\",\n examples,\n parsePayload: ScheduledPayloadSchema.parse,\n properties: [\n {\n label: \"cron\",\n text: this.options.cron,\n },\n {\n label: \"Schedule\",\n text: humanReadable,\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<ScheduledEventSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"scheduled\",\n schedule: {\n type: \"cron\",\n options: {\n cron: this.options.cron,\n },\n },\n };\n }\n}\n\n/** `cronTrigger()` is set as a [Job's trigger](https://trigger.dev/docs/sdk/job) to trigger a Job on a recurring schedule using a CRON expression.\n * @param options An object containing options about the CRON schedule.\n */\nexport function cronTrigger(options: CronOptions) {\n return new CronTrigger(options);\n}\n\n/** DynamicSchedule options\n * @param id Used to uniquely identify a DynamicSchedule\n */\nexport type DynamicIntervalOptions = { id: string };\n\n/** DynamicSchedule` allows you to define a scheduled trigger that can be configured dynamically at runtime. */\nexport class DynamicSchedule implements Trigger<ScheduledEventSpecification> {\n /**\n * @param client The `TriggerClient` instance to use for registering the trigger.\n * @param options The options for the schedule.\n */\n constructor(\n private client: TriggerClient,\n private options: DynamicIntervalOptions\n ) {}\n\n get id() {\n return this.options.id;\n }\n\n get event() {\n return {\n name: \"trigger.scheduled\",\n title: \"Dynamic Schedule\",\n source: \"trigger.dev\",\n icon: \"schedule-dynamic\",\n examples,\n parsePayload: ScheduledPayloadSchema.parse,\n };\n }\n\n async register(key: string, metadata: ScheduleMetadata) {\n return this.client.registerSchedule(this.id, key, metadata);\n }\n\n async unregister(key: string) {\n return this.client.unregisterSchedule(this.id, key);\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<ScheduledEventSpecification>, any>\n ): void {\n triggerClient.attachDynamicSchedule(this.options.id, job);\n }\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"dynamic\",\n id: this.options.id,\n };\n }\n}\n","import {\n MISSING_CONNECTION_NOTIFICATION,\n MISSING_CONNECTION_RESOLVED_NOTIFICATION,\n MissingConnectionNotificationPayload,\n MissingConnectionNotificationPayloadSchema,\n MissingConnectionResolvedNotificationPayload,\n MissingConnectionResolvedNotificationPayloadSchema,\n TriggerMetadata,\n} from \"@trigger.dev/core\";\nimport { TriggerIntegration } from \"../integrations\";\nimport { Job } from \"../job\";\nimport { TriggerClient } from \"../triggerClient\";\nimport { EventSpecification, Trigger } from \"../types\";\n\nexport function missingConnectionNotification(integrations: Array<TriggerIntegration>) {\n return new MissingConnectionNotification({ integrations });\n}\n\nexport function missingConnectionResolvedNotification(integrations: Array<TriggerIntegration>) {\n return new MissingConnectionResolvedNotification({ integrations });\n}\n\ntype MissingConnectionNotificationSpecification =\n EventSpecification<MissingConnectionNotificationPayload>;\n\ntype MissingConnectionNotificationOptions = {\n integrations: Array<TriggerIntegration>;\n};\n\nexport class MissingConnectionNotification\n implements Trigger<MissingConnectionNotificationSpecification>\n{\n constructor(private options: MissingConnectionNotificationOptions) {}\n\n get event() {\n return {\n name: MISSING_CONNECTION_NOTIFICATION,\n title: \"Missing Connection Notification\",\n source: \"trigger.dev\",\n icon: \"connection-alert\",\n parsePayload: MissingConnectionNotificationPayloadSchema.parse,\n properties: [\n {\n label: \"Integrations\",\n text: this.options.integrations.map((i) => i.id).join(\", \"),\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<MissingConnectionNotificationSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: this.event.title,\n rule: {\n event: this.event.name,\n source: \"trigger.dev\",\n payload: {\n client: {\n id: this.options.integrations.map((i) => i.id),\n },\n },\n },\n };\n }\n}\n\ntype MissingConnectionResolvedNotificationSpecification =\n EventSpecification<MissingConnectionResolvedNotificationPayload>;\n\nexport class MissingConnectionResolvedNotification\n implements Trigger<MissingConnectionResolvedNotificationSpecification>\n{\n constructor(private options: MissingConnectionNotificationOptions) {}\n\n get event() {\n return {\n name: MISSING_CONNECTION_RESOLVED_NOTIFICATION,\n title: \"Missing Connection Resolved Notification\",\n source: \"trigger.dev\",\n icon: \"connection-alert\",\n parsePayload: MissingConnectionResolvedNotificationPayloadSchema.parse,\n properties: [\n {\n label: \"Integrations\",\n text: this.options.integrations.map((i) => i.id).join(\", \"),\n },\n ],\n };\n }\n\n attachToJob(\n triggerClient: TriggerClient,\n job: Job<Trigger<MissingConnectionResolvedNotificationSpecification>, any>\n ): void {}\n\n get preprocessRuns() {\n return false;\n }\n\n toJSON(): TriggerMetadata {\n return {\n type: \"static\",\n title: this.event.title,\n rule: {\n event: this.event.name,\n source: \"trigger.dev\",\n payload: {\n client: {\n id: this.options.integrations.map((i) => i.id),\n },\n },\n },\n };\n }\n}\n"],"mappings":"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","names":["slugifyId","input","replaceSpacesWithDash","toLowerCase","replace","removeNonUrlSafeChars","Job","constructor","client","options","attach","id","slugifyId","enabled","name","trigger","version","integrations","Object","keys","reduce","acc","key","integration","metadata","authSource","usesLocalAuth","logLevel","toJSON","internal","__internal","event","startPosition","preprocessRuns","match","Error","import_core","ApiClient","constructor","options","apiUrl","process","env","TRIGGER_API_URL","Logger","logLevel","registerEndpoint","apiKey","debug","url","name","response","fetch","method","headers","Authorization","body","JSON","stringify","status","json","Error","error","runTask","runId","task","zodfetch","ServerTaskSchema","idempotencyKey","completeTask","id","failTask","sendEvent","event","ApiEventLogSchema","cancelEvent","eventId","updateSource","client","key","source","TriggerSourceSchema","registerTrigger","payload","RegisterSourceEventSchema","registerSchedule","RegisterScheduleResponseBodySchema","unregisterSchedule","z","object","ok","boolean","encodeURIComponent","getAuth","ConnectionAuthSchema","Accept","optional","getEvent","GetEventSchema","getRun","GetRunSchema","urlWithSearchParams","getRuns","jobSlug","GetRunsSchema","getApiKey","TRIGGER_API_KEY","isValid","match","schema","requestInit","errorMessage","jsonBody","parse","ResumeWithTaskError","constructor","task","RetryWithTaskError","cause","retryAt","CanceledWithTaskError","isTriggerError","err","import_core","createIOWithIntegrations","io","auths","integrations","connections","Object","entries","reduce","acc","connectionKey","integration","auth","client","usesLocalAuth","clientFactory","undefined","ioConnection","runTask","key","callback","options","name","icon","metadata","id","retry","limit","minTimeoutInMs","maxTimeoutInMs","factor","randomize","ioTask","tasks","keys","forEach","taskName","authenticatedTask","params","init","run","onError","Proxy","get","target","prop","receiver","value","Reflect","bind","import_core","IO","constructor","options","_id","id","_apiClient","apiClient","_triggerClient","client","_logger","logger","Logger","logLevel","_cachedTasks","Map","_jobLogger","jobLogger","_jobLogLevel","jobLogLevel","cachedTasks","forEach","task","set","idempotencyKey","_taskStorage","AsyncLocalStorage","_context","context","IOLogger","level","message","data","log","debug","info","warn","error","satisfiesLogLevel","runTask","name","icon","description","params","properties","label","text","style","variant","toLowerCase","noop","wait","key","seconds","delayUntil","Date","now","backgroundFetch","url","requestInit","retry","urlObject","URL","hostname","pathname","operation","method","output","sendEvent","event","getEvent","cancelEvent","eventId","updateSource","redact","paths","registerInterval","dynamicSchedule","toString","register","type","unregisterInterval","unregister","registerCron","cron","unregisterCron","registerTrigger","trigger","registration","subtask1","connection","getAuth","source","clientId","io","createIOWithIntegrations","integration","updates","callback","onError","parentId","getStore","taskId","generateIdempotencyKey","flat","cachedTask","get","displayKey","undefined","status","CanceledWithTaskError","Error","ResumeWithTaskError","executeTask","result","SerializableJsonSchema","parse","completedTask","completeTask","outputProperties","isTriggerError","onErrorResult","parsedError","ErrorWithStackSchema","safeParse","RetryWithTaskError","success","retryAt","innerError","calculateRetryAt","attempts","failTask","JSON","stringify","run","try","tryCallback","catchCallback","keyMaterial","keys","map","stableStringify","join","hash","webcrypto","subtle","digest","Buffer","from","obj","sortKeys","Array","isArray","sortedKeys","Object","sort","sortedObj","import_core","_options","EventTrigger","constructor","options","toJSON","type","title","name","event","rule","source","payload","deepMergeFilters","filter","attachToJob","triggerClient","job","preprocessRuns","eventTrigger","icon","examples","parsePayload","rawPayload","schema","parse","registerSourceEvent","name","REGISTER_SOURCE_EVENT","title","source","icon","parsePayload","RegisterSourceEventSchema","parse","_options","TriggerClient","constructor","options","id","ApiClient","Logger","verbose","handleRequest","request","debug","url","headers","Object","fromEntries","entries","method","apiKey","get","authorization","authorized","status","body","message","action","endpointId","ok","error","jobId","job","toJSON","jobs","values","map","sources","dynamicTriggers","trigger","registerSourceJob","dynamicTriggerRegisterSourceJobId","version","dynamicSchedules","json","InitializeTriggerBodySchema","safeParse","success","dynamicTrigger","data","registeredTriggerForParams","params","execution","RunJobBodySchema","results","PreprocessRunBodySchema","abort","properties","HttpSourceRequestHeadersSchema","sourceRequestNeedsBody","sourceRequestInit","undefined","duplex","sourceRequest","Request","key","dynamicId","secret","response","events","attach","attachToJob","attachDynamicTrigger","Job","EventTrigger","event","filter","dynamicTriggerId","integrations","integration","run","io","ctx","updates","register","updateSource","__internal","attachJobToDynamicTrigger","push","attachSource","s","r","handle","registeredSource","channel","metadata","authSource","client","usesLocalAuth","Array","from","Set","attachDynamicSchedule","registerTrigger","getAuth","sendEvent","cancelEvent","eventId","registerSchedule","schedule","unregisterSchedule","getEvent","getRun","runId","getRuns","jobSlug","localApiKey","process","env","TRIGGER_API_KEY","defineJob","context","parsedPayload","payload","runProperties","IO","cachedTasks","tasks","apiClient","logger","jobLogLevel","logLevel","jobLogger","ioLogLocalEnabled","ioWithConnections","createIOWithIntegrations","connections","output","ResumeWithTaskError","task","RetryWithTaskError","cause","retryAt","CanceledWithTaskError","errorWithStack","ErrorWithStackSchema","organization","environment","timestamp","account","handler","authenticatedTask","options","import_core","ExternalSource","constructor","channel","options","handle","source","rawEvent","logger","handler","params","filter","properties","register","registerEvent","io","ctx","result","event","ommited","omit","sourceWithoutChannel","channelWithoutType","updates","key","parts","id","push","integration","join","integrationConfig","metadata","version","ExternalSourceTrigger","toJSON","type","title","rule","name","payload","deepMergeFilters","attachToJob","triggerClient","job","attachSource","slugifyId","preprocessRuns","obj","k","Object","keys","import_core","_client","_options","DynamicTrigger","constructor","client","options","source","attachDynamicTrigger","toJSON","type","id","event","registeredTriggerForParams","params","key","slugifyId","rule","name","payload","deepMergeFilters","filter","channel","events","integration","metadata","authSource","usesLocalAuth","register","registerTrigger","attachToJob","triggerClient","job","attachJobToDynamicTrigger","preprocessRuns","import_core","examples","id","name","icon","payload","ts","currentDate","marker","lastTimestamp","IntervalTrigger","constructor","options","event","title","source","parsePayload","ScheduledPayloadSchema","parse","properties","label","text","seconds","attachToJob","triggerClient","job","preprocessRuns","toJSON","type","schedule","intervalTrigger","CronTrigger","humanReadable","cronstrue","toString","cron","throwExceptionOnParseError","cronTrigger","DynamicSchedule","client","register","key","metadata","registerSchedule","unregister","unregisterSchedule","attachDynamicSchedule","import_core","missingConnectionNotification","integrations","MissingConnectionNotification","missingConnectionResolvedNotification","MissingConnectionResolvedNotification","constructor","options","event","name","MISSING_CONNECTION_NOTIFICATION","title","source","icon","parsePayload","MissingConnectionNotificationPayloadSchema","parse","properties","label","text","map","i","id","join","attachToJob","triggerClient","job","preprocessRuns","toJSON","type","rule","payload","client","MISSING_CONNECTION_RESOLVED_NOTIFICATION","MissingConnectionResolvedNotificationPayloadSchema","redactString","strings","interpolations","__redactedString","raw"]}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@trigger.dev/sdk",
3
- "version": "2.0.10",
3
+ "version": "2.0.12",
4
4
  "description": "trigger.dev Node.JS SDK",
5
+ "license": "MIT",
5
6
  "main": "./dist/index.js",
6
7
  "types": "./dist/index.d.ts",
7
8
  "publishConfig": {
@@ -18,7 +19,7 @@
18
19
  "./package.json": "./package.json"
19
20
  },
20
21
  "dependencies": {
21
- "@trigger.dev/core": "^2.0.10",
22
+ "@trigger.dev/core": "^2.0.12",
22
23
  "chalk": "^5.2.0",
23
24
  "cronstrue": "^2.21.0",
24
25
  "debug": "^4.3.4",