@squadbase/vite-server 0.1.12-dev.93b8799 → 0.1.17-dev.24af54e

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 (77) hide show
  1. package/dist/cli/index.js +12128 -934
  2. package/dist/connectors/airtable-oauth.js +248 -46
  3. package/dist/connectors/airtable.js +285 -51
  4. package/dist/connectors/amplitude.js +288 -47
  5. package/dist/connectors/anthropic.js +126 -47
  6. package/dist/connectors/asana.js +293 -49
  7. package/dist/connectors/attio.js +268 -49
  8. package/dist/connectors/aws-billing.js +253 -46
  9. package/dist/connectors/azure-sql.js +387 -102
  10. package/dist/connectors/backlog-api-key.js +283 -47
  11. package/dist/connectors/clickup.js +304 -49
  12. package/dist/connectors/cosmosdb.js +271 -50
  13. package/dist/connectors/customerio.js +285 -47
  14. package/dist/connectors/dbt.js +306 -47
  15. package/dist/connectors/freshdesk.js +308 -53
  16. package/dist/connectors/freshsales.js +299 -52
  17. package/dist/connectors/freshservice.js +327 -53
  18. package/dist/connectors/gamma.js +293 -52
  19. package/dist/connectors/gemini.js +125 -47
  20. package/dist/connectors/github.js +352 -49
  21. package/dist/connectors/gmail-oauth.js +170 -7
  22. package/dist/connectors/gmail.js +316 -47
  23. package/dist/connectors/google-ads.js +254 -46
  24. package/dist/connectors/google-analytics-oauth.js +276 -46
  25. package/dist/connectors/google-analytics.js +378 -49
  26. package/dist/connectors/google-audit-log.js +404 -47
  27. package/dist/connectors/google-calendar-oauth.js +225 -46
  28. package/dist/connectors/google-calendar.js +325 -47
  29. package/dist/connectors/google-docs.js +186 -6
  30. package/dist/connectors/google-drive.js +228 -5
  31. package/dist/connectors/google-search-console-oauth.js +222 -46
  32. package/dist/connectors/google-sheets.js +238 -47
  33. package/dist/connectors/google-slides.js +171 -6
  34. package/dist/connectors/grafana.js +298 -49
  35. package/dist/connectors/hubspot-oauth.js +174 -5
  36. package/dist/connectors/hubspot.js +272 -49
  37. package/dist/connectors/influxdb.js +382 -51
  38. package/dist/connectors/intercom-oauth.js +176 -5
  39. package/dist/connectors/intercom.js +268 -49
  40. package/dist/connectors/jdbc.js +728 -110
  41. package/dist/connectors/jira-api-key.js +292 -47
  42. package/dist/connectors/kintone-api-token.js +247 -47
  43. package/dist/connectors/kintone.js +294 -47
  44. package/dist/connectors/linear.js +296 -49
  45. package/dist/connectors/linkedin-ads.js +234 -50
  46. package/dist/connectors/mailchimp-oauth.js +234 -46
  47. package/dist/connectors/mailchimp.js +286 -49
  48. package/dist/connectors/meta-ads-oauth.js +239 -48
  49. package/dist/connectors/meta-ads.js +251 -50
  50. package/dist/connectors/mixpanel.js +304 -47
  51. package/dist/connectors/monday.js +326 -49
  52. package/dist/connectors/mongodb.js +285 -57
  53. package/dist/connectors/notion-oauth.js +197 -5
  54. package/dist/connectors/notion.js +289 -51
  55. package/dist/connectors/openai.js +125 -47
  56. package/dist/connectors/oracle.js +405 -103
  57. package/dist/connectors/outlook-oauth.js +170 -5
  58. package/dist/connectors/powerbi-oauth.js +217 -5
  59. package/dist/connectors/salesforce.js +350 -49
  60. package/dist/connectors/semrush.js +280 -49
  61. package/dist/connectors/sentry.js +255 -50
  62. package/dist/connectors/shopify-oauth.js +153 -5
  63. package/dist/connectors/shopify.js +323 -47
  64. package/dist/connectors/sqlserver.js +381 -102
  65. package/dist/connectors/stripe-api-key.js +235 -46
  66. package/dist/connectors/stripe-oauth.js +168 -5
  67. package/dist/connectors/supabase.js +269 -48
  68. package/dist/connectors/tableau.js +337 -206
  69. package/dist/connectors/tiktok-ads.js +245 -48
  70. package/dist/connectors/wix-store.js +286 -49
  71. package/dist/connectors/zendesk-oauth.js +205 -5
  72. package/dist/connectors/zendesk.js +324 -47
  73. package/dist/index.d.ts +149 -1
  74. package/dist/index.js +18297 -6886
  75. package/dist/main.js +12785 -1382
  76. package/dist/vite-plugin.js +12140 -936
  77. 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 = class {
3
- slug;
4
- name;
5
- description;
6
- envVarBaseKey;
7
- type;
8
- secret;
9
- required;
10
- constructor(config) {
11
- this.slug = config.slug;
12
- this.name = config.name;
13
- this.description = config.description;
14
- this.envVarBaseKey = config.envVarBaseKey;
15
- this.type = config.type;
16
- this.secret = config.secret;
17
- this.required = config.required;
18
- }
19
- /**
20
- * Get the parameter value from a ConnectorConnectionObject.
21
- */
22
- getValue(connection2) {
23
- const param = connection2.parameters.find(
24
- (p) => p.parameterSlug === this.slug
25
- );
26
- if (!param || param.value == null) {
27
- throw new Error(
28
- `Parameter "${this.slug}" not found or has no value in connection "${connection2.id}"`
29
- );
30
- }
31
- return param.value;
32
- }
33
- /**
34
- * Try to get the parameter value. Returns undefined if not found (for optional params).
35
- */
36
- tryGetValue(connection2) {
37
- const param = connection2.parameters.find(
38
- (p) => p.parameterSlug === this.slug
39
- );
40
- if (!param || param.value == null) return void 0;
41
- return param.value;
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/linear/parameters.ts
57
+ init_parameter_definition();
46
58
  var parameters = {
47
59
  apiKey: new ParameterDefinition({
48
60
  slug: "api-key",
@@ -215,6 +227,20 @@ var ConnectorPlugin = class _ConnectorPlugin {
215
227
  * `runSetupFlow` from `setup-flow.ts`.
216
228
  */
217
229
  setup;
230
+ /**
231
+ * Opt-out of the default "verify before save" behavior on connection
232
+ * creation. The backend invokes `checkConnection` synchronously while
233
+ * creating the connection and aborts (no row inserted) if it fails — this
234
+ * flag disables that for connectors where the check cannot succeed pre-save:
235
+ *
236
+ * - `squadbase-db` populates `connection-url` only after Neon provisioning
237
+ * - OAuth connectors require an OAuth-aware proxyFetch keyed by the
238
+ * connectionId, which doesn't exist until the row is saved
239
+ *
240
+ * Exceptions are the explicit position; new credential-input connectors get
241
+ * the default verify-on-create behavior without opt-in.
242
+ */
243
+ skipConnectionCheckOnCreate;
218
244
  constructor(config) {
219
245
  this.slug = config.slug;
220
246
  this.authType = config.authType;
@@ -232,6 +258,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
232
258
  this.query = config.query;
233
259
  this.checkConnection = config.checkConnection;
234
260
  this.setup = config.setup;
261
+ this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
235
262
  }
236
263
  get connectorKey() {
237
264
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -296,6 +323,51 @@ var ConnectorPlugin = class _ConnectorPlugin {
296
323
  }
297
324
  };
298
325
 
326
+ // ../connectors/src/setup-flow.ts
327
+ async function runSetupFlow(flow, params, ctx, config) {
328
+ const runtime = {
329
+ params,
330
+ language: ctx.language,
331
+ config
332
+ };
333
+ let state = flow.initialState();
334
+ let answerIdx = 0;
335
+ for (const step of flow.steps) {
336
+ const ans = ctx.answers[answerIdx];
337
+ if (ans && ans.questionSlug === step.slug) {
338
+ state = step.applyAnswer(state, ans.answer);
339
+ answerIdx += 1;
340
+ continue;
341
+ }
342
+ if (step.type === "text") {
343
+ return {
344
+ type: "nextQuestion",
345
+ questionSlug: step.slug,
346
+ question: step.question[ctx.language],
347
+ questionType: "text"
348
+ };
349
+ }
350
+ const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
351
+ if (options.length === 0) {
352
+ continue;
353
+ }
354
+ return {
355
+ type: "nextQuestion",
356
+ questionSlug: step.slug,
357
+ question: step.question[ctx.language],
358
+ questionType: step.type,
359
+ options
360
+ };
361
+ }
362
+ const dataInvestigationResult = await flow.finalize(state, runtime);
363
+ return { type: "fulfilled", dataInvestigationResult };
364
+ }
365
+ async function resolveSetupSelection(params) {
366
+ const { selected, allSentinel, fetchAll, limit } = params;
367
+ const resolved = selected.includes(allSentinel) ? await fetchAll() : selected.filter((v) => v !== allSentinel);
368
+ return resolved.slice(0, limit);
369
+ }
370
+
299
371
  // ../connectors/src/auth-types.ts
300
372
  var AUTH_TYPES = {
301
373
  OAUTH: "oauth",
@@ -322,9 +394,122 @@ var linearOnboarding = new ConnectorOnboarding({
322
394
  }
323
395
  });
324
396
 
397
+ // ../connectors/src/connectors/linear/utils.ts
398
+ var BASE_URL2 = "https://api.linear.app/graphql";
399
+ async function gqlFetch(params, query, variables) {
400
+ const apiKey = params[parameters.apiKey.slug];
401
+ if (!apiKey) {
402
+ throw new Error("linear: missing required parameter: api-key");
403
+ }
404
+ const body = { query };
405
+ if (variables) body.variables = variables;
406
+ const res = await fetch(BASE_URL2, {
407
+ method: "POST",
408
+ headers: {
409
+ Authorization: apiKey,
410
+ "Content-Type": "application/json"
411
+ },
412
+ body: JSON.stringify(body)
413
+ });
414
+ if (!res.ok) {
415
+ const text = await res.text().catch(() => res.statusText);
416
+ throw new Error(`linear: GraphQL request failed (${res.status}): ${text}`);
417
+ }
418
+ const json = await res.json();
419
+ if (json.errors && json.errors.length > 0) {
420
+ const messages = json.errors.map((e) => e.message).join("; ");
421
+ if (!json.data) {
422
+ throw new Error(`linear: GraphQL error: ${messages}`);
423
+ }
424
+ }
425
+ return json.data ?? {};
426
+ }
427
+
428
+ // ../connectors/src/connectors/linear/setup-flow.ts
429
+ var ALL_TEAMS = "__ALL_TEAMS__";
430
+ var LINEAR_SETUP_MAX_TEAMS = 20;
431
+ async function listTeams(params) {
432
+ const data = await gqlFetch(params, `query { teams { nodes { id key name } } }`);
433
+ return data.teams?.nodes ?? [];
434
+ }
435
+ async function getTeamDetail(params, teamId) {
436
+ const data = await gqlFetch(
437
+ params,
438
+ `query($id: String!) {
439
+ team(id: $id) {
440
+ id key name description
441
+ states { nodes { id name type } }
442
+ members { nodes { id } }
443
+ }
444
+ }`,
445
+ { id: teamId }
446
+ );
447
+ return data.team ?? null;
448
+ }
449
+ var linearSetupFlow = {
450
+ initialState: () => ({}),
451
+ steps: [
452
+ {
453
+ slug: "teams",
454
+ type: "multiSelect",
455
+ question: {
456
+ ja: "\u5BFE\u8C61\u306E\u30C1\u30FC\u30E0\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
457
+ en: "Select target teams (multi-select allowed)"
458
+ },
459
+ async fetchOptions(_state, rt) {
460
+ const teams = await listTeams(rt.params);
461
+ const teamOptions = teams.filter((t) => t.id && t.name).map((t) => ({ value: t.id, label: `${t.name} (${t.key})` }));
462
+ return [
463
+ {
464
+ value: ALL_TEAMS,
465
+ label: rt.language === "ja" ? "\u3059\u3079\u3066\u306E\u30C1\u30FC\u30E0" : "All teams"
466
+ },
467
+ ...teamOptions
468
+ ];
469
+ },
470
+ applyAnswer: (state, answer) => ({ ...state, teams: answer })
471
+ }
472
+ ],
473
+ async finalize(state, rt) {
474
+ if (!state.teams) {
475
+ throw new Error("Linear setup: incomplete state on finalize");
476
+ }
477
+ const targetIds = await resolveSetupSelection({
478
+ selected: state.teams,
479
+ allSentinel: ALL_TEAMS,
480
+ fetchAll: async () => {
481
+ const teams = await listTeams(rt.params);
482
+ return teams.map((t) => t.id).filter((id) => id);
483
+ },
484
+ limit: LINEAR_SETUP_MAX_TEAMS
485
+ });
486
+ const sections = ["## Linear", ""];
487
+ for (const teamId of targetIds) {
488
+ const detail = await getTeamDetail(rt.params, teamId);
489
+ if (!detail) {
490
+ sections.push(`### Team: ${teamId}`, "", "_Not found._", "");
491
+ continue;
492
+ }
493
+ sections.push(`### Team: ${detail.name} (${detail.key})`, "");
494
+ if (detail.description) {
495
+ sections.push(detail.description, "");
496
+ }
497
+ const states = detail.states?.nodes ?? [];
498
+ const memberCount = detail.members?.nodes?.length ?? 0;
499
+ sections.push(`- Member count: ${memberCount}`);
500
+ sections.push(`- Workflow states (${states.length}):`);
501
+ for (const s of states) {
502
+ sections.push(` - ${s.name} (${s.type})`);
503
+ }
504
+ sections.push("");
505
+ }
506
+ return sections.join("\n");
507
+ }
508
+ };
509
+
325
510
  // ../connectors/src/connectors/linear/tools/request.ts
326
511
  import { z } from "zod";
327
- var BASE_URL2 = "https://api.linear.app/graphql";
512
+ var BASE_URL3 = "https://api.linear.app/graphql";
328
513
  var REQUEST_TIMEOUT_MS = 6e4;
329
514
  var inputSchema = z.object({
330
515
  toolUseIntent: z.string().optional().describe(
@@ -374,7 +559,7 @@ Archived resources are hidden by default; pass includeArchived: true in query ar
374
559
  try {
375
560
  const body = { query };
376
561
  if (variables) body.variables = variables;
377
- const response = await fetch(BASE_URL2, {
562
+ const response = await fetch(BASE_URL3, {
378
563
  method: "POST",
379
564
  headers: {
380
565
  Authorization: apiKey,
@@ -548,7 +733,49 @@ export default async function handler(c: Context) {
548
733
  - \`mutation { issueUpdate(id: "...", input: { stateId: "..." }) { success issue { id title state { name } } } }\` \u2014 Issue\u66F4\u65B0
549
734
  - \`mutation { commentCreate(input: { issueId: "...", body: "..." }) { success comment { id body } } }\` \u2014 \u30B3\u30E1\u30F3\u30C8\u8FFD\u52A0`
550
735
  },
551
- tools
736
+ tools,
737
+ setup: (params, ctx, config) => runSetupFlow(linearSetupFlow, params, ctx, config),
738
+ async checkConnection(params, _config) {
739
+ try {
740
+ const apiKey = params[parameters.apiKey.slug];
741
+ if (!apiKey) {
742
+ return {
743
+ success: false,
744
+ error: "Missing required parameter: api-key"
745
+ };
746
+ }
747
+ const res = await fetch("https://api.linear.app/graphql", {
748
+ method: "POST",
749
+ headers: {
750
+ Authorization: apiKey,
751
+ "Content-Type": "application/json",
752
+ Accept: "application/json"
753
+ },
754
+ body: JSON.stringify({ query: "query { viewer { id } }" })
755
+ });
756
+ if (!res.ok) {
757
+ const errorText = await res.text().catch(() => res.statusText);
758
+ return {
759
+ success: false,
760
+ error: `Linear API failed: HTTP ${res.status} ${errorText}`
761
+ };
762
+ }
763
+ const body = await res.json().catch(() => null);
764
+ if (body?.errors && body.errors.length > 0) {
765
+ const msg = body.errors.map((e) => e.message ?? "unknown error").join("; ");
766
+ return {
767
+ success: false,
768
+ error: `Linear GraphQL errors: ${msg}`
769
+ };
770
+ }
771
+ return { success: true };
772
+ } catch (error) {
773
+ return {
774
+ success: false,
775
+ error: error instanceof Error ? error.message : String(error)
776
+ };
777
+ }
778
+ }
552
779
  });
553
780
 
554
781
  // src/connectors/create-connector-sdk.ts
@@ -577,6 +804,7 @@ function resolveEnvVarOptional(entry, key) {
577
804
  import { getContext } from "hono/context-storage";
578
805
  import { getCookie } from "hono/cookie";
579
806
  var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
807
+ var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
580
808
  function normalizeHeaders(input) {
581
809
  const out = {};
582
810
  if (!input) return out;
@@ -585,6 +813,11 @@ function normalizeHeaders(input) {
585
813
  });
586
814
  return out;
587
815
  }
816
+ function extractInputUrl(input) {
817
+ if (typeof input === "string") return input;
818
+ if (input instanceof URL) return input.href;
819
+ return input.url;
820
+ }
588
821
  function createSandboxProxyFetch(connectionId) {
589
822
  return async (input, init) => {
590
823
  const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
@@ -594,10 +827,17 @@ function createSandboxProxyFetch(connectionId) {
594
827
  "Connection proxy is not configured. Please check your deployment settings."
595
828
  );
596
829
  }
597
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
830
+ const originalUrl = extractInputUrl(input);
831
+ const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
832
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
833
+ const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
834
+ return fetch(sessionUrl, {
835
+ method: "POST",
836
+ headers: { Authorization: `Bearer ${token}` }
837
+ });
838
+ }
598
839
  const originalMethod = init?.method ?? "GET";
599
840
  const originalBody = init?.body ? JSON.parse(init.body) : void 0;
600
- const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
601
841
  const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
602
842
  return fetch(proxyUrl, {
603
843
  method: "POST",
@@ -623,10 +863,9 @@ function createDeployedAppProxyFetch(connectionId) {
623
863
  }
624
864
  const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
625
865
  const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
866
+ const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
626
867
  return async (input, init) => {
627
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
628
- const originalMethod = init?.method ?? "GET";
629
- const originalBody = init?.body ? JSON.parse(init.body) : void 0;
868
+ const originalUrl = extractInputUrl(input);
630
869
  const c = getContext();
631
870
  const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
632
871
  if (!appSession) {
@@ -634,6 +873,14 @@ function createDeployedAppProxyFetch(connectionId) {
634
873
  "No authentication method available for connection proxy."
635
874
  );
636
875
  }
876
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
877
+ return fetch(sessionUrl, {
878
+ method: "POST",
879
+ headers: { Authorization: `Bearer ${appSession}` }
880
+ });
881
+ }
882
+ const originalMethod = init?.method ?? "GET";
883
+ const originalBody = init?.body ? JSON.parse(init.body) : void 0;
637
884
  return fetch(proxyUrl, {
638
885
  method: "POST",
639
886
  headers: {