@squadbase/vite-server 0.1.10-dev.9dac57b → 0.1.10-dev.d23e546

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.
@@ -109,7 +109,7 @@ function createClient(params) {
109
109
  queryOptions.partitionKey = options.partitionKey;
110
110
  }
111
111
  const iterator = cont.items.query(sql, queryOptions);
112
- const { resources } = await iterator.fetchNext();
112
+ const { resources } = await iterator.fetchAll();
113
113
  return resources ?? [];
114
114
  } catch (err) {
115
115
  const msg = err instanceof Error ? err.message : String(err);
@@ -445,7 +445,7 @@ Use \`TOP n\` (not \`LIMIT n\`) to bound the result. Cross-partition queries are
445
445
  }
446
446
  }
447
447
  const iterator = cont.items.query(sql, queryOptions);
448
- const { resources, requestCharge } = await iterator.fetchNext();
448
+ const { resources, requestCharge } = await iterator.fetchAll();
449
449
  const documents = resources ?? [];
450
450
  const truncated = documents.length > MAX_DOCUMENTS;
451
451
  return {
@@ -522,7 +522,7 @@ export default async function handler(_c: Context) {
522
522
  - Queries always target a single container and reference items via the alias \`c\` (e.g. \`SELECT c.id, c.name FROM c WHERE c.status = 'active'\`).
523
523
  - Row limiting: use \`TOP n\` (e.g. \`SELECT TOP 100 * FROM c\`). \`LIMIT\` is **not** supported. \`OFFSET m LIMIT n\` is supported on newer accounts but \`TOP\` is the safe default.
524
524
  - System fields are prefixed with an underscore (\`c.id\`, \`c._ts\` for the modification timestamp, \`c._etag\`).
525
- - Aggregates: \`COUNT(1)\`, \`SUM\`, \`AVG\`, \`MIN\`, \`MAX\`, with \`GROUP BY\` (e.g. \`SELECT c.country, COUNT(1) AS n FROM c GROUP BY c.country\`).
525
+ - Aggregates: \`COUNT(1)\`, \`SUM\`, \`AVG\`, \`MIN\`, \`MAX\`, with \`GROUP BY\` (e.g. \`SELECT c.country, COUNT(1) AS n FROM c GROUP BY c.country\`). Cross-partition \`GROUP BY\` is fully supported \u2014 the connector drains all result pages internally, so trust the returned rows even for queries that span many partitions. Do **not** work around perceived missing rows by re-fetching all items and aggregating in TypeScript.
526
526
  - Joins: only **intra-document** joins via \`JOIN\` over arrays inside the same item; there is no cross-container/cross-document join.
527
527
  - Always bound results with \`TOP n\` and prefer scoped queries with a \`partitionKey\` value when possible \u2014 cross-partition queries cost more RUs.`,
528
528
  ja: `### \u30C4\u30FC\u30EB
@@ -568,7 +568,7 @@ export default async function handler(_c: Context) {
568
568
  - \u30AF\u30A8\u30EA\u306F\u5E38\u306B\u5358\u4E00\u30B3\u30F3\u30C6\u30CA\u3092\u5BFE\u8C61\u3068\u3057\u3001\u30A2\u30A4\u30C6\u30E0\u306F\u5225\u540D \`c\` \u3067\u53C2\u7167\u3057\u307E\u3059\uFF08\u4F8B: \`SELECT c.id, c.name FROM c WHERE c.status = 'active'\`\uFF09\u3002
569
569
  - \u884C\u6570\u5236\u9650: \`TOP n\` \u3092\u4F7F\u7528\u3057\u307E\u3059\uFF08\u4F8B: \`SELECT TOP 100 * FROM c\`\uFF09\u3002\`LIMIT\` \u306F **\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093**\u3002\u65B0\u3057\u3044\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u306F \`OFFSET m LIMIT n\` \u304C\u4F7F\u3048\u307E\u3059\u304C\u3001\u5B89\u5168\u5074\u306E\u65E2\u5B9A\u306F \`TOP\` \u3067\u3059\u3002
570
570
  - \u30B7\u30B9\u30C6\u30E0\u30D5\u30A3\u30FC\u30EB\u30C9\u306F\u30A2\u30F3\u30C0\u30FC\u30B9\u30B3\u30A2\u59CB\u307E\u308A\uFF08\`c.id\`\u3001\u5909\u66F4\u6642\u523B\u306E \`c._ts\`\u3001\`c._etag\`\uFF09\u3002
571
- - \u96C6\u7D04: \`COUNT(1)\`\u3001\`SUM\`\u3001\`AVG\`\u3001\`MIN\`\u3001\`MAX\` \u3092 \`GROUP BY\` \u3068\u7D44\u307F\u5408\u308F\u305B\u307E\u3059\uFF08\u4F8B: \`SELECT c.country, COUNT(1) AS n FROM c GROUP BY c.country\`\uFF09\u3002
571
+ - \u96C6\u7D04: \`COUNT(1)\`\u3001\`SUM\`\u3001\`AVG\`\u3001\`MIN\`\u3001\`MAX\` \u3092 \`GROUP BY\` \u3068\u7D44\u307F\u5408\u308F\u305B\u307E\u3059\uFF08\u4F8B: \`SELECT c.country, COUNT(1) AS n FROM c GROUP BY c.country\`\uFF09\u3002\u30AF\u30ED\u30B9\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306E \`GROUP BY\` \u3082\u5B8C\u5168\u306B\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u304A\u308A\u3001\u30B3\u30CD\u30AF\u30BF\u304C\u5185\u90E8\u3067\u5168\u7D50\u679C\u30DA\u30FC\u30B8\u3092\u30C9\u30EC\u30A4\u30F3\u3059\u308B\u305F\u3081\u3001\u591A\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u307E\u305F\u304C\u308B\u30AF\u30A8\u30EA\u3067\u3082\u8FD4\u3063\u3066\u304D\u305F\u884C\u6570\u3092\u305D\u306E\u307E\u307E\u4FE1\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002**\u300C\u7D50\u679C\u304C\u6B20\u3051\u3066\u3044\u308B\u3088\u3046\u306B\u898B\u3048\u308B\u300D\u304B\u3089\u3068\u3044\u3063\u3066\u5168\u4EF6\u53D6\u5F97\u2192TS \u5074\u3067\u96C6\u8A08\u3059\u308B\u8FC2\u56DE\u306F\u3057\u306A\u3044\u3053\u3068\u3002**
572
572
  - \u7D50\u5408: \u540C\u4E00\u30A2\u30A4\u30C6\u30E0\u5185\u306E\u914D\u5217\u306B\u5BFE\u3059\u308B **\u30A4\u30F3\u30C8\u30E9\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8** \`JOIN\` \u306E\u307F\u3067\u3001\u30B3\u30F3\u30C6\u30CA\u9593\uFF0F\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u9593\u306E\u7D50\u5408\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3002
573
573
  - \u7D50\u679C\u4EF6\u6570\u306F\u5FC5\u305A \`TOP n\` \u3067\u5236\u9650\u3057\u3001\u53EF\u80FD\u3067\u3042\u308C\u3070 \`partitionKey\` \u3067\u5358\u4E00\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u30B9\u30B3\u30FC\u30D7\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u30AF\u30ED\u30B9\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u306F RU \u3092\u591A\u304F\u6D88\u8CBB\u3057\u307E\u3059\uFF09\u3002`
574
574
  },
