@jskit-ai/connectors-catalog 0.2.12 → 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.
Files changed (84) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/docs/ai-upstream-notices.md +1 -1
  3. package/docs/ai.md +9 -0
  4. package/package.json +3 -3
  5. package/src/shared/ai-definition.js +68 -0
  6. package/src/shared/ai-framework-models.json +7334 -0
  7. package/src/shared/ai-models.json +1 -7329
  8. package/src/shared/ai.js +8 -59
  9. package/src/shared/definitions.js +2 -2
  10. package/test/ai.test.js +16 -0
  11. package/test/airtable.test.js +3 -4
  12. package/test/algolia.test.js +3 -3
  13. package/test/amazon-redshift.test.js +3 -3
  14. package/test/amplitude.test.js +3 -3
  15. package/test/apify.test.js +3 -4
  16. package/test/apollo-io.test.js +3 -4
  17. package/test/asana.test.js +3 -4
  18. package/test/ashby.test.js +3 -4
  19. package/test/atlassian.test.js +3 -3
  20. package/test/attention.test.js +3 -4
  21. package/test/aws.test.js +3 -3
  22. package/test/brevo.test.js +3 -4
  23. package/test/calendly.test.js +4 -5
  24. package/test/canva.test.js +3 -3
  25. package/test/chargebee.test.js +3 -3
  26. package/test/clickhouse.test.js +3 -3
  27. package/test/confidence.test.js +3 -3
  28. package/test/databricks.test.js +3 -3
  29. package/test/dbt-semantic-layer.test.js +3 -3
  30. package/test/designMcp.test.js +3 -3
  31. package/test/elevenlabs.test.js +3 -4
  32. package/test/firebase-cloud-messaging.test.js +3 -3
  33. package/test/firecrawl.test.js +3 -4
  34. package/test/gemini-enterprise.test.js +3 -3
  35. package/test/github-api.test.js +4 -5
  36. package/test/gitlab-api.test.js +4 -5
  37. package/test/gong.test.js +3 -3
  38. package/test/google-ads.test.js +3 -3
  39. package/test/google-maps-platform.test.js +3 -3
  40. package/test/google.test.js +3 -4
  41. package/test/granola.test.js +3 -3
  42. package/test/hex.test.js +3 -3
  43. package/test/heygen.test.js +3 -4
  44. package/test/hubspot.test.js +3 -4
  45. package/test/inngest.test.js +3 -3
  46. package/test/lightspeed.test.js +3 -3
  47. package/test/linear.test.js +3 -4
  48. package/test/linkedin.test.js +3 -3
  49. package/test/mailgun.test.js +3 -4
  50. package/test/mapbox.test.js +3 -3
  51. package/test/mcp.test.js +3 -3
  52. package/test/microsoft-fabric.test.js +3 -3
  53. package/test/microsoft.test.js +3 -3
  54. package/test/n8nOAuth.test.js +3 -4
  55. package/test/notionOAuth.test.js +5 -6
  56. package/test/oura.test.js +3 -3
  57. package/test/paddlePermissions.test.js +3 -4
  58. package/test/pipedriveOAuth.test.js +3 -4
  59. package/test/posthog.test.js +3 -3
  60. package/test/prestashop.test.js +3 -3
  61. package/test/resend.test.js +3 -3
  62. package/test/salesforce.test.js +3 -3
  63. package/test/semrush.test.js +3 -3
  64. package/test/sharedCatalogModels.test.js +21 -0
  65. package/test/shopify.test.js +3 -3
  66. package/test/slack.test.js +3 -3
  67. package/test/snowflake.test.js +3 -3
  68. package/test/tally.test.js +3 -4
  69. package/test/telegram.test.js +3 -4
  70. package/test/testDirectories.test.js +16 -0
  71. package/test/tiktok.test.js +3 -3
  72. package/test/tokens.test.js +3 -3
  73. package/test/twilio.test.js +3 -3
  74. package/test/twitch.test.js +3 -3
  75. package/test/wave.test.js +3 -3
  76. package/test/wix.test.js +3 -3
  77. package/test/wiz.test.js +3 -3
  78. package/test/wordpress-com.test.js +3 -3
  79. package/test/wordpress.test.js +3 -3
  80. package/test/workday.test.js +3 -3
  81. package/test/x-twitter.test.js +3 -3
  82. package/test/xero.test.js +3 -3
  83. package/test/zoho-books.test.js +3 -3
  84. 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 { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "firebase-connector-"));
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 = {
@@ -1,14 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "firecrawl-repair-"));
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 { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "gemini-enterprise-connector-"));
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: {
@@ -1,14 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "github-oauth-test-"));
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 mkdtemp(path.join(tmpdir(), "github-content-test-"));
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({
@@ -1,14 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "gitlab-oauth-test-"));
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 mkdtemp(path.join(tmpdir(), "gitlab-content-test-"));
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 { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "gong-connector-"));
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 = [];
@@ -1,7 +1,6 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "google-ads-connector-"));
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 { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "google-maps-connector-"));
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 = [];
@@ -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 { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "google-connector-"));
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 = {
@@ -1,12 +1,12 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "granola-connector-"));
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 { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "hex-connector-"));
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];
@@ -1,16 +1,15 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "heygen-oauth-"));
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 = {
@@ -1,14 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "hubspot-oauth-test-"));
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" };
@@ -1,12 +1,12 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readFile, readdir, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "inngest-connectors-"));
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 = [];
@@ -1,12 +1,12 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "lightspeed-connector-"));
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 };
@@ -1,14 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "linear-oauth-test-"));
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" };
@@ -1,19 +1,19 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "linkedin-connector-"));
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",
@@ -1,11 +1,10 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "mailgun-repair-"));
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 };
@@ -1,12 +1,12 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "mapbox-connector-"));
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 { mkdtemp, readFile, readdir, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "mcp-connectors-"));
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 { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "fabric-connector-"));
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,
@@ -1,8 +1,7 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
- import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
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 mkdtemp(path.join(tmpdir(), "microsoft-connector-"));
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] } };
@@ -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 { mkdtemp, rm } = await import("node:fs/promises");
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 mkdtemp(join(tmpdir(), "n8n-oauth-"));
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";
@@ -1,14 +1,13 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mkdtemp, rm } from "node:fs/promises";
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 mkdtemp(join(tmpdir(), "notion-oauth-"));
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 mkdtemp(join(tmpdir(), "notion-oauth-errors-"));
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 mkdtemp(join(tmpdir(), "notion-mcp-"));
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";