fuma-content 1.0.2 → 1.1.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 (208) hide show
  1. package/dist/{async-cache-BM9Yf4Nw.js → async-cache-U87GzQTb.js} +1 -1
  2. package/dist/async-cache-U87GzQTb.js.map +1 -0
  3. package/dist/{build-mdx-C1PZsGp2.js → build-mdx-BZxE8t2a.js} +16 -11
  4. package/dist/build-mdx-BZxE8t2a.js.map +1 -0
  5. package/dist/build-mdx-LhpFasX-.js +4 -0
  6. package/dist/bun/index.d.ts +7 -4
  7. package/dist/bun/index.d.ts.map +1 -1
  8. package/dist/bun/index.js +25 -19
  9. package/dist/bun/index.js.map +1 -1
  10. package/dist/{bun-QKQnqgIi.js → bun-CBROq3I0.js} +3 -3
  11. package/dist/bun-CBROq3I0.js.map +1 -0
  12. package/dist/code-generator-CjC4EEXg.js +102 -0
  13. package/dist/code-generator-CjC4EEXg.js.map +1 -0
  14. package/dist/collections/data/runtime.d.ts +15 -0
  15. package/dist/collections/data/runtime.d.ts.map +1 -0
  16. package/dist/collections/{meta → data}/runtime.js +4 -4
  17. package/dist/collections/data/runtime.js.map +1 -0
  18. package/dist/collections/data.d.ts +47 -0
  19. package/dist/collections/data.d.ts.map +1 -0
  20. package/dist/collections/data.js +5 -0
  21. package/dist/collections/fs.d.ts +3 -0
  22. package/dist/collections/fs.js +3 -0
  23. package/dist/collections/index.d.ts +2 -2
  24. package/dist/collections/index.js +2 -15
  25. package/dist/collections/json/loader-webpack.d.ts +9 -0
  26. package/dist/collections/json/loader-webpack.d.ts.map +1 -0
  27. package/dist/collections/json/loader-webpack.js +15 -0
  28. package/dist/collections/json/loader-webpack.js.map +1 -0
  29. package/dist/collections/mdx/loader-webpack.d.ts +5 -5
  30. package/dist/collections/mdx/loader-webpack.d.ts.map +1 -1
  31. package/dist/collections/mdx/loader-webpack.js +11 -21
  32. package/dist/collections/mdx/loader-webpack.js.map +1 -1
  33. package/dist/collections/mdx/react.d.ts +22 -0
  34. package/dist/collections/mdx/react.d.ts.map +1 -0
  35. package/dist/collections/mdx/react.js +35 -0
  36. package/dist/collections/mdx/react.js.map +1 -0
  37. package/dist/collections/mdx/runtime-browser.d.ts +11 -45
  38. package/dist/collections/mdx/runtime-browser.js +6 -44
  39. package/dist/collections/mdx/runtime-browser.js.map +1 -1
  40. package/dist/collections/mdx/runtime-dynamic.d.ts +16 -28
  41. package/dist/collections/mdx/runtime-dynamic.d.ts.map +1 -1
  42. package/dist/collections/mdx/runtime-dynamic.js +19 -23
  43. package/dist/collections/mdx/runtime-dynamic.js.map +1 -1
  44. package/dist/collections/mdx/runtime.d.ts +10 -49
  45. package/dist/collections/mdx/runtime.js +2 -11
  46. package/dist/collections/mdx/runtime.js.map +1 -1
  47. package/dist/collections/mdx.d.ts +6 -2
  48. package/dist/collections/mdx.js +6 -246
  49. package/dist/collections/runtime/file-store.d.ts +4 -22
  50. package/dist/collections/runtime/file-store.js +15 -14
  51. package/dist/collections/runtime/file-store.js.map +1 -1
  52. package/dist/collections/runtime/store.d.ts +3 -3
  53. package/dist/collections/runtime/store.js +2 -2
  54. package/dist/collections/yaml/loader-webpack.d.ts +9 -0
  55. package/dist/collections/yaml/loader-webpack.d.ts.map +1 -0
  56. package/dist/collections/yaml/loader-webpack.js +15 -0
  57. package/dist/collections/yaml/loader-webpack.js.map +1 -0
  58. package/dist/collections-DNFRdCuB.js +98 -0
  59. package/dist/collections-DNFRdCuB.js.map +1 -0
  60. package/dist/config/index.d.ts +1 -1
  61. package/dist/config/index.js.map +1 -1
  62. package/dist/core-BO3b8jMg.d.ts +313 -0
  63. package/dist/core-BO3b8jMg.d.ts.map +1 -0
  64. package/dist/core-D5QHSKk6.js +223 -0
  65. package/dist/core-D5QHSKk6.js.map +1 -0
  66. package/dist/data-9h98oZwj.js +158 -0
  67. package/dist/data-9h98oZwj.js.map +1 -0
  68. package/dist/dynamic-CTYYdl7_.d.ts +33 -0
  69. package/dist/dynamic-CTYYdl7_.d.ts.map +1 -0
  70. package/dist/{dynamic-B40uAtdo.js → dynamic-DhKTOrIl.js} +8 -7
  71. package/dist/dynamic-DhKTOrIl.js.map +1 -0
  72. package/dist/dynamic.d.ts +3 -0
  73. package/dist/dynamic.js +3 -0
  74. package/dist/file-store-laO4IjvB.d.ts +21 -0
  75. package/dist/file-store-laO4IjvB.d.ts.map +1 -0
  76. package/dist/fs-D34Sztbh.d.ts +44 -0
  77. package/dist/fs-D34Sztbh.d.ts.map +1 -0
  78. package/dist/fs-WWbLA7Gx.js +66 -0
  79. package/dist/fs-WWbLA7Gx.js.map +1 -0
  80. package/dist/{fuma-matter-O4fA6nSx.js → fuma-matter-BuBO2w-p.js} +2 -2
  81. package/dist/fuma-matter-BuBO2w-p.js.map +1 -0
  82. package/dist/git-2CjUW3M5.d.ts +37 -0
  83. package/dist/git-2CjUW3M5.d.ts.map +1 -0
  84. package/dist/git-CQWA37-X.js +60 -0
  85. package/dist/git-CQWA37-X.js.map +1 -0
  86. package/dist/index-Da88Sj8w.d.ts +87 -0
  87. package/dist/index-Da88Sj8w.d.ts.map +1 -0
  88. package/dist/index.d.ts +6 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +4 -5
  91. package/dist/load-from-file-BZxc_BhC.js +3 -0
  92. package/dist/{load-from-file-1f4WaHsf.js → load-from-file-irx0JI6j.js} +5 -8
  93. package/dist/load-from-file-irx0JI6j.js.map +1 -0
  94. package/dist/loader-AIEwGc2f.js +9 -0
  95. package/dist/loader-BhXHF8vy.js +16 -0
  96. package/dist/loader-BhXHF8vy.js.map +1 -0
  97. package/dist/loader-BuR4gkKg.js +77 -0
  98. package/dist/loader-BuR4gkKg.js.map +1 -0
  99. package/dist/loader-BzQpSBvP.js +59 -0
  100. package/dist/loader-BzQpSBvP.js.map +1 -0
  101. package/dist/{loader-CXnMFuyE.js → loader-D6StkShK.js} +8 -7
  102. package/dist/loader-D6StkShK.js.map +1 -0
  103. package/dist/loader-DCK4RwOh.js +8 -0
  104. package/dist/loader-DwpOcxgh.js +17 -0
  105. package/dist/loader-DwpOcxgh.js.map +1 -0
  106. package/dist/loader-zsTVgQjO.js +8 -0
  107. package/dist/mdx-Dt9hirUu.d.ts +144 -0
  108. package/dist/mdx-Dt9hirUu.d.ts.map +1 -0
  109. package/dist/mdx-iZ2uP27Z.js +303 -0
  110. package/dist/mdx-iZ2uP27Z.js.map +1 -0
  111. package/dist/next/index.d.ts +6 -10
  112. package/dist/next/index.d.ts.map +1 -1
  113. package/dist/next/index.js +23 -31
  114. package/dist/next/index.js.map +1 -1
  115. package/dist/node/index.d.ts +8 -0
  116. package/dist/node/index.d.ts.map +1 -0
  117. package/dist/node/index.js +10 -0
  118. package/dist/node/index.js.map +1 -0
  119. package/dist/node/loader.d.ts +5 -2
  120. package/dist/node/loader.d.ts.map +1 -1
  121. package/dist/node/loader.js +17 -14
  122. package/dist/node/loader.js.map +1 -1
  123. package/dist/{node-CGIIJIcs.js → node-2VZOh3P9.js} +7 -5
  124. package/dist/node-2VZOh3P9.js.map +1 -0
  125. package/dist/plugins/git.d.ts +3 -2
  126. package/dist/plugins/git.js +2 -61
  127. package/dist/plugins/json-schema.d.ts +26 -2
  128. package/dist/plugins/json-schema.d.ts.map +1 -0
  129. package/dist/plugins/json-schema.js +42 -51
  130. package/dist/plugins/json-schema.js.map +1 -1
  131. package/dist/plugins/loader/index.d.ts +4 -0
  132. package/dist/plugins/loader/index.js +3 -0
  133. package/dist/plugins/loader/webpack.d.ts +4 -0
  134. package/dist/plugins/loader/webpack.js +60 -0
  135. package/dist/plugins/loader/webpack.js.map +1 -0
  136. package/dist/runtime-HN-HSB0Z.d.ts +31 -0
  137. package/dist/runtime-HN-HSB0Z.d.ts.map +1 -0
  138. package/dist/runtime-browser-BQEk7qjc.d.ts +29 -0
  139. package/dist/runtime-browser-BQEk7qjc.d.ts.map +1 -0
  140. package/dist/store-DiuGdV5M.d.ts +31 -0
  141. package/dist/store-DiuGdV5M.d.ts.map +1 -0
  142. package/dist/{store-0LQ2PlH6.js → store-IvpEBdxi.js} +4 -4
  143. package/dist/store-IvpEBdxi.js.map +1 -0
  144. package/dist/{validation-BOJKRAp5.js → validation-BvVvvLII.js} +11 -2
  145. package/dist/validation-BvVvvLII.js.map +1 -0
  146. package/dist/vite/index.d.ts +5 -15
  147. package/dist/vite/index.d.ts.map +1 -1
  148. package/dist/vite/index.js +24 -21
  149. package/dist/vite/index.js.map +1 -1
  150. package/dist/{vite-X-2Al8fq.js → vite-C1qXY47G.js} +4 -3
  151. package/dist/vite-C1qXY47G.js.map +1 -0
  152. package/package.json +51 -46
  153. package/dist/async-cache-BM9Yf4Nw.js.map +0 -1
  154. package/dist/build-D8A5ByFk.js +0 -42
  155. package/dist/build-D8A5ByFk.js.map +0 -1
  156. package/dist/build-mdx-C1PZsGp2.js.map +0 -1
  157. package/dist/build-mdx-DFndaVbS.js +0 -4
  158. package/dist/bun-QKQnqgIi.js.map +0 -1
  159. package/dist/code-generator-gPtrfZ6Q.js +0 -133
  160. package/dist/code-generator-gPtrfZ6Q.js.map +0 -1
  161. package/dist/collections/handlers/fs.d.ts +0 -2
  162. package/dist/collections/handlers/fs.js +0 -28
  163. package/dist/collections/handlers/fs.js.map +0 -1
  164. package/dist/collections/index.js.map +0 -1
  165. package/dist/collections/mdx/runtime-browser.d.ts.map +0 -1
  166. package/dist/collections/mdx/runtime.d.ts.map +0 -1
  167. package/dist/collections/mdx.js.map +0 -1
  168. package/dist/collections/meta/loader-webpack.d.ts +0 -9
  169. package/dist/collections/meta/loader-webpack.d.ts.map +0 -1
  170. package/dist/collections/meta/loader-webpack.js +0 -28
  171. package/dist/collections/meta/loader-webpack.js.map +0 -1
  172. package/dist/collections/meta/runtime.d.ts +0 -11
  173. package/dist/collections/meta/runtime.d.ts.map +0 -1
  174. package/dist/collections/meta/runtime.js.map +0 -1
  175. package/dist/collections/meta.d.ts +0 -2
  176. package/dist/collections/meta.js +0 -134
  177. package/dist/collections/meta.js.map +0 -1
  178. package/dist/collections/runtime/file-store.d.ts.map +0 -1
  179. package/dist/core-Bkh-SI_3.d.ts +0 -561
  180. package/dist/core-Bkh-SI_3.d.ts.map +0 -1
  181. package/dist/core-ZuoVBkeg.js +0 -170
  182. package/dist/core-ZuoVBkeg.js.map +0 -1
  183. package/dist/dynamic-B40uAtdo.js.map +0 -1
  184. package/dist/fuma-matter-O4fA6nSx.js.map +0 -1
  185. package/dist/load-from-file-1f4WaHsf.js.map +0 -1
  186. package/dist/load-from-file-BTNnBu6f.js +0 -3
  187. package/dist/loader-80abXEHx.js +0 -4
  188. package/dist/loader-BFhPyg3z.js +0 -4
  189. package/dist/loader-CXnMFuyE.js.map +0 -1
  190. package/dist/loader-gk94iHf5.js +0 -66
  191. package/dist/loader-gk94iHf5.js.map +0 -1
  192. package/dist/next/index.cjs +0 -502
  193. package/dist/node-CGIIJIcs.js.map +0 -1
  194. package/dist/pipe-5cnvE6KY.js +0 -31
  195. package/dist/pipe-5cnvE6KY.js.map +0 -1
  196. package/dist/plugins/git.js.map +0 -1
  197. package/dist/plugins/with-loader/index.d.ts +0 -2
  198. package/dist/plugins/with-loader/index.js +0 -28
  199. package/dist/plugins/with-loader/index.js.map +0 -1
  200. package/dist/plugins/with-loader/webpack.d.ts +0 -19
  201. package/dist/plugins/with-loader/webpack.d.ts.map +0 -1
  202. package/dist/plugins/with-loader/webpack.js +0 -43
  203. package/dist/plugins/with-loader/webpack.js.map +0 -1
  204. package/dist/store-0LQ2PlH6.js.map +0 -1
  205. package/dist/store-DEjYYF6a.d.ts +0 -31
  206. package/dist/store-DEjYYF6a.d.ts.map +0 -1
  207. package/dist/validation-BOJKRAp5.js.map +0 -1
  208. package/dist/vite-X-2Al8fq.js.map +0 -1
