blume 1.7.0 → 1.7.1

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 (71) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cli/{chunk-s102bysw.js → chunk-12dzsn9b.js} +140 -23
  3. package/dist/cli/{chunk-s102bysw.js.map → chunk-12dzsn9b.js.map} +6 -5
  4. package/dist/cli/{chunk-agy5rzxy.js → chunk-4ae4f395.js} +78 -48
  5. package/dist/cli/chunk-4ae4f395.js.map +15 -0
  6. package/dist/cli/{chunk-tnskyrej.js → chunk-52cwcqvp.js} +4 -4
  7. package/dist/cli/{chunk-drke6t0h.js → chunk-5gfw0q4j.js} +9 -9
  8. package/dist/cli/{chunk-ckh3a410.js → chunk-6mq7qkve.js} +3 -3
  9. package/dist/cli/{chunk-0qhq7b8q.js → chunk-82atea4k.js} +5 -5
  10. package/dist/cli/{chunk-ye9zdkgv.js → chunk-8p3xe5jv.js} +2 -2
  11. package/dist/cli/{chunk-kwx90v78.js → chunk-90pdhkpm.js} +11 -11
  12. package/dist/cli/{chunk-jk1zwka1.js → chunk-aqjvpd03.js} +4 -4
  13. package/dist/cli/{chunk-cfw6x4rm.js → chunk-h9ekmtz7.js} +5 -5
  14. package/dist/cli/{chunk-jxkxjsc1.js → chunk-he2zfgah.js} +10 -10
  15. package/dist/cli/{chunk-zr3ygrq3.js → chunk-j5f2wrj5.js} +2 -2
  16. package/dist/cli/{chunk-qq9nm3qd.js → chunk-k0v1f8bb.js} +3 -3
  17. package/dist/cli/{chunk-ynacq3ev.js → chunk-ka5k7cz9.js} +6 -19
  18. package/dist/cli/{chunk-ynacq3ev.js.map → chunk-ka5k7cz9.js.map} +3 -4
  19. package/dist/cli/{chunk-v5mm027v.js → chunk-kmx2mydj.js} +2 -2
  20. package/dist/cli/{chunk-9qs6acpw.js → chunk-mfm4sjwx.js} +11 -11
  21. package/dist/cli/{chunk-y3g15rvv.js → chunk-np8dmfb0.js} +6 -6
  22. package/dist/cli/{chunk-18tjv4f7.js → chunk-pdwg3q9g.js} +11 -11
  23. package/dist/cli/{chunk-v2ymm99c.js → chunk-q56730e0.js} +11 -11
  24. package/dist/cli/{chunk-j6pxe0dt.js → chunk-qvvpnwaz.js} +2 -2
  25. package/dist/cli/{chunk-xv91q4nm.js → chunk-r99hynxh.js} +3 -2
  26. package/dist/cli/{chunk-xv91q4nm.js.map → chunk-r99hynxh.js.map} +3 -3
  27. package/dist/cli/{chunk-s5dsk8bj.js → chunk-vyqj481z.js} +8 -7
  28. package/dist/cli/{chunk-s5dsk8bj.js.map → chunk-vyqj481z.js.map} +3 -3
  29. package/dist/cli/{chunk-5d4q7121.js → chunk-x1wvw7a8.js} +21 -11
  30. package/dist/cli/{chunk-5d4q7121.js.map → chunk-x1wvw7a8.js.map} +5 -5
  31. package/dist/cli/{chunk-n0nyat6g.js → chunk-ywn7t0pb.js} +2 -2
  32. package/dist/cli/index.js +13 -13
  33. package/dist/types/components/layout/nav-utils.d.ts +15 -2
  34. package/dist/types/core/config-input.d.ts +7 -0
  35. package/dist/types/core/schema.d.ts +2 -0
  36. package/docs/08-faq.mdx +21 -0
  37. package/docs/configuration/ask-ai.mdx +16 -0
  38. package/docs/content/sources.mdx +2 -2
  39. package/package.json +1 -1
  40. package/src/ai/ask.ts +31 -4
  41. package/src/astro/generate.ts +1 -0
  42. package/src/astro/templates.ts +104 -60
  43. package/src/components/content/YouTube.astro +1 -1
  44. package/src/components/layout/Header.astro +1 -1
  45. package/src/components/layout/Search.astro +11 -0
  46. package/src/components/layout/nav-utils.ts +30 -12
  47. package/src/core/config-input.ts +7 -0
  48. package/src/core/schema.ts +5 -0
  49. package/src/core/sources/assets.ts +162 -26
  50. package/src/core/sources/notion.ts +60 -1
  51. package/src/registry/eject.ts +1 -0
  52. package/src/theme/entry.ts +9 -0
  53. package/dist/cli/chunk-agy5rzxy.js.map +0 -15
  54. /package/dist/cli/{chunk-tnskyrej.js.map → chunk-52cwcqvp.js.map} +0 -0
  55. /package/dist/cli/{chunk-drke6t0h.js.map → chunk-5gfw0q4j.js.map} +0 -0
  56. /package/dist/cli/{chunk-ckh3a410.js.map → chunk-6mq7qkve.js.map} +0 -0
  57. /package/dist/cli/{chunk-0qhq7b8q.js.map → chunk-82atea4k.js.map} +0 -0
  58. /package/dist/cli/{chunk-ye9zdkgv.js.map → chunk-8p3xe5jv.js.map} +0 -0
  59. /package/dist/cli/{chunk-kwx90v78.js.map → chunk-90pdhkpm.js.map} +0 -0
  60. /package/dist/cli/{chunk-jk1zwka1.js.map → chunk-aqjvpd03.js.map} +0 -0
  61. /package/dist/cli/{chunk-cfw6x4rm.js.map → chunk-h9ekmtz7.js.map} +0 -0
  62. /package/dist/cli/{chunk-jxkxjsc1.js.map → chunk-he2zfgah.js.map} +0 -0
  63. /package/dist/cli/{chunk-zr3ygrq3.js.map → chunk-j5f2wrj5.js.map} +0 -0
  64. /package/dist/cli/{chunk-qq9nm3qd.js.map → chunk-k0v1f8bb.js.map} +0 -0
  65. /package/dist/cli/{chunk-v5mm027v.js.map → chunk-kmx2mydj.js.map} +0 -0
  66. /package/dist/cli/{chunk-9qs6acpw.js.map → chunk-mfm4sjwx.js.map} +0 -0
  67. /package/dist/cli/{chunk-y3g15rvv.js.map → chunk-np8dmfb0.js.map} +0 -0
  68. /package/dist/cli/{chunk-18tjv4f7.js.map → chunk-pdwg3q9g.js.map} +0 -0
  69. /package/dist/cli/{chunk-v2ymm99c.js.map → chunk-q56730e0.js.map} +0 -0
  70. /package/dist/cli/{chunk-j6pxe0dt.js.map → chunk-qvvpnwaz.js.map} +0 -0
  71. /package/dist/cli/{chunk-n0nyat6g.js.map → chunk-ywn7t0pb.js.map} +0 -0