@@ -305,6 +305,65 @@ var AUTH_TYPES = {
305
305
 
306
306
  // ../connectors/src/connectors/google-ads/tools/list-customers.ts
307
307
  import { z } from "zod";
308
+
309
+ // ../connectors/src/connectors/google-ads/error.ts
310
+ var parseJsonOrNull = (text) => {
311
+ if (text.length === 0) return null;
312
+ try {
313
+ return JSON.parse(text);
314
+ } catch {
315
+ return null;
316
+ }
317
+ };
318
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
319
+ var collectGoogleAdsErrorCodes = (details) => {
320
+ if (!Array.isArray(details)) return [];
321
+ const codes = [];
322
+ for (const detail of details) {
323
+ if (!isRecord(detail)) continue;
324
+ const errors = detail.errors;
325
+ if (!Array.isArray(errors)) continue;
326
+ for (const e of errors) {
327
+ if (!isRecord(e)) continue;
328
+ const errorCode = e.errorCode;
329
+ if (!isRecord(errorCode)) continue;
330
+ for (const [k, v] of Object.entries(errorCode)) {
331
+ if (typeof v === "string") codes.push(`${k}=${v}`);
332
+ }
333
+ }
334
+ }
335
+ return codes;
336
+ };
337
+ var extractGoogleAdsErrorMessage = (status, statusText, parsedBody, rawText) => {
338
+ const fallback = `HTTP ${status} ${statusText}`;
339
+ if (isRecord(parsedBody)) {
340
+ const errorField = parsedBody.error;
341
+ if (typeof errorField === "string") return errorField;
342
+ if (isRecord(errorField)) {
343
+ const message = typeof errorField.message === "string" ? errorField.message : null;
344
+ const errorStatus = typeof errorField.status === "string" ? errorField.status : null;
345
+ const codes = collectGoogleAdsErrorCodes(errorField.details);
346
+ const parts = [
347
+ fallback,
348
+ errorStatus,
349
+ message,
350
+ codes.length > 0 ? `[${codes.join(", ")}]` : null
351
+ ].filter((p) => p != null && p.length > 0);
352
+ if (parts.length > 1) return parts.join(": ");
353
+ }
354
+ if (typeof parsedBody.message === "string") {
355
+ return `${fallback}: ${parsedBody.message}`;
356
+ }
357
+ }
358
+ if (rawText.length > 0) {
359
+ const trimmed = rawText.trim();
360
+ const preview = trimmed.length > 500 ? `${trimmed.slice(0, 500)}\u2026` : trimmed;
361
+ return `${fallback}: ${preview}`;
362
+ }
363
+ return fallback;
364
+ };
365
+
366
+ // ../connectors/src/connectors/google-ads/tools/list-customers.ts
308
367
  var REQUEST_TIMEOUT_MS = 6e4;
309
368
  var cachedToken = null;
310
369
  async function getProxyToken(config) {
@@ -394,12 +453,20 @@ var listCustomersTool = new ConnectorTool({
394
453
  signal: controller.signal
395
454
  })
396
455
  );
397
- const data = await response.json();
456
+ const rawText = await response.text();
457
+ const data = parseJsonOrNull(rawText);
398
458
  if (!response.ok) {
399
- const errorMessage = typeof data?.error === "string" ? data.error : typeof data?.message === "string" ? data.message : `HTTP ${response.status} ${response.statusText}`;
400
- return { success: false, error: errorMessage };
459
+ return {
460
+ success: false,
461
+ error: extractGoogleAdsErrorMessage(
462
+ response.status,
463
+ response.statusText,
464
+ data,
465
+ rawText
466
+ )
467
+ };
401
468
  }
402
- const customerIds = (data.resourceNames ?? []).map(
469
+ const customerIds = (data?.resourceNames ?? []).map(
403
470
  (rn) => rn.replace(/^customers\//, "")
404
471
  );
405
472
  const customers = [];
@@ -596,11 +663,18 @@ Authentication is handled automatically via OAuth proxy.
596
663
  signal: controller.signal
597
664
  })
598
665
  );
599
- const data = await response.json();
666
+ const rawText = await response.text();
667
+ const data = parseJsonOrNull(rawText);
600
668
  if (!response.ok) {
601
- const dataObj = data;
602
- const errorMessage = typeof dataObj?.error === "string" ? dataObj.error : typeof dataObj?.message === "string" ? dataObj.message : `HTTP ${response.status} ${response.statusText}`;
603
- return { success: false, error: errorMessage };
669
+ return {
670
+ success: false,
671
+ error: extractGoogleAdsErrorMessage(
672
+ response.status,
673
+ response.statusText,
674
+ data,
675
+ rawText
676
+ )
677
+ };
604
678
  }
605
679
  return { success: true, status: response.status, data };
606
680
  } finally {