@@ -0,0 +1,303 @@
1
+ import { i as pipe, r as asyncPipe } from "./collections-DNFRdCuB.js";
2
+ import { n as slash } from "./code-generator-CjC4EEXg.js";
3
+ import { r as validate } from "./validation-BvVvvLII.js";
4
+ import { t as loaderHook } from "./loader-BuR4gkKg.js";
5
+ import { t as FileSystemCollection } from "./fs-WWbLA7Gx.js";
6
+ import { n as gitHook } from "./git-CQWA37-X.js";
7
+ import path from "node:path";
8
+
9
+ //#region src/collections/mdx.ts
10
+ const RuntimePaths = {
11
+ browser: "fuma-content/collections/mdx/runtime-browser",
12
+ dynamic: "fuma-content/collections/mdx/runtime-dynamic",
13
+ server: "fuma-content/collections/mdx/runtime"
14
+ };
15
+ function formatInitializer(code) {
16
+ return `${code.fn}<${code.typeParams.join()}>(${code.params.join()})`;
17
+ }
18
+ var MDXCollection = class extends FileSystemCollection {
19
+ dynamic;
20
+ lazy;
21
+ preprocess;
22
+ postprocess;
23
+ getMDXOptions;
24
+ /**
25
+ * Frontmatter schema
26
+ */
27
+ frontmatterSchema;
28
+ /**
29
+ * Transform & validate frontmatter
30
+ */
31
+ frontmatter = asyncPipe();
32
+ /**
33
+ * Transform `vfile` on compilation stage
34
+ */
35
+ vfile = asyncPipe();
36
+ /**
37
+ * Transform the generated initializer code (TypeScript) for collection store
38
+ */
39
+ storeInitializer = pipe();
40
+ $inferFrontmatter = void 0;
41
+ constructor(config) {
42
+ super({
43
+ dir: config.dir,
44
+ files: config.files,
45
+ supportedFormats: ["md", "mdx"]
46
+ });
47
+ this.postprocess = config.postprocess;
48
+ this.getMDXOptions = config.options;
49
+ this.dynamic = config.dynamic ?? false;
50
+ this.lazy = config.lazy ?? false;
51
+ if (config.frontmatter) {
52
+ const frontmatter = config.frontmatter;
53
+ this.frontmatterSchema = frontmatter;
54
+ this.frontmatter.pipe((data, { filePath }) => {
55
+ return validate(frontmatter, data, void 0, `invalid frontmatter in ${filePath}`);
56
+ });
57
+ }
58
+ if (this.postprocess?.extractLinkReferences) this.storeInitializer.pipe((code, { codegen, environment }) => {
59
+ codegen.addNamedImport(["WithExtractedReferences"], RuntimePaths[environment], true);
60
+ code.typeParams[2] += " & WithExtractedReferences";
61
+ return code;
62
+ });
63
+ this.onEmit.pipe(async (entries, { createCodeGenerator }) => {
64
+ entries.push(await createCodeGenerator(`${this.name}.ts`, (ctx) => this.generateCollectionStoreServer(ctx)), await createCodeGenerator(`${this.name}.browser.ts`, (ctx) => this.generateCollectionStoreBrowser(ctx)));
65
+ if (this.dynamic) entries.push(await createCodeGenerator(`${this.name}.dynamic.ts`, (ctx) => this.generateCollectionStoreDynamic(ctx)));
66
+ return entries;
67
+ });
68
+ this.onServer.hook(({ core, server }) => {
69
+ if (!server.watcher) return;
70
+ server.watcher.on("all", async (event, file) => {
71
+ if (event === "change" && !this.dynamic) return;
72
+ if (!this.hasFile(file)) return;
73
+ await core.emit({
74
+ filterCollection: (item) => item === this,
75
+ filterWorkspace: () => false,
76
+ write: true
77
+ });
78
+ });
79
+ });
80
+ const { loaders } = this.pluginHook(loaderHook);
81
+ loaders.push(mdxLoader());
82
+ this.pluginHook(gitHook).onClient.hook(({ client }) => {
83
+ this.storeInitializer.pipe((code, { codegen, environment }) => {
84
+ codegen.addNamedImport(["WithGit"], RuntimePaths[environment], true);
85
+ code.typeParams[2] += " & WithGit";
86
+ return code;
87
+ });
88
+ this.vfile.pipe(async (file) => {
89
+ const vcData = await client.getFileData({ filePath: file.path });
90
+ file.data["mdx-export"] ??= [];
91
+ file.data["mdx-export"].push({
92
+ name: "lastModified",
93
+ value: vcData.lastModified
94
+ }, {
95
+ name: "creationDate",
96
+ value: vcData.creationDate
97
+ });
98
+ return file;
99
+ });
100
+ });
101
+ }
102
+ async generateDocCollectionFrontmatterGlob({ workspace, codegen }, eager = false) {
103
+ let s = `{`;
104
+ const files = await this.getFiles();
105
+ const query = codegen.formatQuery({
106
+ collection: this.name,
107
+ only: "frontmatter",
108
+ workspace
109
+ });
110
+ for (const file of files) {
111
+ const fullPath = path.join(this.dir, file);
112
+ const specifier = `${codegen.formatImportPath(fullPath)}?${query}`;
113
+ if (eager) {
114
+ const name = codegen.generateImportName();
115
+ codegen.addNamedImport([`frontmatter as ${name}`], specifier);
116
+ s += `"${slash(file)}": ${name},`;
117
+ } else s += `"${slash(file)}": () => ${codegen.formatDynamicImport(specifier, "frontmatter")},`;
118
+ }
119
+ s += "}";
120
+ return s;
121
+ }
122
+ async generateDocCollectionGlob({ codegen, workspace }, eager = false) {
123
+ let s = `{`;
124
+ const files = await this.getFiles();
125
+ const query = codegen.formatQuery({
126
+ collection: this.name,
127
+ workspace
128
+ });
129
+ for (const file of files) {
130
+ const fullPath = path.join(this.dir, file);
131
+ const specifier = `${codegen.formatImportPath(fullPath)}?${query}`;
132
+ if (eager) {
133
+ const name = codegen.generateImportName();
134
+ codegen.addNamespaceImport(name, specifier);
135
+ s += `"${slash(file)}": ${name},`;
136
+ } else s += `"${slash(file)}": () => ${codegen.formatDynamicImport(specifier)},`;
137
+ }
138
+ s += "}";
139
+ return s;
140
+ }
141
+ async generateCollectionStoreServer(context) {
142
+ const { core, codegen } = context;
143
+ const runtimePath = RuntimePaths.server;
144
+ const base = slash(core._toRuntimePath(this.dir));
145
+ let code;
146
+ codegen.addNamespaceImport("Config", codegen.formatImportPath(core.getOptions().configPath), true);
147
+ if (this.lazy) {
148
+ codegen.addNamedImport(["mdxStoreLazy"], runtimePath);
149
+ const headGlob = await this.generateDocCollectionFrontmatterGlob(context, true);
150
+ const bodyGlob = await this.generateDocCollectionGlob(context);
151
+ code = {
152
+ fn: "mdxStoreLazy",
153
+ typeParams: [
154
+ "typeof Config",
155
+ `"${this.name}"`,
156
+ "unknown"
157
+ ],
158
+ params: [
159
+ `"${this.name}"`,
160
+ `"${base}"`,
161
+ `{ head: ${headGlob}, body: ${bodyGlob} }`
162
+ ]
163
+ };
164
+ } else {
165
+ codegen.addNamedImport(["mdxStore"], runtimePath);
166
+ code = {
167
+ fn: "mdxStore",
168
+ typeParams: [
169
+ "typeof Config",
170
+ `"${this.name}"`,
171
+ "unknown"
172
+ ],
173
+ params: [
174
+ `"${this.name}"`,
175
+ `"${base}"`,
176
+ await this.generateDocCollectionGlob(context, true)
177
+ ]
178
+ };
179
+ }
180
+ code = this.storeInitializer.run(code, {
181
+ ...context,
182
+ environment: "server"
183
+ });
184
+ codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);
185
+ }
186
+ async generateCollectionStoreBrowser(context) {
187
+ const { core, codegen } = context;
188
+ const runtimePath = RuntimePaths.browser;
189
+ codegen.addNamedImport(["mdxStoreBrowser"], runtimePath);
190
+ codegen.addNamespaceImport("Config", codegen.formatImportPath(core.getOptions().configPath), true);
191
+ let code = {
192
+ fn: `mdxStoreBrowser`,
193
+ typeParams: [
194
+ "typeof Config",
195
+ `"${this.name}"`,
196
+ "unknown"
197
+ ],
198
+ params: [`"${this.name}"`, await this.generateDocCollectionGlob(context)]
199
+ };
200
+ code = this.storeInitializer.run(code, {
201
+ ...context,
202
+ environment: "browser"
203
+ });
204
+ codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);
205
+ }
206
+ async generateCollectionStoreDynamic(context) {
207
+ const { core, codegen } = context;
208
+ const coreOptions = core.getOptions();
209
+ const runtimePath = RuntimePaths.dynamic;
210
+ const base = slash(core._toRuntimePath(this.dir));
211
+ codegen.addNamespaceImport("Config", codegen.formatImportPath(coreOptions.configPath));
212
+ codegen.addNamedImport(["mdxStoreDynamic"], runtimePath);
213
+ const serializableCoreOptions = {
214
+ configPath: core._toRuntimePath(coreOptions.configPath),
215
+ outDir: core._toRuntimePath(coreOptions.outDir),
216
+ cwd: core._toRuntimePath(coreOptions.cwd)
217
+ };
218
+ const jsxImportSource = (await this.getMDXOptions?.("runtime"))?.jsxImportSource ?? "react";
219
+ if (!jsxImportSource) throw new Error(`[Fuma Content] "jsxImportSource" is required for dynamic MDX collection "${this.name}".`);
220
+ codegen.addNamespaceImport("_jsx_runtime", `${jsxImportSource}/jsx-runtime`);
221
+ let code = {
222
+ fn: "mdxStoreDynamic",
223
+ typeParams: [
224
+ "typeof Config",
225
+ `"${this.name}"`,
226
+ "unknown"
227
+ ],
228
+ params: [
229
+ "Config",
230
+ JSON.stringify(serializableCoreOptions),
231
+ `"${this.name}"`,
232
+ `"${base}"`,
233
+ await this.generateDocCollectionFrontmatterGlob(context, true),
234
+ "_jsx_runtime"
235
+ ]
236
+ };
237
+ code = this.storeInitializer.run(code, {
238
+ ...context,
239
+ environment: "dynamic"
240
+ });
241
+ codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);
242
+ }
243
+ };
244
+ function mdxCollection(config) {
245
+ return new MDXCollection(config);
246
+ }
247
+ function mdxLoader() {
248
+ const test = /\.mdx?(\?.+?)?$/;
249
+ return {
250
+ id: "mdx",
251
+ test,
252
+ configureNext(nextConfig) {
253
+ const loaderPath = "fuma-content/collections/mdx/loader-webpack";
254
+ const loaderOptions = this.getLoaderOptions();
255
+ return {
256
+ ...nextConfig,
257
+ turbopack: {
258
+ ...nextConfig.turbopack,
259
+ rules: {
260
+ ...nextConfig.turbopack?.rules,
261
+ "*.{md,mdx}": {
262
+ loaders: [{
263
+ loader: loaderPath,
264
+ options: loaderOptions
265
+ }],
266
+ as: "*.js"
267
+ }
268
+ }
269
+ },
270
+ pageExtensions: [
271
+ ...nextConfig.pageExtensions ?? [
272
+ "js",
273
+ "jsx",
274
+ "tsx",
275
+ "ts"
276
+ ],
277
+ "mdx",
278
+ "md"
279
+ ],
280
+ webpack(config, options) {
281
+ config.module ||= {};
282
+ config.module.rules ||= [];
283
+ config.module.rules.push({
284
+ test,
285
+ use: [options.defaultLoaders.babel, {
286
+ loader: loaderPath,
287
+ options: loaderOptions
288
+ }]
289
+ });
290
+ return nextConfig.webpack?.(config, options) ?? config;
291
+ }
292
+ };
293
+ },
294
+ async createLoader() {
295
+ const { createMdxLoader } = await import("./loader-AIEwGc2f.js");
296
+ return createMdxLoader({ getCore: () => this.core });
297
+ }
298
+ };
299
+ }
300
+
301
+ //#endregion
302
+ export { mdxCollection as n, MDXCollection as t };
303
+ //# sourceMappingURL=mdx-iZ2uP27Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx-iZ2uP27Z.js","names":["code: InitializerCode","serializableCoreOptions: CoreOptions"],"sources":["../src/collections/mdx.ts"],"sourcesContent":["import type { Collection } from \"@/collections\";\nimport type { PostprocessOptions } from \"@/collections/mdx/remark-postprocess\";\nimport type { CoreOptions, EmitCodeGeneratorContext } from \"@/core\";\nimport type { ProcessorOptions } from \"@mdx-js/mdx\";\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 type { PreprocessOptions } from \"@/collections/mdx/remark-preprocess\";\nimport { 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 } from \"@/plugins/git\";\nimport path from \"node:path\";\n\ninterface CompilationContext {\n collection: Collection;\n filePath: string;\n source: string;\n}\n\nexport interface MDXCollectionConfig<\n FrontmatterSchema extends StandardSchemaV1 | undefined,\n> extends Omit<FileSystemCollectionConfig, \"supportedFormats\"> {\n postprocess?: Partial<PostprocessOptions>;\n frontmatter?: FrontmatterSchema;\n options?: (environment: \"bundler\" | \"runtime\") => Awaitable<ProcessorOptions>;\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 preprocess?: PreprocessOptions;\n readonly postprocess?: Partial<PostprocessOptions>;\n readonly getMDXOptions?: (environment: \"bundler\" | \"runtime\") => Awaitable<ProcessorOptions>;\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 EmitCodeGeneratorContext & {\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.getMDXOptions = config.options;\n this.dynamic = config.dynamic ?? false;\n this.lazy = config.lazy ?? false;\n if (config.frontmatter) {\n const frontmatter = config.frontmatter;\n // Store schema for use in studio/editors\n this.frontmatterSchema = frontmatter;\n this.frontmatter.pipe((data, { filePath }) => {\n return validate(\n frontmatter,\n data,\n undefined,\n `invalid frontmatter in ${filePath}`,\n ) as Promise<Record<string, unknown>>;\n });\n }\n\n if (this.postprocess?.extractLinkReferences) {\n this.storeInitializer.pipe((code, { codegen, environment }) => {\n codegen.addNamedImport([\"WithExtractedReferences\"], RuntimePaths[environment], true);\n code.typeParams[2] += \" & WithExtractedReferences\";\n return code;\n });\n }\n\n this.onEmit.pipe(async (entries, { createCodeGenerator }) => {\n entries.push(\n await createCodeGenerator(`${this.name}.ts`, (ctx) =>\n this.generateCollectionStoreServer(ctx),\n ),\n await createCodeGenerator(`${this.name}.browser.ts`, (ctx) =>\n this.generateCollectionStoreBrowser(ctx),\n ),\n );\n if (this.dynamic)\n entries.push(\n await createCodeGenerator(`${this.name}.dynamic.ts`, (ctx) =>\n this.generateCollectionStoreDynamic(ctx),\n ),\n );\n return entries;\n });\n this.onServer.hook(({ core, server }) => {\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 const { loaders } = this.pluginHook(loaderHook);\n loaders.push(mdxLoader());\n\n this.pluginHook(gitHook).onClient.hook(({ 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\n private async generateDocCollectionFrontmatterGlob(\n { workspace, codegen }: EmitCodeGeneratorContext,\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,\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(\n { codegen, workspace }: EmitCodeGeneratorContext,\n eager = false,\n ) {\n let s = `{`;\n const files = await this.getFiles();\n const query = codegen.formatQuery({\n collection: this.name,\n workspace,\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 private async generateCollectionStoreServer(context: EmitCodeGeneratorContext) {\n const { core, codegen } = context;\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(context, true);\n const bodyGlob = await this.generateDocCollectionGlob(context);\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(context, true),\n ],\n };\n }\n\n code = this.storeInitializer.run(code, {\n ...context,\n environment: \"server\",\n });\n codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);\n }\n\n private async generateCollectionStoreBrowser(context: EmitCodeGeneratorContext) {\n const { core, codegen } = context;\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(context)],\n };\n code = this.storeInitializer.run(code, {\n ...context,\n environment: \"browser\",\n });\n codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);\n }\n\n private async generateCollectionStoreDynamic(context: EmitCodeGeneratorContext) {\n const { core, codegen } = context;\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 = (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(context, true),\n \"_jsx_runtime\",\n ],\n };\n\n code = this.storeInitializer.run(code, {\n ...context,\n environment: \"dynamic\",\n });\n codegen.push(`export const ${this.name} = ${formatInitializer(code)};`);\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 { ExtractedReference } from \"@/collections/mdx/remark-postprocess\";\nexport type { CompiledMDX } from \"@/collections/mdx/build-mdx\";\n"],"mappings":"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"}
@@ -1,20 +1,16 @@
1
- import { t as Core } from "../core-Bkh-SI_3.js";
1
+ import { n as CoreOptions, t as Core } from "../core-BO3b8jMg.js";
2
2
  import { NextConfig } from "next";
