@jskit-ai/connectors-catalog 0.2.11 → 0.2.13
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/CHANGELOG.md +1 -0
- package/docs/ai-upstream-notices.md +1 -1
- package/docs/ai.md +9 -0
- package/package.json +4 -4
- package/patterns/aws-storage-queries/example/formats/package.json +1 -1
- package/src/shared/ai-definition.js +68 -0
- package/src/shared/ai-framework-models.json +7334 -0
- package/src/shared/ai-models.json +1 -7329
- package/src/shared/ai.js +8 -59
- package/src/shared/definitions.js +2 -2
- package/test/ai.test.js +16 -0
- package/test/airtable.test.js +3 -4
- package/test/algolia.test.js +3 -3
- package/test/amazon-redshift.test.js +3 -3
- package/test/amplitude.test.js +3 -3
- package/test/apify.test.js +3 -4
- package/test/apollo-io.test.js +3 -4
- package/test/asana.test.js +3 -4
- package/test/ashby.test.js +3 -4
- package/test/atlassian.test.js +3 -3
- package/test/attention.test.js +3 -4
- package/test/aws.test.js +3 -3
- package/test/brevo.test.js +3 -4
- package/test/calendly.test.js +4 -5
- package/test/canva.test.js +3 -3
- package/test/chargebee.test.js +3 -3
- package/test/clickhouse.test.js +3 -3
- package/test/confidence.test.js +3 -3
- package/test/databricks.test.js +3 -3
- package/test/dbt-semantic-layer.test.js +3 -3
- package/test/designMcp.test.js +3 -3
- package/test/elevenlabs.test.js +3 -4
- package/test/firebase-cloud-messaging.test.js +3 -3
- package/test/firecrawl.test.js +3 -4
- package/test/gemini-enterprise.test.js +3 -3
- package/test/github-api.test.js +4 -5
- package/test/gitlab-api.test.js +4 -5
- package/test/gong.test.js +3 -3
- package/test/google-ads.test.js +3 -3
- package/test/google-maps-platform.test.js +3 -3
- package/test/google.test.js +3 -4
- package/test/granola.test.js +3 -3
- package/test/hex.test.js +3 -3
- package/test/heygen.test.js +3 -4
- package/test/hubspot.test.js +3 -4
- package/test/inngest.test.js +3 -3
- package/test/lightspeed.test.js +3 -3
- package/test/linear.test.js +3 -4
- package/test/linkedin.test.js +3 -3
- package/test/mailgun.test.js +3 -4
- package/test/mapbox.test.js +3 -3
- package/test/mcp.test.js +3 -3
- package/test/microsoft-fabric.test.js +3 -3
- package/test/microsoft.test.js +3 -3
- package/test/n8nOAuth.test.js +3 -4
- package/test/notionOAuth.test.js +5 -6
- package/test/oura.test.js +3 -3
- package/test/paddlePermissions.test.js +3 -4
- package/test/pipedriveOAuth.test.js +3 -4
- package/test/posthog.test.js +3 -3
- package/test/prestashop.test.js +3 -3
- package/test/resend.test.js +3 -3
- package/test/salesforce.test.js +3 -3
- package/test/semrush.test.js +3 -3
- package/test/sharedCatalogModels.test.js +21 -0
- package/test/shopify.test.js +3 -3
- package/test/slack.test.js +3 -3
- package/test/snowflake.test.js +3 -3
- package/test/tally.test.js +3 -4
- package/test/telegram.test.js +3 -4
- package/test/testDirectories.test.js +16 -0
- package/test/tiktok.test.js +3 -3
- package/test/tokens.test.js +3 -3
- package/test/twilio.test.js +3 -3
- package/test/twitch.test.js +3 -3
- package/test/wave.test.js +3 -3
- package/test/wix.test.js +3 -3
- package/test/wiz.test.js +3 -3
- package/test/wordpress-com.test.js +3 -3
- package/test/wordpress.test.js +3 -3
- package/test/workday.test.js +3 -3
- package/test/x-twitter.test.js +3 -3
- package/test/xero.test.js +3 -3
- package/test/zoho-books.test.js +3 -3
- package/test/zoho-crm.test.js +3 -3
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { generateKeyPair, exportPKCS8, jwtVerify } from "jose";
|
|
7
6
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
@@ -10,6 +9,7 @@ import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/
|
|
|
10
9
|
import { firebaseCloudMessagingProvider as provider } from "../src/server/firebase-cloud-messaging.js";
|
|
11
10
|
import { firebaseMessagingScope } from "../src/shared/firebase-cloud-messaging.js";
|
|
12
11
|
import { firebaseCloudMessagingWebConfiguration } from "../src/client/firebase-cloud-messaging.js";
|
|
12
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
13
13
|
|
|
14
14
|
const keys = await generateKeyPair("RS256", { extractable: true });
|
|
15
15
|
const account = { type: "service_account", project_id: "sender-project", private_key_id: "a".repeat(40),
|
|
@@ -20,7 +20,7 @@ const context = { applicationId: "notifications-app", subjectId: "team" };
|
|
|
20
20
|
const input = { context, integrationId: "push" };
|
|
21
21
|
const message = { fid: "fixture-installation-id", notification: { title: "Order ready", body: "Your order is ready." }, data: { orderId: "42" } };
|
|
22
22
|
async function fixture(t) {
|
|
23
|
-
const directory = await
|
|
23
|
+
const directory = await makeTestDirectory("firebase-connector-");
|
|
24
24
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
25
25
|
const state = { now: Date.now(), credential: JSON.stringify(account, null, 2), grants: [], requests: [], status: 200, tokenStatus: 200 };
|
|
26
26
|
const options = {
|
package/test/firecrawl.test.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { firecrawlProvider } from "../src/server/firecrawl.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
test("Firecrawl searches and imports bounded crawl pages without leaking the key or replaying paid work", async t => {
|
|
11
|
-
const directory = await
|
|
10
|
+
const directory = await makeTestDirectory("firecrawl-repair-");
|
|
12
11
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
13
12
|
const requests = []; let status = 200; let fail = false; let malformed = false; let deny = false; let key = "fixture-key";
|
|
14
13
|
const service = createConnectionService({
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { geminiEnterpriseProvider } from "../src/server/gemini-enterprise.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const scope = "https://www.googleapis.com/auth/cloud-platform";
|
|
12
12
|
const context = { applicationId: "app-one", subjectId: "owner-one" };
|
|
@@ -15,7 +15,7 @@ const callback = "https://app.example.test/oauth/gemini-enterprise/callback";
|
|
|
15
15
|
const searchPage = { results: [{ id: "policy", document: { id: "policy", structData: { title: "Holiday policy" } } }], totalSize: 2, attributionToken: "search-reference", nextPageToken: "next+/=&" };
|
|
16
16
|
|
|
17
17
|
async function fixture(t, { location = "global", accountMode = "shared" } = {}) {
|
|
18
|
-
const directory = await
|
|
18
|
+
const directory = await makeTestDirectory("gemini-enterprise-connector-");
|
|
19
19
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
20
20
|
const configuration = { schemaVersion: 1, registrations: { google: { source: "own", clientId: "fixture-google-client",
|
|
21
21
|
clientSecretRef: "env:GEMINI_SECRET", callbackUrlRef: "env:GEMINI_CALLBACK" } }, integrations: {
|
package/test/github-api.test.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { githubApiProvider } from "../src/server/github-api.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
for (const perUser of [false, true]) test(`GitHub OAuth ${perUser ? "per-user non-expiring" : "shared rotating"} grants preserve protocol and ownership`, async (t) => {
|
|
11
|
-
const directory = await
|
|
10
|
+
const directory = await makeTestDirectory("github-oauth-test-");
|
|
12
11
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
13
12
|
const callback = "https://example.test/integrations/github-api/callback";
|
|
14
13
|
const context = { applicationId: "app", subjectId: "owner" };
|
|
@@ -104,7 +103,7 @@ test("GitHub token normalization rejects malformed grants and retains OAuth erro
|
|
|
104
103
|
});
|
|
105
104
|
|
|
106
105
|
test("GitHub repository reads and issue/PR writes preserve paths, pagination and uncertain outcomes", async t => {
|
|
107
|
-
const directory = await
|
|
106
|
+
const directory = await makeTestDirectory("github-content-test-");
|
|
108
107
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
109
108
|
const requests = []; let status = 200, malformed = false, fail = false;
|
|
110
109
|
const service = createConnectionService({
|
package/test/gitlab-api.test.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { gitlabApiProvider } from "../src/server/gitlab-api.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
for (const perUser of [false, true]) test(`GitLab OAuth ${perUser ? "per-user non-expiring" : "shared rotating"} grants preserve protocol and ownership`, async (t) => {
|
|
11
|
-
const directory = await
|
|
10
|
+
const directory = await makeTestDirectory("gitlab-oauth-test-");
|
|
12
11
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
13
12
|
const callback = "https://example.test/integrations/gitlab-api/callback";
|
|
14
13
|
const context = { applicationId: "app", subjectId: "owner" };
|
|
@@ -102,7 +101,7 @@ for (const perUser of [false, true]) test(`GitLab OAuth ${perUser ? "per-user no
|
|
|
102
101
|
|
|
103
102
|
|
|
104
103
|
test("GitLab project paths, content and issue/MR writes use the selected host without replaying writes", async t => {
|
|
105
|
-
const directory = await
|
|
104
|
+
const directory = await makeTestDirectory("gitlab-content-test-");
|
|
106
105
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
107
106
|
const requests = []; let status = 200, fail = false;
|
|
108
107
|
const service = createConnectionService({
|
package/test/gong.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { gongProvider } from "../src/server/gong.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "sales-app", subjectId: "sales-team" };
|
|
12
12
|
const input = { context, integrationId: "sales" };
|
|
@@ -14,7 +14,7 @@ const users = { requestId: "fixture-request", users: [{ id: "123", emailAddress:
|
|
|
14
14
|
records: { totalRecords: 1, currentPageSize: 1, currentPageNumber: 0 } };
|
|
15
15
|
|
|
16
16
|
async function fixture(t, apiBaseUrl = "https://api.gong.io") {
|
|
17
|
-
const directory = await
|
|
17
|
+
const directory = await makeTestDirectory("gong-connector-");
|
|
18
18
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
19
19
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(5) }, activeKeyId: "current" });
|
|
20
20
|
const requests = [];
|
package/test/google-ads.test.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
@@ -10,6 +9,7 @@ import { createGoogleAdsSearchService } from "../src/server/google-ads-search.js
|
|
|
10
9
|
import { validateGoogleAdsSearchPlan } from "../src/shared/google-ads-search.js";
|
|
11
10
|
import { dispatchAdsSetup } from "../patterns/google-ads-search/example/ads-setup.js";
|
|
12
11
|
import { googleAdsProvider as provider } from "../src/server/google-ads.js";
|
|
12
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
13
13
|
|
|
14
14
|
const context = { applicationId: "ads-app", subjectId: "user-one" };
|
|
15
15
|
const input = { context, integrationId: "ads" };
|
|
@@ -21,7 +21,7 @@ const report = { results: [{ campaign: { id: "9007199254740993", name: "Fixture"
|
|
|
21
21
|
const query = "SELECT campaign.id, campaign.name, metrics.impressions, metrics.cost_micros FROM campaign WHERE campaign.name = 'A + B & 😀' LIMIT 20";
|
|
22
22
|
|
|
23
23
|
async function fixture(t, settings = { loginCustomerId: "9876543210" }) {
|
|
24
|
-
const directory = await
|
|
24
|
+
const directory = await makeTestDirectory("google-ads-connector-");
|
|
25
25
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
26
26
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(6) }, activeKeyId: "current" });
|
|
27
27
|
const configuration = { schemaVersion: 1, integrations: { ads: { provider: "google-ads", accountMode: "per-user", settings,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { googleMapsPlatformProvider } from "../src/server/google-maps-platform.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "app-one", subjectId: "team-one" };
|
|
12
12
|
const input = { context, integrationId: "maps" };
|
|
@@ -15,7 +15,7 @@ const places = { status: "OK", results: [{ formatted_address: "Perth WA, Austral
|
|
|
15
15
|
geometry: { location: { lat: -31.95, lng: 115.86 } }, address_components: [], types: ["locality"], partial_match: true }] };
|
|
16
16
|
|
|
17
17
|
async function fixture(t) {
|
|
18
|
-
const directory = await
|
|
18
|
+
const directory = await makeTestDirectory("google-maps-connector-");
|
|
19
19
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
20
20
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(5) }, activeKeyId: "current" });
|
|
21
21
|
const requests = [];
|
package/test/google.test.js
CHANGED
|
@@ -3,9 +3,7 @@ import { googleAnalyticsDefinition } from "../src/shared/google.js";
|
|
|
3
3
|
import { validateIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
4
4
|
import assert from "node:assert/strict";
|
|
5
5
|
import test from "node:test";
|
|
6
|
-
import {
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { tmpdir } from "node:os";
|
|
6
|
+
import { rm } from "node:fs/promises";
|
|
9
7
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
10
8
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
11
9
|
import { gmailProvider } from "../src/server/gmail.js";
|
|
@@ -16,6 +14,7 @@ import { googleSlidesProvider } from "../src/server/google-slides.js";
|
|
|
16
14
|
import { googleSearchConsoleProvider } from "../src/server/google-search-console.js";
|
|
17
15
|
|
|
18
16
|
import { bigqueryProvider } from "../src/server/bigquery.js";
|
|
17
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
19
18
|
|
|
20
19
|
const owner = { applicationId: "application", subjectId: "user-one" };
|
|
21
20
|
const callback = "https://application.example/connections/callback";
|
|
@@ -30,7 +29,7 @@ const cases = [
|
|
|
30
29
|
];
|
|
31
30
|
|
|
32
31
|
async function fixture(t, entry) {
|
|
33
|
-
const directory = await
|
|
32
|
+
const directory = await makeTestDirectory("google-connector-");
|
|
34
33
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
35
34
|
const scopes = entry.provider.scopes.filter((scope) => scope.recommended).map((scope) => scope.value);
|
|
36
35
|
const config = {
|
package/test/granola.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { granolaProvider, registerGranolaClient } from "../src/server/granola.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const noteId = "not_12345678901234";
|
|
12
12
|
const folderId = "fol_12345678901234";
|
|
@@ -18,7 +18,7 @@ const context = { applicationId: "app-one", subjectId: "owner-one" };
|
|
|
18
18
|
const args = { context, integrationId: "meetings" };
|
|
19
19
|
|
|
20
20
|
async function fixture(t) {
|
|
21
|
-
const directory = await
|
|
21
|
+
const directory = await makeTestDirectory("granola-connector-");
|
|
22
22
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
23
23
|
const state = { key: "grn_private-fixture-key", status: 200, value: undefined, hang: false };
|
|
24
24
|
const requests = [];
|
package/test/hex.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { hexProvider, registerHexClient } from "../src/server/hex.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "assistant-host", subjectId: "account-owner" };
|
|
12
12
|
const input = { context, integrationId: "analysis" };
|
|
@@ -15,7 +15,7 @@ const scopes = ["openid", "profile", "email", "offline_access"];
|
|
|
15
15
|
const discovery = { tools: [{ name: "search_projects", inputSchema: { type: "object", properties: { query: { type: "string" } } } }] };
|
|
16
16
|
|
|
17
17
|
async function fixture(t, endpoint = "standard") {
|
|
18
|
-
const directory = await
|
|
18
|
+
const directory = await makeTestDirectory("hex-connector-");
|
|
19
19
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
20
20
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(3) }, activeKeyId: "current" });
|
|
21
21
|
const origin = { standard: "https://app.hex.tech", eu: "https://eu.hex.tech", hipaa: "https://hc.hex.tech" }[endpoint];
|
package/test/heygen.test.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { heygenProvider, registerHeyGenClient } from "../src/server/heygen.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
const context = { applicationId: "app-one", subjectId: "owner-one" };
|
|
11
10
|
const args = { context, integrationId: "meetings" };
|
|
12
11
|
async function fixture(t) {
|
|
13
|
-
const directory = await
|
|
12
|
+
const directory = await makeTestDirectory("heygen-oauth-");
|
|
14
13
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
15
14
|
const requests = [];
|
|
16
15
|
const options = {
|
package/test/hubspot.test.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { hubspotProvider } from "../src/server/hubspot.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
for (const perUser of [false, true]) test(`HubSpot OAuth ${perUser ? "per-user" : "shared rotating"} grants preserve protocol and ownership`, async (t) => {
|
|
11
|
-
const directory = await
|
|
10
|
+
const directory = await makeTestDirectory("hubspot-oauth-test-");
|
|
12
11
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
13
12
|
const callback = "https://example.test/integrations/hubspot/callback";
|
|
14
13
|
const context = { applicationId: "app", subjectId: "owner" };
|
package/test/inngest.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
3
|
+
import { readFile, readdir, rm } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { inngestProvider } from "../src/server/inngest.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "workflow-app", subjectId: "workspace" };
|
|
12
12
|
const input = { context, integrationId: "jobs" };
|
|
@@ -14,7 +14,7 @@ const event = { name: "app/report.requested", data: { reportId: "42", filters: [
|
|
|
14
14
|
const appPage = { data: [{ id: "reports", name: "Reports", method: "SERVE", isArchived: false }], page: { cursor: null, hasMore: false, limit: 20 } };
|
|
15
15
|
|
|
16
16
|
async function fixture(t) {
|
|
17
|
-
const directory = await
|
|
17
|
+
const directory = await makeTestDirectory("inngest-connectors-");
|
|
18
18
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
19
19
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(8) }, activeKeyId: "current" });
|
|
20
20
|
const requests = [];
|
package/test/lightspeed.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { lightspeedProvider } from "../src/server/lightspeed.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "application-one", subjectId: "user-one" };
|
|
12
12
|
const args = { context, integrationId: "retail" };
|
|
@@ -16,7 +16,7 @@ const item = { id: "06bf537b-c783-11e6-f6b9-53a81bd6b215", version: 1690497245,
|
|
|
16
16
|
const page = { data: [item], version: { min: item.version, max: item.version } };
|
|
17
17
|
|
|
18
18
|
async function fixture(t, domainPrefix = "fixture-store", selectedScopes = scopes) {
|
|
19
|
-
const directory = await
|
|
19
|
+
const directory = await makeTestDirectory("lightspeed-connector-");
|
|
20
20
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
21
21
|
const api = `https://${domainPrefix}.retail.lightspeed.app`;
|
|
22
22
|
const state = { time: Date.now(), count: 0, status: 200, value: undefined, tokenStatus: 200, tokenPatch: {}, hang: false };
|
package/test/linear.test.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { linearProvider } from "../src/server/linear.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
for (const perUser of [false, true]) test(`Linear OAuth ${perUser ? "per-user" : "shared rotating"} grants preserve protocol and ownership`, async (t) => {
|
|
11
|
-
const directory = await
|
|
10
|
+
const directory = await makeTestDirectory("linear-oauth-test-");
|
|
12
11
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
13
12
|
const callback = "https://example.test/integrations/linear/callback";
|
|
14
13
|
const context = { applicationId: "app", subjectId: "owner" };
|
package/test/linkedin.test.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { validateIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { linkedinProvider as provider } from "../src/server/linkedin.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "linkedin-app", subjectId: "member-one" };
|
|
12
12
|
const input = { context, integrationId: "linkedin" };
|
|
13
13
|
const callback = "https://app.example.test/connections/linkedin/callback";
|
|
14
14
|
|
|
15
15
|
async function fixture(t) {
|
|
16
|
-
const directory = await
|
|
16
|
+
const directory = await makeTestDirectory("linkedin-connector-");
|
|
17
17
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
18
18
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(7) }, activeKeyId: "current" });
|
|
19
19
|
const configuration = { schemaVersion: 1, integrations: { linkedin: { provider: "linkedin", accountMode: "per-user",
|
package/test/mailgun.test.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
5
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
6
|
import { mailgunProvider } from "../src/server/mailgun.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
const context = { applicationId: "mail-app", subjectId: "business-mail" };
|
|
11
10
|
const domain = "mail.example.com";
|
|
@@ -14,7 +13,7 @@ const message = { domain, from: "Support <support@mail.example.com>", to: ["one@
|
|
|
14
13
|
const dns = { domain: { name: domain, state: "unverified" },
|
|
15
14
|
sending_dns_records: [{ record_type: "TXT", name: domain, value: "fixture-spf", valid: "unknown" }], receiving_dns_records: [] };
|
|
16
15
|
async function fixture(t, region = "us") {
|
|
17
|
-
const directory = await
|
|
16
|
+
const directory = await makeTestDirectory("mailgun-repair-");
|
|
18
17
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
19
18
|
const requests = [];
|
|
20
19
|
const state = { fail: false, status: 200, malformed: false, deny: false };
|
package/test/mapbox.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { mapboxProvider } from "../src/server/mapbox.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const context = { applicationId: "app-one", subjectId: "team-one" };
|
|
12
12
|
const input = { context, integrationId: "maps" };
|
|
@@ -14,7 +14,7 @@ const token = { code: "TokenValid", token: { usage: "sk", user: "fixture", autho
|
|
|
14
14
|
const places = { type: "FeatureCollection", features: [{ type: "Feature", geometry: { type: "Point", coordinates: [115.86, -31.95] }, properties: { name: "Perth" } }], attribution: "Fixture attribution" };
|
|
15
15
|
|
|
16
16
|
async function fixture(t) {
|
|
17
|
-
const directory = await
|
|
17
|
+
const directory = await makeTestDirectory("mapbox-connector-");
|
|
18
18
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
19
19
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(7) }, activeKeyId: "current" });
|
|
20
20
|
const requests = [];
|
package/test/mcp.test.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readFile, readdir, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { n8nProvider } from "../src/server/n8n.js";
|
|
10
9
|
import { sanityProvider } from "../src/server/sanity.js";
|
|
10
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
11
11
|
|
|
12
12
|
const context = { applicationId: "editor", subjectId: "assistant-owner" };
|
|
13
13
|
const input = { context, integrationId: "assistant" };
|
|
@@ -18,7 +18,7 @@ const cases = [
|
|
|
18
18
|
];
|
|
19
19
|
|
|
20
20
|
async function fixture(t, spec) {
|
|
21
|
-
const directory = await
|
|
21
|
+
const directory = await makeTestDirectory("mcp-connectors-");
|
|
22
22
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
23
23
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(4) }, activeKeyId: "current" });
|
|
24
24
|
const requests = [];
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { getProviderScopes, parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
9
8
|
import { microsoftFabricProvider } from "../src/server/microsoft-fabric.js";
|
|
9
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
10
10
|
|
|
11
11
|
const tenantId = "11111111-2222-3333-4444-555555555555";
|
|
12
12
|
const clientId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
|
|
@@ -19,7 +19,7 @@ const callback = "https://app.example.test/oauth/fabric/callback";
|
|
|
19
19
|
const schema = { __schema: { types: [{ name: "Query", kind: "OBJECT" }], queryType: { name: "Query" }, mutationType: null } };
|
|
20
20
|
|
|
21
21
|
async function fixture(t, grantType = "authorization_code") {
|
|
22
|
-
const directory = await
|
|
22
|
+
const directory = await makeTestDirectory("fabric-connector-");
|
|
23
23
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
24
24
|
const machine = grantType === "client_credentials";
|
|
25
25
|
const configuration = { schemaVersion: 1, registrations: { fabric: { source: "own", grantType, clientId,
|
package/test/microsoft.test.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import test from "node:test";
|
|
3
|
-
import {
|
|
3
|
+
import { readdir, readFile, rm } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
7
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
8
7
|
import { parseIntegrationConfiguration } from "../../connectors-core/src/shared/configuration.js";
|
|
@@ -14,6 +13,7 @@ import { microsoftExcelProvider } from "../src/server/microsoft-excel.js";
|
|
|
14
13
|
import { microsoftTeamsProvider } from "../src/server/microsoft-teams.js";
|
|
15
14
|
import { microsoftOneNoteProvider } from "../src/server/microsoft-onenote.js";
|
|
16
15
|
import { microsoftSharePointProvider } from "../src/server/microsoft-sharepoint.js";
|
|
16
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
17
17
|
|
|
18
18
|
const owner = { applicationId: "app-one", subjectId: "user-one" };
|
|
19
19
|
const callback = "https://application.example/connectors/callback";
|
|
@@ -29,7 +29,7 @@ const cases = [
|
|
|
29
29
|
];
|
|
30
30
|
|
|
31
31
|
async function fixture(t, entry) {
|
|
32
|
-
const directory = await
|
|
32
|
+
const directory = await makeTestDirectory("microsoft-connector-");
|
|
33
33
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
34
34
|
const requests = [];
|
|
35
35
|
const state = { time: Date.now(), scope: (entry.scopes || [entry.scope]).join(" "), status: 200, tokenStatus: 200, tokenCount: 0, response: { value: [entry.item] } };
|
package/test/n8nOAuth.test.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
3
|
import { n8nProvider, discoverN8nOAuth, registerN8nClient } from "../src/server/n8n.js";
|
|
4
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
4
5
|
|
|
5
6
|
function fixture(resource, issuer) {
|
|
6
7
|
const calls = [];
|
|
@@ -110,14 +111,12 @@ test("n8n rejects unsupported registration scopes before POST and never retries
|
|
|
110
111
|
|
|
111
112
|
|
|
112
113
|
test("n8n saved discovery drives project-owned consent, encrypted grants and refresh without rediscovery", async (t) => {
|
|
113
|
-
const {
|
|
114
|
-
const { tmpdir } = await import("node:os");
|
|
115
|
-
const { join } = await import("node:path");
|
|
114
|
+
const { rm } = await import("node:fs/promises");
|
|
116
115
|
const { createConnectionService } = await import("../../connectors-core/src/server/index.js");
|
|
117
116
|
const { createFileConnectionStore, createCredentialProtection } = await import("../../connectors-core/src/server/fileStorage.js");
|
|
118
117
|
const f = fixture("https://tools.example/team/mcp-server/http", "https://login.example/n8n");
|
|
119
118
|
const discovery = await discoverN8nOAuth({ serverUrl: f.protectedResource.resource }, f);
|
|
120
|
-
const directory = await
|
|
119
|
+
const directory = await makeTestDirectory("n8n-oauth-");
|
|
121
120
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
122
121
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(3) }, activeKeyId: "current" });
|
|
123
122
|
const callback = "https://app.example/integrations/n8n/callback";
|
package/test/notionOAuth.test.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import {
|
|
4
|
-
import { tmpdir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
3
|
+
import { rm } from "node:fs/promises";
|
|
6
4
|
import { notionProvider, registerNotionMcpClient } from "../src/server/notion.js";
|
|
7
5
|
import { createConnectionService } from "../../connectors-core/src/server/index.js";
|
|
8
6
|
import { createFileConnectionStore, createCredentialProtection } from "../../connectors-core/src/server/fileStorage.js";
|
|
7
|
+
import { makeTestDirectory } from "../../../tooling/test-support/testDirectory.mjs";
|
|
9
8
|
|
|
10
9
|
test("Notion exchanges JSON with Basic auth and persists rotated refresh tokens across restart", async (t) => {
|
|
11
|
-
const directory = await
|
|
10
|
+
const directory = await makeTestDirectory("notion-oauth-");
|
|
12
11
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
13
12
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(9) }, activeKeyId: "current" });
|
|
14
13
|
const callback = "https://app.example/integrations/notion/callback";
|
|
@@ -66,7 +65,7 @@ test("Notion exchanges JSON with Basic auth and persists rotated refresh tokens
|
|
|
66
65
|
});
|
|
67
66
|
|
|
68
67
|
test("Notion rejects failed or malformed token exchanges without replay or secret disclosure", async (t) => {
|
|
69
|
-
const directory = await
|
|
68
|
+
const directory = await makeTestDirectory("notion-oauth-errors-");
|
|
70
69
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
71
70
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(8) }, activeKeyId: "current" });
|
|
72
71
|
const callback = "https://app.example/integrations/notion/callback";
|
|
@@ -103,7 +102,7 @@ test("Notion rejects failed or malformed token exchanges without replay or secre
|
|
|
103
102
|
});
|
|
104
103
|
|
|
105
104
|
test("Notion hosted MCP uses separate PKCE/form credentials and tool discovery", async (t) => {
|
|
106
|
-
const directory = await
|
|
105
|
+
const directory = await makeTestDirectory("notion-mcp-");
|
|
107
106
|
t.after(() => rm(directory, { recursive: true, force: true }));
|
|
108
107
|
const protection = createCredentialProtection({ keys: { current: new Uint8Array(32).fill(4) }, activeKeyId: "current" });
|
|
109
108
|
const callback = "https://app.example/integrations/notion/callback";
|