@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/wix-store/parameters.ts
57
+ init_parameter_definition();
46
58
  var parameters = {
47
59
  accountId: new ParameterDefinition({
48
60
  slug: "account-id",
@@ -266,6 +278,20 @@ var ConnectorPlugin = class _ConnectorPlugin {
266
278
  * `runSetupFlow` from `setup-flow.ts`.
267
279
  */
268
280
  setup;
281
+ /**
282
+ * Opt-out of the default "verify before save" behavior on connection
283
+ * creation. The backend invokes `checkConnection` synchronously while
284
+ * creating the connection and aborts (no row inserted) if it fails — this
285
+ * flag disables that for connectors where the check cannot succeed pre-save:
286
+ *
287
+ * - `squadbase-db` populates `connection-url` only after Neon provisioning
288
+ * - OAuth connectors require an OAuth-aware proxyFetch keyed by the
289
+ * connectionId, which doesn't exist until the row is saved
290
+ *
291
+ * Exceptions are the explicit position; new credential-input connectors get
292
+ * the default verify-on-create behavior without opt-in.
293
+ */
294
+ skipConnectionCheckOnCreate;
269
295
  constructor(config) {
270
296
  this.slug = config.slug;
271
297
  this.authType = config.authType;
@@ -283,6 +309,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
283
309
  this.query = config.query;
284
310
  this.checkConnection = config.checkConnection;
285
311
  this.setup = config.setup;
312
+ this.skipConnectionCheckOnCreate = config.skipConnectionCheckOnCreate;
286
313
  }
287
314
  get connectorKey() {
288
315
  return _ConnectorPlugin.deriveKey(this.slug, this.authType);
@@ -347,6 +374,46 @@ var ConnectorPlugin = class _ConnectorPlugin {
347
374
  }
348
375
  };
349
376
 
377
+ // ../connectors/src/setup-flow.ts
378
+ async function runSetupFlow(flow, params, ctx, config) {
379
+ const runtime = {
380
+ params,
381
+ language: ctx.language,
382
+ config
383
+ };
384
+ let state = flow.initialState();
385
+ let answerIdx = 0;
386
+ for (const step of flow.steps) {
387
+ const ans = ctx.answers[answerIdx];
388
+ if (ans && ans.questionSlug === step.slug) {
389
+ state = step.applyAnswer(state, ans.answer);
390
+ answerIdx += 1;
391
+ continue;
392
+ }
393
+ if (step.type === "text") {
394
+ return {
395
+ type: "nextQuestion",
396
+ questionSlug: step.slug,
397
+ question: step.question[ctx.language],
398
+ questionType: "text"
399
+ };
400
+ }
401
+ const options = step.fetchOptions ? await step.fetchOptions(state, runtime) : [];
402
+ if (options.length === 0) {
403
+ continue;
404
+ }
405
+ return {
406
+ type: "nextQuestion",
407
+ questionSlug: step.slug,
408
+ question: step.question[ctx.language],
409
+ questionType: step.type,
410
+ options
411
+ };
412
+ }
413
+ const dataInvestigationResult = await flow.finalize(state, runtime);
414
+ return { type: "fulfilled", dataInvestigationResult };
415
+ }
416
+
350
417
  // ../connectors/src/auth-types.ts
351
418
  var AUTH_TYPES = {
352
419
  OAUTH: "oauth",
@@ -369,9 +436,120 @@ var wixStoreOnboarding = new ConnectorOnboarding({
369
436
  }
370
437
  });
371
438
 
439
+ // ../connectors/src/connectors/wix-store/utils.ts
440
+ var BASE_URL = "https://www.wixapis.com";
441
+ async function apiFetch(params, path2, init) {
442
+ const apiKey = params[parameters.apiKey.slug];
443
+ const siteId = params[parameters.siteId.slug];
444
+ if (!apiKey || !siteId) {
445
+ throw new Error(
446
+ "wix-store: missing required parameters: api-key and site-id"
447
+ );
448
+ }
449
+ const url = `${BASE_URL}${path2.startsWith("/") ? "" : "/"}${path2}`;
450
+ const headers = new Headers(init?.headers);
451
+ headers.set("Authorization", apiKey);
452
+ headers.set("wix-site-id", siteId);
453
+ if (!headers.has("Content-Type")) {
454
+ headers.set("Content-Type", "application/json");
455
+ }
456
+ return fetch(url, { ...init, headers });
457
+ }
458
+
459
+ // ../connectors/src/connectors/wix-store/setup-flow.ts
460
+ var WIX_STORE_SETUP_MAX_ENTITIES = 10;
461
+ var ENTITY_LABELS = {
462
+ products: { en: "Products", ja: "Products (\u5546\u54C1)" },
463
+ orders: { en: "Orders", ja: "Orders (\u6CE8\u6587)" },
464
+ collections: { en: "Collections", ja: "Collections (\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3)" },
465
+ inventory: { en: "Inventory items", ja: "Inventory items (\u5728\u5EAB)" }
466
+ };
467
+ var ENTITY_VALUES = [
468
+ "products",
469
+ "orders",
470
+ "collections",
471
+ "inventory"
472
+ ];
473
+ var QUERY_SPECS = {
474
+ products: {
475
+ path: "/stores/v1/products/query",
476
+ body: { query: { paging: { limit: 1, offset: 0 } } },
477
+ totalField: "totalResults"
478
+ },
479
+ orders: {
480
+ path: "/ecom/v1/orders/search",
481
+ body: { search: { cursorPaging: { limit: 1 } } },
482
+ totalField: "pagingMetadata.total"
483
+ },
484
+ collections: {
485
+ path: "/stores/v1/collections/query",
486
+ body: { query: { paging: { limit: 1 } } },
487
+ totalField: "totalResults"
488
+ },
489
+ inventory: {
490
+ path: "/stores/v2/inventoryItems/query",
491
+ body: { query: { paging: { limit: 1 } } },
492
+ totalField: "totalResults"
493
+ }
494
+ };
495
+ function lookupNumeric(data, path2) {
496
+ const parts = path2.split(".");
497
+ let cur = data;
498
+ for (const p of parts) {
499
+ if (!cur || typeof cur !== "object") return void 0;
500
+ cur = cur[p];
501
+ }
502
+ return typeof cur === "number" ? cur : void 0;
503
+ }
504
+ var wixStoreSetupFlow = {
505
+ initialState: () => ({}),
506
+ steps: [
507
+ {
508
+ slug: "entities",
509
+ type: "multiSelect",
510
+ question: {
511
+ ja: "\u5BFE\u8C61\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09",
512
+ en: "Select target entities (multi-select allowed)"
513
+ },
514
+ async fetchOptions(_state, rt) {
515
+ return ENTITY_VALUES.map((value) => ({
516
+ value,
517
+ label: ENTITY_LABELS[value][rt.language]
518
+ }));
519
+ },
520
+ applyAnswer: (state, answer) => ({ ...state, entities: answer })
521
+ }
522
+ ],
523
+ async finalize(state, rt) {
524
+ if (!state.entities) {
525
+ throw new Error("Wix Store setup: incomplete state on finalize");
526
+ }
527
+ const selected = state.entities.filter((e) => ENTITY_VALUES.includes(e)).slice(0, WIX_STORE_SETUP_MAX_ENTITIES);
528
+ const sections = ["## Wix Store", ""];
529
+ for (const entity of selected) {
530
+ const spec = QUERY_SPECS[entity];
531
+ let count = "available";
532
+ const res = await apiFetch(rt.params, spec.path, {
533
+ method: "POST",
534
+ body: JSON.stringify(spec.body)
535
+ });
536
+ if (res.ok) {
537
+ const data = await res.json();
538
+ const total = lookupNumeric(data, spec.totalField);
539
+ if (typeof total === "number") count = String(total);
540
+ } else {
541
+ count = "unavailable";
542
+ }
543
+ sections.push(`### ${ENTITY_LABELS[entity].en}`, "");
544
+ sections.push(`Count: ${count}`, "");
545
+ }
546
+ return sections.join("\n");
547
+ }
548
+ };
549
+
372
550
  // ../connectors/src/connectors/wix-store/tools/request.ts
373
551
  import { z } from "zod";
374
- var BASE_URL = "https://www.wixapis.com/";
552
+ var BASE_URL2 = "https://www.wixapis.com/";
375
553
  var REQUEST_TIMEOUT_MS = 6e4;
376
554
  var inputSchema = z.object({
377
555
  toolUseIntent: z.string().optional().describe("Brief description of what you intend to accomplish with this tool call"),
@@ -406,7 +584,7 @@ Authentication is handled automatically using the API Key and Site ID.`,
406
584
  try {
407
585
  const apiKey = parameters.apiKey.getValue(connection2);
408
586
  const siteId = parameters.siteId.getValue(connection2);
409
- const url = `${BASE_URL}${path2}`;
587
+ const url = `${BASE_URL2}${path2}`;
410
588
  const controller = new AbortController();
411
589
  const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
412
590
  try {
@@ -601,7 +779,46 @@ export default async function handler(c: Context) {
601
779
  - \`POST stores/v2/inventoryItems/query\`
602
780
  - Body: \`{ "query": { "paging": { "limit": 50 } } }\``
603
781
  },
604
- tools
782
+ tools,
783
+ setup: (params, ctx, config) => runSetupFlow(wixStoreSetupFlow, params, ctx, config),
784
+ async checkConnection(params, _config) {
785
+ const apiKey = params[parameters.apiKey.slug];
786
+ const siteId = params[parameters.siteId.slug];
787
+ if (!apiKey || !siteId) {
788
+ return {
789
+ success: false,
790
+ error: "Missing required parameters: api-key and site-id"
791
+ };
792
+ }
793
+ try {
794
+ const res = await fetch(
795
+ "https://www.wixapis.com/stores/v1/products/query",
796
+ {
797
+ method: "POST",
798
+ headers: {
799
+ Authorization: apiKey,
800
+ "wix-site-id": siteId,
801
+ "Content-Type": "application/json",
802
+ Accept: "application/json"
803
+ },
804
+ body: JSON.stringify({ query: { paging: { limit: 1, offset: 0 } } })
805
+ }
806
+ );
807
+ if (!res.ok) {
808
+ const errorText = await res.text().catch(() => res.statusText);
809
+ return {
810
+ success: false,
811
+ error: `Wix Store API failed: HTTP ${res.status} ${errorText}`
812
+ };
813
+ }
814
+ return { success: true };
815
+ } catch (error) {
816
+ return {
817
+ success: false,
818
+ error: error instanceof Error ? error.message : String(error)
819
+ };
820
+ }
821
+ }
605
822
  });
606
823
 
607
824
  // src/connectors/create-connector-sdk.ts
@@ -630,6 +847,7 @@ function resolveEnvVarOptional(entry, key) {
630
847
  import { getContext } from "hono/context-storage";
631
848
  import { getCookie } from "hono/cookie";
632
849
  var APP_SESSION_COOKIE_NAME = "__Host-squadbase-session";
850
+ var TABLEAU_SESSION_SENTINEL_URL = "squadbase://tableau-session/";
633
851
  function normalizeHeaders(input) {
634
852
  const out = {};
635
853
  if (!input) return out;
@@ -638,6 +856,11 @@ function normalizeHeaders(input) {
638
856
  });
639
857
  return out;
640
858
  }
859
+ function extractInputUrl(input) {
860
+ if (typeof input === "string") return input;
861
+ if (input instanceof URL) return input.href;
862
+ return input.url;
863
+ }
641
864
  function createSandboxProxyFetch(connectionId) {
642
865
  return async (input, init) => {
643
866
  const token = process.env.INTERNAL_SQUADBASE_OAUTH_MACHINE_CREDENTIAL;
@@ -647,10 +870,17 @@ function createSandboxProxyFetch(connectionId) {
647
870
  "Connection proxy is not configured. Please check your deployment settings."
648
871
  );
649
872
  }
650
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
873
+ const originalUrl = extractInputUrl(input);
874
+ const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
875
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
876
+ const sessionUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
877
+ return fetch(sessionUrl, {
878
+ method: "POST",
879
+ headers: { Authorization: `Bearer ${token}` }
880
+ });
881
+ }
651
882
  const originalMethod = init?.method ?? "GET";
652
883
  const originalBody = init?.body ? JSON.parse(init.body) : void 0;
653
- const baseDomain = process.env["SQUADBASE_PREVIEW_BASE_DOMAIN"] ?? "preview.app.squadbase.dev";
654
884
  const proxyUrl = `https://${sandboxId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
655
885
  return fetch(proxyUrl, {
656
886
  method: "POST",
@@ -676,10 +906,9 @@ function createDeployedAppProxyFetch(connectionId) {
676
906
  }
677
907
  const baseDomain = process.env["SQUADBASE_APP_BASE_DOMAIN"] ?? "squadbase.app";
678
908
  const proxyUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/request`;
909
+ const sessionUrl = `https://${projectId}.${baseDomain}/_sqcore/connections/${connectionId}/tableau-session`;
679
910
  return async (input, init) => {
680
- const originalUrl = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
681
- const originalMethod = init?.method ?? "GET";
682
- const originalBody = init?.body ? JSON.parse(init.body) : void 0;
911
+ const originalUrl = extractInputUrl(input);
683
912
  const c = getContext();
684
913
  const appSession = getCookie(c, APP_SESSION_COOKIE_NAME);
685
914
  if (!appSession) {
@@ -687,6 +916,14 @@ function createDeployedAppProxyFetch(connectionId) {
687
916
  "No authentication method available for connection proxy."
688
917
  );
689
918
  }
919
+ if (originalUrl === TABLEAU_SESSION_SENTINEL_URL) {
920
+ return fetch(sessionUrl, {
921
+ method: "POST",
922
+ headers: { Authorization: `Bearer ${appSession}` }
923
+ });
924
+ }
925
+ const originalMethod = init?.method ?? "GET";
926
+ const originalBody = init?.body ? JSON.parse(init.body) : void 0;
690
927
  return fetch(proxyUrl, {
691
928
  method: "POST",
692
929
  headers: {