@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/google-calendar-oauth/parameters.ts
57
+ init_parameter_definition();
46
58
  var parameters = {
47
59
  calendarId: new ParameterDefinition({
48
60
  slug: "calendar-id",
@@ -189,6 +201,20 @@ var ConnectorPlugin = class _ConnectorPlugin {
189
201
  * `runSetupFlow` from `setup-flow.ts`.
190
202
  */
191
203
  setup;
204
+ /**
205
+ * Opt-out of the default "verify before save" behavior on connection
206
+ * creation. The backend invokes `checkConnection` synchronously while
207
+ * creating the connection and aborts (no row inserted) if it fails — this
208
+ * flag disables that for connectors where the check cannot succeed pre-save:
209
+ *
210
+ * - `squadbase-db` populates `connection-url` only after Neon provisioning
211
+ * - OAuth connectors require an OAuth-aware proxyFetch keyed by the
212
+ * connectionId, which doesn't exist until the row is saved
213
+ *
214
+ * Exceptions are the explicit position; new credential-input connectors get
215
+ * the default verify-on-create behavior without opt-in.
216
+ */
217
+ skipConnectionCheckOnCreate;
192
218
  constructor(config) {
193
219
  this.slug = config.slug;
194
220
  this.authType = config.authType;
@@ -206,6 +232,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
206
232
  this.query = config.query;
207
233
  this.checkConnection = config.checkConnection;
208
234
  this.setup = config.setup;
235
+ this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
209
236
  }
210
237
  get connectorKey() {
211
238
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -270,6 +297,51 @@ var ConnectorPlugin = class _ConnectorPlugin {
270
297
  }
271
298
  };
272
299
 
300
+ // ../connectors/src/setup-flow.ts
301
+ async function runSetupFlow(flow, params, ctx, config) {
302
+ const runtime = {
303
+ params,
304
+ language: ctx.language,
305
+ config
306
+ };
307
+ let state = flow.initialState();
308
+ let answerIdx = 0;
309
+ for (const step of flow.steps) {
310
+ const ans = ctx.answers[answerIdx];
311
+ if (ans && ans.questionSlug === step.slug) {
312
+ state = step.applyAnswer(state, ans.answer);
313
+ answerIdx += 1;
314
+ continue;
315
+ }
316
+ if (step.type === "text") {
317
+ return {
318
+ type: "nextQuestion",
319
+ questionSlug: step.slug,
320
+ question: step.question[ctx.language],
321
+ questionType: "text"
322
+ };
323
+ }
324
+ const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
325
+ if (options.length === 0) {
326
+ continue;
327
+ }
328
+ return {
329
+ type: "nextQuestion",
330
+ questionSlug: step.slug,
331
+ question: step.question[ctx.language],
332
+ questionType: step.type,
333
+ options
334
+ };
335
+ }
336
+ const dataInvestigationResult = await flow.finalize(state, runtime);
337
+ return { type: "fulfilled", dataInvestigationResult };
338
+ }
339
+ async function resolveSetupSelection(params) {
340
+ const { selected, allSentinel, fetchAll, limit } = params;
341
+ const resolved = selected.includes(allSentinel) ? await fetchAll() : selected.filter((v) => v !== allSentinel);
342
+ return resolved.slice(0, limit);
343
+ }
344
+
273
345
  // ../connectors/src/auth-types.ts
274
346
  var AUTH_TYPES = {
275
347
  OAUTH: "oauth",
@@ -445,6 +517,91 @@ var googleCalendarOauthOnboarding = new ConnectorOnboarding({
445
517
  }
446
518
  });
447
519
 
520
+ // ../connectors/src/connectors/google-calendar-oauth/utils.ts
521
+ async function calendarApiFetch(config, url) {
522
+ const res = await config.proxyFetch(url, { method: "GET" });
523
+ if (!res.ok) {
524
+ const text = await res.text().catch(() => res.statusText);
525
+ throw new Error(
526
+ `Google Calendar ${url} failed: HTTP ${res.status} ${text}`
527
+ );
528
+ }
529
+ return await res.json();
530
+ }
531
+
532
+ // ../connectors/src/connectors/google-calendar-oauth/setup-flow.ts
533
+ var ALL_CALENDARS = "__ALL_CALENDARS__";
534
+ var GOOGLE_CALENDAR_SETUP_MAX_CALENDARS = 20;
535
+ async function listCalendars(config) {
536
+ const url = "https://www.googleapis.com/calendar/v3/users/me/calendarList?maxResults=250";
537
+ const data = await calendarApiFetch(config, url);
538
+ return data.items ?? [];
539
+ }
540
+ function displayName(c) {
541
+ return c.summaryOverride ?? c.summary ?? c.id;
542
+ }
543
+ var googleCalendarOauthSetupFlow = {
544
+ initialState: () => ({}),
545
+ steps: [
546
+ {
547
+ slug: "calendars",
548
+ type: "multiSelect",
549
+ question: {
550
+ ja: "\u5BFE\u8C61\u306E\u30AB\u30EC\u30F3\u30C0\u30FC\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
551
+ en: "Select target calendars (multi-select allowed)"
552
+ },
553
+ async fetchOptions(_state, rt) {
554
+ const cals = await listCalendars(rt.config);
555
+ return [
556
+ {
557
+ value: ALL_CALENDARS,
558
+ label: rt.language === "ja" ? "\u3059\u3079\u3066\u306E\u30AB\u30EC\u30F3\u30C0\u30FC" : "All calendars"
559
+ },
560
+ ...cals.map((c) => ({ value: c.id, label: displayName(c) }))
561
+ ];
562
+ },
563
+ applyAnswer: (state, answer) => ({ ...state, calendars: answer })
564
+ }
565
+ ],
566
+ async finalize(state, rt) {
567
+ if (!state.calendars) {
568
+ throw new Error("Google Calendar setup: incomplete state on finalize");
569
+ }
570
+ const cals = await listCalendars(rt.config);
571
+ const byId = new Map(cals.map((c) => [c.id, c]));
572
+ const targetIds = await resolveSetupSelection({
573
+ selected: state.calendars,
574
+ allSentinel: ALL_CALENDARS,
575
+ fetchAll: async () => cals.map((c) => c.id),
576
+ limit: GOOGLE_CALENDAR_SETUP_MAX_CALENDARS
577
+ });
578
+ const sections = ["## Google Calendar", ""];
579
+ if (targetIds.length === 0) {
580
+ sections.push(
581
+ rt.language === "ja" ? "\u5BFE\u8C61\u306E\u30AB\u30EC\u30F3\u30C0\u30FC\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002" : "No calendars selected."
582
+ );
583
+ return sections.join("\n");
584
+ }
585
+ sections.push("| Calendar | Time Zone | Primary | Access |");
586
+ sections.push("|----------|-----------|---------|--------|");
587
+ for (const id of targetIds) {
588
+ const c = byId.get(id);
589
+ if (!c) {
590
+ sections.push(`| ${id} | - | - | - |`);
591
+ continue;
592
+ }
593
+ const tz = c.timeZone ?? "-";
594
+ const primary = c.primary ? "yes" : "no";
595
+ const access = c.accessRole ?? "-";
596
+ sections.push(
597
+ `| ${displayName(c)} | ${tz} | ${primary} | ${access} |`
598
+ );
599
+ }
600
+ sections.push("");
601
+ return sections.join("\n");
602
+ }
603
+ };
604
+
448
605
  // ../connectors/src/connectors/google-calendar-oauth/tools/request.ts
449
606
  import { z as z2 } from "zod";
450
607
  var BASE_HOST = "https://www.googleapis.com";
@@ -580,6 +737,7 @@ var tools = {
580
737
  var googleCalendarOauthConnector = new ConnectorPlugin({
581
738
  slug: "google-calendar",
582
739
  authType: AUTH_TYPES.OAUTH,
740
+ skipConnectionCheckOnCreate: true,
583
741
  name: "Google Calendar",
584
742
  description: "Connect to Google Calendar for calendar and event data access using OAuth.",
585
743
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2YsqoBEpdELmfDeFcyGHyE/4494c633b5ae15e562cb739cd85442c1/google-calendar.png",
@@ -728,6 +886,7 @@ console.log(event.summary, event.attendees);
728
886
  \`\`\``
729
887
  },
730
888
  tools,
889
+ setup: (params, ctx, config) => runSetupFlow(googleCalendarOauthSetupFlow, params, ctx, config),
731
890
  async checkConnection(params, config) {
732
891
  const { proxyFetch } = config;
733
892
  const calendarId = params[parameters.calendarId.slug] ?? "primary";
@@ -777,6 +936,7 @@ function resolveEnvVarOptional(entry, key) {
777
936
  import { getContext } from "hono/context-storage";
778
937
  import { getCookie } from "hono/cookie";
779
938
  var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
939
+ var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
780
940
  function normalizeHeaders(input) {
781
941
  const out = {};
782
942
  if (!input) return out;
@@ -785,6 +945,11 @@ function normalizeHeaders(input) {
785
945
  });
786
946
  return out;
787
947
  }
948
+ function extractInputUrl(input) {
949
+ if (typeof input === "string") return input;
950
+ if (input instanceof URL) return input.href;
951
+ return input.url;
952
+ }
788
953
  function createSandboxProxyFetch(connectionId) {
789
954
  return async (input, init) => {
790
955
  const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
@@ -794,10 +959,17 @@ function createSandboxProxyFetch(connectionId) {
794
959
  "Connection proxy is not configured. Please check your deployment settings."
795
960
  );
796
961
  }
797
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
962
+ const originalUrl = extractInputUrl(input);
963
+ const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
964
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
965
+ const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
966
+ return fetch(sessionUrl, {
967
+ method: "POST",
968
+ headers: { Authorization: `Bearer ${token}` }
969
+ });
970
+ }
798
971
  const originalMethod = init?.method ?? "GET";
799
972
  const originalBody = init?.body ? JSON.parse(init.body) : void 0;
800
- const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
801
973
  const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
802
974
  return fetch(proxyUrl, {
803
975
  method: "POST",
@@ -823,10 +995,9 @@ function createDeployedAppProxyFetch(connectionId) {
823
995
  }
824
996
  const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
825
997
  const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
998
+ const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
826
999
  return async (input, init) => {
827
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
828
- const originalMethod = init?.method ?? "GET";
829
- const originalBody = init?.body ? JSON.parse(init.body) : void 0;
1000
+ const originalUrl = extractInputUrl(input);
830
1001
  const c = getContext();
831
1002
  const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
832
1003
  if (!appSession) {
@@ -834,6 +1005,14 @@ function createDeployedAppProxyFetch(connectionId) {
834
1005
  "No authentication method available for connection proxy."
835
1006
  );
836
1007
  }
1008
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
1009
+ return fetch(sessionUrl, {
1010
+ method: "POST",
1011
+ headers: { Authorization: `Bearer ${appSession}` }
1012
+ });
1013
+ }
1014
+ const originalMethod = init?.method ?? "GET";
1015
+ const originalBody = init?.body ? JSON.parse(init.body) : void 0;
837
1016
  return fetch(proxyUrl, {
838
1017
  method: "POST",
839
1018
  headers: {