@squadbase/vite-server 0.1.12-dev.a9ac647 → 0.1.17-dev.3b633bb
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/dist/cli/index.js +14375 -1652
- package/dist/connectors/airtable-oauth.js +282 -46
- package/dist/connectors/airtable.js +319 -51
- package/dist/connectors/amplitude.js +322 -47
- package/dist/connectors/anthropic.js +135 -47
- package/dist/connectors/asana.js +327 -49
- package/dist/connectors/attio.js +302 -49
- package/dist/connectors/aws-billing.js +287 -46
- package/dist/connectors/azure-sql.js +421 -102
- package/dist/connectors/backlog-api-key.js +317 -47
- package/dist/connectors/clickup.js +338 -49
- package/dist/connectors/cosmosdb.js +305 -50
- package/dist/connectors/customerio.js +319 -47
- package/dist/connectors/dbt.js +340 -47
- package/dist/connectors/freshdesk.js +342 -53
- package/dist/connectors/freshsales.js +333 -52
- package/dist/connectors/freshservice.js +361 -53
- package/dist/connectors/gamma.js +327 -52
- package/dist/connectors/gemini.js +134 -47
- package/dist/connectors/github.js +386 -49
- package/dist/connectors/gmail-oauth.js +204 -7
- package/dist/connectors/gmail.js +350 -47
- package/dist/connectors/google-ads.js +288 -46
- package/dist/connectors/google-analytics-oauth.js +310 -46
- package/dist/connectors/google-analytics.js +547 -87
- package/dist/connectors/google-audit-log.js +438 -47
- package/dist/connectors/google-calendar-oauth.js +259 -46
- package/dist/connectors/google-calendar.js +359 -47
- package/dist/connectors/google-docs.js +220 -6
- package/dist/connectors/google-drive.js +262 -5
- package/dist/connectors/google-search-console-oauth.js +256 -46
- package/dist/connectors/google-sheets.js +272 -47
- package/dist/connectors/google-slides.js +205 -6
- package/dist/connectors/grafana.js +332 -49
- package/dist/connectors/hubspot-oauth.js +208 -5
- package/dist/connectors/hubspot.js +306 -49
- package/dist/connectors/influxdb.js +416 -51
- package/dist/connectors/intercom-oauth.js +210 -5
- package/dist/connectors/intercom.js +302 -49
- package/dist/connectors/jdbc.js +762 -110
- package/dist/connectors/jira-api-key.js +326 -47
- package/dist/connectors/kintone-api-token.js +281 -47
- package/dist/connectors/kintone.js +328 -47
- package/dist/connectors/linear.js +330 -49
- package/dist/connectors/linkedin-ads.js +268 -50
- package/dist/connectors/mailchimp-oauth.js +268 -46
- package/dist/connectors/mailchimp.js +320 -49
- package/dist/connectors/meta-ads-oauth.js +273 -48
- package/dist/connectors/meta-ads.js +285 -50
- package/dist/connectors/mixpanel.js +338 -47
- package/dist/connectors/monday.js +360 -49
- package/dist/connectors/mongodb.js +319 -57
- package/dist/connectors/notion-oauth.js +231 -5
- package/dist/connectors/notion.js +323 -51
- package/dist/connectors/openai.js +134 -47
- package/dist/connectors/oracle.js +454 -103
- package/dist/connectors/outlook-oauth.js +204 -5
- package/dist/connectors/powerbi-oauth.js +498 -5
- package/dist/connectors/salesforce.js +384 -49
- package/dist/connectors/semrush.js +609 -49
- package/dist/connectors/sentry.js +289 -50
- package/dist/connectors/shopify-oauth.js +187 -5
- package/dist/connectors/shopify.js +357 -47
- package/dist/connectors/sqlserver.js +415 -102
- package/dist/connectors/stripe-api-key.js +269 -46
- package/dist/connectors/stripe-oauth.js +202 -5
- package/dist/connectors/supabase.js +303 -48
- package/dist/connectors/tableau.js +536 -163
- package/dist/connectors/tiktok-ads.js +279 -48
- package/dist/connectors/wix-store.js +320 -49
- package/dist/connectors/zendesk-oauth.js +239 -5
- package/dist/connectors/zendesk.js +358 -47
- package/dist/index.d.ts +149 -1
- package/dist/index.js +15057 -2117
- package/dist/main.js +15005 -2073
- package/dist/vite-plugin.js +14752 -2019
- package/package.json +1 -1
|
@@ -1,48 +1,60 @@
|
|
|
1
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
+
var __esm = (fn, res) => function __init() {
|
|
3
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
4
|
+
};
|
|
5
|
+
|
|
1
6
|
// ../connectors/src/parameter-definition.ts
|
|
2
|
-
var ParameterDefinition
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
7
|
+
var ParameterDefinition;
|
|
8
|
+
var init_parameter_definition = __esm({
|
|
9
|
+
"../connectors/src/parameter-definition.ts"() {
|
|
10
|
+
"use strict";
|
|
11
|
+
ParameterDefinition = class {
|
|
12
|
+
slug;
|
|
13
|
+
name;
|
|
14
|
+
description;
|
|
15
|
+
envVarBaseKey;
|
|
16
|
+
type;
|
|
17
|
+
secret;
|
|
18
|
+
required;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.slug = config.slug;
|
|
21
|
+
this.name = config.name;
|
|
22
|
+
this.description = config.description;
|
|
23
|
+
this.envVarBaseKey = config.envVarBaseKey;
|
|
24
|
+
this.type = config.type;
|
|
25
|
+
this.secret = config.secret;
|
|
26
|
+
this.required = config.required;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the parameter value from a ConnectorConnectionObject.
|
|
30
|
+
*/
|
|
31
|
+
getValue(connection2) {
|
|
32
|
+
const param = connection2.parameters.find(
|
|
33
|
+
(p) => p.parameterSlug === this.slug
|
|
34
|
+
);
|
|
35
|
+
if (!param || param.value == null) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`Parameter "${this.slug}" not found or has no value in connection "${connection2.id}"`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return param.value;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Try to get the parameter value. Returns undefined if not found (for optional params).
|
|
44
|
+
*/
|
|
45
|
+
tryGetValue(connection2) {
|
|
46
|
+
const param = connection2.parameters.find(
|
|
47
|
+
(p) => p.parameterSlug === this.slug
|
|
48
|
+
);
|
|
49
|
+
if (!param || param.value == null) return void 0;
|
|
50
|
+
return param.value;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
42
53
|
}
|
|
43
|
-
};
|
|
54
|
+
});
|
|
44
55
|
|
|
45
56
|
// ../connectors/src/connectors/monday/parameters.ts
|
|
57
|
+
init_parameter_definition();
|
|
46
58
|
var parameters = {
|
|
47
59
|
apiToken: new ParameterDefinition({
|
|
48
60
|
slug: "api-token",
|
|
@@ -303,6 +315,28 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
303
315
|
tools;
|
|
304
316
|
query;
|
|
305
317
|
checkConnection;
|
|
318
|
+
/**
|
|
319
|
+
* SQPD-1212: Logic-based, rule-driven connection setup. Connectors that
|
|
320
|
+
* implement this expose a step-by-step exploration flow (database/schema/
|
|
321
|
+
* table/etc. discovery) that the dashboard backend drives via the
|
|
322
|
+
* `/connections/:connectionId/setup` endpoint. Implement by delegating to
|
|
323
|
+
* `runSetupFlow` from `setup-flow.ts`.
|
|
324
|
+
*/
|
|
325
|
+
setup;
|
|
326
|
+
/**
|
|
327
|
+
* Opt-out of the default "verify before save" behavior on connection
|
|
328
|
+
* creation. The backend invokes `checkConnection` synchronously while
|
|
329
|
+
* creating the connection and aborts (no row inserted) if it fails — this
|
|
330
|
+
* flag disables that for connectors where the check cannot succeed pre-save:
|
|
331
|
+
*
|
|
332
|
+
* - `squadbase-db` populates `connection-url` only after Neon provisioning
|
|
333
|
+
* - OAuth connectors require an OAuth-aware proxyFetch keyed by the
|
|
334
|
+
* connectionId, which doesn't exist until the row is saved
|
|
335
|
+
*
|
|
336
|
+
* Exceptions are the explicit position; new credential-input connectors get
|
|
337
|
+
* the default verify-on-create behavior without opt-in.
|
|
338
|
+
*/
|
|
339
|
+
skipConnectionCheckOnCreate;
|
|
306
340
|
constructor(config) {
|
|
307
341
|
this.slug = config.slug;
|
|
308
342
|
this.authType = config.authType;
|
|
@@ -319,6 +353,8 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
319
353
|
this.tools = config.tools;
|
|
320
354
|
this.query = config.query;
|
|
321
355
|
this.checkConnection = config.checkConnection;
|
|
356
|
+
this.setup = config.setup;
|
|
357
|
+
this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
|
|
322
358
|
}
|
|
323
359
|
get connectorKey() {
|
|
324
360
|
return _ConnectorPlugin.deriveKey(this.slug, this.authType);
|
|
@@ -383,6 +419,76 @@ var ConnectorPlugin = class _ConnectorPlugin {
|
|
|
383
419
|
}
|
|
384
420
|
};
|
|
385
421
|
|
|
422
|
+
// ../connectors/src/setup-flow.ts
|
|
423
|
+
async function runSetupFlow(flow, params, ctx, config) {
|
|
424
|
+
const runtime = {
|
|
425
|
+
params,
|
|
426
|
+
language: ctx.language,
|
|
427
|
+
config
|
|
428
|
+
};
|
|
429
|
+
let state = flow.initialState();
|
|
430
|
+
let answerIdx = 0;
|
|
431
|
+
const pendingParameterUpdates = [];
|
|
432
|
+
for (const step of flow.steps) {
|
|
433
|
+
const ans = ctx.answers[answerIdx];
|
|
434
|
+
if (ans && ans.questionSlug === step.slug) {
|
|
435
|
+
state = step.applyAnswer(state, ans.answer);
|
|
436
|
+
if (step.toParameterUpdates) {
|
|
437
|
+
pendingParameterUpdates.push(...step.toParameterUpdates(state));
|
|
438
|
+
}
|
|
439
|
+
answerIdx += 1;
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
const resolvedAllowFreeText = step.allowFreeText !== void 0 ? step.allowFreeText : true;
|
|
443
|
+
if (step.type === "text") {
|
|
444
|
+
if (step.fetchOptions) {
|
|
445
|
+
const options2 = await step.fetchOptions(state, runtime);
|
|
446
|
+
if (options2.length === 0) {
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
type: "nextQuestion",
|
|
452
|
+
questionSlug: step.slug,
|
|
453
|
+
question: step.question[ctx.language],
|
|
454
|
+
questionType: "text",
|
|
455
|
+
allowFreeText: resolvedAllowFreeText,
|
|
456
|
+
...pendingParameterUpdates.length > 0 && {
|
|
457
|
+
parameterUpdates: pendingParameterUpdates
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
|
|
462
|
+
if (options.length === 0) {
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
return {
|
|
466
|
+
type: "nextQuestion",
|
|
467
|
+
questionSlug: step.slug,
|
|
468
|
+
question: step.question[ctx.language],
|
|
469
|
+
questionType: step.type,
|
|
470
|
+
options,
|
|
471
|
+
allowFreeText: resolvedAllowFreeText,
|
|
472
|
+
...pendingParameterUpdates.length > 0 && {
|
|
473
|
+
parameterUpdates: pendingParameterUpdates
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
const dataInvestigationResult = await flow.finalize(state, runtime);
|
|
478
|
+
return {
|
|
479
|
+
type: "fulfilled",
|
|
480
|
+
dataInvestigationResult,
|
|
481
|
+
...pendingParameterUpdates.length > 0 && {
|
|
482
|
+
parameterUpdates: pendingParameterUpdates
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
async function resolveSetupSelection(params) {
|
|
487
|
+
const { selected, allSentinel, fetchAll, limit } = params;
|
|
488
|
+
const resolved = selected.includes(allSentinel) ? await fetchAll() : selected.filter((v) => v !== allSentinel);
|
|
489
|
+
return resolved.slice(0, limit);
|
|
490
|
+
}
|
|
491
|
+
|
|
386
492
|
// ../connectors/src/auth-types.ts
|
|
387
493
|
var AUTH_TYPES = {
|
|
388
494
|
OAUTH: "oauth",
|
|
@@ -409,9 +515,152 @@ var mondayOnboarding = new ConnectorOnboarding({
|
|
|
409
515
|
}
|
|
410
516
|
});
|
|
411
517
|
|
|
518
|
+
// ../connectors/src/connectors/monday/utils.ts
|
|
519
|
+
var BASE_URL2 = "https://api.monday.com/v2";
|
|
520
|
+
async function gqlFetch(params, query, variables) {
|
|
521
|
+
const apiToken = params[parameters.apiToken.slug];
|
|
522
|
+
if (!apiToken) {
|
|
523
|
+
throw new Error("monday: missing required parameter: api-token");
|
|
524
|
+
}
|
|
525
|
+
const body = { query };
|
|
526
|
+
if (variables) body.variables = variables;
|
|
527
|
+
const res = await fetch(BASE_URL2, {
|
|
528
|
+
method: "POST",
|
|
529
|
+
headers: {
|
|
530
|
+
Authorization: apiToken,
|
|
531
|
+
"Content-Type": "application/json"
|
|
532
|
+
},
|
|
533
|
+
body: JSON.stringify(body)
|
|
534
|
+
});
|
|
535
|
+
if (!res.ok) {
|
|
536
|
+
const text = await res.text().catch(() => res.statusText);
|
|
537
|
+
throw new Error(`monday: GraphQL request failed (${res.status}): ${text}`);
|
|
538
|
+
}
|
|
539
|
+
const json = await res.json();
|
|
540
|
+
if (json.errors && json.errors.length > 0) {
|
|
541
|
+
const messages = json.errors.map((e) => e.message).join("; ");
|
|
542
|
+
if (!json.data) {
|
|
543
|
+
throw new Error(`monday: GraphQL error: ${messages}`);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return json.data ?? {};
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// ../connectors/src/connectors/monday/setup-flow.ts
|
|
550
|
+
var ALL_BOARDS = "__ALL_BOARDS__";
|
|
551
|
+
var MONDAY_SETUP_MAX_BOARDS = 10;
|
|
552
|
+
async function listWorkspaces(params) {
|
|
553
|
+
const data = await gqlFetch(
|
|
554
|
+
params,
|
|
555
|
+
`query { workspaces(limit: 100) { id name kind } }`
|
|
556
|
+
);
|
|
557
|
+
return data.workspaces ?? [];
|
|
558
|
+
}
|
|
559
|
+
async function listBoards(params, workspaceIds) {
|
|
560
|
+
const data = await gqlFetch(
|
|
561
|
+
params,
|
|
562
|
+
`query($workspaceIds: [ID!]) {
|
|
563
|
+
boards(workspace_ids: $workspaceIds, limit: 200) {
|
|
564
|
+
id name state board_kind workspace { id name }
|
|
565
|
+
}
|
|
566
|
+
}`,
|
|
567
|
+
{ workspaceIds }
|
|
568
|
+
);
|
|
569
|
+
return data.boards ?? [];
|
|
570
|
+
}
|
|
571
|
+
async function getBoardColumns(params, boardId) {
|
|
572
|
+
const data = await gqlFetch(
|
|
573
|
+
params,
|
|
574
|
+
`query($ids: [ID!]) {
|
|
575
|
+
boards(ids: $ids) {
|
|
576
|
+
id name state board_kind
|
|
577
|
+
columns { id title type }
|
|
578
|
+
}
|
|
579
|
+
}`,
|
|
580
|
+
{ ids: [boardId] }
|
|
581
|
+
);
|
|
582
|
+
return data.boards?.[0] ?? null;
|
|
583
|
+
}
|
|
584
|
+
var mondaySetupFlow = {
|
|
585
|
+
initialState: () => ({}),
|
|
586
|
+
steps: [
|
|
587
|
+
{
|
|
588
|
+
slug: "workspaces",
|
|
589
|
+
type: "multiSelect",
|
|
590
|
+
question: {
|
|
591
|
+
ja: "\u5BFE\u8C61\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
|
|
592
|
+
en: "Select target workspaces (multi-select allowed)"
|
|
593
|
+
},
|
|
594
|
+
async fetchOptions(_state, rt) {
|
|
595
|
+
const workspaces = await listWorkspaces(rt.params);
|
|
596
|
+
return workspaces.filter((w) => w.id != null && w.name).map((w) => ({ value: String(w.id), label: w.name }));
|
|
597
|
+
},
|
|
598
|
+
applyAnswer: (state, answer) => ({ ...state, workspaces: answer })
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
slug: "boards",
|
|
602
|
+
type: "multiSelect",
|
|
603
|
+
question: {
|
|
604
|
+
ja: "\u5BFE\u8C61\u306E\u30DC\u30FC\u30C9\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
|
|
605
|
+
en: "Select target boards (multi-select allowed)"
|
|
606
|
+
},
|
|
607
|
+
async fetchOptions(state, rt) {
|
|
608
|
+
if (!state.workspaces || state.workspaces.length === 0) return [];
|
|
609
|
+
const boards = await listBoards(rt.params, state.workspaces);
|
|
610
|
+
const boardOptions = boards.filter((b) => b.id != null && b.name).map((b) => ({
|
|
611
|
+
value: String(b.id),
|
|
612
|
+
label: b.workspace?.name ? `${b.workspace.name} / ${b.name}` : b.name
|
|
613
|
+
}));
|
|
614
|
+
return [
|
|
615
|
+
{
|
|
616
|
+
value: ALL_BOARDS,
|
|
617
|
+
label: rt.language === "ja" ? "\u3059\u3079\u3066\u306E\u30DC\u30FC\u30C9" : "All boards"
|
|
618
|
+
},
|
|
619
|
+
...boardOptions
|
|
620
|
+
];
|
|
621
|
+
},
|
|
622
|
+
applyAnswer: (state, answer) => ({ ...state, boards: answer })
|
|
623
|
+
}
|
|
624
|
+
],
|
|
625
|
+
async finalize(state, rt) {
|
|
626
|
+
if (!state.workspaces || !state.boards) {
|
|
627
|
+
throw new Error("monday setup: incomplete state on finalize");
|
|
628
|
+
}
|
|
629
|
+
const targetBoardIds = await resolveSetupSelection({
|
|
630
|
+
selected: state.boards,
|
|
631
|
+
allSentinel: ALL_BOARDS,
|
|
632
|
+
fetchAll: async () => {
|
|
633
|
+
const boards = await listBoards(rt.params, state.workspaces ?? []);
|
|
634
|
+
return boards.map((b) => String(b.id)).filter((id) => id);
|
|
635
|
+
},
|
|
636
|
+
limit: MONDAY_SETUP_MAX_BOARDS
|
|
637
|
+
});
|
|
638
|
+
const sections = ["## monday.com", ""];
|
|
639
|
+
for (const boardId of targetBoardIds) {
|
|
640
|
+
const board = await getBoardColumns(rt.params, boardId);
|
|
641
|
+
if (!board) {
|
|
642
|
+
sections.push(`### Board: ${boardId}`, "", "_Not found._", "");
|
|
643
|
+
continue;
|
|
644
|
+
}
|
|
645
|
+
sections.push(`### Board: ${board.name} (${board.id})`, "");
|
|
646
|
+
if (board.board_kind) sections.push(`- Kind: ${board.board_kind}`);
|
|
647
|
+
if (board.state) sections.push(`- State: ${board.state}`);
|
|
648
|
+
const columns = board.columns ?? [];
|
|
649
|
+
sections.push(`- Columns (${columns.length}):`, "");
|
|
650
|
+
sections.push("| Column | Type |");
|
|
651
|
+
sections.push("|--------|------|");
|
|
652
|
+
for (const c of columns) {
|
|
653
|
+
sections.push(`| ${c.title} | ${c.type ?? "-"} |`);
|
|
654
|
+
}
|
|
655
|
+
sections.push("");
|
|
656
|
+
}
|
|
657
|
+
return sections.join("\n");
|
|
658
|
+
}
|
|
659
|
+
};
|
|
660
|
+
|
|
412
661
|
// ../connectors/src/connectors/monday/tools/request.ts
|
|
413
662
|
import { z } from "zod";
|
|
414
|
-
var
|
|
663
|
+
var BASE_URL3 = "https://api.monday.com/v2";
|
|
415
664
|
var REQUEST_TIMEOUT_MS = 6e4;
|
|
416
665
|
var inputSchema = z.object({
|
|
417
666
|
toolUseIntent: z.string().optional().describe(
|
|
@@ -469,7 +718,7 @@ Items are paginated with a cursor-based \`items_page(limit, cursor)\` field on a
|
|
|
469
718
|
"Content-Type": "application/json"
|
|
470
719
|
};
|
|
471
720
|
if (apiVersion) headers["API-Version"] = apiVersion;
|
|
472
|
-
const response = await fetch(
|
|
721
|
+
const response = await fetch(BASE_URL3, {
|
|
473
722
|
method: "POST",
|
|
474
723
|
headers,
|
|
475
724
|
body: JSON.stringify(body),
|
|
@@ -701,7 +950,49 @@ const items = res.data?.boards?.[0]?.items_page?.items; // \u5E38\u306B undefine
|
|
|
701
950
|
- \`ID\` \u30B9\u30AB\u30E9\u30FC\u306F\u6570\u5024\u30FB\u6587\u5B57\u5217\u3069\u3061\u3089\u3082\u53D7\u3051\u4ED8\u3051\u308B\u304C\u3001\u5909\u6570\u3067\u306F\u6587\u5B57\u5217\u3067\u6E21\u3059\u306E\u304C\u5B89\u5168
|
|
702
951
|
- \`board.tags\` \u306E\u3088\u3046\u306B\u3001\u660E\u793A\u7684\u306B\u4F7F\u308F\u308C\u3066\u3044\u308B\u30DC\u30FC\u30C9\u3067\u306E\u307F\u5024\u304C\u8FD4\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u3082\u3042\u308B`
|
|
703
952
|
},
|
|
704
|
-
tools
|
|
953
|
+
tools,
|
|
954
|
+
setup: (params, ctx, config) => runSetupFlow(mondaySetupFlow, params, ctx, config),
|
|
955
|
+
async checkConnection(params, _config) {
|
|
956
|
+
try {
|
|
957
|
+
const apiToken = params[parameters.apiToken.slug];
|
|
958
|
+
if (!apiToken) {
|
|
959
|
+
return {
|
|
960
|
+
success: false,
|
|
961
|
+
error: "Missing required parameter: api-token"
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
const res = await fetch("https://api.monday.com/v2", {
|
|
965
|
+
method: "POST",
|
|
966
|
+
headers: {
|
|
967
|
+
Authorization: apiToken,
|
|
968
|
+
"Content-Type": "application/json",
|
|
969
|
+
Accept: "application/json"
|
|
970
|
+
},
|
|
971
|
+
body: JSON.stringify({ query: "query { me { id } }" })
|
|
972
|
+
});
|
|
973
|
+
if (!res.ok) {
|
|
974
|
+
const errorText = await res.text().catch(() => res.statusText);
|
|
975
|
+
return {
|
|
976
|
+
success: false,
|
|
977
|
+
error: `monday.com API failed: HTTP ${res.status} ${errorText}`
|
|
978
|
+
};
|
|
979
|
+
}
|
|
980
|
+
const body = await res.json().catch(() => null);
|
|
981
|
+
if (body?.errors && body.errors.length > 0) {
|
|
982
|
+
const msg = body.errors.map((e) => e.message ?? "unknown error").join("; ");
|
|
983
|
+
return {
|
|
984
|
+
success: false,
|
|
985
|
+
error: `monday.com GraphQL errors: ${msg}`
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
return { success: true };
|
|
989
|
+
} catch (error) {
|
|
990
|
+
return {
|
|
991
|
+
success: false,
|
|
992
|
+
error: error instanceof Error ? error.message : String(error)
|
|
993
|
+
};
|
|
994
|
+
}
|
|
995
|
+
}
|
|
705
996
|
});
|
|
706
997
|
|
|
707
998
|
// src/connectors/create-connector-sdk.ts
|
|
@@ -730,6 +1021,7 @@ function resolveEnvVarOptional(entry, key) {
|
|
|
730
1021
|
import { getContext } from "hono/context-storage";
|
|
731
1022
|
import { getCookie } from "hono/cookie";
|
|
732
1023
|
var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
|
|
1024
|
+
var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
|
|
733
1025
|
function normalizeHeaders(input) {
|
|
734
1026
|
const out = {};
|
|
735
1027
|
if (!input) return out;
|
|
@@ -738,6 +1030,11 @@ function normalizeHeaders(input) {
|
|
|
738
1030
|
});
|
|
739
1031
|
return out;
|
|
740
1032
|
}
|
|
1033
|
+
function extractInputUrl(input) {
|
|
1034
|
+
if (typeof input === "string") return input;
|
|
1035
|
+
if (input instanceof URL) return input.href;
|
|
1036
|
+
return input.url;
|
|
1037
|
+
}
|
|
741
1038
|
function createSandboxProxyFetch(connectionId) {
|
|
742
1039
|
return async (input, init) => {
|
|
743
1040
|
const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
|
|
@@ -747,10 +1044,17 @@ function createSandboxProxyFetch(connectionId) {
|
|
|
747
1044
|
"Connection proxy is not configured. Please check your deployment settings."
|
|
748
1045
|
);
|
|
749
1046
|
}
|
|
750
|
-
const originalUrl =
|
|
1047
|
+
const originalUrl = extractInputUrl(input);
|
|
1048
|
+
const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
|
|
1049
|
+
if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
|
|
1050
|
+
const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
|
|
1051
|
+
return fetch(sessionUrl, {
|
|
1052
|
+
method: "POST",
|
|
1053
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
1054
|
+
});
|
|
1055
|
+
}
|
|
751
1056
|
const originalMethod = init?.method ?? "GET";
|
|
752
1057
|
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
753
|
-
const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
|
|
754
1058
|
const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
755
1059
|
return fetch(proxyUrl, {
|
|
756
1060
|
method: "POST",
|
|
@@ -776,10 +1080,9 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
776
1080
|
}
|
|
777
1081
|
const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
|
|
778
1082
|
const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
|
|
1083
|
+
const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
|
|
779
1084
|
return async (input, init) => {
|
|
780
|
-
const originalUrl =
|
|
781
|
-
const originalMethod = init?.method ?? "GET";
|
|
782
|
-
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
1085
|
+
const originalUrl = extractInputUrl(input);
|
|
783
1086
|
const c = getContext();
|
|
784
1087
|
const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
|
|
785
1088
|
if (!appSession) {
|
|
@@ -787,6 +1090,14 @@ function createDeployedAppProxyFetch(connectionId) {
|
|
|
787
1090
|
"No authentication method available for connection proxy."
|
|
788
1091
|
);
|
|
789
1092
|
}
|
|
1093
|
+
if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
|
|
1094
|
+
return fetch(sessionUrl, {
|
|
1095
|
+
method: "POST",
|
|
1096
|
+
headers: { Authorization: `Bearer ${appSession}` }
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
const originalMethod = init?.method ?? "GET";
|
|
1100
|
+
const originalBody = init?.body ? JSON.parse(init.body) : void 0;
|
|
790
1101
|
return fetch(proxyUrl, {
|
|
791
1102
|
method: "POST",
|
|
792
1103
|
headers: {
|