fuma-content 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/async-cache-C47yxLCv.js +0 -2
  2. package/dist/bin.js +0 -2
  3. package/dist/{build-mdx-C8u32vDa.js → build-mdx-DjMJg3TP.js} +1 -3
  4. package/dist/bun/index.d.ts +2 -3
  5. package/dist/bun/index.js +0 -2
  6. package/dist/{bun-NahDFkhR.js → bun-qVjHRKNw.js} +0 -2
  7. package/dist/code-generator-DFGEY6P5.js +0 -2
  8. package/dist/collections/data/runtime.d.ts +3 -4
  9. package/dist/collections/data/runtime.js +0 -2
  10. package/dist/collections/data.d.ts +4 -5
  11. package/dist/collections/data.js +2 -4
  12. package/dist/collections/fs.d.ts +1 -1
  13. package/dist/collections/fs.js +0 -2
  14. package/dist/collections/index.d.ts +1 -1
  15. package/dist/collections/json/loader-webpack.d.ts +2 -3
  16. package/dist/collections/json/loader-webpack.js +1 -5
  17. package/dist/collections/mdx/loader-webpack.d.ts +2 -3
  18. package/dist/collections/mdx/loader-webpack.js +1 -5
  19. package/dist/collections/mdx/react.d.ts +3 -4
  20. package/dist/collections/mdx/react.js +0 -2
  21. package/dist/collections/mdx/runtime-browser.d.ts +2 -2
  22. package/dist/collections/mdx/runtime-browser.js +0 -2
  23. package/dist/collections/mdx/runtime-dynamic.d.ts +5 -6
  24. package/dist/collections/mdx/runtime-dynamic.js +3 -6
  25. package/dist/collections/mdx/runtime.d.ts +1 -1
  26. package/dist/collections/mdx/runtime.js +0 -2
  27. package/dist/collections/mdx/vue.d.ts +7 -8
  28. package/dist/collections/mdx/vue.js +0 -2
  29. package/dist/collections/mdx.d.ts +1 -1
  30. package/dist/collections/mdx.js +1 -3
  31. package/dist/collections/obsidian.d.ts +2 -3
  32. package/dist/collections/obsidian.js +3 -6
  33. package/dist/collections/runtime/file-store.d.ts +1 -1
  34. package/dist/collections/runtime/file-store.js +0 -2
  35. package/dist/collections/runtime/store.d.ts +1 -1
  36. package/dist/collections/runtime/store.js +0 -2
  37. package/dist/collections/yaml/loader-webpack.d.ts +2 -3
  38. package/dist/collections/yaml/loader-webpack.js +1 -5
  39. package/dist/collections-Bl9hpWMS.js +0 -2
  40. package/dist/config/index.d.ts +1 -1
  41. package/dist/config/index.js +0 -2
  42. package/dist/core-CrYszxmc.js +0 -2
  43. package/dist/{core-BbTeLenA.d.ts → core-Dmd3yqUH.d.ts} +1 -2
  44. package/dist/{dynamic-CNEaikCN.d.ts → dynamic-C15fv7uG.d.ts} +2 -3
  45. package/dist/dynamic.d.ts +1 -1
  46. package/dist/dynamic.js +1 -3
  47. package/dist/{file-store-DutRtol_.d.ts → file-store-Bs81Afz5.d.ts} +2 -3
  48. package/dist/{flatten-m0wfHxLH.js → flatten-Db7WzTB7.js} +0 -2
  49. package/dist/{fs-KJjb32Nq.d.ts → fs-DYfoYdl-.d.ts} +2 -3
  50. package/dist/{git-BxnPg5Ao.d.ts → git-C0-Uazuh.d.ts} +2 -3
  51. package/dist/{index-DVqrqxzl.d.ts → index-Dfg2QKTT.d.ts} +3 -4
  52. package/dist/index.d.ts +2 -3
  53. package/dist/is-promise-like-C04ERo2r.js +0 -2
  54. package/dist/{load-from-file-C3CnD8mJ.js → load-from-file-DpW8who8.js} +0 -2
  55. package/dist/{loader-ol04zeoP.js → loader-B19JQedw.js} +0 -2
  56. package/dist/{loader-CyhM9SLt.js → loader-BTPxE-0W.js} +3 -5
  57. package/dist/{loader-e2SkeDfY.js → loader-CORy1xd9.js} +1 -3
  58. package/dist/{loader-D_sKOzDc.js → loader-DJcLC5Gg.js} +1 -3
  59. package/dist/{mdx-L0I8mePE.d.ts → mdx-0plToRQa.d.ts} +3 -4
  60. package/dist/next/index.d.ts +2 -3
  61. package/dist/next/index.js +1 -3
  62. package/dist/node/index.d.ts +1 -2
  63. package/dist/node/index.js +0 -2
  64. package/dist/node/loader.d.ts +2 -3
  65. package/dist/node/loader.js +0 -2
  66. package/dist/{node-Du4i4XDg.js → node--IKK4_8Y.js} +0 -2
  67. package/dist/plugins/git.d.ts +1 -1
  68. package/dist/plugins/git.js +0 -2
  69. package/dist/plugins/json-schema.d.ts +2 -3
  70. package/dist/plugins/json-schema.js +0 -2
  71. package/dist/plugins/loader/index.d.ts +1 -1
  72. package/dist/plugins/loader/index.js +3 -5
  73. package/dist/plugins/loader/webpack.d.ts +1 -1
  74. package/dist/plugins/loader/webpack.js +0 -2
  75. package/dist/plugins/remark/include.d.ts +1 -2
  76. package/dist/plugins/remark/include.js +4 -5
  77. package/dist/{runtime-TETi5Giq.d.ts → runtime-4S3BDs-G.d.ts} +5 -6
  78. package/dist/{runtime-browser-M4sE6SmL.d.ts → runtime-browser-CXjm3FXK.d.ts} +4 -6
  79. package/dist/{store-BC3n1VPY.d.ts → store-j10gHjm1.d.ts} +2 -3
  80. package/dist/utils/frontmatter.d.ts +15 -0
  81. package/dist/{fuma-matter-E30PU53R.js → utils/frontmatter.js} +3 -5
  82. package/dist/validation-Bf_v2L3p.js +0 -2
  83. package/dist/vite/index.d.ts +2 -3
  84. package/dist/vite/index.js +1 -3
  85. package/dist/{vite-DVIOnBqW.js → vite-myuLielb.js} +0 -2
  86. package/package.json +24 -20
  87. package/dist/async-cache-C47yxLCv.js.map +0 -1
  88. package/dist/bin.js.map +0 -1
  89. package/dist/build-mdx-C8u32vDa.js.map +0 -1
  90. package/dist/bun/index.d.ts.map +0 -1
  91. package/dist/bun/index.js.map +0 -1
  92. package/dist/bun-NahDFkhR.js.map +0 -1
  93. package/dist/code-generator-DFGEY6P5.js.map +0 -1
  94. package/dist/collections/data/runtime.d.ts.map +0 -1
  95. package/dist/collections/data/runtime.js.map +0 -1
  96. package/dist/collections/data.d.ts.map +0 -1
  97. package/dist/collections/data.js.map +0 -1
  98. package/dist/collections/fs.js.map +0 -1
  99. package/dist/collections/json/loader-webpack.d.ts.map +0 -1
  100. package/dist/collections/json/loader-webpack.js.map +0 -1
  101. package/dist/collections/mdx/loader-webpack.d.ts.map +0 -1
  102. package/dist/collections/mdx/loader-webpack.js.map +0 -1
  103. package/dist/collections/mdx/react.d.ts.map +0 -1
  104. package/dist/collections/mdx/react.js.map +0 -1
  105. package/dist/collections/mdx/runtime-browser.js.map +0 -1
  106. package/dist/collections/mdx/runtime-dynamic.d.ts.map +0 -1
  107. package/dist/collections/mdx/runtime-dynamic.js.map +0 -1
  108. package/dist/collections/mdx/runtime.js.map +0 -1
  109. package/dist/collections/mdx/vue.d.ts.map +0 -1
  110. package/dist/collections/mdx/vue.js.map +0 -1
  111. package/dist/collections/mdx.js.map +0 -1
  112. package/dist/collections/obsidian.d.ts.map +0 -1
  113. package/dist/collections/obsidian.js.map +0 -1
  114. package/dist/collections/runtime/file-store.js.map +0 -1
  115. package/dist/collections/runtime/store.js.map +0 -1
  116. package/dist/collections/yaml/loader-webpack.d.ts.map +0 -1
  117. package/dist/collections/yaml/loader-webpack.js.map +0 -1
  118. package/dist/collections-Bl9hpWMS.js.map +0 -1
  119. package/dist/config/index.js.map +0 -1
  120. package/dist/core-BbTeLenA.d.ts.map +0 -1
  121. package/dist/core-CrYszxmc.js.map +0 -1
  122. package/dist/dynamic-CNEaikCN.d.ts.map +0 -1
  123. package/dist/dynamic.js.map +0 -1
  124. package/dist/file-store-DutRtol_.d.ts.map +0 -1
  125. package/dist/flatten-m0wfHxLH.js.map +0 -1
  126. package/dist/fs-KJjb32Nq.d.ts.map +0 -1
  127. package/dist/fuma-matter-E30PU53R.js.map +0 -1
  128. package/dist/git-BxnPg5Ao.d.ts.map +0 -1
  129. package/dist/index-DVqrqxzl.d.ts.map +0 -1
  130. package/dist/index.d.ts.map +0 -1
  131. package/dist/is-promise-like-C04ERo2r.js.map +0 -1
  132. package/dist/load-from-file-C3CnD8mJ.js.map +0 -1
  133. package/dist/loader-CyhM9SLt.js.map +0 -1
  134. package/dist/loader-D_sKOzDc.js.map +0 -1
  135. package/dist/loader-e2SkeDfY.js.map +0 -1
  136. package/dist/loader-ol04zeoP.js.map +0 -1
  137. package/dist/mdx-L0I8mePE.d.ts.map +0 -1
  138. package/dist/next/index.d.ts.map +0 -1
  139. package/dist/next/index.js.map +0 -1
  140. package/dist/node/index.d.ts.map +0 -1
  141. package/dist/node/index.js.map +0 -1
  142. package/dist/node/loader.d.ts.map +0 -1
  143. package/dist/node/loader.js.map +0 -1
  144. package/dist/node-Du4i4XDg.js.map +0 -1
  145. package/dist/plugins/git.js.map +0 -1
  146. package/dist/plugins/json-schema.d.ts.map +0 -1
  147. package/dist/plugins/json-schema.js.map +0 -1
  148. package/dist/plugins/loader/index.js.map +0 -1
  149. package/dist/plugins/loader/webpack.js.map +0 -1
  150. package/dist/plugins/remark/include.d.ts.map +0 -1
  151. package/dist/plugins/remark/include.js.map +0 -1
  152. package/dist/runtime-TETi5Giq.d.ts.map +0 -1
  153. package/dist/runtime-browser-M4sE6SmL.d.ts.map +0 -1
  154. package/dist/store-BC3n1VPY.d.ts.map +0 -1
  155. package/dist/validation-Bf_v2L3p.js.map +0 -1
  156. package/dist/vite/index.d.ts.map +0 -1
  157. package/dist/vite/index.js.map +0 -1
  158. package/dist/vite-DVIOnBqW.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"fs.js","names":["#filesCache","#patterns","#matcher"],"sources":["../../src/collections/fs.ts"],"sourcesContent":["import picomatch from \"picomatch\";\nimport path from \"node:path\";\nimport { Collection } from \".\";\nimport { createCache } from \"@/utils/async-cache\";\n\nexport class FileSystemCollection extends Collection {\n #matcher: picomatch.Matcher | undefined;\n /**\n * content directory (absolute)\n */\n dir: string;\n readonly #filesCache = createCache<string[]>();\n /** the glob patterns to match files in collection, this doesn't take `supportedFormats` into account. */\n readonly #patterns: string[];\n readonly supportedFileFormats: string[] | undefined;\n\n constructor(config: FileSystemCollectionConfig) {\n super();\n const { files, supportedFormats } = config;\n this.dir = config.dir;\n this.#patterns = files ?? [supportedFormats ? `**/*.{${supportedFormats.join(\",\")}}` : `**/*`];\n this.supportedFileFormats = supportedFormats;\n this.onInit.hook(({ core }) => {\n this.dir = path.resolve(core.getOptions().cwd, this.dir);\n });\n this.onServer.hook(({ server }) => {\n if (!server.watcher) return;\n server.watcher.add(this.dir);\n server.watcher.on(\"all\", (event, file) => {\n if (event === \"change\" || !this.hasFile(file)) return;\n this.#filesCache.invalidate(\"\");\n });\n });\n }\n\n isFileSupported(filePath: string) {\n if (!this.supportedFileFormats) return true;\n return this.supportedFileFormats.some((format) => filePath.endsWith(`.${format}`));\n }\n\n /**\n * get all included files, relative to `dir`.\n *\n * the result is cached.\n */\n async getFiles() {\n return this.#filesCache.cached(\"\", async () => {\n const { glob } = await import(\"tinyglobby\");\n\n const out = await glob(this.#patterns, { cwd: this.dir });\n return out.filter((v) => this.isFileSupported(v));\n });\n }\n\n hasFile(filePath: string) {\n if (!this.isFileSupported(filePath)) return false;\n\n const relativePath = path.relative(this.dir, filePath);\n if (relativePath.startsWith(`..${path.sep}`)) return false;\n\n return (this.#matcher ??= picomatch(this.#patterns))(relativePath);\n }\n\n invalidateCache() {\n this.#filesCache.invalidate(\"\");\n }\n}\n\nexport interface FileSystemCollectionConfig {\n /**\n * Directory to scan\n */\n dir: string;\n\n /**\n * what files to include/exclude (glob patterns)\n *\n * Include all files if not specified\n */\n files?: string[];\n\n /**\n * Restrict to a list of file extensions to include, e.g. `['js', 'ts']`.\n */\n supportedFormats?: string[];\n}\n\nexport function fileSystemCollection(config: FileSystemCollectionConfig) {\n return new FileSystemCollection(config);\n}\n"],"mappings":";;;;;AAKA,IAAa,uBAAb,cAA0C,WAAW;CACnD;;;;CAIA;CACA,cAAuB,aAAuB;;CAE9C;CACA;CAEA,YAAY,QAAoC;AAC9C,SAAO;EACP,MAAM,EAAE,OAAO,qBAAqB;AACpC,OAAK,MAAM,OAAO;AAClB,QAAA,WAAiB,SAAS,CAAC,mBAAmB,SAAS,iBAAiB,KAAK,IAAI,CAAC,KAAK,OAAO;AAC9F,OAAK,uBAAuB;AAC5B,OAAK,OAAO,MAAM,EAAE,WAAW;AAC7B,QAAK,MAAM,KAAK,QAAQ,KAAK,YAAY,CAAC,KAAK,KAAK,IAAI;IACxD;AACF,OAAK,SAAS,MAAM,EAAE,aAAa;AACjC,OAAI,CAAC,OAAO,QAAS;AACrB,UAAO,QAAQ,IAAI,KAAK,IAAI;AAC5B,UAAO,QAAQ,GAAG,QAAQ,OAAO,SAAS;AACxC,QAAI,UAAU,YAAY,CAAC,KAAK,QAAQ,KAAK,CAAE;AAC/C,UAAA,WAAiB,WAAW,GAAG;KAC/B;IACF;;CAGJ,gBAAgB,UAAkB;AAChC,MAAI,CAAC,KAAK,qBAAsB,QAAO;AACvC,SAAO,KAAK,qBAAqB,MAAM,WAAW,SAAS,SAAS,IAAI,SAAS,CAAC;;;;;;;CAQpF,MAAM,WAAW;AACf,SAAO,MAAA,WAAiB,OAAO,IAAI,YAAY;GAC7C,MAAM,EAAE,SAAS,MAAM,OAAO;AAG9B,WADY,MAAM,KAAK,MAAA,UAAgB,EAAE,KAAK,KAAK,KAAK,CAAC,EAC9C,QAAQ,MAAM,KAAK,gBAAgB,EAAE,CAAC;IACjD;;CAGJ,QAAQ,UAAkB;AACxB,MAAI,CAAC,KAAK,gBAAgB,SAAS,CAAE,QAAO;EAE5C,MAAM,eAAe,KAAK,SAAS,KAAK,KAAK,SAAS;AACtD,MAAI,aAAa,WAAW,KAAK,KAAK,MAAM,CAAE,QAAO;AAErD,UAAQ,MAAA,YAAkB,UAAU,MAAA,SAAe,EAAE,aAAa;;CAGpE,kBAAkB;AAChB,QAAA,WAAiB,WAAW,GAAG;;;AAuBnC,SAAgB,qBAAqB,QAAoC;AACvE,QAAO,IAAI,qBAAqB,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-webpack.d.ts","names":[],"sources":["../../../src/collections/json/loader-webpack.ts"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-webpack.js","names":[],"sources":["../../../src/collections/json/loader-webpack.ts"],"sourcesContent":["import { createWebpackLoader } from \"@/plugins/loader/webpack\";\nimport { createJsonLoader } from \"./loader\";\n\nexport default createWebpackLoader((core) => createJsonLoader(core, \"json\"));\n"],"mappings":";;;;;AAGA,IAAA,yBAAe,qBAAqB,SAAS,iBAAiB,MAAM,OAAO,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-webpack.d.ts","names":[],"sources":["../../../src/collections/mdx/loader-webpack.ts"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-webpack.js","names":[],"sources":["../../../src/collections/mdx/loader-webpack.ts"],"sourcesContent":["import { createMdxLoader } from \"@/collections/mdx/loader\";\nimport { createWebpackLoader } from \"@/plugins/loader/webpack\";\n\nexport default createWebpackLoader(createMdxLoader);\n"],"mappings":";;;;;AAGA,IAAA,yBAAe,oBAAoB,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"react.d.ts","names":[],"sources":["../../../src/collections/mdx/react.ts"],"mappings":";;;;;;;;;;iBAkBgB,WAAA,uBAAA,CACd,KAAA,EAAO,mBAAA,CAAoB,WAAA,EAAa,QAAA,eACxC,QAAA,GAAW,IAAA,EAAM,WAAA,CAAY,WAAA,IAAe,QAAA,KAAa,SAAA,GACxD,SAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"react.js","names":[],"sources":["../../../src/collections/mdx/react.ts"],"sourcesContent":["import { ReactNode, lazy, createElement } from \"react\";\nimport { CompiledMDX } from \"./build-mdx\";\nimport { MDXStoreBrowserData } from \"./runtime-browser\";\nimport { isPromiseLike } from \"@/utils/is-promise-like\";\n\nconst renderMap = new Map<\n string,\n {\n renderJSX: () => ReactNode;\n forceOnDemand: boolean;\n }\n>();\n\n/**\n * Renders content (loaded lazily).\n *\n * It is recommended to use with `<Suspense />`.\n */\nexport function useRenderer<Frontmatter, Attached>(\n entry: MDXStoreBrowserData<Frontmatter, Attached> | undefined,\n renderFn: (data: CompiledMDX<Frontmatter> & Attached) => ReactNode,\n): ReactNode {\n if (!entry) return null;\n const renderKey = `${entry._store.storeId}:${entry.id}`;\n let renderInfo = renderMap.get(renderKey);\n\n if (!renderInfo) {\n const OnDemand = lazy(async () => {\n const loaded = await entry.preload();\n return { default: () => renderFn(loaded) };\n });\n\n renderInfo = {\n forceOnDemand: false,\n renderJSX() {\n const v = entry.preload();\n if (!isPromiseLike(v) && !this.forceOnDemand) {\n return renderFn(v);\n }\n\n // ensure it won't unmount React lazy during re-renders\n this.forceOnDemand = true;\n return createElement(OnDemand);\n },\n };\n renderMap.set(renderKey, renderInfo);\n }\n\n return renderInfo.renderJSX();\n}\n"],"mappings":";;;AAKA,MAAM,4BAAY,IAAI,KAMnB;;;;;;AAOH,SAAgB,YACd,OACA,UACW;AACX,KAAI,CAAC,MAAO,QAAO;CACnB,MAAM,YAAY,GAAG,MAAM,OAAO,QAAQ,GAAG,MAAM;CACnD,IAAI,aAAa,UAAU,IAAI,UAAU;AAEzC,KAAI,CAAC,YAAY;EACf,MAAM,WAAW,KAAK,YAAY;GAChC,MAAM,SAAS,MAAM,MAAM,SAAS;AACpC,UAAO,EAAE,eAAe,SAAS,OAAO,EAAE;IAC1C;AAEF,eAAa;GACX,eAAe;GACf,YAAY;IACV,MAAM,IAAI,MAAM,SAAS;AACzB,QAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,cAC7B,QAAO,SAAS,EAAE;AAIpB,SAAK,gBAAgB;AACrB,WAAO,cAAc,SAAS;;GAEjC;AACD,YAAU,IAAI,WAAW,WAAW;;AAGtC,QAAO,WAAW,WAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-browser.js","names":[],"sources":["../../../src/collections/mdx/runtime-browser.ts"],"sourcesContent":["\"use client\";\n\nimport type { Awaitable, GetCollectionConfig } from \"@/types\";\nimport { MapCollectionStore } from \"@/collections/runtime/store\";\nimport { type AsyncCache, createCache } from \"@/utils/async-cache\";\nimport type { CompiledMDX } from \"@/collections/mdx/build-mdx\";\n\nexport interface MDXStoreBrowserData<Frontmatter, Attached = unknown> {\n id: string;\n preload: () => Awaitable<CompiledMDX<Frontmatter> & Attached>;\n _store: StoreContext;\n}\n\ninterface StoreContext {\n storeId: string;\n}\n\ninterface StoreData {\n preloaded: AsyncCache<CompiledMDX>;\n}\n\ntype GetFrontmatter<Config, Name extends string> =\n GetCollectionConfig<Config, Name> extends { $inferFrontmatter: unknown }\n ? GetCollectionConfig<Config, Name>[\"$inferFrontmatter\"]\n : never;\n\nexport const _internal_data = new Map<string, StoreData>();\n\nexport function mdxStoreBrowser<Config, Name extends string, Attached>(\n name: Name,\n _input: Record<string, () => Promise<unknown>>,\n): MapCollectionStore<string, MDXStoreBrowserData<GetFrontmatter<Config, Name>, Attached>> {\n const input = _input as Record<\n string,\n () => Promise<CompiledMDX<GetFrontmatter<Config, Name>> & Attached>\n >;\n const merged = new Map<string, MDXStoreBrowserData<GetFrontmatter<Config, Name>, Attached>>();\n function getStoreData(): StoreData {\n let store = _internal_data.get(name);\n if (store) return store;\n\n store = {\n preloaded: createCache(),\n };\n _internal_data.set(name, store);\n return store;\n }\n\n const context: StoreContext = {\n storeId: name,\n };\n\n for (const [key, value] of Object.entries(input)) {\n merged.set(key, {\n id: key,\n preload() {\n return getStoreData()\n .preloaded.$value<CompiledMDX<GetFrontmatter<Config, Name>> & Attached>()\n .cached(key, value);\n },\n _store: context,\n });\n }\n\n return new MapCollectionStore(merged);\n}\n\nexport type { WithGit } from \"./runtime\";\n"],"mappings":";;;;AA0BA,MAAa,iCAAiB,IAAI,KAAwB;AAE1D,SAAgB,gBACd,MACA,QACyF;CACzF,MAAM,QAAQ;CAId,MAAM,yBAAS,IAAI,KAA0E;CAC7F,SAAS,eAA0B;EACjC,IAAI,QAAQ,eAAe,IAAI,KAAK;AACpC,MAAI,MAAO,QAAO;AAElB,UAAQ,EACN,WAAW,aAAa,EACzB;AACD,iBAAe,IAAI,MAAM,MAAM;AAC/B,SAAO;;CAGT,MAAM,UAAwB,EAC5B,SAAS,MACV;AAED,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,QAAO,IAAI,KAAK;EACd,IAAI;EACJ,UAAU;AACR,UAAO,cAAc,CAClB,UAAU,QAA8D,CACxE,OAAO,KAAK,MAAM;;EAEvB,QAAQ;EACT,CAAC;AAGJ,QAAO,IAAI,mBAAmB,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-dynamic.d.ts","names":[],"sources":["../../../src/collections/mdx/runtime-dynamic.ts"],"mappings":";;;;;;;UAYiB,mBAAA;EACf,EAAA;EACA,WAAA,EAAa,WAAA;EACb,OAAA,QAAe,OAAA,CAAQ,WAAA,CAAY,WAAA,IAAe,QAAA;AAAA;AAAA,KAK/C,cAAA,gCACH,mBAAA,CAAoB,MAAA,EAAQ,IAAA;EAAgB,iBAAA;AAAA,IACxC,mBAAA,CAAoB,MAAA,EAAQ,IAAA;AAAA,iBAGZ,eAAA,uCAAA,CACpB,MAAA,EAAQ,MAAA,EACR,WAAA,EAAa,WAAA,EACb,IAAA,EAAM,IAAA,EACN,IAAA,UACA,YAAA,EAAc,MAAA,mBACd,UAAA,YACC,OAAA,CAAQ,mBAAA,CAAoB,mBAAA,CAAoB,cAAA,CAAe,MAAA,EAAQ,IAAA,GAAO,QAAA;AAAA,KAsDrE,UAAA,GAAa,UAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-dynamic.js","names":[],"sources":["../../../src/collections/mdx/runtime-dynamic.ts"],"sourcesContent":["import { buildMDX, type CompiledMDX } from \"@/collections/mdx/build-mdx\";\nimport { pathToFileURL } from \"node:url\";\nimport { fumaMatter } from \"@/collections/mdx/fuma-matter\";\nimport fs from \"node:fs/promises\";\nimport { type CoreOptions, Core } from \"@/core\";\nimport type { MDXContent } from \"mdx/types\";\nimport { FileCollectionStore } from \"@/collections/runtime/file-store\";\nimport type { GetCollectionConfig } from \"@/types\";\nimport { MDXCollection } from \"@/collections/mdx\";\nimport path from \"node:path\";\nimport { createCache } from \"@/utils/async-cache\";\n\nexport interface MDXStoreDynamicData<Frontmatter, Attached = unknown> {\n id: string;\n frontmatter: Frontmatter;\n compile: () => Promise<CompiledMDX<Frontmatter> & Attached>;\n}\n\nlet corePromise: Promise<Core>;\n\ntype GetFrontmatter<Config, Name extends string> =\n GetCollectionConfig<Config, Name> extends { $inferFrontmatter: unknown }\n ? GetCollectionConfig<Config, Name>[\"$inferFrontmatter\"]\n : never;\n\nexport async function mdxStoreDynamic<Config, Name extends string, Attached>(\n config: Config,\n coreOptions: CoreOptions,\n name: Name,\n base: string,\n _frontmatter: Record<string, unknown>,\n jsxRuntime: unknown,\n): Promise<FileCollectionStore<MDXStoreDynamicData<GetFrontmatter<Config, Name>, Attached>>> {\n corePromise ??= (async () => {\n const core = new Core(coreOptions);\n await core.init({\n config: config as Record<string, unknown>,\n });\n return core;\n })();\n const core = await corePromise;\n const frontmatter = _frontmatter as Record<string, GetFrontmatter<Config, Name>>;\n const collection = core.getCollection(name);\n if (!collection || !(collection instanceof MDXCollection))\n throw new Error(\"invalid collection name\");\n\n const merged: Record<string, MDXStoreDynamicData<GetFrontmatter<Config, Name>, Attached>> = {};\n const cache = createCache<CompiledMDX<GetFrontmatter<Config, Name>> & Attached>();\n\n for (const [k, v] of Object.entries(frontmatter)) {\n merged[k] = {\n id: k,\n frontmatter: v,\n async compile() {\n return cache.cached(k, async () => {\n const filePath = path.join(base, k);\n let content = (await fs.readFile(filePath)).toString();\n content = fumaMatter(content).content;\n\n const compiled = await buildMDX({\n core,\n collection,\n filePath,\n source: content,\n frontmatter: v as unknown as Record<string, unknown>,\n isDevelopment: false,\n environment: \"runtime\",\n compiler: {\n collection,\n core,\n addDependency() {},\n },\n });\n\n return (await executeMdx(String(compiled.value), {\n baseUrl: pathToFileURL(filePath),\n jsxRuntime,\n })) as CompiledMDX<GetFrontmatter<Config, Name>> & Attached;\n });\n },\n };\n }\n\n return new FileCollectionStore(base, merged);\n}\n\nexport type MdxContent = MDXContent;\n\ninterface Options {\n scope?: Record<string, unknown>;\n baseUrl?: string | URL;\n jsxRuntime?: unknown;\n}\n\nconst AsyncFunction: new (...args: string[]) => (...args: unknown[]) => Promise<unknown> =\n Object.getPrototypeOf(executeMdx).constructor;\n\nasync function executeMdx(compiled: string, options: Options = {}) {\n const { opts: scopeOpts, ...scope } = options.scope ?? {};\n const fullScope = {\n opts: {\n ...(scopeOpts as object),\n ...(options.jsxRuntime as object),\n baseUrl: options.baseUrl,\n },\n ...scope,\n };\n\n const hydrateFn = new AsyncFunction(...Object.keys(fullScope), compiled);\n return (await hydrateFn.apply(hydrateFn, Object.values(fullScope))) as {\n default: MdxContent;\n };\n}\n\nexport type { WithGit } from \"./runtime\";\n"],"mappings":";;;;;;;;;;;AAkBA,IAAI;AAOJ,eAAsB,gBACpB,QACA,aACA,MACA,MACA,cACA,YAC2F;AAC3F,kBAAiB,YAAY;EAC3B,MAAM,OAAO,IAAI,KAAK,YAAY;AAClC,QAAM,KAAK,KAAK,EACN,QACT,CAAC;AACF,SAAO;KACL;CACJ,MAAM,OAAO,MAAM;CACnB,MAAM,cAAc;CACpB,MAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,KAAI,CAAC,cAAc,EAAE,sBAAsB,eACzC,OAAM,IAAI,MAAM,0BAA0B;CAE5C,MAAM,SAAsF,EAAE;CAC9F,MAAM,QAAQ,aAAmE;AAEjF,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,YAAY,CAC9C,QAAO,KAAK;EACV,IAAI;EACJ,aAAa;EACb,MAAM,UAAU;AACd,UAAO,MAAM,OAAO,GAAG,YAAY;IACjC,MAAM,WAAW,KAAK,KAAK,MAAM,EAAE;IACnC,IAAI,WAAW,MAAM,GAAG,SAAS,SAAS,EAAE,UAAU;AACtD,cAAU,WAAW,QAAQ,CAAC;IAE9B,MAAM,WAAW,MAAM,SAAS;KAC9B;KACA;KACA;KACA,QAAQ;KACR,aAAa;KACb,eAAe;KACf,aAAa;KACb,UAAU;MACR;MACA;MACA,gBAAgB;MACjB;KACF,CAAC;AAEF,WAAQ,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE;KAC/C,SAAS,cAAc,SAAS;KAChC;KACD,CAAC;KACF;;EAEL;AAGH,QAAO,IAAI,oBAAoB,MAAM,OAAO;;AAW9C,MAAM,gBACJ,OAAO,eAAe,WAAW,CAAC;AAEpC,eAAe,WAAW,UAAkB,UAAmB,EAAE,EAAE;CACjE,MAAM,EAAE,MAAM,WAAW,GAAG,UAAU,QAAQ,SAAS,EAAE;CACzD,MAAM,YAAY;EAChB,MAAM;GACJ,GAAI;GACJ,GAAI,QAAQ;GACZ,SAAS,QAAQ;GAClB;EACD,GAAG;EACJ;CAED,MAAM,YAAY,IAAI,cAAc,GAAG,OAAO,KAAK,UAAU,EAAE,SAAS;AACxE,QAAQ,MAAM,UAAU,MAAM,WAAW,OAAO,OAAO,UAAU,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime.js","names":[],"sources":["../../../src/collections/mdx/runtime.ts"],"sourcesContent":["import type { GetCollectionConfig } from \"@/types\";\nimport { FileCollectionStore } from \"@/collections/runtime/file-store\";\nimport type { GitFileData } from \"@/plugins/git\";\nimport type { CompiledMDX } from \"@/collections/mdx/build-mdx\";\n\nexport interface MDXStoreData<Frontmatter, Attached = unknown> {\n id: string;\n compiled: CompiledMDX<Frontmatter> & Attached;\n}\n\ntype GetFrontmatter<Config, Name extends string> =\n GetCollectionConfig<Config, Name> extends { $inferFrontmatter: unknown }\n ? GetCollectionConfig<Config, Name>[\"$inferFrontmatter\"]\n : never;\n\nexport function mdxStore<Config, Name extends string, Attached>(\n _name: Name,\n base: string,\n _input: Record<string, unknown>,\n): FileCollectionStore<MDXStoreData<GetFrontmatter<Config, Name>, Attached>> {\n const input = _input as Record<string, CompiledMDX<GetFrontmatter<Config, Name>> & Attached>;\n const merged: Record<string, MDXStoreData<GetFrontmatter<Config, Name>, Attached>> = {};\n\n for (const [key, value] of Object.entries(input)) {\n merged[key] = {\n id: key,\n compiled: value,\n };\n }\n\n return new FileCollectionStore(base, merged);\n}\n\nexport interface MDXStoreLazyData<Frontmatter, Attached> {\n id: string;\n frontmatter: Frontmatter;\n load: () => Promise<CompiledMDX<Frontmatter> & Attached>;\n}\n\nexport function mdxStoreLazy<Config, Name extends string, Attached>(\n _name: Name,\n base: string,\n _input: {\n head: Record<string, unknown>;\n body: Record<string, () => Promise<unknown>>;\n },\n): FileCollectionStore<MDXStoreLazyData<GetFrontmatter<Config, Name>, Attached>> {\n const input = _input as {\n head: Record<string, GetFrontmatter<Config, Name>>;\n body: Record<string, () => Promise<CompiledMDX<GetFrontmatter<Config, Name>> & Attached>>;\n };\n const merged: Record<string, MDXStoreLazyData<GetFrontmatter<Config, Name>, Attached>> = {};\n\n for (const [key, value] of Object.entries(input.head)) {\n merged[key] = {\n id: key,\n frontmatter: value,\n load: input.body[key],\n };\n }\n\n return new FileCollectionStore(base, merged);\n}\n\nexport type WithGit = GitFileData;\n"],"mappings":";;AAeA,SAAgB,SACd,OACA,MACA,QAC2E;CAC3E,MAAM,QAAQ;CACd,MAAM,SAA+E,EAAE;AAEvF,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,QAAO,OAAO;EACZ,IAAI;EACJ,UAAU;EACX;AAGH,QAAO,IAAI,oBAAoB,MAAM,OAAO;;AAS9C,SAAgB,aACd,OACA,MACA,QAI+E;CAC/E,MAAM,QAAQ;CAId,MAAM,SAAmF,EAAE;AAE3F,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,KAAK,CACnD,QAAO,OAAO;EACZ,IAAI;EACJ,aAAa;EACb,MAAM,MAAM,KAAK;EAClB;AAGH,QAAO,IAAI,oBAAoB,MAAM,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vue.d.ts","names":[],"sources":["../../../src/collections/mdx/vue.vue"],"mappings":";;;;;cA0DM,YAAA,oCACL,WAAA,EAAa,WAAA,CAAY,OAAA,QAAe,WAAA,aACxC,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,WAAA,CAAY,OAAA,QAAe,WAAA,kCAChE,aAAA,GAAgB,WAAA,CAAY,OAAA,QAAe,WAAA,cAC3C,WAAA,GAAA,OAAA;SAD2B,GAAA,CAwEN,WAAA,GAAc,mBAAA;YAjE1B,mBAAA,CAAoB,WAAA,EAAa,QAAA;EAAA,aAiE0C,UAAA;IAAqB,oBAAA;EAAA,IAAkC,CAAA;WAClI,OAAA;;;cA7DE,KAAA;MAAS,IAAA,EAAM,WAAA,CAAY,WAAA,IAAe,QAAA;IAAA;EAAA;;OAXrD,GAAA,CA8EyB,KAAA;EAAU,KAAA,GAAQ,OAAA,QAAe,WAAA;AAAA;AAAA,cAAW,QAAA,SAC1C,YAAA;AAAA,KACvB,mBAAA,OAA0B,CAAA,6BAA8B,CAAA,GAAI,CAAA,CAAE,CAAA,oBAAsB,CAAA,IAAK,CAAA,GAAI,CAAA,CAAE,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vue.js","names":[],"sources":["../../../src/collections/mdx/vue.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"Frontmatter, Attached = unknown\">\nimport { defineAsyncComponent, computed, markRaw, ref } from \"vue\";\nimport type { Component } from \"vue\";\nimport type { CompiledMDX } from \"./build-mdx\";\nimport type { MDXStoreBrowserData } from \"./runtime-browser\";\nimport { isPromiseLike } from \"@/utils/is-promise-like\";\n\ndefineOptions({\n name: \"Renderer\",\n});\n\nconst props = defineProps<{\n entry?: MDXStoreBrowserData<Frontmatter, Attached>;\n}>();\n\nconst slots = defineSlots<{\n default: (scope: { data: CompiledMDX<Frontmatter> & Attached }) => any;\n}>();\nlet dynamicComponent: Component | null = null;\n\nif (props.entry) {\n const entry = props.entry;\n const forceAsync = ref(false);\n\n const asyncComponent = defineAsyncComponent(async () => {\n const loaded = await entry.preload();\n return markRaw({\n render: () => slots.default?.({ data: loaded }) ?? null,\n });\n });\n\n dynamicComponent = computed(() => {\n const v = entry.preload();\n\n if (!isPromiseLike(v) && !forceAsync.value) {\n return markRaw({\n render: () => slots.default({ data: v }),\n });\n }\n\n forceAsync.value = true;\n return asyncComponent;\n });\n}\n</script>\n\n<template>\n <component :is=\"dynamicComponent\" />\n</template>\n"],"mappings":";;;;;;;;EAWA,MAAM,QAAQ;EAId,MAAM,QAAQ,UAEV;EACJ,IAAI,mBAAqC;AAEzC,MAAI,MAAM,OAAO;GACf,MAAM,QAAQ,MAAM;GACpB,MAAM,aAAa,IAAI,MAAM;GAE7B,MAAM,iBAAiB,qBAAqB,YAAY;IACtD,MAAM,SAAS,MAAM,MAAM,SAAS;AACpC,WAAO,QAAQ,EACb,cAAc,MAAM,UAAU,EAAE,MAAM,QAAQ,CAAC,IAAI,MACpD,CAAC;KACF;AAEF,sBAAmB,eAAe;IAChC,MAAM,IAAI,MAAM,SAAS;AAEzB,QAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,MACnC,QAAO,QAAQ,EACb,cAAc,MAAM,QAAQ,EAAE,MAAM,GAAG,CAAC,EACzC,CAAC;AAGJ,eAAW,QAAQ;AACnB,WAAO;KACP;;;uBAKF,YAAoC,wBAApB,MAAA,iBAAgB,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mdx.js","names":["#mdxOptions","#mdxOptionsCache","#onFrontmatter","#onServerHandler","#onEmitHandler","#onGitHandler"],"sources":["../../src/collections/mdx.ts"],"sourcesContent":["import type { Collection } from \"@/collections\";\nimport type { PostprocessOptions } from \"@/collections/mdx/remark-postprocess\";\nimport type { Core, CoreOptions } from \"@/core\";\nimport type { VFile } from \"vfile\";\nimport type { TurbopackLoaderOptions } from \"next/dist/server/config-shared\";\nimport type { Configuration } from \"webpack\";\nimport { LoaderConfig, loaderHook } from \"@/plugins/loader\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { CodeGenerator, slash } from \"@/utils/code-generator\";\nimport { validate } from \"@/utils/validation\";\nimport type { Awaitable } from \"@/types\";\nimport { asyncPipe, pipe } from \"@/utils/pipe\";\nimport { FileSystemCollection, FileSystemCollectionConfig } from \"./fs\";\nimport { GitHook, gitHook } from \"@/plugins/git\";\nimport path from \"node:path\";\nimport type { FumaContentProcessorOptions } from \"@/collections/mdx/build-mdx\";\nimport { type AsyncCache, createCache } from \"@/utils/async-cache\";\n\ninterface CompilationContext {\n collection: Collection;\n filePath: string;\n source: string;\n}\n\nexport interface MDXCollectionConfig<\n FrontmatterSchema extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined,\n> extends Omit<FileSystemCollectionConfig, \"supportedFormats\"> {\n postprocess?: Partial<PostprocessOptions>;\n frontmatter?: FrontmatterSchema;\n options?:\n | FumaContentProcessorOptions\n | ((environment: \"bundler\" | \"runtime\") => Awaitable<FumaContentProcessorOptions>);\n lazy?: boolean;\n dynamic?: boolean;\n}\n\nconst RuntimePaths = {\n browser: \"fuma-content/collections/mdx/runtime-browser\",\n dynamic: \"fuma-content/collections/mdx/runtime-dynamic\",\n server: \"fuma-content/collections/mdx/runtime\",\n};\n\ninterface InitializerCode {\n fn: string;\n typeParams: [config: string, name: string, attached: string];\n params: string[];\n}\n\nfunction formatInitializer(code: InitializerCode) {\n return `${code.fn}<${code.typeParams.join()}>(${code.params.join()})`;\n}\n\nexport class MDXCollection<\n FrontmatterSchema extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined,\n> extends FileSystemCollection {\n readonly dynamic: boolean;\n readonly lazy: boolean;\n readonly postprocess?: Partial<PostprocessOptions>;\n\n #mdxOptions?: MDXCollectionConfig[\"options\"];\n #mdxOptionsCache?: AsyncCache<FumaContentProcessorOptions>;\n async getMDXOptions(environment: \"bundler\" | \"runtime\"): Promise<FumaContentProcessorOptions> {\n const options = this.#mdxOptions;\n if (!options) return {};\n if (typeof options !== \"function\") return options;\n\n this.#mdxOptionsCache ??= createCache();\n return this.#mdxOptionsCache.cached(environment, () => options(environment));\n }\n /**\n * Frontmatter schema\n */\n frontmatterSchema?: FrontmatterSchema;\n /**\n * Transform & validate frontmatter\n */\n frontmatter = asyncPipe<Record<string, unknown> | undefined, CompilationContext>();\n /**\n * Transform `vfile` on compilation stage\n */\n vfile = asyncPipe<VFile, CompilationContext>();\n /**\n * Transform the generated initializer code (TypeScript) for collection store\n */\n storeInitializer = pipe<\n InitializerCode,\n {\n codegen: CodeGenerator;\n environment: \"browser\" | \"server\" | \"dynamic\";\n }\n >();\n\n $inferFrontmatter: FrontmatterSchema extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<FrontmatterSchema>\n : Record<string, unknown> = undefined as never;\n\n constructor(config: MDXCollectionConfig<FrontmatterSchema>) {\n super({\n dir: config.dir,\n files: config.files,\n supportedFormats: [\"md\", \"mdx\"],\n });\n this.postprocess = config.postprocess;\n this.#mdxOptions = config.options;\n this.dynamic = config.dynamic ?? false;\n this.lazy = config.lazy ?? false;\n this.frontmatterSchema = config.frontmatter;\n this.frontmatter.pipe(this.#onFrontmatter.bind(this));\n this.onServer.hook(this.#onServerHandler.bind(this));\n this.onEmit.pipe(this.#onEmitHandler.bind(this));\n this.pluginHook(loaderHook).loaders.push(mdxLoader());\n this.pluginHook(gitHook).onClient.hook(this.#onGitHandler.bind(this));\n\n const { processedMarkdown, linkReferences, mdast } = this.postprocess ?? {};\n\n if (processedMarkdown) {\n const { as = \"_markdown\" } = processedMarkdown === true ? {} : processedMarkdown;\n\n this.storeInitializer.pipe((code) => {\n code.typeParams[2] += ` & { /** Processed Markdown */ ${as}: string; }`;\n return code;\n });\n }\n\n if (mdast) {\n const { as = \"_mdast\" } = mdast === true ? {} : mdast;\n\n this.storeInitializer.pipe((code) => {\n code.typeParams[2] += ` & { /** MDAST (as JSON string) */ ${as}: string; }`;\n return code;\n });\n }\n\n if (linkReferences) {\n const { as = \"_linkReferences\" } = linkReferences === true ? {} : linkReferences;\n\n this.storeInitializer.pipe((code, { codegen }) => {\n codegen.addNamedImport([\"LinkReference\"], \"fuma-content/collections/mdx\", true);\n code.typeParams[2] += ` & { /** extracted link references (e.g. hrefs, paths), useful for analyzing relationships between pages. */ ${as}: LinkReference[] }`;\n return code;\n });\n }\n }\n\n #onFrontmatter: (typeof this.frontmatter)[\"$inferHandler\"] = (data, { filePath }) => {\n if (!this.frontmatterSchema) return data;\n\n return validate(\n this.frontmatterSchema,\n data,\n undefined,\n `invalid frontmatter in ${filePath}`,\n ) as Promise<Record<string, unknown>>;\n };\n\n #onServerHandler: (typeof this.onServer)[\"$inferHandler\"] = ({ server, core }) => {\n if (!server.watcher) return;\n\n server.watcher.on(\"all\", async (event, file) => {\n if (event === \"change\" && !this.dynamic) return;\n if (!this.hasFile(file)) return;\n\n await core.emit({\n filterCollection: (item) => item === this,\n filterWorkspace: () => false,\n write: true,\n });\n });\n };\n\n #onEmitHandler: (typeof this.onEmit)[\"$inferHandler\"] = async (\n entries,\n { core, createCodeGenerator },\n ) => {\n entries.push(\n await createCodeGenerator(`${this.name}.ts`, async ({ codegen }) => {\n const runtimePath = RuntimePaths.server;\n const base = slash(core._toRuntimePath(this.dir));\n let code: InitializerCode;\n codegen.addNamespaceImport(\n \"Config\",\n codegen.formatImportPath(core.getOptions().configPath),\n true,\n );\n\n if (this.lazy) {\n codegen.addNamedImport([\"mdxStoreLazy\"], runtimePath);\n const headGlob = await this.generateDocCollectionFrontmatterGlob(core, codegen, true);\n const bodyGlob = await this.generateDocCollectionGlob(core, codegen);\n\n code = {\n fn: \"mdxStoreLazy\",\n typeParams: [\"typeof Config\", `\"${this.name}\"`, \"unknown\"],\n params: [`\"${this.name}\"`, `\"${base}\"`, `{ head: ${headGlob}, body: ${bodyGlob} }`],\n };\n } else {\n codegen.addNamedImport([\"mdxStore\"], runtimePath);\n code = {\n fn: \"mdxStore\",\n typeParams: [\"typeof Config\", `\"${this.name}\"`, \"unknown\"],\n params: [\n `\"${this.name}\"`,\n `\"${base}\"`,\n await this.generateDocCollectionGlob(core, codegen, true),\n ],\n };\n }\n\n code = this.storeInitializer.run(code, {\n codegen,\n environment: \"server\",\n });\n codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);\n }),\n await createCodeGenerator(`${this.name}.browser.ts`, async ({ codegen }) => {\n const runtimePath = RuntimePaths.browser;\n codegen.addNamedImport([\"mdxStoreBrowser\"], runtimePath);\n codegen.addNamespaceImport(\n \"Config\",\n codegen.formatImportPath(core.getOptions().configPath),\n true,\n );\n\n let code: InitializerCode = {\n fn: `mdxStoreBrowser`,\n typeParams: [\"typeof Config\", `\"${this.name}\"`, \"unknown\"],\n params: [`\"${this.name}\"`, await this.generateDocCollectionGlob(core, codegen)],\n };\n code = this.storeInitializer.run(code, {\n codegen,\n environment: \"browser\",\n });\n codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);\n }),\n );\n if (this.dynamic)\n entries.push(\n await createCodeGenerator(`${this.name}.dynamic.ts`, async ({ codegen }) => {\n const coreOptions = core.getOptions();\n const runtimePath = RuntimePaths.dynamic;\n const base = slash(core._toRuntimePath(this.dir));\n codegen.addNamespaceImport(\"Config\", codegen.formatImportPath(coreOptions.configPath));\n codegen.addNamedImport([\"mdxStoreDynamic\"], runtimePath);\n\n const serializableCoreOptions: CoreOptions = {\n configPath: core._toRuntimePath(coreOptions.configPath),\n outDir: core._toRuntimePath(coreOptions.outDir),\n cwd: core._toRuntimePath(coreOptions.cwd),\n };\n\n const jsxImportSource =\n (await this.getMDXOptions?.(\"runtime\"))?.jsxImportSource ?? \"react\";\n if (!jsxImportSource)\n throw new Error(\n `[Fuma Content] \"jsxImportSource\" is required for dynamic MDX collection \"${this.name}\".`,\n );\n codegen.addNamespaceImport(\"_jsx_runtime\", `${jsxImportSource}/jsx-runtime`);\n\n let code: InitializerCode = {\n fn: \"mdxStoreDynamic\",\n typeParams: [\"typeof Config\", `\"${this.name}\"`, \"unknown\"],\n params: [\n \"Config\",\n JSON.stringify(serializableCoreOptions),\n `\"${this.name}\"`,\n `\"${base}\"`,\n await this.generateDocCollectionFrontmatterGlob(core, codegen, true),\n \"_jsx_runtime\",\n ],\n };\n\n code = this.storeInitializer.run(code, {\n codegen,\n environment: \"dynamic\",\n });\n codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);\n }),\n );\n return entries;\n };\n\n #onGitHandler: GitHook[\"onClient\"][\"$inferHandler\"] = async ({ client }) => {\n this.storeInitializer.pipe((code, { codegen, environment }) => {\n codegen.addNamedImport([\"WithGit\"], RuntimePaths[environment], true);\n code.typeParams[2] += \" & WithGit\";\n return code;\n });\n\n this.vfile.pipe(async (file) => {\n const vcData = await client.getFileData({ filePath: file.path });\n file.data[\"mdx-export\"] ??= [];\n file.data[\"mdx-export\"].push(\n {\n name: \"lastModified\",\n value: vcData.lastModified,\n },\n {\n name: \"creationDate\",\n value: vcData.creationDate,\n },\n );\n return file;\n });\n };\n\n private async generateDocCollectionFrontmatterGlob(\n core: Core,\n codegen: CodeGenerator,\n eager = false,\n ) {\n let s = `{`;\n const files = await this.getFiles();\n const query = codegen.formatQuery({\n collection: this.name,\n only: \"frontmatter\",\n workspace: core.getWorkspace()?.name,\n });\n for (const file of files) {\n const fullPath = path.join(this.dir, file);\n const specifier = `${codegen.formatImportPath(fullPath)}?${query}`;\n if (eager) {\n const name = codegen.generateImportName();\n codegen.addNamedImport([`frontmatter as ${name}`], specifier);\n s += `\"${slash(file)}\": ${name},`;\n } else {\n s += `\"${slash(file)}\": () => ${codegen.formatDynamicImport(specifier, \"frontmatter\")},`;\n }\n }\n s += \"}\";\n return s;\n }\n\n private async generateDocCollectionGlob(core: Core, codegen: CodeGenerator, eager = false) {\n let s = `{`;\n const files = await this.getFiles();\n const query = codegen.formatQuery({\n collection: this.name,\n workspace: core.getWorkspace()?.name,\n });\n for (const file of files) {\n const fullPath = path.join(this.dir, file);\n const specifier = `${codegen.formatImportPath(fullPath)}?${query}`;\n if (eager) {\n const name = codegen.generateImportName();\n codegen.addNamespaceImport(name, specifier);\n s += `\"${slash(file)}\": ${name},`;\n } else {\n s += `\"${slash(file)}\": () => ${codegen.formatDynamicImport(specifier)},`;\n }\n }\n s += \"}\";\n return s;\n }\n}\n\nexport function mdxCollection<FrontmatterSchema extends StandardSchemaV1 | undefined = undefined>(\n config: MDXCollectionConfig<FrontmatterSchema>,\n) {\n return new MDXCollection(config);\n}\n\nfunction mdxLoader(): LoaderConfig {\n const test = /\\.mdx?(\\?.+?)?$/;\n\n return {\n id: \"mdx\",\n test,\n configureNext(nextConfig) {\n const loaderPath = \"fuma-content/collections/mdx/loader-webpack\";\n const loaderOptions = this.getLoaderOptions();\n\n return {\n ...nextConfig,\n turbopack: {\n ...nextConfig.turbopack,\n rules: {\n ...nextConfig.turbopack?.rules,\n \"*.{md,mdx}\": {\n loaders: [\n {\n loader: loaderPath,\n options: loaderOptions as unknown as TurbopackLoaderOptions,\n },\n ],\n as: \"*.js\",\n },\n },\n },\n pageExtensions: [...(nextConfig.pageExtensions ?? [\"js\", \"jsx\", \"tsx\", \"ts\"]), \"mdx\", \"md\"],\n webpack(config: Configuration, options) {\n config.module ||= {};\n config.module.rules ||= [];\n config.module.rules.push({\n test,\n use: [\n options.defaultLoaders.babel,\n {\n loader: loaderPath,\n options: loaderOptions,\n },\n ],\n });\n\n return nextConfig.webpack?.(config, options) ?? config;\n },\n };\n },\n async createLoader() {\n const { createMdxLoader } = await import(\"./mdx/loader\");\n return createMdxLoader({\n getCore: () => this.core,\n });\n },\n };\n}\n\nexport type { LinkReference } from \"@/collections/mdx/remark-postprocess\";\nexport type { CompiledMDX } from \"@/collections/mdx/build-mdx\";\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"obsidian.d.ts","names":[],"sources":["../../src/collections/obsidian.ts"],"mappings":";;;;KAKY,2BAAA,2BACgB,gBAAA,4BACxB,mBAAA,CAAoB,iBAAA;AAAA,iBAER,qBAAA,2BACY,gBAAA,yBAAA,CAC1B,MAAA,EAAQ,2BAAA,CAA4B,iBAAA,IAAkB,aAAA,CAAA,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"obsidian.js","names":[],"sources":["../../src/collections/obsidian/schema.ts","../../src/collections/obsidian/build-storage.ts","../../src/collections/obsidian/build-resolver.ts","../../src/utils/mdast/separate.ts","../../src/utils/mdast/create.ts","../../src/utils/mdast/replace.ts","../../src/collections/obsidian/get-refs.ts","../../src/collections/obsidian/utils/wikilinks.ts","../../src/collections/obsidian/utils/blocks.ts","../../src/collections/obsidian/utils/transform.ts","../../src/collections/obsidian/utils/micromark-comments.ts","../../src/collections/obsidian/remark-obsidian.ts","../../src/collections/obsidian.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const frontmatterSchema = z\n .object({\n aliases: z.array(z.string()).optional(),\n })\n .loose()\n .optional();\n\nexport type Frontmatter = z.input<typeof frontmatterSchema>;\n","import path from \"node:path\";\nimport { type Frontmatter, frontmatterSchema } from \"./schema\";\nimport { slug } from \"github-slugger\";\nimport { slash } from \"@/utils/code-generator\";\nimport { Awaitable } from \"@/types\";\nimport { readFile } from \"node:fs/promises\";\nimport { fumaMatter } from \"../mdx/fuma-matter\";\n\ntype RenameOutputFn = (originalOutputPath: string, file: VaultFile) => string;\ntype RenameOutputPreset = \"ignore\" | \"simple\";\n\nexport interface VaultStorageOptions {\n files: string[];\n /** vault directory */\n dir: string;\n /**\n * rename output path\n *\n * @defaultValue 'simple'\n */\n outputPath?: RenameOutputFn | RenameOutputPreset;\n\n /**\n * generate URL from media file, default to original file path (normalized)\n */\n url?: (outputPath: string, mediaFile: VaultFile) => string | undefined;\n\n /**\n * enforce all Markdown documents to be MDX\n *\n * @defaultValue true\n */\n enforceMdx?: boolean;\n}\n\n/**\n * a virtual storage containing all files in the vault\n */\nexport interface VaultStorage {\n files: Map<string, ParsedFile>;\n}\n\nexport interface VaultFile {\n /**\n * paths relative to vault folder\n */\n path: string;\n\n _raw: {\n /**\n * original path, either:\n * - relative to cwd\n * - absolute\n */\n path: string;\n };\n\n read: () => Awaitable<string>;\n}\n\nexport type ParsedFile = ParsedContentFile | ParsedMediaFile | ParsedDataFile;\n\nexport interface ParsedContentFile extends VaultFile {\n format: \"content\";\n frontmatter: Frontmatter;\n\n /**\n * output path (relative to content directory)\n */\n outPath: string;\n content: string;\n}\n\nexport interface ParsedMediaFile extends VaultFile {\n format: \"media\";\n\n /**\n * output path (relative to asset directory)\n */\n outPath: string;\n /**\n * The output URL. When undefined, it means the file is only accessible via paths.\n */\n url?: string;\n}\n\nexport interface ParsedDataFile extends VaultFile {\n format: \"data\";\n outPath: string;\n}\n\n/**\n * Build virtual storage containing all files in the vault\n */\nexport async function buildStorage(options: VaultStorageOptions): Promise<VaultStorage> {\n const {\n files,\n dir,\n url = (file) => {\n const segs = normalize(file)\n .split(\"/\")\n .filter((v) => v.length > 0);\n return `/${segs.join(\"/\")}`;\n },\n outputPath: outputPathOption = \"simple\",\n enforceMdx = true,\n } = options;\n const getOutputPath =\n typeof outputPathOption === \"function\"\n ? outputPathOption\n : createRenameOutput(outputPathOption);\n\n const storage = new Map<string, ParsedFile>();\n\n for (const file of files) {\n const normalizedPath = normalize(path.relative(dir, file));\n const raw: VaultFile = {\n _raw: { path: file },\n path: normalizedPath,\n async read() {\n const res = await readFile(file);\n return res.toString();\n },\n };\n let outPath = getOutputPath(normalizedPath, raw);\n let parsed: ParsedFile;\n\n switch (path.extname(normalizedPath)) {\n case \".json\":\n case \".yaml\":\n case \".yml\":\n case \".toml\":\n parsed = {\n format: \"data\",\n outPath,\n ...raw,\n };\n break;\n case \".md\":\n case \".mdx\": {\n const rawContent = await raw.read();\n const { data, content } = fumaMatter(rawContent);\n if (enforceMdx) {\n outPath = outPath.slice(0, -path.extname(outPath).length) + \".mdx\";\n }\n\n parsed = {\n format: \"content\",\n outPath,\n frontmatter: frontmatterSchema.parse(data),\n content,\n ...raw,\n read() {\n return rawContent;\n },\n };\n break;\n }\n default:\n parsed = {\n format: \"media\",\n url: url(outPath, raw),\n outPath,\n ...raw,\n };\n }\n\n storage.set(normalizedPath, parsed);\n }\n\n return { files: storage };\n}\n\nfunction createRenameOutput(preset: RenameOutputPreset): RenameOutputFn {\n if (preset === \"ignore\") return (file) => file;\n\n const occurrences = new Map<string, number>();\n return (file) => {\n const ext = path.extname(file);\n const segs = file.slice(0, -ext.length).split(\"/\");\n for (let i = 0; i < segs.length; i++) {\n // preserve separators\n segs[i] = slug(segs[i]);\n }\n // we only count occurrences by the full path\n let out = segs.join(\"/\");\n const o = occurrences.get(out) ?? 0;\n occurrences.set(out, o + 1);\n if (o > 0) out += `-${o}`;\n return out + ext;\n };\n}\n\nexport function normalize(filePath: string): string {\n filePath = slash(filePath);\n if (filePath.startsWith(\"../\")) throw new Error(`${filePath} points outside of vault folder`);\n\n return filePath.startsWith(\"./\") ? filePath.slice(2) : filePath;\n}\n","import { slash } from \"@/utils/code-generator\";\nimport type { ParsedFile, VaultStorage } from \"./build-storage\";\nimport path from \"node:path\";\n\nexport interface VaultResolver {\n /**\n * resolve file by vault name\n */\n resolveName: (vaultName: string) => ParsedFile | undefined;\n\n /**\n * resolve file by vault path (from root directory)\n */\n resolvePath: (vaultPath: string) => ParsedFile | undefined;\n\n /**\n * resolve file by:\n * 1. relative vault path\n * 2. full vault path\n * 3. vault name/alias\n *\n * @param name - target\n * @param fromPath - the path of referencer vault file\n */\n resolveAny: (name: string, fromPath: string) => ParsedFile | undefined;\n}\n\nexport function buildResolver(storage: VaultStorage): VaultResolver {\n // a file should create two item in this map, one with extension, and one without.\n const pathToFile = new Map<string, ParsedFile>();\n // a file should create two item in this map, one with extension, and one without.\n const nameToFile = new Map<string, ParsedFile>();\n\n for (const file of storage.files.values()) {\n const parsed = path.parse(file.path);\n\n nameToFile.set(parsed.name, file);\n pathToFile.set(slash(path.join(parsed.dir, parsed.name)), file);\n\n nameToFile.set(parsed.base, file);\n pathToFile.set(file.path, file);\n\n // support aliases specified in frontmatter\n if (file.format === \"content\" && file.frontmatter?.aliases) {\n for (const alias of file.frontmatter.aliases) {\n nameToFile.set(alias, file);\n }\n }\n }\n\n return {\n resolveName(vaultName: string) {\n return nameToFile.get(vaultName);\n },\n resolvePath(vaultPath: string) {\n return pathToFile.get(vaultPath);\n },\n resolveAny(name, fromPath) {\n const dir = path.dirname(fromPath);\n\n if (name.startsWith(\"./\") || name.startsWith(\"../\")) {\n return this.resolvePath(slash(path.join(dir, name)));\n }\n\n // absolute path or name\n return this.resolvePath(name) ?? this.resolveName(name);\n },\n };\n}\n\nexport function resolveInternalHref(\n href: string,\n sourceFile: ParsedFile,\n resolver: VaultResolver,\n): [ParsedFile | undefined, hash: string | undefined] {\n const [name, hash] = href.split(\"#\", 2);\n return [resolver.resolveAny(name, sourceFile.path), hash];\n}\n","import type { RootContent } from \"mdast\";\n\nexport function separate(\n splitter: RegExp | string,\n nodes: RootContent[],\n): [before: RootContent[], after: RootContent[]] | undefined {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node.type !== \"text\" && \"children\" in node) {\n const result = separate(splitter, node.children);\n if (!result) continue;\n\n const before = nodes.slice(0, i);\n before.push({\n ...node,\n children: result[0],\n } as RootContent);\n\n const after = nodes.slice(i + 1);\n after.unshift({\n ...node,\n children: result[1],\n } as RootContent);\n\n return [before, after];\n }\n\n if (node.type === \"text\") {\n const [left, right] = node.value.split(splitter, 2);\n if (right === undefined) continue;\n\n const before = nodes.slice(0, i);\n before.push({\n type: \"text\",\n value: left,\n });\n\n const after = nodes.slice(i + 1);\n if (right.length > 0) after.unshift({ type: \"text\", value: right });\n\n return [before, after];\n }\n }\n}\n","import type { BlockContent, DefinitionContent } from \"mdast\";\nimport type { MdxJsxFlowElement } from \"mdast-util-mdx-jsx\";\n\nexport function createCallout(\n type: string,\n title: (BlockContent | DefinitionContent)[],\n children: (BlockContent | DefinitionContent)[],\n): MdxJsxFlowElement {\n return {\n type: \"mdxJsxFlowElement\",\n attributes: [\n {\n type: \"mdxJsxAttribute\",\n name: \"type\",\n value: type,\n },\n ],\n name: \"ObsidianCallout\",\n children: [\n {\n type: \"mdxJsxFlowElement\",\n name: \"ObsidianCalloutTitle\",\n attributes: [],\n children: title,\n },\n {\n type: \"mdxJsxFlowElement\",\n name: \"ObsidianCalloutBody\",\n attributes: [],\n children,\n },\n ],\n };\n}\n","export function replace(node: object, withObj: object) {\n for (const k in node) {\n delete node[k as keyof object];\n }\n\n Object.assign(node, withObj);\n}\n","import type { ParsedFile } from \"./build-storage\";\nimport path from \"node:path\";\nimport { slug } from \"github-slugger\";\nimport { slash } from \"@/utils/code-generator\";\n\nexport function getFileHref(ref: ParsedFile, sourceFile: ParsedFile, heading?: string) {\n if (ref.format === \"media\" && ref.url) return ref.url;\n\n const dir = path.dirname(sourceFile.outPath);\n let url = slash(path.relative(dir, ref.outPath));\n if (!url.startsWith(\"../\")) url = `./${url}`;\n if (heading) url += `#${getHeadingHash(heading)}`;\n\n return url;\n}\n\nexport function getHeadingHash(heading: string) {\n // for refs to block Ids, ignore slugify\n return heading.startsWith(\"^\") ? heading : slug(heading);\n}\n","import { visit } from \"unist-util-visit\";\nimport type { Paragraph, Parent, PhrasingContent, Root, RootContent } from \"mdast\";\nimport type { MdxJsxFlowElement } from \"mdast-util-mdx-jsx\";\nimport { VaultResolver } from \"../build-resolver\";\nimport { ParsedContentFile, ParsedFile } from \"../build-storage\";\nimport { getFileHref, getHeadingHash } from \"../get-refs\";\n\ndeclare module \"mdast\" {\n interface LinkData {\n isWikiLink?: boolean;\n }\n}\n\nconst RegexWikilink = /!?\\[\\[(?<content>([^\\]]|\\\\])+)]]/g;\nconst RegexContent =\n /^(?<name>(?:\\\\#|\\\\\\||[^#|])*)(?:#(?<heading>(?:\\\\\\||[^|])+))?(?:\\|(?<alias>.+))?$/;\n\nexport function transformWikilinks(\n tree: Root,\n sourceFile: ParsedContentFile,\n resolver: VaultResolver,\n) {\n visit(tree, \"paragraph\", (node, index, parent) => {\n if (typeof index !== \"number\" || !parent) return;\n\n const replaceParagraph: RootContent[] = [node];\n let parents: Parent[] = [];\n\n function traverse(cur: RootContent) {\n if (cur.type === \"text\") {\n const output = resolveParagraphText(cur.value, sourceFile, resolver);\n const idx = parents[0].children.indexOf(cur);\n let insertIdx = idx;\n\n parents[0].children.splice(insertIdx, 1);\n for (const item of output) {\n if (item.inParagraph) {\n parents[0].children.splice(insertIdx, 0, ...item.children);\n insertIdx += item.children.length;\n } else {\n replaceParagraph.push(...item.children);\n // clone parents\n parents = structuredClone(parents);\n // removed inserted elements\n parents[0].children.splice(idx, insertIdx - idx);\n insertIdx = idx;\n replaceParagraph.push(parents.at(-1) as Paragraph);\n }\n }\n\n return;\n }\n\n if (\"children\" in cur && Array.isArray(cur.children)) {\n parents.unshift(cur);\n for (const child of cur.children) {\n traverse(child);\n }\n parents.shift();\n }\n }\n\n traverse(node);\n parent.children.splice(index, 1, ...replaceParagraph);\n });\n return tree;\n}\n\ntype ResolveParagraphTextResult =\n | {\n inParagraph: true;\n children: PhrasingContent[];\n }\n | {\n inParagraph: false;\n children: RootContent[];\n };\n\nfunction resolveParagraphText(\n text: string,\n sourceFile: ParsedFile,\n resolver: VaultResolver,\n): ResolveParagraphTextResult[] {\n const output: ResolveParagraphTextResult[] = [];\n let concat: PhrasingContent[] = [];\n let lastIndex = 0;\n let result: RegExpExecArray | null;\n\n function flush() {\n if (concat.length === 0) return;\n\n output.push({\n inParagraph: true,\n children: concat,\n });\n concat = [];\n }\n\n while ((result = RegexWikilink.exec(text))) {\n const resolved = resolveWikilink(result[0].startsWith(\"!\"), result[1], sourceFile, resolver);\n if (!resolved) continue;\n if (lastIndex < result.index) {\n concat.push({\n type: \"text\",\n value: text.substring(lastIndex, result.index),\n });\n }\n\n // for blocks, separate paragraphs\n if (resolved.type === \"mdxJsxFlowElement\") {\n flush();\n output.push({\n inParagraph: false,\n children: [resolved],\n });\n } else {\n concat.push(resolved as PhrasingContent);\n }\n\n lastIndex = result.index + result[0].length;\n }\n\n if (lastIndex < text.length) {\n concat.push({\n type: \"text\",\n value: text.substring(lastIndex),\n });\n }\n\n flush();\n return output;\n}\n\nfunction resolveWikilink(\n isEmbed: boolean,\n content: string,\n sourceFile: ParsedFile,\n resolver: VaultResolver,\n): RootContent | undefined {\n const match = RegexContent.exec(content);\n if (!match?.groups) return;\n\n const { name, heading, alias } = match.groups as {\n name: string;\n heading?: string;\n alias?: string;\n };\n\n const isHeadingOnly = name.length === 0 && heading;\n\n if (isEmbed) {\n const ref = isHeadingOnly ? sourceFile : resolver.resolveAny(name, sourceFile.path);\n\n if (!ref || ref.format === \"data\") {\n console.warn(`failed to resolve ${name} wikilink`);\n return;\n }\n\n if (ref.format === \"content\") {\n console.warn(\n \"some features of embed content blocks are not supported yet, use at your own risk.\",\n );\n\n return {\n type: \"mdxJsxFlowElement\",\n name: \"include\",\n attributes: [],\n children: [\n {\n type: \"paragraph\",\n children: [\n {\n type: \"text\",\n value: getFileHref(ref, sourceFile, heading),\n },\n ],\n },\n ],\n } satisfies MdxJsxFlowElement;\n }\n\n if (alias) console.warn(\"we do not support specifying image size like `![[image.png|300]].\");\n\n return {\n type: \"image\",\n url: ref.url ?? getFileHref(ref, sourceFile, heading),\n alt: name,\n };\n }\n\n let url: string;\n\n if (isHeadingOnly) {\n url = `#${getHeadingHash(heading)}`;\n } else {\n const ref = resolver.resolveAny(name, sourceFile.path);\n\n if (!ref) {\n console.warn(`failed to resolve ${name} wikilink`);\n return;\n }\n\n url = getFileHref(ref, sourceFile, heading);\n }\n\n return {\n type: \"link\",\n url,\n data: {\n isWikiLink: true,\n },\n children: [\n {\n type: \"text\",\n value: alias ?? content,\n },\n ],\n };\n}\n","import { visit } from \"unist-util-visit\";\nimport type { Root } from \"mdast\";\nimport { replace } from \"../../../utils/mdast/replace\";\nimport type { MdxJsxFlowElement } from \"mdast-util-mdx-jsx\";\n\nconst Regex = /(?<!\\\\)\\^(?<block_id>\\w+)$/m;\n\nexport function transformBlocks(tree: Root) {\n visit(tree, \"paragraph\", (node) => {\n let id: string | undefined;\n\n visit(\n node,\n [\"link\", \"text\", \"mdxJsxFlowElement\"],\n (textNode) => {\n if (textNode.type !== \"text\") return \"skip\";\n\n const value = textNode.value;\n const match = Regex.exec(value);\n // if last text node isn't a block id, skip\n if (!match) return false;\n\n id = match[1];\n textNode.value =\n value.slice(0, match.index).trimEnd() + value.slice(match.index + match[0].length);\n return false;\n },\n true,\n );\n\n if (id) {\n replace(node, {\n type: \"mdxJsxFlowElement\",\n name: \"section\",\n attributes: [\n {\n type: \"mdxJsxAttribute\",\n name: \"id\",\n value: `^${id}`,\n },\n ],\n children: [\n {\n ...node,\n },\n ],\n } satisfies MdxJsxFlowElement);\n }\n\n return \"skip\";\n });\n\n return tree;\n}\n","import type { Blockquote, PhrasingContent, Root } from \"mdast\";\nimport { visit } from \"unist-util-visit\";\nimport { separate } from \"../../../utils/mdast/separate\";\nimport { createCallout } from \"../../../utils/mdast/create\";\nimport { resolveInternalHref, VaultResolver } from \"../build-resolver\";\nimport { replace } from \"../../../utils/mdast/replace\";\nimport { getFileHref, getHeadingHash } from \"../get-refs\";\nimport { ParsedContentFile } from \"../build-storage\";\nimport { slug } from \"github-slugger\";\nimport { flattenNode } from \"@/utils/mdast/flatten\";\nimport { transformWikilinks } from \"./wikilinks\";\nimport { transformBlocks } from \"./blocks\";\n\nconst RegexCalloutHead = /^\\[!(?<type>\\w+)](?<collapsible>\\+)?/;\n\nexport interface RemarkConvertOptions {\n resolver: VaultResolver;\n}\n\nfunction resolveCallout(node: Blockquote) {\n const head = node.children[0];\n if (!head || head.type !== \"paragraph\") return;\n const textNode = head.children[0];\n if (!textNode || textNode.type !== \"text\") return;\n\n const match = RegexCalloutHead.exec(textNode.value);\n if (!match) return;\n\n textNode.value = textNode.value.slice(match[0].length).trimStart();\n\n const [title, rest] = separate(/\\r?\\n/, head.children) ?? [head.children];\n const body = node.children.slice(1);\n if (rest) {\n body.unshift({\n type: \"paragraph\",\n children: rest as PhrasingContent[],\n });\n }\n\n return createCallout(\n match[1],\n [\n {\n type: \"paragraph\",\n children: title as PhrasingContent[],\n },\n ],\n body,\n );\n}\n\nexport function transform(tree: Root, sourceFile: ParsedContentFile, resolver: VaultResolver) {\n visit(tree, \"heading\", (node) => {\n node.data ??= {};\n node.data.hProperties ??= {};\n node.data.hProperties.id ??= slug(flattenNode(node));\n return \"skip\";\n });\n\n tree = transformWikilinks(tree, sourceFile, resolver);\n visit(tree, [\"blockquote\", \"link\", \"image\"], (node) => {\n if (node.type === \"blockquote\") {\n const callout = resolveCallout(node);\n if (callout) replace(node, callout);\n\n return;\n }\n\n if (node.type === \"link\" || node.type === \"image\") {\n if (node.type === \"link\" && node.data?.isWikiLink) return \"skip\";\n\n const url = decodeURI(node.url);\n if (node.type === \"link\" && url.startsWith(\"#\")) {\n const heading = url.slice(1);\n node.url = `#${getHeadingHash(heading)}`;\n } else {\n const [ref, heading] = resolveInternalHref(url, sourceFile, resolver);\n if (!ref) return \"skip\";\n\n node.url = getFileHref(ref, sourceFile, heading);\n }\n\n return \"skip\";\n }\n });\n tree = transformBlocks(tree);\n return tree;\n}\n","import type { Extension, State, TokenizeContext, Tokenizer, Code } from \"micromark-util-types\";\nimport type { Literal } from \"mdast\";\n\nexport interface PercentComment extends Literal {\n type: \"percentComment\";\n value: string;\n}\n\ndeclare module \"micromark-util-types\" {\n interface TokenTypeMap {\n percentComment: \"percentComment\";\n percentCommentMarker: \"percentCommentMarker\";\n }\n}\n\ndeclare module \"mdast\" {\n interface RootContentMap {\n percentComment: PercentComment;\n }\n\n interface PhrasingContentMap {\n percentComment: PercentComment;\n }\n}\n\nexport function percentCommentMicromark(): Extension {\n return {\n text: {\n [37]: { tokenize: tokenizePercentComment }, // %\n },\n };\n}\n\nconst tokenizePercentComment: Tokenizer = function (\n this: TokenizeContext,\n effects,\n ok,\n nok,\n): State {\n let seenClosing = 0;\n\n const start: State = (code: Code) => {\n // opening %%\n if (code !== 37) return nok(code);\n if (this.previous === 92) return nok(code); // \\%%\n effects.enter(\"percentComment\");\n effects.enter(\"percentCommentMarker\");\n effects.consume(code);\n return openSecondPercent;\n };\n\n function openSecondPercent(code: Code): State | undefined {\n if (code !== 37) return nok(code);\n effects.consume(code);\n effects.exit(\"percentCommentMarker\");\n return inside;\n }\n\n function inside(code: Code): State | undefined {\n if (code === null) return nok(code);\n\n if (code === 37) {\n effects.enter(\"percentCommentMarker\");\n effects.consume(code);\n seenClosing = 1;\n return closeSecondPercent;\n }\n\n effects.consume(code);\n return inside;\n }\n\n function closeSecondPercent(code: Code) {\n if (code === 37) {\n effects.consume(code);\n effects.exit(\"percentCommentMarker\");\n effects.exit(\"percentComment\");\n return ok;\n }\n\n // It was just a single %, continue comment body.\n effects.exit(\"percentCommentMarker\");\n seenClosing = 0;\n return inside(code);\n }\n\n return start;\n};\n\nexport function percentCommentFromMarkdown() {\n return {\n enter: {\n percentComment() {\n // Intentionally no-op: consume comment tokens but produce no mdast node.\n },\n },\n exit: {\n percentComment() {\n // Intentionally no-op.\n },\n },\n };\n}\n","import type { Processor, Transformer } from \"unified\";\nimport type { Root } from \"mdast\";\nimport { buildStorage, normalize, VaultStorage } from \"./build-storage\";\nimport { buildResolver, VaultResolver } from \"./build-resolver\";\nimport path from \"node:path\";\nimport { transform } from \"./utils/transform\";\nimport { MDXCollection } from \"../mdx\";\nimport { percentCommentFromMarkdown, percentCommentMicromark } from \"./utils/micromark-comments\";\n\ndeclare module \"vfile\" {\n interface DataMap {\n _obsidian_transformed?: boolean;\n }\n}\n\nexport function remarkObsidian(this: Processor): Transformer<Root, Root> {\n const cache = new WeakMap<\n MDXCollection,\n {\n resolver: VaultResolver;\n storage: VaultStorage;\n }\n >();\n\n const data = this.data();\n const micromarkExtensions = (data.micromarkExtensions ??= []);\n const fromMarkdownExtensions = (data.fromMarkdownExtensions ??= []);\n micromarkExtensions.push(percentCommentMicromark());\n fromMarkdownExtensions.push(percentCommentFromMarkdown());\n\n return async (tree, file) => {\n if (file.data._obsidian_transformed) return tree;\n const compiler = file.data._compiler;\n\n if (!compiler || !(compiler.collection instanceof MDXCollection)) return tree;\n const collection = compiler.collection;\n let cached = cache.get(collection);\n\n if (!cached) {\n const files = await collection.getFiles();\n const storage = await buildStorage({\n files: files.map((file) => path.join(collection.dir, file)),\n dir: collection.dir,\n url: () => undefined,\n outputPath: \"ignore\",\n enforceMdx: false,\n });\n const resolver = buildResolver(storage);\n\n cached = { resolver, storage };\n cache.set(collection, cached);\n }\n\n const { storage, resolver } = cached;\n const normalizedPath = normalize(path.relative(collection.dir, file.path));\n const vault = storage.files.get(normalizedPath);\n\n if (vault?.format === \"content\") {\n tree = transform(tree, vault, resolver);\n file.data._obsidian_transformed = true;\n return tree;\n }\n\n return tree;\n };\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { mdxCollection, type MDXCollectionConfig } from \"./mdx\";\nimport { remarkObsidian } from \"./obsidian/remark-obsidian\";\nimport { remarkInclude } from \"@/plugins/remark/include\";\n\nexport type MDXObsidianCollectionConfig<\n FrontmatterSchema extends StandardSchemaV1 | undefined = undefined,\n> = MDXCollectionConfig<FrontmatterSchema>;\n\nexport function mdxObsidianCollection<\n FrontmatterSchema extends StandardSchemaV1 | undefined = undefined,\n>(config: MDXObsidianCollectionConfig<FrontmatterSchema>) {\n return mdxCollection({\n ...config,\n async options(environment) {\n const base =\n typeof config.options === \"function\" ? await config.options?.(environment) : config.options;\n\n return {\n ...base,\n remarkPlugins: ({ preprocess, postprocess }) =>\n typeof base?.remarkPlugins === \"function\"\n ? base.remarkPlugins({\n preprocess: [remarkObsidian, remarkInclude, ...preprocess],\n postprocess,\n })\n : [\n remarkObsidian,\n remarkInclude,\n ...preprocess,\n ...(base?.remarkPlugins ?? []),\n ...postprocess,\n ],\n };\n },\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-store.js","names":[],"sources":["../../../src/collections/runtime/file-store.ts"],"sourcesContent":["import path from \"node:path\";\nimport { MapCollectionStore } from \"@/collections/runtime/store\";\n\nexport interface FileInfo {\n /**\n * path relative to content directory\n */\n path: string;\n\n /**\n * the full file path in file system\n */\n fullPath: string;\n}\n\nfunction formatGlobKey(globKey: string) {\n if (globKey.startsWith(\"./\")) {\n return globKey.slice(2);\n }\n\n return globKey;\n}\n\nexport class FileCollectionStore<V> extends MapCollectionStore<string, FileInfo & V> {\n constructor(base: string, glob: Record<string, V>) {\n const data = new Map<string, FileInfo & V>();\n for (const [key, value] of Object.entries(glob)) {\n const filePath = formatGlobKey(key);\n data.set(key, {\n ...value,\n path: filePath,\n fullPath: path.join(base, filePath),\n });\n }\n super(data);\n }\n\n castData<T>(_cast: (input: FileInfo & V) => FileInfo & T): FileCollectionStore<T> {\n return super.castData(_cast);\n }\n}\n"],"mappings":";;;AAeA,SAAS,cAAc,SAAiB;AACtC,KAAI,QAAQ,WAAW,KAAK,CAC1B,QAAO,QAAQ,MAAM,EAAE;AAGzB,QAAO;;AAGT,IAAa,sBAAb,cAA4C,mBAAyC;CACnF,YAAY,MAAc,MAAyB;EACjD,MAAM,uBAAO,IAAI,KAA2B;AAC5C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;GAC/C,MAAM,WAAW,cAAc,IAAI;AACnC,QAAK,IAAI,KAAK;IACZ,GAAG;IACH,MAAM;IACN,UAAU,KAAK,KAAK,MAAM,SAAS;IACpC,CAAC;;AAEJ,QAAM,KAAK;;CAGb,SAAY,OAAsE;AAChF,SAAO,MAAM,SAAS,MAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","names":["#dataMap","#dataList"],"sources":["../../../src/collections/runtime/store.ts"],"sourcesContent":["import type { Awaitable } from \"@/types\";\n\nexport interface CollectionStore<Id, Data> {\n /**\n * type-only operation to cast data type, doesn't do any runtime transformation.\n */\n castData: <T>(_cast: (input: Data) => T) => CollectionStore<Id, T>;\n\n get: (id: Id) => Awaitable<Data | undefined>;\n list: () => Awaitable<Data[]>;\n\n /**\n * For typescript to infer data types, don't access the value of this property.\n */\n $inferData: Data;\n}\n\nexport class MapCollectionStore<Id, Data> implements CollectionStore<Id, Data> {\n readonly #dataMap: Map<Id, Data>;\n readonly #dataList: Data[];\n\n constructor(input: Map<Id, Data>) {\n this.#dataMap = input;\n this.#dataList = Array.from(input.values());\n }\n\n get(id: Id): Data | undefined {\n return this.#dataMap.get(id);\n }\n\n list(): Data[] {\n return this.#dataList;\n }\n\n castData<T>(_cast: (input: Data) => T): MapCollectionStore<Id, T> {\n return this as unknown as MapCollectionStore<Id, T>;\n }\n\n /**\n * transform entry and create a new store\n */\n transform<$Id, T>(fn: (id: Id, data: Data) => [$Id, T]): MapCollectionStore<$Id, T> {\n const updated = new Map<$Id, T>();\n\n for (const [k, v] of this.#dataMap) {\n const out = fn(k, v);\n updated.set(out[0], out[1]);\n }\n\n return new MapCollectionStore(updated);\n }\n\n get $inferData(): Data {\n return undefined as Data;\n }\n}\n"],"mappings":";AAiBA,IAAa,qBAAb,MAAa,mBAAkE;CAC7E;CACA;CAEA,YAAY,OAAsB;AAChC,QAAA,UAAgB;AAChB,QAAA,WAAiB,MAAM,KAAK,MAAM,QAAQ,CAAC;;CAG7C,IAAI,IAA0B;AAC5B,SAAO,MAAA,QAAc,IAAI,GAAG;;CAG9B,OAAe;AACb,SAAO,MAAA;;CAGT,SAAY,OAAsD;AAChE,SAAO;;;;;CAMT,UAAkB,IAAkE;EAClF,MAAM,0BAAU,IAAI,KAAa;AAEjC,OAAK,MAAM,CAAC,GAAG,MAAM,MAAA,SAAe;GAClC,MAAM,MAAM,GAAG,GAAG,EAAE;AACpB,WAAQ,IAAI,IAAI,IAAI,IAAI,GAAG;;AAG7B,SAAO,IAAI,mBAAmB,QAAQ;;CAGxC,IAAI,aAAmB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-webpack.d.ts","names":[],"sources":["../../../src/collections/yaml/loader-webpack.ts"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-webpack.js","names":[],"sources":["../../../src/collections/yaml/loader-webpack.ts"],"sourcesContent":["import { createWebpackLoader } from \"@/plugins/loader/webpack\";\nimport { createYamlLoader } from \"./loader\";\n\nexport default createWebpackLoader((core) => createYamlLoader(core));\n"],"mappings":";;;;;AAGA,IAAA,yBAAe,qBAAqB,SAAS,iBAAiB,KAAK,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"collections-Bl9hpWMS.js","names":["#pluginHooks"],"sources":["../src/utils/hook.ts","../src/utils/pipe.ts","../src/collections/index.ts"],"sourcesContent":["import type { Awaitable } from \"@/types\";\n\nexport interface Hook<Context = undefined> {\n /**\n * add a hook\n *\n * @returns the same pipe instance\n */\n hook: (fn: (context: Context) => void) => Hook<Context>;\n run: (context: Context) => void;\n $inferHandler: (context: Context) => Awaitable<void>;\n}\n\nexport interface AsyncHook<Context = undefined> {\n /**\n * add a hook\n *\n * @returns the same pipe instance\n */\n hook: (fn: (context: Context) => Awaitable<void>) => AsyncHook<Context>;\n run: (context: Context) => Awaitable<void>;\n $inferHandler: (context: Context) => Awaitable<void>;\n}\n\nexport function hook<Context>(steps: ((ctx: Context) => void)[] = []): Hook<Context> {\n return {\n async run(ctx) {\n for (const step of steps) step(ctx);\n },\n hook(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n\nexport function asyncHook<Context>(\n steps: ((ctx: Context) => Awaitable<void>)[] = [],\n): AsyncHook<Context> {\n return {\n async run(ctx) {\n await Promise.all(steps.map((step) => step(ctx)));\n },\n hook(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n","import type { Awaitable } from \"@/types\";\n\nexport interface Pipe<Data, Context = undefined> {\n /**\n * add a transformation step\n *\n * @returns the same pipe instance\n */\n pipe: (fn: (data: Data, context: Context) => Data) => Pipe<Data, Context>;\n run: (data: Data, context: Context) => Data;\n $inferHandler: (data: Data, context: Context) => Data;\n}\n\nexport interface AsyncPipe<Data, Context = undefined> {\n /**\n * add a transformation step\n *\n * @returns the same pipe instance\n */\n pipe: (fn: (data: Data, context: Context) => Awaitable<Data>) => AsyncPipe<Data, Context>;\n run: (data: Data, context: Context) => Awaitable<Data>;\n $inferHandler: (data: Data, context: Context) => Awaitable<Data>;\n}\n\nexport function pipe<Data, Context>(\n steps: ((data: Data, context: Context) => Data)[] = [],\n): Pipe<Data, Context> {\n return {\n run(data, ctx) {\n for (const step of steps) {\n data = step(data, ctx);\n }\n return data;\n },\n pipe(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n\nexport function asyncPipe<Data, Context>(\n steps: ((data: Data, context: Context) => Awaitable<Data>)[] = [],\n): AsyncPipe<Data, Context> {\n return {\n async run(data, ctx) {\n for (const step of steps) {\n data = await step(data, ctx);\n }\n return data;\n },\n pipe(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n","import { Core, EmitContext, EmitEntry, PluginOption, ResolvedConfig, ServerContext } from \"@/core\";\nimport { asyncHook, hook } from \"@/utils/hook\";\nimport { asyncPipe } from \"@/utils/pipe\";\n\nexport interface CollectionHookContext {\n core: Core;\n}\n\nexport class Collection {\n readonly #pluginHooks = new Map<symbol | string, unknown>();\n name = null as unknown as string;\n\n /**\n * on config loaded/updated\n */\n readonly onConfig = hook<CollectionHookContext & { config: ResolvedConfig }>();\n /**\n * Configure watch/dev server\n */\n readonly onServer = hook<CollectionHookContext & { server: ServerContext }>();\n readonly onInit = asyncHook<CollectionHookContext>();\n readonly onEmit = asyncPipe<EmitEntry[], EmitContext>();\n readonly plugins: PluginOption[] = [];\n\n pluginHook<T, Options>(hook: CollectionHook<T, Options>, options: Options): T;\n pluginHook<T>(hook: CollectionHook<T>): T;\n\n pluginHook<T, O>(hook: CollectionHook<T, O>, options?: O): T {\n let created = this.#pluginHooks.get(hook.id) as T | undefined;\n if (created) return created;\n\n created = hook.create(this, options as O);\n this.#pluginHooks.set(hook.id, created);\n return created;\n }\n\n getPluginHook<T>(hook: CollectionHook<T>): T | undefined {\n return this.#pluginHooks.get(hook.id) as T | undefined;\n }\n}\n\nexport interface CollectionHook<T = unknown, Options = undefined> {\n id: string | symbol;\n create: (collection: Collection, options: Options) => T;\n}\n\nexport function defineCollectionHook<T, Options = undefined>(\n init: (collection: Collection, options: Options) => T,\n): CollectionHook<T, Options>;\n\nexport function defineCollectionHook<T, Options = undefined>(\n id: string,\n init: (collection: Collection, options: Options) => T,\n): CollectionHook<T, Options>;\n\nexport function defineCollectionHook<T, Options = undefined>(\n ...args:\n | [init: (collection: Collection, options: Options) => T]\n | [id: string, init: (collection: Collection, options: Options) => T]\n): CollectionHook<T, Options> {\n if (args.length === 1)\n return {\n id: Symbol(),\n create: args[0],\n };\n\n return {\n id: args[0],\n create: args[1],\n };\n}\n"],"mappings":";AAwBA,SAAgB,KAAc,QAAoC,EAAE,EAAiB;AACnF,QAAO;EACL,MAAM,IAAI,KAAK;AACb,QAAK,MAAM,QAAQ,MAAO,MAAK,IAAI;;EAErC,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe,KAAA;EAChB;;AAGH,SAAgB,UACd,QAA+C,EAAE,EAC7B;AACpB,QAAO;EACL,MAAM,IAAI,KAAK;AACb,SAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;;EAEnD,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe,KAAA;EAChB;;;;ACzBH,SAAgB,KACd,QAAoD,EAAE,EACjC;AACrB,QAAO;EACL,IAAI,MAAM,KAAK;AACb,QAAK,MAAM,QAAQ,MACjB,QAAO,KAAK,MAAM,IAAI;AAExB,UAAO;;EAET,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe,KAAA;EAChB;;AAGH,SAAgB,UACd,QAA+D,EAAE,EACvC;AAC1B,QAAO;EACL,MAAM,IAAI,MAAM,KAAK;AACnB,QAAK,MAAM,QAAQ,MACjB,QAAO,MAAM,KAAK,MAAM,IAAI;AAE9B,UAAO;;EAET,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe,KAAA;EAChB;;;;ACjDH,IAAa,aAAb,MAAwB;CACtB,+BAAwB,IAAI,KAA+B;CAC3D,OAAO;;;;CAKP,WAAoB,MAA0D;;;;CAI9E,WAAoB,MAAyD;CAC7E,SAAkB,WAAkC;CACpD,SAAkB,WAAqC;CACvD,UAAmC,EAAE;CAKrC,WAAiB,MAA4B,SAAgB;EAC3D,IAAI,UAAU,MAAA,YAAkB,IAAI,KAAK,GAAG;AAC5C,MAAI,QAAS,QAAO;AAEpB,YAAU,KAAK,OAAO,MAAM,QAAa;AACzC,QAAA,YAAkB,IAAI,KAAK,IAAI,QAAQ;AACvC,SAAO;;CAGT,cAAiB,MAAwC;AACvD,SAAO,MAAA,YAAkB,IAAI,KAAK,GAAG;;;AAkBzC,SAAgB,qBACd,GAAG,MAGyB;AAC5B,KAAI,KAAK,WAAW,EAClB,QAAO;EACL,IAAI,QAAQ;EACZ,QAAQ,KAAK;EACd;AAEH,QAAO;EACL,IAAI,KAAK;EACT,QAAQ,KAAK;EACd"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["import { Collection } from \"@/collections\";\nimport type { PluginOption } from \"@/core\";\n\nexport type CollectionsPack = {\n [key: string]: Collection | CollectionsPack;\n};\n\nexport interface GlobalConfig<Collections extends CollectionsPack = CollectionsPack> {\n plugins?: PluginOption[];\n collections?: Collections;\n workspaces?: Record<string, WorkspaceConfig>;\n\n /**\n * specify a directory to access & store cache (disabled during development mode).\n *\n * The cache will never be updated, delete the cache folder to clean.\n */\n experimentalBuildCache?: string;\n\n /**\n * configure code generation\n */\n emit?: EmitConfig;\n}\n\nexport interface EmitConfig {\n /**\n * add .js extenstion to imports\n */\n jsExtension?: boolean;\n}\n\nexport interface WorkspaceConfig {\n dir: string;\n config: GlobalConfig | { default: GlobalConfig };\n}\n\nexport function defineConfig<Collections extends CollectionsPack = CollectionsPack>(\n config: GlobalConfig<Collections> = {},\n): GlobalConfig<Collections> {\n return config;\n}\n"],"mappings":";AAqCA,SAAgB,aACd,SAAoC,EAAE,EACX;AAC3B,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-BbTeLenA.d.ts","names":[],"sources":["../src/config/index.ts","../src/types.ts","../src/utils/hook.ts","../src/utils/pipe.ts","../src/collections/index.ts","../src/utils/code-generator.ts","../src/core.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-CrYszxmc.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport type { FSWatcher } from \"chokidar\";\nimport { Collection } from \"@/collections\";\nimport type * as Vite from \"vite\";\nimport type { NextConfig } from \"next\";\nimport type { LoadHook } from \"node:module\";\nimport { CodeGenerator } from \"@/utils/code-generator\";\nimport type { Awaitable } from \"@/types\";\nimport type { CollectionsPack, GlobalConfig } from \"./config\";\n\nexport interface ResolvedConfig extends Omit<GlobalConfig, \"collections\"> {\n collections: Map<string, Collection>;\n}\n\nexport interface EmitEntry {\n /**\n * path relative to output directory\n */\n path: string;\n content: string;\n}\n\nexport interface PluginContext {\n core: Core;\n}\n\nexport interface EmitContext extends PluginContext {\n createCodeGenerator: (\n path: string,\n content: (ctx: { codegen: CodeGenerator }) => Awaitable<void>,\n ) => Promise<EmitEntry>;\n}\n\nexport interface Plugin {\n /**\n * unique name for plugin\n *\n * @example `my-package:my-plugin`\n */\n name: string;\n\n /** when `true`, only keep the last plugin with same `name`. */\n dedupe?: boolean;\n\n /**\n * on config loaded/updated\n */\n config?: (this: PluginContext, config: ResolvedConfig) => Awaitable<void | ResolvedConfig>;\n\n /**\n * called after collection initialization\n */\n collection?: (this: PluginContext, collection: Collection) => Awaitable<void>;\n\n /**\n * Configure watch/dev server\n */\n configureServer?: (this: PluginContext, server: ServerContext) => void;\n\n vite?: {\n createPlugin?: (this: PluginContext) => Vite.PluginOption;\n };\n\n bun?: {\n setup?: (this: PluginContext, build: Bun.PluginBuilder) => Awaitable<void>;\n };\n\n next?: {\n config?: (this: PluginContext, config: NextConfig) => NextConfig;\n };\n\n node?: {\n createLoad?: (this: PluginContext) => Awaitable<LoadHook>;\n };\n}\n\nexport type PluginOption = Awaitable<Plugin | PluginOption[] | false | undefined>;\n\nexport interface ServerContext {\n /**\n * the file watcher, by default all content files are watched, along with other files.\n *\n * make sure to filter when listening to events\n */\n watcher?: FSWatcher;\n}\n\nexport type CoreOptions = Partial<ResolvedCoreOptions>;\n\n/**\n * the resolved options, all paths are absolute\n */\nexport interface ResolvedCoreOptions {\n cwd: string;\n /**\n * Path to source configuration file\n *\n * @defaultValue content.config.ts\n */\n configPath: string;\n /**\n * Directory for output files\n *\n * @defaultValue '.content'\n */\n outDir: string;\n /**\n * the workspace info if this instance is created as a workspace\n */\n workspace?: {\n parent: Core;\n name: string;\n dir: string;\n };\n plugins?: PluginOption;\n}\n\nexport interface EmitOptions {\n /**\n * filter the collections to run emit\n */\n filterCollection?: (collection: Collection) => boolean;\n\n /**\n * filter the workspaces to run emit\n */\n filterWorkspace?: (workspace: string) => boolean;\n\n /**\n * write files\n */\n write?: boolean;\n}\n\nexport interface EmitOutput {\n entries: EmitEntry[];\n workspaces: Record<string, EmitEntry[]>;\n}\n\nasync function getPlugins(pluginOptions: PluginOption[], dedupe = true): Promise<Plugin[]> {\n const plugins: Plugin[] = [];\n for (const option of await Promise.all(pluginOptions)) {\n if (!option) continue;\n if (Array.isArray(option)) plugins.push(...(await getPlugins(option, false)));\n else plugins.push(option);\n }\n\n if (!dedupe) return plugins;\n\n const excludedName = new Set<string>();\n const deduped: Plugin[] = [];\n for (let i = plugins.length - 1; i >= 0; i--) {\n const plugin = plugins[i];\n if (excludedName.has(plugin.name)) continue;\n deduped.unshift(plugin);\n if (plugin.dedupe) excludedName.add(plugin.name);\n }\n return deduped;\n}\n\nexport class Core {\n private readonly workspaces = new Map<string, Core>();\n private readonly options: ResolvedCoreOptions;\n private plugins: Plugin[] = [];\n private config!: ResolvedConfig;\n static defaultOptions = {\n configPath: \"content.config.ts\",\n outDir: \".content\",\n };\n\n /**\n * Convenient cache store, reset when config changes.\n *\n * You can group namespaces in cache key with \":\", like `my-plugin:data`\n */\n readonly cache = new Map<string, unknown>();\n\n constructor(options: CoreOptions = {}) {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();\n this.options = {\n ...options,\n cwd,\n outDir: path.resolve(cwd, options.outDir ?? Core.defaultOptions.outDir),\n configPath: path.resolve(cwd, options.configPath ?? Core.defaultOptions.configPath),\n };\n }\n\n async init({\n config: newConfig,\n }: {\n /**\n * either the default export or all exports of config file.\n */\n config: Awaitable<Record<string, unknown>>;\n }) {\n this.config = await this.initConfig(await newConfig);\n this.cache.clear();\n this.workspaces.clear();\n this.plugins = await getPlugins([\n this.options.plugins,\n this.config.plugins,\n ...this.config.collections.values().map((collection) => collection.plugins),\n ]);\n\n const ctx = this.getPluginContext();\n for (const plugin of this.plugins) {\n const out = await plugin.config?.call(ctx, this.config);\n if (out) this.config = out;\n }\n\n await Promise.all(\n this.config.collections.values().map(async (collection) => {\n collection.onConfig.run({ core: this, config: this.config });\n\n for (const plugin of this.plugins) {\n await plugin.collection?.call(ctx, collection);\n }\n }),\n );\n\n // only support workspaces with max depth 1\n if (!this.options.workspace && this.config.workspaces) {\n await Promise.all(\n Object.entries(this.config.workspaces).map(async ([name, workspace]) => {\n const child = new Core({\n ...this.options,\n cwd: path.resolve(this.options.cwd, workspace.dir),\n workspace: {\n name,\n parent: this,\n dir: workspace.dir,\n },\n });\n\n await child.init({ config: workspace.config as Record<string, unknown> });\n this.workspaces.set(name, child);\n }),\n );\n }\n }\n\n getWorkspace() {\n return this.options.workspace;\n }\n getWorkspaces() {\n return this.workspaces;\n }\n getOptions() {\n return this.options;\n }\n getConfig(): ResolvedConfig {\n return this.config;\n }\n /**\n * The file path of compiled config file, the file may not exist (e.g. on Vite, or still compiling)\n */\n getCompiledConfigPath(): string {\n return path.join(this.options.outDir, \"content.config.mjs\");\n }\n getPlugins(workspace = false) {\n if (workspace) {\n const plugins = [...this.plugins];\n for (const workspace of this.workspaces.values()) {\n plugins.push(...workspace.plugins);\n }\n return plugins;\n }\n\n return this.plugins;\n }\n getCollections(workspace = false): Collection[] {\n const list = Array.from(this.config.collections.values());\n if (workspace) {\n for (const workspace of this.workspaces.values()) {\n list.push(...workspace.getCollections());\n }\n }\n return list;\n }\n getCollection(name: string): Collection | undefined {\n return this.config.collections.get(name);\n }\n getPluginContext(): PluginContext {\n return {\n core: this,\n };\n }\n async initServer(server: ServerContext) {\n const ctx = this.getPluginContext();\n\n server.watcher?.add(this.options.configPath);\n for (const plugin of this.plugins) {\n plugin.configureServer?.call(ctx, server);\n }\n for (const collection of this.getCollections()) {\n collection.onServer.run({ core: this, server });\n }\n for (const workspace of this.workspaces.values()) {\n await workspace.initServer(server);\n }\n }\n\n async clearOutputDirectory() {\n await fs.rm(this.options.outDir, { recursive: true, force: true });\n }\n\n async emit(emitOptions: EmitOptions = {}): Promise<EmitOutput> {\n const emitConfig = this.config.emit;\n const { workspace, outDir } = this.options;\n const { filterCollection, filterWorkspace, write = false } = emitOptions;\n const start = performance.now();\n const ctx: EmitContext = {\n core: this,\n async createCodeGenerator(path, content) {\n const codegen = new CodeGenerator({\n ...emitConfig,\n outDir,\n });\n await content({\n codegen,\n });\n return {\n path,\n content: codegen.toString(),\n };\n },\n };\n\n const out: EmitOutput = {\n entries: [],\n workspaces: {},\n };\n\n const entryMap = new Map<string, EmitEntry>();\n const generated: Awaitable<EmitEntry[]>[] = [];\n for (const collection of this.getCollections()) {\n if (filterCollection && !filterCollection(collection)) continue;\n generated.push(collection.onEmit.run([], ctx));\n }\n for (const entries of await Promise.all(generated)) {\n for (const item of entries) {\n entryMap.set(item.path, item);\n }\n }\n out.entries = Array.from(entryMap.values());\n\n if (write) {\n await Promise.all(\n out.entries.map(async (entry) => {\n const file = path.join(outDir, entry.path);\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, entry.content);\n }),\n );\n\n console.log(\n workspace\n ? `[fuma-content: ${workspace.name}] generated files in ${performance.now() - start}ms`\n : `[fuma-content] generated files in ${performance.now() - start}ms`,\n );\n }\n\n for (const [name, workspace] of this.workspaces.entries()) {\n if (filterWorkspace && !filterWorkspace(name)) continue;\n out.workspaces[name] = (await workspace.emit(emitOptions)).entries;\n }\n\n return out;\n }\n\n /**\n * convert absolute path into a runtime path (relative to **runtime** cwd)\n */\n _toRuntimePath(absolutePath: string) {\n return path.relative(process.cwd(), absolutePath);\n }\n\n private async initConfig(config: Record<string, unknown>): Promise<ResolvedConfig> {\n const collections = new Map<string, Collection>();\n let globalConfig: GlobalConfig;\n\n if (\"default\" in config) {\n globalConfig = config.default as GlobalConfig;\n for (const [k, v] of Object.entries(config)) {\n if (v instanceof Collection) {\n globalConfig.collections ??= {};\n globalConfig.collections[k] = v;\n }\n }\n } else {\n globalConfig = config as GlobalConfig;\n }\n\n globalConfig.collections ??= {};\n const pendingCollections = new Map<string, CollectionsPack[string]>(\n Object.entries(globalConfig.collections),\n );\n while (pendingCollections.size > 0) {\n const entries = Array.from(pendingCollections.entries());\n pendingCollections.clear();\n\n await Promise.all(\n entries.map(async ([name, collection]) => {\n if (collection instanceof Collection) {\n if (collections.has(name)) {\n throw new Error(`duplicated collection name \"${name}\" is not allowed.`);\n }\n\n collection.name = name;\n collections.set(name, collection);\n await collection.onInit.run({ core: this });\n } else {\n for (const [k, v] of Object.entries(collection)) {\n pendingCollections.set(k === \"index\" ? name : `${name}$${k}`, v);\n }\n }\n }),\n );\n }\n\n return {\n ...globalConfig,\n collections,\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dynamic-CNEaikCN.d.ts","names":[],"sources":["../src/config/load-from-file.ts","../src/dynamic.ts"],"mappings":";;;;;AAQA;;;KAAY,WAAA;;;UCJK,WAAA;EACf,OAAA,IAAW,IAAA,GAAO,OAAA,CAAQ,IAAA;AAAA;AAAA,iBAGZ,iBAAA,CAAA;EACd,IAAA;EACA,WAAA;EACA;AAAA;EDHqB;;;ECQrB,IAAA,EAAM,IAAA;EACN,WAAA,GAAc,WAAA;EAbC;;;EAiBf,IAAA;AAAA,IACE,WAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dynamic.js","names":[],"sources":["../src/dynamic.ts"],"sourcesContent":["import type { Core } from \"@/core\";\nimport fs from \"node:fs/promises\";\nimport type { CompileMode } from \"./config/load-from-file\";\n\nexport interface DynamicCore {\n getCore(): Core | Promise<Core>;\n}\n\nexport function createDynamicCore({\n core,\n compileMode = true,\n mode,\n}: {\n /**\n * core (not initialized)\n */\n core: Core;\n compileMode?: CompileMode;\n /**\n * In dev mode, the config file is dynamically re-loaded when it's updated.\n */\n mode: \"dev\" | \"production\";\n}): DynamicCore {\n let prev:\n | {\n hash: string;\n init: Promise<void>;\n }\n | undefined;\n\n async function getConfigHash(): Promise<string> {\n if (mode === \"production\") return \"static\";\n\n const stats = await fs.stat(core.getOptions().configPath).catch(() => {\n throw new Error(\"Cannot find config file\");\n });\n\n return stats.mtime.getTime().toString();\n }\n\n async function init() {\n const { loadConfig } = await import(\"./config/load-from-file\");\n await core.init({\n config: loadConfig(core, compileMode),\n });\n }\n\n return {\n async getCore() {\n const hash = await getConfigHash();\n if (!prev || hash !== prev.hash) {\n prev = {\n hash,\n init: init(),\n };\n }\n\n await prev.init;\n return core;\n },\n };\n}\n"],"mappings":";;AAQA,SAAgB,kBAAkB,EAChC,MACA,cAAc,MACd,QAWc;CACd,IAAI;CAOJ,eAAe,gBAAiC;AAC9C,MAAI,SAAS,aAAc,QAAO;AAMlC,UAJc,MAAM,GAAG,KAAK,KAAK,YAAY,CAAC,WAAW,CAAC,YAAY;AACpE,SAAM,IAAI,MAAM,0BAA0B;IAC1C,EAEW,MAAM,SAAS,CAAC,UAAU;;CAGzC,eAAe,OAAO;EACpB,MAAM,EAAE,eAAe,MAAM,OAAO,gCAAA,MAAA,MAAA,EAAA,EAAA;AACpC,QAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,YAAY,EACtC,CAAC;;AAGJ,QAAO,EACL,MAAM,UAAU;EACd,MAAM,OAAO,MAAM,eAAe;AAClC,MAAI,CAAC,QAAQ,SAAS,KAAK,KACzB,QAAO;GACL;GACA,MAAM,MAAM;GACb;AAGH,QAAM,KAAK;AACX,SAAO;IAEV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-store-DutRtol_.d.ts","names":[],"sources":["../src/collections/runtime/file-store.ts"],"mappings":";;;UAGiB,QAAA;;AAAjB;;EAIE,IAAA;EAAA;;AAgBF;EAXE,QAAA;AAAA;AAAA,cAWW,mBAAA,YAA+B,kBAAA,SAA2B,QAAA,GAAW,CAAA;cACpE,IAAA,UAAc,IAAA,EAAM,MAAA,SAAe,CAAA;EAa/C,QAAA,GAAA,CAAY,KAAA,GAAQ,KAAA,EAAO,QAAA,GAAW,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,mBAAA,CAAoB,CAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flatten-m0wfHxLH.js","names":[],"sources":["../src/utils/mdast/flatten.ts"],"sourcesContent":["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"],"mappings":";AAEA,SAAgB,YAAY,MAA2B;AACrD,KAAI,cAAc,KAAM,QAAO,KAAK,SAAS,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC,KAAK,GAAG;AAExF,KAAI,WAAW,KAAM,QAAO,KAAK;AAEjC,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fs-KJjb32Nq.d.ts","names":[],"sources":["../src/collections/fs.ts"],"mappings":";;;cAKa,oBAAA,SAA6B,UAAA;EAAA;EAA7B;;;EAKX,GAAA;EAAA,SAIS,oBAAA;cAEG,MAAA,EAAQ,0BAAA;EAmBpB,eAAA,CAAgB,QAAA;EA9BkC;;;;;EAwC5C,QAAA,CAAA,GAAQ,OAAA;EASd,OAAA,CAAQ,QAAA;EASR,eAAA,CAAA;AAAA;AAAA,UAKe,0BAAA;EAvBT;;;EA2BN,GAAA;EATA;;;AAKF;;EAWE,KAAA;EAXyC;;;EAgBzC,gBAAA;AAAA;AAAA,iBAGc,oBAAA,CAAqB,MAAA,EAAQ,0BAAA,GAA0B,oBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fuma-matter-E30PU53R.js","names":[],"sources":["../src/collections/mdx/fuma-matter.ts"],"sourcesContent":["/**\n * Inspired by https://github.com/jonschlinkert/gray-matter\n */\nimport { load } from \"js-yaml\";\n\ninterface Output {\n /**\n * The matter section, including the delimiter.\n */\n matter: string;\n content: string;\n data: unknown;\n}\n\nconst regex = /^---\\r?\\n(.+?)\\r?\\n---\\r?\\n/s;\n\n/**\n * parse frontmatter, it supports only yaml format\n */\nexport function fumaMatter(input: string): Output {\n const output: Output = { matter: \"\", data: {}, content: input };\n const match = regex.exec(input);\n if (!match) {\n return output;\n }\n\n // get the raw front-matter block\n output.matter = match[0];\n output.content = input.slice(match[0].length);\n\n const loaded = load(match[1]);\n output.data = loaded ?? {};\n\n return output;\n}\n"],"mappings":";;;;;AAcA,MAAM,QAAQ;;;;AAKd,SAAgB,WAAW,OAAuB;CAChD,MAAM,SAAiB;EAAE,QAAQ;EAAI,MAAM,EAAE;EAAE,SAAS;EAAO;CAC/D,MAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,KAAI,CAAC,MACH,QAAO;AAIT,QAAO,SAAS,MAAM;AACtB,QAAO,UAAU,MAAM,MAAM,MAAM,GAAG,OAAO;AAG7C,QAAO,OADQ,KAAK,MAAM,GAAG,IACL,EAAE;AAE1B,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-BxnPg5Ao.d.ts","names":[],"sources":["../src/plugins/git.ts"],"mappings":";;;UAOiB,WAAA;EAAA;;;EAIf,YAAA,EAAc,IAAA;EAAd;;;EAIA,YAAA,EAAc,IAAA;AAAA;AAAA,UAGC,OAAA;EAAA;;;EAIf,QAAA,EAAU,SAAA;IAAY,MAAA,EAAQ,SAAA;EAAA;AAAA;AAAA,cAGnB,OAAA,EAAO,cAAA,CAAA,OAAA;;;AAApB;;;;iBAUwB,GAAA,CAAA,GAAO,MAAA;AAAA,UAed,SAAA;EACf,WAAA,GAAc,OAAA;IAAW,QAAA;EAAA,MAAuB,OAAA,CAAQ,WAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DVqrqxzl.d.ts","names":[],"sources":["../src/plugins/loader/webpack.ts","../src/plugins/loader/index.ts"],"mappings":";;;;;;UAQiB,oBAAA;EACf,0BAAA;EACA,UAAA;EACA,MAAA;EACA,KAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,aAAA,CAAc,oBAAA,GAAuB,MAAA;;;;iBAqBxD,mBAAA,CAAoB,aAAA,GAAgB,IAAA,EAAM,WAAA,KAAgB,MAAA,GAAS,aAAA;;;KC7B9E,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAE3B,iBAAA;AAAA,UAEY,MAAA;EDHA;;;;;;;ECWf,IAAA,GAAO,KAAA,EAAO,WAAA,KAAgB,SAAA,CAAU,YAAA;EAExC,GAAA;IDTK;AAGP;;;ICWI,IAAA,IAAQ,MAAA,UAAgB,KAAA,EAAO,WAAA,KAAgB,SAAA,CAAU,GAAA,CAAI,YAAA;EAAA;AAAA;AAAA,UAIhD,WAAA;EACf,WAAA;EAEA,QAAA;EACA,KAAA,EAAO,MAAA;EACP,SAAA,iBAA0B,OAAA;EAC1B,aAAA,GAAgB,IAAA;AAAA;AAAA,UAGD,YAAA;EACf,IAAA;EACA,GAAA;EDL8F;;;;;ECY9F,UAAA;AAAA;AAAA,UAGQ,iBAAA,SAA0B,aAAA;EAClC,gBAAA,QAAwB,oBAAA;AAAA;AAAA,UAGT,YAAA;;EAEf,EAAA;EAlDY;;;;;EAyDZ,IAAA,GAAO,MAAA;EAzDsB;;;EA8D7B,YAAA,GAAe,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,iBAAA,KAAsB,OAAA,CAAQ,MAAA;EAC/E,aAAA,IAAiB,IAAA,EAAM,iBAAA,EAAmB,IAAA,EAAM,UAAA,KAAe,UAAA;AAAA;;AA/DhC;;iBA2EjB,YAAA,CAAA,GAAgB,MAAA;AAAA,UAoFf,UAAA;EACf,OAAA,EAAS,YAAA;AAAA;AAAA,cAGE,UAAA,EAAU,cAAA,CAAA,UAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/utils/validation.ts"],"mappings":";;;;cAEa,eAAA,SAAwB,KAAA;EACnC,KAAA;EACA,MAAA,WAAiB,gBAAA,CAAiB,KAAA;cAEtB,OAAA,UAAiB,MAAA,WAAiB,gBAAA,CAAiB,KAAA;EAOzD,iBAAA,CAAA,GAAiB,OAAA;AAAA;AAAA,iBAkBH,QAAA,gBAAwB,gBAAA,UAAA,CAC5C,MAAA,EAAQ,gBAAA,KAAqB,OAAA,EAAS,OAAA,KAAY,gBAAA,GAClD,IAAA,WACA,OAAA,EAAS,OAAA,EACT,YAAA,WACC,OAAA,CAAQ,gBAAA,CAAiB,WAAA,CAAY,MAAA;;;;iBAqBxB,aAAA,CAAc,MAAA,EAAQ,gBAAA,GAAgB,MAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-promise-like-C04ERo2r.js","names":[],"sources":["../src/utils/is-promise-like.ts"],"sourcesContent":["export function isPromiseLike(v: unknown): v is PromiseLike<unknown> {\n return typeof v === \"object\" && v !== null && \"then\" in v && typeof v.then === \"function\";\n}\n"],"mappings":";AAAA,SAAgB,cAAc,GAAuC;AACnE,QAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,UAAU,KAAK,OAAO,EAAE,SAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-from-file-C3CnD8mJ.js","names":[],"sources":["../src/config/load-from-file.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport type { Core } from \"@/core\";\n\n/**\n * - `true`: compile the config before loading.\n * - `false`: import the config directly (without compiling it).\n * - `skip`: assume the config is already compiled.\n */\nexport type CompileMode = boolean | \"skip\";\n\nasync function compileConfig(core: Core) {\n const { build } = await import(\"esbuild\");\n const { configPath, outDir } = core.getOptions();\n\n const transformed = await build({\n entryPoints: [{ in: configPath, out: \"content.config\" }],\n bundle: true,\n outdir: outDir,\n target: \"node22\",\n write: true,\n platform: \"node\",\n format: \"esm\",\n packages: \"external\",\n outExtension: {\n \".js\": \".mjs\",\n },\n allowOverwrite: true,\n });\n\n if (transformed.errors.length > 0) {\n throw new Error(\"failed to compile configuration file\");\n }\n}\n\n/**\n * Load config\n */\nexport async function loadConfig(\n core: Core,\n compileMode: CompileMode,\n): Promise<Record<string, unknown>> {\n if (compileMode === true) await compileConfig(core);\n\n const url =\n compileMode === false\n ? pathToFileURL(core.getOptions().configPath)\n : pathToFileURL(core.getCompiledConfigPath());\n // always return a new config\n url.searchParams.set(\"hash\", Date.now().toString());\n\n return import(url.href);\n}\n"],"mappings":";;;;AAUA,eAAe,cAAc,MAAY;CACvC,MAAM,EAAE,UAAU,MAAM,OAAO;CAC/B,MAAM,EAAE,YAAY,WAAW,KAAK,YAAY;AAiBhD,MAfoB,MAAM,MAAM;EAC9B,aAAa,CAAC;GAAE,IAAI;GAAY,KAAK;GAAkB,CAAC;EACxD,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,QAAQ;EACR,UAAU;EACV,cAAc,EACZ,OAAO,QACR;EACD,gBAAgB;EACjB,CAAC,EAEc,OAAO,SAAS,EAC9B,OAAM,IAAI,MAAM,uCAAuC;;;;;AAO3D,eAAsB,WACpB,MACA,aACkC;AAClC,KAAI,gBAAgB,KAAM,OAAM,cAAc,KAAK;CAEnD,MAAM,MACJ,gBAAgB,QACZ,cAAc,KAAK,YAAY,CAAC,WAAW,GAC3C,cAAc,KAAK,uBAAuB,CAAC;AAEjD,KAAI,aAAa,IAAI,QAAQ,KAAK,KAAK,CAAC,UAAU,CAAC;AAEnD,QAAO,OAAO,IAAI"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-CyhM9SLt.js","names":[],"sources":["../src/collections/mdx/loader.ts"],"sourcesContent":["import { fumaMatter } from \"@/collections/mdx/fuma-matter\";\nimport type { SourceMap } from \"rollup\";\nimport { z } from \"zod\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { Loader } from \"@/plugins/loader\";\nimport type { DynamicCore } from \"@/dynamic\";\nimport { MDXCollection } from \"../mdx\";\n\nconst querySchema = z\n .object({\n only: z.literal([\"frontmatter\", \"all\"]).default(\"all\"),\n collection: z.string().optional(),\n workspace: z.string().optional(),\n })\n .loose();\n\nconst cacheEntry = z.object({\n code: z.string(),\n map: z.any().optional(),\n hash: z.string().optional(),\n});\n\ntype CacheEntry = z.infer<typeof cacheEntry>;\n\nexport function createMdxLoader({ getCore }: DynamicCore): Loader {\n return {\n async load({ getSource, development: isDevelopment, query, addDependency, filePath }) {\n let core = await getCore();\n const value = await getSource();\n const matter = fumaMatter(value);\n const { collection: collectionName, workspace, only } = querySchema.parse(query);\n if (workspace) {\n core = core.getWorkspaces().get(workspace) ?? core;\n }\n\n let after: (() => Promise<void>) | undefined;\n\n const { experimentalBuildCache = false } = core.getConfig();\n if (!isDevelopment && experimentalBuildCache) {\n const cacheDir = experimentalBuildCache;\n const cacheKey = `${collectionName ?? \"global\"}_${generateCacheHash(filePath)}`;\n\n const cached = await fs\n .readFile(path.join(cacheDir, cacheKey))\n .then((content) => cacheEntry.parse(JSON.parse(content.toString())))\n .catch(() => null);\n\n if (cached && cached.hash === generateCacheHash(value)) return cached;\n after = async () => {\n await fs.mkdir(cacheDir, { recursive: true });\n await fs.writeFile(\n path.join(cacheDir, cacheKey),\n JSON.stringify({\n ...out,\n hash: generateCacheHash(value),\n } satisfies CacheEntry),\n );\n };\n }\n\n let collection = collectionName ? core.getCollection(collectionName) : undefined;\n if (!(collection instanceof MDXCollection)) collection = undefined;\n\n if (collection?.frontmatter) {\n matter.data = await collection.frontmatter.run(matter.data as Record<string, unknown>, {\n collection,\n filePath,\n source: value,\n });\n }\n\n if (only === \"frontmatter\") {\n return {\n code: `export const frontmatter = ${JSON.stringify(matter.data)}`,\n map: null,\n };\n }\n\n // ensure the line number is correct in dev mode\n const lineOffset = isDevelopment ? countLines(matter.matter) : 0;\n\n const { buildMDX } = await import(\"@/collections/mdx/build-mdx\");\n const compiled = await buildMDX({\n core,\n collection,\n isDevelopment,\n source: \"\\n\".repeat(lineOffset) + matter.content,\n filePath,\n frontmatter: matter.data as Record<string, unknown>,\n compiler: {\n addDependency,\n collection,\n core,\n },\n environment: \"bundler\",\n });\n\n const out = {\n code: String(compiled.value),\n map: compiled.map as SourceMap,\n };\n\n await after?.();\n return out;\n },\n };\n}\n\nfunction generateCacheHash(input: string): string {\n return createHash(\"md5\").update(input).digest(\"hex\");\n}\n\nfunction countLines(s: string) {\n let num = 0;\n\n for (const c of s) {\n if (c === \"\\n\") num++;\n }\n\n return num;\n}\n"],"mappings":";;;;;;;;;AAUA,MAAM,cAAc,EACjB,OAAO;CACN,MAAM,EAAE,QAAQ,CAAC,eAAe,MAAM,CAAC,CAAC,QAAQ,MAAM;CACtD,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC,CACD,OAAO;AAEV,MAAM,aAAa,EAAE,OAAO;CAC1B,MAAM,EAAE,QAAQ;CAChB,KAAK,EAAE,KAAK,CAAC,UAAU;CACvB,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAIF,SAAgB,gBAAgB,EAAE,WAAgC;AAChE,QAAO,EACL,MAAM,KAAK,EAAE,WAAW,aAAa,eAAe,OAAO,eAAe,YAAY;EACpF,IAAI,OAAO,MAAM,SAAS;EAC1B,MAAM,QAAQ,MAAM,WAAW;EAC/B,MAAM,SAAS,WAAW,MAAM;EAChC,MAAM,EAAE,YAAY,gBAAgB,WAAW,SAAS,YAAY,MAAM,MAAM;AAChF,MAAI,UACF,QAAO,KAAK,eAAe,CAAC,IAAI,UAAU,IAAI;EAGhD,IAAI;EAEJ,MAAM,EAAE,yBAAyB,UAAU,KAAK,WAAW;AAC3D,MAAI,CAAC,iBAAiB,wBAAwB;GAC5C,MAAM,WAAW;GACjB,MAAM,WAAW,GAAG,kBAAkB,SAAS,GAAG,kBAAkB,SAAS;GAE7E,MAAM,SAAS,MAAM,GAClB,SAAS,KAAK,KAAK,UAAU,SAAS,CAAC,CACvC,MAAM,YAAY,WAAW,MAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,CAAC,CAAC,CACnE,YAAY,KAAK;AAEpB,OAAI,UAAU,OAAO,SAAS,kBAAkB,MAAM,CAAE,QAAO;AAC/D,WAAQ,YAAY;AAClB,UAAM,GAAG,MAAM,UAAU,EAAE,WAAW,MAAM,CAAC;AAC7C,UAAM,GAAG,UACP,KAAK,KAAK,UAAU,SAAS,EAC7B,KAAK,UAAU;KACb,GAAG;KACH,MAAM,kBAAkB,MAAM;KAC/B,CAAsB,CACxB;;;EAIL,IAAI,aAAa,iBAAiB,KAAK,cAAc,eAAe,GAAG,KAAA;AACvE,MAAI,EAAE,sBAAsB,eAAgB,cAAa,KAAA;AAEzD,MAAI,YAAY,YACd,QAAO,OAAO,MAAM,WAAW,YAAY,IAAI,OAAO,MAAiC;GACrF;GACA;GACA,QAAQ;GACT,CAAC;AAGJ,MAAI,SAAS,cACX,QAAO;GACL,MAAM,8BAA8B,KAAK,UAAU,OAAO,KAAK;GAC/D,KAAK;GACN;EAIH,MAAM,aAAa,gBAAgB,WAAW,OAAO,OAAO,GAAG;EAE/D,MAAM,EAAE,aAAa,MAAM,OAAO,2BAAA,MAAA,MAAA,EAAA,EAAA;EAClC,MAAM,WAAW,MAAM,SAAS;GAC9B;GACA;GACA;GACA,QAAQ,KAAK,OAAO,WAAW,GAAG,OAAO;GACzC;GACA,aAAa,OAAO;GACpB,UAAU;IACR;IACA;IACA;IACD;GACD,aAAa;GACd,CAAC;EAEF,MAAM,MAAM;GACV,MAAM,OAAO,SAAS,MAAM;GAC5B,KAAK,SAAS;GACf;AAED,QAAM,SAAS;AACf,SAAO;IAEV;;AAGH,SAAS,kBAAkB,OAAuB;AAChD,QAAO,WAAW,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;;AAGtD,SAAS,WAAW,GAAW;CAC7B,IAAI,MAAM;AAEV,MAAK,MAAM,KAAK,EACd,KAAI,MAAM,KAAM;AAGlB,QAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-D_sKOzDc.js","names":[],"sources":["../src/collections/yaml/loader.ts"],"sourcesContent":["import type { Loader } from \"@/plugins/loader\";\nimport { load } from \"js-yaml\";\nimport type { DynamicCore } from \"@/dynamic\";\nimport { createDataLoader } from \"../data/loader\";\n\nexport function createYamlLoader(core: DynamicCore): Loader {\n return createDataLoader(core, (filePath, source) => {\n try {\n return load(source) as Record<string, unknown>;\n } catch (e) {\n throw new Error(`invalid data in ${filePath}`, { cause: e });\n }\n });\n}\n"],"mappings":";;;;;AAKA,SAAgB,iBAAiB,MAA2B;AAC1D,QAAO,iBAAiB,OAAO,UAAU,WAAW;AAClD,MAAI;AACF,UAAO,KAAK,OAAO;WACZ,GAAG;AACV,SAAM,IAAI,MAAM,mBAAmB,YAAY,EAAE,OAAO,GAAG,CAAC;;GAE9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-e2SkeDfY.js","names":[],"sources":["../src/collections/json/loader.ts"],"sourcesContent":["import type { Loader } from \"@/plugins/loader\";\nimport type { DynamicCore } from \"@/dynamic\";\nimport { createDataLoader } from \"../data/loader\";\n\nexport function createJsonLoader(core: DynamicCore, resolveJson: \"json\" | \"js\" = \"js\"): Loader {\n return createDataLoader(\n core,\n (filePath, source) => {\n try {\n return JSON.parse(source);\n } catch (e) {\n throw new Error(`invalid data in ${filePath}`, { cause: e });\n }\n },\n resolveJson,\n );\n}\n"],"mappings":";;;;AAIA,SAAgB,iBAAiB,MAAmB,cAA6B,MAAc;AAC7F,QAAO,iBACL,OACC,UAAU,WAAW;AACpB,MAAI;AACF,UAAO,KAAK,MAAM,OAAO;WAClB,GAAG;AACV,SAAM,IAAI,MAAM,mBAAmB,YAAY,EAAE,OAAO,GAAG,CAAC;;IAGhE,YACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader-ol04zeoP.js","names":[],"sources":["../src/collections/data/loader.ts"],"sourcesContent":["import type { Loader, LoaderInput } from \"@/plugins/loader\";\nimport { z } from \"zod\";\nimport { validate } from \"@/utils/validation\";\nimport { DataCollection, type DataTransformationContext } from \"@/collections/data\";\nimport type { DynamicCore } from \"@/dynamic\";\n\nconst querySchema = z\n .object({\n collection: z.string().optional(),\n workspace: z.string().optional(),\n })\n .loose();\n\n/**\n * load data files, fallback to bundler's built-in plugins when ?collection is unspecified.\n */\nexport function createDataLoader(\n { getCore }: DynamicCore,\n parse: (filePath: string, source: string) => Record<string, unknown>,\n moduleType: \"json\" | \"js\" = \"js\",\n): Loader {\n function getCollectionProcessor({ filePath, query }: LoaderInput) {\n const parsed = querySchema.safeParse(query);\n if (!parsed.success || !parsed.data.collection) return null;\n const { collection: collectionName, workspace } = parsed.data;\n\n return async (source: string): Promise<unknown> => {\n let core = await getCore();\n if (workspace) {\n core = core.getWorkspaces().get(workspace) ?? core;\n }\n\n let collection = core.getCollection(collectionName);\n let data: unknown = parse(filePath, source);\n if (!collection || !(collection instanceof DataCollection)) return data;\n\n const context: DataTransformationContext = {\n path: filePath,\n source,\n };\n\n if (collection.schema) {\n data = await validate(collection.schema, data, context, `invalid data in ${filePath}`);\n }\n\n return collection.onLoad.run(data, context);\n };\n }\n\n return {\n async load(input) {\n const processor = getCollectionProcessor(input);\n if (processor === null) return null;\n const data = await processor(await input.getSource());\n\n if (moduleType === \"json\") {\n return {\n code: JSON.stringify(data),\n moduleType,\n };\n } else {\n return {\n code: `export default ${JSON.stringify(data)}`,\n };\n }\n },\n bun: {\n load(source, input) {\n const processor = getCollectionProcessor(input);\n if (processor === null)\n return {\n loader: \"object\",\n exports: parse(input.filePath, source),\n };\n\n return processor(source).then((data) => ({\n loader: \"object\",\n exports: { default: data },\n }));\n },\n },\n };\n}\n"],"mappings":";;;;AAMA,MAAM,cAAc,EACjB,OAAO;CACN,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC,CACD,OAAO;;;;AAKV,SAAgB,iBACd,EAAE,WACF,OACA,aAA4B,MACpB;CACR,SAAS,uBAAuB,EAAE,UAAU,SAAsB;EAChE,MAAM,SAAS,YAAY,UAAU,MAAM;AAC3C,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAAK,WAAY,QAAO;EACvD,MAAM,EAAE,YAAY,gBAAgB,cAAc,OAAO;AAEzD,SAAO,OAAO,WAAqC;GACjD,IAAI,OAAO,MAAM,SAAS;AAC1B,OAAI,UACF,QAAO,KAAK,eAAe,CAAC,IAAI,UAAU,IAAI;GAGhD,IAAI,aAAa,KAAK,cAAc,eAAe;GACnD,IAAI,OAAgB,MAAM,UAAU,OAAO;AAC3C,OAAI,CAAC,cAAc,EAAE,sBAAsB,gBAAiB,QAAO;GAEnE,MAAM,UAAqC;IACzC,MAAM;IACN;IACD;AAED,OAAI,WAAW,OACb,QAAO,MAAM,SAAS,WAAW,QAAQ,MAAM,SAAS,mBAAmB,WAAW;AAGxF,UAAO,WAAW,OAAO,IAAI,MAAM,QAAQ;;;AAI/C,QAAO;EACL,MAAM,KAAK,OAAO;GAChB,MAAM,YAAY,uBAAuB,MAAM;AAC/C,OAAI,cAAc,KAAM,QAAO;GAC/B,MAAM,OAAO,MAAM,UAAU,MAAM,MAAM,WAAW,CAAC;AAErD,OAAI,eAAe,OACjB,QAAO;IACL,MAAM,KAAK,UAAU,KAAK;IAC1B;IACD;OAED,QAAO,EACL,MAAM,kBAAkB,KAAK,UAAU,KAAK,IAC7C;;EAGL,KAAK,EACH,KAAK,QAAQ,OAAO;GAClB,MAAM,YAAY,uBAAuB,MAAM;AAC/C,OAAI,cAAc,KAChB,QAAO;IACL,QAAQ;IACR,SAAS,MAAM,MAAM,UAAU,OAAO;IACvC;AAEH,UAAO,UAAU,OAAO,CAAC,MAAM,UAAU;IACvC,QAAQ;IACR,SAAS,EAAE,SAAS,MAAM;IAC3B,EAAE;KAEN;EACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mdx-L0I8mePE.d.ts","names":[],"sources":["../src/collections/mdx/remark-postprocess.ts","../src/collections/mdx/build-mdx.ts","../src/collections/mdx.ts"],"mappings":";;;;;;;;;;UASiB,aAAA;EACf,IAAA;AAAA;AAAA,UAGe,kBAAA;EACf,OAAA;;;;EAKA,aAAA;EAV4B;;;EAe5B,iBAAA;IAGM,EAAA;IAd2B;;;IAkB3B,UAAA;EAAA;EAPN;;;EAaA,cAAA;IAGM,EAAA;EAAA;EASA;;;EAHN,KAAA;IAGM,EAAA;IACA,cAAA;EAAA;AAAA;;;KCvCH,YAAA,GAAe,UAAA,QAAkB,eAAA;AAAA,UAE5B,kBAAA;EACR,aAAA,GAAgB,IAAA;EAChB,UAAA,EAAY,aAAA;EACZ,IAAA,EAAM,IAAA;AAAA;AAAA,UAkBS,2BAAA,SAAoC,IAAA,CAAK,gBAAA;EACxD,aAAA,GACI,aAAA,KACE,OAAA;IAAW,UAAA,EAAY,aAAA;IAAe,WAAA,EAAa,aAAA;EAAA,MAAoB,aAAA;AAAA;AAAA,UAK9D,kBAAA;;AAlCwB;;EAsCvC,WAAA,GAAc,MAAA;EAnCI;;AAAiC;EAwCnD,YAAA;IAAiB,IAAA;IAAc,KAAA;EAAA;EArCf;;;EA0ChB,SAAA,GAAY,kBAAA;EAxCN;;;EA6CN,aAAA,IAAiB,MAAA,mBAAyB,SAAA,CAAU,YAAA;AAAA;AAAA;EAAA,UAK1C,OAAA,SAAgB,kBAAA;AAAA;AAAA,UAGX,WAAA,eAA0B,MAAA,2BAAiC,MAAA;EAI1E,WAAA,EAAa,WAAA;EACb,OAAA,EAAS,UAAA;AAAA;;;UCxDD,kBAAA;EACR,UAAA,EAAY,UAAA;EACZ,QAAA;EACA,MAAA;AAAA;AAAA,UAGe,mBAAA,2BACW,gBAAA,eAA+B,gBAAA,sBACjD,IAAA,CAAK,0BAAA;EACb,WAAA,GAAc,OAAA,CAAQ,kBAAA;EACtB,WAAA,GAAc,iBAAA;EACd,OAAA,GACI,2BAAA,KACE,WAAA,4BAAuC,SAAA,CAAU,2BAAA;EACvD,IAAA;EACA,OAAA;AAAA;AAAA,UASQ,eAAA;EACR,EAAA;EACA,UAAA,GAAa,MAAA,UAAgB,IAAA,UAAc,QAAA;EAC3C,MAAA;AAAA;AAAA,cAOW,aAAA,2BACe,gBAAA,eAA+B,gBAAA,sBACjD,oBAAA;EAAA;WACC,OAAA;EAAA,SACA,IAAA;EAAA,SACA,WAAA,GAAc,OAAA,CAAQ,kBAAA;EAIzB,aAAA,CAAc,WAAA,0BAAqC,OAAA,CAAQ,2BAAA;;;;EAWjE,iBAAA,GAAoB,iBAAA;ED7DL;;;ECiEf,WAAA,EAAW,SAAA,CAAA,MAAA,+BAAA,kBAAA;ED/DH;;;ECmER,KAAA,EAAK,SAAA,CAAA,KAAA,EAAA,kBAAA;EDlEL;;;ECsEA,gBAAA,EAG0B,IAAA,CAHV,eAAA;aAGH,aAAA;;;EAKb,iBAAA,EAAmB,iBAAA,SAA0B,gBAAA,GACzC,gBAAA,CAAiB,WAAA,CAAY,iBAAA,IAC7B,MAAA;cAEQ,MAAA,EAAQ,mBAAA,CAAoB,iBAAA;EAAA,QAiN1B,oCAAA;EAAA,QA2BA,yBAAA;AAAA;AAAA,iBAuBA,aAAA,2BAAwC,gBAAA,yBAAA,CACtD,MAAA,EAAQ,mBAAA,CAAoB,iBAAA,IAAkB,aAAA,CAAA,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/next/index.ts"],"mappings":";;;;UAOiB,WAAA,SAAoB,IAAA,CAAK,WAAA;;AAA1C;;;;EAME,KAAA;AAAA;AAAA,iBAGoB,aAAA,CAAc,OAAA,GAAS,WAAA,GAAgB,OAAA,EAAA,UAAA,GAiBvC,UAAA,KAAkB,UAAA;AAAA,iBA4DlB,oBAAA,CAAqB,OAAA,EAAS,WAAA,GAAW,OAAA,CAAA,IAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/next/index.ts"],"sourcesContent":["import type { NextConfig } from \"next\";\nimport path from \"node:path\";\nimport { loadConfig } from \"@/config/load-from-file\";\nimport { Core, CoreOptions } from \"@/core\";\nimport type { FSWatcher } from \"chokidar\";\nimport { loaderPlugin } from \"@/plugins/loader\";\n\nexport interface NextOptions extends Pick<CoreOptions, \"cwd\" | \"configPath\" | \"outDir\"> {\n /**\n * clean output directory on start\n *\n * @defaultValue true\n */\n clean?: boolean;\n}\n\nexport async function createContent(options: NextOptions = {}) {\n const { clean = true } = options;\n const isFirstStart = process.env._FUMA_CONTENT !== \"1\";\n process.env._FUMA_CONTENT = \"1\";\n\n const core = createNextCore(options);\n if (clean && isFirstStart) {\n await core.clearOutputDirectory();\n }\n\n await core.init({\n config: loadConfig(core, true),\n });\n\n if (isFirstStart) {\n await init(process.env.NODE_ENV === \"development\", core);\n }\n return (nextConfig: NextConfig = {}): NextConfig => {\n const ctx = core.getPluginContext();\n for (const plugin of core.getPlugins(true)) {\n nextConfig = plugin.next?.config?.call(ctx, nextConfig) ?? nextConfig;\n }\n\n return nextConfig;\n };\n}\n\nasync function init(dev: boolean, core: Core): Promise<void> {\n await core.emit({ write: true });\n\n if (!dev) return;\n const { FSWatcher } = await import(\"chokidar\");\n const { configPath, outDir } = core.getOptions();\n const absoluteConfigPath = path.resolve(configPath);\n let watcher: FSWatcher | undefined;\n\n async function devServer() {\n if (watcher && !watcher.closed) {\n await watcher.close();\n }\n\n watcher = new FSWatcher({\n ignoreInitial: true,\n persistent: true,\n ignored: [outDir],\n });\n\n watcher.once(\"ready\", () => {\n console.log(\"[fuma-content] started dev server\");\n });\n\n watcher.on(\"all\", (_event, file) => {\n if (path.resolve(file) === absoluteConfigPath) {\n console.log(\"[fuma-content] restarting dev server\");\n watcher?.removeAllListeners();\n void (async () => {\n await core.init({\n config: loadConfig(core, true),\n });\n await devServer();\n await core.emit({ write: true });\n })();\n }\n });\n\n await core.initServer({ watcher });\n }\n\n process.on(\"exit\", () => {\n if (!watcher || watcher.closed) return;\n console.log(\"[fuma-content] closing dev server\");\n void watcher.close();\n });\n\n await devServer();\n}\n\nexport async function createStandaloneCore(options: NextOptions) {\n const core = createNextCore(options);\n await core.init({\n config: loadConfig(core, true),\n });\n return core;\n}\n\nfunction createNextCore({ configPath, cwd, outDir }: NextOptions): Core {\n return new Core({\n configPath,\n cwd,\n outDir,\n plugins: [loaderPlugin()],\n });\n}\n"],"mappings":";;;;;AAgBA,eAAsB,cAAc,UAAuB,EAAE,EAAE;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,eAAe,QAAQ,IAAI,kBAAkB;AACnD,SAAQ,IAAI,gBAAgB;CAE5B,MAAM,OAAO,eAAe,QAAQ;AACpC,KAAI,SAAS,aACX,OAAM,KAAK,sBAAsB;AAGnC,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AAEF,KAAI,aACF,OAAM,KAAK,QAAQ,IAAI,aAAa,eAAe,KAAK;AAE1D,SAAQ,aAAyB,EAAE,KAAiB;EAClD,MAAM,MAAM,KAAK,kBAAkB;AACnC,OAAK,MAAM,UAAU,KAAK,WAAW,KAAK,CACxC,cAAa,OAAO,MAAM,QAAQ,KAAK,KAAK,WAAW,IAAI;AAG7D,SAAO;;;AAIX,eAAe,KAAK,KAAc,MAA2B;AAC3D,OAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;AAEhC,KAAI,CAAC,IAAK;CACV,MAAM,EAAE,cAAc,MAAM,OAAO;CACnC,MAAM,EAAE,YAAY,WAAW,KAAK,YAAY;CAChD,MAAM,qBAAqB,KAAK,QAAQ,WAAW;CACnD,IAAI;CAEJ,eAAe,YAAY;AACzB,MAAI,WAAW,CAAC,QAAQ,OACtB,OAAM,QAAQ,OAAO;AAGvB,YAAU,IAAI,UAAU;GACtB,eAAe;GACf,YAAY;GACZ,SAAS,CAAC,OAAO;GAClB,CAAC;AAEF,UAAQ,KAAK,eAAe;AAC1B,WAAQ,IAAI,oCAAoC;IAChD;AAEF,UAAQ,GAAG,QAAQ,QAAQ,SAAS;AAClC,OAAI,KAAK,QAAQ,KAAK,KAAK,oBAAoB;AAC7C,YAAQ,IAAI,uCAAuC;AACnD,aAAS,oBAAoB;AAC7B,KAAM,YAAY;AAChB,WAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,WAAM,WAAW;AACjB,WAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;QAC9B;;IAEN;AAEF,QAAM,KAAK,WAAW,EAAE,SAAS,CAAC;;AAGpC,SAAQ,GAAG,cAAc;AACvB,MAAI,CAAC,WAAW,QAAQ,OAAQ;AAChC,UAAQ,IAAI,oCAAoC;AAC3C,UAAQ,OAAO;GACpB;AAEF,OAAM,WAAW;;AAGnB,eAAsB,qBAAqB,SAAsB;CAC/D,MAAM,OAAO,eAAe,QAAQ;AACpC,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,QAAO;;AAGT,SAAS,eAAe,EAAE,YAAY,KAAK,UAA6B;AACtE,QAAO,IAAI,KAAK;EACd;EACA;EACA;EACA,SAAS,CAAC,cAAc,CAAC;EAC1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"mappings":";;;iBAGgB,QAAA,CAAS,OAAA,GAAS,aAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/node/index.ts"],"sourcesContent":["import * as module from \"node:module\";\nimport type { LoaderOptions } from \"./loader\";\n\nexport function register(options: LoaderOptions = {}) {\n module.register(\"./loader.js\", import.meta.url, {\n data: options,\n });\n}\n"],"mappings":";;AAGA,SAAgB,SAAS,UAAyB,EAAE,EAAE;AACpD,QAAO,SAAS,eAAe,OAAO,KAAK,KAAK,EAC9C,MAAM,SACP,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.d.ts","names":[],"sources":["../../src/node/loader.ts"],"mappings":";;;;KAQY,aAAA,GAAgB,IAAA,CAAK,WAAA;AAAA,cAEpB,UAAA,EAAY,cAAA,CAAe,aAAA;AAAA,cAU3B,IAAA,EAAM,QAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.js","names":[],"sources":["../../src/node/loader.ts"],"sourcesContent":["import { Core, CoreOptions } from \"@/core\";\nimport type { InitializeHook, LoadFnOutput, LoadHook, LoadHookContext } from \"node:module\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { createDynamicCore, DynamicCore } from \"@/dynamic\";\nimport { loaderPlugin } from \"@/plugins/loader\";\n\nlet configLoader: DynamicCore | undefined;\n\nexport type LoaderOptions = Omit<CoreOptions, \"plugins\" | \"workspace\">;\n\nexport const initialize: InitializeHook<LoaderOptions> = (options) => {\n configLoader = createDynamicCore({\n core: new Core({\n ...options,\n plugins: [loaderPlugin()],\n }),\n mode: \"production\",\n });\n};\n\nexport const load: LoadHook = async (url, context, nextLoad) => {\n if (!configLoader) throw new Error(\"not initialized\");\n const core = await configLoader.getCore();\n const store = createCache(core.cache).$value<LoadHook[]>();\n\n const hooks = await store.cached(\"node:load-hooks\", async () => {\n const ctx = core.getPluginContext();\n\n const hooks = await Promise.all(\n core.getPlugins(true).map<Promise<LoadHook | undefined>>(async (plugin) => {\n return plugin.node?.createLoad?.call(ctx);\n }),\n );\n return hooks.filter((v) => v !== undefined);\n });\n\n function run(\n i: number,\n url: string,\n context: LoadHookContext,\n ): LoadFnOutput | Promise<LoadFnOutput> {\n if (i >= hooks.length) {\n return nextLoad(url, context);\n }\n\n return hooks[i](url, context, (url, ctx) => run(i + 1, url, { ...context, ...ctx }));\n }\n\n return run(0, url, context);\n};\n"],"mappings":";;;;;AAMA,IAAI;AAIJ,MAAa,cAA6C,YAAY;AACpE,gBAAe,kBAAkB;EAC/B,MAAM,IAAI,KAAK;GACb,GAAG;GACH,SAAS,CAAC,cAAc,CAAC;GAC1B,CAAC;EACF,MAAM;EACP,CAAC;;AAGJ,MAAa,OAAiB,OAAO,KAAK,SAAS,aAAa;AAC9D,KAAI,CAAC,aAAc,OAAM,IAAI,MAAM,kBAAkB;CACrD,MAAM,OAAO,MAAM,aAAa,SAAS;CAGzC,MAAM,QAAQ,MAFA,YAAY,KAAK,MAAM,CAAC,QAAoB,CAEhC,OAAO,mBAAmB,YAAY;EAC9D,MAAM,MAAM,KAAK,kBAAkB;AAOnC,UALc,MAAM,QAAQ,IAC1B,KAAK,WAAW,KAAK,CAAC,IAAmC,OAAO,WAAW;AACzE,UAAO,OAAO,MAAM,YAAY,KAAK,IAAI;IACzC,CACH,EACY,QAAQ,MAAM,MAAM,KAAA,EAAU;GAC3C;CAEF,SAAS,IACP,GACA,KACA,SACsC;AACtC,MAAI,KAAK,MAAM,OACb,QAAO,SAAS,KAAK,QAAQ;AAG/B,SAAO,MAAM,GAAG,KAAK,UAAU,KAAK,QAAQ,IAAI,IAAI,GAAG,KAAK;GAAE,GAAG;GAAS,GAAG;GAAK,CAAC,CAAC;;AAGtF,QAAO,IAAI,GAAG,KAAK,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-Du4i4XDg.js","names":[],"sources":["../src/plugins/loader/node.ts"],"sourcesContent":["import type { LoadFnOutput, LoadHook } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"node:fs/promises\";\nimport type { Loader } from \"@/plugins/loader\";\n\nexport function toNode(loaders: { test: RegExp | undefined; loader: Loader }[]): LoadHook {\n return async (url, _context, nextLoad): Promise<LoadFnOutput> => {\n if (!url.startsWith(\"file:///\")) return nextLoad(url);\n\n const config = loaders.find((loader) => !loader.test || loader.test.test(url));\n if (config) {\n const parsedUrl = new URL(url);\n const filePath = fileURLToPath(parsedUrl);\n\n const result = await config.loader.load({\n filePath,\n query: Object.fromEntries(parsedUrl.searchParams.entries()),\n async getSource() {\n return (await fs.readFile(filePath)).toString();\n },\n development: false,\n addDependency() {},\n });\n\n if (result) {\n return {\n source: result.code,\n format: \"module\",\n shortCircuit: true,\n };\n }\n }\n\n return nextLoad(url);\n };\n}\n"],"mappings":";;;AAKA,SAAgB,OAAO,SAAmE;AACxF,QAAO,OAAO,KAAK,UAAU,aAAoC;AAC/D,MAAI,CAAC,IAAI,WAAW,WAAW,CAAE,QAAO,SAAS,IAAI;EAErD,MAAM,SAAS,QAAQ,MAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC;AAC9E,MAAI,QAAQ;GACV,MAAM,YAAY,IAAI,IAAI,IAAI;GAC9B,MAAM,WAAW,cAAc,UAAU;GAEzC,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK;IACtC;IACA,OAAO,OAAO,YAAY,UAAU,aAAa,SAAS,CAAC;IAC3D,MAAM,YAAY;AAChB,aAAQ,MAAM,GAAG,SAAS,SAAS,EAAE,UAAU;;IAEjD,aAAa;IACb,gBAAgB;IACjB,CAAC;AAEF,OAAI,OACF,QAAO;IACL,QAAQ,OAAO;IACf,QAAQ;IACR,cAAc;IACf;;AAIL,SAAO,SAAS,IAAI"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.js","names":[],"sources":["../../src/plugins/git.ts"],"sourcesContent":["import path from \"node:path\";\nimport { type Output, x } from \"tinyexec\";\nimport type { Plugin } from \"@/core\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { defineCollectionHook } from \"@/collections\";\nimport { asyncHook, AsyncHook } from \"@/utils/hook\";\n\nexport interface GitFileData {\n /**\n * Last modified date of file, obtained from version control.\n */\n lastModified: Date | null;\n /**\n * Creation date of file, obtained from version control.\n */\n creationDate: Date | null;\n}\n\nexport interface GitHook {\n /**\n * receive the client.\n */\n onClient: AsyncHook<{ client: GitClient }>;\n}\n\nexport const gitHook = defineCollectionHook<GitHook>(\"git\", () => ({\n onClient: asyncHook(),\n}));\n\n/**\n * Add version control integration for Git.\n * 1. Injects `creationDate` & `lastModified` properties to page exports.\n *\n * @remarks If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`. This ensures the client can access the full commit history of Git.\n */\nexport default function git(): Plugin {\n let client: GitClient;\n\n return {\n name: \"git\",\n config() {\n const { cwd } = this.core.getOptions();\n client = createGitClient(cwd);\n },\n async collection(collection) {\n await collection.getPluginHook(gitHook)?.onClient.run({ client });\n },\n };\n}\n\nexport interface GitClient {\n getFileData: (options: { filePath: string }) => Promise<GitFileData>;\n}\n\nfunction createGitClient(cwd: string): GitClient {\n const cache = createCache<GitFileData>();\n\n function mapDate(out: Output): Date | null {\n if (out.exitCode !== 0) return null;\n const date = new Date(out.stdout);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n return {\n async getFileData({ filePath }) {\n return cache.cached(filePath, async () => {\n const relativePath = path.relative(cwd, filePath);\n const [mod, create] = await Promise.all([\n x(\"git\", [\"log\", \"-1\", \"--pretty=%ai\", relativePath], {\n nodeOptions: {\n cwd,\n },\n }),\n x(\"git\", [\"log\", \"--diff-filter=A\", \"--follow\", \"--format=%ai\", \"-1\", relativePath], {\n nodeOptions: {\n cwd,\n },\n }),\n ]);\n\n return {\n lastModified: mapDate(mod),\n creationDate: mapDate(create),\n };\n });\n },\n };\n}\n"],"mappings":";;;;;AAyBA,MAAa,UAAU,qBAA8B,cAAc,EACjE,UAAU,WAAW,EACtB,EAAE;;;;;;;AAQH,SAAwB,MAAc;CACpC,IAAI;AAEJ,QAAO;EACL,MAAM;EACN,SAAS;GACP,MAAM,EAAE,QAAQ,KAAK,KAAK,YAAY;AACtC,YAAS,gBAAgB,IAAI;;EAE/B,MAAM,WAAW,YAAY;AAC3B,SAAM,WAAW,cAAc,QAAQ,EAAE,SAAS,IAAI,EAAE,QAAQ,CAAC;;EAEpE;;AAOH,SAAS,gBAAgB,KAAwB;CAC/C,MAAM,QAAQ,aAA0B;CAExC,SAAS,QAAQ,KAA0B;AACzC,MAAI,IAAI,aAAa,EAAG,QAAO;EAC/B,MAAM,OAAO,IAAI,KAAK,IAAI,OAAO;AACjC,SAAO,OAAO,MAAM,KAAK,SAAS,CAAC,GAAG,OAAO;;AAG/C,QAAO,EACL,MAAM,YAAY,EAAE,YAAY;AAC9B,SAAO,MAAM,OAAO,UAAU,YAAY;GACxC,MAAM,eAAe,KAAK,SAAS,KAAK,SAAS;GACjD,MAAM,CAAC,KAAK,UAAU,MAAM,QAAQ,IAAI,CACtC,EAAE,OAAO;IAAC;IAAO;IAAM;IAAgB;IAAa,EAAE,EACpD,aAAa,EACX,KACD,EACF,CAAC,EACF,EAAE,OAAO;IAAC;IAAO;IAAmB;IAAY;IAAgB;IAAM;IAAa,EAAE,EACnF,aAAa,EACX,KACD,EACF,CAAC,CACH,CAAC;AAEF,UAAO;IACL,cAAc,QAAQ,IAAI;IAC1B,cAAc,QAAQ,OAAO;IAC9B;IACD;IAEL"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-schema.d.ts","names":[],"sources":["../../src/plugins/json-schema.ts"],"mappings":";;;UAMiB,iBAAA;;AAAjB;;;;EAME,MAAA;EAKA;;;EAAA,MAAA,SAAe,SAAA;AAAA;AAAA,UAGA,cAAA;EACf,aAAA;EACA,MAAA,SAAe,SAAA;AAAA;;;;cAMJ,cAAA,EAAc,cAAA,CAAA,cAAA,EAAA,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-schema.js","names":[],"sources":["../../src/plugins/json-schema.ts"],"sourcesContent":["import { defineCollectionHook } from \"@/collections\";\nimport { FileSystemCollection } from \"@/collections/fs\";\nimport { Awaitable } from \"@/types\";\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 * create JSON schema\n */\n create?: () => Awaitable<object | undefined>;\n}\n\nexport interface JSONSchemaHook {\n getSchemaPath: () => string;\n create?: () => Awaitable<object | undefined>;\n}\n\n/**\n * Generate JSON schemas locally for collection schemas.\n */\nexport const jsonSchemaHook = defineCollectionHook<JSONSchemaHook, JSONSchemaOptions>(\n \"json-schema\",\n (collection, { insert = false, create }) => {\n const hook: JSONSchemaHook = {\n create,\n getSchemaPath() {\n return `json-schema/${collection.name}.json`;\n },\n };\n\n collection.onServer.hook(({ core, server }) => {\n const { outDir } = core.getOptions();\n if (!server.watcher || !insert || !(collection instanceof FileSystemCollection)) return;\n\n server.watcher.on(\"add\", async (file) => {\n if (!collection.hasFile(file) || !file.endsWith(\".json\")) return;\n\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(outDir, hook.getSchemaPath());\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 collection.onEmit.pipe(async (entries) => {\n const jsonSchema = await hook.create?.();\n if (!jsonSchema) return entries;\n entries.push({\n path: hook.getSchemaPath(),\n content: JSON.stringify(jsonSchema, null, 2),\n });\n return entries;\n });\n return hook;\n },\n);\n"],"mappings":";;;;;;;;AA4BA,MAAa,iBAAiB,qBAC5B,gBACC,YAAY,EAAE,SAAS,OAAO,aAAa;CAC1C,MAAM,OAAuB;EAC3B;EACA,gBAAgB;AACd,UAAO,eAAe,WAAW,KAAK;;EAEzC;AAED,YAAW,SAAS,MAAM,EAAE,MAAM,aAAa;EAC7C,MAAM,EAAE,WAAW,KAAK,YAAY;AACpC,MAAI,CAAC,OAAO,WAAW,CAAC,UAAU,EAAE,sBAAsB,sBAAuB;AAEjF,SAAO,QAAQ,GAAG,OAAO,OAAO,SAAS;AACvC,OAAI,CAAC,WAAW,QAAQ,KAAK,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAE;GAE1D,IAAI;AACJ,OAAI;IACF,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,EAAE,UAAU;AACpD,UAAM,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,GAAG,EAAE;WAC7C;AACN;;AAGF,OAAI,aAAa,IAAK;GACtB,MAAM,aAAa,KAAK,KAAK,QAAQ,KAAK,eAAe,CAAC;GAC1D,MAAM,UAAU;IACd,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,EAAE,WAAW;IACtD,GAAG;IACJ;AAED,SAAM,GAAG,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;IAC1D;GACF;AACF,YAAW,OAAO,KAAK,OAAO,YAAY;EACxC,MAAM,aAAa,MAAM,KAAK,UAAU;AACxC,MAAI,CAAC,WAAY,QAAO;AACxB,UAAQ,KAAK;GACX,MAAM,KAAK,eAAe;GAC1B,SAAS,KAAK,UAAU,YAAY,MAAM,EAAE;GAC7C,CAAC;AACF,SAAO;GACP;AACF,QAAO;EAEV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/loader/index.ts"],"sourcesContent":["import { defineCollectionHook } from \"@/collections\";\nimport type { Plugin, PluginContext } from \"@/core\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { NextConfig } from \"next\";\nimport { WebpackLoaderOptions } from \"./webpack.js\";\nimport path from \"node:path\";\n\ntype Awaitable<T> = T | Promise<T>;\n\ntype LoaderEnvironment = \"vite\" | \"bun\" | \"node\";\n\nexport interface Loader {\n /**\n * Transform input into JavaScript.\n *\n * Returns:\n * - `LoaderOutput`: JavaScript code & source map.\n * - `null`: skip the loader. Fallback to default behaviour if possible, otherwise the adapter will try workarounds.\n */\n load: (input: LoaderInput) => Awaitable<LoaderOutput | null>;\n\n bun?: {\n /**\n * 1. Bun doesn't allow `null` in loaders.\n * 2. Bun requires sync result to support dynamic require().\n */\n load?: (source: string, input: LoaderInput) => Awaitable<Bun.OnLoadResult>;\n };\n}\n\nexport interface LoaderInput {\n development: boolean;\n\n filePath: string;\n query: Record<string, string | string[] | undefined>;\n getSource: () => string | Promise<string>;\n addDependency: (file: string) => void;\n}\n\nexport interface LoaderOutput {\n code: string;\n map?: unknown;\n\n /**\n * only supported on Vite 8 at the moment, specify the output module type.\n *\n * on unsupported environments, it will be ignored.\n */\n moduleType?: \"js\" | \"json\";\n}\n\ninterface NextLoaderContext extends PluginContext {\n getLoaderOptions: () => WebpackLoaderOptions;\n}\n\nexport interface LoaderConfig {\n /** unique ID for loader, used to deduplicate loaders */\n id?: string;\n\n /**\n * Filter file paths, the input can be either a file URL or file path.\n *\n * Must take resource query into consideration.\n */\n test?: RegExp;\n\n /**\n * @remarks it doesn't configure automatically for Next.js, you have to define the webpack/turbopack config in `configureNext()`.\n */\n createLoader: (this: PluginContext, environment: LoaderEnvironment) => Promise<Loader>;\n configureNext?: (this: NextLoaderContext, next: NextConfig) => NextConfig;\n}\n\ninterface ResolvedLoader {\n id: string;\n test: RegExp | undefined;\n loader: Loader;\n}\n\n/**\n * a light layer for implementing loaders.\n */\nexport function loaderPlugin(): Plugin {\n // env -> loaders\n const cachedLoaders = createCache<ResolvedLoader[]>();\n\n function initLoaders(ctx: PluginContext, env: LoaderEnvironment) {\n const { core } = ctx;\n return cachedLoaders.cached(env, async () => {\n const usedIds = new Set<string>();\n const out: ResolvedLoader[] = [];\n\n for (const collection of core.getCollections()) {\n const hook = collection.getPluginHook(loaderHook);\n if (!hook) continue;\n\n let nextId = 0;\n for (const loader of hook.loaders) {\n if (loader.id && usedIds.has(loader.id)) continue;\n if (loader.id) usedIds.add(loader.id);\n\n out.push({\n id: loader.id ?? `${collection.name}:${nextId++}`,\n test: loader.test,\n loader: await loader.createLoader.call(ctx, env),\n });\n }\n }\n return out;\n });\n }\n\n return {\n name: \"fuma-content:loader\",\n next: {\n config(config) {\n const ctx: NextLoaderContext = {\n ...this,\n getLoaderOptions: () => {\n const { configPath, outDir } = this.core.getOptions();\n return {\n configPath,\n outDir,\n absoluteCompiledConfigPath: path.resolve(this.core.getCompiledConfigPath()),\n isDev: process.env.NODE_ENV === \"development\",\n };\n },\n };\n for (const collection of this.core.getCollections(true)) {\n const hook = collection.getPluginHook(loaderHook);\n if (!hook) continue;\n\n for (const loader of hook.loaders) {\n if (loader.configureNext) config = loader.configureNext.call(ctx, config);\n }\n }\n\n return config;\n },\n },\n bun: {\n async setup(build) {\n const { toBun } = await import(\"./bun\");\n\n for (const loader of await initLoaders(this, \"bun\")) {\n toBun(loader.test, loader.loader)(build);\n }\n },\n },\n node: {\n async createLoad() {\n const { toNode } = await import(\"./node\");\n return toNode(await initLoaders(this, \"node\"));\n },\n },\n vite: {\n async createPlugin() {\n const { toVite } = await import(\"./vite\");\n return (await initLoaders(this, \"vite\")).map((loader) => {\n return toVite(`fuma-content:${loader.id}`, loader.test, loader.loader);\n });\n },\n },\n };\n}\n\nexport interface LoaderHook {\n loaders: LoaderConfig[];\n}\n\nexport const loaderHook = defineCollectionHook<LoaderHook>(\"loader\", () => ({\n loaders: [],\n}));\n"],"mappings":";;;;;;;AAkFA,SAAgB,eAAuB;CAErC,MAAM,gBAAgB,aAA+B;CAErD,SAAS,YAAY,KAAoB,KAAwB;EAC/D,MAAM,EAAE,SAAS;AACjB,SAAO,cAAc,OAAO,KAAK,YAAY;GAC3C,MAAM,0BAAU,IAAI,KAAa;GACjC,MAAM,MAAwB,EAAE;AAEhC,QAAK,MAAM,cAAc,KAAK,gBAAgB,EAAE;IAC9C,MAAM,OAAO,WAAW,cAAc,WAAW;AACjD,QAAI,CAAC,KAAM;IAEX,IAAI,SAAS;AACb,SAAK,MAAM,UAAU,KAAK,SAAS;AACjC,SAAI,OAAO,MAAM,QAAQ,IAAI,OAAO,GAAG,CAAE;AACzC,SAAI,OAAO,GAAI,SAAQ,IAAI,OAAO,GAAG;AAErC,SAAI,KAAK;MACP,IAAI,OAAO,MAAM,GAAG,WAAW,KAAK,GAAG;MACvC,MAAM,OAAO;MACb,QAAQ,MAAM,OAAO,aAAa,KAAK,KAAK,IAAI;MACjD,CAAC;;;AAGN,UAAO;IACP;;AAGJ,QAAO;EACL,MAAM;EACN,MAAM,EACJ,OAAO,QAAQ;GACb,MAAM,MAAyB;IAC7B,GAAG;IACH,wBAAwB;KACtB,MAAM,EAAE,YAAY,WAAW,KAAK,KAAK,YAAY;AACrD,YAAO;MACL;MACA;MACA,4BAA4B,KAAK,QAAQ,KAAK,KAAK,uBAAuB,CAAC;MAC3E,OAAO,QAAQ,IAAI,aAAa;MACjC;;IAEJ;AACD,QAAK,MAAM,cAAc,KAAK,KAAK,eAAe,KAAK,EAAE;IACvD,MAAM,OAAO,WAAW,cAAc,WAAW;AACjD,QAAI,CAAC,KAAM;AAEX,SAAK,MAAM,UAAU,KAAK,QACxB,KAAI,OAAO,cAAe,UAAS,OAAO,cAAc,KAAK,KAAK,OAAO;;AAI7E,UAAO;KAEV;EACD,KAAK,EACH,MAAM,MAAM,OAAO;GACjB,MAAM,EAAE,UAAU,MAAM,OAAO;AAE/B,QAAK,MAAM,UAAU,MAAM,YAAY,MAAM,MAAM,CACjD,OAAM,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM;KAG7C;EACD,MAAM,EACJ,MAAM,aAAa;GACjB,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,UAAO,OAAO,MAAM,YAAY,MAAM,OAAO,CAAC;KAEjD;EACD,MAAM,EACJ,MAAM,eAAe;GACnB,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,WAAQ,MAAM,YAAY,MAAM,OAAO,EAAE,KAAK,WAAW;AACvD,WAAO,OAAO,gBAAgB,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;KACtE;KAEL;EACF;;AAOH,MAAa,aAAa,qBAAiC,iBAAiB,EAC1E,SAAS,EAAE,EACZ,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"webpack.js","names":[],"sources":["../../../src/plugins/loader/webpack.ts"],"sourcesContent":["import { parse } from \"node:querystring\";\nimport { ValidationError } from \"@/utils/validation\";\nimport path from \"node:path\";\nimport { Core } from \"@/core\";\nimport { createDynamicCore, type DynamicCore } from \"@/dynamic\";\nimport type { LoaderContext } from \"webpack\";\nimport type { Loader } from \"@/plugins/loader\";\n\nexport interface WebpackLoaderOptions {\n absoluteCompiledConfigPath: string;\n configPath: string;\n outDir: string;\n isDev: boolean;\n}\n\nexport type WebpackLoader = (this: LoaderContext<WebpackLoaderOptions>, source: string) => void;\n\nconst cachedCores = new Map<string, DynamicCore>();\n\nfunction initDynamicCore({ configPath, isDev, outDir }: WebpackLoaderOptions) {\n const key = `${configPath}:${isDev}:${outDir}`;\n let res = cachedCores.get(key);\n if (res) return res;\n\n res = createDynamicCore({\n core: new Core({ configPath, outDir }),\n compileMode: \"skip\",\n mode: isDev ? \"dev\" : \"production\",\n });\n cachedCores.set(key, res);\n return res;\n}\n\n/**\n * Note: need to handle the `test` regex in Webpack config instead.\n */\nexport function createWebpackLoader(loaderFactory: (core: DynamicCore) => Loader): WebpackLoader {\n let loader: Loader | undefined;\n\n async function asyncLoader(\n this: LoaderContext<WebpackLoaderOptions>,\n source: string,\n callback: LoaderContext<WebpackLoaderOptions>[\"callback\"],\n ) {\n const options = this.getOptions();\n this.cacheable(true);\n this.addDependency(options.absoluteCompiledConfigPath);\n\n if (!loader) {\n const core = initDynamicCore(options);\n loader = loaderFactory(core);\n }\n\n try {\n const result = await loader.load({\n filePath: this.resourcePath,\n query: parse(this.resourceQuery.slice(1)),\n getSource() {\n return source;\n },\n development: this.mode === \"development\",\n addDependency: (file) => {\n this.addDependency(file);\n },\n });\n\n if (result === null) {\n callback(undefined, source);\n } else {\n callback(undefined, result.code, result.map as string);\n }\n } catch (error) {\n if (error instanceof ValidationError) {\n return callback(new Error(await error.toStringFormatted()));\n }\n\n if (!(error instanceof Error)) throw error;\n\n const fpath = path.relative(this.context, this.resourcePath);\n error.message = `${fpath}:${error.name}: ${error.message}`;\n callback(error);\n }\n }\n\n return function loader(source) {\n return asyncLoader.call(this, source, this.async());\n };\n}\n"],"mappings":";;;;;;AAiBA,MAAM,8BAAc,IAAI,KAA0B;AAElD,SAAS,gBAAgB,EAAE,YAAY,OAAO,UAAgC;CAC5E,MAAM,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG;CACtC,IAAI,MAAM,YAAY,IAAI,IAAI;AAC9B,KAAI,IAAK,QAAO;AAEhB,OAAM,kBAAkB;EACtB,MAAM,IAAI,KAAK;GAAE;GAAY;GAAQ,CAAC;EACtC,aAAa;EACb,MAAM,QAAQ,QAAQ;EACvB,CAAC;AACF,aAAY,IAAI,KAAK,IAAI;AACzB,QAAO;;;;;AAMT,SAAgB,oBAAoB,eAA6D;CAC/F,IAAI;CAEJ,eAAe,YAEb,QACA,UACA;EACA,MAAM,UAAU,KAAK,YAAY;AACjC,OAAK,UAAU,KAAK;AACpB,OAAK,cAAc,QAAQ,2BAA2B;AAEtD,MAAI,CAAC,OAEH,UAAS,cADI,gBAAgB,QAAQ,CACT;AAG9B,MAAI;GACF,MAAM,SAAS,MAAM,OAAO,KAAK;IAC/B,UAAU,KAAK;IACf,OAAO,MAAM,KAAK,cAAc,MAAM,EAAE,CAAC;IACzC,YAAY;AACV,YAAO;;IAET,aAAa,KAAK,SAAS;IAC3B,gBAAgB,SAAS;AACvB,UAAK,cAAc,KAAK;;IAE3B,CAAC;AAEF,OAAI,WAAW,KACb,UAAS,KAAA,GAAW,OAAO;OAE3B,UAAS,KAAA,GAAW,OAAO,MAAM,OAAO,IAAc;WAEjD,OAAO;AACd,OAAI,iBAAiB,gBACnB,QAAO,SAAS,IAAI,MAAM,MAAM,MAAM,mBAAmB,CAAC,CAAC;AAG7D,OAAI,EAAE,iBAAiB,OAAQ,OAAM;AAGrC,SAAM,UAAU,GADF,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,CACnC,GAAG,MAAM,KAAK,IAAI,MAAM;AACjD,YAAS,MAAM;;;AAInB,QAAO,SAAS,OAAO,QAAQ;AAC7B,SAAO,YAAY,KAAK,MAAM,QAAQ,KAAK,OAAO,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"include.d.ts","names":[],"sources":["../../../src/plugins/remark/include.ts"],"mappings":";;;;UAWiB,MAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UA4Ke,oBAAA;EACf,OAAA;AAAA;AAAA;EAAA,UAIU,OAAA;IALyB;IAOjC,WAAA;EAAA;AAAA;AAAA,iBAIY,aAAA,CACd,IAAA,EAAM,SAAA;EACJ;AAAA,IAAuB,oBAAA,GACxB,WAAA,CAAY,IAAA,EAAM,IAAA"}