@squadbase/vantage 0.6.2-dev1.b28a4df → 0.6.2-dev1.b40ce36

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 (213) hide show
  1. package/dist/{build-X5NVCQKT.js → build-A23M4GCH.js} +7 -7
  2. package/dist/{build-X5NVCQKT.js.map → build-A23M4GCH.js.map} +1 -1
  3. package/dist/{check-ZBIH422T.js → check-FBHT6W6J.js} +5 -5
  4. package/dist/{check-ZBIH422T.js.map → check-FBHT6W6J.js.map} +1 -1
  5. package/dist/chunk-2IAPIOPS.js +152 -0
  6. package/dist/chunk-2IAPIOPS.js.map +1 -0
  7. package/dist/chunk-57GHR5LN.js +163 -0
  8. package/dist/chunk-57GHR5LN.js.map +1 -0
  9. package/dist/{chunk-7DZGJQ3P.js → chunk-5C2SEDPH.js} +21 -4
  10. package/dist/chunk-5C2SEDPH.js.map +1 -0
  11. package/dist/chunk-6OTTGAPO.js +44 -0
  12. package/dist/chunk-6OTTGAPO.js.map +1 -0
  13. package/dist/{chunk-XPQSTZUU.js → chunk-7S52M2SL.js} +4 -3
  14. package/dist/chunk-7S52M2SL.js.map +1 -0
  15. package/dist/{chunk-V3LF7BE7.js → chunk-ANZLVSEP.js} +4 -5
  16. package/dist/chunk-ANZLVSEP.js.map +1 -0
  17. package/dist/{chunk-XQUSGIDG.js → chunk-CKWPK4RO.js} +10 -3
  18. package/dist/chunk-CKWPK4RO.js.map +1 -0
  19. package/dist/chunk-JXFCSF3K.js +673 -0
  20. package/dist/chunk-JXFCSF3K.js.map +1 -0
  21. package/dist/{chunk-UNCSBSO4.js → chunk-QOXXOFGL.js} +112 -927
  22. package/dist/chunk-QOXXOFGL.js.map +1 -0
  23. package/dist/{chunk-CEXAQQ5W.js → chunk-S5MDTHH7.js} +180 -18
  24. package/dist/chunk-S5MDTHH7.js.map +1 -0
  25. package/dist/{chunk-2ICNHUG6.js → chunk-SDJTTMLK.js} +64 -7
  26. package/dist/chunk-SDJTTMLK.js.map +1 -0
  27. package/dist/{chunk-WAMZWZJB.js → chunk-SHZM3EXB.js} +19 -8
  28. package/dist/chunk-SHZM3EXB.js.map +1 -0
  29. package/dist/{chunk-JKLLFVEU.js → chunk-UWSQUHX6.js} +4 -99
  30. package/dist/chunk-UWSQUHX6.js.map +1 -0
  31. package/dist/cli.js +6 -6
  32. package/dist/client/index.d.ts +2 -0
  33. package/dist/client/index.js +8 -2
  34. package/dist/client/index.js.map +1 -1
  35. package/dist/components/index.d.ts +13 -249
  36. package/dist/components/index.js +5 -2
  37. package/dist/delta-text-CvwBGJ95.d.ts +15 -0
  38. package/dist/{dev-4XEDTELV.js → dev-H4I2JL63.js} +7 -7
  39. package/dist/{dev-4XEDTELV.js.map → dev-H4I2JL63.js.map} +1 -1
  40. package/dist/doc/index.d.ts +215 -2
  41. package/dist/doc/index.js +307 -3
  42. package/dist/doc/index.js.map +1 -1
  43. package/dist/{doctor-5E2VEZPK.js → doctor-B2O3GJDU.js} +5 -5
  44. package/dist/{doctor-5E2VEZPK.js.map → doctor-B2O3GJDU.js.map} +1 -1
  45. package/dist/format-U0cQl069.d.ts +243 -0
  46. package/dist/query/index.js +2 -2
  47. package/dist/{routes-3SGAFDMC.js → routes-PVKNT777.js} +4 -4
  48. package/dist/{routes-3SGAFDMC.js.map → routes-PVKNT777.js.map} +1 -1
  49. package/dist/slide/index.d.ts +272 -1
  50. package/dist/slide/index.js +972 -2
  51. package/dist/slide/index.js.map +1 -1
  52. package/dist/table/index.js +7 -4
  53. package/dist/table/index.js.map +1 -1
  54. package/dist/ui/index.d.ts +4 -1
  55. package/dist/ui/index.js +3 -3
  56. package/dist/ui/index.js.map +1 -1
  57. package/dist/{upgrade-JHXZBGQS.js → upgrade-6DT7ADRP.js} +4 -4
  58. package/dist/{upgrade-JHXZBGQS.js.map → upgrade-6DT7ADRP.js.map} +1 -1
  59. package/dist/vite/index.js +3 -3
  60. package/docs/en/changelog.md +2 -0
  61. package/docs/en/components.md +13 -2
  62. package/docs/en/doc/delta-text.md +40 -0
  63. package/docs/en/doc/doc-action-items.md +49 -0
  64. package/docs/en/doc/doc-callout.md +38 -0
  65. package/docs/en/doc/doc-data-table.md +60 -0
  66. package/docs/en/doc/doc-executive-summary.md +64 -0
  67. package/docs/en/doc/doc-figure.md +56 -0
  68. package/docs/en/doc/doc-key-findings.md +61 -0
  69. package/docs/en/doc/doc-kpi-scorecard.md +80 -0
  70. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  71. package/docs/en/doc/doc-report-header.md +46 -0
  72. package/docs/en/pages-and-metadata.md +15 -0
  73. package/docs/en/parts/area-chart.md +99 -0
  74. package/docs/en/parts/bar-chart.md +91 -0
  75. package/docs/en/parts/bar-list.md +50 -0
  76. package/docs/en/parts/category-bar.md +37 -0
  77. package/docs/en/parts/chart-frame.md +39 -0
  78. package/docs/en/parts/delta.md +4 -3
  79. package/docs/en/parts/donut-chart.md +72 -0
  80. package/docs/en/parts/funnel-steps.md +2 -1
  81. package/docs/en/parts/heatmap.md +53 -0
  82. package/docs/en/parts/kpi-card.md +2 -1
  83. package/docs/en/parts/legend.md +35 -0
  84. package/docs/en/parts/line-chart.md +94 -0
  85. package/docs/en/parts/progress-circle.md +33 -0
  86. package/docs/en/parts/sample-data.md +39 -0
  87. package/docs/en/parts/scatter-chart.md +56 -0
  88. package/docs/en/parts/tracker.md +36 -0
  89. package/docs/en/parts/updated-at.md +30 -0
  90. package/docs/en/parts/waterfall-chart.md +56 -0
  91. package/docs/en/slide/slide-chart-full.md +48 -0
  92. package/docs/en/slide/slide-chart-insight.md +52 -0
  93. package/docs/en/slide/slide-columns.md +46 -0
  94. package/docs/en/slide/slide-comparison.md +68 -0
  95. package/docs/en/slide/slide-cover.md +39 -0
  96. package/docs/en/slide/slide-exec-summary.md +47 -0
  97. package/docs/en/slide/slide-heading.md +38 -0
  98. package/docs/en/slide/slide-kpi-grid.md +55 -0
  99. package/docs/en/slide/slide-kpi-hero.md +58 -0
  100. package/docs/en/slide/slide-next-actions.md +49 -0
  101. package/docs/en/slide/slide-scorecard-table.md +54 -0
  102. package/docs/en/slide/slide-section.md +44 -0
  103. package/docs/en/slide/slide-source-line.md +34 -0
  104. package/docs/en/ui/alert-dialog.md +42 -0
  105. package/docs/en/ui/avatar.md +31 -0
  106. package/docs/en/ui/combobox.md +74 -0
  107. package/docs/en/ui/drawer.md +41 -0
  108. package/docs/en/ui/empty.md +1 -1
  109. package/docs/en/ui/error-state.md +4 -3
  110. package/docs/en/ui/field.md +42 -0
  111. package/docs/en/ui/hover-card.md +21 -0
  112. package/docs/en/ui/kbd.md +17 -0
  113. package/docs/en/ui/loading.md +1 -1
  114. package/docs/en/ui/pagination.md +36 -0
  115. package/docs/en/ui/radio-group.md +21 -0
  116. package/docs/en/ui/toast.md +44 -0
  117. package/docs/en/ui/toggle-group.md +4 -3
  118. package/docs/index.json +857 -77
  119. package/docs/ja/changelog.md +2 -0
  120. package/docs/ja/components.md +12 -1
  121. package/docs/ja/doc/delta-text.md +40 -0
  122. package/docs/ja/doc/doc-action-items.md +49 -0
  123. package/docs/ja/doc/doc-callout.md +38 -0
  124. package/docs/ja/doc/doc-data-table.md +60 -0
  125. package/docs/ja/doc/doc-executive-summary.md +64 -0
  126. package/docs/ja/doc/doc-figure.md +56 -0
  127. package/docs/ja/doc/doc-key-findings.md +61 -0
  128. package/docs/ja/doc/doc-kpi-scorecard.md +80 -0
  129. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  130. package/docs/ja/doc/doc-report-header.md +46 -0
  131. package/docs/ja/page-types/slide.md +1 -0
  132. package/docs/ja/pages-and-metadata.md +15 -0
  133. package/docs/ja/parts/area-chart.md +49 -25
  134. package/docs/ja/parts/bar-chart.md +50 -24
  135. package/docs/ja/parts/bar-list.md +31 -8
  136. package/docs/ja/parts/chart-frame.md +36 -0
  137. package/docs/ja/parts/delta.md +5 -4
  138. package/docs/ja/parts/donut-chart.md +45 -26
  139. package/docs/ja/parts/funnel-steps.md +27 -8
  140. package/docs/ja/parts/heatmap.md +45 -0
  141. package/docs/ja/parts/kpi-card.md +2 -1
  142. package/docs/ja/parts/legend.md +36 -0
  143. package/docs/ja/parts/line-chart.md +48 -22
  144. package/docs/ja/parts/sample-data.md +61 -0
  145. package/docs/ja/parts/scatter-chart.md +69 -0
  146. package/docs/ja/parts/updated-at.md +27 -0
  147. package/docs/ja/parts/waterfall-chart.md +61 -0
  148. package/docs/ja/slide/slide-chart-full.md +48 -0
  149. package/docs/ja/slide/slide-chart-insight.md +52 -0
  150. package/docs/ja/slide/slide-columns.md +46 -0
  151. package/docs/ja/slide/slide-comparison.md +68 -0
  152. package/docs/ja/slide/slide-cover.md +39 -0
  153. package/docs/ja/slide/slide-exec-summary.md +47 -0
  154. package/docs/ja/slide/slide-heading.md +38 -0
  155. package/docs/ja/slide/slide-kpi-grid.md +55 -0
  156. package/docs/ja/slide/slide-kpi-hero.md +58 -0
  157. package/docs/ja/slide/slide-next-actions.md +49 -0
  158. package/docs/ja/slide/slide-scorecard-table.md +54 -0
  159. package/docs/ja/slide/slide-section.md +44 -0
  160. package/docs/ja/slide/slide-source-line.md +34 -0
  161. package/docs/ja/ui/empty.md +1 -1
  162. package/docs/ja/ui/error-state.md +4 -3
  163. package/docs/ja/ui/loading.md +1 -1
  164. package/docs/ja/ui/toggle-group.md +4 -3
  165. package/package.json +2 -2
  166. package/registry/ui/area-chart.tsx +88 -26
  167. package/registry/ui/attention-list.tsx +303 -0
  168. package/registry/ui/bar-chart.tsx +88 -26
  169. package/registry/ui/bar-list.tsx +87 -24
  170. package/registry/ui/box-plot-chart.tsx +3906 -0
  171. package/registry/ui/category-bar.tsx +54 -19
  172. package/registry/ui/chart-frame.tsx +56 -21
  173. package/registry/ui/dashboard-card.tsx +2 -2
  174. package/registry/ui/delta.tsx +11 -8
  175. package/registry/ui/donut-chart.tsx +89 -26
  176. package/registry/ui/echart.tsx +194 -44
  177. package/registry/ui/funnel-steps.tsx +33 -5
  178. package/registry/ui/heatmap.tsx +55 -21
  179. package/registry/ui/histogram-chart.tsx +3986 -0
  180. package/registry/ui/kpi-card.tsx +41 -14
  181. package/registry/ui/legend.tsx +87 -24
  182. package/registry/ui/line-chart.tsx +88 -26
  183. package/registry/ui/page-shell.tsx +9 -9
  184. package/registry/ui/paired-chart.tsx +3827 -0
  185. package/registry/ui/sample-data.tsx +1 -1
  186. package/registry/ui/scatter-chart.tsx +88 -26
  187. package/registry/ui/section-header.tsx +2 -2
  188. package/registry/ui/slider.tsx +1 -1
  189. package/registry/ui/status-badge.tsx +8 -8
  190. package/registry/ui/tooltip.tsx +6 -2
  191. package/registry/ui/tracker.tsx +9 -3
  192. package/registry/ui/trend-indicator.tsx +2 -2
  193. package/registry/ui/waterfall-chart.tsx +88 -26
  194. package/skills/vantage-design/SKILL.md +27 -25
  195. package/skills/vantage-design/references/extract.md +16 -14
  196. package/skills/vantage-design/references/format.md +6 -5
  197. package/skills/vantage-design/references/presets.md +60 -110
  198. package/skills/vantage-pitfalls/SKILL.md +5 -0
  199. package/skills/vantage-slide/SKILL.md +54 -36
  200. package/templates/AGENTS.md +4 -2
  201. package/templates/agents/doc.md +48 -0
  202. package/templates/agents/page.md +22 -1
  203. package/templates/agents/slide.md +70 -2
  204. package/theme.css +24 -20
  205. package/dist/chunk-2ICNHUG6.js.map +0 -1
  206. package/dist/chunk-7DZGJQ3P.js.map +0 -1
  207. package/dist/chunk-CEXAQQ5W.js.map +0 -1
  208. package/dist/chunk-JKLLFVEU.js.map +0 -1
  209. package/dist/chunk-UNCSBSO4.js.map +0 -1
  210. package/dist/chunk-V3LF7BE7.js.map +0 -1
  211. package/dist/chunk-WAMZWZJB.js.map +0 -1
  212. package/dist/chunk-XPQSTZUU.js.map +0 -1
  213. package/dist/chunk-XQUSGIDG.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/api.ts","../src/query/hooks.ts"],"names":[],"mappings":"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","file":"chunk-ANZLVSEP.js","sourcesContent":["/**\n * The one seam for calling the API from client code. All `/api/*` requests go\n * through here so a split deployment (client on S3/CloudFront, server on Lambda)\n * can point the client at a different origin without touching page code.\n *\n * The base is read from `import.meta.env.PUBLIC_API_BASE_URL` — a `PUBLIC_`\n * prefixed var so it is inlined into the client bundle (see envPrefix in the\n * Vite plugin). It can be set in `.env` or injected at build time via\n * `vantage build --api-base-url <url>`. When unset it is empty, so requests stay\n * same-origin relative paths — identical to hand-written `fetch(\"/api/...\")`.\n */\nimport { isDraftActive } from \"../client/draft-state\"\n\n/** The configured API base URL (no trailing slash), or \"\" for same-origin. */\nexport function apiBaseUrl(): string {\n // `import.meta.env` is typed in the generated .vantage/types, not here.\n const env = (import.meta as { env?: Record<string, string | undefined> }).env\n const raw = env?.PUBLIC_API_BASE_URL ?? \"\"\n return raw.replace(/\\/+$/, \"\")\n}\n\n/**\n * Build a full API URL. Pass the path exactly as it maps to `server/api/**`,\n * including the `/api` prefix — e.g. `apiUrl(\"/api/customers\")`. With no base\n * configured this returns the relative path unchanged.\n */\nexport function apiUrl(path: string): string {\n const rel = path.startsWith(\"/\") ? path : `/${path}`\n return apiBaseUrl() + rel\n}\n\n/**\n * Thin `fetch` wrapper that resolves the path against the API base. Returns the\n * raw `Response` — parsing and error handling stay with the caller, matching the\n * existing `queryFn` style.\n */\nexport function apiFetch(path: string, init?: RequestInit): Promise<Response> {\n return fetch(apiUrl(path), init)\n}\n\n/** Query-string values accepted by the API helpers. */\nexport type ApiSearch = Record<\n string,\n string | number | boolean | null | undefined | (string | number)[]\n>\n\n/**\n * Append a query string to an API path. `undefined`/`null` entries are dropped\n * so an unset filter leaves the URL — and the query key — unchanged. Array\n * values repeat the key, matching `URLSearchParams.getAll` on the server.\n */\nexport function apiPath(path: string, search?: ApiSearch): string {\n if (!search) return path\n const params = new URLSearchParams()\n // Sorted so two calls with the same filters produce the same query key.\n for (const key of Object.keys(search).sort()) {\n const value = search[key]\n if (value === undefined || value === null) continue\n if (Array.isArray(value)) {\n for (const item of value) params.append(key, String(item))\n } else {\n params.append(key, String(value))\n }\n }\n const qs = params.toString()\n if (!qs) return path\n return path + (path.includes(\"?\") ? \"&\" : \"?\") + qs\n}\n\n/**\n * A non-2xx response from `server/api`. `message` is the server's `HttpError`\n * message when there was one; anything else surfaces as a generic status text,\n * mirroring what the server chose to disclose.\n */\nexport class ApiError extends Error {\n /** HTTP status of the response. */\n readonly status: number\n /** Parsed response body, when there was one. */\n readonly body: unknown\n /** `x-vantage-request-id`, to correlate with the server's terminal log. */\n readonly requestId: string | undefined\n\n constructor(message: string, status: number, body: unknown, requestId?: string) {\n super(message)\n this.name = \"ApiError\"\n this.status = status\n this.body = body\n this.requestId = requestId\n }\n}\n\n/**\n * Fetch an API route and parse its JSON, throwing `ApiError` on a non-2xx.\n * This is what the API hooks call; use it directly in a loader or an event\n * handler where a hook doesn't fit.\n */\nexport async function apiJson<T = unknown>(path: string, init?: RequestInit): Promise<T> {\n const res = await apiFetch(path, init)\n const requestId = res.headers.get(\"x-vantage-request-id\") ?? undefined\n\n // Read as text first: an error response may be HTML from a proxy, and a 204\n // has no body at all — neither should throw a JSON parse error at the caller.\n const text = await res.text()\n let body: unknown\n if (text) {\n try {\n body = JSON.parse(text)\n } catch {\n body = text\n }\n }\n\n // While a draft is showing, an API the page calls may not exist yet. Without\n // `server/` the dev server answers any GET with the app shell, a 200 that\n // would otherwise pass for data; call it what it is (a missing route).\n if (res.ok && isDraftActive() && (res.headers.get(\"content-type\") ?? \"\").includes(\"text/html\")) {\n throw new ApiError(\"API route not found\", 404, body, requestId)\n }\n\n if (!res.ok) {\n const serverMessage =\n typeof body === \"object\" && body !== null && typeof (body as { error?: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : undefined\n throw new ApiError(\n serverMessage ?? `${res.status} ${res.statusText || \"Request failed\"}`,\n res.status,\n body,\n requestId,\n )\n }\n\n return body as T\n}\n","/**\n * Hooks for the app's own `server/api` routes. They are `useQuery`/`useMutation`\n * with the parts every page was repeating — base URL, JSON parsing, non-2xx to\n * `ApiError`, a query key derived from the URL — moved into the framework.\n * Everything else about TanStack Query stays available through the options.\n */\nimport { useMutation, useQuery } from \"@tanstack/react-query\"\nimport type {\n QueryKey,\n UseMutationOptions,\n UseMutationResult,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\"\nimport { isDraftActive } from \"../client/draft-state\"\nimport { API_QUERY_KEY as API_KEY } from \"./client\"\nimport { apiJson, apiPath, ApiError as ApiErrorClass, type ApiError, type ApiSearch } from \"./api\"\n\n\n/** How often a query whose API route does not exist yet looks again, while a draft is showing. */\nconst MISSING_API_POLL_MS = 2000\n\n/** An API route that is not there (yet): a 404 from `server/api`, or the app shell standing in for it. */\nfunction isMissingApi(error: unknown): boolean {\n return error instanceof ApiErrorClass && error.status === 404\n}\n\nexport interface ApiQueryOptions<TData>\n extends Omit<UseQueryOptions<TData, ApiError>, \"queryKey\" | \"queryFn\"> {\n /** Query-string values; `undefined` entries are omitted. */\n search?: ApiSearch\n /** Extra `fetch` init (headers, credentials, …). */\n init?: RequestInit\n /** Override the derived `[\"api\", url]` key. */\n queryKey?: QueryKey\n}\n\n/**\n * GET an API route.\n *\n * ```tsx\n * const { data, isPending, error } = useApiQuery<Monthly>(\"/api/monthly-analysis\")\n * const filtered = useApiQuery<Row[]>(\"/api/customers\", { search: { segment } })\n * ```\n *\n * The key defaults to `[\"api\", <url with query string>]`, so changing `search`\n * refetches and `invalidateQueries({ queryKey: [\"api\"] })` clears everything.\n */\nexport function useApiQuery<TData = unknown>(\n path: string,\n options: ApiQueryOptions<TData> = {},\n): UseQueryResult<TData, ApiError> {\n const { search, init, queryKey, refetchInterval, ...rest } = options\n const url = apiPath(path, search)\n const result = useQuery<TData, ApiError>({\n queryKey: queryKey ?? [API_KEY, url],\n // The signal comes from TanStack so an unmounted/refetched query aborts;\n // a caller-supplied signal wins.\n queryFn: ({ signal }) => apiJson<TData>(url, { ...init, signal: init?.signal ?? signal }),\n // While a draft is showing, a route that does not exist yet is looked for\n // again until it does; otherwise the caller's interval applies untouched.\n refetchInterval: (query) =>\n isDraftActive() && isMissingApi(query.state.error)\n ? MISSING_API_POLL_MS\n : typeof refetchInterval === \"function\"\n ? refetchInterval(query)\n : refetchInterval,\n ...rest,\n })\n // A page written before its API is still loading as far as the page can tell:\n // it keeps its loading state instead of drawing an error for a route the\n // agent has not written yet.\n if (isDraftActive() && isMissingApi(result.error)) {\n return {\n ...result,\n status: \"pending\",\n error: null,\n isError: false,\n isLoadingError: false,\n isPending: true,\n isLoading: true,\n } as UseQueryResult<TData, ApiError>\n }\n return result\n}\n\nexport interface ApiMutationOptions<TData, TVariables>\n extends Omit<UseMutationOptions<TData, ApiError, TVariables>, \"mutationFn\"> {\n /** HTTP method (default `\"POST\"`). */\n method?: \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\"\n /** Extra `fetch` init (headers, credentials, …). */\n init?: RequestInit\n}\n\n/**\n * Write to an API route. The mutation variables are sent as the JSON body.\n *\n * ```tsx\n * const save = useApiMutation<Customer, { id: string; name: string }>(\n * (vars) => `/api/customers/${vars.id}`,\n * { method: \"PUT\" },\n * )\n * save.mutate({ id: \"1\", name: \"Northwind\" })\n * ```\n */\nexport function useApiMutation<TData = unknown, TVariables = void>(\n path: string | ((variables: TVariables) => string),\n options: ApiMutationOptions<TData, TVariables> = {},\n): UseMutationResult<TData, ApiError, TVariables> {\n const { method = \"POST\", init, ...rest } = options\n return useMutation<TData, ApiError, TVariables>({\n mutationFn: (variables: TVariables) => {\n const url = typeof path === \"function\" ? path(variables) : path\n const hasBody = variables !== undefined && variables !== null\n return apiJson<TData>(url, {\n method,\n ...init,\n headers: hasBody\n ? { \"content-type\": \"application/json\", ...(init?.headers as Record<string, string>) }\n : init?.headers,\n ...(hasBody ? { body: JSON.stringify(variables) } : {}),\n })\n },\n ...rest,\n })\n}\n"]}
