@cobaltio/cobalt-js 9.2.0 → 9.3.0-beta.1
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/.github/workflows/npm-publish.yml +10 -2
- package/cobalt.d.ts +60 -18
- package/cobalt.js +377 -411
- package/cobalt.ts +118 -30
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/Cobalt.html +32 -25
- package/docs/enums/AuthStatus.html +2 -2
- package/docs/enums/AuthType.html +2 -2
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/Application.html +14 -18
- package/docs/interfaces/AuthConfig.html +9 -0
- package/docs/interfaces/CobaltOptions.html +3 -3
- package/docs/interfaces/Config.html +2 -2
- package/docs/interfaces/ConfigField.html +4 -4
- package/docs/interfaces/ConfigPayload.html +4 -4
- package/docs/interfaces/ConfigWorkflow.html +2 -2
- package/docs/interfaces/ConnectedAccount.html +14 -0
- package/docs/interfaces/ExecuteWorkflowPayload.html +5 -5
- package/docs/interfaces/Execution.html +2 -2
- package/docs/interfaces/ExecutionFilters.html +8 -8
- package/docs/interfaces/GetExecutionsParams.html +9 -9
- package/docs/interfaces/InputField.html +9 -9
- package/docs/interfaces/KeyBasedParams.html +7 -0
- package/docs/interfaces/Label.html +3 -3
- package/docs/interfaces/OAuthParams.html +9 -0
- package/docs/interfaces/PublicWorkflow.html +8 -8
- package/docs/interfaces/PublicWorkflowPayload.html +4 -4
- package/docs/interfaces/PublicWorkflowsPayload.html +7 -7
- package/docs/interfaces/RuleOptions.html +2 -2
- package/docs/interfaces/UpdateConfigPayload.html +5 -5
- package/docs/interfaces/WorkflowPayload.html +4 -4
- package/docs/interfaces/WorkflowPayloadResponse.html +2 -2
- package/docs/llms.txt +281 -195
- package/docs/modules.html +1 -1
- package/docs/types/ExecutionSource.html +1 -1
- package/docs/types/ExecutionStatus.html +1 -1
- package/docs/types/ExecutionType.html +1 -1
- package/package.json +1 -1
- package/tsconfig.json +12 -12
package/cobalt.ts
CHANGED
|
@@ -12,6 +12,22 @@ export enum AuthStatus {
|
|
|
12
12
|
Expired = "expired",
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/** A connected account for an application. */
|
|
16
|
+
export interface ConnectedAccount {
|
|
17
|
+
/** The unique identifier for this connected account. */
|
|
18
|
+
connection_id: string;
|
|
19
|
+
/** The identifier of the auth config. */
|
|
20
|
+
auth_config_id: string;
|
|
21
|
+
/** The identifier (username, email, etc.) of the connected account. */
|
|
22
|
+
identifier: unknown;
|
|
23
|
+
/** The auth type used to connect the account. */
|
|
24
|
+
auth_type: AuthType;
|
|
25
|
+
/** The timestamp at which the account was connected. */
|
|
26
|
+
connectedAt: string;
|
|
27
|
+
/** The current status of the connection. */
|
|
28
|
+
status?: AuthStatus;
|
|
29
|
+
}
|
|
30
|
+
|
|
15
31
|
/** An application in Cobalt. */
|
|
16
32
|
export interface Application {
|
|
17
33
|
/** Application ID */
|
|
@@ -37,16 +53,7 @@ export interface Application {
|
|
|
37
53
|
[key in AuthType]: InputField[];
|
|
38
54
|
};
|
|
39
55
|
/** The list of connected accounts for this application */
|
|
40
|
-
connected_accounts?:
|
|
41
|
-
/** The identifier (username, email, etc.) of the connected account. */
|
|
42
|
-
identifier: unknown;
|
|
43
|
-
/** The auth type used to connect the account. */
|
|
44
|
-
auth_type: AuthType;
|
|
45
|
-
/** The timestamp at which the account was connected. */
|
|
46
|
-
connectedAt: string;
|
|
47
|
-
/** The current status of the connection. */
|
|
48
|
-
status?: AuthStatus;
|
|
49
|
-
}[];
|
|
56
|
+
connected_accounts?: ConnectedAccount[];
|
|
50
57
|
/**
|
|
51
58
|
* The type of auth used by application.
|
|
52
59
|
* @deprecated Check `auth_type_options` and `connected_accounts` for multiple auth types support.
|
|
@@ -69,6 +76,17 @@ export interface Application {
|
|
|
69
76
|
auth_input_map?: InputField[];
|
|
70
77
|
}
|
|
71
78
|
|
|
79
|
+
export interface AuthConfig {
|
|
80
|
+
/** The auth config ID. */
|
|
81
|
+
_id: string;
|
|
82
|
+
/** The display name of the auth config. */
|
|
83
|
+
name: string;
|
|
84
|
+
/** The description of the auth config. */
|
|
85
|
+
description?: string;
|
|
86
|
+
/** Whether the auth config is the default auth config for the application. */
|
|
87
|
+
is_default?: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
72
90
|
/** An Input field to take input from the user. */
|
|
73
91
|
export interface InputField {
|
|
74
92
|
/** Key name of the field. */
|
|
@@ -92,6 +110,26 @@ export interface InputField {
|
|
|
92
110
|
}[];
|
|
93
111
|
}
|
|
94
112
|
|
|
113
|
+
export interface OAuthParams {
|
|
114
|
+
/** The application slug. */
|
|
115
|
+
slug: string;
|
|
116
|
+
/** The identifier of the auth config. */
|
|
117
|
+
authConfig?: string;
|
|
118
|
+
/** The key value pairs of auth data. */
|
|
119
|
+
payload?: Record<string, string>;
|
|
120
|
+
/** Whether to close the authentication window automatically. */
|
|
121
|
+
autoClose?: boolean;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface KeyBasedParams {
|
|
125
|
+
/** The application slug. */
|
|
126
|
+
slug: string;
|
|
127
|
+
/** The identifier of the auth config. */
|
|
128
|
+
authConfig?: string;
|
|
129
|
+
/** The key value pairs of auth data. */
|
|
130
|
+
payload?: Record<string, string>;
|
|
131
|
+
}
|
|
132
|
+
|
|
95
133
|
/** The payload object for config. */
|
|
96
134
|
export interface ConfigPayload {
|
|
97
135
|
/** The application slug. */
|
|
@@ -482,16 +520,47 @@ class Cobalt {
|
|
|
482
520
|
return data;
|
|
483
521
|
}
|
|
484
522
|
|
|
523
|
+
/**
|
|
524
|
+
* Returns the auth configs for the specified application.
|
|
525
|
+
* @param {String} slug The application slug.
|
|
526
|
+
* @returns {Promise<AuthConfig[]>} The auth configs.
|
|
527
|
+
*/
|
|
528
|
+
public async getAuthConfigs(slug: string): Promise<AuthConfig[]> {
|
|
529
|
+
const res = await fetch(`${this.baseUrl}/api/v2/public/slug/${slug}/auth-config`, {
|
|
530
|
+
headers: {
|
|
531
|
+
authorization: `Bearer ${this.token}`,
|
|
532
|
+
},
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
if (res.status >= 400 && res.status < 600) {
|
|
536
|
+
const error = await res.json();
|
|
537
|
+
throw error;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
const data = await res.json();
|
|
541
|
+
return data.docs || [];
|
|
542
|
+
}
|
|
543
|
+
|
|
485
544
|
/**
|
|
486
545
|
* Returns the auth URL that users can use to authenticate themselves to the
|
|
487
546
|
* specified application.
|
|
488
547
|
* @private
|
|
489
|
-
* @param {
|
|
490
|
-
* @param {Object.<string, string>} [params] The key value pairs of auth data.
|
|
548
|
+
* @param {OAuthParams} params The OAuth parameters.
|
|
491
549
|
* @returns {Promise<String>} The auth URL where users can authenticate themselves.
|
|
492
550
|
*/
|
|
493
|
-
private async getOAuthUrl(
|
|
494
|
-
|
|
551
|
+
private async getOAuthUrl({
|
|
552
|
+
slug,
|
|
553
|
+
authConfig,
|
|
554
|
+
payload,
|
|
555
|
+
}: OAuthParams): Promise<string> {
|
|
556
|
+
const queryParams = new URLSearchParams();
|
|
557
|
+
if (authConfig) queryParams.append("auth_config_id", authConfig);
|
|
558
|
+
if (typeof payload === "object") {
|
|
559
|
+
for (const [ key, value ] of Object.entries(payload)) {
|
|
560
|
+
queryParams.append(key, value);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
const res = await fetch(`${this.baseUrl}/api/v1/${slug}/integrate?${queryParams.toString()}`, {
|
|
495
564
|
headers: {
|
|
496
565
|
authorization: `Bearer ${this.token}`,
|
|
497
566
|
},
|
|
@@ -509,13 +578,17 @@ class Cobalt {
|
|
|
509
578
|
/**
|
|
510
579
|
* Handle OAuth for the specified application.
|
|
511
580
|
* @private
|
|
512
|
-
* @param {
|
|
513
|
-
* @param {Object.<string, string>} [params] The key value pairs of auth data.
|
|
581
|
+
* @param {OAuthParams} params The OAuth parameters.
|
|
514
582
|
* @returns {Promise<Boolean>} Whether the user authenticated.
|
|
515
583
|
*/
|
|
516
|
-
private async oauth(
|
|
584
|
+
private async oauth({
|
|
585
|
+
slug,
|
|
586
|
+
authConfig,
|
|
587
|
+
payload,
|
|
588
|
+
autoClose = true,
|
|
589
|
+
}: OAuthParams): Promise<boolean> {
|
|
517
590
|
return new Promise((resolve, reject) => {
|
|
518
|
-
this.getOAuthUrl(slug,
|
|
591
|
+
this.getOAuthUrl({ slug, authConfig, payload })
|
|
519
592
|
.then(oauthUrl => {
|
|
520
593
|
const connectWindow = window.open(oauthUrl);
|
|
521
594
|
|
|
@@ -523,9 +596,10 @@ class Cobalt {
|
|
|
523
596
|
const interval = setInterval(() => {
|
|
524
597
|
this.getApp(slug)
|
|
525
598
|
.then(app => {
|
|
526
|
-
|
|
599
|
+
const oauthAccounts = app.connected_accounts?.filter(a => a.auth_type === AuthType.OAuth2 && a.status !== AuthStatus.Expired);
|
|
600
|
+
if (app && oauthAccounts?.some(a => authConfig ? a.auth_config_id === authConfig : true)) {
|
|
527
601
|
// close auth window
|
|
528
|
-
connectWindow && connectWindow.close();
|
|
602
|
+
if (autoClose) connectWindow && connectWindow.close();
|
|
529
603
|
// clear interval
|
|
530
604
|
clearInterval(interval);
|
|
531
605
|
// resovle status
|
|
@@ -554,12 +628,15 @@ class Cobalt {
|
|
|
554
628
|
|
|
555
629
|
/**
|
|
556
630
|
* Save auth data for the specified keybased application.
|
|
557
|
-
* @param {
|
|
558
|
-
* @param {Object.<string, string>} [payload] The key value pairs of auth data.
|
|
631
|
+
* @param {KeyBasedParams} params The key based parameters.
|
|
559
632
|
* @returns {Promise<Boolean>} Whether the auth data was saved successfully.
|
|
560
633
|
*/
|
|
561
|
-
private async keybased(
|
|
562
|
-
|
|
634
|
+
private async keybased({
|
|
635
|
+
slug,
|
|
636
|
+
authConfig,
|
|
637
|
+
payload,
|
|
638
|
+
}: KeyBasedParams): Promise<boolean> {
|
|
639
|
+
const res = await fetch(`${this.baseUrl}/api/v2/app/${slug}/save?auth_config_id=${authConfig}`, {
|
|
563
640
|
method: "POST",
|
|
564
641
|
headers: {
|
|
565
642
|
authorization: `Bearer ${this.token}`,
|
|
@@ -583,28 +660,34 @@ class Cobalt {
|
|
|
583
660
|
* Connects the specified application using the provided authentication type and optional auth data.
|
|
584
661
|
* @param params - The parameters for connecting the application.
|
|
585
662
|
* @param params.slug - The application slug.
|
|
663
|
+
* @param params.authConfig - The identifier of the auth config.
|
|
586
664
|
* @param params.type - The authentication type to use. If not provided, it defaults to `keybased` if payload is provided, otherwise `oauth2`.
|
|
587
665
|
* @param params.payload - key-value pairs of authentication data required for the specified auth type.
|
|
666
|
+
* @param params.autoClose - Whether to close the authentication window automatically. If not provided, it defaults to `true`.
|
|
588
667
|
* @returns A promise that resolves to true if the connection was successful, otherwise false.
|
|
589
668
|
* @throws Throws an error if the authentication type is invalid or the connection fails.
|
|
590
669
|
*/
|
|
591
670
|
public async connect({
|
|
592
671
|
slug,
|
|
672
|
+
authConfig,
|
|
593
673
|
type,
|
|
594
674
|
payload,
|
|
675
|
+
autoClose = true,
|
|
595
676
|
}: {
|
|
596
677
|
slug: string;
|
|
678
|
+
authConfig?: string;
|
|
597
679
|
type?: AuthType;
|
|
598
680
|
payload?: Record<string, string>;
|
|
681
|
+
autoClose?: boolean;
|
|
599
682
|
}): Promise<boolean> {
|
|
600
683
|
switch (type) {
|
|
601
684
|
case AuthType.OAuth2:
|
|
602
|
-
return this.oauth(slug, payload);
|
|
685
|
+
return this.oauth({ slug, authConfig, payload, autoClose });
|
|
603
686
|
case AuthType.KeyBased:
|
|
604
|
-
return this.keybased(slug, payload);
|
|
687
|
+
return this.keybased({ slug, authConfig, payload });
|
|
605
688
|
default:
|
|
606
|
-
if (payload) return this.keybased(slug, payload);
|
|
607
|
-
return this.oauth(slug);
|
|
689
|
+
if (payload) return this.keybased({ slug, authConfig, payload });
|
|
690
|
+
return this.oauth({ slug, authConfig });
|
|
608
691
|
}
|
|
609
692
|
}
|
|
610
693
|
|
|
@@ -612,10 +695,15 @@ class Cobalt {
|
|
|
612
695
|
* Disconnect the specified application and remove any associated data from Cobalt.
|
|
613
696
|
* @param {String} slug The application slug.
|
|
614
697
|
* @param {AuthType} [type] The authentication type to use. If not provided, it'll remove all the connected accounts.
|
|
698
|
+
* @param {String} [authConfig] The identifier of the auth config.
|
|
615
699
|
* @returns {Promise<unknown>}
|
|
616
700
|
*/
|
|
617
|
-
public async disconnect(slug: string, type?: AuthType): Promise<unknown> {
|
|
618
|
-
const
|
|
701
|
+
public async disconnect(slug: string, type?: AuthType, authConfig?: string): Promise<unknown> {
|
|
702
|
+
const queryParams = new URLSearchParams();
|
|
703
|
+
if (type) queryParams.append("auth_type", type);
|
|
704
|
+
if (authConfig) queryParams.append("auth_config_id", authConfig);
|
|
705
|
+
|
|
706
|
+
const res = await fetch(`${this.baseUrl}/api/v1/linked-acc/integration/${slug}?${queryParams.toString()}`, {
|
|
619
707
|
method: "DELETE",
|
|
620
708
|
headers: {
|
|
621
709
|
authorization: `Bearer ${this.token}`,
|
package/docs/assets/hierarchy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "eJyNjj0LwjAQhv/
|
|
1
|
+
window.hierarchyData = "eJyNjj0LwjAQhv/LzanSgorZ1bW7dAjJlQYvKVxSEEr+u5eliAg6vfB+8azA85wT6HvbngcFjCOhzX6O4q0gZpVoAoKGyxPtUrOrp4ycQMHDRwe6OxwVLEzS8VGS0VhM+8/6bsqBZGPJJHmHnFxT9822qeHkyTHGStSdhqJA5I3hhnn7Tb1hE35hfFn8QVJKeQEFbmDR"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "eJyVll9PwjAUxb/LnokICf7hDYkYowkEND4YH0p3kYXSNutthBi/uxs4to7urr72nPPrbXN3u/fvCGGH0TAaWVwvkKE1USfSDNfZGki7Nd1SuVjjVmTyJpFxNLz56Tjpl70GXzZfb06O1ZIJLHNcMGPAdI/rbq7Xd/bUWiScYaJkGU8kQrpiPCNUdBfTH1zVSh8ruUo+/ZSTTEGO1U51vpnxchwHjWqsJaSO3DFJQMQE4aC3Y2ZsLxSjQH+OdtSbSjcrob4IVmFpgUngCPGIc2UlNuEcEwW83wG3CMXe1In91nZ4U3ue1CDEJBFZ0t9adRMFfAA82c2MpWzrZ3p8FPZRaovNbVfKFOQJ9nfMQEyU5Voo2DNbgvAyDgoVnebfPFFERacwM7vM5g/Z+a4lHEb1qdcZjjbhbBMAn1sB1Fis6BTmVccMoX0seXwUNuQ+/3GTNescjM7OBSHYwhs0DBbKpryCxeyFrYyBo1wjXd5e9wZ9L6326tdpnqefoLl/ATXW+a9AQfr4Bb3G8gw="
|
package/docs/assets/search.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.searchData = "
|
|
1
|
+
window.searchData = "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";
|