3
3
 
4
4
  //#region src/next/index.d.ts
5
- interface NextOptions {
5
+ interface NextOptions extends Pick<CoreOptions, "cwd" | "configPath" | "outDir"> {
6
6
  /**
7
- * Path to source configuration file
8
- */
9
- configPath?: string;
10
- /**
11
- * Directory for output files
7
+ * clean output directory on start
12
8
  *
13
- * @defaultValue '.content'
9
+ * @defaultValue true
14
10
  */
15
- outDir?: string;
11
+ clean?: boolean;
16
12
  }
17
- declare function createContent(nextOptions?: NextOptions): Promise<(nextConfig?: NextConfig) => NextConfig>;
13
+ declare function createContent(options?: NextOptions): Promise<(nextConfig?: NextConfig) => NextConfig>;
18
14
  declare function createStandaloneCore(options: NextOptions): Promise<Core>;
19
15
  //#endregion
20
16
  export { NextOptions, createContent, createStandaloneCore };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/next/index.ts"],"sourcesContent":[],"mappings":";;;;UAMiB,WAAA;;AAAjB;AAcA;EAAiD,UAAA,CAAA,EAAA,MAAA;EAa3B;;;;AAiEtB;EAAoD,MAAA,CAAA,EAAA,MAAA;;AAAW,iBA9EzC,aAAA,CA8EyC,WAAA,CAAA,EA9Ed,WA8Ec,CAAA,EA9EE,OA8EF,CAAA,CAAA,UAAA,CAAA,EAjEzC,UAiEyC,EAAA,GAjEvB,UAiEuB,CAAA;AAAA,iBAAzC,oBAAA,CAAyC,OAAA,EAAX,WAAW,CAAA,EAAA,OAAA,CAAA,IAAA,CAAA"}
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,17 +1,17 @@
1
- import "../code-generator-gPtrfZ6Q.js";
2
- import { t as Core } from "../core-ZuoVBkeg.js";
3
- import { t as loadConfig } from "../load-from-file-1f4WaHsf.js";
4
- import * as path$1 from "node:path";
1
+ import { t as Core } from "../core-D5QHSKk6.js";
2
+ import { n as loaderPlugin } from "../loader-BuR4gkKg.js";
3
+ import { t as loadConfig } from "../load-from-file-irx0JI6j.js";
4
+ import path from "node:path";
5
5
 
6
6
  //#region src/next/index.ts
7
- async function createContent(nextOptions = {}) {
8
- const core = createNextCore(applyDefaults(nextOptions));
7
+ async function createContent(options = {}) {
8
+ const { clean = true } = options;
9
+ const isFirstStart = process.env._FUMA_CONTENT !== "1";
10
+ process.env._FUMA_CONTENT = "1";
11
+ const core = createNextCore(options);
12
+ if (clean && isFirstStart) await core.clearOutputDirectory();
9
13
  await core.init({ config: loadConfig(core, true) });
10
- if (process.env._FUMADOCS_MDX !== "1") {
11
- process.env._FUMADOCS_MDX = "1";
12
- await core.emit({ write: true });
13
- await init(process.env.NODE_ENV === "development", core);
14
- }
14
+ if (isFirstStart) await init(process.env.NODE_ENV === "development", core);
15
15
  return (nextConfig = {}) => {
16
16
  const ctx = core.getPluginContext();
17
17
  for (const plugin of core.getPlugins(true)) nextConfig = plugin.next?.config?.call(ctx, nextConfig) ?? nextConfig;
@@ -19,10 +19,11 @@ async function createContent(nextOptions = {}) {
19
19
  };
20
20
  }
21
21
  async function init(dev, core) {
22
+ await core.emit({ write: true });
22
23
  if (!dev) return;
23
24
  const { FSWatcher } = await import("chokidar");
24
25
  const { configPath, outDir } = core.getOptions();
25
- const absoluteConfigPath = path$1.resolve(configPath);
26
+ const absoluteConfigPath = path.resolve(configPath);
26
27
  let watcher;
27
28
  async function devServer() {
28
29
  if (watcher && !watcher.closed) await watcher.close();
@@ -31,17 +32,12 @@ async function init(dev, core) {
31
32
  persistent: true,
32
33
  ignored: [outDir]
33
34
  });
34
- watcher.add(configPath);
35
- for (const collection of core.getCollections(true)) {
36
- const handler = collection.handlers.fs;
37
- if (handler) watcher.add(handler.dir);
38
- }
39
35
  watcher.once("ready", () => {
40
- console.log("[MDX] started dev server");
36
+ console.log("[fuma-content] started dev server");
41
37
  });
42
38
  watcher.on("all", (_event, file) => {
43
- if (path$1.resolve(file) === absoluteConfigPath) {
44
- console.log("[MDX] restarting dev server");
39
+ if (path.resolve(file) === absoluteConfigPath) {
40
+ console.log("[fuma-content] restarting dev server");
45
41
  watcher?.removeAllListeners();
46
42
  (async () => {
47
43
  await core.init({ config: loadConfig(core, true) });
@@ -54,26 +50,22 @@ async function init(dev, core) {
54
50
  }
55
51
  process.on("exit", () => {
56
52
  if (!watcher || watcher.closed) return;
57
- console.log("[MDX] closing dev server");
53
+ console.log("[fuma-content] closing dev server");
58
54
  watcher.close();
59
55
  });
60
56
  await devServer();
61
57
  }
62
58
  async function createStandaloneCore(options) {
63
- const core = createNextCore(applyDefaults(options));
59
+ const core = createNextCore(options);
64
60
  await core.init({ config: loadConfig(core, true) });
65
61
  return core;
66
62
  }
67
- function applyDefaults(options) {
68
- return {
69
- outDir: options.outDir ?? Core.defaultOptions.outDir,
70
- configPath: options.configPath ?? Core.defaultOptions.configPath
71
- };
72
- }
73
- function createNextCore(options) {
63
+ function createNextCore({ configPath, cwd, outDir }) {
74
64
  return new Core({
75
- outDir: options.outDir,
76
- configPath: options.configPath
65
+ configPath,
66
+ cwd,
67
+ outDir,
68
+ plugins: [loaderPlugin()]
77
69
  });
78
70
  }
79
71
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["path","watcher: FSWatcher | undefined"],"sources":["../../src/next/index.ts"],"sourcesContent":["import type { NextConfig } from \"next\";\nimport * as path from \"node:path\";\nimport { loadConfig } from \"@/config/load-from-file\";\nimport { Core } from \"@/core\";\nimport type { FSWatcher } from \"chokidar\";\n\nexport interface NextOptions {\n /**\n * Path to source configuration file\n */\n configPath?: string;\n\n /**\n * Directory for output files\n *\n * @defaultValue '.content'\n */\n outDir?: string;\n}\n\nexport async function createContent(nextOptions: NextOptions = {}) {\n const core = createNextCore(applyDefaults(nextOptions));\n await core.init({\n config: loadConfig(core, true),\n });\n\n if (process.env._FUMADOCS_MDX !== \"1\") {\n process.env._FUMADOCS_MDX = \"1\";\n\n await core.emit({ write: true });\n await init(process.env.NODE_ENV === \"development\", core);\n }\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 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 watcher.add(configPath);\n for (const collection of core.getCollections(true)) {\n const handler = collection.handlers.fs;\n if (handler) {\n watcher.add(handler.dir);\n }\n }\n\n watcher.once(\"ready\", () => {\n console.log(\"[MDX] started dev server\");\n });\n\n watcher.on(\"all\", (_event, file) => {\n if (path.resolve(file) === absoluteConfigPath) {\n console.log(\"[MDX] 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(\"[MDX] closing dev server\");\n void watcher.close();\n });\n\n await devServer();\n}\n\nexport async function createStandaloneCore(options: NextOptions) {\n const core = createNextCore(applyDefaults(options));\n await core.init({\n config: loadConfig(core, true),\n });\n return core;\n}\n\nfunction applyDefaults(options: NextOptions): Required<NextOptions> {\n return {\n outDir: options.outDir ?? Core.defaultOptions.outDir,\n configPath: options.configPath ?? Core.defaultOptions.configPath,\n };\n}\n\nfunction createNextCore(options: Required<NextOptions>): Core {\n return new Core({\n outDir: options.outDir,\n configPath: options.configPath,\n });\n}\n"],"mappings":";;;;;;AAoBA,eAAsB,cAAc,cAA2B,EAAE,EAAE;CACjE,MAAM,OAAO,eAAe,cAAc,YAAY,CAAC;AACvD,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AAEF,KAAI,QAAQ,IAAI,kBAAkB,KAAK;AACrC,UAAQ,IAAI,gBAAgB;AAE5B,QAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;AAChC,QAAM,KAAK,QAAQ,IAAI,aAAa,eAAe,KAAK;;AAG1D,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,KAAI,CAAC,IAAK;CACV,MAAM,EAAE,cAAc,MAAM,OAAO;CACnC,MAAM,EAAE,YAAY,WAAW,KAAK,YAAY;CAChD,MAAM,qBAAqBA,OAAK,QAAQ,WAAW;CACnD,IAAIC;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;AACF,UAAQ,IAAI,WAAW;AACvB,OAAK,MAAM,cAAc,KAAK,eAAe,KAAK,EAAE;GAClD,MAAM,UAAU,WAAW,SAAS;AACpC,OAAI,QACF,SAAQ,IAAI,QAAQ,IAAI;;AAI5B,UAAQ,KAAK,eAAe;AAC1B,WAAQ,IAAI,2BAA2B;IACvC;AAEF,UAAQ,GAAG,QAAQ,QAAQ,SAAS;AAClC,OAAID,OAAK,QAAQ,KAAK,KAAK,oBAAoB;AAC7C,YAAQ,IAAI,8BAA8B;AAC1C,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,2BAA2B;AACvC,EAAK,QAAQ,OAAO;GACpB;AAEF,OAAM,WAAW;;AAGnB,eAAsB,qBAAqB,SAAsB;CAC/D,MAAM,OAAO,eAAe,cAAc,QAAQ,CAAC;AACnD,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,QAAO;;AAGT,SAAS,cAAc,SAA6C;AAClE,QAAO;EACL,QAAQ,QAAQ,UAAU,KAAK,eAAe;EAC9C,YAAY,QAAQ,cAAc,KAAK,eAAe;EACvD;;AAGH,SAAS,eAAe,SAAsC;AAC5D,QAAO,IAAI,KAAK;EACd,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACrB,CAAC"}
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"}
@@ -0,0 +1,8 @@
1
+ import "../core-BO3b8jMg.js";
2
+ import { LoaderOptions } from "./loader.js";
3
+
4
+ //#region src/node/index.d.ts
5
+ declare function register(options?: LoaderOptions): void;
6
+ //#endregion
7
+ export { register };
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"sourcesContent":[],"mappings":";;;;iBAGgB,QAAA,WAAkB"}
@@ -0,0 +1,10 @@
1
+ import * as module from "node:module";
2
+
3
+ //#region src/node/index.ts
4
+ function register(options = {}) {
5
+ module.register("./loader.js", import.meta.url, { data: options });
6
+ }
7
+
8
+ //#endregion
9
+ export { register };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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,7 +1,10 @@
1
- import { LoadHook } from "node:module";
1
+ import { n as CoreOptions } from "../core-BO3b8jMg.js";
2
+ import { InitializeHook, LoadHook } from "node:module";
2
3
 
3
4
  //#region src/node/loader.d.ts
5
+ type LoaderOptions = Omit<CoreOptions, "plugins" | "workspace">;
6
+ declare const initialize: InitializeHook<LoaderOptions>;
4
7
  declare const load: LoadHook;
5
8
  //#endregion
6
- export { load };
9
+ export { LoaderOptions, initialize, load };
7
10
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","names":[],"sources":["../../src/node/loader.ts"],"sourcesContent":[],"mappings":";;;cAca,MAAM"}
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,20 +1,23 @@
1
- import { t as createCache } from "../async-cache-BM9Yf4Nw.js";
2
- import "../code-generator-gPtrfZ6Q.js";
3
- import { t as Core } from "../core-ZuoVBkeg.js";
4
- import { t as createDynamicCore } from "../dynamic-B40uAtdo.js";
1
+ import { t as createDynamicCore } from "../dynamic-DhKTOrIl.js";
2
+ import { t as Core } from "../core-D5QHSKk6.js";
3
+ import { t as createCache } from "../async-cache-U87GzQTb.js";
4
+ import { n as loaderPlugin } from "../loader-BuR4gkKg.js";
5
5
 
6
6
  //#region src/node/loader.ts
7
- const configLoader = createDynamicCore({
8
- core: new Core({
9
- configPath: Core.defaultOptions.configPath,
10
- outDir: Core.defaultOptions.outDir
11
- }),
12
- buildConfig: true,
13
- mode: "production"
14
- });
7
+ let configLoader;
8
+ const initialize = (options) => {
9
+ configLoader = createDynamicCore({
10
+ core: new Core({
11
+ ...options,
12
+ plugins: [loaderPlugin()]
13
+ }),
14
+ mode: "production"
15
+ });
16
+ };
15
17
  const load = async (url, context, nextLoad) => {
18
+ if (!configLoader) throw new Error("not initialized");
16
19
  const core = await configLoader.getCore();
17
- const hooks = await createCache(core.cache).cached("node:load-hooks", async () => {
20
+ const hooks = await createCache(core.cache).$value().cached("node:load-hooks", async () => {
18
21
  const ctx = core.getPluginContext();
19
22
  return (await Promise.all(core.getPlugins(true).map(async (plugin) => {
20
23
  return plugin.node?.createLoad?.call(ctx);
@@ -31,5 +34,5 @@ const load = async (url, context, nextLoad) => {
31
34
  };
32
35
 
33
36
  //#endregion
34
- export { load };
37
+ export { initialize, load };
35
38
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","names":["load: LoadHook","url","context"],"sources":["../../src/node/loader.ts"],"sourcesContent":["import { Core } from \"@/core\";\nimport type { LoadFnOutput, LoadHook, LoadHookContext } from \"node:module\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { createDynamicCore } from \"@/config/dynamic\";\n\nconst configLoader = createDynamicCore({\n core: new Core({\n configPath: Core.defaultOptions.configPath,\n outDir: Core.defaultOptions.outDir,\n }),\n buildConfig: true,\n mode: \"production\",\n});\n\nexport const load: LoadHook = async (url, context, nextLoad) => {\n const core = await configLoader.getCore();\n const store = createCache(core.cache as Map<string, 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\n .getPlugins(true)\n .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) =>\n run(i + 1, url, { ...context, ...ctx }),\n );\n }\n\n return run(0, url, context);\n};\n"],"mappings":";;;;;;AAKA,MAAM,eAAe,kBAAkB;CACrC,MAAM,IAAI,KAAK;EACb,YAAY,KAAK,eAAe;EAChC,QAAQ,KAAK,eAAe;EAC7B,CAAC;CACF,aAAa;CACb,MAAM;CACP,CAAC;AAEF,MAAaA,OAAiB,OAAO,KAAK,SAAS,aAAa;CAC9D,MAAM,OAAO,MAAM,aAAa,SAAS;CAGzC,MAAM,QAAQ,MAFA,YAAY,KAAK,MAAiC,CAEtC,OAAO,mBAAmB,YAAY;EAC9D,MAAM,MAAM,KAAK,kBAAkB;AASnC,UAPc,MAAM,QAAQ,IAC1B,KACG,WAAW,KAAK,CAChB,IAAmC,OAAO,WAAW;AACpD,UAAO,OAAO,MAAM,YAAY,KAAK,IAAI;IACzC,CACL,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,QAClC,IAAI,IAAI,GAAGD,OAAK;GAAE,GAAGC;GAAS,GAAG;GAAK,CAAC,CACxC;;AAGH,QAAO,IAAI,GAAG,KAAK,QAAQ"}
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,13 +1,15 @@
1
1
  import fs from "node:fs/promises";
2
2
  import { fileURLToPath } from "node:url";
3
3
 
4
- //#region src/plugins/with-loader/node.ts
5
- function toNode(test, loader) {
4
+ //#region src/plugins/loader/node.ts
5
+ function toNode(loaders) {
6
6
  return async (url, _context, nextLoad) => {
7
- if (url.startsWith("file:///") && (!test || test.test(url))) {
7
+ if (!url.startsWith("file:///")) return nextLoad(url);
8
+ const config = loaders.find((loader) => !loader.test || loader.test.test(url));
9
+ if (config) {
8
10
  const parsedUrl = new URL(url);
9
11
  const filePath = fileURLToPath(parsedUrl);
10
- const result = await loader.load({
12
+ const result = await config.loader.load({
11
13
  filePath,
12
14
  query: Object.fromEntries(parsedUrl.searchParams.entries()),
13
15
  async getSource() {
@@ -28,4 +30,4 @@ function toNode(test, loader) {
28
30
 
29
31
  //#endregion
30
32
  export { toNode };
31
- //# sourceMappingURL=node-CGIIJIcs.js.map
33
+ //# sourceMappingURL=node-2VZOh3P9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-2VZOh3P9.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 compiler: {\n addDependency() {},\n },\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,UAAU,EACR,gBAAgB,IACjB;IACF,CAAC;AAEF,OAAI,OACF,QAAO;IACL,QAAQ,OAAO;IACf,QAAQ;IACR,cAAc;IACf;;AAIL,SAAO,SAAS,IAAI"}