@@ -2,6 +2,13 @@ import { QueryClient } from '@tanstack/react-query';
2
2
 
3
3
  // @squadbase/vantage — generated build. Do not edit.
4
4
 
5
+ var API_QUERY_KEY = "api";
6
+ var API_REFRESH_DEBOUNCE_MS = 300;
7
+ function refreshApiQueries(client) {
8
+ return client.invalidateQueries({
9
+ predicate: (query) => query.queryKey[0] === API_QUERY_KEY || query.state.status === "error"
10
+ });
11
+ }
5
12
  function createQueryClient() {
6
13
  return new QueryClient({
7
14
  defaultOptions: {
@@ -38,6 +45,6 @@ function setDraftActive(active) {
38
45
  window.__VANTAGE_DRAFT__ = { active };
39
46
  }
40
47
 
41
- export { SETTLING_MS, createQueryClient, isDraftActive, isDraftSettling, setDraftActive };
42
- //# sourceMappingURL=chunk-XQUSGIDG.js.map
43
- //# sourceMappingURL=chunk-XQUSGIDG.js.map
48
+ export { API_QUERY_KEY, API_REFRESH_DEBOUNCE_MS, SETTLING_MS, createQueryClient, isDraftActive, isDraftSettling, refreshApiQueries, setDraftActive };
49
+ //# sourceMappingURL=chunk-CKWPK4RO.js.map
50
+ //# sourceMappingURL=chunk-CKWPK4RO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/client.ts","../src/client/draft-state.ts"],"names":[],"mappings":";;;;AAGO,IAAM,aAAA,GAAgB;AAOtB,IAAM,uBAAA,GAA0B;AAOhC,SAAS,kBAAkB,MAAA,EAAoC;AACpE,EAAA,OAAO,OAAO,iBAAA,CAAkB;AAAA,IAC9B,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,KAAM,aAAA,IAAiB,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW;AAAA,GACrF,CAAA;AACH;AAOO,SAAS,iBAAA,GAAiC;AAC/C,EAAA,OAAO,IAAI,WAAA,CAAY;AAAA,IACrB,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,GAAA;AAAA,QACX,KAAA,EAAO,CAAA;AAAA,QACP,oBAAA,EAAsB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOtB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,WAAA,EAAa;AAAA;AACf;AACF,GACD,CAAA;AACH;;;AC3BO,IAAM,WAAA,GAAc;AAEpB,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,mBAAmB,MAAA,KAAW,IAAA;AAC/E;AAOO,SAAS,eAAA,GAA2B;AACzC,EAAA,IAAI,aAAA,IAAiB,OAAO,IAAA;AAC5B,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,KAAK,GAAA,EAAI,IAAK,OAAO,gCAAA,IAAoC,CAAA,CAAA;AACnG;AAEO,SAAS,eAAe,MAAA,EAAuB;AACpD,EAAA,IAAI,CAAC,UAAU,aAAA,EAAc,SAAU,gCAAA,GAAmC,IAAA,CAAK,KAAI,GAAI,WAAA;AACvF,EAAA,MAAA,CAAO,iBAAA,GAAoB,EAAE,MAAA,EAAO;AACtC","file":"chunk-CKWPK4RO.js","sourcesContent":["import { QueryClient } from \"@tanstack/react-query\"\n\n/** Query-key namespace of `useApiQuery`, so `invalidateQueries({ queryKey: [\"api\"] })` works. */\nexport const API_QUERY_KEY = \"api\"\n\n/**\n * Debounce for the api-change refetch. The changed `paths` cannot be mapped to\n * query keys reliably (custom `queryKey`s, dynamic segments), so every burst of\n * changes is coalesced into a single refetch of all API/errored queries.\n */\nexport const API_REFRESH_DEBOUNCE_MS = 300\n\n/**\n * An API module came, went or changed on the dev server: refetch the active API\n * queries, plus any query that is in an error state (a custom `queryKey` that\n * failed because the route did not exist yet still recovers).\n */\nexport function refreshApiQueries(client: QueryClient): Promise<void> {\n return client.invalidateQueries({\n predicate: (query) => query.queryKey[0] === API_QUERY_KEY || query.state.status === \"error\",\n })\n}\n\n/**\n * Create the QueryClient with Vantage defaults. Individual queries may override\n * these, but replacing the QueryClient wholesale is intentionally not exposed —\n * Squadbase relies on a single managed client for auth, logging and telemetry.\n */\nexport function createQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30_000,\n retry: 1,\n refetchOnWindowFocus: false,\n // A dashboard talks to its own origin (or the configured API base), so\n // the browser's offline heuristic says nothing useful about whether a\n // request can succeed. Under the default \"online\" mode a failed request\n // is *paused* rather than retried whenever that heuristic reads\n // offline, and the page sits on its loading state forever instead of\n // showing the error.\n networkMode: \"always\",\n },\n mutations: {\n networkMode: \"always\",\n },\n },\n })\n}\n","/**\n * Whether the preview is currently showing a draft. The server announces it\n * (`vantage:draft-state`); until the first announcement `window.__VANTAGE_DRAFT__`\n * does not exist at all, which is how an app without the draft layer behaves.\n *\n * Kept free of React and of module state: `client/` and `query/` are separate\n * published entries, so the one thing they share is this global.\n */\nexport interface DraftWindowState {\n active: boolean\n}\n\ndeclare global {\n interface Window {\n __VANTAGE_DRAFT__?: DraftWindowState\n /** Until when (ms epoch) a draft that just ended still counts for failures (see `isDraftSettling`). */\n __VANTAGE_DRAFT_SETTLING_UNTIL__?: number\n }\n}\n\n/** How long after a draft ends a failure is still taken to be the draft's. */\nexport const SETTLING_MS = 1500\n\nexport function isDraftActive(): boolean {\n return typeof window !== \"undefined\" && window.__VANTAGE_DRAFT__?.active === true\n}\n\n/**\n * A draft is showing, or ended a moment ago. The server announces the end before\n * the version it fell back to reaches the page, and a failing draft drawn once\n * more in that gap must still be held back, not shown as an error page.\n */\nexport function isDraftSettling(): boolean {\n if (isDraftActive()) return true\n return typeof window !== \"undefined\" && Date.now() < (window.__VANTAGE_DRAFT_SETTLING_UNTIL__ ?? 0)\n}\n\nexport function setDraftActive(active: boolean): void {\n if (!active && isDraftActive()) window.__VANTAGE_DRAFT_SETTLING_UNTIL__ = Date.now() + SETTLING_MS\n window.__VANTAGE_DRAFT__ = { active }\n}\n"]}