fumadocs-core 16.4.6 → 16.4.7
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.
- package/dist/advanced-tbtFDsHU.js.map +1 -1
- package/dist/{algolia-B9GvomyW.d.ts → algolia-BFVpYDZ_.d.ts} +1 -1
- package/dist/{algolia-B9GvomyW.d.ts.map → algolia-BFVpYDZ_.d.ts.map} +1 -1
- package/dist/algolia-Dbt0kj8j.js.map +1 -1
- package/dist/breadcrumb.js.map +1 -1
- package/dist/content/index.d.ts.map +1 -1
- package/dist/framework/index.d.ts +4 -4
- package/dist/framework/next.d.ts +2 -2
- package/dist/framework/react-router.d.ts +2 -2
- package/dist/framework/react-router.js.map +1 -1
- package/dist/framework/tanstack.d.ts +2 -2
- package/dist/framework/tanstack.js.map +1 -1
- package/dist/framework/waku.d.ts +2 -2
- package/dist/framework/waku.js.map +1 -1
- package/dist/highlight/client.js.map +1 -1
- package/dist/i18n/middleware.js.map +1 -1
- package/dist/index-BaMZ8PEK.d.ts +45 -0
- package/dist/index-BaMZ8PEK.d.ts.map +1 -0
- package/dist/index-CmGSoB4T.d.ts +18 -0
- package/dist/index-CmGSoB4T.d.ts.map +1 -0
- package/dist/{index-k5KwKJ_c.d.ts → index-aE27-b16.d.ts} +3 -2
- package/dist/index-aE27-b16.d.ts.map +1 -0
- package/dist/mdx-plugins/codeblock-utils.js.map +1 -1
- package/dist/mdx-plugins/remark-code-tab.js.map +1 -1
- package/dist/mdx-plugins/remark-directive-admonition.js.map +1 -1
- package/dist/mdx-plugins/remark-feedback-block.js.map +1 -1
- package/dist/mdx-plugins/remark-heading.js.map +1 -1
- package/dist/mdx-plugins/remark-image.js.map +1 -1
- package/dist/mdx-plugins/remark-mdx-files.js.map +1 -1
- package/dist/mdx-plugins/remark-npm.js.map +1 -1
- package/dist/mdx-plugins/remark-steps.js.map +1 -1
- package/dist/mdx-plugins/remark-structure.js.map +1 -1
- package/dist/{mixedbread-B0TvOHtt.js → mixedbread-CPGJEgwq.js} +2 -2
- package/dist/mixedbread-CPGJEgwq.js.map +1 -0
- package/dist/negotiation/index.js.map +1 -1
- package/dist/orama-cloud-legacy-NJTbB19B.js.map +1 -1
- package/dist/orama-cloud-yicpgD0c.js.map +1 -1
- package/dist/page-tree/index.d.ts +2 -44
- package/dist/rehype-code-Ct5Pb6BZ.js.map +1 -1
- package/dist/rehype-toc-CTG0x7La.js.map +1 -1
- package/dist/search/algolia.d.ts +1 -1
- package/dist/search/algolia.js.map +1 -1
- package/dist/search/client.d.ts +5 -3
- package/dist/search/client.d.ts.map +1 -1
- package/dist/search/client.js +1 -1
- package/dist/search/orama-cloud-legacy.js.map +1 -1
- package/dist/search/orama-cloud.js.map +1 -1
- package/dist/search/server.d.ts +4 -2
- package/dist/search/server.js.map +1 -1
- package/dist/search-DzqmOjzV.js.map +1 -1
- package/dist/{server-CjGgVKx_.d.ts → server-CLPpotS9.d.ts} +2 -2
- package/dist/{server-CjGgVKx_.d.ts.map → server-CLPpotS9.d.ts.map} +1 -1
- package/dist/shiki-B4NO99XD.js.map +1 -1
- package/dist/source/client/index.d.ts +4 -18
- package/dist/source/client/index.js +16 -9
- package/dist/source/client/index.js.map +1 -1
- package/dist/source/index.d.ts +3 -1
- package/dist/source/index.js +10 -7
- package/dist/source/index.js.map +1 -1
- package/dist/source/plugins/lucide-icons.d.ts +3 -1
- package/dist/source/plugins/lucide-icons.d.ts.map +1 -1
- package/dist/source/plugins/slugs.d.ts +3 -1
- package/dist/source/plugins/slugs.js.map +1 -1
- package/dist/static-C_WBOzek.js.map +1 -1
- package/dist/toc.js.map +1 -1
- package/dist/utils/use-effect-event.js.map +1 -1
- package/dist/utils-D10VxgVc.js.map +1 -1
- package/package.json +5 -5
- package/dist/index-k5KwKJ_c.d.ts.map +0 -1
- package/dist/mixedbread-B0TvOHtt.js.map +0 -1
- package/dist/page-tree/index.d.ts.map +0 -1
- package/dist/source/client/index.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advanced-tbtFDsHU.js","names":[
|
|
1
|
+
{"version":3,"file":"advanced-tbtFDsHU.js","names":[],"sources":["../src/search/orama/search/simple.ts","../src/search/orama/search/advanced.ts"],"sourcesContent":["import { type Orama, search, type SearchParams } from '@orama/orama';\nimport { type SimpleDocument, type simpleSchema } from '@/search/orama/create-db';\nimport { createContentHighlighter, type SortedResult } from '@/search';\n\nexport async function searchSimple(\n db: Orama<typeof simpleSchema>,\n query: string,\n params: Partial<SearchParams<Orama<typeof simpleSchema>, SimpleDocument>> = {},\n): Promise<SortedResult[]> {\n const highlighter = createContentHighlighter(query);\n const result = await search(db, {\n term: query,\n tolerance: 1,\n ...params,\n boost: {\n title: 2,\n ...('boost' in params ? params.boost : undefined),\n },\n });\n\n return result.hits.map<SortedResult>((hit) => ({\n type: 'page',\n content: hit.document.title,\n breadcrumbs: hit.document.breadcrumbs,\n contentWithHighlights: highlighter.highlight(hit.document.title),\n id: hit.document.url,\n url: hit.document.url,\n }));\n}\n","import { getByID, type Orama, search, type SearchParams } from '@orama/orama';\nimport { type AdvancedDocument, type advancedSchema } from '@/search/orama/create-db';\nimport { removeUndefined } from '@/utils/remove-undefined';\nimport { createContentHighlighter, type SortedResult } from '@/search';\n\nexport async function searchAdvanced(\n db: Orama<typeof advancedSchema>,\n query: string,\n tag: string | string[] = [],\n {\n mode = 'fulltext',\n ...override\n }: Partial<SearchParams<Orama<typeof advancedSchema>, AdvancedDocument>> = {},\n): Promise<SortedResult[]> {\n if (typeof tag === 'string') tag = [tag];\n\n let params = {\n ...override,\n mode,\n where: removeUndefined({\n tags:\n tag.length > 0\n ? {\n containsAll: tag,\n }\n : undefined,\n ...override.where,\n }),\n groupBy: {\n properties: ['page_id'],\n maxResult: 8,\n ...override.groupBy,\n },\n } as SearchParams<typeof db, AdvancedDocument>;\n\n if (query.length > 0) {\n params = {\n ...params,\n term: query,\n properties: mode === 'fulltext' ? ['content'] : ['content', 'embeddings'],\n } as SearchParams<typeof db, AdvancedDocument>;\n }\n\n const highlighter = createContentHighlighter(query);\n const result = await search(db, params);\n const list: SortedResult[] = [];\n for (const item of result.groups ?? []) {\n const pageId = item.values[0] as string;\n\n const page = getByID(db, pageId);\n if (!page) continue;\n\n list.push({\n id: pageId,\n type: 'page',\n content: page.content,\n breadcrumbs: page.breadcrumbs,\n contentWithHighlights: highlighter.highlight(page.content),\n url: page.url,\n });\n\n for (const hit of item.result) {\n if (hit.document.type === 'page') continue;\n\n list.push({\n id: hit.document.id.toString(),\n content: hit.document.content,\n breadcrumbs: hit.document.breadcrumbs,\n contentWithHighlights: highlighter.highlight(hit.document.content),\n type: hit.document.type as SortedResult['type'],\n url: hit.document.url,\n });\n }\n }\n return list;\n}\n"],"mappings":";;;;;AAIA,eAAsB,aACpB,IACA,OACA,SAA4E,EAAE,EACrD;CACzB,MAAM,cAAc,yBAAyB,MAAM;AAWnD,SAVe,MAAM,OAAO,IAAI;EAC9B,MAAM;EACN,WAAW;EACX,GAAG;EACH,OAAO;GACL,OAAO;GACP,GAAI,WAAW,SAAS,OAAO,QAAQ;GACxC;EACF,CAAC,EAEY,KAAK,KAAmB,SAAS;EAC7C,MAAM;EACN,SAAS,IAAI,SAAS;EACtB,aAAa,IAAI,SAAS;EAC1B,uBAAuB,YAAY,UAAU,IAAI,SAAS,MAAM;EAChE,IAAI,IAAI,SAAS;EACjB,KAAK,IAAI,SAAS;EACnB,EAAE;;;;;ACtBL,eAAsB,eACpB,IACA,OACA,MAAyB,EAAE,EAC3B,EACE,OAAO,YACP,GAAG,aACsE,EAAE,EACpD;AACzB,KAAI,OAAO,QAAQ,SAAU,OAAM,CAAC,IAAI;CAExC,IAAI,SAAS;EACX,GAAG;EACH;EACA,OAAO,gBAAgB;GACrB,MACE,IAAI,SAAS,IACT,EACE,aAAa,KACd,GACD;GACN,GAAG,SAAS;GACb,CAAC;EACF,SAAS;GACP,YAAY,CAAC,UAAU;GACvB,WAAW;GACX,GAAG,SAAS;GACb;EACF;AAED,KAAI,MAAM,SAAS,EACjB,UAAS;EACP,GAAG;EACH,MAAM;EACN,YAAY,SAAS,aAAa,CAAC,UAAU,GAAG,CAAC,WAAW,aAAa;EAC1E;CAGH,MAAM,cAAc,yBAAyB,MAAM;CACnD,MAAM,SAAS,MAAM,OAAO,IAAI,OAAO;CACvC,MAAM,OAAuB,EAAE;AAC/B,MAAK,MAAM,QAAQ,OAAO,UAAU,EAAE,EAAE;EACtC,MAAM,SAAS,KAAK,OAAO;EAE3B,MAAM,OAAO,QAAQ,IAAI,OAAO;AAChC,MAAI,CAAC,KAAM;AAEX,OAAK,KAAK;GACR,IAAI;GACJ,MAAM;GACN,SAAS,KAAK;GACd,aAAa,KAAK;GAClB,uBAAuB,YAAY,UAAU,KAAK,QAAQ;GAC1D,KAAK,KAAK;GACX,CAAC;AAEF,OAAK,MAAM,OAAO,KAAK,QAAQ;AAC7B,OAAI,IAAI,SAAS,SAAS,OAAQ;AAElC,QAAK,KAAK;IACR,IAAI,IAAI,SAAS,GAAG,UAAU;IAC9B,SAAS,IAAI,SAAS;IACtB,aAAa,IAAI,SAAS;IAC1B,uBAAuB,YAAY,UAAU,IAAI,SAAS,QAAQ;IAClE,MAAM,IAAI,SAAS;IACnB,KAAK,IAAI,SAAS;IACnB,CAAC;;;AAGN,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algolia-
|
|
1
|
+
{"version":3,"file":"algolia-BFVpYDZ_.d.ts","names":[],"sources":["../src/search/algolia.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,cAAA;;AAAjB;AA2BA;EAkBsB,GAAA,EAAA,MAAI;EAAS,KAAA,EAAA,MAAA;EAAwB,WAAA,CAAA,EAAA,MAAA;EAAc,WAAA,CAAA,EAAA,MAAA,EAAA;EAAO;AAMhF;AAyDA;EACU,GAAA,EAAA,MAAA;EAEG,UAAA,EAjGC,cAiGD;EACV;;AASH;;;;;;;UA9FiB,WAAA;;;;;;;;aASJ;;;;;;;;iBASS,IAAA,SAAa,wBAAwB,cAAc;iBAMnD,gBAAA,SAAyB,mCAAmC;iBAyD5D,eAAA,SACZ,6CAEG,mBACV;UASc,SAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algolia-Dbt0kj8j.js","names":[
|
|
1
|
+
{"version":3,"file":"algolia-Dbt0kj8j.js","names":[],"sources":["../src/search/client/algolia.ts"],"sourcesContent":["import type { BaseIndex } from '@/search/algolia';\nimport type { Hit, LiteClient, SearchResponse } from 'algoliasearch/lite';\nimport { createContentHighlighter, type SortedResult } from '@/search';\n\nexport interface AlgoliaOptions {\n indexName: string;\n client: LiteClient;\n\n /**\n * Filter results with specific tag.\n */\n tag?: string;\n\n locale?: string;\n\n onSearch?: (\n query: string,\n tag?: string,\n locale?: string,\n ) => Promise<{\n results: SearchResponse<BaseIndex>[];\n }>;\n}\n\nexport function groupResults(hits: Hit<BaseIndex>[]): SortedResult[] {\n const grouped: SortedResult[] = [];\n const scannedUrls = new Set<string>();\n\n for (const hit of hits) {\n if (!scannedUrls.has(hit.url)) {\n scannedUrls.add(hit.url);\n\n grouped.push({\n id: hit.url,\n type: 'page',\n breadcrumbs: hit.breadcrumbs,\n url: hit.url,\n content: hit.title,\n });\n }\n\n grouped.push({\n id: hit.objectID,\n type: hit.content === hit.section ? 'heading' : 'text',\n url: hit.section_id ? `${hit.url}#${hit.section_id}` : hit.url,\n content: hit.content,\n });\n }\n\n return grouped;\n}\n\nexport async function searchDocs(\n query: string,\n { indexName, onSearch, client, locale, tag }: AlgoliaOptions,\n): Promise<SortedResult[]> {\n if (query.trim().length === 0) return [];\n\n const result = onSearch\n ? await onSearch(query, tag, locale)\n : await client.searchForHits<BaseIndex>({\n requests: [\n {\n type: 'default',\n indexName,\n query,\n distinct: 5,\n hitsPerPage: 10,\n filters: tag ? `tag:${tag}` : undefined,\n },\n ],\n });\n\n const highlighter = createContentHighlighter(query);\n return groupResults(result.results[0].hits).flatMap((hit) => {\n if (hit.type === 'page') {\n return {\n ...hit,\n contentWithHighlights: hit.contentWithHighlights ?? highlighter.highlight(hit.content),\n };\n }\n\n return [];\n });\n}\n"],"mappings":";;;AAwBA,SAAgB,aAAa,MAAwC;CACnE,MAAM,UAA0B,EAAE;CAClC,MAAM,8BAAc,IAAI,KAAa;AAErC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE;AAC7B,eAAY,IAAI,IAAI,IAAI;AAExB,WAAQ,KAAK;IACX,IAAI,IAAI;IACR,MAAM;IACN,aAAa,IAAI;IACjB,KAAK,IAAI;IACT,SAAS,IAAI;IACd,CAAC;;AAGJ,UAAQ,KAAK;GACX,IAAI,IAAI;GACR,MAAM,IAAI,YAAY,IAAI,UAAU,YAAY;GAChD,KAAK,IAAI,aAAa,GAAG,IAAI,IAAI,GAAG,IAAI,eAAe,IAAI;GAC3D,SAAS,IAAI;GACd,CAAC;;AAGJ,QAAO;;AAGT,eAAsB,WACpB,OACA,EAAE,WAAW,UAAU,QAAQ,QAAQ,OACd;AACzB,KAAI,MAAM,MAAM,CAAC,WAAW,EAAG,QAAO,EAAE;CAExC,MAAM,SAAS,WACX,MAAM,SAAS,OAAO,KAAK,OAAO,GAClC,MAAM,OAAO,cAAyB,EACpC,UAAU,CACR;EACE,MAAM;EACN;EACA;EACA,UAAU;EACV,aAAa;EACb,SAAS,MAAM,OAAO,QAAQ;EAC/B,CACF,EACF,CAAC;CAEN,MAAM,cAAc,yBAAyB,MAAM;AACnD,QAAO,aAAa,OAAO,QAAQ,GAAG,KAAK,CAAC,SAAS,QAAQ;AAC3D,MAAI,IAAI,SAAS,OACf,QAAO;GACL,GAAG;GACH,uBAAuB,IAAI,yBAAyB,YAAY,UAAU,IAAI,QAAQ;GACvF;AAGH,SAAO,EAAE;GACT"}
|
package/dist/breadcrumb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.js","names":[
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","names":[],"sources":["../src/breadcrumb.tsx"],"sourcesContent":["import { type ReactNode, useMemo } from 'react';\nimport type * as PageTree from '@/page-tree/definitions';\nimport { normalizeUrl } from '@/utils/normalize-url';\nimport { findPath } from '@/page-tree/utils';\n\nexport interface BreadcrumbItem {\n name: ReactNode;\n url?: string;\n}\n\nexport interface BreadcrumbOptions {\n /**\n * Include the root folders in the breadcrumb items array.\n *\n * @defaultValue false\n */\n includeRoot?:\n | boolean\n | {\n /**\n * Specify the url of root\n */\n url: string;\n };\n\n /**\n * Include the page itself in the breadcrumb items array\n *\n * @defaultValue false\n */\n includePage?: boolean;\n\n /**\n * Count separator as an item\n *\n * @defaultValue false\n */\n includeSeparator?: boolean;\n}\n\nexport function useBreadcrumb(\n url: string,\n tree: PageTree.Root,\n options?: BreadcrumbOptions,\n): BreadcrumbItem[] {\n return useMemo(() => getBreadcrumbItems(url, tree, options), [tree, url, options]);\n}\n\nexport function getBreadcrumbItems(\n url: string,\n tree: PageTree.Root,\n options: BreadcrumbOptions = {},\n): BreadcrumbItem[] {\n return getBreadcrumbItemsFromPath(tree, searchPath(tree.children, url) ?? [], options);\n}\n\nexport function getBreadcrumbItemsFromPath(\n tree: PageTree.Root,\n path: PageTree.Node[],\n options: BreadcrumbOptions,\n): BreadcrumbItem[] {\n const { includePage = false, includeSeparator = false, includeRoot = false } = options;\n let items: BreadcrumbItem[] = [];\n for (let i = 0; i < path.length; i++) {\n const item = path[i];\n\n switch (item.type) {\n case 'page':\n if (includePage)\n items.push({\n name: item.name,\n url: item.url,\n });\n break;\n case 'folder':\n if (item.root && !includeRoot) {\n items = [];\n break;\n }\n\n // only show the index node of folders if possible\n if (i === path.length - 1 || item.index !== path[i + 1]) {\n items.push({\n name: item.name,\n url: item.index?.url,\n });\n }\n break;\n case 'separator':\n if (item.name && includeSeparator)\n items.push({\n name: item.name,\n });\n break;\n }\n }\n\n if (includeRoot) {\n items.unshift({\n name: tree.name,\n url: typeof includeRoot === 'object' ? includeRoot.url : undefined,\n });\n }\n\n return items;\n}\n\n/**\n * Search the path of a node in the tree by a specified url\n *\n * - When the page doesn't exist, return null\n *\n * @returns The path to the target node from root\n * @internal Don't use this on your own\n */\nexport function searchPath(nodes: PageTree.Node[], url: string): PageTree.Node[] | null {\n const normalizedUrl = normalizeUrl(url);\n\n return findPath(nodes, (node) => node.type === 'page' && node.url === normalizedUrl);\n}\n"],"mappings":";;;;;AAwCA,SAAgB,cACd,KACA,MACA,SACkB;AAClB,QAAO,cAAc,mBAAmB,KAAK,MAAM,QAAQ,EAAE;EAAC;EAAM;EAAK;EAAQ,CAAC;;AAGpF,SAAgB,mBACd,KACA,MACA,UAA6B,EAAE,EACb;AAClB,QAAO,2BAA2B,MAAM,WAAW,KAAK,UAAU,IAAI,IAAI,EAAE,EAAE,QAAQ;;AAGxF,SAAgB,2BACd,MACA,MACA,SACkB;CAClB,MAAM,EAAE,cAAc,OAAO,mBAAmB,OAAO,cAAc,UAAU;CAC/E,IAAI,QAA0B,EAAE;AAChC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,OAAO,KAAK;AAElB,UAAQ,KAAK,MAAb;GACE,KAAK;AACH,QAAI,YACF,OAAM,KAAK;KACT,MAAM,KAAK;KACX,KAAK,KAAK;KACX,CAAC;AACJ;GACF,KAAK;AACH,QAAI,KAAK,QAAQ,CAAC,aAAa;AAC7B,aAAQ,EAAE;AACV;;AAIF,QAAI,MAAM,KAAK,SAAS,KAAK,KAAK,UAAU,KAAK,IAAI,GACnD,OAAM,KAAK;KACT,MAAM,KAAK;KACX,KAAK,KAAK,OAAO;KAClB,CAAC;AAEJ;GACF,KAAK;AACH,QAAI,KAAK,QAAQ,iBACf,OAAM,KAAK,EACT,MAAM,KAAK,MACZ,CAAC;AACJ;;;AAIN,KAAI,YACF,OAAM,QAAQ;EACZ,MAAM,KAAK;EACX,KAAK,OAAO,gBAAgB,WAAW,YAAY,MAAM;EAC1D,CAAC;AAGJ,QAAO;;;;;;;;;;AAWT,SAAgB,WAAW,OAAwB,KAAqC;CACtF,MAAM,gBAAgB,aAAa,IAAI;AAEvC,QAAO,SAAS,QAAQ,SAAS,KAAK,SAAS,UAAU,KAAK,QAAQ,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/content/index.ts"],"sourcesContent":[],"mappings":";;;;;;;UAqBiB,aAAA;eACF;;AADE,iBAIK,QAAA,CAHP;EAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/content/index.ts"],"sourcesContent":[],"mappings":";;;;;;;UAqBiB,aAAA;eACF;;AADE,iBAIK,QAAA,CAHP;EAAA,QAAU,EAIb,OAJa;EAAA,aAAA;EAAA,aAAA;EAAA,GAAA;CAAA,EAQtB,aARsB,GAAA;EAGH,aAAQ,CAAA,EAMZ,aANY;EAClB,aAAA,CAAA,EAMM,aANN;EACV,QAAA,EAMU,UANV;CACA,CAAA,EAMD,OANC,CAMD,MAAA,CAAA,YANC,CAAA,OAAA,EAAA,MAAA,GAKoB,MAAA,CACrB,qBANC,CAAA,GAAA,CAAA,CAAA,GAMD,QANC,CAMD,SANC,CAAA,GAAA,CAAA,MAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAMD,MAAA,CAAA,WAAA,GAAA,MAAA,CAAA,YANC,CAAA,OAAA,EAAA,MAAA,GAMD,MAAA,CAAA,qBANC,CAAA,GAAA,CAAA,CAAA,GAMD,QANC,CAMD,SANC,CAAA,GAAA,IAAA,GAAA,SAAA,CAAA,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ComponentProps, FC, ReactNode } from "react";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime2 from "react/jsx-runtime";
|
|
3
3
|
import { StaticImport } from "next/dist/shared/lib/get-img-props";
|
|
4
4
|
|
|
5
5
|
//#region src/framework/index.d.ts
|
|
@@ -39,12 +39,12 @@ declare function FrameworkProvider({
|
|
|
39
39
|
children
|
|
40
40
|
}: Framework & {
|
|
41
41
|
children: ReactNode;
|
|
42
|
-
}):
|
|
42
|
+
}): react_jsx_runtime2.JSX.Element;
|
|
43
43
|
declare function usePathname(): string;
|
|
44
44
|
declare function useRouter(): Router;
|
|
45
45
|
declare function useParams(): Record<string, string | string[]>;
|
|
46
|
-
declare function Image(props: ImageProps):
|
|
47
|
-
declare function Link(props: LinkProps):
|
|
46
|
+
declare function Image(props: ImageProps): react_jsx_runtime2.JSX.Element;
|
|
47
|
+
declare function Link(props: LinkProps): react_jsx_runtime2.JSX.Element;
|
|
48
48
|
//#endregion
|
|
49
49
|
export { Framework, FrameworkProvider, Image, ImageProps, Link, Router, useParams, usePathname, useRouter };
|
|
50
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/framework/next.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Framework } from "./index.js";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react_jsx_runtime5 from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/framework/next.d.ts
|
|
6
6
|
declare function NextProvider({
|
|
@@ -11,7 +11,7 @@ declare function NextProvider({
|
|
|
11
11
|
children: ReactNode;
|
|
12
12
|
Link?: Framework['Link'];
|
|
13
13
|
Image?: Framework['Image'];
|
|
14
|
-
}):
|
|
14
|
+
}): react_jsx_runtime5.JSX.Element;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { NextProvider };
|
|
17
17
|
//# sourceMappingURL=next.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Framework } from "./index.js";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react_jsx_runtime6 from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/framework/react-router.d.ts
|
|
6
6
|
declare function ReactRouterProvider({
|
|
@@ -11,7 +11,7 @@ declare function ReactRouterProvider({
|
|
|
11
11
|
children: ReactNode;
|
|
12
12
|
Link?: Framework['Link'];
|
|
13
13
|
Image?: Framework['Image'];
|
|
14
|
-
}):
|
|
14
|
+
}): react_jsx_runtime6.JSX.Element;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { ReactRouterProvider };
|
|
17
17
|
//# sourceMappingURL=react-router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-router.js","names":[
|
|
1
|
+
{"version":3,"file":"react-router.js","names":[],"sources":["../../src/framework/react-router.tsx"],"sourcesContent":["import { type ReactNode, useMemo } from 'react';\nimport { type Framework, FrameworkProvider } from '@/framework/index';\nimport { Link, useLocation, useNavigate, useParams, useRevalidator } from 'react-router';\n\nconst framework: Framework = {\n usePathname() {\n return useLocation().pathname;\n },\n useParams() {\n return useParams() as Record<string, string | string[]>;\n },\n useRouter() {\n const navigate = useNavigate();\n const revalidator = useRevalidator();\n\n return useMemo(\n () => ({\n push(url) {\n navigate(url);\n },\n refresh() {\n void revalidator.revalidate();\n },\n }),\n [navigate, revalidator],\n );\n },\n Link({ href, prefetch, ...props }) {\n return (\n <Link to={href!} prefetch={prefetch ? 'intent' : 'none'} {...props}>\n {props.children}\n </Link>\n );\n },\n};\n\nexport function ReactRouterProvider({\n children,\n Link: CustomLink,\n Image: CustomImage,\n}: {\n children: ReactNode;\n Link?: Framework['Link'];\n Image?: Framework['Image'];\n}) {\n return (\n <FrameworkProvider\n {...framework}\n Link={CustomLink ?? framework.Link}\n Image={CustomImage ?? framework.Image}\n >\n {children}\n </FrameworkProvider>\n );\n}\n"],"mappings":";;;;;;AAIA,MAAM,YAAuB;CAC3B,cAAc;AACZ,SAAO,aAAa,CAAC;;CAEvB,YAAY;AACV,SAAO,WAAW;;CAEpB,YAAY;EACV,MAAM,WAAW,aAAa;EAC9B,MAAM,cAAc,gBAAgB;AAEpC,SAAO,eACE;GACL,KAAK,KAAK;AACR,aAAS,IAAI;;GAEf,UAAU;AACR,IAAK,YAAY,YAAY;;GAEhC,GACD,CAAC,UAAU,YAAY,CACxB;;CAEH,KAAK,EAAE,MAAM,UAAU,GAAG,SAAS;AACjC,SACE,oBAAC;GAAK,IAAI;GAAO,UAAU,WAAW,WAAW;GAAQ,GAAI;aAC1D,MAAM;IACF;;CAGZ;AAED,SAAgB,oBAAoB,EAClC,UACA,MAAM,YACN,OAAO,eAKN;AACD,QACE,oBAAC;EACC,GAAI;EACJ,MAAM,cAAc,UAAU;EAC9B,OAAO,eAAe,UAAU;EAE/B;GACiB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Framework } from "./index.js";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react_jsx_runtime7 from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/framework/tanstack.d.ts
|
|
6
6
|
/**
|
|
@@ -14,7 +14,7 @@ declare function TanstackProvider({
|
|
|
14
14
|
children: ReactNode;
|
|
15
15
|
Link?: Framework['Link'];
|
|
16
16
|
Image?: Framework['Image'];
|
|
17
|
-
}):
|
|
17
|
+
}): react_jsx_runtime7.JSX.Element;
|
|
18
18
|
//#endregion
|
|
19
19
|
export { TanstackProvider };
|
|
20
20
|
//# sourceMappingURL=tanstack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack.js","names":[
|
|
1
|
+
{"version":3,"file":"tanstack.js","names":[],"sources":["../../src/framework/tanstack.tsx"],"sourcesContent":["import { type ReactNode, useRef, useMemo } from 'react';\nimport { type Framework, FrameworkProvider } from '@/framework/index';\nimport { useParams, Link, useRouter, useRouterState } from '@tanstack/react-router';\n\nconst framework: Framework = {\n Link({ href, prefetch = true, ...props }) {\n return (\n <Link to={href} preload={prefetch ? 'intent' : false} {...props}>\n {props.children}\n </Link>\n );\n },\n usePathname() {\n const { isLoading, pathname } = useRouterState({\n select: (state) => ({\n isLoading: state.isLoading,\n pathname: state.location.pathname,\n }),\n });\n\n const activePathname = useRef(pathname);\n return useMemo(() => {\n if (isLoading) {\n return activePathname.current;\n }\n\n activePathname.current = pathname;\n return pathname;\n }, [isLoading, pathname]);\n },\n useRouter() {\n const router = useRouter();\n\n return useMemo(\n () => ({\n push(url) {\n void router.navigate({\n href: url,\n });\n },\n refresh() {\n void router.invalidate();\n },\n }),\n [router],\n );\n },\n useParams() {\n return useParams({ strict: false });\n },\n};\n\n/**\n * Fumadocs adapter for Tanstack Router/Start\n */\nexport function TanstackProvider({\n children,\n Link: CustomLink,\n Image: CustomImage,\n}: {\n children: ReactNode;\n Link?: Framework['Link'];\n Image?: Framework['Image'];\n}) {\n return (\n <FrameworkProvider\n {...framework}\n Link={CustomLink ?? framework.Link}\n Image={CustomImage ?? framework.Image}\n >\n {children}\n </FrameworkProvider>\n );\n}\n"],"mappings":";;;;;;AAIA,MAAM,YAAuB;CAC3B,KAAK,EAAE,MAAM,WAAW,MAAM,GAAG,SAAS;AACxC,SACE,oBAAC;GAAK,IAAI;GAAM,SAAS,WAAW,WAAW;GAAO,GAAI;aACvD,MAAM;IACF;;CAGX,cAAc;EACZ,MAAM,EAAE,WAAW,aAAa,eAAe,EAC7C,SAAS,WAAW;GAClB,WAAW,MAAM;GACjB,UAAU,MAAM,SAAS;GAC1B,GACF,CAAC;EAEF,MAAM,iBAAiB,OAAO,SAAS;AACvC,SAAO,cAAc;AACnB,OAAI,UACF,QAAO,eAAe;AAGxB,kBAAe,UAAU;AACzB,UAAO;KACN,CAAC,WAAW,SAAS,CAAC;;CAE3B,YAAY;EACV,MAAM,SAAS,WAAW;AAE1B,SAAO,eACE;GACL,KAAK,KAAK;AACR,IAAK,OAAO,SAAS,EACnB,MAAM,KACP,CAAC;;GAEJ,UAAU;AACR,IAAK,OAAO,YAAY;;GAE3B,GACD,CAAC,OAAO,CACT;;CAEH,YAAY;AACV,SAAO,UAAU,EAAE,QAAQ,OAAO,CAAC;;CAEtC;;;;AAKD,SAAgB,iBAAiB,EAC/B,UACA,MAAM,YACN,OAAO,eAKN;AACD,QACE,oBAAC;EACC,GAAI;EACJ,MAAM,cAAc,UAAU;EAC9B,OAAO,eAAe,UAAU;EAE/B;GACiB"}
|
package/dist/framework/waku.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Framework } from "./index.js";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react_jsx_runtime8 from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/framework/waku.d.ts
|
|
6
6
|
declare function WakuProvider({
|
|
@@ -11,7 +11,7 @@ declare function WakuProvider({
|
|
|
11
11
|
children: ReactNode;
|
|
12
12
|
Link?: Framework['Link'];
|
|
13
13
|
Image?: Framework['Image'];
|
|
14
|
-
}):
|
|
14
|
+
}): react_jsx_runtime8.JSX.Element;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { WakuProvider };
|
|
17
17
|
//# sourceMappingURL=waku.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku.js","names":["
|
|
1
|
+
{"version":3,"file":"waku.js","names":["WakuLink"],"sources":["../../src/framework/waku.tsx"],"sourcesContent":["'use client';\n\nimport { type ReactNode, useMemo } from 'react';\nimport { Link as WakuLink, useRouter } from 'waku';\nimport { type Framework, FrameworkProvider } from './index.js';\n\nconst framework: Framework = {\n usePathname() {\n const { path } = useRouter();\n return path;\n },\n useParams() {\n const { query } = useRouter();\n return useMemo(() => {\n const params = new URLSearchParams(query);\n return Object.fromEntries(\n Array.from(params.entries()).map(([key, value]) => [\n key,\n Array.isArray(value) ? value[0] : value,\n ]),\n );\n }, [query]);\n },\n useRouter() {\n const router = useRouter();\n\n return useMemo(\n () => ({\n push(url: string) {\n void router.push(url);\n },\n refresh() {\n void router.push(router.path);\n },\n }),\n [router],\n );\n },\n Link({ href, prefetch = true, ...props }) {\n return (\n <WakuLink to={href!} unstable_prefetchOnEnter={prefetch} {...props}>\n {props.children}\n </WakuLink>\n );\n },\n};\n\nexport function WakuProvider({\n children,\n Link: CustomLink,\n Image: CustomImage,\n}: {\n children: ReactNode;\n Link?: Framework['Link'];\n Image?: Framework['Image'];\n}) {\n return (\n <FrameworkProvider\n {...framework}\n Link={CustomLink ?? framework.Link}\n Image={CustomImage ?? framework.Image}\n >\n {children}\n </FrameworkProvider>\n );\n}\n"],"mappings":";;;;;;;;AAMA,MAAM,YAAuB;CAC3B,cAAc;EACZ,MAAM,EAAE,SAAS,WAAW;AAC5B,SAAO;;CAET,YAAY;EACV,MAAM,EAAE,UAAU,WAAW;AAC7B,SAAO,cAAc;GACnB,MAAM,SAAS,IAAI,gBAAgB,MAAM;AACzC,UAAO,OAAO,YACZ,MAAM,KAAK,OAAO,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CACjD,KACA,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK,MACnC,CAAC,CACH;KACA,CAAC,MAAM,CAAC;;CAEb,YAAY;EACV,MAAM,SAAS,WAAW;AAE1B,SAAO,eACE;GACL,KAAK,KAAa;AAChB,IAAK,OAAO,KAAK,IAAI;;GAEvB,UAAU;AACR,IAAK,OAAO,KAAK,OAAO,KAAK;;GAEhC,GACD,CAAC,OAAO,CACT;;CAEH,KAAK,EAAE,MAAM,WAAW,MAAM,GAAG,SAAS;AACxC,SACE,oBAACA;GAAS,IAAI;GAAO,0BAA0B;GAAU,GAAI;aAC1D,MAAM;IACE;;CAGhB;AAED,SAAgB,aAAa,EAC3B,UACA,MAAM,YACN,OAAO,eAKN;AACD,QACE,oBAAC;EACC,GAAI;EACJ,MAAM,cAAc,UAAU;EAC9B,OAAO,eAAe,UAAU;EAE/B;GACiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../src/highlight/client.tsx"],"sourcesContent":["'use client';\nimport { type DependencyList, type ReactNode, use, useMemo } from 'react';\nimport { highlight, type HighlightOptions } from './shiki';\n\nconst promises: Record<string, Promise<ReactNode>> = {};\n\n/**\n * get highlighted results, should be used with React Suspense API.\n *\n * note: results are cached with (lang, code) as keys, if this is not the desired behaviour, pass a `deps` instead.\n */\nexport function useShiki(\n code: string,\n options: HighlightOptions,\n deps?: DependencyList,\n): ReactNode {\n const key = useMemo(() => {\n return deps ? JSON.stringify(deps) : `${options.lang}:${code}`;\n }, [code, deps, options.lang]);\n\n return use((promises[key] ??= highlight(code, options)));\n}\n"],"mappings":";;;;;;AAIA,MAAM,WAA+C,EAAE;;;;;;AAOvD,SAAgB,SACd,MACA,SACA,MACW;CACX,MAAM,MAAM,cAAc;AACxB,SAAO,OAAO,KAAK,UAAU,KAAK,GAAG,GAAG,QAAQ,KAAK,GAAG;IACvD;EAAC;EAAM;EAAM,QAAQ;EAAK,CAAC;AAE9B,QAAO,IAAK,SAAS,SAAS,UAAU,MAAM,QAAQ,CAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","names":["
|
|
1
|
+
{"version":3,"file":"middleware.js","names":["matchLocale"],"sources":["../../src/i18n/middleware.ts"],"sourcesContent":["import { match as matchLocale } from '@formatjs/intl-localematcher';\nimport { type NextProxy, NextResponse } from 'next/server';\nimport type { I18nConfig } from '@/i18n';\nimport { getNegotiator } from '@/negotiation';\nimport type { NextURL } from 'next/dist/server/web/next-url';\n\ninterface MiddlewareOptions extends I18nConfig {\n /**\n * Either:\n * - A formatter object\n * - A function that adds the locale prefix to pathname\n */\n format?: URLFormatter | ((locale: string, pathname: string) => string);\n\n /**\n * the cookie to store locale code when `hideLocale` is set to `always`.\n */\n cookieName?: string;\n}\n\nexport interface URLFormatter {\n /**\n * get locale code from request URL\n */\n get: (url: NextURL) => string | undefined;\n\n /**\n * add locale code to request URL (which is missing the locale).\n */\n add: (url: NextURL, locale: string) => URL;\n\n /**\n * remove locale code from request URL\n */\n remove: (url: NextURL) => URL;\n}\n\nexport const DefaultFormatter: URLFormatter = {\n get(url) {\n const segs = url.pathname.split('/');\n if (segs.length > 1 && segs[1]) return segs[1];\n },\n add(url, locale) {\n const next = new URL(url);\n next.pathname = `${url.basePath}/${locale}/${url.pathname}`.replaceAll(/\\/+/g, '/');\n return next;\n },\n remove(url) {\n const next = new URL(url);\n const pathname = url.pathname.split('/').slice(2).join('/');\n next.pathname = `${url.basePath}/${pathname}`.replaceAll(/\\/+/g, '/');\n return next;\n },\n};\n\nexport function createI18nMiddleware({\n languages,\n defaultLanguage,\n format = DefaultFormatter,\n cookieName = 'FD_LOCALE',\n hideLocale = 'never',\n}: MiddlewareOptions): NextProxy {\n let formatter: URLFormatter;\n if (typeof format === 'function') {\n formatter = {\n ...DefaultFormatter,\n add(url, locale) {\n const next = new URL(url);\n next.pathname = format(locale, url.pathname);\n return next;\n },\n };\n } else {\n formatter = format;\n }\n\n return (request) => {\n const url = request.nextUrl;\n let pathLocale = formatter.get(url);\n if (pathLocale && !languages.includes(pathLocale)) pathLocale = undefined;\n\n if (!pathLocale) {\n if (hideLocale === 'default-locale') {\n return NextResponse.rewrite(formatter.add(url, defaultLanguage));\n }\n\n const finalLanguages = getNegotiator(request).languages(languages);\n const preferred = matchLocale(finalLanguages, languages, defaultLanguage);\n if (hideLocale === 'always') {\n const locale = request.cookies.get(cookieName)?.value ?? preferred;\n\n return NextResponse.rewrite(formatter.add(url, locale));\n }\n\n return NextResponse.redirect(formatter.add(url, preferred));\n }\n\n // Remove explicit locale\n if (\n hideLocale === 'always' ||\n (hideLocale === 'default-locale' && pathLocale === defaultLanguage)\n ) {\n const res = NextResponse.redirect(formatter.remove(url));\n res.cookies.set(cookieName, pathLocale);\n return res;\n }\n\n return NextResponse.next();\n };\n}\n"],"mappings":";;;;;AAqCA,MAAa,mBAAiC;CAC5C,IAAI,KAAK;EACP,MAAM,OAAO,IAAI,SAAS,MAAM,IAAI;AACpC,MAAI,KAAK,SAAS,KAAK,KAAK,GAAI,QAAO,KAAK;;CAE9C,IAAI,KAAK,QAAQ;EACf,MAAM,OAAO,IAAI,IAAI,IAAI;AACzB,OAAK,WAAW,GAAG,IAAI,SAAS,GAAG,OAAO,GAAG,IAAI,WAAW,WAAW,QAAQ,IAAI;AACnF,SAAO;;CAET,OAAO,KAAK;EACV,MAAM,OAAO,IAAI,IAAI,IAAI;EACzB,MAAM,WAAW,IAAI,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI;AAC3D,OAAK,WAAW,GAAG,IAAI,SAAS,GAAG,WAAW,WAAW,QAAQ,IAAI;AACrE,SAAO;;CAEV;AAED,SAAgB,qBAAqB,EACnC,WACA,iBACA,SAAS,kBACT,aAAa,aACb,aAAa,WACkB;CAC/B,IAAI;AACJ,KAAI,OAAO,WAAW,WACpB,aAAY;EACV,GAAG;EACH,IAAI,KAAK,QAAQ;GACf,MAAM,OAAO,IAAI,IAAI,IAAI;AACzB,QAAK,WAAW,OAAO,QAAQ,IAAI,SAAS;AAC5C,UAAO;;EAEV;KAED,aAAY;AAGd,SAAQ,YAAY;EAClB,MAAM,MAAM,QAAQ;EACpB,IAAI,aAAa,UAAU,IAAI,IAAI;AACnC,MAAI,cAAc,CAAC,UAAU,SAAS,WAAW,CAAE,cAAa;AAEhE,MAAI,CAAC,YAAY;AACf,OAAI,eAAe,iBACjB,QAAO,aAAa,QAAQ,UAAU,IAAI,KAAK,gBAAgB,CAAC;GAIlE,MAAM,YAAYA,MADK,cAAc,QAAQ,CAAC,UAAU,UAAU,EACpB,WAAW,gBAAgB;AACzE,OAAI,eAAe,UAAU;IAC3B,MAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW,EAAE,SAAS;AAEzD,WAAO,aAAa,QAAQ,UAAU,IAAI,KAAK,OAAO,CAAC;;AAGzD,UAAO,aAAa,SAAS,UAAU,IAAI,KAAK,UAAU,CAAC;;AAI7D,MACE,eAAe,YACd,eAAe,oBAAoB,eAAe,iBACnD;GACA,MAAM,MAAM,aAAa,SAAS,UAAU,OAAO,IAAI,CAAC;AACxD,OAAI,QAAQ,IAAI,YAAY,WAAW;AACvC,UAAO;;AAGT,SAAO,aAAa,MAAM"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { i as Root, n as Item, r as Node, t as Folder } from "./definitions-Ca2P2viV.js";
|
|
2
|
+
|
|
3
|
+
//#region src/page-tree/utils.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Flatten tree to an array of page nodes
|
|
7
|
+
*/
|
|
8
|
+
declare function flattenTree(nodes: Node[]): Item[];
|
|
9
|
+
/**
|
|
10
|
+
* Get neighbours of a page, useful for implementing "previous & next" buttons
|
|
11
|
+
*/
|
|
12
|
+
declare function findNeighbour(tree: Root, url: string, options?: {
|
|
13
|
+
separateRoot?: boolean;
|
|
14
|
+
}): {
|
|
15
|
+
previous?: Item;
|
|
16
|
+
next?: Item;
|
|
17
|
+
};
|
|
18
|
+
declare function getPageTreeRoots(pageTree: Root | Folder): (Root | Folder)[];
|
|
19
|
+
/**
|
|
20
|
+
* Get other item nodes that lives under the same parent.
|
|
21
|
+
*/
|
|
22
|
+
declare function getPageTreePeers(treeOrTrees: Root | Record<string, Root>, url: string): Item[];
|
|
23
|
+
/**
|
|
24
|
+
* Get other tree nodes that lives under the same parent.
|
|
25
|
+
*/
|
|
26
|
+
declare function findSiblings(treeOrTrees: Root | Record<string, Root>, url: string): Node[];
|
|
27
|
+
declare function findParent(from: Root | Folder, url: string): Root | Folder | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Search the path of a node in the tree matched by the matcher.
|
|
30
|
+
*
|
|
31
|
+
* @returns The path to the target node (from starting root), or null if the page doesn't exist
|
|
32
|
+
*/
|
|
33
|
+
declare function findPath(nodes: Node[], matcher: (node: Node) => boolean, options?: {
|
|
34
|
+
includeSeparator?: boolean;
|
|
35
|
+
}): Node[] | null;
|
|
36
|
+
/**
|
|
37
|
+
* Perform a depth-first search on page tree visiting every node.
|
|
38
|
+
*
|
|
39
|
+
* @param root - the root of page tree to visit.
|
|
40
|
+
* @param visitor - function to receive nodes, return `skip` to skip the children of current node, `break` to stop the search entirely.
|
|
41
|
+
*/
|
|
42
|
+
declare function visit<Root$1 extends Node | Root>(root: Root$1, visitor: <T extends Node | Root>(node: T, parent?: Root | Folder) => 'skip' | 'break' | T | void): Root$1;
|
|
43
|
+
//#endregion
|
|
44
|
+
export { flattenTree as a, visit as c, findSiblings as i, findParent as n, getPageTreePeers as o, findPath as r, getPageTreeRoots as s, findNeighbour as t };
|
|
45
|
+
//# sourceMappingURL=index-BaMZ8PEK.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BaMZ8PEK.d.ts","names":[],"sources":["../src/page-tree/utils.ts"],"sourcesContent":[],"mappings":";;;;;;AAKA;AAkBgB,iBAlBA,WAAA,CAkBa,KAAA,EAlBM,IAkBN,EAAA,CAAA,EAlBwB,IAkBxB,EAAA;;;;AAQP,iBARN,aAAA,CAQM,IAAA,EAPd,IAOc,EAAA,GAAA,EAAA,MAAA,EAAA,OAqBV,CArBU,EAAA;EAoBN,YAAA,CAAA,EAAA,OAAgB;CACpB,CAAA,EAAA;EAAgB,QAAA,CAAA,EAtBf,IAsBe;EACxB,IAAA,CAAA,EAtBK,IAsBL;CAAgB;AAAe,iBAFnB,gBAAA,CAEmB,QAAA,EADvB,IACuB,GADP,MACO,CAAA,EAAA,CAA/B,IAA+B,GAAf,MAAe,CAAA,EAAA;AAgBnC;;;AAC+B,iBADf,gBAAA,CACe,WAAA,EAAhB,IAAgB,GAAA,MAAA,CAAA,MAAA,EAAe,IAAf,CAAA,EAAA,GAAA,EAAA,MAAA,CAAA,EAE5B,IAF4B,EAAA;;;AAS/B;AACe,iBADC,YAAA,CACD,WAAA,EAAA,IAAA,GAAgB,MAAhB,CAAA,MAAA,EAA+B,IAA/B,CAAA,EAAA,GAAA,EAAA,MAAA,CAAA,EAEZ,IAFY,EAAA;AAA+B,iBAsB9B,UAAA,CAtB8B,IAAA,EAuBtC,IAvBsC,GAuBtB,MAvBsB,EAAA,GAAA,EAAA,MAAA,CAAA,EAyB3C,IAzB2C,GAyB3B,MAzB2B,GAAA,SAAA;;;;AAsB9C;;AACwB,iBAoBR,QAAA,CApBQ,KAAA,EAqBf,IArBe,EAAA,EAAA,OAAA,EAAA,CAAA,IAAA,EAsBN,IAtBM,EAAA,GAAA,OAAA,EAAA,OAEL,CAFK,EAAA;EAErB,gBAAA,CAAA,EAAA,OAAA;CAAgB,CAAA,EAwBhB,IAxBgB,EAAA,GAAA,IAAA;;AAkBnB;;;;;AAkDgB,iBAAA,KAAK,CAAA,eAAc,IAAd,GAA8B,IAA9B,CAAA,CAAA,IAAA,EACb,MADa,EAAA,OAAA,EAAA,CAAA,UAEC,IAFD,GAEiB,IAFjB,CAAA,CAAA,IAAA,EAGX,CAHW,EAAA,MAAA,CAAA,EAIR,IAJQ,GAIQ,MAJR,EAAA,GAAA,MAAA,GAAA,OAAA,GAKK,CALL,GAAA,IAAA,CAAA,EAMlB,MANkB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { i as Root } from "./definitions-Ca2P2viV.js";
|
|
2
|
+
|
|
3
|
+
//#region src/source/client/index.d.ts
|
|
4
|
+
interface SerializedPageTree {
|
|
5
|
+
$fumadocs_loader: 'page-tree';
|
|
6
|
+
data: object;
|
|
7
|
+
}
|
|
8
|
+
declare function deserializePageTree(serialized: SerializedPageTree): Root;
|
|
9
|
+
/**
|
|
10
|
+
* Deserialize loader data that is serialized by the server-side Fumadocs `loader()`, supported:
|
|
11
|
+
* - Page Tree
|
|
12
|
+
*
|
|
13
|
+
* other unrelated properties are kept in the output.
|
|
14
|
+
*/
|
|
15
|
+
declare function useFumadocsLoader<V>(serialized: V): { [K in keyof V]: V[K] extends SerializedPageTree ? Root : V[K] };
|
|
16
|
+
//#endregion
|
|
17
|
+
export { deserializePageTree as n, useFumadocsLoader as r, SerializedPageTree as t };
|
|
18
|
+
//# sourceMappingURL=index-CmGSoB4T.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CmGSoB4T.d.ts","names":[],"sources":["../src/source/client/index.tsx"],"sourcesContent":[],"mappings":";;;UAIiB,kBAAA;;EAAA,IAAA,EAAA,MAAA;AAejB;AAoBgB,iBApBA,mBAAA,CAoBiB,UAAA,EApBe,kBAoBf,CAAA,EApBoC,IAoBpC;;;;;;;AACmC,iBADpD,iBACoD,CAAA,CAAA,CAAA,CAAA,UAAA,EADnB,CACmB,CAAA,EAAA,QAAE,MAAxD,CAAwD,GAApD,CAAoD,CAAlD,CAAkD,CAAA,SAAvC,kBAAuC,GAAlB,IAAkB,GAAF,CAAE,CAAA,CAAA,CAAA,EAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { a as Separator, i as Root, n as Item, t as Folder } from "./definitions-Ca2P2viV.js";
|
|
2
2
|
import { t as I18nConfig } from "./index-DxhhLscI.js";
|
|
3
|
+
import { t as SerializedPageTree } from "./index-CmGSoB4T.js";
|
|
3
4
|
import { ReactNode } from "react";
|
|
4
5
|
|
|
5
6
|
//#region src/source/source.d.ts
|
|
@@ -307,7 +308,7 @@ interface LoaderOutput<Config$1 extends LoaderConfig> {
|
|
|
307
308
|
/**
|
|
308
309
|
* serialize page tree for non-RSC environments
|
|
309
310
|
*/
|
|
310
|
-
serializePageTree: (tree: Root) => Promise<
|
|
311
|
+
serializePageTree: (tree: Root) => Promise<SerializedPageTree>;
|
|
311
312
|
}
|
|
312
313
|
declare function createGetUrl(baseUrl: string, i18n?: I18nConfig): ResolvedLoaderConfig['url'];
|
|
313
314
|
declare function loader<Config$1 extends SourceConfig, I18n extends I18nConfig | undefined = undefined>(source: Source<Config$1>, options: LoaderOptions<{
|
|
@@ -377,4 +378,4 @@ declare function joinPath(...paths: string[]): string;
|
|
|
377
378
|
declare function slash(path: string): string;
|
|
378
379
|
//#endregion
|
|
379
380
|
export { PageData as A, ContentStorage as C, buildContentStorage as D, ContentStoragePageFile as E, _SourceUpdate_ as F, multiple as I, source as L, SourceConfig as M, VirtualFile as N, FileSystem as O, _ConfigUnion_ as P, update as R, createPageTreeBuilder as S, ContentStorageMetaFile as T, slugsPlugin as _, LoaderOptions as a, PageTreeOptions as b, LoaderPluginOption as c, ResolvedLoaderConfig as d, createGetUrl as f, slugsFromData as g, getSlugs as h, LoaderConfig as i, Source as j, MetaData as k, Meta as l, SlugFn as m, InferMetaType as n, LoaderOutput as o, loader as p, InferPageType as r, LoaderPlugin as s, path_d_exports as t, Page as u, PageTreeBuilder as v, ContentStorageFile as w, PageTreeTransformer as x, PageTreeBuilderContext as y };
|
|
380
|
-
//# sourceMappingURL=index-
|
|
381
|
+
//# sourceMappingURL=index-aE27-b16.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-aE27-b16.d.ts","names":[],"sources":["../src/source/source.ts","../src/source/storage/file-system.ts","../src/source/storage/content.ts","../src/source/page-tree/builder.ts","../src/source/plugins/slugs.ts","../src/source/plugins/icon.ts","../src/source/loader.ts","../src/source/path.ts"],"sourcesContent":[],"mappings":";;;;;;UAAiB,wBAAsB,eAAe;SAC7C,YAAY;;UAGJ,YAAA;YACL;YACA;;AANK,UASA,QAAA,CATM;EAAgB,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAe,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EACjC,IAAA,CAAA,EAAA,OAAA,GAAA,SAAA;EAAZ,KAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;EAAW,WAAA,CAAA,EAAA,OAAA,GAAA,SAAA;EAGH,WAAA,CAAA,EAAA,OAAY,GAAA,SACjB;EAIK,WAAQ,CAAA,EAAA,MAAA,GAAA,SAAA;AAWzB;AAMY,UANK,QAAA,CAMM;EAAgB,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAAe,KAAA,CAAA,EAAA,MAAA;EACtC,WAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;AACA,KAFJ,WAEI,CAAA,iBAFuB,YAEvB,GAFsC,YAEtC,CAAA,GADZ,WACY,CADA,QACA,CAAA,UAAA,CAAA,CAAA,GAAZ,WAAY,CAAA,QAAA,CAAA,UAAA,CAAA,CAAA;UAEN,eAAA,CAFN;EAAW;AAAqB;AAEX;;;EAc4B,IAAA,EAAA,MAAA;EAAe;AAAA;;EAW5D,YAAA,CAAA,EAAA,MAAA;;UAXE,WAS0D,CAAA,aATjC,QASiC,CAAA,SATf,eASe,CAAA;EAKxD,IAAA,EAAA,MAAA;EAAuC;;;EACjC,KAAA,CAAA,EAAA,MAAA,EAAA;EAAE,IAAA,EATZ,IASY;;UANV,WAQQ,CAAA,aARiB,QAQjB,CAAA,SARmC,eAQnC,CAAA;EAA6B,IAAA,EAAA,MAAA;EAC7B,IAAA,EAPV,IAOU;;AAGV,KAPI,aAOJ,CAAA,UAP4B,MAO5B,CAAA,MAAA,EAP2C,MAO3C,CAAA,CAAA,GAAA,QAAC,MANK,CAML,GANS,CAMT,CANW,CAMX,CAAA,SANsB,MAMtB,CAAA,KAAA,OAAA,CAAA,GAAA;EAEO,QAAQ,EANN,MAMM,CAAA,UAAA,CAAA,GAAA;IAA0B,IAAA,EANH,CAMG;EAAf,CAAA;EAAiC,QAAA,EALlD,MAKkD,CAAA,UAAA,CAAA,GAAA;IAAC,IAAA,EALtB,CAKsB;EAAA,CAAA;AAAA,CAAA,GAAA,KAAA,EAAA,CAAA,MAF7D,CAE6D,CAAA;AAkBrD,iBAlBA,QAkBM,CAAA,UAlBa,MAkBb,CAAA,MAAA,EAlB4B,MAkB5B,CAAA,CAAA,CAAA,OAAA,EAlB8C,CAkB9C,CAAA,EAlB+C,MAkB/C,CAlB+C,aAkB/C,CAlB+C,CAkB/C,CAAA,CAAA;AAAc,iBAApB,MAAoB,CAAA,eAAA,QAAA,EAAA,eAAuB,QAAvB,CAAA,CAAA,MAAA,EAAA;EAAuB,KAAA,EAClD,WADkD,CACtC,MADsC,CAAA,EAAA;EACtC,KAAA,EACZ,WADY,CACA,MADA,CAAA,EAAA;CAAZ,CAAA,EAEL,MAFK,CAAA;EACY,QAAA,EAET,MAFS;EAAZ,QAAA,EAGG,MAHH;CAEG,CAAA;AACA,UAOK,cAPL,CAAA,iBAOmC,YAPnC,CAAA,CAAA;EAFR,KAAA,EAAA,CAAA,eAUmB,QAVnB,EAAA,eAU0C,QAV1C,CAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAWY,WAXZ,CAWwB,QAXxB,CAAA,EAAA,EAAA,GAAA,CAWuC,WAXvC,CAWmD,MAXnD,CAAA,GAW2D,WAX3D,CAWuE,MAXvE,CAAA,CAAA,EAAA,EAAA,GAYG,cAZH,CAAA;IAAM,QAAA,EAaI,MAbJ;IASO,QAAA,EAKH,MALiB;EAAgB,CAAA,CAAA;EACxB,IAAA,EAAA,CAAA,UAMJ,QANI,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAOR,WAPQ,CAOI,QAPJ,CAAA,UAAA,CAAA,CAAA,EAAA,GAO4B,WAP5B,CAOwC,CAPxC,CAAA,EAAA,GAQhB,cARgB,CAAA;IAAuB,QAAA,EAShC,CATgC;IAClB,QAAA,EASd,QATc,CAAA,UAAA,CAAA;EAAZ,CAAA,CAAA;EAAuC,IAAA,EAAA,CAAA,UAYpC,QAZoC,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAaxC,WAbwC,CAa5B,QAb4B,CAAA,UAAA,CAAA,CAAA,EAAA,GAaJ,WAbI,CAaQ,CAbR,CAAA,EAAA,GAchD,cAdgD,CAAA;IAAZ,QAAA,EAe7B,QAf6B,CAAA,UAAA,CAAA;IAAgC,QAAA,EAgB7D,CAhB6D;EAAZ,CAAA,CAAA;EAEjD,KAAA,EAAA,GAAA,GAgBC,MAhBD,CAgBQ,QAhBR,CAAA;;;;;AAIC,iBAkBC,MAlBD,CAAA,iBAkBuB,YAlBvB,CAAA,CAAA,MAAA,EAmBL,MAnBK,CAmBE,QAnBF,CAAA,CAAA,EAoBZ,cApBY,CAoBG,QApBH,CAAA;;;;;;cCpGF;SACN,YAAA;WACE;wBAEe,WAAW;EDTlB,IAAA,CAAA,IAAM,EAAA,MAAA,CAAA,ECuBD,IDvBC,GAAA,SAAA;EAAgB;;;EAC9B,OAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;EAAW,KAAA,CAAA,IAAA,EAAA,MAAA,EAAA,IAAA,ECiCQ,IDjCR,CAAA,EAAA,IAAA;EAGH;AAKjB;AAWA;AAMA;;;EACgB,MAAA,CAAA,IAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,CAAA,EAAA,OAAA;EAAZ,QAAA,CAAA,CAAA,EAAA,MAAA,EAAA;EACY,OAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;;;KEvBJ,gCAA8B,eAAe,gBAAgB,WACvE,mBAAmB;KAGT,oCAAkC,eAAe,gBACzD,uBAAuB,YACvB,uBAAuB;UAEV,wCAAsC,eAAe;;EFbrD,YAAM,CAAA,EAAA,MAAA;EAAgB,MAAA,EAAA,MAAA;EAAe,IAAA,EEkB9C,QFlB8C,CAAA,UAAA,CAAA;;AAC7C,UEoBQ,sBFpBR,CAAA,iBEoB8C,YFpB9C,GEoB6D,YFpB7D,CAAA,CAAA;EAAW,IAAA,EAAA,MAAA;EAGH,YAAA,CAAA,EAAY,MAAA;EAKZ,MAAA,EAAA,MAAQ;EAWR,KAAA,EAAA,MAAQ,EAAA;EAMb,IAAA,EECJ,QFDI,CAAA,UAAW,CAAA;;;;;;;;AAIb,iBEkCM,mBAAA,CFlCS,YAAA,EEmCT,oBFnCS,EAAA,eAAA,EAAA,MAAA,CAAA,EEqCtB,MFrCsB,CAAA,MAAA,EEqCP,cFrCO,CAAA;;;UGvBR,wCAAsC,eAAe;;;EHPrD,OAAA,EGUN,eHVY;EAAgB,YAAA,EGWvB,mBHXuB,CGWH,QHXG,CAAA,EAAA;EAAe,OAAA,EGa3C,eHb2C;EACjC,OAAA,EGaV,cHbU,CGaK,QHbL,CAAA;EAAZ,MAAA,EGcC,oBHdD,CAAA,KAAA,CAAA;EAAW,QAAA,CAAA,EGgBP,MHhBO,CAAA,MAAA,EGgBQ,cHhBR,CGgBuB,QHhBvB,CAAA,CAAA;EAGH,MAAA,CAAA,EAAA,MAAY;AAK7B;AAWiB,UGCA,mBHDQ,CAAA,iBGC2B,YHD3B,GGC0C,YHD1C,CAAA,CAAA;EAMb,IAAA,CAAA,EAAA,CAAA,IAAA,EGHF,sBHGa,CGHU,QHGV,CAAA,EAAA,IAAA,EGFb,IHEa,EAAA,QAAA,CAAA,EAAA,MAAA,EAAA,GGAhB,IHAgB;EAAgB,MAAA,CAAA,EAAA,CAAA,IAAA,EGE7B,sBHF6B,CGEN,QHFM,CAAA,EAAA,IAAA,EGG7B,MHH6B,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,MAAA,EAAA,GGMhC,MHNgC;EAAe,SAAA,CAAA,EAAA,CAAA,IAAA,EGQ5C,sBHR4C,CGQrB,QHRqB,CAAA,EAAA,IAAA,EGS5C,SHT4C,EAAA,GGU/C,SHV+C;EACtC,IAAA,CAAA,EAAA,CAAA,IAAA,EGUA,sBHVA,CGUuB,QHVvB,CAAA,EAAA,IAAA,EGUsC,IHVtC,EAAA,GGUwD,IHVxD;;AACA,UGYC,eHZD,CAAA,iBGYgC,YHZhC,GGY+C,YHZ/C,CAAA,CAAA;EAAZ,EAAA,CAAA,EAAA,MAAA;EAAW;AAAqB;AAEX;;;EAc4B,KAAA,CAAA,EAAA,OAAA;EAAe;AAAA;;;;EASA,gBAAA,CAAA,EAAA,OAAA;EAKxD;;;EACE,YAAA,CAAA,EGDG,mBHCH,CGDuB,QHCvB,CAAA,QAAA,CAAA,CAAA,EAAA;;AAAM,UGEH,eAAA,CHFG;EAAW,KAAA,EAAA,CAAA,OAAA,EGGZ,cHHY,EAAA,OAAA,CAAA,EGGc,eHHd,EAAA,GGGkC,IHHlC;EAEb,SAAA,EAAA,CAAA,QAAA,EGIJ,MHJI,CAAA,MAAA,EGIW,cHJX,CAAA,EAAA,OAAA,CAAA,EGKJ,eHLI,EAAA,GGMX,MHNW,CAAA,MAAA,EGMI,IHNJ,CAAA;;AACA,iBGgBF,qBAAA,CHhBE,YAAA,EGgBkC,oBHhBlC,CAAA,EGgByD,eHhBzD;;;;;;KIvDN,wBAAsB,eAAe,uBACzC,uBAAuB;;AJR/B;;AAAsD,iBIctC,WJdsC,CAAA,iBIcX,YJdW,GIcI,YJdJ,CAAA,CAAA,MAAA,CAAA,EIe3C,MJf2C,CIepC,QJfoC,CAAA,CAAA,EIgBnD,YJhBmD,CIgBtC,QJhBsC,CAAA;;;;AAItD;AAKA;AAWiB,iBIwCD,aJxCS,CAAA,iBIwCoB,YJxCpB,GIwCmC,YJxCnC,CAAA,CAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EI0CtB,MJ1CsB,CI0Cf,QJ1Ce,CAAA;AAMzB;;;AACgB,iBIkDA,QAAA,CJlDA,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA;;;KKvBJ,YAAA,iCAA6C;;;ALJH,UMcrC,YAAA,CNdqC;EACjC,MAAA,EMcX,YNdW;EAAZ,IAAA,EMeD,UNfC,GAAA,SAAA;;AAGQ,UMeA,aNfY,CAAA,UMeY,YNbrB,GMaoC,YNbpC,CAAA,CAAA;EAGH,OAAA,EAAA,MAAQ;EAWR,IAAA,CAAA,EMCR,CNDQ,CAAA,MAAQ,CAAA;EAMb,GAAA,CAAA,EAAA,CAAA,KAAA,EAAW,MAAA,EAAA,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA;EAAgB;;;EACnC,QAAA,CAAA,EMAS,eNAT,CMAyB,CNAzB,CAAA;EACY,OAAA,CAAA,EMEV,kBNFU,EAAA,GAAA,CAAA,CAAA,OAAA,EAAA;IAAZ,WAAA,EAAA,CAAA,MAAA,EMI0B,YNJ1B,CMIuC,CNJvC,CAAA,EAAA,GMI8C,YNJ9C;EAAW,CAAA,EAAA,GMKH,kBNLG,EAAA,CAAA;EAEL,IAAA,CAAA,EMID,YNJgB;EAcf,KAAA,CAAA,EMTA,MNSW,CMTJ,CNSI,CAAA;;AAMb,UMZS,oBAAA,CNYT;EAN6C,MAAA,EML3C,MNK2C;EAAe,GAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA;EAS1D,OAAA,CAAA,EMXE,YNWS,EAAA;EAAc,QAAA,CAAA,EMVtB,eNUsB;EAE3B,IAAA,CAAA,EMXC,UNWD,GAAA,SAAA;;UMRE,cAAA,CNM0D;EAKxD;;;;;EACQ,IAAA,EAAA,MAAA;EAAW;;;EAGb,YAAA,CAAA,EAAA,MAAA;;AAGV,UMJS,INIT,CAAA,OMJqB,QNIrB,CAAA,SMJuC,cNIvC,CAAA;EAAC,KAAA,EAAA,MAAA,EAAA;EAEO,GAAA,EAAA,MAAQ;EAA0B,IAAA,EMH1C,ING0C;EAAf,MAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;AAAkC,UMEpD,INFoD,CAAA,OMExC,QNFwC,CAAA,SMEtB,cNFsB,CAAA;EAAA,IAAA,EMG7D,INH6D;;AAAA,UMMpD,YNNoD,CAAA,iBMMxB,YNNwB,CAAA,CAAA;EAkBrD,QAAA,EMXJ,QNWU,CAAA,MAAA,CAAA,SMXa,UNWb,GMX0B,MNW1B,CAAA,MAAA,EMXyC,INWzC,CAAA,GMX0D,INW1D;EAAc,WAAA,EAAA,CAAA,MAAA,CAAA,EAAA,MAAA,EAAA,GMTA,INSA;EAAuB;;;;;;EAK/C,aAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAQkC,CARlC,EAAA;IAFR,QAAA,CAAA,EAAA,MAAA;IAAM;AASV;;IACuB,GAAA,CAAA,EAAA,MAAA;EAAuB,CAAA,EAAA,GAAA;IAClB,IAAA,EMJd,INIc,CMJT,QNIS,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA;IAAZ,IAAA,CAAA,EAAA,MAAA;EAAuC,CAAA,GAAA,SAAA;EAAZ;;;;;EACpC,WAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EMI+B,INJ/B,CMIoC,QNJpC,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,EAAA,GAAA,MAAA;EAIY;;;EAC4C,KAAA,CAAA,EMIrD,UNJqD;EAAZ;;;;;EAOxB,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,MAAA,EAAA,GMIQ,INJR,CMIa,QNJb,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,EAAA;EAAZ;;;EAED,YAAA,EAAA,GAAA,GAAA;IACA,QAAA,EAAA,MAAA;IAFP,KAAA,EMUI,INVJ,CMUS,QNVT,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,EAAA;EAIe,CAAA,EAAA;EAAP;;AAMf;;;EACU,OAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,SAAA,EAAA,QAAA,CAAA,EAAA,MAAA,EAAA,GMUH,INVG,CMUE,QNVF,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,GAAA,SAAA;EACQ,WAAA,EAAA,CAAA,IAAA,EMYR,INZQ,EAAA,QAAA,CAAA,EAAA,MAAA,EAAA,GMcX,INdW,CMcN,QNdM,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,GAAA,SAAA;EAAf,WAAA,EAAA,CAAA,IAAA,EMiBO,MNjBP,EAAA,QAAA,CAAA,EAAA,MAAA,EAAA,GMmBI,INnBJ,CMmBS,QNnBT,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,GAAA,SAAA;EAAc;;;;ACxHjB;;EACO,cAAA,EAAA,CAAA,cAAA,MAAA,GAAA,MAAA,EAAA,cAAA,MAAA,GAAA,MAAA,CAAA,CAAA,IAAA,CAAA,EKmJI,KLnJJ,EAAA,IAAA,CAAA,EKoJI,KLpJJ,EAAA,GAAA,CKqJC,MLrJD,CKqJQ,KLrJR,EAAA,MAAA,EAAA,CAAA,GKqJ2B,MLrJ3B,CKqJkC,KLrJlC,EAAA,MAAA,CAAA,CAAA,EAAA;EACE;;;EAgBa,iBAAA,EAAA,CAAA,IAAA,EKyIM,ILzIN,EAAA,GKyIwB,OLzIxB,CKyIgC,kBLzIhC,CAAA;;AAWU,iBKyKhB,YAAA,CLzKgB,OAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EKyKqB,ULzKrB,CAAA,EKyKkC,oBLzKlC,CAAA,KAAA,CAAA;iBK6LhB,wBACC,2BACF,4CAEL,OAAO,oBACN;UACC,QAAQ;QACV;AJjOV,CAAA,CAAA,CAAA,EImOG,YJnOS,CAAA;EAA8B,MAAA,EIoOhC,QJpOgC;EAAe,IAAA,EIqOjD,IJrOiD;CACpC,CAAA;AAAnB,iBIuOc,MJvOd,CAAA,iBIwOe,YJxOf,EAAA,aIyOa,UJzOb,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA,OAAA,EI2OS,aJ3OT,CAAA;EADuE,MAAA,EI6O7D,OJ7O6D,CI6OrD,QJ7OqD,CAAA;EAAU,IAAA,EI8OzE,IJ9OyE;AAInF,CAAA,CAAA,GAAY;EAAkC,MAAA,EI4OlC,MJ5OkC,CI4O3B,QJ5O2B,CAAA;CAAe,CAAA,EI8O1D,YJ9O0D,CAAA;EAClC,MAAA,EI8OjB,QJ9OiB;EAAvB,IAAA,EI+OI,IJ/OJ;CACuB,CAAA;AAAvB,UI+aa,YJ/ab,CAAA,iBI+ayC,YJ/azC,GI+awD,YJ/axD,CAAA,CAAA;EAAsB,IAAA,CAAA,EAAA,MAAA;EAET;;;;;EAQA,OAAA,CAAA,EAAA,KAAA,GAAA,MAAA;EAAsC;;;EAMzC,MAAA,CAAA,EAAA,CAAA,MAAA,EI4aM,oBJ5aN,EAAA,GI4a+B,oBJ5a/B,GAAA,IAAA,GAAA,SAAA;EAqCE;;;EAGb,gBAAA,CAAA,EAAA,CAAA,OAAA,EAAA;IAAM,OAAA,EIyYiC,cJzYjC,CIyYgD,QJzYhD,CAAA,QAAA,CAAA,CAAA;;;;AC5DT;EAAuD,iBAAA,CAAA,EG0cjC,mBH1ciC,CG0cb,QH1ca,CAAA,QAAA,CAAA,CAAA;;AAG5C,KG0cC,kBH1cD,CAAA,iBG0cmC,YH1cnC,GG0ckD,YH1clD,CAAA,GG2cP,YH3cO,CG2cM,QH3cN,CAAA,GG4cP,kBH5cO,CG4cY,QH5cZ,CAAA,EAAA,GAAA,SAAA;AACyB,KGoexB,aHpewB,CAAA,cGoeI,YHpeJ,CAAA,GAAA,CAAA,CAAA,GGqelC,KHrekC,SGqepB,YHreoB,CAAA,KAAA,OAAA,CAAA,GGqeS,IHreT,CGqec,MHred,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,GAAA,KAAA;AAApB,KGweJ,aHxeI,CAAA,cGwewB,YHxexB,CAAA,GAAA,CAAA,CAAA,GGyed,KHzec,SGyeA,YHzeA,CAAA,KAAA,OAAA,CAAA,GGye6B,IHze7B,CGyekC,MHzelC,CAAA,QAAA,CAAA,CAAA,UAAA,CAAA,CAAA,GAAA,KAAA;AAAA;;;iBIXA,QAAA;iBAMA,OAAA;iBAUA,OAAA;;;;iBAMA,SAAA;APtBhB;;;;;;AAIA;AAKA;AAWA;AAMA;;AAAsD,iBOWtC,QAAA,CPXsC,GAAA,KAAA,EAAA,MAAA,EAAA,CAAA,EAAA,MAAA;AACtC,iBO6BA,KAAA,CP7BA,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeblock-utils.js","names":[
|
|
1
|
+
{"version":3,"file":"codeblock-utils.js","names":[],"sources":["../../src/mdx-plugins/codeblock-utils.ts"],"sourcesContent":["import type { MdxJsxAttribute, MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport type { BlockContent, Text } from 'mdast';\n\nexport interface CodeBlockTabsOptions {\n attributes?: MdxJsxAttribute[];\n defaultValue?: string;\n persist?:\n | {\n id: string;\n }\n | false;\n triggers: {\n value: string;\n children: (BlockContent | Text)[];\n }[];\n tabs: {\n value: string;\n children: BlockContent[];\n }[];\n}\n\nexport function generateCodeBlockTabs({\n persist = false,\n defaultValue,\n triggers,\n tabs,\n ...options\n}: CodeBlockTabsOptions): MdxJsxFlowElement {\n const attributes: MdxJsxAttribute[] = [];\n if (options.attributes) attributes.push(...options.attributes);\n\n if (defaultValue) {\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'defaultValue',\n value: defaultValue,\n });\n }\n\n if (typeof persist === 'object') {\n attributes.push(\n {\n type: 'mdxJsxAttribute',\n name: 'groupId',\n value: persist.id,\n },\n {\n type: 'mdxJsxAttribute',\n name: 'persist',\n value: null,\n },\n );\n }\n\n const children: MdxJsxFlowElement[] = [\n {\n type: 'mdxJsxFlowElement',\n name: 'CodeBlockTabsList',\n attributes: [],\n children: triggers.map(\n (trigger) =>\n ({\n type: 'mdxJsxFlowElement',\n attributes: [{ type: 'mdxJsxAttribute', name: 'value', value: trigger.value }],\n name: 'CodeBlockTabsTrigger',\n children: trigger.children,\n }) as MdxJsxFlowElement,\n ),\n },\n ];\n\n for (const tab of tabs) {\n children.push({\n type: 'mdxJsxFlowElement',\n name: 'CodeBlockTab',\n attributes: [{ type: 'mdxJsxAttribute', name: 'value', value: tab.value }],\n children: tab.children,\n });\n }\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'CodeBlockTabs',\n attributes,\n children,\n };\n}\n\nexport interface CodeBlockAttributes<Name extends string = string> {\n attributes: Partial<Record<Name, string | null>>;\n rest: string;\n}\n\n/**\n * Parse Fumadocs-style code block attributes from meta string, like `title=\"hello world\"`\n */\nexport function parseCodeBlockAttributes<Name extends string = string>(\n meta: string,\n allowedNames?: Name[],\n): CodeBlockAttributes<Name> {\n let str = meta;\n const StringRegex = /(?<=^|\\s)(?<name>\\w+)(?:=(?:\"([^\"]*)\"|'([^']*)'))?/g;\n const attributes: CodeBlockAttributes['attributes'] = {};\n\n str = str.replaceAll(StringRegex, (match, name, value_1, value_2) => {\n if (allowedNames && !allowedNames.includes(name)) return match;\n\n attributes[name] = value_1 ?? value_2 ?? null;\n return '';\n });\n\n return {\n rest: str,\n attributes,\n };\n}\n"],"mappings":";AAqBA,SAAgB,sBAAsB,EACpC,UAAU,OACV,cACA,UACA,MACA,GAAG,WACuC;CAC1C,MAAM,aAAgC,EAAE;AACxC,KAAI,QAAQ,WAAY,YAAW,KAAK,GAAG,QAAQ,WAAW;AAE9D,KAAI,aACF,YAAW,KAAK;EACd,MAAM;EACN,MAAM;EACN,OAAO;EACR,CAAC;AAGJ,KAAI,OAAO,YAAY,SACrB,YAAW,KACT;EACE,MAAM;EACN,MAAM;EACN,OAAO,QAAQ;EAChB,EACD;EACE,MAAM;EACN,MAAM;EACN,OAAO;EACR,CACF;CAGH,MAAM,WAAgC,CACpC;EACE,MAAM;EACN,MAAM;EACN,YAAY,EAAE;EACd,UAAU,SAAS,KAChB,aACE;GACC,MAAM;GACN,YAAY,CAAC;IAAE,MAAM;IAAmB,MAAM;IAAS,OAAO,QAAQ;IAAO,CAAC;GAC9E,MAAM;GACN,UAAU,QAAQ;GACnB,EACJ;EACF,CACF;AAED,MAAK,MAAM,OAAO,KAChB,UAAS,KAAK;EACZ,MAAM;EACN,MAAM;EACN,YAAY,CAAC;GAAE,MAAM;GAAmB,MAAM;GAAS,OAAO,IAAI;GAAO,CAAC;EAC1E,UAAU,IAAI;EACf,CAAC;AAGJ,QAAO;EACL,MAAM;EACN,MAAM;EACN;EACA;EACD;;;;;AAWH,SAAgB,yBACd,MACA,cAC2B;CAC3B,IAAI,MAAM;CACV,MAAM,cAAc;CACpB,MAAM,aAAgD,EAAE;AAExD,OAAM,IAAI,WAAW,cAAc,OAAO,MAAM,SAAS,YAAY;AACnE,MAAI,gBAAgB,CAAC,aAAa,SAAS,KAAK,CAAE,QAAO;AAEzD,aAAW,QAAQ,WAAW,WAAW;AACzC,SAAO;GACP;AAEF,QAAO;EACL,MAAM;EACN;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-code-tab.js","names":["children: MdxJsxFlowElement[]","children","localTabs: TabType"],"sources":["../../src/mdx-plugins/remark-code-tab.ts"],"sourcesContent":["import type { Processor, Transformer } from 'unified';\nimport type { BlockContent, Code, DefinitionContent, Root } from 'mdast';\nimport { visit } from 'unist-util-visit';\nimport type { MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport { generateCodeBlockTabs, parseCodeBlockAttributes } from '@/mdx-plugins/codeblock-utils';\n\ntype TabType = keyof typeof Types;\nexport interface RemarkCodeTabOptions {\n Tabs?: TabType;\n\n /**\n * Parse MDX in tab values\n *\n * @defaultValue false\n */\n parseMdx?: boolean;\n}\n\ndeclare module 'mdast' {\n export interface CodeData {\n tab?: string;\n }\n}\n\nconst Tabs = {\n convert(\n processor: Processor,\n nodes: Code[],\n withMdx = false,\n withParent = true,\n ): MdxJsxFlowElement {\n const tabs = Array.from(processTabValue(nodes).entries());\n\n if (!withMdx) {\n const children: MdxJsxFlowElement[] = tabs.map(([name, codes]) => {\n return {\n type: 'mdxJsxFlowElement',\n name: 'Tab',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'value',\n value: name,\n },\n ],\n children: codes,\n };\n });\n\n if (!withParent) return createFragment(children);\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'Tabs',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'items',\n value: {\n type: 'mdxJsxAttributeValueExpression',\n value: tabs.map(([name]) => name).join(', '),\n data: {\n estree: {\n type: 'Program',\n sourceType: 'module',\n comments: [],\n body: [\n {\n type: 'ExpressionStatement',\n expression: {\n type: 'ArrayExpression',\n elements: tabs.map(([name]) => ({\n type: 'Literal',\n value: name,\n })),\n },\n },\n ],\n },\n },\n },\n },\n ],\n children,\n };\n }\n\n const children: MdxJsxFlowElement[] = [\n {\n type: 'mdxJsxFlowElement',\n name: 'TabsList',\n attributes: [],\n children: tabs.map(([name]) => ({\n type: 'mdxJsxFlowElement',\n name: 'TabsTrigger',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'value',\n value: name,\n },\n ],\n children: [mdxToAst(processor, name) as unknown as BlockContent],\n })),\n },\n ...tabs.map(\n ([name, codes]) =>\n ({\n type: 'mdxJsxFlowElement',\n name: 'TabsContent',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'value',\n value: name,\n },\n ],\n children: codes,\n }) as MdxJsxFlowElement,\n ),\n ];\n\n if (!withParent) return createFragment(children);\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'Tabs',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'defaultValue',\n value: tabs[0][0],\n },\n ],\n children,\n };\n },\n};\n\nconst CodeBlockTabs = {\n convert(\n processor: Processor,\n nodes: Code[],\n withMdx = false,\n withParent = true,\n ): MdxJsxFlowElement {\n const tabs = Array.from(processTabValue(nodes).entries());\n\n const node = generateCodeBlockTabs({\n defaultValue: tabs[0][0],\n triggers: tabs.map(([name]) => ({\n value: name,\n children: [\n withMdx\n ? (mdxToAst(processor, name) as unknown as BlockContent)\n : {\n type: 'text',\n value: name,\n },\n ],\n })),\n tabs: tabs.map(([name, codes]) => ({\n value: name,\n children: codes,\n })),\n });\n\n if (!withParent) return createFragment(node.children);\n return node;\n },\n};\n\nconst Types = {\n CodeBlockTabs,\n Tabs,\n};\n\nexport function remarkCodeTab(\n this: Processor,\n options: RemarkCodeTabOptions = {},\n): Transformer<Root, Root> {\n const { parseMdx = false, Tabs = 'CodeBlockTabs' } = options;\n\n return (tree) => {\n const ignored = new WeakSet();\n\n visit(tree, (node) => {\n if (!('children' in node) || ignored.has(node)) return 'skip';\n let localTabs: TabType = Tabs;\n let localParseMdx = parseMdx;\n let withParent = true;\n\n if (node.type === 'mdxJsxFlowElement' && node.name && node.name in Types) {\n withParent = false;\n localTabs = node.name as TabType;\n\n // for `Tabs` in simple mode, it doesn't support MDX tab names\n if (node.name === 'Tabs' && localParseMdx) {\n localParseMdx = node.attributes.every(\n (attribute) => attribute.type !== 'mdxJsxAttribute' || attribute.name !== 'items',\n );\n }\n }\n\n let start = -1;\n let end = 0;\n const close = () => {\n if (start === -1 || start === end) return;\n const replacement = Types[localTabs].convert(\n this,\n node.children.slice(start, end) as Code[],\n localParseMdx,\n withParent,\n );\n\n ignored.add(replacement);\n node.children.splice(start, end - start, replacement);\n end = start;\n start = -1;\n };\n\n for (; end < node.children.length; end++) {\n const child = node.children[end];\n if (child.type !== 'code' || !child.meta) {\n close();\n continue;\n }\n\n const meta = parseCodeBlockAttributes(child.meta, ['tab']);\n if (!meta.attributes.tab) {\n close();\n continue;\n }\n\n if (start === -1) start = end;\n child.meta = meta.rest;\n child.data ??= {};\n child.data.tab = meta.attributes.tab;\n }\n\n close();\n });\n };\n}\n\nfunction processTabValue(nodes: Code[]) {\n const out = new Map<string, Code[]>();\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const name = node.data?.tab ?? `Tab ${i + 1}`;\n const li = out.get(name) ?? [];\n li.push(node);\n out.set(name, li);\n }\n return out;\n}\n\n/**\n * MDX tab name to tab trigger node children\n */\nfunction mdxToAst(processor: Processor, name: string) {\n const node = processor.parse(name) as Root;\n\n if (node.type === 'root') {\n node.children = node.children.flatMap((child) => {\n if (child.type === 'paragraph') return child.children;\n\n return child;\n });\n }\n\n return node;\n}\n\nfunction createFragment(children: (BlockContent | DefinitionContent)[]): MdxJsxFlowElement {\n return {\n type: 'mdxJsxFlowElement',\n name: null,\n attributes: [],\n children,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remark-code-tab.js","names":["children"],"sources":["../../src/mdx-plugins/remark-code-tab.ts"],"sourcesContent":["import type { Processor, Transformer } from 'unified';\nimport type { BlockContent, Code, DefinitionContent, Root } from 'mdast';\nimport { visit } from 'unist-util-visit';\nimport type { MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport { generateCodeBlockTabs, parseCodeBlockAttributes } from '@/mdx-plugins/codeblock-utils';\n\ntype TabType = keyof typeof Types;\nexport interface RemarkCodeTabOptions {\n Tabs?: TabType;\n\n /**\n * Parse MDX in tab values\n *\n * @defaultValue false\n */\n parseMdx?: boolean;\n}\n\ndeclare module 'mdast' {\n export interface CodeData {\n tab?: string;\n }\n}\n\nconst Tabs = {\n convert(\n processor: Processor,\n nodes: Code[],\n withMdx = false,\n withParent = true,\n ): MdxJsxFlowElement {\n const tabs = Array.from(processTabValue(nodes).entries());\n\n if (!withMdx) {\n const children: MdxJsxFlowElement[] = tabs.map(([name, codes]) => {\n return {\n type: 'mdxJsxFlowElement',\n name: 'Tab',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'value',\n value: name,\n },\n ],\n children: codes,\n };\n });\n\n if (!withParent) return createFragment(children);\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'Tabs',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'items',\n value: {\n type: 'mdxJsxAttributeValueExpression',\n value: tabs.map(([name]) => name).join(', '),\n data: {\n estree: {\n type: 'Program',\n sourceType: 'module',\n comments: [],\n body: [\n {\n type: 'ExpressionStatement',\n expression: {\n type: 'ArrayExpression',\n elements: tabs.map(([name]) => ({\n type: 'Literal',\n value: name,\n })),\n },\n },\n ],\n },\n },\n },\n },\n ],\n children,\n };\n }\n\n const children: MdxJsxFlowElement[] = [\n {\n type: 'mdxJsxFlowElement',\n name: 'TabsList',\n attributes: [],\n children: tabs.map(([name]) => ({\n type: 'mdxJsxFlowElement',\n name: 'TabsTrigger',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'value',\n value: name,\n },\n ],\n children: [mdxToAst(processor, name) as unknown as BlockContent],\n })),\n },\n ...tabs.map(\n ([name, codes]) =>\n ({\n type: 'mdxJsxFlowElement',\n name: 'TabsContent',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'value',\n value: name,\n },\n ],\n children: codes,\n }) as MdxJsxFlowElement,\n ),\n ];\n\n if (!withParent) return createFragment(children);\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'Tabs',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'defaultValue',\n value: tabs[0][0],\n },\n ],\n children,\n };\n },\n};\n\nconst CodeBlockTabs = {\n convert(\n processor: Processor,\n nodes: Code[],\n withMdx = false,\n withParent = true,\n ): MdxJsxFlowElement {\n const tabs = Array.from(processTabValue(nodes).entries());\n\n const node = generateCodeBlockTabs({\n defaultValue: tabs[0][0],\n triggers: tabs.map(([name]) => ({\n value: name,\n children: [\n withMdx\n ? (mdxToAst(processor, name) as unknown as BlockContent)\n : {\n type: 'text',\n value: name,\n },\n ],\n })),\n tabs: tabs.map(([name, codes]) => ({\n value: name,\n children: codes,\n })),\n });\n\n if (!withParent) return createFragment(node.children);\n return node;\n },\n};\n\nconst Types = {\n CodeBlockTabs,\n Tabs,\n};\n\nexport function remarkCodeTab(\n this: Processor,\n options: RemarkCodeTabOptions = {},\n): Transformer<Root, Root> {\n const { parseMdx = false, Tabs = 'CodeBlockTabs' } = options;\n\n return (tree) => {\n const ignored = new WeakSet();\n\n visit(tree, (node) => {\n if (!('children' in node) || ignored.has(node)) return 'skip';\n let localTabs: TabType = Tabs;\n let localParseMdx = parseMdx;\n let withParent = true;\n\n if (node.type === 'mdxJsxFlowElement' && node.name && node.name in Types) {\n withParent = false;\n localTabs = node.name as TabType;\n\n // for `Tabs` in simple mode, it doesn't support MDX tab names\n if (node.name === 'Tabs' && localParseMdx) {\n localParseMdx = node.attributes.every(\n (attribute) => attribute.type !== 'mdxJsxAttribute' || attribute.name !== 'items',\n );\n }\n }\n\n let start = -1;\n let end = 0;\n const close = () => {\n if (start === -1 || start === end) return;\n const replacement = Types[localTabs].convert(\n this,\n node.children.slice(start, end) as Code[],\n localParseMdx,\n withParent,\n );\n\n ignored.add(replacement);\n node.children.splice(start, end - start, replacement);\n end = start;\n start = -1;\n };\n\n for (; end < node.children.length; end++) {\n const child = node.children[end];\n if (child.type !== 'code' || !child.meta) {\n close();\n continue;\n }\n\n const meta = parseCodeBlockAttributes(child.meta, ['tab']);\n if (!meta.attributes.tab) {\n close();\n continue;\n }\n\n if (start === -1) start = end;\n child.meta = meta.rest;\n child.data ??= {};\n child.data.tab = meta.attributes.tab;\n }\n\n close();\n });\n };\n}\n\nfunction processTabValue(nodes: Code[]) {\n const out = new Map<string, Code[]>();\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const name = node.data?.tab ?? `Tab ${i + 1}`;\n const li = out.get(name) ?? [];\n li.push(node);\n out.set(name, li);\n }\n return out;\n}\n\n/**\n * MDX tab name to tab trigger node children\n */\nfunction mdxToAst(processor: Processor, name: string) {\n const node = processor.parse(name) as Root;\n\n if (node.type === 'root') {\n node.children = node.children.flatMap((child) => {\n if (child.type === 'paragraph') return child.children;\n\n return child;\n });\n }\n\n return node;\n}\n\nfunction createFragment(children: (BlockContent | DefinitionContent)[]): MdxJsxFlowElement {\n return {\n type: 'mdxJsxFlowElement',\n name: null,\n attributes: [],\n children,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-directive-admonition.js","names":[
|
|
1
|
+
{"version":3,"file":"remark-directive-admonition.js","names":[],"sources":["../../src/mdx-plugins/remark-directive-admonition.ts"],"sourcesContent":["import type { BlockContent, DefinitionContent, PhrasingContent, Root } from 'mdast';\nimport type { MdxJsxAttribute, MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport { Transformer } from 'unified';\nimport { visit } from 'unist-util-visit';\n\nexport interface RemarkDirectiveAdmonitionOptions {\n /**\n * the tag names of Callout component.\n */\n tags?: {\n CalloutContainer?: string;\n CalloutTitle?: string;\n CalloutDescription?: string;\n };\n\n /**\n * All supported admonition types and their linked Callout type.\n *\n * When specified, all defaults will be cleared.\n */\n types?: Record<string, string>;\n}\n\n/**\n * Remark Plugin to support Admonition syntax in Docusaurus, useful for migrating from Docusaurus.\n *\n * Requires [`remark-directive`](https://github.com/remarkjs/remark-directive) to be configured.\n */\nexport function remarkDirectiveAdmonition({\n tags: {\n CalloutContainer = 'CalloutContainer',\n CalloutTitle = 'CalloutTitle',\n CalloutDescription = 'CalloutDescription',\n } = {},\n types = {\n note: 'info',\n tip: 'info',\n info: 'info',\n warn: 'warning',\n warning: 'warning',\n danger: 'error',\n success: 'success',\n },\n}: RemarkDirectiveAdmonitionOptions = {}): Transformer<Root, Root> {\n return (tree) => {\n visit(tree, 'containerDirective', (node) => {\n if (!(node.name in types)) return;\n\n const attributes: MdxJsxAttribute[] = [\n {\n type: 'mdxJsxAttribute',\n name: 'type',\n value: types[node.name],\n },\n ];\n\n for (const [k, v] of Object.entries(node.attributes ?? {})) {\n attributes.push({\n type: 'mdxJsxAttribute',\n name: k,\n value: v,\n });\n }\n\n const titleNodes: PhrasingContent[] = [];\n const descriptionNodes: (BlockContent | DefinitionContent)[] = [];\n\n for (const item of node.children) {\n if (item.type === 'paragraph' && item.data?.directiveLabel) {\n titleNodes.push(...item.children);\n } else {\n descriptionNodes.push(item);\n }\n }\n\n const children: MdxJsxFlowElement[] = [];\n\n if (titleNodes.length > 0) {\n children.push({\n type: 'mdxJsxFlowElement',\n name: CalloutTitle,\n attributes: [],\n children: titleNodes as BlockContent[],\n });\n }\n\n if (descriptionNodes.length > 0) {\n children.push({\n type: 'mdxJsxFlowElement',\n name: CalloutDescription,\n attributes: [],\n children: descriptionNodes,\n });\n }\n\n Object.assign(node, {\n type: 'mdxJsxFlowElement',\n attributes,\n name: CalloutContainer,\n children,\n } satisfies MdxJsxFlowElement);\n });\n };\n}\n"],"mappings":";;;;;;;;AA4BA,SAAgB,0BAA0B,EACxC,MAAM,EACJ,mBAAmB,oBACnB,eAAe,gBACf,qBAAqB,yBACnB,EAAE,EACN,QAAQ;CACN,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;CACR,SAAS;CACV,KACmC,EAAE,EAA2B;AACjE,SAAQ,SAAS;AACf,QAAM,MAAM,uBAAuB,SAAS;AAC1C,OAAI,EAAE,KAAK,QAAQ,OAAQ;GAE3B,MAAM,aAAgC,CACpC;IACE,MAAM;IACN,MAAM;IACN,OAAO,MAAM,KAAK;IACnB,CACF;AAED,QAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,cAAc,EAAE,CAAC,CACxD,YAAW,KAAK;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACR,CAAC;GAGJ,MAAM,aAAgC,EAAE;GACxC,MAAM,mBAAyD,EAAE;AAEjE,QAAK,MAAM,QAAQ,KAAK,SACtB,KAAI,KAAK,SAAS,eAAe,KAAK,MAAM,eAC1C,YAAW,KAAK,GAAG,KAAK,SAAS;OAEjC,kBAAiB,KAAK,KAAK;GAI/B,MAAM,WAAgC,EAAE;AAExC,OAAI,WAAW,SAAS,EACtB,UAAS,KAAK;IACZ,MAAM;IACN,MAAM;IACN,YAAY,EAAE;IACd,UAAU;IACX,CAAC;AAGJ,OAAI,iBAAiB,SAAS,EAC5B,UAAS,KAAK;IACZ,MAAM;IACN,MAAM;IACN,YAAY,EAAE;IACd,UAAU;IACX,CAAC;AAGJ,UAAO,OAAO,MAAM;IAClB,MAAM;IACN;IACA,MAAM;IACN;IACD,CAA6B;IAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-feedback-block.js","names":[
|
|
1
|
+
{"version":3,"file":"remark-feedback-block.js","names":[],"sources":["../../src/mdx-plugins/remark-feedback-block.ts"],"sourcesContent":["import type { Transformer } from 'unified';\nimport type { BlockContent, Root, RootContent } from 'mdast';\nimport type { MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport { visit } from 'unist-util-visit';\nimport { createHash } from 'node:crypto';\nimport { flattenNode } from './mdast-utils';\n\nexport interface RemarkFeedbackBlockOptions {\n /**\n * generate block ID, default to using MD5.\n */\n generateHash?: (ctx: { body: string }) => string;\n\n /**\n * @defaultValue FeedbackBlock\n */\n tagName?: string;\n\n /**\n * determine how the node should be resolved into a feedback block.\n *\n * scan paragraph, list, and image nodes by default.\n *\n * @returns\n * - `true`: convert the node into a feedback block.\n * - `false`: skip the current node and look into its children.\n * - `skip`: skip the current node and its children.\n */\n resolve?: (node: RootContent) => boolean | 'skip';\n\n /**\n * generate & include the block body to `<FeedbackBlock body=\"...\" />` as string\n *\n * @defaultValue true\n */\n generateBody?: boolean;\n}\n\nexport interface FeedbackBlockProps {\n id: string;\n /** the text body of block, only exists when `generateBody` is enabled. */\n body?: string;\n}\n\n/**\n * Generate MDX `<FeedbackBlock />` elements with an unique `id` for every block-like element.\n *\n * Note: the uniqueness is only guaranteed per MDX file/page.\n */\nexport function remarkFeedbackBlock({\n generateHash = ({ body }) => createHash('md5').update(body).digest('hex').substring(0, 16),\n tagName = 'FeedbackBlock',\n resolve = (node) => node.type === 'paragraph' || node.type === 'image' || node.type === 'list',\n generateBody = true,\n}: RemarkFeedbackBlockOptions = {}): Transformer<Root, Root> {\n return (tree) => {\n const counts = new Map<string, number>();\n\n visit(tree, (node, index, parent) => {\n if (node.type === 'root') return;\n const resolved = resolve(node);\n if (resolved === false) return;\n if (resolved === 'skip') return 'skip';\n\n const text = flattenNode(node).trim();\n if (text.length === 0 || !parent || typeof index !== 'number') return;\n let id = generateHash({ body: text });\n const count = counts.get(id) ?? 0;\n if (count > 0) id = `${id}-${count}`;\n counts.set(id, count + 1);\n\n const wrapper: MdxJsxFlowElement = {\n type: 'mdxJsxFlowElement',\n name: tagName,\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'id',\n value: id,\n },\n ],\n children: [node as BlockContent],\n };\n if (generateBody)\n wrapper.attributes.push({\n type: 'mdxJsxAttribute',\n name: 'body',\n value: text,\n });\n\n parent.children[index] = wrapper;\n return 'skip';\n });\n };\n}\n"],"mappings":";;;;;;;;;;AAiDA,SAAgB,oBAAoB,EAClC,gBAAgB,EAAE,WAAW,WAAW,MAAM,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM,CAAC,UAAU,GAAG,GAAG,EAC1F,UAAU,iBACV,WAAW,SAAS,KAAK,SAAS,eAAe,KAAK,SAAS,WAAW,KAAK,SAAS,QACxF,eAAe,SACe,EAAE,EAA2B;AAC3D,SAAQ,SAAS;EACf,MAAM,yBAAS,IAAI,KAAqB;AAExC,QAAM,OAAO,MAAM,OAAO,WAAW;AACnC,OAAI,KAAK,SAAS,OAAQ;GAC1B,MAAM,WAAW,QAAQ,KAAK;AAC9B,OAAI,aAAa,MAAO;AACxB,OAAI,aAAa,OAAQ,QAAO;GAEhC,MAAM,OAAO,YAAY,KAAK,CAAC,MAAM;AACrC,OAAI,KAAK,WAAW,KAAK,CAAC,UAAU,OAAO,UAAU,SAAU;GAC/D,IAAI,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;GACrC,MAAM,QAAQ,OAAO,IAAI,GAAG,IAAI;AAChC,OAAI,QAAQ,EAAG,MAAK,GAAG,GAAG,GAAG;AAC7B,UAAO,IAAI,IAAI,QAAQ,EAAE;GAEzB,MAAM,UAA6B;IACjC,MAAM;IACN,MAAM;IACN,YAAY,CACV;KACE,MAAM;KACN,MAAM;KACN,OAAO;KACR,CACF;IACD,UAAU,CAAC,KAAqB;IACjC;AACD,OAAI,aACF,SAAQ,WAAW,KAAK;IACtB,MAAM;IACN,MAAM;IACN,OAAO;IACR,CAAC;AAEJ,UAAO,SAAS,SAAS;AACzB,UAAO;IACP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-heading.js","names":[
|
|
1
|
+
{"version":3,"file":"remark-heading.js","names":[],"sources":["../../src/mdx-plugins/remark-heading.ts"],"sourcesContent":["import Slugger from 'github-slugger';\nimport type { Heading, Root } from 'mdast';\nimport type { Transformer } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { TOCItemType } from '@/toc';\nimport { flattenNode } from '@/mdx-plugins/mdast-utils';\n\nconst slugger = new Slugger();\n\ndeclare module 'mdast' {\n export interface HeadingData extends Data {\n hProperties?: {\n id?: string;\n };\n }\n}\n\nconst regex = /\\s*\\[#(?<slug>[^]+?)]\\s*$/;\n\nexport interface RemarkHeadingOptions {\n slug?: (root: Root, heading: Heading, text: string) => string;\n\n /**\n * Allow custom headings ids\n *\n * @defaultValue true\n */\n customId?: boolean;\n\n /**\n * Attach an array of `TOCItemType` to `file.data.toc`\n *\n * @defaultValue true\n */\n generateToc?: boolean;\n}\n\n/**\n * Add heading ids and extract TOC\n */\nexport function remarkHeading({\n slug: defaultSlug,\n customId = true,\n generateToc = true,\n}: RemarkHeadingOptions = {}): Transformer<Root, Root> {\n return (root, file) => {\n const toc: TOCItemType[] = [];\n slugger.reset();\n\n visit(root, 'heading', (heading) => {\n heading.data ||= {};\n heading.data.hProperties ||= {};\n const props = heading.data.hProperties;\n\n const lastNode = heading.children.at(-1);\n if (lastNode?.type === 'text' && customId) {\n const match = regex.exec(lastNode.value);\n\n if (match?.[1]) {\n props.id = match[1];\n lastNode.value = lastNode.value.slice(0, match.index);\n }\n }\n\n let flattened: string | null = null;\n if (!props.id) {\n flattened ??= flattenNode(heading);\n\n props.id = defaultSlug ? defaultSlug(root, heading, flattened) : slugger.slug(flattened);\n }\n\n if (generateToc) {\n toc.push({\n title: flattened ?? flattenNode(heading),\n url: `#${props.id}`,\n depth: heading.depth,\n });\n }\n\n return 'skip';\n });\n\n if (generateToc) file.data.toc = toc;\n };\n}\n"],"mappings":";;;;;AAOA,MAAM,UAAU,IAAI,SAAS;AAU7B,MAAM,QAAQ;;;;AAuBd,SAAgB,cAAc,EAC5B,MAAM,aACN,WAAW,MACX,cAAc,SACU,EAAE,EAA2B;AACrD,SAAQ,MAAM,SAAS;EACrB,MAAM,MAAqB,EAAE;AAC7B,UAAQ,OAAO;AAEf,QAAM,MAAM,YAAY,YAAY;AAClC,WAAQ,SAAS,EAAE;AACnB,WAAQ,KAAK,gBAAgB,EAAE;GAC/B,MAAM,QAAQ,QAAQ,KAAK;GAE3B,MAAM,WAAW,QAAQ,SAAS,GAAG,GAAG;AACxC,OAAI,UAAU,SAAS,UAAU,UAAU;IACzC,MAAM,QAAQ,MAAM,KAAK,SAAS,MAAM;AAExC,QAAI,QAAQ,IAAI;AACd,WAAM,KAAK,MAAM;AACjB,cAAS,QAAQ,SAAS,MAAM,MAAM,GAAG,MAAM,MAAM;;;GAIzD,IAAI,YAA2B;AAC/B,OAAI,CAAC,MAAM,IAAI;AACb,kBAAc,YAAY,QAAQ;AAElC,UAAM,KAAK,cAAc,YAAY,MAAM,SAAS,UAAU,GAAG,QAAQ,KAAK,UAAU;;AAG1F,OAAI,YACF,KAAI,KAAK;IACP,OAAO,aAAa,YAAY,QAAQ;IACxC,KAAK,IAAI,MAAM;IACf,OAAO,QAAQ;IAChB,CAAC;AAGJ,UAAO;IACP;AAEF,MAAI,YAAa,MAAK,KAAK,MAAM"}
|