fuma-content 1.1.2 → 1.1.4

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 (192) hide show
  1. package/dist/async-cache-BVuJiIDT.d.ts +9 -0
  2. package/dist/async-cache-BVuJiIDT.d.ts.map +1 -0
  3. package/dist/{async-cache-U87GzQTb.js → async-cache-DRmFaVGm.js} +1 -1
  4. package/dist/{async-cache-U87GzQTb.js.map → async-cache-DRmFaVGm.js.map} +1 -1
  5. package/dist/build-mdx-DRqbcE1d.d.ts +79 -0
  6. package/dist/build-mdx-DRqbcE1d.d.ts.map +1 -0
  7. package/dist/{build-mdx-CUp6FpfT.js → build-mdx-DgzggXIL.js} +27 -40
  8. package/dist/build-mdx-DgzggXIL.js.map +1 -0
  9. package/dist/bun/index.d.ts +1 -1
  10. package/dist/bun/index.d.ts.map +1 -1
  11. package/dist/bun/index.js +2 -2
  12. package/dist/{bun-CBROq3I0.js → bun-Be5pgXW_.js} +4 -3
  13. package/dist/bun-Be5pgXW_.js.map +1 -0
  14. package/dist/{code-generator-Qhhq7kHh.js → code-generator-CHcOrCeM.js} +5 -7
  15. package/dist/code-generator-CHcOrCeM.js.map +1 -0
  16. package/dist/collections/data/runtime.d.ts +3 -6
  17. package/dist/collections/data/runtime.d.ts.map +1 -1
  18. package/dist/collections/data/runtime.js.map +1 -1
  19. package/dist/collections/data.d.ts +4 -4
  20. package/dist/collections/data.d.ts.map +1 -1
  21. package/dist/collections/data.js +158 -4
  22. package/dist/collections/data.js.map +1 -0
  23. package/dist/collections/fs.d.ts +45 -3
  24. package/dist/collections/fs.d.ts.map +1 -0
  25. package/dist/collections/fs.js +65 -2
  26. package/dist/collections/fs.js.map +1 -0
  27. package/dist/collections/index.d.ts +37 -2
  28. package/dist/collections/index.d.ts.map +1 -0
  29. package/dist/collections/index.js +37 -2
  30. package/dist/collections/index.js.map +1 -0
  31. package/dist/collections/json/loader-webpack.d.ts +3 -3
  32. package/dist/collections/json/loader-webpack.d.ts.map +1 -1
  33. package/dist/collections/json/loader-webpack.js +3 -7
  34. package/dist/collections/json/loader-webpack.js.map +1 -1
  35. package/dist/collections/mdx/loader-webpack.d.ts +3 -3
  36. package/dist/collections/mdx/loader-webpack.d.ts.map +1 -1
  37. package/dist/collections/mdx/loader-webpack.js +3 -8
  38. package/dist/collections/mdx/loader-webpack.js.map +1 -1
  39. package/dist/collections/mdx/react.d.ts +3 -10
  40. package/dist/collections/mdx/react.d.ts.map +1 -1
  41. package/dist/collections/mdx/react.js +2 -1
  42. package/dist/collections/mdx/react.js.map +1 -1
  43. package/dist/collections/mdx/runtime-browser.d.ts +25 -11
  44. package/dist/collections/mdx/runtime-browser.d.ts.map +1 -0
  45. package/dist/collections/mdx/runtime-browser.js +2 -2
  46. package/dist/collections/mdx/runtime-browser.js.map +1 -1
  47. package/dist/collections/mdx/runtime-dynamic.d.ts +6 -10
  48. package/dist/collections/mdx/runtime-dynamic.d.ts.map +1 -1
  49. package/dist/collections/mdx/runtime-dynamic.js +15 -13
  50. package/dist/collections/mdx/runtime-dynamic.js.map +1 -1
  51. package/dist/collections/mdx/runtime.d.ts +26 -10
  52. package/dist/collections/mdx/runtime.d.ts.map +1 -0
  53. package/dist/collections/mdx/runtime.js.map +1 -1
  54. package/dist/collections/mdx.d.ts +66 -6
  55. package/dist/collections/mdx.d.ts.map +1 -0
  56. package/dist/collections/mdx.js +316 -6
  57. package/dist/collections/mdx.js.map +1 -0
  58. package/dist/collections/obsidian.d.ts +10 -0
  59. package/dist/collections/obsidian.d.ts.map +1 -0
  60. package/dist/collections/obsidian.js +497 -0
  61. package/dist/collections/obsidian.js.map +1 -0
  62. package/dist/collections/runtime/file-store.d.ts +21 -4
  63. package/dist/collections/runtime/file-store.d.ts.map +1 -0
  64. package/dist/collections/runtime/file-store.js +1 -1
  65. package/dist/collections/runtime/store.d.ts +31 -3
  66. package/dist/collections/runtime/store.d.ts.map +1 -0
  67. package/dist/collections/runtime/store.js +33 -2
  68. package/dist/collections/runtime/store.js.map +1 -0
  69. package/dist/collections/yaml/loader-webpack.d.ts +3 -3
  70. package/dist/collections/yaml/loader-webpack.d.ts.map +1 -1
  71. package/dist/collections/yaml/loader-webpack.js +3 -7
  72. package/dist/collections/yaml/loader-webpack.js.map +1 -1
  73. package/dist/config/index.d.ts +35 -2
  74. package/dist/config/index.d.ts.map +1 -0
  75. package/dist/config/index.js.map +1 -1
  76. package/dist/{core-Uv3jZqL-.js → core-BuUsOElL.js} +9 -9
  77. package/dist/core-BuUsOElL.js.map +1 -0
  78. package/dist/{core-CT06v32N.d.ts → core-FjA_Xoho.d.ts} +4 -67
  79. package/dist/core-FjA_Xoho.d.ts.map +1 -0
  80. package/dist/dynamic.d.ts +25 -3
  81. package/dist/dynamic.d.ts.map +1 -0
  82. package/dist/dynamic.js +28 -2
  83. package/dist/dynamic.js.map +1 -0
  84. package/dist/{fuma-matter-BuBO2w-p.js → fuma-matter-B4gT09gM.js} +1 -1
  85. package/dist/fuma-matter-B4gT09gM.js.map +1 -0
  86. package/dist/index.d.ts +1 -1
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +3 -3
  89. package/dist/is-promise-like-DYHv0Yap.js +8 -0
  90. package/dist/is-promise-like-DYHv0Yap.js.map +1 -0
  91. package/dist/{load-from-file-z7EGuf2n.js → load-from-file-BhdBOcQT.js} +4 -2
  92. package/dist/{load-from-file-z7EGuf2n.js.map → load-from-file-BhdBOcQT.js.map} +1 -1
  93. package/dist/load-from-file-CIYdu-B5.d.ts +10 -0
  94. package/dist/load-from-file-CIYdu-B5.d.ts.map +1 -0
  95. package/dist/loader-BOYLUNfh.js +18 -0
  96. package/dist/{loader-BK8PnqRg.js.map → loader-BOYLUNfh.js.map} +1 -1
  97. package/dist/{loader-CnksfM7I.js → loader-BT4fwLTJ.js} +13 -7
  98. package/dist/loader-BT4fwLTJ.js.map +1 -0
  99. package/dist/loader-Cb9kSSxT.js +19 -0
  100. package/dist/{loader-Cnz-VHne.js.map → loader-Cb9kSSxT.js.map} +1 -1
  101. package/dist/{loader-CuntMmR4.js → loader-UhlX4xbz.js} +3 -3
  102. package/dist/loader-UhlX4xbz.js.map +1 -0
  103. package/dist/next/index.d.ts +1 -1
  104. package/dist/next/index.d.ts.map +1 -1
  105. package/dist/next/index.js +3 -3
  106. package/dist/next/index.js.map +1 -1
  107. package/dist/node/index.d.ts +1 -1
  108. package/dist/node/index.d.ts.map +1 -1
  109. package/dist/node/loader.d.ts +1 -1
  110. package/dist/node/loader.d.ts.map +1 -1
  111. package/dist/node/loader.js +8 -8
  112. package/dist/node/loader.js.map +1 -1
  113. package/dist/{node-2VZOh3P9.js → node-Cu5Pqxxo.js} +2 -2
  114. package/dist/node-Cu5Pqxxo.js.map +1 -0
  115. package/dist/{collections-CNWuMDAZ.js → pipe-CvCqOpXX.js} +2 -36
  116. package/dist/pipe-CvCqOpXX.js.map +1 -0
  117. package/dist/plugins/git.d.ts +38 -3
  118. package/dist/plugins/git.d.ts.map +1 -0
  119. package/dist/plugins/git.js +60 -2
  120. package/dist/plugins/git.js.map +1 -0
  121. package/dist/plugins/json-schema.d.ts +2 -1
  122. package/dist/plugins/json-schema.d.ts.map +1 -1
  123. package/dist/plugins/json-schema.js +2 -2
  124. package/dist/plugins/json-schema.js.map +1 -1
  125. package/dist/plugins/loader/index.d.ts +72 -4
  126. package/dist/plugins/loader/index.d.ts.map +1 -0
  127. package/dist/plugins/loader/index.js +77 -2
  128. package/dist/plugins/loader/index.js.map +1 -0
  129. package/dist/plugins/loader/webpack.d.ts +21 -4
  130. package/dist/plugins/loader/webpack.d.ts.map +1 -0
  131. package/dist/plugins/loader/webpack.js +7 -5
  132. package/dist/plugins/loader/webpack.js.map +1 -1
  133. package/dist/rolldown-runtime-CjeV3_4I.js +18 -0
  134. package/dist/{validation-BvVvvLII.js → validation-C3kXuveD.js} +1 -1
  135. package/dist/{validation-BvVvvLII.js.map → validation-C3kXuveD.js.map} +1 -1
  136. package/dist/vite/index.d.ts +1 -1
  137. package/dist/vite/index.d.ts.map +1 -1
  138. package/dist/vite/index.js +4 -15
  139. package/dist/vite/index.js.map +1 -1
  140. package/dist/{vite-C1qXY47G.js → vite-CoJIMNWk.js} +4 -4
  141. package/dist/vite-CoJIMNWk.js.map +1 -0
  142. package/package.json +27 -11
  143. package/dist/build-mdx-CUp6FpfT.js.map +0 -1
  144. package/dist/build-mdx-D6zM3Sgl.js +0 -4
  145. package/dist/bun-CBROq3I0.js.map +0 -1
  146. package/dist/code-generator-Qhhq7kHh.js.map +0 -1
  147. package/dist/collections-CNWuMDAZ.js.map +0 -1
  148. package/dist/core-CT06v32N.d.ts.map +0 -1
  149. package/dist/core-Uv3jZqL-.js.map +0 -1
  150. package/dist/data-Cxsx5KPD.js +0 -159
  151. package/dist/data-Cxsx5KPD.js.map +0 -1
  152. package/dist/dynamic-Ck1wYoaL.d.ts +0 -33
  153. package/dist/dynamic-Ck1wYoaL.d.ts.map +0 -1
  154. package/dist/dynamic-CtOB4Rkp.js +0 -29
  155. package/dist/dynamic-CtOB4Rkp.js.map +0 -1
  156. package/dist/file-store-Dm1SjuLg.d.ts +0 -20
  157. package/dist/file-store-Dm1SjuLg.d.ts.map +0 -1
  158. package/dist/fs-CXzVd2Dp.js +0 -68
  159. package/dist/fs-CXzVd2Dp.js.map +0 -1
  160. package/dist/fs-CmwaaFyx.d.ts +0 -45
  161. package/dist/fs-CmwaaFyx.d.ts.map +0 -1
  162. package/dist/fuma-matter-BuBO2w-p.js.map +0 -1
  163. package/dist/git-DnejL9r_.js +0 -60
  164. package/dist/git-DnejL9r_.js.map +0 -1
  165. package/dist/git-n-9ddn78.d.ts +0 -37
  166. package/dist/git-n-9ddn78.d.ts.map +0 -1
  167. package/dist/index-BheUVWBm.d.ts +0 -87
  168. package/dist/index-BheUVWBm.d.ts.map +0 -1
  169. package/dist/load-from-file-D-Xm95Fz.js +0 -3
  170. package/dist/loader-B4nQrRwA.js +0 -77
  171. package/dist/loader-B4nQrRwA.js.map +0 -1
  172. package/dist/loader-B6ordrWK.js +0 -9
  173. package/dist/loader-BK8PnqRg.js +0 -16
  174. package/dist/loader-CnksfM7I.js.map +0 -1
  175. package/dist/loader-Cnz-VHne.js +0 -17
  176. package/dist/loader-CuntMmR4.js.map +0 -1
  177. package/dist/loader-Cx1Rg_VM.js +0 -8
  178. package/dist/loader-Dao_nv3e.js +0 -8
  179. package/dist/mdx-Cw1nBJ0D.js +0 -306
  180. package/dist/mdx-Cw1nBJ0D.js.map +0 -1
  181. package/dist/mdx-PaqRNZMS.d.ts +0 -135
  182. package/dist/mdx-PaqRNZMS.d.ts.map +0 -1
  183. package/dist/node-2VZOh3P9.js.map +0 -1
  184. package/dist/runtime-BUUHSFlR.d.ts +0 -31
  185. package/dist/runtime-BUUHSFlR.d.ts.map +0 -1
  186. package/dist/runtime-browser-B70WGxeQ.d.ts +0 -29
  187. package/dist/runtime-browser-B70WGxeQ.d.ts.map +0 -1
  188. package/dist/store-CRyvZFKN.js +0 -34
  189. package/dist/store-CRyvZFKN.js.map +0 -1
  190. package/dist/store-D_PPrdRE.d.ts +0 -31
  191. package/dist/store-D_PPrdRE.d.ts.map +0 -1
  192. package/dist/vite-C1qXY47G.js.map +0 -1
