@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-search-console-oauth/parameters.ts
57
+ init_parameter_definition();
46
58
  var parameters = {
47
59
  siteUrl: new ParameterDefinition({
48
60
  slug: "site-url",
@@ -203,6 +215,20 @@ var ConnectorPlugin = class _ConnectorPlugin {
203
215
  * `runSetupFlow` from `setup-flow.ts`.
204
216
  */
205
217
  setup;
218
+ /**
219
+ * Opt-out of the default "verify before save" behavior on connection
220
+ * creation. The backend invokes `checkConnection` synchronously while
221
+ * creating the connection and aborts (no row inserted) if it fails — this
222
+ * flag disables that for connectors where the check cannot succeed pre-save:
223
+ *
224
+ * - `squadbase-db` populates `connection-url` only after Neon provisioning
225
+ * - OAuth connectors require an OAuth-aware proxyFetch keyed by the
226
+ * connectionId, which doesn't exist until the row is saved
227
+ *
228
+ * Exceptions are the explicit position; new credential-input connectors get
229
+ * the default verify-on-create behavior without opt-in.
230
+ */
231
+ skipConnectionCheckOnCreate;
206
232
  constructor(config) {
207
233
  this.slug = config.slug;
208
234
  this.authType = config.authType;
@@ -220,6 +246,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
220
246
  this.query = config.query;
221
247
  this.checkConnection = config.checkConnection;
222
248
  this.setup = config.setup;
249
+ this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
223
250
  }
224
251
  get connectorKey() {
225
252
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -284,6 +311,51 @@ var ConnectorPlugin = class _ConnectorPlugin {
284
311
  }
285
312
  };
286
313
 
314
+ // ../connectors/src/setup-flow.ts
315
+ async function runSetupFlow(flow, params, ctx, config) {
316
+ const runtime = {
317
+ params,
318
+ language: ctx.language,
319
+ config
320
+ };
321
+ let state = flow.initialState();
322
+ let answerIdx = 0;
323
+ for (const step of flow.steps) {
324
+ const ans = ctx.answers[answerIdx];
325
+ if (ans && ans.questionSlug === step.slug) {
326
+ state = step.applyAnswer(state, ans.answer);
327
+ answerIdx += 1;
328
+ continue;
329
+ }
330
+ if (step.type === "text") {
331
+ return {
332
+ type: "nextQuestion",
333
+ questionSlug: step.slug,
334
+ question: step.question[ctx.language],
335
+ questionType: "text"
336
+ };
337
+ }
338
+ const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
339
+ if (options.length === 0) {
340
+ continue;
341
+ }
342
+ return {
343
+ type: "nextQuestion",
344
+ questionSlug: step.slug,
345
+ question: step.question[ctx.language],
346
+ questionType: step.type,
347
+ options
348
+ };
349
+ }
350
+ const dataInvestigationResult = await flow.finalize(state, runtime);
351
+ return { type: "fulfilled", dataInvestigationResult };
352
+ }
353
+ async function resolveSetupSelection(params) {
354
+ const { selected, allSentinel, fetchAll, limit } = params;
355
+ const resolved = selected.includes(allSentinel) ? await fetchAll() : selected.filter((v) => v !== allSentinel);
356
+ return resolved.slice(0, limit);
357
+ }
358
+
287
359
  // ../connectors/src/auth-types.ts
288
360
  var AUTH_TYPES = {
289
361
  OAUTH: "oauth",
@@ -459,6 +531,88 @@ var googleSearchConsoleOauthOnboarding = new ConnectorOnboarding({
459
531
  }
460
532
  });
461
533
 
534
+ // ../connectors/src/connectors/google-search-console-oauth/setup-flow.ts
535
+ var SITES_URL = "https://www.googleapis.com/webmasters/v3/sites";
536
+ var ALL_SITES = "__ALL_SITES__";
537
+ var GOOGLE_SEARCH_CONSOLE_SETUP_MAX_SITES = 20;
538
+ async function listSites(proxyFetch) {
539
+ const res = await proxyFetch(SITES_URL, { method: "GET" });
540
+ if (!res.ok) {
541
+ const body = await res.text().catch(() => res.statusText);
542
+ throw new Error(
543
+ `google-search-console-oauth: listSites failed (${res.status}): ${body}`
544
+ );
545
+ }
546
+ const data = await res.json();
547
+ return data.siteEntry ?? [];
548
+ }
549
+ function isVerified(site) {
550
+ const level = site.permissionLevel ?? "";
551
+ return level !== "" && level !== "siteUnverifiedUser";
552
+ }
553
+ var googleSearchConsoleOauthSetupFlow = {
554
+ initialState: () => ({}),
555
+ steps: [
556
+ {
557
+ slug: "sites",
558
+ type: "multiSelect",
559
+ question: {
560
+ ja: "\u5BFE\u8C61\u306E Search Console \u30B5\u30A4\u30C8\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
561
+ en: "Select target Search Console sites (multi-select allowed)"
562
+ },
563
+ async fetchOptions(_state, rt) {
564
+ const sites = await listSites(rt.config.proxyFetch);
565
+ const siteOptions = sites.filter(isVerified).map((s) => {
566
+ const url = s.siteUrl ?? "";
567
+ if (!url) return null;
568
+ const label = s.permissionLevel ? `${url} (${s.permissionLevel})` : url;
569
+ return { value: url, label };
570
+ }).filter((v) => v != null);
571
+ if (siteOptions.length === 0) return [];
572
+ return [
573
+ {
574
+ value: ALL_SITES,
575
+ label: rt.language === "ja" ? "\u3059\u3079\u3066\u306E\u30B5\u30A4\u30C8" : "All sites"
576
+ },
577
+ ...siteOptions
578
+ ];
579
+ },
580
+ applyAnswer: (state, answer) => ({ ...state, sites: answer })
581
+ }
582
+ ],
583
+ async finalize(state, rt) {
584
+ if (!state.sites) {
585
+ throw new Error(
586
+ "Google Search Console setup: incomplete state on finalize"
587
+ );
588
+ }
589
+ const allSites = await listSites(rt.config.proxyFetch);
590
+ const verified = allSites.filter(isVerified);
591
+ const siteByUrl = new Map(verified.map((s) => [s.siteUrl ?? "", s]));
592
+ const targetSiteUrls = await resolveSetupSelection({
593
+ selected: state.sites,
594
+ allSentinel: ALL_SITES,
595
+ fetchAll: async () => verified.map((s) => s.siteUrl ?? "").filter((u) => u),
596
+ limit: GOOGLE_SEARCH_CONSOLE_SETUP_MAX_SITES
597
+ });
598
+ const sections = ["## Google Search Console", ""];
599
+ if (targetSiteUrls.length === 0) {
600
+ sections.push("_No sites selected._", "");
601
+ return sections.join("\n");
602
+ }
603
+ sections.push("| Site URL | Permission Level |");
604
+ sections.push("|----------|------------------|");
605
+ for (const siteUrl of targetSiteUrls) {
606
+ const site = siteByUrl.get(siteUrl);
607
+ const permission = site?.permissionLevel ?? "-";
608
+ const safeSiteUrl = siteUrl.replace(/\|/g, "\\|");
609
+ sections.push(`| ${safeSiteUrl} | ${permission} |`);
610
+ }
611
+ sections.push("");
612
+ return sections.join("\n");
613
+ }
614
+ };
615
+
462
616
  // ../connectors/src/connectors/google-search-console-oauth/tools/request.ts
463
617
  import { z as z2 } from "zod";
464
618
  var BASE_HOST = "https://searchconsole.googleapis.com";
@@ -598,6 +752,7 @@ var tools = {
598
752
  var googleSearchConsoleOauthConnector = new ConnectorPlugin({
599
753
  slug: "google-search-console",
600
754
  authType: AUTH_TYPES.OAUTH,
755
+ skipConnectionCheckOnCreate: true,
601
756
  name: "Google Search Console",
602
757
  description: "Connect to Google Search Console for search performance, indexing, and sitemap data using OAuth.",
603
758
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/3rPusKosno7i1emOCmskTp/9ed092a4dc95efb74e34e83098ef3905/google-search-console-icon.webp",
@@ -788,6 +943,7 @@ sitemaps.forEach(s => console.log(s.path, s.lastSubmitted));
788
943
  \`\`\``
789
944
  },
790
945
  tools,
946
+ setup: (params, ctx, config) => runSetupFlow(googleSearchConsoleOauthSetupFlow, params, ctx, config),
791
947
  async checkConnection(params, config) {
792
948
  const { proxyFetch } = config;
793
949
  const siteUrl = params[parameters.siteUrl.slug];
@@ -837,6 +993,7 @@ function resolveEnvVarOptional(entry, key) {
837
993
  import { getContext } from "hono/context-storage";
838
994
  import { getCookie } from "hono/cookie";
839
995
  var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
996
+ var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
840
997
  function normalizeHeaders(input) {
841
998
  const out = {};
842
999
  if (!input) return out;
@@ -845,6 +1002,11 @@ function normalizeHeaders(input) {
845
1002
  });
846
1003
  return out;
847
1004
  }
1005
+ function extractInputUrl(input) {
1006
+ if (typeof input === "string") return input;
1007
+ if (input instanceof URL) return input.href;
1008
+ return input.url;
1009
+ }
848
1010
  function createSandboxProxyFetch(connectionId) {
849
1011
  return async (input, init) => {
850
1012
  const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
@@ -854,10 +1016,17 @@ function createSandboxProxyFetch(connectionId) {
854
1016
  "Connection proxy is not configured. Please check your deployment settings."
855
1017
  );
856
1018
  }
857
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
1019
+ const originalUrl = extractInputUrl(input);
1020
+ const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
1021
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
1022
+ const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
1023
+ return fetch(sessionUrl, {
1024
+ method: "POST",
1025
+ headers: { Authorization: `Bearer ${token}` }
1026
+ });
1027
+ }
858
1028
  const originalMethod = init?.method ?? "GET";
859
1029
  const originalBody = init?.body ? JSON.parse(init.body) : void 0;
860
- const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
861
1030
  const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
862
1031
  return fetch(proxyUrl, {
863
1032
  method: "POST",
@@ -883,10 +1052,9 @@ function createDeployedAppProxyFetch(connectionId) {
883
1052
  }
884
1053
  const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
885
1054
  const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
1055
+ const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
886
1056
  return async (input, init) => {
887
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
888
- const originalMethod = init?.method ?? "GET";
889
- const originalBody = init?.body ? JSON.parse(init.body) : void 0;
1057
+ const originalUrl = extractInputUrl(input);
890
1058
  const c = getContext();
891
1059
  const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
892
1060
  if (!appSession) {
@@ -894,6 +1062,14 @@ function createDeployedAppProxyFetch(connectionId) {
894
1062
  "No authentication method available for connection proxy."
895
1063
  );
896
1064
  }
1065
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
1066
+ return fetch(sessionUrl, {
1067
+ method: "POST",
1068
+ headers: { Authorization: `Bearer ${appSession}` }
1069
+ });
1070
+ }
1071
+ const originalMethod = init?.method ?? "GET";
1072
+ const originalBody = init?.body ? JSON.parse(init.body) : void 0;
897
1073
  return fetch(proxyUrl, {
898
1074
  method: "POST",
899
1075
  headers: {