@cobaltio/cobalt-js 9.1.0 → 9.2.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/cobalt.d.ts +26 -8
- package/cobalt.js +346 -387
- package/cobalt.ts +64 -19
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/Cobalt.html +27 -25
- package/docs/enums/AuthStatus.html +2 -2
- package/docs/enums/AuthType.html +2 -2
- package/docs/interfaces/Application.html +15 -14
- 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/ExecuteWorkflowPayload.html +5 -5
- package/docs/interfaces/Execution.html +2 -2
- 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 +7 -0
- package/docs/interfaces/PublicWorkflow.html +8 -8
- package/docs/interfaces/PublicWorkflowPayload.html +4 -4
- package/docs/interfaces/PublicWorkflowsPayload.html +2 -2
- 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 +200 -170
- package/docs/modules.html +1 -1
- package/package.json +1 -1
- package/tsconfig.json +12 -12
package/cobalt.ts
CHANGED
|
@@ -38,6 +38,8 @@ export interface Application {
|
|
|
38
38
|
};
|
|
39
39
|
/** The list of connected accounts for this application */
|
|
40
40
|
connected_accounts?: {
|
|
41
|
+
/** The connection identifier of the auth config. */
|
|
42
|
+
connection_id: string;
|
|
41
43
|
/** The identifier (username, email, etc.) of the connected account. */
|
|
42
44
|
identifier: unknown;
|
|
43
45
|
/** The auth type used to connect the account. */
|
|
@@ -92,6 +94,24 @@ export interface InputField {
|
|
|
92
94
|
}[];
|
|
93
95
|
}
|
|
94
96
|
|
|
97
|
+
export interface OAuthParams {
|
|
98
|
+
/** The application slug. */
|
|
99
|
+
slug: string;
|
|
100
|
+
/** The connection identifier. */
|
|
101
|
+
connection?: string;
|
|
102
|
+
/** The key value pairs of auth data. */
|
|
103
|
+
payload?: Record<string, string>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface KeyBasedParams {
|
|
107
|
+
/** The application slug. */
|
|
108
|
+
slug: string;
|
|
109
|
+
/** The connection identifier. */
|
|
110
|
+
connection?: string;
|
|
111
|
+
/** The key value pairs of auth data. */
|
|
112
|
+
payload?: Record<string, string>;
|
|
113
|
+
}
|
|
114
|
+
|
|
95
115
|
/** The payload object for config. */
|
|
96
116
|
export interface ConfigPayload {
|
|
97
117
|
/** The application slug. */
|
|
@@ -443,12 +463,22 @@ class Cobalt {
|
|
|
443
463
|
* Returns the auth URL that users can use to authenticate themselves to the
|
|
444
464
|
* specified application.
|
|
445
465
|
* @private
|
|
446
|
-
* @param {
|
|
447
|
-
* @param {Object.<string, string>} [params] The key value pairs of auth data.
|
|
466
|
+
* @param {OAuthParams} params The OAuth parameters.
|
|
448
467
|
* @returns {Promise<String>} The auth URL where users can authenticate themselves.
|
|
449
468
|
*/
|
|
450
|
-
private async getOAuthUrl(
|
|
451
|
-
|
|
469
|
+
private async getOAuthUrl({
|
|
470
|
+
slug,
|
|
471
|
+
connection,
|
|
472
|
+
payload,
|
|
473
|
+
}: OAuthParams): Promise<string> {
|
|
474
|
+
const queryParams = new URLSearchParams();
|
|
475
|
+
if (connection) queryParams.append("connection", connection);
|
|
476
|
+
if (typeof payload === "object") {
|
|
477
|
+
for (const [ key, value ] of Object.entries(payload)) {
|
|
478
|
+
queryParams.append(key, value);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
const res = await fetch(`${this.baseUrl}/api/v1/${slug}/integrate?${queryParams.toString()}`, {
|
|
452
482
|
headers: {
|
|
453
483
|
authorization: `Bearer ${this.token}`,
|
|
454
484
|
},
|
|
@@ -466,13 +496,16 @@ class Cobalt {
|
|
|
466
496
|
/**
|
|
467
497
|
* Handle OAuth for the specified application.
|
|
468
498
|
* @private
|
|
469
|
-
* @param {
|
|
470
|
-
* @param {Object.<string, string>} [params] The key value pairs of auth data.
|
|
499
|
+
* @param {OAuthParams} params The OAuth parameters.
|
|
471
500
|
* @returns {Promise<Boolean>} Whether the user authenticated.
|
|
472
501
|
*/
|
|
473
|
-
private async oauth(
|
|
502
|
+
private async oauth({
|
|
503
|
+
slug,
|
|
504
|
+
connection,
|
|
505
|
+
payload,
|
|
506
|
+
}: OAuthParams): Promise<boolean> {
|
|
474
507
|
return new Promise((resolve, reject) => {
|
|
475
|
-
this.getOAuthUrl(slug,
|
|
508
|
+
this.getOAuthUrl({ slug, connection, payload })
|
|
476
509
|
.then(oauthUrl => {
|
|
477
510
|
const connectWindow = window.open(oauthUrl);
|
|
478
511
|
|
|
@@ -480,7 +513,8 @@ class Cobalt {
|
|
|
480
513
|
const interval = setInterval(() => {
|
|
481
514
|
this.getApp(slug)
|
|
482
515
|
.then(app => {
|
|
483
|
-
|
|
516
|
+
const oauthAccounts = app.connected_accounts?.filter(a => a.auth_type === AuthType.OAuth2 && a.status === AuthStatus.Active);
|
|
517
|
+
if (app && oauthAccounts?.some(a => connection ? a.connection_id === connection : true)) {
|
|
484
518
|
// close auth window
|
|
485
519
|
connectWindow && connectWindow.close();
|
|
486
520
|
// clear interval
|
|
@@ -511,12 +545,15 @@ class Cobalt {
|
|
|
511
545
|
|
|
512
546
|
/**
|
|
513
547
|
* Save auth data for the specified keybased application.
|
|
514
|
-
* @param {
|
|
515
|
-
* @param {Object.<string, string>} [payload] The key value pairs of auth data.
|
|
548
|
+
* @param {KeyBasedParams} params The key based parameters.
|
|
516
549
|
* @returns {Promise<Boolean>} Whether the auth data was saved successfully.
|
|
517
550
|
*/
|
|
518
|
-
private async keybased(
|
|
519
|
-
|
|
551
|
+
private async keybased({
|
|
552
|
+
slug,
|
|
553
|
+
connection,
|
|
554
|
+
payload,
|
|
555
|
+
}: KeyBasedParams): Promise<boolean> {
|
|
556
|
+
const res = await fetch(`${this.baseUrl}/api/v2/app/${slug}/save?connection=${connection}`, {
|
|
520
557
|
method: "POST",
|
|
521
558
|
headers: {
|
|
522
559
|
authorization: `Bearer ${this.token}`,
|
|
@@ -540,6 +577,7 @@ class Cobalt {
|
|
|
540
577
|
* Connects the specified application using the provided authentication type and optional auth data.
|
|
541
578
|
* @param params - The parameters for connecting the application.
|
|
542
579
|
* @param params.slug - The application slug.
|
|
580
|
+
* @param params.connection - The connection identifier of the auth config.
|
|
543
581
|
* @param params.type - The authentication type to use. If not provided, it defaults to `keybased` if payload is provided, otherwise `oauth2`.
|
|
544
582
|
* @param params.payload - key-value pairs of authentication data required for the specified auth type.
|
|
545
583
|
* @returns A promise that resolves to true if the connection was successful, otherwise false.
|
|
@@ -547,21 +585,23 @@ class Cobalt {
|
|
|
547
585
|
*/
|
|
548
586
|
public async connect({
|
|
549
587
|
slug,
|
|
588
|
+
connection,
|
|
550
589
|
type,
|
|
551
590
|
payload,
|
|
552
591
|
}: {
|
|
553
592
|
slug: string;
|
|
593
|
+
connection?: string;
|
|
554
594
|
type?: AuthType;
|
|
555
595
|
payload?: Record<string, string>;
|
|
556
596
|
}): Promise<boolean> {
|
|
557
597
|
switch (type) {
|
|
558
598
|
case AuthType.OAuth2:
|
|
559
|
-
return this.oauth(slug, payload);
|
|
599
|
+
return this.oauth({ slug, connection, payload });
|
|
560
600
|
case AuthType.KeyBased:
|
|
561
|
-
return this.keybased(slug, payload);
|
|
601
|
+
return this.keybased({ slug, connection, payload });
|
|
562
602
|
default:
|
|
563
|
-
if (payload) return this.keybased(slug, payload);
|
|
564
|
-
return this.oauth(slug);
|
|
603
|
+
if (payload) return this.keybased({ slug, connection, payload });
|
|
604
|
+
return this.oauth({ slug, connection });
|
|
565
605
|
}
|
|
566
606
|
}
|
|
567
607
|
|
|
@@ -569,10 +609,15 @@ class Cobalt {
|
|
|
569
609
|
* Disconnect the specified application and remove any associated data from Cobalt.
|
|
570
610
|
* @param {String} slug The application slug.
|
|
571
611
|
* @param {AuthType} [type] The authentication type to use. If not provided, it'll remove all the connected accounts.
|
|
612
|
+
* @param {String} [connection] The connection identifier of the auth config.
|
|
572
613
|
* @returns {Promise<unknown>}
|
|
573
614
|
*/
|
|
574
|
-
public async disconnect(slug: string, type?: AuthType): Promise<unknown> {
|
|
575
|
-
const
|
|
615
|
+
public async disconnect(slug: string, type?: AuthType, connection?: string): Promise<unknown> {
|
|
616
|
+
const queryParams = new URLSearchParams();
|
|
617
|
+
if (type) queryParams.append("auth_type", type);
|
|
618
|
+
if (connection) queryParams.append("connection", connection);
|
|
619
|
+
|
|
620
|
+
const res = await fetch(`${this.baseUrl}/api/v1/linked-acc/integration/${slug}?${queryParams.toString()}`, {
|
|
576
621
|
method: "DELETE",
|
|
577
622
|
headers: {
|
|
578
623
|
authorization: `Bearer ${this.token}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "eJyVlNFKwzAUht8l18PhQJHdqSgMhZWpeCFenLWnNixLQ88JbojvLp3OLi49jbf5v/9rOEn68qEYN6ym6tJz9cDAntRIOeBKTRVav6Zxl5xUvDZqpFbaFmp68TkK2o9bh7Fuu97fvK6XYLjr5QaIkMbf62HvdBJ80zmjc2Bd266uLWNTQo40PshDzeTs/GgDc9dyFBUFhKyypX7rcbTRcPlWoykEwy4f1mSwNTVIoh9iWPVcN6vS1O+Ca49IspsN5p5xj0objKPD8r6L8JtKipl1nvun38WS5A63V0BYZNDAOn6ZQkSS3cMSTdSxS6TqvH13wiYOckmT+aXRuXgBQiRdJp1/lExXU7qbEuQLb1D6OxzkkubJFcA4/DojnKRNmec/JvkHXSC52hKmaPfssf71C1D9NS0="
|
package/docs/assets/search.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.searchData = "
|
|
1
|
+
window.searchData = "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";
|