@@ -0,0 +1,19 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
2
+ import { t as createDataLoader } from "./loader-UhlX4xbz.js";
3
+ import { load } from "js-yaml";
4
+
5
+ //#region src/collections/yaml/loader.ts
6
+ var loader_exports = /* @__PURE__ */ __exportAll({ createYamlLoader: () => createYamlLoader });
7
+ function createYamlLoader(core) {
8
+ return createDataLoader(core, (filePath, source) => {
9
+ try {
10
+ return load(source);
11
+ } catch (e) {
12
+ throw new Error(`invalid data in ${filePath}`, { cause: e });
13
+ }
14
+ });
15
+ }
16
+
17
+ //#endregion
18
+ export { loader_exports as n, createYamlLoader as t };
19
+ //# sourceMappingURL=loader-Cb9kSSxT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-Cnz-VHne.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
+ {"version":3,"file":"loader-Cb9kSSxT.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,5 +1,5 @@
1
- import { r as validate } from "./validation-BvVvvLII.js";
2
- import { t as DataCollection } from "./data-Cxsx5KPD.js";
1
+ import { r as validate } from "./validation-C3kXuveD.js";
2
+ import { DataCollection } from "./collections/data.js";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/collections/data/loader.ts
@@ -56,4 +56,4 @@ function createDataLoader({ getCore }, parse, moduleType = "js") {
56
56
 
57
57
  //#endregion
58
58
  export { createDataLoader as t };
59
- //# sourceMappingURL=loader-CuntMmR4.js.map
59
+ //# sourceMappingURL=loader-UhlX4xbz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-UhlX4xbz.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,4 +1,4 @@
1
- import { n as CoreOptions, t as Core } from "../core-CT06v32N.js";
1
+ import { n as CoreOptions, t as Core } from "../core-FjA_Xoho.js";
2
2
  import { NextConfig } from "next";
3
3
 
4
4
  //#region src/next/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/next/index.ts"],"sourcesContent":[],"mappings":";;;;UAOiB,WAAA,SAAoB,KAAK;;AAA1C;AASA;;;EAiBwC,KAAA,CAAA,EAAA,OAAA;;AAjBqB,iBAAvC,aAAA,CAAuC,OAAA,CAAA,EAAhB,WAAgB,CAAA,EAAA,OAAA,CAAA,CAAA,UAAA,CAAA,EAiBvC,UAjBuC,EAAA,GAiBrB,UAjBqB,CAAA;AA6EvC,iBAAA,oBAAA,CAAoB,OAAA,EAAU,WAAV,CAAA,EAAqB,OAArB,CAAqB,IAArB,CAAA"}
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,6 +1,6 @@
1
- import { t as Core } from "../core-Uv3jZqL-.js";
2
- import { n as loaderPlugin } from "../loader-B4nQrRwA.js";
3
- import { t as loadConfig } from "../load-from-file-z7EGuf2n.js";
1
+ import { t as Core } from "../core-BuUsOElL.js";
2
+ import { loaderPlugin } from "../plugins/loader/index.js";
3
+ import { t as loadConfig } from "../load-from-file-BhdBOcQT.js";
4
4
  import path from "node:path";
5
5
 
6
6
  //#region src/next/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["watcher: FSWatcher | undefined"],"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,IAAIA;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;AAChD,EAAK,QAAQ,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
+ {"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;AAChD,EAAK,QAAQ,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,4 +1,4 @@
1
- import "../core-CT06v32N.js";
1
+ import "../core-FjA_Xoho.js";
2
2
  import { LoaderOptions } from "./loader.js";
3
3
 
4
4
  //#region src/node/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"sourcesContent":[],"mappings":";;;;iBAGgB,QAAA,WAAkB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"mappings":";;;;iBAGgB,QAAA,CAAS,OAAA,GAAS,aAAA"}
@@ -1,4 +1,4 @@
1
- import { n as CoreOptions } from "../core-CT06v32N.js";
1
+ import { n as CoreOptions } from "../core-FjA_Xoho.js";
2
2
  import { InitializeHook, LoadHook } from "node:module";
3
3
 
4
4
  //#region src/node/loader.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","names":[],"sources":["../../src/node/loader.ts"],"sourcesContent":[],"mappings":";;;;KAQY,aAAA,GAAgB,KAAK;cAEpB,YAAY,eAAe;AAF5B,cAYC,IAZY,EAYN,QAZc"}
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,7 +1,7 @@
1
- import { t as createDynamicCore } from "../dynamic-CtOB4Rkp.js";
2
- import { t as Core } from "../core-Uv3jZqL-.js";
3
- import { t as createCache } from "../async-cache-U87GzQTb.js";
4
- import { n as loaderPlugin } from "../loader-B4nQrRwA.js";
1
+ import { createDynamicCore } from "../dynamic.js";
2
+ import { t as Core } from "../core-BuUsOElL.js";
3
+ import { t as createCache } from "../async-cache-DRmFaVGm.js";
4
+ import { loaderPlugin } from "../plugins/loader/index.js";
5
5
 
6
6
  //#region src/node/loader.ts
7
7
  let configLoader;
@@ -23,10 +23,10 @@ const load = async (url, context, nextLoad) => {
23
23
  return plugin.node?.createLoad?.call(ctx);
24
24
  }))).filter((v) => v !== void 0);