@@ -3,19 +3,19 @@ import {
3
3
  API_CATALOG_PATH,
4
4
  OPENAPI_PATH,
5
5
  hasApiCatalog
6
- } from "./chunk-j6pxe0dt.js";
6
+ } from "./chunk-qvvpnwaz.js";
7
7
  import {
8
8
  searchProviderMeta
9
9
  } from "./chunk-wd27zjcz.js";
10
10
  import {
11
11
  BLUME_IGNORE_DIRS,
12
12
  TOC_HIDDEN_KEY
13
- } from "./chunk-s102bysw.js";
13
+ } from "./chunk-12dzsn9b.js";
14
14
  import {
15
15
  buildFontEntries,
16
16
  fontLocaleCodes,
17
17
  hasScalarReferences
18
- } from "./chunk-xv91q4nm.js";
18
+ } from "./chunk-r99hynxh.js";
19
19
  import {
20
20
  normalizeBasePath,
21
21
  trimChar,
@@ -134,20 +134,23 @@ var ASK_PRESETS = {
134
134
  }
135
135
  };
136
136
  var DEFAULT_MODEL = "openai/gpt-5.5";
137
+ var askHeadersField = (ask) => ask?.headers && Object.keys(ask.headers).length > 0 ? { headers: ask.headers } : {};
137
138
  var resolveAskBackend = (ask) => {
138
139
  const provider = ask?.provider ?? "gateway";
139
140
  const model = ask?.model ?? DEFAULT_MODEL;
141
+ const headers = askHeadersField(ask);
140
142
  if (provider === "gateway") {
141
- return { kind: "gateway", model };
143
+ return { ...headers, kind: "gateway", model };
142
144
  }
143
145
  const preset = ASK_PRESETS[provider];
144
146
  const apiKeyEnv = ask?.apiKeyEnv ?? preset?.apiKeyEnv ?? "API_KEY";
145
147
  if (provider === "openrouter") {
146
- return { apiKeyEnv, kind: "openrouter", model };
148
+ return { apiKeyEnv, ...headers, kind: "openrouter", model };
147
149
  }
148
150
  return {
149
151
  apiKeyEnv,
150
152
  baseUrl: ask?.baseUrl ?? preset?.baseUrl ?? "",
153
+ ...headers,
151
154
  kind: OPENAI_COMPATIBLE,
152
155
  model,
153
156
  name: preset?.name ?? OPENAI_COMPATIBLE
@@ -724,15 +727,21 @@ ${instructions}` : ASK_FALLBACK_PROMPT;
724
727
  ];
725
728
  let setup = "";
726
729
  let modelExpr = JSON.stringify(backend.model);
730
+ const headersField = backend.headers ? `
731
+ headers: ${JSON.stringify(backend.headers)},` : "";
727
732
  if (backend.kind === "gateway") {
728
733
  setup = `
729
- const gateway = createGateway({ apiKey: getSecret("AI_GATEWAY_API_KEY") });
734
+ const gateway = createGateway({
735
+ apiKey: getSecret("AI_GATEWAY_API_KEY"),${headersField}
736
+ });
730
737
  `;
731
738
  modelExpr = `gateway(${JSON.stringify(backend.model)})`;
732
739
  } else if (backend.kind === "openrouter") {
733
740
  imports.push('import { createOpenRouter } from "@openrouter/ai-sdk-provider";');
734
741
  setup = `
735
- const openrouter = createOpenRouter({ apiKey: getSecret(${JSON.stringify(backend.apiKeyEnv)}) });
742
+ const openrouter = createOpenRouter({
743
+ apiKey: getSecret(${JSON.stringify(backend.apiKeyEnv)}),${headersField}
744
+ });
736
745
  `;
737
746
  modelExpr = `openrouter(${JSON.stringify(backend.model)})`;
738
747
  } else if (backend.kind === "openai-compatible") {
@@ -740,7 +749,7 @@ const openrouter = createOpenRouter({ apiKey: getSecret(${JSON.stringify(backend
740
749
  setup = `
741
750
  const provider = createOpenAICompatible({
742
751
  apiKey: getSecret(${JSON.stringify(backend.apiKeyEnv)}),
743
- baseURL: ${JSON.stringify(backend.baseUrl)},
752
+ baseURL: ${JSON.stringify(backend.baseUrl)},${headersField}
744
753
  name: ${JSON.stringify(backend.name)},
745
754
  });
746
755
  `;
@@ -1147,7 +1156,11 @@ var navFragmentTemplate = () => `---
1147
1156
  // Generated by Blume. Do not edit.
1148
1157
  import NavTree from "blume/components/layout/NavTree.astro";
1149
1158
  import { withBase } from "blume/components/islands/base-path.ts";
1150
- import { navGroupIds, navVariants } from "blume/components/layout/nav-utils.ts";
1159
+ import {
1160
+ hiddenDefaultLocale,
1161
+ navGroupIds,
1162
+ navVariants,
1163
+ } from "blume/components/layout/nav-utils.ts";
1151
1164
  import type { NavNode } from "blume/core/types.ts";
1152
1165
  import data from "blume:data";
1153
1166
 
@@ -1158,15 +1171,16 @@ export const partial = true;
1158
1171
  // Only imports are in scope here (Astro hoists getStaticPaths), which is why
1159
1172
  // the variant walk lives in nav-utils.
1160
1173
  export function getStaticPaths() {
1161
- return navVariants(data).flatMap(({ locale, navigation, version }) =>
1162
- [...navGroupIds(navigation.sidebar)]
1163
- .filter(([node]) => (node.display ?? "flat") !== "flat")
1164
- .map(([, id]) => ({ params: { id, locale, version } }))
1174
+ return navVariants(data, hiddenDefaultLocale(data.config.i18n)).flatMap(
1175
+ ({ locale, navigation, version }) =>
1176
+ [...navGroupIds(navigation.sidebar)]
1177
+ .filter(([node]) => (node.display ?? "flat") !== "flat")
1178
+ .map(([, id]) => ({ params: { id, locale, version } }))
1165
1179
  );
1166
1180
  }
1167
1181
 
1168
1182
  const { id, locale, version } = Astro.params;
1169
- const variant = navVariants(data).find(
1183
+ const variant = navVariants(data, hiddenDefaultLocale(data.config.i18n)).find(
1170
1184
  (entry) => entry.version === version && entry.locale === locale
1171
1185
  );
1172
1186
  const ids = variant
@@ -1334,22 +1348,13 @@ const htmlLang = i18n ? i18n.defaultLocale : "en";
1334
1348
  <ScalarComponent configuration={configuration} renderMode="client" />
1335
1349
  </ReferenceLayout>
1336
1350
  `;
1337
- var catchAllPageTemplate = (options) => {
1338
- const mathImport = options.mathEnabled ? `import Math from "blume/components/content/Math.astro";
1351
+ var contentComponentsSource = (mathEnabled) => {
1352
+ const mathImport = mathEnabled ? `import Math from "blume/components/content/Math.astro";
1339
1353
  ` : "";
1340
- const mathEntry = options.mathEnabled ? `Math,
1354
+ const mathEntry = mathEnabled ? `Math,
1341
1355
  ` : "";
1342
- const clientData = options.needsReact ? `
1343
- clientData={{ config: data.config, navigation, page: { route, title: seo.title ?? title } }}` : "";
1344
- return `---
1345
- // Generated by Blume. Do not edit.
1346
- import { getEntry, render } from "astro:content";
1347
- import type { CollectionKey } from "astro:content";
1348
- import RootLayout from "blume/components/layout/RootLayout.astro";
1349
- import { withBase } from "blume/components/islands/base-path.ts";
1350
- import { stripBasePath, withBasePath } from "blume/core/base-path.ts";
1351
- import { resolveSlot } from "blume/components/layout/overrides.ts";
1352
- import Accordion from "blume/components/content/Accordion.astro";
1356
+ return {
1357
+ imports: `import Accordion from "blume/components/content/Accordion.astro";
1353
1358
  import AccordionItem from "blume/components/content/AccordionItem.astro";
1354
1359
  import AutoTypeTable from "blume/components/content/AutoTypeTable.astro";
1355
1360
  import Badge from "blume/components/content/Badge.astro";
@@ -1389,19 +1394,8 @@ import ApiOverview from "blume/components/openapi/ApiOverview.astro";
1389
1394
  import ApiTagOperations from "blume/components/openapi/ApiTagOperations.astro";
1390
1395
  import Operation from "blume/components/openapi/Operation.astro";
1391
1396
  ${mathImport}import { mdxComponents as userMdx, layoutOverrides } from "../generated/components.ts";
1392
- import { islandComponents } from "../generated/islands.ts";
1393
- import data from "blume:data";
1394
-
1395
- const Color = Object.assign(ColorRoot, { Item: ColorItem, Row: ColorRow });
1396
- const Tree = Object.assign(TreeRoot, { File: TreeFile, Folder: TreeFolder });
1397
-
1398
- // Docs content is file-based and always prerendered, even in server output
1399
- // (where only endpoints like /api/ask render on demand). Without this, server
1400
- // builds would render this route on demand and ignore getStaticPaths, leaving
1401
- // the entry id undefined.
1402
- export const prerender = true;
1403
-
1404
- const components = {
1397
+ import { islandComponents } from "../generated/islands.ts";`,
1398
+ map: `{
1405
1399
  Accordion,
1406
1400
  AccordionItem,
1407
1401
  ApiOverview,
@@ -1438,7 +1432,34 @@ const components = {
1438
1432
  YouTube,
1439
1433
  ${mathEntry}...islandComponents,
1440
1434
  ...userMdx,
1435
+ }`
1436
+ };
1441
1437
  };
1438
+ var catchAllPageTemplate = (options) => {
1439
+ const { imports: componentImports, map: componentMap } = contentComponentsSource(options.mathEnabled);
1440
+ const clientData = options.needsReact ? `
1441
+ clientData={{ config: data.config, navigation, page: { route, title: seo.title ?? title } }}` : "";
1442
+ return `---
1443
+ // Generated by Blume. Do not edit.
1444
+ import { getEntry, render } from "astro:content";
1445
+ import type { CollectionKey } from "astro:content";
1446
+ import RootLayout from "blume/components/layout/RootLayout.astro";
1447
+ import { withBase } from "blume/components/islands/base-path.ts";
1448
+ import { stripBasePath, withBasePath } from "blume/core/base-path.ts";
1449
+ import { resolveSlot } from "blume/components/layout/overrides.ts";
1450
+ ${componentImports}
1451
+ import data from "blume:data";
1452
+
1453
+ const Color = Object.assign(ColorRoot, { Item: ColorItem, Row: ColorRow });
1454
+ const Tree = Object.assign(TreeRoot, { File: TreeFile, Folder: TreeFolder });
1455
+
1456
+ // Docs content is file-based and always prerendered, even in server output
1457
+ // (where only endpoints like /api/ask render on demand). Without this, server
1458
+ // builds would render this route on demand and ignore getStaticPaths, leaving
1459
+ // the entry id undefined.
1460
+ export const prerender = true;
1461
+
1462
+ const components = ${componentMap};
1442
1463
 
1443
1464
  export function getStaticPaths() {
1444
1465
  return data.routes.map((route) => ({
@@ -1708,7 +1729,7 @@ const LayoutComponent = resolveSlot(layoutOverrides.Layout, RootLayout);
1708
1729
  feedback={data.config.feedback}
1709
1730
  exportPdf={${options.exportPdf}}
1710
1731
  exportEpub={${options.exportEpub}}${options.navFragments ? `
1711
- navFragmentBase={withBase(\`/blume-nav/\${version || "current"}/\${i18n ? locale : "default"}\`)}` : ""}
1732
+ navFragmentBase={withBase(\`/blume-nav/\${version || "current"}/\${i18n && localePrefix(locale) ? locale : "default"}\`)}` : ""}
1712
1733
  openInChat={data.config.openInChat}
1713
1734
  feeds={data.feeds}
1714
1735
  discovery={data.config.discovery}
@@ -1732,6 +1753,7 @@ var changelogIndexTemplate = (options) => {
1732
1753
  clientData={{ config: data.config, navigation: data.navigation, page: { route: "/changelog", title: pageTitle } }}` : "";
1733
1754
  const stagedSpread = options.staged ? `
1734
1755
  ...(await getCollection("staged")),` : "";
1756
+ const { imports: componentImports, map: componentMap } = contentComponentsSource(options.mathEnabled);
1735
1757
  return `---
1736
1758
  // Generated by Blume. Do not edit.
1737
1759
  import { getCollection, render } from "astro:content";
@@ -1740,11 +1762,19 @@ import Update from "blume/components/content/Update.astro";
1740
1762
  import { withBase } from "blume/components/islands/base-path.ts";
1741
1763
  import { resolveSlot } from "blume/components/layout/overrides.ts";
1742
1764
  import { resolveDateFormatOptions } from "blume/core/date-format.ts";
1743
- import { layoutOverrides } from "../generated/components.ts";
1765
+ ${componentImports}
1744
1766
  import data from "blume:data";
1745
1767
 
1768
+ const Color = Object.assign(ColorRoot, { Item: ColorItem, Row: ColorRow });
1769
+ const Tree = Object.assign(TreeRoot, { File: TreeFile, Folder: TreeFolder });
1770
+
1746
1771
  export const prerender = true;
1747
1772
 
1773
+ // Entry bodies are MDX rendered outside the catch-all, so they need the same
1774
+ // component map: a \`:::\` callout or \`<Steps>\` in a release note otherwise
1775
+ // throws "Expected component ... to be defined" at build time.
1776
+ const components = ${componentMap};
1777
+
1748
1778
  const entryDate = (entry: {
1749
1779
  data: { date?: string | null; changelog?: { date?: string | null } | null };
1750
1780
  }) => entry.data.date ?? entry.data.changelog?.date ?? null;
@@ -1943,7 +1973,7 @@ const LayoutComponent = resolveSlot(layoutOverrides.Layout, RootLayout);
1943
1973
  >
1944
1974
  {majorGroups[0].items.map(({ Content, href, id, label, date, tags }) => (
1945
1975
  <Update description={date} href={href} id={id} label={label} tags={tags}>
1946
- <Content />
1976
+ <Content components={components} />
1947
1977
  </Update>
1948
1978
  ))}
1949
1979
  {majorGroups.slice(1).map((group) => (
@@ -1954,7 +1984,7 @@ const LayoutComponent = resolveSlot(layoutOverrides.Layout, RootLayout);
1954
1984
  >
1955
1985
  {group.items.map(({ Content, href, id, label, date, tags }) => (
1956
1986
  <Update description={date} href={href} id={id} label={label} tags={tags}>
1957
- <Content />
1987
+ <Content components={components} />
1958
1988
  </Update>
1959
1989
  ))}
1960
1990
  </section>
@@ -1974,7 +2004,7 @@ const LayoutComponent = resolveSlot(layoutOverrides.Layout, RootLayout);
1974
2004
  <div class="not-prose mt-8">
1975
2005
  {items.map(({ Content, href, id, label, date, tags }) => (
1976
2006
  <Update description={date} href={href} id={id} label={label} tags={tags}>
1977
- <Content />
2007
+ <Content components={components} />
1978
2008
  </Update>
1979
2009
  ))}
1980
2010
  </div>
@@ -2449,5 +2479,5 @@ var runtimeTsconfigTemplate = () => `${JSON.stringify({
2449
2479
 
2450
2480
  export { ADAPTER_IGNORE_DIRS, servesClientSubdir, deployStaticDir, surfaceAdapterOutput, resolveAskBackend, askBackendRuntimeDep, buildHomeLinkHeader, platformRedirects, publishRuntimeModules, runtimeDependencies, astroConfigTemplate, stagedContentDir, contentConfigTemplate, askEndpointTemplate, askComponentTemplate, searchEndpointTemplate, featuresTemplate, searchClientTemplate, mixedbreadSearchEndpointTemplate, rawMarkdownEndpointTemplate, contentAssetsEndpointTemplate, mcpPageFile, mcpEndpointTemplate, playgroundProxyTemplate, staticJsonEndpointTemplate, rssEndpointTemplate, navFragmentTemplate, ogEndpointTemplate, scalarReferenceTemplate, catchAllPageTemplate, changelogIndexTemplate, notFoundPageTemplate, notFoundMarkdownTemplate, notFoundJsonTemplate, apiPagesIndexTemplate, apiPageTemplate, apiNavigationTemplate, apiSearchTemplate, apiNotFoundTemplate, islandWrapperTemplate, islandMapTemplate, exampleSlug, exampleWrapperTemplate, examplesRouteBase, exampleMapTemplate, examplesPageTemplate, runtimePackageTemplate, runtimeTsconfigTemplate };
2451
2481
 
2452
- //# debugId=539E38867287181364756E2164756E21
2453
- //# sourceMappingURL=chunk-agy5rzxy.js.map
2482
+ //# debugId=5A77D8072A1C21F564756E2164756E21
2483
+ //# sourceMappingURL=chunk-4ae4f395.js.map