@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,46 +1,57 @@
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/mailchimp-oauth/sdk/index.ts
46
57
  function createClient(params, fetchFn = fetch) {
@@ -125,6 +136,20 @@ var ConnectorPlugin = class _ConnectorPlugin {
125
136
  * `runSetupFlow` from `setup-flow.ts`.
126
137
  */
127
138
  setup;
139
+ /**
140
+ * Opt-out of the default "verify before save" behavior on connection
141
+ * creation. The backend invokes `checkConnection` synchronously while
142
+ * creating the connection and aborts (no row inserted) if it fails — this
143
+ * flag disables that for connectors where the check cannot succeed pre-save:
144
+ *
145
+ * - `squadbase-db` populates `connection-url` only after Neon provisioning
146
+ * - OAuth connectors require an OAuth-aware proxyFetch keyed by the
147
+ * connectionId, which doesn't exist until the row is saved
148
+ *
149
+ * Exceptions are the explicit position; new credential-input connectors get
150
+ * the default verify-on-create behavior without opt-in.
151
+ */
152
+ skipConnectionCheckOnCreate;
128
153
  constructor(config) {
129
154
  this.slug = config.slug;
130
155
  this.authType = config.authType;
@@ -142,6 +167,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
142
167
  this.query = config.query;
143
168
  this.checkConnection = config.checkConnection;
144
169
  this.setup = config.setup;
170
+ this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
145
171
  }
146
172
  get connectorKey() {
147
173
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -206,6 +232,51 @@ var ConnectorPlugin = class _ConnectorPlugin {
206
232
  }
207
233
  };
208
234
 
235
+ // ../connectors/src/setup-flow.ts
236
+ async function runSetupFlow(flow, params, ctx, config) {
237
+ const runtime = {
238
+ params,
239
+ language: ctx.language,
240
+ config
241
+ };
242
+ let state = flow.initialState();
243
+ let answerIdx = 0;
244
+ for (const step of flow.steps) {
245
+ const ans = ctx.answers[answerIdx];
246
+ if (ans && ans.questionSlug === step.slug) {
247
+ state = step.applyAnswer(state, ans.answer);
248
+ answerIdx += 1;
249
+ continue;
250
+ }
251
+ if (step.type === "text") {
252
+ return {
253
+ type: "nextQuestion",
254
+ questionSlug: step.slug,
255
+ question: step.question[ctx.language],
256
+ questionType: "text"
257
+ };
258
+ }
259
+ const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
260
+ if (options.length === 0) {
261
+ continue;
262
+ }
263
+ return {
264
+ type: "nextQuestion",
265
+ questionSlug: step.slug,
266
+ question: step.question[ctx.language],
267
+ questionType: step.type,
268
+ options
269
+ };
270
+ }
271
+ const dataInvestigationResult = await flow.finalize(state, runtime);
272
+ return { type: "fulfilled", dataInvestigationResult };
273
+ }
274
+ async function resolveSetupSelection(params) {
275
+ const { selected, allSentinel, fetchAll, limit } = params;
276
+ const resolved = selected.includes(allSentinel) ? await fetchAll() : selected.filter((v) => v !== allSentinel);
277
+ return resolved.slice(0, limit);
278
+ }
279
+
209
280
  // ../connectors/src/auth-types.ts
210
281
  var AUTH_TYPES = {
211
282
  OAUTH: "oauth",
@@ -231,6 +302,7 @@ var mailchimpOauthOnboarding = new ConnectorOnboarding({
231
302
  });
232
303
 
233
304
  // ../connectors/src/connectors/mailchimp-oauth/parameters.ts
305
+ init_parameter_definition();
234
306
  var parameters = {
235
307
  serverPrefix: new ParameterDefinition({
236
308
  slug: "server-prefix",
@@ -243,6 +315,100 @@ var parameters = {
243
315
  })
244
316
  };
245
317
 
318
+ // ../connectors/src/connectors/mailchimp-oauth/utils.ts
319
+ function apiFetch(params, proxyFetch, path2, init) {
320
+ const serverPrefix = params[parameters.serverPrefix.slug];
321
+ if (!serverPrefix) {
322
+ throw new Error(
323
+ "mailchimp-oauth: missing required parameter: server-prefix"
324
+ );
325
+ }
326
+ const baseUrl = `https://${serverPrefix}.api.mailchimp.com/3.0`;
327
+ const url = `${baseUrl}${path2.startsWith("/") ? "" : "/"}${path2}`;
328
+ return proxyFetch(url, init);
329
+ }
330
+
331
+ // ../connectors/src/connectors/mailchimp-oauth/setup-flow.ts
332
+ var ALL_AUDIENCES = "__ALL_AUDIENCES__";
333
+ var MAILCHIMP_SETUP_MAX_AUDIENCES = 10;
334
+ async function listAudiences(params, proxyFetch) {
335
+ const res = await apiFetch(
336
+ params,
337
+ proxyFetch,
338
+ "/lists?count=1000&fields=lists.id,lists.name,lists.stats"
339
+ );
340
+ if (!res.ok) {
341
+ const body = await res.text().catch(() => res.statusText);
342
+ throw new Error(
343
+ `mailchimp-oauth: listAudiences failed (${res.status}): ${body}`
344
+ );
345
+ }
346
+ const data = await res.json();
347
+ return data.lists ?? [];
348
+ }
349
+ var mailchimpOauthSetupFlow = {
350
+ initialState: () => ({}),
351
+ steps: [
352
+ {
353
+ slug: "audiences",
354
+ type: "multiSelect",
355
+ question: {
356
+ ja: "\u5BFE\u8C61\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
357
+ en: "Select target audiences (multi-select allowed)"
358
+ },
359
+ async fetchOptions(_state, rt) {
360
+ const lists = await listAudiences(rt.params, rt.config.proxyFetch);
361
+ const opts = lists.filter((l) => l.id && l.name).map((l) => ({ value: l.id, label: l.name }));
362
+ if (opts.length === 0) return [];
363
+ return [
364
+ {
365
+ value: ALL_AUDIENCES,
366
+ label: rt.language === "ja" ? "\u3059\u3079\u3066\u306E\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9" : "All audiences"
367
+ },
368
+ ...opts
369
+ ];
370
+ },
371
+ applyAnswer: (state, answer) => ({ ...state, audiences: answer })
372
+ }
373
+ ],
374
+ async finalize(state, rt) {
375
+ if (!state.audiences) {
376
+ throw new Error("Mailchimp setup: incomplete state on finalize");
377
+ }
378
+ const lists = await listAudiences(rt.params, rt.config.proxyFetch);
379
+ const listById = new Map(lists.map((l) => [l.id, l]));
380
+ const targetIds = await resolveSetupSelection({
381
+ selected: state.audiences,
382
+ allSentinel: ALL_AUDIENCES,
383
+ fetchAll: async () => lists.map((l) => l.id).filter((id) => id),
384
+ limit: MAILCHIMP_SETUP_MAX_AUDIENCES
385
+ });
386
+ const sections = ["## Mailchimp", ""];
387
+ for (const id of targetIds) {
388
+ const list = listById.get(id);
389
+ if (!list) {
390
+ sections.push(`### Audience: ${id}`, "", "_Not found._", "");
391
+ continue;
392
+ }
393
+ const stats = list.stats ?? {};
394
+ sections.push(`### Audience: ${list.name}`, "");
395
+ sections.push("| Metric | Value |");
396
+ sections.push("|--------|-------|");
397
+ sections.push(`| Members | ${stats.member_count ?? "-"} |`);
398
+ sections.push(`| Unsubscribed | ${stats.unsubscribe_count ?? "-"} |`);
399
+ sections.push(`| Cleaned | ${stats.cleaned_count ?? "-"} |`);
400
+ sections.push(
401
+ `| Open rate | ${stats.open_rate != null ? stats.open_rate : "-"} |`
402
+ );
403
+ sections.push(
404
+ `| Click rate | ${stats.click_rate != null ? stats.click_rate : "-"} |`
405
+ );
406
+ sections.push("");
407
+ }
408
+ return sections.join("\n");
409
+ }
410
+ };
411
+
246
412
  // ../connectors/src/connectors/mailchimp-oauth/tools/request.ts
247
413
  import { z } from "zod";
248
414
  var REQUEST_TIMEOUT_MS = 6e4;
@@ -364,6 +530,7 @@ var tools = { request: requestTool };
364
530
  var mailchimpOauthConnector = new ConnectorPlugin({
365
531
  slug: "mailchimp",
366
532
  authType: AUTH_TYPES.OAUTH,
533
+ skipConnectionCheckOnCreate: true,
367
534
  name: "Mailchimp (OAuth)",
368
535
  description: "Connect to Mailchimp for email marketing, audiences, campaigns, and analytics using OAuth.",
369
536
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/19Rac6B8eGiLpQb4lKMbG3/10f567f85572aeb16f2ee6aaa6602987/mailchimp.png",
@@ -498,6 +665,7 @@ const data = await res.json();
498
665
  \`\`\``
499
666
  },
500
667
  tools,
668
+ setup: (params, ctx, config) => runSetupFlow(mailchimpOauthSetupFlow, params, ctx, config),
501
669
  async checkConnection(params, config) {
502
670
  const { proxyFetch } = config;
503
671
  const serverPrefix = params["server-prefix"];
@@ -549,6 +717,7 @@ function resolveEnvVarOptional(entry, key) {
549
717
  import { getContext } from "hono/context-storage";
550
718
  import { getCookie } from "hono/cookie";
551
719
  var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
720
+ var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
552
721
  function normalizeHeaders(input) {
553
722
  const out = {};
554
723
  if (!input) return out;
@@ -557,6 +726,11 @@ function normalizeHeaders(input) {
557
726
  });
558
727
  return out;
559
728
  }
729
+ function extractInputUrl(input) {
730
+ if (typeof input === "string") return input;
731
+ if (input instanceof URL) return input.href;
732
+ return input.url;
733
+ }
560
734
  function createSandboxProxyFetch(connectionId) {
561
735
  return async (input, init) => {
562
736
  const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
@@ -566,10 +740,17 @@ function createSandboxProxyFetch(connectionId) {
566
740
  "Connection proxy is not configured. Please check your deployment settings."
567
741
  );
568
742
  }
569
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
743
+ const originalUrl = extractInputUrl(input);
744
+ const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
745
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
746
+ const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
747
+ return fetch(sessionUrl, {
748
+ method: "POST",
749
+ headers: { Authorization: `Bearer ${token}` }
750
+ });
751
+ }
570
752
  const originalMethod = init?.method ?? "GET";
571
753
  const originalBody = init?.body ? JSON.parse(init.body) : void 0;
572
- const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
573
754
  const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
574
755
  return fetch(proxyUrl, {
575
756
  method: "POST",
@@ -595,10 +776,9 @@ function createDeployedAppProxyFetch(connectionId) {
595
776
  }
596
777
  const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
597
778
  const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
779
+ const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
598
780
  return async (input, init) => {
599
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
600
- const originalMethod = init?.method ?? "GET";
601
- const originalBody = init?.body ? JSON.parse(init.body) : void 0;
781
+ const originalUrl = extractInputUrl(input);
602
782
  const c = getContext();
603
783
  const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
604
784
  if (!appSession) {
@@ -606,6 +786,14 @@ function createDeployedAppProxyFetch(connectionId) {
606
786
  "No authentication method available for connection proxy."
607
787
  );
608
788
  }
789
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
790
+ return fetch(sessionUrl, {
791
+ method: "POST",
792
+ headers: { Authorization: `Bearer ${appSession}` }
793
+ });
794
+ }
795
+ const originalMethod = init?.method ?? "GET";
796
+ const originalBody = init?.body ? JSON.parse(init.body) : void 0;
609
797
  return fetch(proxyUrl, {
610
798
  method: "POST",
611
799
  headers: {