25
25
  });
26
- function run(i, url$1, context$1) {
27
- if (i >= hooks.length) return nextLoad(url$1, context$1);
28
- return hooks[i](url$1, context$1, (url$2, ctx) => run(i + 1, url$2, {
29
- ...context$1,
26
+ function run(i, url, context) {
27
+ if (i >= hooks.length) return nextLoad(url, context);
28
+ return hooks[i](url, context, (url, ctx) => run(i + 1, url, {
29
+ ...context,
30
30
  ...ctx
31
31
  }));
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","names":["configLoader: DynamicCore | undefined","initialize: InitializeHook<LoaderOptions>","load: LoadHook","url","context"],"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,IAAIA;AAIJ,MAAaC,cAA6C,YAAY;AACpE,gBAAe,kBAAkB;EAC/B,MAAM,IAAI,KAAK;GACb,GAAG;GACH,SAAS,CAAC,cAAc,CAAC;GAC1B,CAAC;EACF,MAAM;EACP,CAAC;;AAGJ,MAAaC,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,OAAU;GAC3C;CAEF,SAAS,IACP,GACA,OACA,WACsC;AACtC,MAAI,KAAK,MAAM,OACb,QAAO,SAASC,OAAKC,UAAQ;AAG/B,SAAO,MAAM,GAAGD,OAAKC,YAAU,OAAK,QAAQ,IAAI,IAAI,GAAGD,OAAK;GAAE,GAAGC;GAAS,GAAG;GAAK,CAAC,CAAC;;AAGtF,QAAO,IAAI,GAAG,KAAK,QAAQ"}
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,OAAU;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"}
@@ -16,7 +16,7 @@ function toNode(loaders) {
16
16
  return (await fs.readFile(filePath)).toString();
17
17
  },
18
18
  development: false,
19
- compiler: { addDependency() {} }
19
+ addDependency() {}
20
20
  });
21
21
  if (result) return {
22
22
  source: result.code,
@@ -30,4 +30,4 @@ function toNode(loaders) {
30
30
 
31
31
  //#endregion
32
32
  export { toNode };
33
- //# sourceMappingURL=node-2VZOh3P9.js.map
33
+ //# sourceMappingURL=node-Cu5Pqxxo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-Cu5Pqxxo.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"}
@@ -54,39 +54,5 @@ function asyncPipe(steps = []) {
54
54
  }
55
55
 
56
56
  //#endregion
57
- //#region src/collections/index.ts
58
- var Collection = class {
59
- pluginHooks = /* @__PURE__ */ new Map();
60
- name = null;
61
- /**
62
- * on config loaded/updated
63
- */
64
- onConfig = hook();
65
- /**
66
- * Configure watch/dev server
67
- */
68
- onServer = hook();
69
- onInit = asyncHook();
70
- onEmit = asyncPipe();
71
- plugins = [];
72
- pluginHook(hook$1, options) {
73
- let created = this.pluginHooks.get(hook$1.id);
74
- if (created) return created;
75
- created = hook$1.create(this, options);
76
- this.pluginHooks.set(hook$1.id, created);
77
- return created;
78
- }
79
- getPluginHook(hook$1) {
80
- return this.pluginHooks.get(hook$1.id);
81
- }
82
- };
83
- function defineCollectionHook(init) {
84
- return {
85
- id: Symbol(),
86
- create: init
87
- };
88
- }
89
-
90
- //#endregion
91
- export { asyncHook as a, pipe as i, defineCollectionHook as n, hook as o, asyncPipe as r, Collection as t };
92
- //# sourceMappingURL=collections-CNWuMDAZ.js.map
57
+ export { hook as i, pipe as n, asyncHook as r, asyncPipe as t };
58
+ //# sourceMappingURL=pipe-CvCqOpXX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe-CvCqOpXX.js","names":[],"sources":["../src/utils/hook.ts","../src/utils/pipe.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"],"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;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;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;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;EAChB"}
@@ -1,3 +1,38 @@
1
- import "../core-CT06v32N.js";
2
- import { a as gitHook, i as git, n as GitFileData, r as GitHook, t as GitClient } from "../git-n-9ddn78.js";
3
- export { GitClient, GitFileData, GitHook, git as default, gitHook };
1
+ import { s as Plugin, v as AsyncHook } from "../core-FjA_Xoho.js";
2
+ import { CollectionHook } from "../collections/index.js";
3
+
4
+ //#region src/plugins/git.d.ts
5
+ interface GitFileData {
6
+ /**
7
+ * Last modified date of file, obtained from version control.
8
+ */
9
+ lastModified: Date | null;
10
+ /**
11
+ * Creation date of file, obtained from version control.
12
+ */
13
+ creationDate: Date | null;
14
+ }
15
+ interface GitHook {
16
+ /**
17
+ * receive the client.
18
+ */
19
+ onClient: AsyncHook<{
20
+ client: GitClient;
21
+ }>;
22
+ }
23
+ declare const gitHook: CollectionHook<GitHook, undefined>;
24
+ /**
25
+ * Add version control integration for Git.
26
+ * 1. Injects `creationDate` & `lastModified` properties to page exports.
27
+ *
28
+ * @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.
29
+ */
30
+ declare function git(): Plugin;
31
+ interface GitClient {
32
+ getFileData: (options: {
33
+ filePath: string;
34
+ }) => Promise<GitFileData>;
35
+ }
36
+ //#endregion
37
+ export { GitClient, GitFileData, GitHook, git as default, gitHook };
38
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","names":[],"sources":["../../src/plugins/git.ts"],"mappings":";;;;UAOiB,WAAA;;AAAjB;;EAIE,YAAA,EAAc,IAAA;EAII;;;EAAlB,YAAA,EAAc,IAAA;AAAA;AAAA,UAGC,OAAA;EAHG;AAGpB;;EAIE,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,3 +1,61 @@
1
- import { n as gitHook, t as git } from "../git-DnejL9r_.js";
1
+ import { r as asyncHook } from "../pipe-CvCqOpXX.js";
2
+ import { defineCollectionHook } from "../collections/index.js";
3
+ import { t as createCache } from "../async-cache-DRmFaVGm.js";
4
+ import path from "node:path";
5
+ import { x } from "tinyexec";
2
6
 
3
- export { git as default, gitHook };
7
+ //#region src/plugins/git.ts
8
+ const gitHook = defineCollectionHook(() => ({ onClient: asyncHook() }));
9
+ /**
10
+ * Add version control integration for Git.
11
+ * 1. Injects `creationDate` & `lastModified` properties to page exports.
12
+ *
13
+ * @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.
14
+ */
15
+ function git() {
16
+ let client;
17
+ return {
18
+ name: "git",
19
+ config() {
20
+ const { cwd } = this.core.getOptions();
21
+ client = createGitClient(cwd);
22
+ },
23
+ async collection(collection) {
24
+ await collection.getPluginHook(gitHook)?.onClient.run({ client });
25
+ }
26
+ };
27
+ }
28
+ function createGitClient(cwd) {
29
+ const cache = createCache();
30
+ function mapDate(out) {
31
+ if (out.exitCode !== 0) return null;
32
+ const date = new Date(out.stdout);
33
+ return Number.isNaN(date.getTime()) ? null : date;
34
+ }
35
+ return { async getFileData({ filePath }) {
36
+ return cache.cached(filePath, async () => {
37
+ const relativePath = path.relative(cwd, filePath);
38
+ const [mod, create] = await Promise.all([x("git", [
39
+ "log",
40
+ "-1",
41
+ "--pretty=%ai",
42
+ relativePath
43
+ ], { nodeOptions: { cwd } }), x("git", [
44
+ "log",
45
+ "--diff-filter=A",
46
+ "--follow",
47
+ "--format=%ai",
48
+ "-1",
49
+ relativePath
50
+ ], { nodeOptions: { cwd } })]);
51
+ return {
52
+ lastModified: mapDate(mod),
53
+ creationDate: mapDate(create)
54
+ };
55
+ });
56
+ } };
57
+ }
58
+
59
+ //#endregion
60
+ export { git as default, gitHook };
61
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
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>(() => ({\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,4BAAqC,EAC1D,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,4 +1,5 @@
1
- import { E as Awaitable, h as CollectionHook } from "../core-CT06v32N.js";
1
+ import { S as Awaitable } from "../core-FjA_Xoho.js";
2
+ import { CollectionHook } from "../collections/index.js";
2
3
 
3
4
  //#region src/plugins/json-schema.d.ts
4
5
  interface JSONSchemaOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.d.ts","names":[],"sources":["../../src/plugins/json-schema.ts"],"sourcesContent":[],"mappings":";;;UAMiB,iBAAA;;AAAjB;AAcA;AAQA;;EAA2B,MAAA,CAAA,EAAA,OAAA;EAAA;;;iBAXV;;UAGA,cAAA;;iBAEA;;;;;cAMJ,gBAAc,eAAA,gBAAA"}
1
+ {"version":3,"file":"json-schema.d.ts","names":[],"sources":["../../src/plugins/json-schema.ts"],"mappings":";;;;UAMiB,iBAAA;;;AAAjB;;;EAME,MAAA;EAAA;;;EAKA,MAAA,SAAe,SAAA;AAAA;AAAA,UAGA,cAAA;EACf,aAAA;EACA,MAAA,SAAe,SAAA;AAAA;;;;cAMJ,cAAA,EAAc,cAAA,CAAA,cAAA,EAAA,iBAAA"}
@@ -1,5 +1,5 @@
1
- import { n as defineCollectionHook } from "../collections-CNWuMDAZ.js";
2
- import { t as FileSystemCollection } from "../fs-CXzVd2Dp.js";
1
+ import { defineCollectionHook } from "../collections/index.js";
2
+ import { FileSystemCollection } from "../collections/fs.js";
3
3
  import fs from "node:fs/promises";
4
4
  import path from "node:path";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","names":["hook: JSONSchemaHook","obj: object"],"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 (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,sBAC3B,YAAY,EAAE,SAAS,OAAO,aAAa;CAC1C,MAAMA,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,IAAIC;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
+ {"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 (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,sBAC3B,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,4 +1,72 @@
1
- import "../../core-CT06v32N.js";
2
- import "../../dynamic-Ck1wYoaL.js";
3
- import { a as LoaderInput, c as loaderPlugin, i as LoaderHook, n as Loader, o as LoaderOutput, r as LoaderConfig, s as loaderHook, t as CompilerOptions } from "../../index-BheUVWBm.js";
4
- export { CompilerOptions, Loader, LoaderConfig, LoaderHook, LoaderInput, LoaderOutput, loaderHook, loaderPlugin };
1
+ import { c as PluginContext, s as Plugin } from "../../core-FjA_Xoho.js";
2
+ import { CollectionHook } from "../../collections/index.js";
3
+ import "../../load-from-file-CIYdu-B5.js";
4
+ import { WebpackLoaderOptions } from "./webpack.js";
5
+ import { NextConfig } from "next";
6
+
7
+ //#region src/plugins/loader/index.d.ts
8
+ type Awaitable<T> = T | Promise<T>;
9
+ type LoaderEnvironment = "vite" | "bun" | "node";
10
+ interface Loader {
11
+ /**
12
+ * Transform input into JavaScript.
13
+ *
14
+ * Returns:
15
+ * - `LoaderOutput`: JavaScript code & source map.
16
+ * - `null`: skip the loader. Fallback to default behaviour if possible, otherwise the adapter will try workarounds.
17
+ */
18
+ load: (input: LoaderInput) => Awaitable<LoaderOutput | null>;
19
+ bun?: {
20
+ /**
21
+ * 1. Bun doesn't allow `null` in loaders.
22
+ * 2. Bun requires sync result to support dynamic require().
23
+ */
24
+ load?: (source: string, input: LoaderInput) => Awaitable<Bun.OnLoadResult>;
25
+ };
26
+ }
27
+ interface LoaderInput {
28
+ development: boolean;
29
+ filePath: string;
30
+ query: Record<string, string | string[] | undefined>;
31
+ getSource: () => string | Promise<string>;
32
+ addDependency: (file: string) => void;
33
+ }
34
+ interface LoaderOutput {
35
+ code: string;
36
+ map?: unknown;
37
+ /**
38
+ * only supported on Vite 8 at the moment, specify the output module type.
39
+ *
40
+ * on unsupported environments, it will be ignored.
41
+ */
42
+ moduleType?: "js" | "json";
43
+ }
44
+ interface NextLoaderContext extends PluginContext {
45
+ getLoaderOptions: () => WebpackLoaderOptions;
46
+ }
47
+ interface LoaderConfig {
48
+ /** unique ID for loader, used to deduplicate loaders */
49
+ id?: string;
50
+ /**
51
+ * Filter file paths, the input can be either a file URL or file path.
52
+ *
53
+ * Must take resource query into consideration.
54
+ */
55
+ test?: RegExp;
56
+ /**
57
+ * @remarks it doesn't configure automatically for Next.js, you have to define the webpack/turbopack config in `configureNext()`.
58
+ */
59
+ createLoader: (this: PluginContext, environment: LoaderEnvironment) => Promise<Loader>;
60
+ configureNext?: (this: NextLoaderContext, next: NextConfig) => NextConfig;
61
+ }
62
+ /**
63
+ * a light layer for implementing loaders.
64
+ */
65
+ declare function loaderPlugin(): Plugin;
66
+ interface LoaderHook {
67
+ loaders: LoaderConfig[];
68
+ }
69
+ declare const loaderHook: CollectionHook<LoaderHook, undefined>;
70
+ //#endregion
71
+ export { Loader, LoaderConfig, LoaderHook, LoaderInput, LoaderOutput, loaderHook, loaderPlugin };
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/plugins/loader/index.ts"],"mappings":";;;;;;;KAOK,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAE3B,iBAAA;AAAA,UAEY,MAAA;;AAPmC;;;;;;EAelD,IAAA,GAAO,KAAA,EAAO,WAAA,KAAgB,SAAA,CAAU,YAAA;EAExC,GAAA;IAda;;;;IAmBX,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;EAfiC;;;;;EAsBjC,UAAA;AAAA;AAAA,UAGQ,iBAAA,SAA0B,aAAA;EAClC,gBAAA,QAAwB,oBAAA;AAAA;AAAA,UAGT,YAAA;EA7Bb;EA+BF,EAAA;EA/BiC;;;;;EAsCjC,IAAA,GAAO,MAAA;EAtCoE;AAI7E;;EAuCE,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;;;;iBAYjD,YAAA,CAAA,GAAgB,MAAA;AAAA,UAsFf,UAAA;EACf,OAAA,EAAS,YAAA;AAAA;AAAA,cAGE,UAAA,EAAU,cAAA,CAAA,UAAA"}
@@ -1,3 +1,78 @@
1
- import { n as loaderPlugin, t as loaderHook } from "../../loader-B4nQrRwA.js";
1
+ import { defineCollectionHook } from "../../collections/index.js";
2
+ import { t as createCache } from "../../async-cache-DRmFaVGm.js";
3
+ import path from "node:path";
2
4
 
3
- export { loaderHook, loaderPlugin };
5
+ //#region src/plugins/loader/index.ts
6
+ /**
7
+ * a light layer for implementing loaders.
8
+ */
9
+ function loaderPlugin() {
10
+ const cachedLoaders = createCache();
11
+ function initLoaders(ctx, env) {
12
+ const { core } = ctx;
13
+ return cachedLoaders.cached(env, async () => {
14
+ const usedIds = /* @__PURE__ */ new Set();
15
+ const out = [];
16
+ for (const collection of core.getCollections()) {
17
+ const hook = collection.getPluginHook(loaderHook);
18
+ if (!hook) continue;
19
+ let nextId = 0;
20
+ for (const loader of hook.loaders) {
21
+ if (loader.id && usedIds.has(loader.id)) continue;
22
+ if (loader.id) usedIds.add(loader.id);
23
+ out.push({
24
+ id: loader.id ?? `${collection.name}:${nextId++}`,
25
+ test: loader.test,
26
+ loader: await loader.createLoader.call(ctx, env)
27
+ });
28
+ }
29
+ }
30
+ return out;
31
+ });
32
+ }
33
+ return {
34
+ name: "fuma-content:loader",
35
+ next: { config(config) {
36
+ const ctx = {
37
+ ...this,
38
+ getLoaderOptions: () => {
39
+ const { configPath, outDir } = this.core.getOptions();
40
+ return {
41
+ configPath,
42
+ outDir,
43
+ absoluteCompiledConfigPath: path.resolve(this.core.getCompiledConfigPath()),
44
+ isDev: process.env.NODE_ENV === "development"
45
+ };
46
+ }
47
+ };
48
+ for (const collection of this.core.getCollections()) {
49
+ const hook = collection.getPluginHook(loaderHook);
50
+ if (!hook) continue;
51
+ for (const loader of hook.loaders) {
52
+ if (!loader.configureNext) continue;
53
+ config = loader.configureNext.call(ctx, config);
54
+ }
55
+ }
56
+ return config;
57
+ } },
58
+ bun: { async setup(build) {
59
+ const { toBun } = await import("../../bun-Be5pgXW_.js");
60
+ for (const loader of await initLoaders(this, "bun")) toBun(loader.test, loader.loader)(build);
61
+ } },
62
+ node: { async createLoad() {
63
+ const { toNode } = await import("../../node-Cu5Pqxxo.js");
64
+ return toNode(await initLoaders(this, "node"));
65
+ } },
66
+ vite: { async createPlugin() {
67
+ const { toVite } = await import("../../vite-CoJIMNWk.js");
68
+ return (await initLoaders(this, "vite")).map((loader) => {
69
+ return toVite(`fuma-content:${loader.id}`, loader.test, loader.loader);
70
+ });
71
+ } }
72
+ };
73
+ }
74
+ const loaderHook = defineCollectionHook(() => ({ loaders: [] }));
75
+
76
+ //#endregion
77
+ export { loaderHook, loaderPlugin };
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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()) {\n const hook = collection.getPluginHook(loaderHook);\n if (!hook) continue;\n\n for (const loader of hook.loaders) {\n if (!loader.configureNext) continue;\n\n 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>(() => ({\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,gBAAgB,EAAE;IACnD,MAAM,OAAO,WAAW,cAAc,WAAW;AACjD,QAAI,CAAC,KAAM;AAEX,SAAK,MAAM,UAAU,KAAK,SAAS;AACjC,SAAI,CAAC,OAAO,cAAe;AAE3B,cAAS,OAAO,cAAc,KAAK,KAAK,OAAO;;;AAInD,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,4BAAwC,EAChE,SAAS,EAAE,EACZ,EAAE"}
@@ -1,4 +1,21 @@
1
- import "../../core-CT06v32N.js";
2
- import "../../dynamic-Ck1wYoaL.js";
3
- import { d as createWebpackLoader, l as WebpackLoader, u as WebpackLoaderOptions } from "../../index-BheUVWBm.js";
4
- export { WebpackLoader, WebpackLoaderOptions, createWebpackLoader };
1
+ import "../../core-FjA_Xoho.js";
2
+ import "../../load-from-file-CIYdu-B5.js";
3
+ import { DynamicCore } from "../../dynamic.js";
4
+ import { Loader } from "./index.js";
5
+ import { LoaderContext } from "webpack";
6
+
7
+ //#region src/plugins/loader/webpack.d.ts
8
+ interface WebpackLoaderOptions {
9
+ absoluteCompiledConfigPath: string;
10
+ configPath: string;
11
+ outDir: string;
12
+ isDev: boolean;
13
+ }
14
+ type WebpackLoader = (this: LoaderContext<WebpackLoaderOptions>, source: string) => void;
15
+ /**
16
+ * Note: need to handle the `test` regex in Webpack config instead.
17
+ */
18
+ declare function createWebpackLoader(loaderFactory: (core: DynamicCore) => Loader): WebpackLoader;
19
+ //#endregion
20
+ export { WebpackLoader, WebpackLoaderOptions, createWebpackLoader };
21
+ //# sourceMappingURL=webpack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack.d.ts","names":[],"sources":["../../../src/plugins/loader/webpack.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"}