fumadocs-mdx 14.2.4 → 14.2.6
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/{adapter-DG-viEbG.js → adapter-DI4cexsC.js} +3 -2
- package/dist/adapter-DI4cexsC.js.map +1 -0
- package/dist/build-BTTNEFmV.js.map +1 -1
- package/dist/{build-mdx-BVeBo4jT.js → build-mdx-Blq7ZKoM.js} +8 -2
- package/dist/build-mdx-Blq7ZKoM.js.map +1 -0
- package/dist/build-mdx-EzuL9Bt0.js +5 -0
- package/dist/bun/index.d.ts +1 -1
- package/dist/bun/index.js +3 -3
- package/dist/codegen-DleOVLNr.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/core-DjldE3H9.js.map +1 -1
- package/dist/{core-DG43f_AU.d.ts → core-O3WLuY_I.d.ts} +7 -2
- package/dist/core-O3WLuY_I.d.ts.map +1 -0
- package/dist/fuma-matter-CHgJa_-B.js.map +1 -1
- package/dist/index-file-D9HsrWU_.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/{mdx-DMZ9tsAa.js → mdx-CPnL-Edm.js} +4 -4
- package/dist/mdx-CPnL-Edm.js.map +1 -0
- package/dist/{meta-DyieTM4Z.js → meta-BKBx8Gab.js} +3 -3
- package/dist/meta-BKBx8Gab.js.map +1 -0
- package/dist/next/index.d.ts +1 -1
- package/dist/next/index.js.map +1 -1
- package/dist/node/loader.js +3 -3
- package/dist/node/loader.js.map +1 -1
- package/dist/plugins/index-file.d.ts +1 -1
- package/dist/plugins/json-schema.d.ts +1 -1
- package/dist/plugins/json-schema.js.map +1 -1
- package/dist/plugins/last-modified.d.ts +1 -1
- package/dist/plugins/last-modified.js.map +1 -1
- package/dist/remark-include-D3G3mAnv.js.map +1 -1
- package/dist/runtime/browser.d.ts +6 -6
- package/dist/runtime/browser.d.ts.map +1 -1
- package/dist/runtime/browser.js +12 -14
- package/dist/runtime/browser.js.map +1 -1
- package/dist/runtime/dynamic.d.ts +1 -1
- package/dist/runtime/dynamic.js +1 -1
- package/dist/runtime/dynamic.js.map +1 -1
- package/dist/runtime/server.d.ts +1 -1
- package/dist/runtime/server.js.map +1 -1
- package/dist/vite/index.d.ts +1 -1
- package/dist/vite/index.js +3 -3
- package/dist/webpack/mdx.d.ts +1 -1
- package/dist/webpack/mdx.js +2 -2
- package/dist/webpack/mdx.js.map +1 -1
- package/dist/webpack/meta.d.ts +1 -1
- package/dist/webpack/meta.js +2 -2
- package/dist/webpack/meta.js.map +1 -1
- package/dist/webpack--VSEE6Zp.js.map +1 -1
- package/package.json +9 -9
- package/dist/adapter-DG-viEbG.js.map +0 -1
- package/dist/build-mdx-BVeBo4jT.js.map +0 -1
- package/dist/build-mdx-ChjP7zAn.js +0 -5
- package/dist/core-DG43f_AU.d.ts.map +0 -1
- package/dist/mdx-DMZ9tsAa.js.map +0 -1
- package/dist/meta-DyieTM4Z.js.map +0 -1
package/dist/next/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["
|
|
1
|
+
{"version":3,"file":"index.js","names":["path"],"sources":["../../src/next/index.ts"],"sourcesContent":["import type { NextConfig } from 'next';\nimport type { Configuration } from 'webpack';\nimport type { WebpackLoaderOptions } from '@/webpack';\nimport type { TurbopackLoaderOptions, TurbopackOptions } from 'next/dist/server/config-shared';\nimport * as path from 'node:path';\nimport { loadConfig } from '@/config/load-from-file';\nimport { _Defaults, type Core, createCore } from '@/core';\nimport { mdxLoaderGlob, metaLoaderGlob } from '@/loaders';\nimport type { IndexFilePluginOptions } from '@/plugins/index-file';\nimport indexFile from '@/plugins/index-file';\n\nexport interface CreateMDXOptions {\n /**\n * Path to source configuration file\n */\n configPath?: string;\n\n /**\n * Directory for output files\n *\n * @defaultValue '.source'\n */\n outDir?: string;\n\n index?: IndexFilePluginOptions | false;\n}\n\nconst defaultPageExtensions = ['mdx', 'md', 'jsx', 'js', 'tsx', 'ts'];\n\nexport function createMDX(createOptions: CreateMDXOptions = {}) {\n const core = createNextCore(applyDefaults(createOptions));\n const isDev = process.env.NODE_ENV === 'development';\n\n if (process.env._FUMADOCS_MDX !== '1') {\n process.env._FUMADOCS_MDX = '1';\n\n void init(isDev, core);\n }\n\n return (nextConfig: NextConfig = {}): NextConfig => {\n const { configPath, outDir } = core.getOptions();\n const loaderOptions: WebpackLoaderOptions = {\n configPath,\n outDir,\n absoluteCompiledConfigPath: path.resolve(core.getCompiledConfigPath()),\n isDev,\n };\n\n const turbopack: TurbopackOptions = {\n ...nextConfig.turbopack,\n rules: {\n ...nextConfig.turbopack?.rules,\n '*.{md,mdx}': {\n loaders: [\n {\n loader: 'fumadocs-mdx/loader-mdx',\n options: loaderOptions as unknown as TurbopackLoaderOptions,\n },\n ],\n as: '*.js',\n },\n '*.json': {\n loaders: [\n {\n loader: 'fumadocs-mdx/loader-meta',\n options: loaderOptions as unknown as TurbopackLoaderOptions,\n },\n ],\n as: '*.json',\n },\n '*.yaml': {\n loaders: [\n {\n loader: 'fumadocs-mdx/loader-meta',\n options: loaderOptions as unknown as TurbopackLoaderOptions,\n },\n ],\n as: '*.js',\n },\n },\n };\n\n return {\n ...nextConfig,\n turbopack,\n pageExtensions: nextConfig.pageExtensions ?? defaultPageExtensions,\n webpack: (config: Configuration, options) => {\n config.resolve ||= {};\n\n config.module ||= {};\n config.module.rules ||= [];\n\n config.module.rules.push(\n {\n test: mdxLoaderGlob,\n use: [\n options.defaultLoaders.babel,\n {\n loader: 'fumadocs-mdx/loader-mdx',\n options: loaderOptions,\n },\n ],\n },\n {\n test: metaLoaderGlob,\n enforce: 'pre',\n use: [\n {\n loader: 'fumadocs-mdx/loader-meta',\n options: loaderOptions,\n },\n ],\n },\n );\n\n config.plugins ||= [];\n\n return nextConfig.webpack?.(config, options) ?? config;\n },\n };\n };\n}\n\nasync function init(dev: boolean, core: Core): Promise<void> {\n async function initOrReload() {\n await core.init({\n config: loadConfig(core, true),\n });\n await core.emit({ write: true });\n }\n\n async function devServer() {\n const { FSWatcher } = await import('chokidar');\n const { configPath, outDir } = core.getOptions();\n const watcher = new FSWatcher({\n ignoreInitial: true,\n persistent: true,\n ignored: [outDir],\n });\n\n watcher.add(configPath);\n for (const collection of core.getCollections()) {\n watcher.add(collection.dir);\n }\n for (const workspace of core.getWorkspaces().values()) {\n for (const collection of workspace.getCollections()) {\n watcher.add(collection.dir);\n }\n }\n\n watcher.on('ready', () => {\n console.log('[MDX] started dev server');\n });\n\n const absoluteConfigPath = path.resolve(configPath);\n watcher.on('all', async (_event, file) => {\n if (path.resolve(file) === absoluteConfigPath) {\n // skip plugin listeners\n watcher.removeAllListeners();\n\n await watcher.close();\n await initOrReload();\n console.log('[MDX] restarting dev server');\n await devServer();\n }\n });\n\n process.on('exit', () => {\n if (watcher.closed) return;\n\n console.log('[MDX] closing dev server');\n void watcher.close();\n });\n\n await core.initServer({ watcher });\n }\n\n await initOrReload();\n if (dev) {\n await devServer();\n }\n}\n\nexport async function postInstall(options: CreateMDXOptions) {\n const core = createNextCore(applyDefaults(options));\n await core.init({\n config: loadConfig(core, true),\n });\n await core.emit({ write: true });\n}\n\nfunction applyDefaults(options: CreateMDXOptions): Required<CreateMDXOptions> {\n return {\n index: {},\n outDir: options.outDir ?? _Defaults.outDir,\n configPath: options.configPath ?? _Defaults.configPath,\n };\n}\n\nfunction createNextCore(options: Required<CreateMDXOptions>): Core {\n return createCore({\n environment: 'next',\n outDir: options.outDir,\n configPath: options.configPath,\n plugins: [options.index && indexFile(options.index)],\n });\n}\n"],"mappings":"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"}
|
package/dist/node/loader.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import "../fuma-matter-CHgJa_-B.js";
|
|
2
|
-
import { t as createMdxLoader } from "../mdx-
|
|
2
|
+
import { t as createMdxLoader } from "../mdx-CPnL-Edm.js";
|
|
3
3
|
import { n as createCore, t as _Defaults } from "../core-DjldE3H9.js";
|
|
4
4
|
import "../codegen-DleOVLNr.js";
|
|
5
|
-
import { n as toNode, o as createStandaloneConfigLoader } from "../adapter-
|
|
6
|
-
import { t as createMetaLoader } from "../meta-
|
|
5
|
+
import { n as toNode, o as createStandaloneConfigLoader } from "../adapter-DI4cexsC.js";
|
|
6
|
+
import { t as createMetaLoader } from "../meta-BKBx8Gab.js";
|
|
7
7
|
|
|
8
8
|
//#region src/node/loader.ts
|
|
9
9
|
const configLoader = createStandaloneConfigLoader({
|
package/dist/node/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","names":[
|
|
1
|
+
{"version":3,"file":"loader.js","names":[],"sources":["../../src/node/loader.ts"],"sourcesContent":["import { _Defaults, createCore } from '@/core';\nimport { createMdxLoader } from '@/loaders/mdx';\nimport { toNode } from '@/loaders/adapter';\nimport { createStandaloneConfigLoader } from '@/loaders/config';\nimport type { LoadHook } from 'node:module';\nimport { createMetaLoader } from '@/loaders/meta';\n\nconst core = createCore({\n environment: 'node',\n configPath: _Defaults.configPath,\n outDir: _Defaults.outDir,\n});\n\nconst configLoader = createStandaloneConfigLoader({\n core,\n buildConfig: true,\n mode: 'production',\n});\n\nconst mdxLoader = toNode(createMdxLoader(configLoader));\nconst metaLoader = toNode(createMetaLoader(configLoader));\n\nexport const load: LoadHook = (url, context, nextLoad) => {\n return mdxLoader(url, context, (v, ctx) => metaLoader(v, { ...context, ...ctx }, nextLoad));\n};\n"],"mappings":";;;;;;;;AAaA,MAAM,eAAe,6BAA6B;CAChD,MAPW,WAAW;EACtB,aAAa;EACb,YAAY,UAAU;EACtB,QAAQ,UAAU;EACnB,CAAC;CAIA,aAAa;CACb,MAAM;CACP,CAAC;AAEF,MAAM,YAAY,OAAO,gBAAgB,aAAa,CAAC;AACvD,MAAM,aAAa,OAAO,iBAAiB,aAAa,CAAC;AAEzD,MAAa,QAAkB,KAAK,SAAS,aAAa;AACxD,QAAO,UAAU,KAAK,UAAU,GAAG,QAAQ,WAAW,GAAG;EAAE,GAAG;EAAS,GAAG;EAAK,EAAE,SAAS,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { g as indexFile, h as IndexFilePluginOptions, m as IndexFilePlugin } from "../core-
|
|
1
|
+
import { g as indexFile, h as IndexFilePluginOptions, m as IndexFilePlugin } from "../core-O3WLuY_I.js";
|
|
2
2
|
export { IndexFilePlugin, IndexFilePluginOptions, indexFile as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema.js","names":[
|
|
1
|
+
{"version":3,"file":"json-schema.js","names":[],"sources":["../../src/plugins/json-schema.ts"],"sourcesContent":["import type { EmitEntry, Plugin } from '@/core';\nimport type { DocsCollectionItem, MetaCollectionItem } from '@/config/build';\nimport { z } from 'zod';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface JSONSchemaOptions {\n /**\n * insert `$schema` field to JSON files on creation.\n *\n * @defaultValue false\n */\n insert?: boolean;\n}\n\n/**\n * Generate JSON schemas locally for collection schemas\n *\n * note: **it only works with Zod**\n */\nexport default function jsonSchema({ insert = false }: JSONSchemaOptions = {}): Plugin {\n function getSchemaPath(name: string) {\n return `json-schema/${name}.json`;\n }\n\n return {\n configureServer(server) {\n const { outDir } = this.core.getOptions();\n if (!server.watcher || !insert) return;\n\n server.watcher.on('add', async (file) => {\n let parent: DocsCollectionItem | undefined;\n let match: MetaCollectionItem | undefined;\n for (const collection of this.core.getCollections()) {\n if (collection.type === 'meta' && collection.hasFile(file)) {\n match = collection;\n break;\n }\n if (collection.type === 'docs' && collection.meta.hasFile(file)) {\n parent = collection;\n match = collection.meta;\n break;\n }\n }\n\n if (!match) return;\n let obj: object;\n try {\n const content = (await fs.readFile(file)).toString();\n obj = content.length > 0 ? JSON.parse(content) : {};\n } catch {\n return;\n }\n\n if ('$schema' in obj) return;\n const schemaPath = path.join(\n outDir,\n getSchemaPath(parent ? `${parent.name}.meta` : match.name),\n );\n const updated = {\n $schema: path.relative(path.dirname(file), schemaPath),\n ...obj,\n };\n\n await fs.writeFile(file, JSON.stringify(updated, null, 2));\n });\n },\n emit() {\n const files: EmitEntry[] = [];\n\n function onSchema(name: string, schema: z.ZodSchema) {\n files.push({\n path: getSchemaPath(name),\n content: JSON.stringify(\n z.toJSONSchema(schema, {\n io: 'input',\n unrepresentable: 'any',\n }),\n ),\n });\n }\n\n for (const collection of this.core.getCollections()) {\n if (collection.type === 'docs') {\n if (collection.meta.schema instanceof z.ZodType) {\n onSchema(`${collection.name}.meta`, collection.meta.schema);\n }\n\n if (collection.docs.schema instanceof z.ZodType) {\n onSchema(`${collection.name}.docs`, collection.docs.schema);\n }\n } else if (collection.schema instanceof z.ZodType) {\n onSchema(collection.name, collection.schema);\n }\n }\n\n return files;\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAoBA,SAAwB,WAAW,EAAE,SAAS,UAA6B,EAAE,EAAU;CACrF,SAAS,cAAc,MAAc;AACnC,SAAO,eAAe,KAAK;;AAG7B,QAAO;EACL,gBAAgB,QAAQ;GACtB,MAAM,EAAE,WAAW,KAAK,KAAK,YAAY;AACzC,OAAI,CAAC,OAAO,WAAW,CAAC,OAAQ;AAEhC,UAAO,QAAQ,GAAG,OAAO,OAAO,SAAS;IACvC,IAAI;IACJ,IAAI;AACJ,SAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,EAAE;AACnD,SAAI,WAAW,SAAS,UAAU,WAAW,QAAQ,KAAK,EAAE;AAC1D,cAAQ;AACR;;AAEF,SAAI,WAAW,SAAS,UAAU,WAAW,KAAK,QAAQ,KAAK,EAAE;AAC/D,eAAS;AACT,cAAQ,WAAW;AACnB;;;AAIJ,QAAI,CAAC,MAAO;IACZ,IAAI;AACJ,QAAI;KACF,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,EAAE,UAAU;AACpD,WAAM,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,GAAG,EAAE;YAC7C;AACN;;AAGF,QAAI,aAAa,IAAK;IACtB,MAAM,aAAa,KAAK,KACtB,QACA,cAAc,SAAS,GAAG,OAAO,KAAK,SAAS,MAAM,KAAK,CAC3D;IACD,MAAM,UAAU;KACd,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,EAAE,WAAW;KACtD,GAAG;KACJ;AAED,UAAM,GAAG,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;KAC1D;;EAEJ,OAAO;GACL,MAAM,QAAqB,EAAE;GAE7B,SAAS,SAAS,MAAc,QAAqB;AACnD,UAAM,KAAK;KACT,MAAM,cAAc,KAAK;KACzB,SAAS,KAAK,UACZ,EAAE,aAAa,QAAQ;MACrB,IAAI;MACJ,iBAAiB;MAClB,CAAC,CACH;KACF,CAAC;;AAGJ,QAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,CACjD,KAAI,WAAW,SAAS,QAAQ;AAC9B,QAAI,WAAW,KAAK,kBAAkB,EAAE,QACtC,UAAS,GAAG,WAAW,KAAK,QAAQ,WAAW,KAAK,OAAO;AAG7D,QAAI,WAAW,KAAK,kBAAkB,EAAE,QACtC,UAAS,GAAG,WAAW,KAAK,QAAQ,WAAW,KAAK,OAAO;cAEpD,WAAW,kBAAkB,EAAE,QACxC,UAAS,WAAW,MAAM,WAAW,OAAO;AAIhD,UAAO;;EAEV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"last-modified.js","names":[
|
|
1
|
+
{"version":3,"file":"last-modified.js","names":[],"sources":["../../src/plugins/last-modified.ts"],"sourcesContent":["import path from 'node:path';\nimport { x } from 'tinyexec';\nimport type { Plugin } from '@/core';\nimport { ident } from '@/utils/codegen';\n\nconst cache = new Map<string, Promise<Date | null>>();\ntype VersionControlFn = (filePath: string) => Promise<Date | null | undefined>;\n\nexport interface LastModifiedPluginOptions {\n /**\n * Version control to obtain the last modified time.\n *\n * - `git`: Requires `git` to be installed.\n *\n * If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`.\n *\n * - A function: return the last modified time for given file path.\n *\n * @defaultValue 'git'\n */\n versionControl?: 'git' | VersionControlFn;\n\n /**\n * Filter the collections to include by names\n */\n filter?: (collection: string) => boolean;\n}\n\nconst ExtendTypes = `{\n /**\n * Last modified date of document file, obtained from version control.\n *\n */\n lastModified?: Date;\n}`;\n\n/**\n * Injects `lastModified` property to page exports.\n */\nexport default function lastModified(options: LastModifiedPluginOptions = {}): Plugin {\n const { versionControl = 'git', filter = () => true } = options;\n let fn: VersionControlFn;\n\n return {\n name: 'last-modified',\n 'index-file': {\n generateTypeConfig() {\n const lines: string[] = [];\n lines.push('{');\n lines.push(' DocData: {');\n for (const collection of this.core.getCollections()) {\n if (filter(collection.name)) {\n lines.push(ident(`${collection.name}: ${ExtendTypes},`, 2));\n }\n }\n lines.push(' }');\n lines.push('}');\n return lines.join('\\n');\n },\n serverOptions(options) {\n options.doc ??= {};\n options.doc.passthroughs ??= [];\n options.doc.passthroughs.push('lastModified');\n },\n },\n config() {\n const { workspace } = this.core.getOptions();\n const cwd = workspace ? path.resolve(workspace.dir) : process.cwd();\n\n switch (versionControl) {\n case 'git':\n fn = (v) => getGitTimestamp(v, cwd);\n break;\n default:\n fn = versionControl;\n }\n },\n doc: {\n async vfile(file) {\n if (!filter(this.collection.name)) return;\n\n const timestamp = await fn(this.filePath);\n if (timestamp) {\n file.data['mdx-export'] ??= [];\n file.data['mdx-export'].push({\n name: 'lastModified',\n value: timestamp,\n });\n }\n },\n },\n };\n}\n\nasync function getGitTimestamp(file: string, cwd: string): Promise<Date | null> {\n const cached = cache.get(file);\n if (cached) return cached;\n\n const timePromise = (async () => {\n const out = await x('git', ['log', '-1', '--pretty=\"%ai\"', path.relative(cwd, file)], {\n nodeOptions: {\n cwd,\n },\n });\n\n if (out.exitCode !== 0) return null;\n const date = new Date(out.stdout);\n return isNaN(date.getTime()) ? null : date;\n })();\n\n cache.set(file, timePromise);\n return timePromise;\n}\n"],"mappings":";;;;;AAKA,MAAM,wBAAQ,IAAI,KAAmC;AAuBrD,MAAM,cAAc;;;;;;;;;;AAWpB,SAAwB,aAAa,UAAqC,EAAE,EAAU;CACpF,MAAM,EAAE,iBAAiB,OAAO,eAAe,SAAS;CACxD,IAAI;AAEJ,QAAO;EACL,MAAM;EACN,cAAc;GACZ,qBAAqB;IACnB,MAAM,QAAkB,EAAE;AAC1B,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,eAAe;AAC1B,SAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,CACjD,KAAI,OAAO,WAAW,KAAK,CACzB,OAAM,KAAK,MAAM,GAAG,WAAW,KAAK,IAAI,YAAY,IAAI,EAAE,CAAC;AAG/D,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,IAAI;AACf,WAAO,MAAM,KAAK,KAAK;;GAEzB,cAAc,WAAS;AACrB,cAAQ,QAAQ,EAAE;AAClB,cAAQ,IAAI,iBAAiB,EAAE;AAC/B,cAAQ,IAAI,aAAa,KAAK,eAAe;;GAEhD;EACD,SAAS;GACP,MAAM,EAAE,cAAc,KAAK,KAAK,YAAY;GAC5C,MAAM,MAAM,YAAY,KAAK,QAAQ,UAAU,IAAI,GAAG,QAAQ,KAAK;AAEnE,WAAQ,gBAAR;IACE,KAAK;AACH,WAAM,MAAM,gBAAgB,GAAG,IAAI;AACnC;IACF,QACE,MAAK;;;EAGX,KAAK,EACH,MAAM,MAAM,MAAM;AAChB,OAAI,CAAC,OAAO,KAAK,WAAW,KAAK,CAAE;GAEnC,MAAM,YAAY,MAAM,GAAG,KAAK,SAAS;AACzC,OAAI,WAAW;AACb,SAAK,KAAK,kBAAkB,EAAE;AAC9B,SAAK,KAAK,cAAc,KAAK;KAC3B,MAAM;KACN,OAAO;KACR,CAAC;;KAGP;EACF;;AAGH,eAAe,gBAAgB,MAAc,KAAmC;CAC9E,MAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,KAAI,OAAQ,QAAO;CAEnB,MAAM,eAAe,YAAY;EAC/B,MAAM,MAAM,MAAM,EAAE,OAAO;GAAC;GAAO;GAAM;GAAkB,KAAK,SAAS,KAAK,KAAK;GAAC,EAAE,EACpF,aAAa,EACX,KACD,EACF,CAAC;AAEF,MAAI,IAAI,aAAa,EAAG,QAAO;EAC/B,MAAM,OAAO,IAAI,KAAK,IAAI,OAAO;AACjC,SAAO,MAAM,KAAK,SAAS,CAAC,GAAG,OAAO;KACpC;AAEJ,OAAM,IAAI,MAAM,YAAY;AAC5B,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-include-D3G3mAnv.js","names":["newChildren: RootContent[]","extractedLines: string[]","ElementLikeTypes: ElementLikeContent['type'][]","attributes: Record<string, string | null>","nodes: RootContent[] | undefined","content: string","fs","path","queue: Promise<void>[]"],"sources":["../src/loaders/mdx/remark-unravel.ts","../src/loaders/mdx/mdast-utils.ts","../src/loaders/mdx/remark-include.ts"],"sourcesContent":["// from internal remark plugins in https://github.com/mdx-js/mdx/blob/main/packages/mdx/lib/plugin/remark-mark-and-unravel.js\n// we need to ensure consistency with MDX.js when parsing embed content in `remark-include`\nimport { visit } from 'unist-util-visit';\nimport type { Transformer } from 'unified';\nimport type { Root, RootContent } from 'mdast';\n\nexport function remarkMarkAndUnravel(): Transformer<Root, Root> {\n return (tree) => {\n visit(tree, function (node, index, parent) {\n let offset = -1;\n let all = true;\n let oneOrMore = false;\n\n if (parent && typeof index === 'number' && node.type === 'paragraph') {\n const children = node.children;\n\n while (++offset < children.length) {\n const child = children[offset];\n\n if (child.type === 'mdxJsxTextElement' || child.type === 'mdxTextExpression') {\n oneOrMore = true;\n } else if (child.type === 'text' && child.value.trim().length === 0) {\n // Empty.\n } else {\n all = false;\n break;\n }\n }\n\n if (all && oneOrMore) {\n offset = -1;\n const newChildren: RootContent[] = [];\n\n while (++offset < children.length) {\n const child = children[offset];\n\n if (child.type === 'mdxJsxTextElement') {\n // @ts-expect-error: mutate because it is faster; content model is fine.\n child.type = 'mdxJsxFlowElement';\n }\n\n if (child.type === 'mdxTextExpression') {\n // @ts-expect-error: mutate because it is faster; content model is fine.\n child.type = 'mdxFlowExpression';\n }\n\n if (child.type === 'text' && /^[\\t\\r\\n ]+$/.test(String(child.value))) {\n // Empty.\n } else {\n newChildren.push(child);\n }\n }\n\n parent.children.splice(index, 1, ...newChildren);\n return index;\n }\n }\n });\n };\n}\n","import type { RootContent } from 'mdast';\n\nexport function flattenNode(node: RootContent): string {\n if ('children' in node) return node.children.map((child) => flattenNode(child)).join('');\n\n if ('value' in node) return node.value;\n\n return '';\n}\n","import { type Processor, type Transformer, unified } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { Code, Node, Root, RootContent } from 'mdast';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { fumaMatter } from '@/utils/fuma-matter';\nimport type { MdxJsxFlowElement, MdxJsxTextElement } from 'mdast-util-mdx-jsx';\nimport { remarkHeading } from 'fumadocs-core/mdx-plugins';\nimport { VFile } from 'vfile';\nimport type { Directives } from 'mdast-util-directive';\nimport { remarkMarkAndUnravel } from '@/loaders/mdx/remark-unravel';\nimport { flattenNode } from './mdast-utils';\n\n/**\n * VS Code–style region extraction\n * Adapted from VitePress:\n * https://github.com/vuejs/vitepress/blob/main/src/node/markdown/plugins/snippet.ts\n */\n\n// region marker regexes\nconst REGION_MARKERS = [\n {\n start: /^\\s*\\/\\/\\s*#?region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*\\/\\/\\s*#?endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*<!--\\s*#?region\\b\\s*(.*?)\\s*-->/,\n end: /^\\s*<!--\\s*#?endregion\\b\\s*(.*?)\\s*-->/,\n },\n {\n start: /^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\//,\n end: /^\\s*\\/\\*\\s*#endregion\\b\\s*(.*?)\\s*\\*\\//,\n },\n {\n start: /^\\s*#[rR]egion\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#[eE]nd ?[rR]egion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*#\\s*#?region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#\\s*#?endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*(?:--|::|@?REM)\\s*#region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*(?:--|::|@?REM)\\s*#endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*#pragma\\s+region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#pragma\\s+endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*\\(\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\)/,\n end: /^\\s*\\(\\*\\s*#endregion\\b\\s*(.*?)\\s*\\*\\)/,\n },\n];\n\nfunction dedent(lines: string[]): string {\n const minIndent = lines.reduce((min, line) => {\n const match = line.match(/^(\\s*)\\S/);\n return match ? Math.min(min, match[1].length) : min;\n }, Infinity);\n\n return minIndent === Infinity\n ? lines.join('\\n')\n : lines.map((l) => l.slice(minIndent)).join('\\n');\n}\n\nfunction extractCodeRegion(content: string, regionName: string): string {\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n for (const re of REGION_MARKERS) {\n let match = re.start.exec(lines[i]);\n if (match?.[1] !== regionName) continue;\n\n let depth = 1;\n const extractedLines: string[] = [];\n for (let j = i + 1; j < lines.length; j++) {\n match = re.start.exec(lines[j]);\n if (match) {\n depth++;\n continue;\n }\n\n match = re.end.exec(lines[j]);\n if (match) {\n if (match[1] === regionName) depth = 0;\n else if (match[1] === '') depth--;\n else continue;\n\n if (depth > 0) continue;\n return dedent(extractedLines);\n } else {\n extractedLines.push(lines[j]);\n }\n }\n }\n }\n throw new Error(`Region \"${regionName}\" not found`);\n}\n\nexport interface Params {\n lang?: string;\n meta?: string;\n}\n\nconst ElementLikeTypes: ElementLikeContent['type'][] = [\n 'mdxJsxFlowElement',\n 'mdxJsxTextElement',\n 'containerDirective',\n 'textDirective',\n 'leafDirective',\n];\ntype ElementLikeContent = MdxJsxFlowElement | MdxJsxTextElement | Directives;\n\nfunction isElementLike(node: Node): node is ElementLikeContent {\n return ElementLikeTypes.includes(node.type as ElementLikeContent['type']);\n}\n\nfunction parseElementAttributes(\n element: ElementLikeContent,\n): Record<string, string | null | undefined> {\n if (Array.isArray(element.attributes)) {\n const attributes: Record<string, string | null> = {};\n\n for (const attr of element.attributes) {\n if (\n attr.type === 'mdxJsxAttribute' &&\n (typeof attr.value === 'string' || attr.value === null)\n ) {\n attributes[attr.name] = attr.value;\n }\n }\n\n return attributes;\n }\n\n return element.attributes ?? {};\n}\n\nfunction parseSpecifier(specifier: string): {\n file: string;\n section?: string;\n} {\n const idx = specifier.lastIndexOf('#');\n if (idx === -1) return { file: specifier };\n\n return {\n file: specifier.slice(0, idx),\n section: specifier.slice(idx + 1),\n };\n}\n\nfunction extractSection(root: Root, section: string): Root | undefined {\n let nodes: RootContent[] | undefined;\n let capturingHeadingContent = false;\n\n visit(root, (node) => {\n if (node.type === 'heading') {\n if (capturingHeadingContent) {\n return false;\n }\n\n if (node.data?.hProperties?.id === section) {\n capturingHeadingContent = true;\n nodes = [node];\n return 'skip';\n }\n\n return;\n }\n\n if (capturingHeadingContent) {\n nodes?.push(node as RootContent);\n return 'skip';\n }\n\n if (isElementLike(node) && node.name === 'section') {\n const attributes = parseElementAttributes(node);\n\n if (attributes.id === section) {\n nodes = node.children;\n return false;\n }\n }\n });\n\n if (nodes)\n return {\n type: 'root',\n children: nodes,\n };\n}\n\nexport function remarkInclude(this: Processor): Transformer<Root, Root> {\n const TagName = 'include';\n\n const embedContent = async (\n targetPath: string,\n heading: string | undefined,\n params: Params,\n parent: VFile,\n ) => {\n const { _getProcessor = () => this, _compiler } = parent.data;\n let content: string;\n try {\n content = (await fs.readFile(targetPath)).toString();\n } catch (e) {\n throw new Error(\n `failed to read file ${targetPath}\\n${e instanceof Error ? e.message : String(e)}`,\n { cause: e },\n );\n }\n\n const ext = path.extname(targetPath);\n _compiler?.addDependency(targetPath);\n // For non-Markdown files, support VS Code–style region extraction\n if (params.lang || (ext !== '.md' && ext !== '.mdx')) {\n const lang = params.lang ?? ext.slice(1);\n let value = content;\n if (heading) {\n value = extractCodeRegion(content, heading.trim());\n }\n return {\n type: 'code',\n lang,\n meta: params.meta,\n value,\n data: {},\n } satisfies Code;\n }\n\n const parser = _getProcessor(ext === '.mdx' ? 'mdx' : 'md');\n const parsed = fumaMatter(content);\n const targetFile = new VFile({\n path: targetPath,\n value: parsed.content,\n data: {\n ...parent.data,\n frontmatter: parsed.data as Record<string, unknown>,\n },\n });\n let mdast = parser.parse(targetFile) as Root;\n const baseProcessor = unified().use(remarkMarkAndUnravel);\n\n if (heading) {\n // parse headings before extraction\n const extracted = extractSection(await baseProcessor.use(remarkHeading).run(mdast), heading);\n if (!extracted)\n throw new Error(\n `Cannot find section ${heading} in ${targetPath}, make sure you have encapsulated the section in a <section id=\"${heading}\"> tag, or a :::section directive with remark-directive configured.`,\n );\n\n mdast = extracted;\n } else {\n mdast = await baseProcessor.run(mdast);\n }\n\n await update(mdast, targetFile);\n return mdast;\n };\n\n async function update(tree: Root, file: VFile) {\n const queue: Promise<void>[] = [];\n\n visit(tree, ElementLikeTypes, (_node, _, parent) => {\n const node = _node as ElementLikeContent;\n if (node.name !== TagName) return;\n\n const specifier = flattenNode(node);\n if (specifier.length === 0) return 'skip';\n\n const attributes = parseElementAttributes(node);\n const { file: relativePath, section } = parseSpecifier(specifier);\n const targetPath = path.resolve('cwd' in attributes ? file.cwd : file.dirname!, relativePath);\n\n queue.push(\n embedContent(targetPath, section, attributes, file).then((replace) => {\n Object.assign(parent && parent.type === 'paragraph' ? parent : node, replace);\n }),\n );\n\n return 'skip';\n });\n\n await Promise.all(queue);\n }\n\n return async (tree, file) => {\n await update(tree, file);\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remark-include-D3G3mAnv.js","names":["fs","path"],"sources":["../src/loaders/mdx/remark-unravel.ts","../src/loaders/mdx/mdast-utils.ts","../src/loaders/mdx/remark-include.ts"],"sourcesContent":["// from internal remark plugins in https://github.com/mdx-js/mdx/blob/main/packages/mdx/lib/plugin/remark-mark-and-unravel.js\n// we need to ensure consistency with MDX.js when parsing embed content in `remark-include`\nimport { visit } from 'unist-util-visit';\nimport type { Transformer } from 'unified';\nimport type { Root, RootContent } from 'mdast';\n\nexport function remarkMarkAndUnravel(): Transformer<Root, Root> {\n return (tree) => {\n visit(tree, function (node, index, parent) {\n let offset = -1;\n let all = true;\n let oneOrMore = false;\n\n if (parent && typeof index === 'number' && node.type === 'paragraph') {\n const children = node.children;\n\n while (++offset < children.length) {\n const child = children[offset];\n\n if (child.type === 'mdxJsxTextElement' || child.type === 'mdxTextExpression') {\n oneOrMore = true;\n } else if (child.type === 'text' && child.value.trim().length === 0) {\n // Empty.\n } else {\n all = false;\n break;\n }\n }\n\n if (all && oneOrMore) {\n offset = -1;\n const newChildren: RootContent[] = [];\n\n while (++offset < children.length) {\n const child = children[offset];\n\n if (child.type === 'mdxJsxTextElement') {\n // @ts-expect-error: mutate because it is faster; content model is fine.\n child.type = 'mdxJsxFlowElement';\n }\n\n if (child.type === 'mdxTextExpression') {\n // @ts-expect-error: mutate because it is faster; content model is fine.\n child.type = 'mdxFlowExpression';\n }\n\n if (child.type === 'text' && /^[\\t\\r\\n ]+$/.test(String(child.value))) {\n // Empty.\n } else {\n newChildren.push(child);\n }\n }\n\n parent.children.splice(index, 1, ...newChildren);\n return index;\n }\n }\n });\n };\n}\n","import type { RootContent } from 'mdast';\n\nexport function flattenNode(node: RootContent): string {\n if ('children' in node) return node.children.map((child) => flattenNode(child)).join('');\n\n if ('value' in node) return node.value;\n\n return '';\n}\n","import { type Processor, type Transformer, unified } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { Code, Node, Root, RootContent } from 'mdast';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { fumaMatter } from '@/utils/fuma-matter';\nimport type { MdxJsxFlowElement, MdxJsxTextElement } from 'mdast-util-mdx-jsx';\nimport { remarkHeading } from 'fumadocs-core/mdx-plugins';\nimport { VFile } from 'vfile';\nimport type { Directives } from 'mdast-util-directive';\nimport { remarkMarkAndUnravel } from '@/loaders/mdx/remark-unravel';\nimport { flattenNode } from './mdast-utils';\n\n/**\n * VS Code–style region extraction\n * Adapted from VitePress:\n * https://github.com/vuejs/vitepress/blob/main/src/node/markdown/plugins/snippet.ts\n */\n\n// region marker regexes\nconst REGION_MARKERS = [\n {\n start: /^\\s*\\/\\/\\s*#?region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*\\/\\/\\s*#?endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*<!--\\s*#?region\\b\\s*(.*?)\\s*-->/,\n end: /^\\s*<!--\\s*#?endregion\\b\\s*(.*?)\\s*-->/,\n },\n {\n start: /^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\//,\n end: /^\\s*\\/\\*\\s*#endregion\\b\\s*(.*?)\\s*\\*\\//,\n },\n {\n start: /^\\s*#[rR]egion\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#[eE]nd ?[rR]egion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*#\\s*#?region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#\\s*#?endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*(?:--|::|@?REM)\\s*#region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*(?:--|::|@?REM)\\s*#endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*#pragma\\s+region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#pragma\\s+endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*\\(\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\)/,\n end: /^\\s*\\(\\*\\s*#endregion\\b\\s*(.*?)\\s*\\*\\)/,\n },\n];\n\nfunction dedent(lines: string[]): string {\n const minIndent = lines.reduce((min, line) => {\n const match = line.match(/^(\\s*)\\S/);\n return match ? Math.min(min, match[1].length) : min;\n }, Infinity);\n\n return minIndent === Infinity\n ? lines.join('\\n')\n : lines.map((l) => l.slice(minIndent)).join('\\n');\n}\n\nfunction extractCodeRegion(content: string, regionName: string): string {\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n for (const re of REGION_MARKERS) {\n let match = re.start.exec(lines[i]);\n if (match?.[1] !== regionName) continue;\n\n let depth = 1;\n const extractedLines: string[] = [];\n for (let j = i + 1; j < lines.length; j++) {\n match = re.start.exec(lines[j]);\n if (match) {\n depth++;\n continue;\n }\n\n match = re.end.exec(lines[j]);\n if (match) {\n if (match[1] === regionName) depth = 0;\n else if (match[1] === '') depth--;\n else continue;\n\n if (depth > 0) continue;\n return dedent(extractedLines);\n } else {\n extractedLines.push(lines[j]);\n }\n }\n }\n }\n throw new Error(`Region \"${regionName}\" not found`);\n}\n\nexport interface Params {\n lang?: string;\n meta?: string;\n}\n\nconst ElementLikeTypes: ElementLikeContent['type'][] = [\n 'mdxJsxFlowElement',\n 'mdxJsxTextElement',\n 'containerDirective',\n 'textDirective',\n 'leafDirective',\n];\ntype ElementLikeContent = MdxJsxFlowElement | MdxJsxTextElement | Directives;\n\nfunction isElementLike(node: Node): node is ElementLikeContent {\n return ElementLikeTypes.includes(node.type as ElementLikeContent['type']);\n}\n\nfunction parseElementAttributes(\n element: ElementLikeContent,\n): Record<string, string | null | undefined> {\n if (Array.isArray(element.attributes)) {\n const attributes: Record<string, string | null> = {};\n\n for (const attr of element.attributes) {\n if (\n attr.type === 'mdxJsxAttribute' &&\n (typeof attr.value === 'string' || attr.value === null)\n ) {\n attributes[attr.name] = attr.value;\n }\n }\n\n return attributes;\n }\n\n return element.attributes ?? {};\n}\n\nfunction parseSpecifier(specifier: string): {\n file: string;\n section?: string;\n} {\n const idx = specifier.lastIndexOf('#');\n if (idx === -1) return { file: specifier };\n\n return {\n file: specifier.slice(0, idx),\n section: specifier.slice(idx + 1),\n };\n}\n\nfunction extractSection(root: Root, section: string): Root | undefined {\n let nodes: RootContent[] | undefined;\n let capturingHeadingContent = false;\n\n visit(root, (node) => {\n if (node.type === 'heading') {\n if (capturingHeadingContent) {\n return false;\n }\n\n if (node.data?.hProperties?.id === section) {\n capturingHeadingContent = true;\n nodes = [node];\n return 'skip';\n }\n\n return;\n }\n\n if (capturingHeadingContent) {\n nodes?.push(node as RootContent);\n return 'skip';\n }\n\n if (isElementLike(node) && node.name === 'section') {\n const attributes = parseElementAttributes(node);\n\n if (attributes.id === section) {\n nodes = node.children;\n return false;\n }\n }\n });\n\n if (nodes)\n return {\n type: 'root',\n children: nodes,\n };\n}\n\nexport function remarkInclude(this: Processor): Transformer<Root, Root> {\n const TagName = 'include';\n\n const embedContent = async (\n targetPath: string,\n heading: string | undefined,\n params: Params,\n parent: VFile,\n ) => {\n const { _getProcessor = () => this, _compiler } = parent.data;\n let content: string;\n try {\n content = (await fs.readFile(targetPath)).toString();\n } catch (e) {\n throw new Error(\n `failed to read file ${targetPath}\\n${e instanceof Error ? e.message : String(e)}`,\n { cause: e },\n );\n }\n\n const ext = path.extname(targetPath);\n _compiler?.addDependency(targetPath);\n // For non-Markdown files, support VS Code–style region extraction\n if (params.lang || (ext !== '.md' && ext !== '.mdx')) {\n const lang = params.lang ?? ext.slice(1);\n let value = content;\n if (heading) {\n value = extractCodeRegion(content, heading.trim());\n }\n return {\n type: 'code',\n lang,\n meta: params.meta,\n value,\n data: {},\n } satisfies Code;\n }\n\n const parser = _getProcessor(ext === '.mdx' ? 'mdx' : 'md');\n const parsed = fumaMatter(content);\n const targetFile = new VFile({\n path: targetPath,\n value: parsed.content,\n data: {\n ...parent.data,\n frontmatter: parsed.data as Record<string, unknown>,\n },\n });\n let mdast = parser.parse(targetFile) as Root;\n const baseProcessor = unified().use(remarkMarkAndUnravel);\n\n if (heading) {\n // parse headings before extraction\n const extracted = extractSection(await baseProcessor.use(remarkHeading).run(mdast), heading);\n if (!extracted)\n throw new Error(\n `Cannot find section ${heading} in ${targetPath}, make sure you have encapsulated the section in a <section id=\"${heading}\"> tag, or a :::section directive with remark-directive configured.`,\n );\n\n mdast = extracted;\n } else {\n mdast = await baseProcessor.run(mdast);\n }\n\n await update(mdast, targetFile);\n return mdast;\n };\n\n async function update(tree: Root, file: VFile) {\n const queue: Promise<void>[] = [];\n\n visit(tree, ElementLikeTypes, (_node, _, parent) => {\n const node = _node as ElementLikeContent;\n if (node.name !== TagName) return;\n\n const specifier = flattenNode(node);\n if (specifier.length === 0) return 'skip';\n\n const attributes = parseElementAttributes(node);\n const { file: relativePath, section } = parseSpecifier(specifier);\n const targetPath = path.resolve('cwd' in attributes ? file.cwd : file.dirname!, relativePath);\n\n queue.push(\n embedContent(targetPath, section, attributes, file).then((replace) => {\n Object.assign(parent && parent.type === 'paragraph' ? parent : node, replace);\n }),\n );\n\n return 'skip';\n });\n\n await Promise.all(queue);\n }\n\n return async (tree, file) => {\n await update(tree, file);\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as DocCollection, N as DocsCollection } from "../core-
|
|
1
|
+
import { M as DocCollection, N as DocsCollection } from "../core-O3WLuY_I.js";
|
|
2
2
|
import { i as InternalTypeConfig } from "../types-B6myALSk.js";
|
|
3
3
|
import { t as CompiledMDXProperties } from "../build-mdx-10MrLupc.js";
|
|
4
4
|
import { FC, ReactNode } from "react";
|
|
@@ -22,23 +22,23 @@ interface ClientLoaderOptions<Doc, Props> {
|
|
|
22
22
|
interface ClientLoader<Doc, Props> {
|
|
23
23
|
preload: (path: string) => Promise<Doc>;
|
|
24
24
|
/**
|
|
25
|
-
* Get a component that renders content with `
|
|
25
|
+
* Get a component that renders content with `use()`.
|
|
26
26
|
*/
|
|
27
27
|
getComponent: (path: string) => FC<Props>;
|
|
28
28
|
/**
|
|
29
|
-
* Get react nodes that renders content
|
|
29
|
+
* Get react nodes that renders content, wraps `<Suspense>` by default.
|
|
30
30
|
*/
|
|
31
|
-
useContent: (path: string, props: Props) => ReactNode;
|
|
31
|
+
useContent: undefined extends Props ? (path: string, props?: Props) => ReactNode : (path: string, props: Props) => ReactNode;
|
|
32
32
|
}
|
|
33
33
|
type BrowserCreate<Config, TC extends InternalTypeConfig> = ReturnType<typeof browser<Config, TC>>;
|
|
34
34
|
interface DocCollectionEntry<Name extends string = string, Frontmatter = unknown, TC extends InternalTypeConfig = InternalTypeConfig> {
|
|
35
35
|
raw: Record<string, () => Promise<CompiledMDXFile<Name, Frontmatter, TC>>>;
|
|
36
|
-
createClientLoader: <Props extends object>(options: ClientLoaderOptions<CompiledMDXFile<Name, Frontmatter, TC>, Props>) => ClientLoader<CompiledMDXFile<Name, Frontmatter, TC>, Props>;
|
|
36
|
+
createClientLoader: <Props extends object | undefined = undefined>(options: ClientLoaderOptions<CompiledMDXFile<Name, Frontmatter, TC>, Props>) => ClientLoader<CompiledMDXFile<Name, Frontmatter, TC>, Props>;
|
|
37
37
|
}
|
|
38
38
|
declare function browser<Config, TC extends InternalTypeConfig>(): {
|
|
39
39
|
doc<Name extends keyof Config & string>(_name: Name, glob: Record<string, () => Promise<unknown>>): Config[Name] extends DocCollection<infer Schema> | DocsCollection<infer Schema> ? DocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC> : never;
|
|
40
40
|
};
|
|
41
|
-
declare function createClientLoader<Doc = CompiledMDXProperties, Props extends object =
|
|
41
|
+
declare function createClientLoader<Doc = CompiledMDXProperties, Props extends object | undefined = undefined>(globEntries: Record<string, () => Promise<Doc>>, options: ClientLoaderOptions<Doc, Props>): ClientLoader<Doc, Props>;
|
|
42
42
|
//#endregion
|
|
43
43
|
export { BrowserCreate, ClientLoader, ClientLoaderOptions, DocCollectionEntry, browser, createClientLoader };
|
|
44
44
|
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","names":[],"sources":["../../src/runtime/browser.
|
|
1
|
+
{"version":3,"file":"browser.d.ts","names":[],"sources":["../../src/runtime/browser.tsx"],"sourcesContent":[],"mappings":";;;;;;;KAMK,6DAGQ,sBACT,sBAAsB,eAAe,cAAc,QAAQ;UAE9C;EANZ;;;;;;;;AAML;EAYsB,EAAA,CAAA,EAAA,MAAA;EAAY,SAAA,EAAA,CAAA,MAAA,EAAZ,GAAY,EAAA,KAAA,EAAA,KAAA,EAAA,GAAU,SAAV;;AAAmB,UAGpC,YAHoC,CAAA,GAAA,EAAA,KAAA,CAAA,CAAA;EAGpC,OAAA,EAAA,CAAA,IAAA,EAAY,MAAA,EAAA,GACA,OADA,CACQ,GADR,CAAA;EACQ;;;EAIH,YAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA,CAAG,KAAH,CAAA;EAIF;;;EAEJ,UAAA,EAAA,SAAA,SAFI,KAEJ,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EADC,KACD,EAAA,GADW,SACX,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,KAAA,EAAA,GAAU,SAAV;;AAAmB,KAGnC,aAHmC,CAAA,MAAA,EAAA,WAGF,kBAHE,CAAA,GAGoB,UAHpB,CAAA,OAItC,OAJsC,CAI9B,MAJ8B,EAItB,EAJsB,CAAA,CAAA;AAGnC,UAIK,kBAJQ,CAAA,aAAA,MAAA,GAAA,MAAA,EAAA,cAAA,OAAA,EAAA,WAOZ,kBAPY,GAOS,kBAPT,CAAA,CAAA;EAAoB,GAAA,EAStC,MATsC,CAAA,MAAA,EAAA,GAAA,GASjB,OATiB,CAST,eATS,CASO,IATP,EASa,WATb,EAS0B,EAT1B,CAAA,CAAA,CAAA;EAC5B,kBAAA,EAAA,CAAA,cAAA,MAAA,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA,OAAA,EAWJ,mBAXI,CAWgB,eAXhB,CAWgC,IAXhC,EAWsC,WAXtC,EAWmD,EAXnD,CAAA,EAWwD,KAXxD,CAAA,EAAA,GAYV,YAZU,CAYG,eAZH,CAYmB,IAZnB,EAYyB,WAZzB,EAYsC,EAZtC,CAAA,EAY2C,KAZ3C,CAAA;;AAAR,iBAeO,OAfP,CAAA,MAAA,EAAA,WAekC,kBAflC,CAAA,CAAA,CAAA,EAAA;EAD0D,GAAA,CAAA,aAAA,MAkBxC,MAlBwC,GAAA,MAAA,CAAA,CAAA,KAAA,EAmBtD,IAnBsD,EAAA,IAAA,EAoBvD,MApBuD,CAAA,MAAA,EAAA,GAAA,GAoBlC,OApBkC,CAAA,OAAA,CAAA,CAAA,CAAA,EA6B/C,MA7B+C,CA6BxC,IA7BwC,CAAA,SA6B1B,aA7B0B,CAAA,KAAA,OAAA,CAAA,GA6BI,cA7BJ,CAAA,KAAA,OAAA,CAAA,GA8BzD,kBA9ByD,CA8BtC,IA9BsC,EA8BhC,gBAAA,CAAiB,WA9Be,CA8BH,MA9BG,CAAA,EA8BM,EA9BN,CAAA,GAAA,KAAA;CAAU;AAI5D,iBAuCD,kBAvCmB,CAAA,MAwC3B,qBAxC2B,EAAA,cAAA,MAAA,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA,WAAA,EA2CpB,MA3CoB,CAAA,MAAA,EAAA,GAAA,GA2CC,OA3CD,CA2CS,GA3CT,CAAA,CAAA,EAAA,OAAA,EA4CxB,mBA5CwB,CA4CJ,GA5CI,EA4CC,KA5CD,CAAA,CAAA,EA6ChC,YA7CgC,CA6CnB,GA7CmB,EA6Cd,KA7Cc,CAAA"}
|
package/dist/runtime/browser.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { use } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
3
|
|
|
3
|
-
//#region src/runtime/browser.
|
|
4
|
+
//#region src/runtime/browser.tsx
|
|
4
5
|
function browser() {
|
|
5
6
|
return { doc(_name, glob) {
|
|
6
7
|
return {
|
|
@@ -16,7 +17,7 @@ function browser() {
|
|
|
16
17
|
}
|
|
17
18
|
const loaderStore = /* @__PURE__ */ new Map();
|
|
18
19
|
function createClientLoader(globEntries, options) {
|
|
19
|
-
const { id = "", component } = options;
|
|
20
|
+
const { id = "", component: useRenderer } = options;
|
|
20
21
|
const renderers = {};
|
|
21
22
|
const loaders = /* @__PURE__ */ new Map();
|
|
22
23
|
const store = loaderStore.get(id) ?? { preloaded: /* @__PURE__ */ new Map() };
|
|
@@ -29,16 +30,13 @@ function createClientLoader(globEntries, options) {
|
|
|
29
30
|
}
|
|
30
31
|
function getRenderer(path) {
|
|
31
32
|
if (path in renderers) return renderers[path];
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return component(cached, props);
|
|
40
|
-
};
|
|
41
|
-
return renderers[path];
|
|
33
|
+
let promise;
|
|
34
|
+
function Renderer(props) {
|
|
35
|
+
let doc = store.preloaded.get(path);
|
|
36
|
+
doc ??= use(promise ??= getLoader(path)());
|
|
37
|
+
return useRenderer(doc, props);
|
|
38
|
+
}
|
|
39
|
+
return renderers[path] = Renderer;
|
|
42
40
|
}
|
|
43
41
|
return {
|
|
44
42
|
async preload(path) {
|
|
@@ -50,7 +48,7 @@ function createClientLoader(globEntries, options) {
|
|
|
50
48
|
return getRenderer(path);
|
|
51
49
|
},
|
|
52
50
|
useContent(path, props) {
|
|
53
|
-
return
|
|
51
|
+
return /* @__PURE__ */ jsx(getRenderer(path), { ...props });
|
|
54
52
|
}
|
|
55
53
|
};
|
|
56
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","names":[
|
|
1
|
+
{"version":3,"file":"browser.js","names":[],"sources":["../../src/runtime/browser.tsx"],"sourcesContent":["import { type ReactNode, type FC, use } from 'react';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { DocCollection, DocsCollection } from '@/config/define';\nimport type { CompiledMDXProperties } from '@/loaders/mdx/build-mdx';\nimport type { InternalTypeConfig } from './types';\n\ntype CompiledMDXFile<\n Name extends string,\n Frontmatter,\n TC extends InternalTypeConfig,\n> = CompiledMDXProperties<Frontmatter> & TC['DocData'][Name] & Record<string, unknown>;\n\nexport interface ClientLoaderOptions<Doc, Props> {\n /**\n * Loader ID (usually your collection name)\n *\n * The code splitting strategy of frameworks like Tanstack Start may duplicate `createClientLoader()` into different chunks.\n *\n * We use loader ID to share cache between multiple instances of client loader.\n *\n * @defaultValue ''\n */\n id?: string;\n\n component: (loaded: Doc, props: Props) => ReactNode;\n}\n\nexport interface ClientLoader<Doc, Props> {\n preload: (path: string) => Promise<Doc>;\n /**\n * Get a component that renders content with `use()`.\n */\n getComponent: (path: string) => FC<Props>;\n /**\n * Get react nodes that renders content, wraps `<Suspense>` by default.\n */\n useContent: undefined extends Props\n ? (path: string, props?: Props) => ReactNode\n : (path: string, props: Props) => ReactNode;\n}\n\nexport type BrowserCreate<Config, TC extends InternalTypeConfig> = ReturnType<\n typeof browser<Config, TC>\n>;\n\nexport interface DocCollectionEntry<\n Name extends string = string,\n Frontmatter = unknown,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> {\n raw: Record<string, () => Promise<CompiledMDXFile<Name, Frontmatter, TC>>>;\n\n createClientLoader: <Props extends object | undefined = undefined>(\n options: ClientLoaderOptions<CompiledMDXFile<Name, Frontmatter, TC>, Props>,\n ) => ClientLoader<CompiledMDXFile<Name, Frontmatter, TC>, Props>;\n}\n\nexport function browser<Config, TC extends InternalTypeConfig>() {\n return {\n doc<Name extends keyof Config & string>(\n _name: Name,\n glob: Record<string, () => Promise<unknown>>,\n ) {\n const out: DocCollectionEntry = {\n raw: glob as DocCollectionEntry['raw'],\n createClientLoader({ id = _name as string, ...options }) {\n return createClientLoader(this.raw, { id, ...options });\n },\n };\n\n return out as Config[Name] extends DocCollection<infer Schema> | DocsCollection<infer Schema>\n ? DocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC>\n : never;\n },\n };\n}\n\nconst loaderStore = new Map<\n string,\n {\n preloaded: Map<string, CompiledMDXProperties>;\n }\n>();\n\nexport function createClientLoader<\n Doc = CompiledMDXProperties,\n Props extends object | undefined = undefined,\n>(\n globEntries: Record<string, () => Promise<Doc>>,\n options: ClientLoaderOptions<Doc, Props>,\n): ClientLoader<Doc, Props> {\n const { id = '', component: useRenderer } = options;\n const renderers: Record<string, FC<Props>> = {};\n const loaders = new Map<string, () => Promise<Doc>>();\n const store = loaderStore.get(id) ?? {\n preloaded: new Map(),\n };\n loaderStore.set(id, store);\n\n for (const k in globEntries) {\n loaders.set(k.startsWith('./') ? k.slice(2) : k, globEntries[k]);\n }\n\n function getLoader(path: string) {\n const loader = loaders.get(path);\n if (!loader)\n throw new Error(`[createClientLoader] ${path} does not exist in available entries`);\n return loader;\n }\n\n function getRenderer(path: string): FC<Props> {\n if (path in renderers) return renderers[path];\n\n let promise: Promise<Doc> | undefined;\n function Renderer(props: Props) {\n let doc = store.preloaded.get(path);\n doc ??= use((promise ??= getLoader(path)()));\n\n return useRenderer(doc, props);\n }\n\n return (renderers[path] = Renderer);\n }\n\n return {\n async preload(path) {\n const loaded = await getLoader(path)();\n store.preloaded.set(path, loaded);\n return loaded;\n },\n getComponent(path) {\n return getRenderer(path);\n },\n useContent(path: string, props: Props & object) {\n const Comp = getRenderer(path);\n return <Comp {...props} />;\n },\n } as ClientLoader<Doc, Props>;\n}\n"],"mappings":";;;;AAyDA,SAAgB,UAAiD;AAC/D,QAAO,EACL,IACE,OACA,MACA;AAQA,SAPgC;GAC9B,KAAK;GACL,mBAAmB,EAAE,KAAK,OAAiB,GAAG,WAAW;AACvD,WAAO,mBAAmB,KAAK,KAAK;KAAE;KAAI,GAAG;KAAS,CAAC;;GAE1D;IAMJ;;AAGH,MAAM,8BAAc,IAAI,KAKrB;AAEH,SAAgB,mBAId,aACA,SAC0B;CAC1B,MAAM,EAAE,KAAK,IAAI,WAAW,gBAAgB;CAC5C,MAAM,YAAuC,EAAE;CAC/C,MAAM,0BAAU,IAAI,KAAiC;CACrD,MAAM,QAAQ,YAAY,IAAI,GAAG,IAAI,EACnC,2BAAW,IAAI,KAAK,EACrB;AACD,aAAY,IAAI,IAAI,MAAM;AAE1B,MAAK,MAAM,KAAK,YACd,SAAQ,IAAI,EAAE,WAAW,KAAK,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,YAAY,GAAG;CAGlE,SAAS,UAAU,MAAc;EAC/B,MAAM,SAAS,QAAQ,IAAI,KAAK;AAChC,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,wBAAwB,KAAK,sCAAsC;AACrF,SAAO;;CAGT,SAAS,YAAY,MAAyB;AAC5C,MAAI,QAAQ,UAAW,QAAO,UAAU;EAExC,IAAI;EACJ,SAAS,SAAS,OAAc;GAC9B,IAAI,MAAM,MAAM,UAAU,IAAI,KAAK;AACnC,WAAQ,IAAK,YAAY,UAAU,KAAK,EAAE,CAAE;AAE5C,UAAO,YAAY,KAAK,MAAM;;AAGhC,SAAQ,UAAU,QAAQ;;AAG5B,QAAO;EACL,MAAM,QAAQ,MAAM;GAClB,MAAM,SAAS,MAAM,UAAU,KAAK,EAAE;AACtC,SAAM,UAAU,IAAI,MAAM,OAAO;AACjC,UAAO;;EAET,aAAa,MAAM;AACjB,UAAO,YAAY,KAAK;;EAE1B,WAAW,MAAc,OAAuB;AAE9C,UAAO,oBADM,YAAY,KAAK,IACjB,GAAI,QAAS;;EAE7B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as ServerOptions, M as DocCollection, N as DocsCollection, _ as AsyncDocCollectionEntry, r as CoreOptions, v as AsyncDocsCollectionEntry } from "../core-
|
|
1
|
+
import { C as ServerOptions, M as DocCollection, N as DocsCollection, _ as AsyncDocCollectionEntry, r as CoreOptions, v as AsyncDocsCollectionEntry } from "../core-O3WLuY_I.js";
|
|
2
2
|
import { i as InternalTypeConfig, r as FileInfo } from "../types-B6myALSk.js";
|
|
3
3
|
import * as _standard_schema_spec0 from "@standard-schema/spec";
|
|
4
4
|
import * as fumadocs_core_source0 from "fumadocs-core/source";
|
package/dist/runtime/dynamic.js
CHANGED
|
@@ -4,7 +4,7 @@ import { t as buildConfig } from "../build-BTTNEFmV.js";
|
|
|
4
4
|
import { n as createCore } from "../core-DjldE3H9.js";
|
|
5
5
|
import "../codegen-DleOVLNr.js";
|
|
6
6
|
import "../remark-include-D3G3mAnv.js";
|
|
7
|
-
import { t as buildMDX } from "../build-mdx-
|
|
7
|
+
import { t as buildMDX } from "../build-mdx-Blq7ZKoM.js";
|
|
8
8
|
import { server } from "./server.js";
|
|
9
9
|
import fs from "node:fs/promises";
|
|
10
10
|
import { pathToFileURL } from "node:url";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic.js","names":[
|
|
1
|
+
{"version":3,"file":"dynamic.js","names":[],"sources":["../../src/runtime/dynamic.ts"],"sourcesContent":["import { buildConfig, type DocCollectionItem } from '@/config/build';\nimport { buildMDX, type CompiledMDXProperties } from '@/loaders/mdx/build-mdx';\nimport { executeMdx } from '@fumadocs/mdx-remote/client';\nimport { pathToFileURL } from 'node:url';\nimport { fumaMatter } from '@/utils/fuma-matter';\nimport fs from 'node:fs/promises';\nimport { server, type ServerOptions } from './server';\nimport { type CoreOptions, createCore } from '@/core';\nimport type { FileInfo, InternalTypeConfig } from './types';\n\nexport interface LazyEntry<Data = unknown> {\n info: FileInfo;\n data: Data;\n\n hash?: string;\n}\n\nexport type CreateDynamic<Config, TC extends InternalTypeConfig = InternalTypeConfig> = ReturnType<\n typeof dynamic<Config, TC>\n>;\n\nexport async function dynamic<Config, TC extends InternalTypeConfig>(\n configExports: Config,\n coreOptions: CoreOptions,\n serverOptions?: ServerOptions,\n) {\n const core = createCore(coreOptions);\n await core.init({\n config: buildConfig(configExports as Record<string, unknown>),\n });\n\n const create = server<Config, TC>(serverOptions);\n\n function getDocCollection(name: string): DocCollectionItem | undefined {\n const collection = core.getCollection(name);\n if (!collection) return;\n\n if (collection.type === 'docs') return collection.docs;\n else if (collection.type === 'doc') return collection;\n }\n\n function convertLazyEntries(collection: DocCollectionItem, entries: LazyEntry[]) {\n const head: Record<string, () => unknown> = {};\n const body: Record<string, () => Promise<unknown>> = {};\n\n async function compile({ info, data }: LazyEntry<unknown>) {\n let content = (await fs.readFile(info.fullPath)).toString();\n content = fumaMatter(content).content;\n\n const compiled = await buildMDX(core, collection, {\n filePath: info.fullPath,\n source: content,\n frontmatter: data as Record<string, unknown>,\n isDevelopment: false,\n environment: 'runtime',\n });\n\n return (await executeMdx(String(compiled.value), {\n baseUrl: pathToFileURL(info.fullPath),\n })) as CompiledMDXProperties;\n }\n\n for (const entry of entries) {\n head[entry.info.path] = () => entry.data;\n let cachedResult: Promise<CompiledMDXProperties> | undefined;\n body[entry.info.path] = () => (cachedResult ??= compile(entry));\n }\n\n return { head, body };\n }\n\n return {\n async doc<Name extends keyof Config & string>(\n name: Name,\n base: string,\n entries: LazyEntry<unknown>[],\n ) {\n const collection = getDocCollection(name as string);\n if (!collection) throw new Error(`the doc collection ${name as string} doesn't exist.`);\n\n const { head, body } = convertLazyEntries(collection, entries);\n\n return create.docLazy(name, base, head, body);\n },\n async docs<Name extends keyof Config & string>(\n name: Name,\n base: string,\n meta: Record<string, unknown>,\n entries: LazyEntry<unknown>[],\n ) {\n const collection = getDocCollection(name as string);\n if (!collection) throw new Error(`the doc collection ${name as string} doesn't exist.`);\n\n const docs = convertLazyEntries(collection, entries);\n return create.docsLazy(name, base, meta, docs.head, docs.body);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAqBA,eAAsB,QACpB,eACA,aACA,eACA;CACA,MAAM,OAAO,WAAW,YAAY;AACpC,OAAM,KAAK,KAAK,EACd,QAAQ,YAAY,cAAyC,EAC9D,CAAC;CAEF,MAAM,SAAS,OAAmB,cAAc;CAEhD,SAAS,iBAAiB,MAA6C;EACrE,MAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,MAAI,CAAC,WAAY;AAEjB,MAAI,WAAW,SAAS,OAAQ,QAAO,WAAW;WACzC,WAAW,SAAS,MAAO,QAAO;;CAG7C,SAAS,mBAAmB,YAA+B,SAAsB;EAC/E,MAAM,OAAsC,EAAE;EAC9C,MAAM,OAA+C,EAAE;EAEvD,eAAe,QAAQ,EAAE,MAAM,QAA4B;GACzD,IAAI,WAAW,MAAM,GAAG,SAAS,KAAK,SAAS,EAAE,UAAU;AAC3D,aAAU,WAAW,QAAQ,CAAC;GAE9B,MAAM,WAAW,MAAM,SAAS,MAAM,YAAY;IAChD,UAAU,KAAK;IACf,QAAQ;IACR,aAAa;IACb,eAAe;IACf,aAAa;IACd,CAAC;AAEF,UAAQ,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE,EAC/C,SAAS,cAAc,KAAK,SAAS,EACtC,CAAC;;AAGJ,OAAK,MAAM,SAAS,SAAS;AAC3B,QAAK,MAAM,KAAK,cAAc,MAAM;GACpC,IAAI;AACJ,QAAK,MAAM,KAAK,cAAe,iBAAiB,QAAQ,MAAM;;AAGhE,SAAO;GAAE;GAAM;GAAM;;AAGvB,QAAO;EACL,MAAM,IACJ,MACA,MACA,SACA;GACA,MAAM,aAAa,iBAAiB,KAAe;AACnD,OAAI,CAAC,WAAY,OAAM,IAAI,MAAM,sBAAsB,KAAe,iBAAiB;GAEvF,MAAM,EAAE,MAAM,SAAS,mBAAmB,YAAY,QAAQ;AAE9D,UAAO,OAAO,QAAQ,MAAM,MAAM,MAAM,KAAK;;EAE/C,MAAM,KACJ,MACA,MACA,MACA,SACA;GACA,MAAM,aAAa,iBAAiB,KAAe;AACnD,OAAI,CAAC,WAAY,OAAM,IAAI,MAAM,sBAAsB,KAAe,iBAAiB;GAEvF,MAAM,OAAO,mBAAmB,YAAY,QAAQ;AACpD,UAAO,OAAO,SAAS,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK;;EAEjE"}
|
package/dist/runtime/server.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as ServerOptions, S as ServerCreate, T as toFumadocsSource, _ as AsyncDocCollectionEntry, b as DocsCollectionEntry, v as AsyncDocsCollectionEntry, w as server, x as MetaCollectionEntry, y as DocCollectionEntry } from "../core-
|
|
1
|
+
import { C as ServerOptions, S as ServerCreate, T as toFumadocsSource, _ as AsyncDocCollectionEntry, b as DocsCollectionEntry, v as AsyncDocsCollectionEntry, w as server, x as MetaCollectionEntry, y as DocCollectionEntry } from "../core-O3WLuY_I.js";
|
|
2
2
|
export { AsyncDocCollectionEntry, AsyncDocsCollectionEntry, DocCollectionEntry, DocsCollectionEntry, MetaCollectionEntry, ServerCreate, ServerOptions, server, toFumadocsSource };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["path","data: DocData","data: CompiledMDXProperties","files: VirtualFile<{\n pageData: Page;\n metaData: Meta;\n }>[]"],"sources":["../../src/runtime/server.ts"],"sourcesContent":["import type { MetaData, PageData, Source, VirtualFile } from 'fumadocs-core/source';\nimport * as path from 'node:path';\nimport type { DocCollection, DocsCollection, MetaCollection } from '@/config';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { CompiledMDXProperties } from '@/loaders/mdx/build-mdx';\nimport type { InternalTypeConfig, DocData, DocMethods, FileInfo, MetaMethods } from './types';\n\nexport type MetaCollectionEntry<Data> = Data & MetaMethods;\n\nexport type DocCollectionEntry<\n Name extends string = string,\n Frontmatter = unknown,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> = DocData & DocMethods & Frontmatter & TC['DocData'][Name];\n\nexport type AsyncDocCollectionEntry<\n Name extends string = string,\n Frontmatter = unknown,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> = {\n load: () => Promise<DocData & TC['DocData'][Name]>;\n} & DocMethods &\n Frontmatter;\n\nexport interface DocsCollectionEntry<\n Name extends string = string,\n Frontmatter extends PageData = PageData,\n Meta extends MetaData = MetaData,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> {\n docs: DocCollectionEntry<Name, Frontmatter, TC>[];\n meta: MetaCollectionEntry<Meta>[];\n toFumadocsSource: () => Source<{\n pageData: DocCollectionEntry<Name, Frontmatter, TC>;\n metaData: MetaCollectionEntry<Meta>;\n }>;\n}\n\nexport interface AsyncDocsCollectionEntry<\n Name extends string = string,\n Frontmatter extends PageData = PageData,\n Meta extends MetaData = MetaData,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> {\n docs: AsyncDocCollectionEntry<Name, Frontmatter, TC>[];\n meta: MetaCollectionEntry<Meta>[];\n toFumadocsSource: () => Source<{\n pageData: AsyncDocCollectionEntry<Name, Frontmatter, TC>;\n metaData: MetaCollectionEntry<Meta>;\n }>;\n}\n\ntype AwaitableGlobEntries<T> = Record<string, T | (() => Promise<T>)>;\n\nexport type ServerCreate<Config, TC extends InternalTypeConfig = InternalTypeConfig> = ReturnType<\n typeof server<Config, TC>\n>;\n\nexport interface ServerOptions {\n doc?: {\n passthroughs?: string[];\n };\n}\n\nexport function server<Config, TC extends InternalTypeConfig>(options: ServerOptions = {}) {\n const { doc: { passthroughs: docPassthroughs = [] } = {} } = options;\n\n function fileInfo(file: string, base: string): FileInfo {\n if (file.startsWith('./')) {\n file = file.slice(2);\n }\n\n return {\n path: file,\n fullPath: path.join(base, file),\n };\n }\n\n function mapDocData(entry: CompiledMDXProperties): DocData {\n const data: DocData = {\n body: entry.default,\n toc: entry.toc,\n structuredData: entry.structuredData,\n _exports: entry as unknown as Record<string, unknown>,\n };\n\n for (const key of docPassthroughs) {\n // @ts-expect-error -- handle passthrough properties\n data[key] = entry[key];\n }\n\n return data;\n }\n\n return {\n async doc<Name extends keyof Config & string>(\n _name: Name,\n base: string,\n glob: AwaitableGlobEntries<unknown>,\n ) {\n const out = await Promise.all(\n Object.entries(glob).map(async ([k, v]) => {\n const data: CompiledMDXProperties = typeof v === 'function' ? await v() : v;\n\n return {\n ...mapDocData(data),\n ...(data.frontmatter as object),\n ...createDocMethods(fileInfo(k, base), () => data),\n } satisfies DocCollectionEntry;\n }),\n );\n\n return out as unknown as Config[Name] extends\n | DocCollection<infer Schema>\n | DocsCollection<infer Schema>\n ? DocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC>[]\n : never;\n },\n async docLazy<Name extends keyof Config & string>(\n _name: Name,\n base: string,\n head: AwaitableGlobEntries<unknown>,\n body: Record<string, () => Promise<unknown>>,\n ) {\n const out = await Promise.all(\n Object.entries(head).map(async ([k, v]) => {\n const data = typeof v === 'function' ? await v() : v;\n const content = body[k] as () => Promise<CompiledMDXProperties>;\n\n return {\n ...data,\n ...createDocMethods(fileInfo(k, base), content),\n async load() {\n return mapDocData(await content());\n },\n } satisfies AsyncDocCollectionEntry;\n }),\n );\n\n return out as unknown as Config[Name] extends\n | DocCollection<infer Schema>\n | DocsCollection<infer Schema>\n ? AsyncDocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC>[]\n : never;\n },\n async meta<Name extends keyof Config & string>(\n _name: Name,\n base: string,\n glob: AwaitableGlobEntries<unknown>,\n ) {\n const out = await Promise.all(\n Object.entries(glob).map(async ([k, v]) => {\n const data = typeof v === 'function' ? await v() : v;\n\n return {\n info: fileInfo(k, base),\n ...data,\n } satisfies MetaCollectionEntry<unknown>;\n }),\n );\n\n return out as unknown as Config[Name] extends\n | MetaCollection<infer Schema>\n | DocsCollection<StandardSchemaV1, infer Schema>\n ? MetaCollectionEntry<StandardSchemaV1.InferOutput<Schema>>[]\n : never;\n },\n\n async docs<Name extends keyof Config & string>(\n name: Name,\n base: string,\n metaGlob: AwaitableGlobEntries<unknown>,\n docGlob: AwaitableGlobEntries<unknown>,\n ) {\n const entry = {\n docs: await this.doc(name, base, docGlob),\n meta: await this.meta(name, base, metaGlob),\n toFumadocsSource() {\n return toFumadocsSource(this.docs, this.meta);\n },\n } satisfies DocsCollectionEntry;\n\n return entry as Config[Name] extends DocsCollection<infer Page, infer Meta>\n ? StandardSchemaV1.InferOutput<Page> extends PageData\n ? StandardSchemaV1.InferOutput<Meta> extends MetaData\n ? DocsCollectionEntry<\n Name,\n StandardSchemaV1.InferOutput<Page>,\n StandardSchemaV1.InferOutput<Meta>,\n TC\n >\n : never\n : never\n : never;\n },\n async docsLazy<Name extends keyof Config & string>(\n name: Name,\n base: string,\n metaGlob: AwaitableGlobEntries<unknown>,\n docHeadGlob: AwaitableGlobEntries<unknown>,\n docBodyGlob: Record<string, () => Promise<unknown>>,\n ) {\n const entry = {\n docs: await this.docLazy(name, base, docHeadGlob, docBodyGlob),\n meta: await this.meta(name, base, metaGlob),\n toFumadocsSource() {\n return toFumadocsSource(this.docs, this.meta);\n },\n } satisfies AsyncDocsCollectionEntry;\n\n return entry as Config[Name] extends DocsCollection<infer Page, infer Meta>\n ? StandardSchemaV1.InferOutput<Page> extends PageData\n ? StandardSchemaV1.InferOutput<Meta> extends MetaData\n ? AsyncDocsCollectionEntry<\n Name,\n StandardSchemaV1.InferOutput<Page>,\n StandardSchemaV1.InferOutput<Meta>,\n TC\n >\n : never\n : never\n : never;\n },\n };\n}\n\nexport function toFumadocsSource<\n Page extends DocMethods & PageData,\n Meta extends MetaMethods & MetaData,\n>(\n pages: Page[],\n metas: Meta[],\n): Source<{\n pageData: Page;\n metaData: Meta;\n}> {\n const files: VirtualFile<{\n pageData: Page;\n metaData: Meta;\n }>[] = [];\n\n for (const entry of pages) {\n files.push({\n type: 'page',\n path: entry.info.path,\n absolutePath: entry.info.fullPath,\n data: entry,\n });\n }\n\n for (const entry of metas) {\n files.push({\n type: 'meta',\n path: entry.info.path,\n absolutePath: entry.info.fullPath,\n data: entry,\n });\n }\n\n return {\n files,\n };\n}\n\nfunction createDocMethods(\n info: FileInfo,\n load: () => CompiledMDXProperties | Promise<CompiledMDXProperties>,\n): DocMethods {\n return {\n info,\n async getText(type) {\n if (type === 'raw') {\n const fs = await import('node:fs/promises');\n\n return (await fs.readFile(info.fullPath)).toString();\n }\n\n const data = await load();\n if (typeof data._markdown !== 'string')\n throw new Error(\n \"getText('processed') requires `includeProcessedMarkdown` to be enabled in your collection config.\",\n );\n return data._markdown;\n },\n async getMDAST() {\n const data = await load();\n\n if (!data._mdast)\n throw new Error(\n 'getMDAST() requires `includeMDAST` to be enabled in your collection config.',\n );\n return JSON.parse(data._mdast);\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":["path"],"sources":["../../src/runtime/server.ts"],"sourcesContent":["import type { MetaData, PageData, Source, VirtualFile } from 'fumadocs-core/source';\nimport * as path from 'node:path';\nimport type { DocCollection, DocsCollection, MetaCollection } from '@/config';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { CompiledMDXProperties } from '@/loaders/mdx/build-mdx';\nimport type { InternalTypeConfig, DocData, DocMethods, FileInfo, MetaMethods } from './types';\n\nexport type MetaCollectionEntry<Data> = Data & MetaMethods;\n\nexport type DocCollectionEntry<\n Name extends string = string,\n Frontmatter = unknown,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> = DocData & DocMethods & Frontmatter & TC['DocData'][Name];\n\nexport type AsyncDocCollectionEntry<\n Name extends string = string,\n Frontmatter = unknown,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> = {\n load: () => Promise<DocData & TC['DocData'][Name]>;\n} & DocMethods &\n Frontmatter;\n\nexport interface DocsCollectionEntry<\n Name extends string = string,\n Frontmatter extends PageData = PageData,\n Meta extends MetaData = MetaData,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> {\n docs: DocCollectionEntry<Name, Frontmatter, TC>[];\n meta: MetaCollectionEntry<Meta>[];\n toFumadocsSource: () => Source<{\n pageData: DocCollectionEntry<Name, Frontmatter, TC>;\n metaData: MetaCollectionEntry<Meta>;\n }>;\n}\n\nexport interface AsyncDocsCollectionEntry<\n Name extends string = string,\n Frontmatter extends PageData = PageData,\n Meta extends MetaData = MetaData,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> {\n docs: AsyncDocCollectionEntry<Name, Frontmatter, TC>[];\n meta: MetaCollectionEntry<Meta>[];\n toFumadocsSource: () => Source<{\n pageData: AsyncDocCollectionEntry<Name, Frontmatter, TC>;\n metaData: MetaCollectionEntry<Meta>;\n }>;\n}\n\ntype AwaitableGlobEntries<T> = Record<string, T | (() => Promise<T>)>;\n\nexport type ServerCreate<Config, TC extends InternalTypeConfig = InternalTypeConfig> = ReturnType<\n typeof server<Config, TC>\n>;\n\nexport interface ServerOptions {\n doc?: {\n passthroughs?: string[];\n };\n}\n\nexport function server<Config, TC extends InternalTypeConfig>(options: ServerOptions = {}) {\n const { doc: { passthroughs: docPassthroughs = [] } = {} } = options;\n\n function fileInfo(file: string, base: string): FileInfo {\n if (file.startsWith('./')) {\n file = file.slice(2);\n }\n\n return {\n path: file,\n fullPath: path.join(base, file),\n };\n }\n\n function mapDocData(entry: CompiledMDXProperties): DocData {\n const data: DocData = {\n body: entry.default,\n toc: entry.toc,\n structuredData: entry.structuredData,\n _exports: entry as unknown as Record<string, unknown>,\n };\n\n for (const key of docPassthroughs) {\n // @ts-expect-error -- handle passthrough properties\n data[key] = entry[key];\n }\n\n return data;\n }\n\n return {\n async doc<Name extends keyof Config & string>(\n _name: Name,\n base: string,\n glob: AwaitableGlobEntries<unknown>,\n ) {\n const out = await Promise.all(\n Object.entries(glob).map(async ([k, v]) => {\n const data: CompiledMDXProperties = typeof v === 'function' ? await v() : v;\n\n return {\n ...mapDocData(data),\n ...(data.frontmatter as object),\n ...createDocMethods(fileInfo(k, base), () => data),\n } satisfies DocCollectionEntry;\n }),\n );\n\n return out as unknown as Config[Name] extends\n | DocCollection<infer Schema>\n | DocsCollection<infer Schema>\n ? DocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC>[]\n : never;\n },\n async docLazy<Name extends keyof Config & string>(\n _name: Name,\n base: string,\n head: AwaitableGlobEntries<unknown>,\n body: Record<string, () => Promise<unknown>>,\n ) {\n const out = await Promise.all(\n Object.entries(head).map(async ([k, v]) => {\n const data = typeof v === 'function' ? await v() : v;\n const content = body[k] as () => Promise<CompiledMDXProperties>;\n\n return {\n ...data,\n ...createDocMethods(fileInfo(k, base), content),\n async load() {\n return mapDocData(await content());\n },\n } satisfies AsyncDocCollectionEntry;\n }),\n );\n\n return out as unknown as Config[Name] extends\n | DocCollection<infer Schema>\n | DocsCollection<infer Schema>\n ? AsyncDocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC>[]\n : never;\n },\n async meta<Name extends keyof Config & string>(\n _name: Name,\n base: string,\n glob: AwaitableGlobEntries<unknown>,\n ) {\n const out = await Promise.all(\n Object.entries(glob).map(async ([k, v]) => {\n const data = typeof v === 'function' ? await v() : v;\n\n return {\n info: fileInfo(k, base),\n ...data,\n } satisfies MetaCollectionEntry<unknown>;\n }),\n );\n\n return out as unknown as Config[Name] extends\n | MetaCollection<infer Schema>\n | DocsCollection<StandardSchemaV1, infer Schema>\n ? MetaCollectionEntry<StandardSchemaV1.InferOutput<Schema>>[]\n : never;\n },\n\n async docs<Name extends keyof Config & string>(\n name: Name,\n base: string,\n metaGlob: AwaitableGlobEntries<unknown>,\n docGlob: AwaitableGlobEntries<unknown>,\n ) {\n const entry = {\n docs: await this.doc(name, base, docGlob),\n meta: await this.meta(name, base, metaGlob),\n toFumadocsSource() {\n return toFumadocsSource(this.docs, this.meta);\n },\n } satisfies DocsCollectionEntry;\n\n return entry as Config[Name] extends DocsCollection<infer Page, infer Meta>\n ? StandardSchemaV1.InferOutput<Page> extends PageData\n ? StandardSchemaV1.InferOutput<Meta> extends MetaData\n ? DocsCollectionEntry<\n Name,\n StandardSchemaV1.InferOutput<Page>,\n StandardSchemaV1.InferOutput<Meta>,\n TC\n >\n : never\n : never\n : never;\n },\n async docsLazy<Name extends keyof Config & string>(\n name: Name,\n base: string,\n metaGlob: AwaitableGlobEntries<unknown>,\n docHeadGlob: AwaitableGlobEntries<unknown>,\n docBodyGlob: Record<string, () => Promise<unknown>>,\n ) {\n const entry = {\n docs: await this.docLazy(name, base, docHeadGlob, docBodyGlob),\n meta: await this.meta(name, base, metaGlob),\n toFumadocsSource() {\n return toFumadocsSource(this.docs, this.meta);\n },\n } satisfies AsyncDocsCollectionEntry;\n\n return entry as Config[Name] extends DocsCollection<infer Page, infer Meta>\n ? StandardSchemaV1.InferOutput<Page> extends PageData\n ? StandardSchemaV1.InferOutput<Meta> extends MetaData\n ? AsyncDocsCollectionEntry<\n Name,\n StandardSchemaV1.InferOutput<Page>,\n StandardSchemaV1.InferOutput<Meta>,\n TC\n >\n : never\n : never\n : never;\n },\n };\n}\n\nexport function toFumadocsSource<\n Page extends DocMethods & PageData,\n Meta extends MetaMethods & MetaData,\n>(\n pages: Page[],\n metas: Meta[],\n): Source<{\n pageData: Page;\n metaData: Meta;\n}> {\n const files: VirtualFile<{\n pageData: Page;\n metaData: Meta;\n }>[] = [];\n\n for (const entry of pages) {\n files.push({\n type: 'page',\n path: entry.info.path,\n absolutePath: entry.info.fullPath,\n data: entry,\n });\n }\n\n for (const entry of metas) {\n files.push({\n type: 'meta',\n path: entry.info.path,\n absolutePath: entry.info.fullPath,\n data: entry,\n });\n }\n\n return {\n files,\n };\n}\n\nfunction createDocMethods(\n info: FileInfo,\n load: () => CompiledMDXProperties | Promise<CompiledMDXProperties>,\n): DocMethods {\n return {\n info,\n async getText(type) {\n if (type === 'raw') {\n const fs = await import('node:fs/promises');\n\n return (await fs.readFile(info.fullPath)).toString();\n }\n\n const data = await load();\n if (typeof data._markdown !== 'string')\n throw new Error(\n \"getText('processed') requires `includeProcessedMarkdown` to be enabled in your collection config.\",\n );\n return data._markdown;\n },\n async getMDAST() {\n const data = await load();\n\n if (!data._mdast)\n throw new Error(\n 'getMDAST() requires `includeMDAST` to be enabled in your collection config.',\n );\n return JSON.parse(data._mdast);\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/vite/index.d.ts
CHANGED
package/dist/vite/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import "../fuma-matter-CHgJa_-B.js";
|
|
2
|
-
import { t as createMdxLoader } from "../mdx-
|
|
2
|
+
import { t as createMdxLoader } from "../mdx-CPnL-Edm.js";
|
|
3
3
|
import "../preset-gmDZnBcg.js";
|
|
4
4
|
import { t as buildConfig } from "../build-BTTNEFmV.js";
|
|
5
5
|
import { n as createCore, r as ValidationError, t as _Defaults } from "../core-DjldE3H9.js";
|
|
6
6
|
import "../codegen-DleOVLNr.js";
|
|
7
|
-
import { a as createIntegratedConfigLoader, r as toVite } from "../adapter-
|
|
8
|
-
import { t as createMetaLoader } from "../meta-
|
|
7
|
+
import { a as createIntegratedConfigLoader, r as toVite } from "../adapter-DI4cexsC.js";
|
|
8
|
+
import { t as createMetaLoader } from "../meta-BKBx8Gab.js";
|
|
9
9
|
import { t as indexFile } from "../index-file-D9HsrWU_.js";
|
|
10
10
|
import { mergeConfig } from "vite";
|
|
11
11
|
|
package/dist/webpack/mdx.d.ts
CHANGED
package/dist/webpack/mdx.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "../fuma-matter-CHgJa_-B.js";
|
|
2
|
-
import { t as createMdxLoader } from "../mdx-
|
|
2
|
+
import { t as createMdxLoader } from "../mdx-CPnL-Edm.js";
|
|
3
3
|
import "../core-DjldE3H9.js";
|
|
4
4
|
import "../codegen-DleOVLNr.js";
|
|
5
|
-
import { i as toWebpack, o as createStandaloneConfigLoader } from "../adapter-
|
|
5
|
+
import { i as toWebpack, o as createStandaloneConfigLoader } from "../adapter-DI4cexsC.js";
|
|
6
6
|
import { t as getCore } from "../webpack--VSEE6Zp.js";
|
|
7
7
|
|
|
8
8
|
//#region src/webpack/mdx.ts
|
package/dist/webpack/mdx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdx.js","names":[
|
|
1
|
+
{"version":3,"file":"mdx.js","names":[],"sources":["../../src/webpack/mdx.ts"],"sourcesContent":["import { type LoaderContext } from 'webpack';\nimport { createMdxLoader } from '@/loaders/mdx';\nimport { toWebpack, type WebpackLoader } from '@/loaders/adapter';\nimport { createStandaloneConfigLoader } from '@/loaders/config';\nimport { getCore, type WebpackLoaderOptions } from '@/webpack';\n\nlet instance: WebpackLoader | undefined;\n\nexport default async function loader(\n this: LoaderContext<WebpackLoaderOptions>,\n source: string,\n callback: LoaderContext<WebpackLoaderOptions>['callback'],\n): Promise<void> {\n const options = this.getOptions();\n this.cacheable(true);\n this.addDependency(options.absoluteCompiledConfigPath);\n\n if (!instance) {\n instance = toWebpack(\n createMdxLoader(\n createStandaloneConfigLoader({\n core: getCore(options),\n buildConfig: false,\n mode: options.isDev ? 'dev' : 'production',\n }),\n ),\n );\n }\n\n await instance.call(this, source, callback);\n}\n"],"mappings":";;;;;;;;AAMA,IAAI;AAEJ,eAA8B,OAE5B,QACA,UACe;CACf,MAAM,UAAU,KAAK,YAAY;AACjC,MAAK,UAAU,KAAK;AACpB,MAAK,cAAc,QAAQ,2BAA2B;AAEtD,KAAI,CAAC,SACH,YAAW,UACT,gBACE,6BAA6B;EAC3B,MAAM,QAAQ,QAAQ;EACtB,aAAa;EACb,MAAM,QAAQ,QAAQ,QAAQ;EAC/B,CAAC,CACH,CACF;AAGH,OAAM,SAAS,KAAK,MAAM,QAAQ,SAAS"}
|
package/dist/webpack/meta.d.ts
CHANGED
package/dist/webpack/meta.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../core-DjldE3H9.js";
|
|
2
2
|
import "../codegen-DleOVLNr.js";
|
|
3
|
-
import { i as toWebpack, o as createStandaloneConfigLoader } from "../adapter-
|
|
4
|
-
import { t as createMetaLoader } from "../meta-
|
|
3
|
+
import { i as toWebpack, o as createStandaloneConfigLoader } from "../adapter-DI4cexsC.js";
|
|
4
|
+
import { t as createMetaLoader } from "../meta-BKBx8Gab.js";
|
|
5
5
|
import { t as getCore } from "../webpack--VSEE6Zp.js";
|
|
6
6
|
|
|
7
7
|
//#region src/webpack/meta.ts
|
package/dist/webpack/meta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","names":[
|
|
1
|
+
{"version":3,"file":"meta.js","names":[],"sources":["../../src/webpack/meta.ts"],"sourcesContent":["import { type LoaderContext } from 'webpack';\nimport { toWebpack, type WebpackLoader } from '@/loaders/adapter';\nimport { createStandaloneConfigLoader } from '@/loaders/config';\nimport { createMetaLoader } from '@/loaders/meta';\nimport { getCore, type WebpackLoaderOptions } from '@/webpack';\n\nlet instance: WebpackLoader | undefined;\n\nexport default async function loader(\n this: LoaderContext<WebpackLoaderOptions>,\n source: string,\n callback: LoaderContext<WebpackLoaderOptions>['callback'],\n): Promise<void> {\n const options = this.getOptions();\n this.cacheable(true);\n this.addDependency(options.absoluteCompiledConfigPath);\n\n if (!instance) {\n instance = toWebpack(\n createMetaLoader(\n createStandaloneConfigLoader({\n core: getCore(options),\n buildConfig: false,\n mode: options.isDev ? 'dev' : 'production',\n }),\n {\n json: 'json',\n yaml: 'js',\n },\n ),\n );\n }\n\n await instance.call(this, source, callback);\n}\n"],"mappings":";;;;;;;AAMA,IAAI;AAEJ,eAA8B,OAE5B,QACA,UACe;CACf,MAAM,UAAU,KAAK,YAAY;AACjC,MAAK,UAAU,KAAK;AACpB,MAAK,cAAc,QAAQ,2BAA2B;AAEtD,KAAI,CAAC,SACH,YAAW,UACT,iBACE,6BAA6B;EAC3B,MAAM,QAAQ,QAAQ;EACtB,aAAa;EACb,MAAM,QAAQ,QAAQ,QAAQ;EAC/B,CAAC,EACF;EACE,MAAM;EACN,MAAM;EACP,CACF,CACF;AAGH,OAAM,SAAS,KAAK,MAAM,QAAQ,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webpack--VSEE6Zp.js","names":[
|
|
1
|
+
{"version":3,"file":"webpack--VSEE6Zp.js","names":[],"sources":["../src/webpack/index.ts"],"sourcesContent":["import { type Core, createCore } from '@/core';\n\nexport interface WebpackLoaderOptions {\n absoluteCompiledConfigPath: string;\n configPath: string;\n outDir: string;\n isDev: boolean;\n}\n\nlet core: Core;\n\nexport function getCore(options: WebpackLoaderOptions) {\n return (core ??= createCore({\n environment: 'webpack',\n outDir: options.outDir,\n configPath: options.configPath,\n }));\n}\n"],"mappings":";;;AASA,IAAI;AAEJ,SAAgB,QAAQ,SAA+B;AACrD,QAAQ,SAAS,WAAW;EAC1B,aAAa;EACb,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACrB,CAAC"}
|