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
@@ -1,2 +1,3 @@
1
- import { C as VersionControlHandler, S as VersionControlFileData, b as GitPluginOptions, w as git, x as VersionControlClient } from "../core-Bkh-SI_3.js";
2
- export { GitPluginOptions, VersionControlClient, VersionControlFileData, VersionControlHandler, git as default };
1
+ import "../core-BO3b8jMg.js";
2
+ import { a as gitHook, i as git, n as GitFileData, r as GitHook, t as GitClient } from "../git-2CjUW3M5.js";
3
+ export { GitClient, GitFileData, GitHook, git as default, gitHook };
@@ -1,62 +1,3 @@
1
- import { t as createCache } from "../async-cache-BM9Yf4Nw.js";
2
- import path from "node:path";
3
- import { x } from "tinyexec";
1
+ import { n as gitHook, t as git } from "../git-CQWA37-X.js";
4
2
 
5
- //#region src/plugins/git.ts
6
- /**
7
- * Add version control integration for Git.
8
- * 1. Injects `creationDate` & `lastModified` properties to page exports.
9
- *
10
- * @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.
11
- */
12
- function git(options = {}) {
13
- const { filter = () => true } = options;
14
- let client;
15
- return {
16
- name: "git",
17
- config() {
18
- const { workspace } = this.core.getOptions();
19
- client = createGitClient(workspace ? path.resolve(workspace.dir) : process.cwd());
20
- },
21
- collection(collection) {
22
- if (!filter(collection.name)) return;
23
- const handler = collection.handlers["version-control"];
24
- if (!handler) return;
25
- return handler.client({ client });
26
- }
27
- };
28
- }
29
- function createGitClient(cwd) {
30
- const cache = createCache();
31
- function mapDate(out) {
32
- if (out.exitCode !== 0) return null;
33
- const date = new Date(out.stdout);
34
- return Number.isNaN(date.getTime()) ? null : date;
35
- }
36
- return { async getFileData({ filePath }) {
37
- return cache.cached(filePath, async () => {
38
- const relativePath = path.relative(cwd, filePath);
39
- const [mod, create] = await Promise.all([x("git", [
40
- "log",
41
- "-1",
42
- "--pretty=%ai",
43
- relativePath
44
- ], { nodeOptions: { cwd } }), x("git", [
45
- "log",
46
- "--diff-filter=A",
47
- "--follow",
48
- "--format=%ai",
49
- "-1",
50
- relativePath
51
- ], { nodeOptions: { cwd } })]);
52
- return {
53
- lastModified: mapDate(mod),
54
- creationDate: mapDate(create)
55
- };
56
- });
57
- } };
58
- }
59
-
60
- //#endregion
61
- export { git as default };
62
- //# sourceMappingURL=git.js.map
3
+ export { git as default, gitHook };
@@ -1,2 +1,26 @@
1
- import { $ as JSONSchemaOptions, Q as JSONSchemaHandler, et as jsonSchema } from "../core-Bkh-SI_3.js";
2
- export { JSONSchemaHandler, JSONSchemaOptions, jsonSchema as default };
1
+ import { E as Awaitable, h as CollectionHook } from "../core-BO3b8jMg.js";
2
+
3
+ //#region src/plugins/json-schema.d.ts
4
+ interface JSONSchemaOptions {
5
+ /**
6
+ * insert `$schema` field to JSON files on creation.
7
+ *
8
+ * @defaultValue false
9
+ */
10
+ insert?: boolean;
11
+ /**
12
+ * create JSON schema
13
+ */
14
+ create?: () => Awaitable<object | undefined>;
15
+ }
16
+ interface JSONSchemaHook {
17
+ getSchemaPath: () => string;
18
+ create?: () => Awaitable<object | undefined>;
19
+ }
20
+ /**
21
+ * Generate JSON schemas locally for collection schemas.
22
+ */
23
+ declare const jsonSchemaHook: CollectionHook<JSONSchemaHook, JSONSchemaOptions>;
24
+ //#endregion
25
+ export { JSONSchemaHook, JSONSchemaOptions, jsonSchemaHook };
26
+ //# sourceMappingURL=json-schema.d.ts.map
@@ -0,0 +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,61 +1,52 @@
1
- import path from "node:path";
1
+ import { n as defineCollectionHook } from "../collections-DNFRdCuB.js";
2
+ import { t as FileSystemCollection } from "../fs-WWbLA7Gx.js";
2
3
  import fs from "node:fs/promises";
4
+ import path from "node:path";
3
5
 
4
6
  //#region src/plugins/json-schema.ts
5
7
  /**
6
- * Generate JSON schemas locally for collection schemas
7
- *
8
- * note: **it only works with Zod**
8
+ * Generate JSON schemas locally for collection schemas.
9
9
  */
10
- function jsonSchema({ insert = false } = {}) {
11
- function getSchemaPath(name) {
12
- return `json-schema/${name}.json`;
13
- }
14
- return {
15
- name: "json-schema",
16
- configureServer(server) {
17
- const { outDir } = this.core.getOptions();
18
- if (!server.watcher || !insert) return;
19
- server.watcher.on("add", async (file) => {
20
- const match = this.core.getCollections().find((collection) => {
21
- const handler = collection.handlers.fs;
22
- if (!handler) return false;
23
- return handler.hasFile(file);
24
- });
25
- if (!match) return;
26
- let obj;
27
- try {
28
- const content = (await fs.readFile(file)).toString();
29
- obj = content.length > 0 ? JSON.parse(content) : {};
30
- } catch {
31
- return;
32
- }
33
- if ("$schema" in obj) return;
34
- const schemaPath = path.join(outDir, getSchemaPath(parent ? `${parent.name}.meta` : match.name));
35
- const updated = {
36
- $schema: path.relative(path.dirname(file), schemaPath),
37
- ...obj
38
- };
39
- await fs.writeFile(file, JSON.stringify(updated, null, 2));
40
- });
41
- },
42
- async emit() {
43
- const files = [];
44
- for (const collection of this.core.getCollections()) {
45
- const handler = collection.handlers["json-schema"];
46
- if (!handler) continue;
47
- const jsonSchema$1 = await handler.create();
48
- if (!jsonSchema$1) continue;
49
- files.push({
50
- path: getSchemaPath(collection.name),
51
- content: JSON.stringify(jsonSchema$1, null, 2)
52
- });
53
- }
54
- return files;
10
+ const jsonSchemaHook = defineCollectionHook((collection, { insert = false, create }) => {
11
+ const hook = {
12
+ create,
13
+ getSchemaPath() {
14
+ return `json-schema/${collection.name}.json`;
55
15
  }
56
16
  };
57
- }
17
+ collection.onServer.hook(({ core, server }) => {
18
+ const { outDir } = core.getOptions();
19
+ if (!server.watcher || !insert || !(collection instanceof FileSystemCollection)) return;
20
+ server.watcher.on("add", async (file) => {
21
+ if (!collection.hasFile(file) || !file.endsWith(".json")) return;
22
+ let obj;
23
+ try {
24
+ const content = (await fs.readFile(file)).toString();
25
+ obj = content.length > 0 ? JSON.parse(content) : {};
26
+ } catch {
27
+ return;
28
+ }
29
+ if ("$schema" in obj) return;
30
+ const schemaPath = path.join(outDir, hook.getSchemaPath());
31
+ const updated = {
32
+ $schema: path.relative(path.dirname(file), schemaPath),
33
+ ...obj
34
+ };
35
+ await fs.writeFile(file, JSON.stringify(updated, null, 2));
36
+ });
37
+ });
38
+ collection.onEmit.pipe(async (entries) => {
39
+ const jsonSchema = await hook.create?.();
40
+ if (!jsonSchema) return entries;
41
+ entries.push({
42
+ path: hook.getSchemaPath(),
43
+ content: JSON.stringify(jsonSchema, null, 2)
44
+ });
45
+ return entries;
46
+ });
47
+ return hook;
48
+ });
58
49
 
59
50
  //#endregion
60
- export { jsonSchema as default };
51
+ export { jsonSchemaHook };
61
52
  //# sourceMappingURL=json-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","names":["obj: object","files: EmitEntry[]","jsonSchema"],"sources":["../../src/plugins/json-schema.ts"],"sourcesContent":["import type { EmitEntry, Plugin } from \"@/core\";\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\nexport interface JSONSchemaHandler {\n create: () => object | undefined | Promise<object | undefined>;\n}\n\n/**\n * Generate JSON schemas locally for collection schemas\n *\n * note: **it only works with Zod**\n */\nexport default function jsonSchema({\n insert = false,\n}: JSONSchemaOptions = {}): Plugin {\n function getSchemaPath(name: string) {\n return `json-schema/${name}.json`;\n }\n\n return {\n name: \"json-schema\",\n configureServer(server) {\n const { outDir } = this.core.getOptions();\n if (!server.watcher || !insert) return;\n\n server.watcher.on(\"add\", async (file) => {\n const match = this.core.getCollections().find((collection) => {\n const handler = collection.handlers.fs;\n if (!handler) return false;\n return handler.hasFile(file);\n });\n\n if (!match) return;\n let obj: object;\n try {\n const content = (await fs.readFile(file)).toString();\n obj = content.length > 0 ? JSON.parse(content) : {};\n } catch {\n return;\n }\n\n if (\"$schema\" in obj) return;\n const schemaPath = path.join(\n outDir,\n getSchemaPath(parent ? `${parent.name}.meta` : match.name),\n );\n const updated = {\n $schema: path.relative(path.dirname(file), schemaPath),\n ...obj,\n };\n\n await fs.writeFile(file, JSON.stringify(updated, null, 2));\n });\n },\n async emit() {\n const files: EmitEntry[] = [];\n\n for (const collection of this.core.getCollections()) {\n const handler = collection.handlers[\"json-schema\"];\n if (!handler) continue;\n\n const jsonSchema = await handler.create();\n if (!jsonSchema) continue;\n files.push({\n path: getSchemaPath(collection.name),\n content: JSON.stringify(jsonSchema, null, 2),\n });\n }\n\n return files;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAwB,WAAW,EACjC,SAAS,UACY,EAAE,EAAU;CACjC,SAAS,cAAc,MAAc;AACnC,SAAO,eAAe,KAAK;;AAG7B,QAAO;EACL,MAAM;EACN,gBAAgB,QAAQ;GACtB,MAAM,EAAE,WAAW,KAAK,KAAK,YAAY;AACzC,OAAI,CAAC,OAAO,WAAW,CAAC,OAAQ;AAEhC,UAAO,QAAQ,GAAG,OAAO,OAAO,SAAS;IACvC,MAAM,QAAQ,KAAK,KAAK,gBAAgB,CAAC,MAAM,eAAe;KAC5D,MAAM,UAAU,WAAW,SAAS;AACpC,SAAI,CAAC,QAAS,QAAO;AACrB,YAAO,QAAQ,QAAQ,KAAK;MAC5B;AAEF,QAAI,CAAC,MAAO;IACZ,IAAIA;AACJ,QAAI;KACF,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,EAAE,UAAU;AACpD,WAAM,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,GAAG,EAAE;YAC7C;AACN;;AAGF,QAAI,aAAa,IAAK;IACtB,MAAM,aAAa,KAAK,KACtB,QACA,cAAc,SAAS,GAAG,OAAO,KAAK,SAAS,MAAM,KAAK,CAC3D;IACD,MAAM,UAAU;KACd,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,EAAE,WAAW;KACtD,GAAG;KACJ;AAED,UAAM,GAAG,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;KAC1D;;EAEJ,MAAM,OAAO;GACX,MAAMC,QAAqB,EAAE;AAE7B,QAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,EAAE;IACnD,MAAM,UAAU,WAAW,SAAS;AACpC,QAAI,CAAC,QAAS;IAEd,MAAMC,eAAa,MAAM,QAAQ,QAAQ;AACzC,QAAI,CAACA,aAAY;AACjB,UAAM,KAAK;KACT,MAAM,cAAc,WAAW,KAAK;KACpC,SAAS,KAAK,UAAUA,cAAY,MAAM,EAAE;KAC7C,CAAC;;AAGJ,UAAO;;EAEV"}
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"}
@@ -0,0 +1,4 @@
1
+ import "../../core-BO3b8jMg.js";
2
+ import "../../dynamic-CTYYdl7_.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-Da88Sj8w.js";
4
+ export { CompilerOptions, Loader, LoaderConfig, LoaderHook, LoaderInput, LoaderOutput, loaderHook, loaderPlugin };
@@ -0,0 +1,3 @@
1
+ import { n as loaderPlugin, t as loaderHook } from "../../loader-BuR4gkKg.js";
2
+
3
+ export { loaderHook, loaderPlugin };
@@ -0,0 +1,4 @@
1
+ import "../../core-BO3b8jMg.js";
2
+ import "../../dynamic-CTYYdl7_.js";
3
+ import { d as createWebpackLoader, l as WebpackLoader, u as WebpackLoaderOptions } from "../../index-Da88Sj8w.js";
4
+ export { WebpackLoader, WebpackLoaderOptions, createWebpackLoader };
@@ -0,0 +1,60 @@
1
+ import { t as createDynamicCore } from "../../dynamic-DhKTOrIl.js";
2
+ import { t as Core } from "../../core-D5QHSKk6.js";
3
+ import { t as ValidationError } from "../../validation-BvVvvLII.js";
4
+ import path from "node:path";
5
+ import { parse } from "node:querystring";
6
+
7
+ //#region src/plugins/loader/webpack.ts
8
+ const cachedCores = /* @__PURE__ */ new Map();
9
+ function initDynamicCore({ configPath, isDev, outDir }) {
10
+ const key = `${configPath}:${isDev}:${outDir}`;
11
+ let res = cachedCores.get(key);
12
+ if (res) return res;
13
+ res = createDynamicCore({
14
+ core: new Core({
15
+ configPath,
16
+ outDir
17
+ }),
18
+ compileMode: "skip",
19
+ mode: isDev ? "dev" : "production"
20
+ });
21
+ cachedCores.set(key, res);
22
+ return res;
23
+ }
24
+ /**
25
+ * Note: need to handle the `test` regex in Webpack config instead.
26
+ */
27
+ function createWebpackLoader(loaderFactory) {
28
+ let loader;
29
+ async function asyncLoader(source, callback) {
30
+ const options = this.getOptions();
31
+ this.cacheable(true);
32
+ this.addDependency(options.absoluteCompiledConfigPath);
33
+ if (!loader) loader = loaderFactory(initDynamicCore(options));
34
+ try {
35
+ const result = await loader.load({
36
+ filePath: this.resourcePath,
37
+ query: parse(this.resourceQuery.slice(1)),
38
+ getSource() {
39
+ return source;
40
+ },
41
+ development: this.mode === "development",
42
+ compiler: this
43
+ });
44
+ if (result === null) callback(void 0, source);
45
+ else callback(void 0, result.code, result.map);
46
+ } catch (error) {
47
+ if (error instanceof ValidationError) return callback(new Error(await error.toStringFormatted()));
48
+ if (!(error instanceof Error)) throw error;
49
+ error.message = `${path.relative(this.context, this.resourcePath)}:${error.name}: ${error.message}`;
50
+ callback(error);
51
+ }
52
+ }
53
+ return function loader$1(source) {
54
+ return asyncLoader.call(this, source, this.async());
55
+ };
56
+ }
57
+
58
+ //#endregion
59
+ export { createWebpackLoader };
60
+ //# sourceMappingURL=webpack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack.js","names":["loader: Loader | undefined","loader"],"sources":["../../../src/plugins/loader/webpack.ts"],"sourcesContent":["import { parse } from \"node:querystring\";\nimport { ValidationError } from \"@/utils/validation\";\nimport path from \"node:path\";\nimport { Core } from \"@/core\";\nimport { createDynamicCore, type DynamicCore } from \"@/dynamic\";\nimport type { LoaderContext } from \"webpack\";\nimport type { Loader } from \"@/plugins/loader\";\n\nexport interface WebpackLoaderOptions {\n absoluteCompiledConfigPath: string;\n configPath: string;\n outDir: string;\n isDev: boolean;\n}\n\nexport type WebpackLoader = (this: LoaderContext<WebpackLoaderOptions>, source: string) => void;\n\nconst cachedCores = new Map<string, DynamicCore>();\n\nfunction initDynamicCore({ configPath, isDev, outDir }: WebpackLoaderOptions) {\n const key = `${configPath}:${isDev}:${outDir}`;\n let res = cachedCores.get(key);\n if (res) return res;\n\n res = createDynamicCore({\n core: new Core({ configPath, outDir }),\n compileMode: \"skip\",\n mode: isDev ? \"dev\" : \"production\",\n });\n cachedCores.set(key, res);\n return res;\n}\n\n/**\n * Note: need to handle the `test` regex in Webpack config instead.\n */\nexport function createWebpackLoader(loaderFactory: (core: DynamicCore) => Loader): WebpackLoader {\n let loader: Loader | undefined;\n\n async function asyncLoader(\n this: LoaderContext<WebpackLoaderOptions>,\n source: string,\n callback: LoaderContext<WebpackLoaderOptions>[\"callback\"],\n ) {\n const options = this.getOptions();\n this.cacheable(true);\n this.addDependency(options.absoluteCompiledConfigPath);\n\n if (!loader) {\n const core = initDynamicCore(options);\n loader = loaderFactory(core);\n }\n\n try {\n const result = await loader.load({\n filePath: this.resourcePath,\n query: parse(this.resourceQuery.slice(1)),\n getSource() {\n return source;\n },\n development: this.mode === \"development\",\n compiler: this,\n });\n\n if (result === null) {\n callback(undefined, source);\n } else {\n callback(undefined, result.code, result.map as string);\n }\n } catch (error) {\n if (error instanceof ValidationError) {\n return callback(new Error(await error.toStringFormatted()));\n }\n\n if (!(error instanceof Error)) throw error;\n\n const fpath = path.relative(this.context, this.resourcePath);\n error.message = `${fpath}:${error.name}: ${error.message}`;\n callback(error);\n }\n }\n\n return function loader(source) {\n return asyncLoader.call(this, source, this.async());\n };\n}\n"],"mappings":";;;;;;;AAiBA,MAAM,8BAAc,IAAI,KAA0B;AAElD,SAAS,gBAAgB,EAAE,YAAY,OAAO,UAAgC;CAC5E,MAAM,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG;CACtC,IAAI,MAAM,YAAY,IAAI,IAAI;AAC9B,KAAI,IAAK,QAAO;AAEhB,OAAM,kBAAkB;EACtB,MAAM,IAAI,KAAK;GAAE;GAAY;GAAQ,CAAC;EACtC,aAAa;EACb,MAAM,QAAQ,QAAQ;EACvB,CAAC;AACF,aAAY,IAAI,KAAK,IAAI;AACzB,QAAO;;;;;AAMT,SAAgB,oBAAoB,eAA6D;CAC/F,IAAIA;CAEJ,eAAe,YAEb,QACA,UACA;EACA,MAAM,UAAU,KAAK,YAAY;AACjC,OAAK,UAAU,KAAK;AACpB,OAAK,cAAc,QAAQ,2BAA2B;AAEtD,MAAI,CAAC,OAEH,UAAS,cADI,gBAAgB,QAAQ,CACT;AAG9B,MAAI;GACF,MAAM,SAAS,MAAM,OAAO,KAAK;IAC/B,UAAU,KAAK;IACf,OAAO,MAAM,KAAK,cAAc,MAAM,EAAE,CAAC;IACzC,YAAY;AACV,YAAO;;IAET,aAAa,KAAK,SAAS;IAC3B,UAAU;IACX,CAAC;AAEF,OAAI,WAAW,KACb,UAAS,QAAW,OAAO;OAE3B,UAAS,QAAW,OAAO,MAAM,OAAO,IAAc;WAEjD,OAAO;AACd,OAAI,iBAAiB,gBACnB,QAAO,SAAS,IAAI,MAAM,MAAM,MAAM,mBAAmB,CAAC,CAAC;AAG7D,OAAI,EAAE,iBAAiB,OAAQ,OAAM;AAGrC,SAAM,UAAU,GADF,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,CACnC,GAAG,MAAM,KAAK,IAAI,MAAM;AACjD,YAAS,MAAM;;;AAInB,QAAO,SAASC,SAAO,QAAQ;AAC7B,SAAO,YAAY,KAAK,MAAM,QAAQ,KAAK,OAAO,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { D as GetCollectionConfig } from "./core-BO3b8jMg.js";
2
+ import { t as FileCollectionStore } from "./file-store-laO4IjvB.js";
3
+ import { a as ExtractedReference, i as CompiledMDX, t as MDXCollection } from "./mdx-Dt9hirUu.js";
4
+ import { n as GitFileData } from "./git-2CjUW3M5.js";
5
+
6
+ //#region src/collections/mdx/runtime.d.ts
7
+ interface MDXStoreData<Frontmatter, Attached = unknown> {
8
+ id: string;
9
+ compiled: CompiledMDX<Frontmatter> & Attached;
10
+ }
11
+ type GetFrontmatter<Config, Name extends string> = GetCollectionConfig<Config, Name> extends MDXCollection ? GetCollectionConfig<Config, Name>["$inferFrontmatter"] : never;
12
+ declare function mdxStore<Config, Name extends string, Attached>(_name: Name, base: string, _input: Record<string, unknown>): FileCollectionStore<MDXStoreData<GetFrontmatter<Config, Name>, Attached>>;
13
+ interface MDXStoreLazyData<Frontmatter, Attached> {
14
+ id: string;
15
+ frontmatter: Frontmatter;
16
+ load: () => Promise<CompiledMDX<Frontmatter> & Attached>;
17
+ }
18
+ declare function mdxStoreLazy<Config, Name extends string, Attached>(_name: Name, base: string, _input: {
19
+ head: Record<string, unknown>;
20
+ body: Record<string, () => Promise<unknown>>;
21
+ }): FileCollectionStore<MDXStoreLazyData<GetFrontmatter<Config, Name>, Attached>>;
22
+ interface WithExtractedReferences {
23
+ /**
24
+ * extracted references (e.g. hrefs, paths), useful for analyzing relationships between pages.
25
+ */
26
+ extractedReferences: ExtractedReference[];
27
+ }
28
+ type WithGit = GitFileData;
29
+ //#endregion
30
+ export { mdxStore as a, WithGit as i, MDXStoreLazyData as n, mdxStoreLazy as o, WithExtractedReferences as r, MDXStoreData as t };
31
+ //# sourceMappingURL=runtime-HN-HSB0Z.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-HN-HSB0Z.d.ts","names":[],"sources":["../src/collections/mdx/runtime.ts"],"sourcesContent":[],"mappings":";;;;;;AAOiB,UAAA,YAAY,CAAA,WAAA,EAAA,WAAA,OAAA,CAAA,CAAA;EAEL,EAAA,EAAA,MAAA;EAAZ,QAAA,EAAA,WAAA,CAAY,WAAZ,CAAA,GAA2B,QAA3B;;KAGP,cAH0C,CAAA,MAAA,EAAA,aAAA,MAAA,CAAA,GAI7C,mBAJ6C,CAIzB,MAJyB,EAIjB,IAJiB,CAAA,SAIH,aAJG,GAKzC,mBALyC,CAKrB,MALqB,EAKb,IALa,CAAA,CAAA,mBAAA,CAAA,GAAA,KAAA;AAG1C,iBAKW,QALG,CAAA,MAAA,EAAA,aAAA,MAAA,EAAA,QAAA,CAAA,CAAA,KAAA,EAMV,IANU,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAQT,MARS,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAShB,mBATgB,CASI,YATJ,CASiB,cATjB,CASgC,MAThC,EASwC,IATxC,CAAA,EAS+C,QAT/C,CAAA,CAAA;AACG,UAsBL,gBAtBK,CAAA,WAAA,EAAA,QAAA,CAAA,CAAA;EAAQ,EAAA,EAAA,MAAA;EAA5B,WAAA,EAwBa,WAxBb;EAA0C,IAAA,EAAA,GAAA,GAyB9B,OAzB8B,CAyBtB,WAzBsB,CAyBV,WAzBU,CAAA,GAyBK,QAzBL,CAAA;;AACV,iBA2BlB,YA3BkB,CAAA,MAAA,EAAA,aAAA,MAAA,EAAA,QAAA,CAAA,CAAA,KAAA,EA4BzB,IA5ByB,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA;EAA5B,IAAA,EA+BI,MA/BJ,CAAA,MAAA,EAAA,OAAA,CAAA;EAAmB,IAAA,EAgCf,MAhCe,CAAA,MAAA,EAAA,GAAA,GAgCM,OAhCN,CAAA,OAAA,CAAA,CAAA;AAGzB,CAAA,CAAA,EA+BG,mBA/BqB,CA+BD,gBA/BC,CA+BgB,cA/BhB,CA+B+B,MA/B/B,EA+BuC,IA/BvC,CAAA,EA+B8C,QA/B9C,CAAA,CAAA;AACf,UAgDQ,uBAAA,CAhDR;EAEC;;;EAC0B,mBAAA,EAiDb,kBAjDa,EAAA;;AAAb,KAoDX,OAAA,GAAU,WApDC"}
@@ -0,0 +1,29 @@
1
+ import { D as GetCollectionConfig, E as Awaitable } from "./core-BO3b8jMg.js";
2
+ import { n as MapCollectionStore } from "./store-DiuGdV5M.js";
3
+ import { i as CompiledMDX, t as MDXCollection } from "./mdx-Dt9hirUu.js";
4
+
5
+ //#region src/utils/async-cache.d.ts
6
+ interface AsyncCache<V> {
7
+ cached: (key: string, fn: () => V | Promise<V>) => V | Promise<V>;
8
+ $value: <T>() => AsyncCache<T>;
9
+ invalidate: (key: string) => void;
10
+ }
11
+ //#endregion
12
+ //#region src/collections/mdx/runtime-browser.d.ts
13
+ interface MDXStoreBrowserData<Frontmatter, Attached = unknown> {
14
+ id: string;
15
+ preload: () => Awaitable<CompiledMDX<Frontmatter> & Attached>;
16
+ _store: StoreContext;
17
+ }
18
+ interface StoreContext {
19
+ storeId: string;
20
+ }
21
+ interface StoreData {
22
+ preloaded: AsyncCache<CompiledMDX>;
23
+ }
24
+ type GetFrontmatter<Config, Name extends string> = GetCollectionConfig<Config, Name> extends MDXCollection ? GetCollectionConfig<Config, Name>["$inferFrontmatter"] : never;
25
+ declare const _internal_data: Map<string, StoreData>;
26
+ declare function mdxStoreBrowser<Config, Name extends string, Attached>(name: Name, _input: Record<string, () => Promise<unknown>>): MapCollectionStore<string, MDXStoreBrowserData<GetFrontmatter<Config, Name>, Attached>>;
27
+ //#endregion
28
+ export { _internal_data as n, mdxStoreBrowser as r, MDXStoreBrowserData as t };
29
+ //# sourceMappingURL=runtime-browser-BQEk7qjc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-browser-BQEk7qjc.d.ts","names":[],"sources":["../src/utils/async-cache.ts","../src/collections/mdx/runtime-browser.ts"],"sourcesContent":[],"mappings":";;;;;UAAiB;kCACiB,IAAI,QAAQ,OAAO,IAAI,QAAQ;mBAC9C,WAAW;;;;;AAFb,UCQA,mBDRU,CAAA,WAAA,EAAA,WAAA,OAAA,CAAA,CAAA;EACO,EAAA,EAAA,MAAA;EAAY,OAAA,EAAA,GAAA,GCS7B,SDT6B,CCSnB,WDTmB,CCSP,WDTO,CAAA,GCSQ,QDTR,CAAA;EAAR,MAAA,ECU5B,YDV4B;;UCa5B,YAAA,CDbuD;EAAR,OAAA,EAAA,MAAA;;UCiB/C,SAAA,CDhBS;EAAU,SAAA,ECiBhB,UDjBgB,CCiBL,WDjBK,CAAA;;KCoBxB,8CACH,oBAAoB,QAAQ,cAAc,gBACtC,oBAAoB,QAAQ;cAGrB,gBAAc,YAAA;AAnBV,iBAqBD,eArBoB,CAAA,MAAA,EAAA,aAAA,MAAA,EAAA,QAAA,CAAA,CAAA,IAAA,EAsB5B,IAtB4B,EAAA,MAAA,EAuB1B,MAvB0B,CAAA,MAAA,EAAA,GAAA,GAuBL,OAvBK,CAAA,OAAA,CAAA,CAAA,CAAA,EAwBjC,kBAxBiC,CAAA,MAAA,EAwBN,mBAxBM,CAwBc,cAxBd,CAwB6B,MAxB7B,EAwBqC,IAxBrC,CAAA,EAwB4C,QAxB5C,CAAA,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { E as Awaitable } from "./core-BO3b8jMg.js";
2
+
3
+ //#region src/collections/runtime/store.d.ts
4
+ interface CollectionStore<Id, Data> {
5
+ /**
6
+ * type-only operation to cast data type, doesn't do any runtime transformation.
7
+ */
8
+ castData: <T>(_cast: (input: Data) => T) => CollectionStore<Id, T>;
9
+ get: (id: Id) => Awaitable<Data | undefined>;
10
+ list: () => Awaitable<Data[]>;
11
+ /**
12
+ * For typescript to infer data types, don't access the value of this property.
13
+ */
14
+ $inferData: Data;
15
+ }
16
+ declare class MapCollectionStore<Id, Data> implements CollectionStore<Id, Data> {
17
+ private readonly dataMap;
18
+ private readonly dataList;
19
+ constructor(input: Map<Id, Data>);
20
+ get(id: Id): Data | undefined;
21
+ list(): Data[];
22
+ castData<T>(_cast: (input: Data) => T): MapCollectionStore<Id, T>;
23
+ /**
24
+ * in-place transformation on all data
25
+ */
26
+ transform<T>(fn: (input: Data) => T): MapCollectionStore<Id, T>;
27
+ get $inferData(): Data;
28
+ }
29
+ //#endregion
30
+ export { MapCollectionStore as n, CollectionStore as t };
31
+ //# sourceMappingURL=store-DiuGdV5M.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-DiuGdV5M.d.ts","names":[],"sources":["../src/collections/runtime/store.ts"],"sourcesContent":[],"mappings":";;;UAEiB;;AAAjB;;EAIwC,QAAA,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,KAAA,EAAT,IAAS,EAAA,GAAA,CAAA,EAAA,GAAM,eAAN,CAAsB,EAAtB,EAA0B,CAA1B,CAAA;EAAsB,GAAA,EAAA,CAAA,EAAA,EAElD,EAFkD,EAAA,GAE3C,SAF2C,CAEjC,IAFiC,GAAA,SAAA,CAAA;EAAI,IAAA,EAAA,GAAA,GAGpD,SAHoD,CAG1C,IAH0C,EAAA,CAAA;EAApB;;;EAE3B,UAAA,EAML,IANK;;AACL,cAQD,kBARC,CAAA,EAAA,EAAA,IAAA,CAAA,YAQuC,eARvC,CAQuD,EARvD,EAQ2D,IAR3D,CAAA,CAAA;EAKA,iBAAA,OAAA;EAAI,iBAAA,QAAA;EAGL,WAAA,CAAA,KAAA,EAIQ,GAJU,CAIN,EAJM,EAIF,IAJE,CAAA;EAAsC,GAAA,CAAA,EAAA,EAS3D,EAT2D,CAAA,EAStD,IATsD,GAAA,SAAA;EAAI,IAAA,CAAA,CAAA,EAa/D,IAb+D,EAAA;EAIhD,QAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA,KAAA,EAaI,IAbJ,EAAA,GAaa,CAbb,CAAA,EAaiB,kBAbjB,CAaoC,EAbpC,EAawC,CAbxC,CAAA;EAAI;;;EAKd,SAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAeY,IAfZ,EAAA,GAeqB,CAfrB,CAAA,EAeyB,kBAfzB,CAe4C,EAf5C,EAegD,CAfhD,CAAA;EAIL,IAAA,UAAA,CAAA,CAAA,EAyBU,IAzBV"}
@@ -1,5 +1,5 @@
1
1
  //#region src/collections/runtime/store.ts
2
- var SimpleCollectionStore = class {
2
+ var MapCollectionStore = class {
3
3
  dataMap;
4
4
  dataList;
5
5
  constructor(input) {
@@ -12,7 +12,7 @@ var SimpleCollectionStore = class {
12
12
  list() {
13
13
  return this.dataList;
14
14
  }
15
- $data(_cast) {
15
+ castData(_cast) {
16
16
  return this;
17
17
  }
18
18
  /**
@@ -33,5 +33,5 @@ var SimpleCollectionStore = class {
33
33
  };
34
34
 
35
35
  //#endregion
36
- export { SimpleCollectionStore as t };
37
- //# sourceMappingURL=store-0LQ2PlH6.js.map
36
+ export { MapCollectionStore as t };
37
+ //# sourceMappingURL=store-IvpEBdxi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-IvpEBdxi.js","names":[],"sources":["../src/collections/runtime/store.ts"],"sourcesContent":["import type { Awaitable } from \"@/types\";\n\nexport interface CollectionStore<Id, Data> {\n /**\n * type-only operation to cast data type, doesn't do any runtime transformation.\n */\n castData: <T>(_cast: (input: Data) => T) => CollectionStore<Id, T>;\n\n get: (id: Id) => Awaitable<Data | undefined>;\n list: () => Awaitable<Data[]>;\n\n /**\n * For typescript to infer data types, don't access the value of this property.\n */\n $inferData: Data;\n}\n\nexport class MapCollectionStore<Id, Data> implements CollectionStore<Id, Data> {\n private readonly dataMap: Map<Id, Data>;\n private readonly dataList: Data[];\n\n constructor(input: Map<Id, Data>) {\n this.dataMap = input;\n this.dataList = Array.from(input.values());\n }\n\n get(id: Id): Data | undefined {\n return this.dataMap.get(id);\n }\n\n list(): Data[] {\n return this.dataList;\n }\n\n castData<T>(_cast: (input: Data) => T): MapCollectionStore<Id, T> {\n return this as unknown as MapCollectionStore<Id, T>;\n }\n\n /**\n * in-place transformation on all data\n */\n transform<T>(fn: (input: Data) => T): MapCollectionStore<Id, T> {\n this.dataList.length = 0;\n const dataMap = this.dataMap as unknown as Map<Id, T>;\n const dataList = this.dataList as unknown as T[];\n\n for (const [k, v] of this.dataMap) {\n const updated = fn(v);\n dataMap.set(k, updated);\n dataList.push(updated);\n }\n\n return this as unknown as MapCollectionStore<Id, T>;\n }\n\n get $inferData(): Data {\n return undefined as Data;\n }\n}\n"],"mappings":";AAiBA,IAAa,qBAAb,MAA+E;CAC7E,AAAiB;CACjB,AAAiB;CAEjB,YAAY,OAAsB;AAChC,OAAK,UAAU;AACf,OAAK,WAAW,MAAM,KAAK,MAAM,QAAQ,CAAC;;CAG5C,IAAI,IAA0B;AAC5B,SAAO,KAAK,QAAQ,IAAI,GAAG;;CAG7B,OAAe;AACb,SAAO,KAAK;;CAGd,SAAY,OAAsD;AAChE,SAAO;;;;;CAMT,UAAa,IAAmD;AAC9D,OAAK,SAAS,SAAS;EACvB,MAAM,UAAU,KAAK;EACrB,MAAM,WAAW,KAAK;AAEtB,OAAK,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS;GACjC,MAAM,UAAU,GAAG,EAAE;AACrB,WAAQ,IAAI,GAAG,QAAQ;AACvB,YAAS,KAAK,QAAQ;;AAGxB,SAAO;;CAGT,IAAI,aAAmB"}
@@ -22,7 +22,16 @@ async function validate(schema, data, context, errorMessage) {
22
22
  }
23
23
  return data;
24
24
  }
25
+ /**
26
+ * get JSON Schema from a Standard Schema
27
+ */
28
+ function getJSONSchema(schema) {
29
+ return schema["~standard"]?.jsonSchema.input({
30
+ target: "draft-2020-12",
31
+ libraryOptions: { unrepresentable: "any" }
32
+ });
33
+ }
25
34
 
26
35
  //#endregion
27
- export { validate as n, ValidationError as t };
28
- //# sourceMappingURL=validation-BOJKRAp5.js.map
36
+ export { getJSONSchema as n, validate as r, ValidationError as t };
37
+ //# sourceMappingURL=validation-BvVvvLII.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-BvVvvLII.js","names":[],"sources":["../src/utils/validation.ts"],"sourcesContent":["import type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\";\n\nexport class ValidationError extends Error {\n title: string;\n issues: readonly StandardSchemaV1.Issue[];\n\n constructor(message: string, issues: readonly StandardSchemaV1.Issue[]) {\n super(`${message}:\\n${issues.map((issue) => ` ${issue.path}: ${issue.message}`).join(\"\\n\")}`);\n\n this.title = message;\n this.issues = issues;\n }\n\n async toStringFormatted() {\n // Handle ESM/CJS interop: picocolors is a CJS module that exports via\n // module.exports = createColors(). When dynamically imported in ESM context\n // (e.g., Next.js 16 Turbopack), the exports are wrapped under .default\n const picocolorsModule = await import(\"picocolors\");\n const picocolors = picocolorsModule.default ?? picocolorsModule;\n\n return [\n picocolors.bold(`[Fuma Content] ${this.title}:`),\n ...this.issues.map((issue) =>\n picocolors.redBright(\n `- ${picocolors.bold(issue.path?.join(\".\") ?? \"*\")}: ${issue.message}`,\n ),\n ),\n ].join(\"\\n\");\n }\n}\n\nexport async function validate<Schema extends StandardSchemaV1, Context>(\n schema: StandardSchemaV1 | ((context: Context) => StandardSchemaV1),\n data: unknown,\n context: Context,\n errorMessage: string,\n): Promise<StandardSchemaV1.InferOutput<Schema>> {\n if (typeof schema === \"function\" && !(\"~standard\" in schema)) {\n schema = schema(context);\n }\n\n if (\"~standard\" in schema) {\n const result = await (schema as StandardSchemaV1)[\"~standard\"].validate(data);\n\n if (result.issues) {\n throw new ValidationError(errorMessage, result.issues);\n }\n\n return result.value;\n }\n\n return data;\n}\n\n/**\n * get JSON Schema from a Standard Schema\n */\nexport function getJSONSchema(schema: StandardSchemaV1) {\n return (schema as unknown as Partial<StandardJSONSchemaV1>)[\"~standard\"]?.jsonSchema.input({\n target: \"draft-2020-12\",\n libraryOptions: {\n // for Zod\n unrepresentable: \"any\",\n },\n });\n}\n"],"mappings":";AAEA,IAAa,kBAAb,cAAqC,MAAM;CACzC;CACA;CAEA,YAAY,SAAiB,QAA2C;AACtE,QAAM,GAAG,QAAQ,KAAK,OAAO,KAAK,UAAU,KAAK,MAAM,KAAK,IAAI,MAAM,UAAU,CAAC,KAAK,KAAK,GAAG;AAE9F,OAAK,QAAQ;AACb,OAAK,SAAS;;CAGhB,MAAM,oBAAoB;EAIxB,MAAM,mBAAmB,MAAM,OAAO;EACtC,MAAM,aAAa,iBAAiB,WAAW;AAE/C,SAAO,CACL,WAAW,KAAK,kBAAkB,KAAK,MAAM,GAAG,EAChD,GAAG,KAAK,OAAO,KAAK,UAClB,WAAW,UACT,KAAK,WAAW,KAAK,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,UAC9D,CACF,CACF,CAAC,KAAK,KAAK;;;AAIhB,eAAsB,SACpB,QACA,MACA,SACA,cAC+C;AAC/C,KAAI,OAAO,WAAW,cAAc,EAAE,eAAe,QACnD,UAAS,OAAO,QAAQ;AAG1B,KAAI,eAAe,QAAQ;EACzB,MAAM,SAAS,MAAO,OAA4B,aAAa,SAAS,KAAK;AAE7E,MAAI,OAAO,OACT,OAAM,IAAI,gBAAgB,cAAc,OAAO,OAAO;AAGxD,SAAO,OAAO;;AAGhB,QAAO;;;;;AAMT,SAAgB,cAAc,QAA0B;AACtD,QAAQ,OAAoD,cAAc,WAAW,MAAM;EACzF,QAAQ;EACR,gBAAgB,EAEd,iBAAiB,OAClB;EACF,CAAC"}
@@ -1,26 +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 { PluginOption } from "vite";
3
3
 
4
4
  //#region src/vite/index.d.ts
5
- interface PluginOptions {
5
+ interface PluginOptions extends Pick<CoreOptions, "configPath" | "cwd" | "outDir"> {
6
6
  /**
7
- * @defaultValue content.config.ts
8
- */
9
- configPath?: string;
10
- /**
11
- * Update Vite config to fix module resolution of Fumadocs
7
+ * clean output directory on start
12
8
  *
13
9
  * @defaultValue true
14
10
  */
15
- updateViteConfig?: boolean;
16
- /**
17
- * Output directory of generated files
18
- *
19
- * @defaultValue '.content'
20
- */
21
- outDir?: string;
11
+ clean?: boolean;
22
12
  }
23
- declare function content(config: Record<string, unknown>, pluginOptions?: PluginOptions): Promise<PluginOption[]>;
13
+ declare function content(config: Record<string, unknown>, pluginOpitons?: PluginOptions): Promise<PluginOption[]>;
24
14
  declare function createStandaloneCore(pluginOptions?: PluginOptions): Promise<Core>;
25
15
  //#endregion
26
16
  export { PluginOptions, createStandaloneCore, content as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/vite/index.ts"],"sourcesContent":[],"mappings":";;;;UAKiB,aAAA;;AAAjB;AAmBC;EAGS,UAAA,CAAA,EAAA,MAAA;EACO;;;;AA2BjB;EAA0D,gBAAA,CAAA,EAAA,OAAA;EAAkB;;;;;;;iBA7B9C,OAAA,SACpB,yCACO,gBACd,QAAQ;iBA0BW,oBAAA,iBAAoC,gBAAkB,QAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/vite/index.ts"],"sourcesContent":[],"mappings":";;;;UAKiB,aAAA,SAAsB,KAAK;;AAA5C;AAOC;;;EAKU,KAAA,CAAA,EAAA,OAAA;;AAAD,iBAHoB,OAAA,CAGpB,MAAA,EAFA,MAEA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,aAAA,CAAA,EADO,aACP,CAAA,EAAP,OAAO,CAAC,YAAD,EAAA,CAAA;AA8CY,iBAAA,oBAAA,CAAoB,aAAA,CAAA,EAAgB,aAAhB,CAAA,EAAkC,OAAlC,CAAkC,IAAlC,CAAA"}
@@ -1,15 +1,16 @@
1
- import "../code-generator-gPtrfZ6Q.js";
2
- import { t as Core } from "../core-ZuoVBkeg.js";
3
- import { t as buildConfig } from "../build-D8A5ByFk.js";
1
+ import { t as Core } from "../core-D5QHSKk6.js";
2
+ import { n as loaderPlugin } from "../loader-BuR4gkKg.js";
4
3
 
5
4
  //#region src/vite/index.ts
6
- async function content(config, pluginOptions = {}) {
7
- const core = createViteCore(applyDefaults(pluginOptions));
8
- await core.init({ config: buildConfig(config) });
5
+ async function content(config, pluginOpitons = {}) {
6
+ const { clean = true } = pluginOpitons;
7
+ const core = createViteCore(pluginOpitons);
8
+ await core.init({ config });
9
9
  const ctx = core.getPluginContext();
10
10
  return [...core.getPlugins(true).map((plugin) => plugin.vite?.createPlugin?.call(ctx)), {
11
11
  name: "fuma-content",
12
12
  async buildStart() {
13
+ if (clean) await core.clearOutputDirectory();
13
14
  await core.emit({ write: true });
14
15
  },
15
16
  async configureServer(server) {
@@ -17,29 +18,31 @@ async function content(config, pluginOptions = {}) {
17
18
  }
18
19
  }];
19
20
  }
20
- async function createStandaloneCore(pluginOptions = {}) {
21
- const { loadConfig } = await import("../load-from-file-BTNnBu6f.js");
22
- const core = createViteCore(applyDefaults(pluginOptions));
23
- await core.init({ config: loadConfig(core, true) });
24
- return core;
25
- }
26
- function createViteCore({ configPath, outDir }) {
21
+ function createViteCore({ configPath, outDir, cwd }) {
27
22
  return new Core({
23
+ cwd,
28
24
  configPath,
29
25
  outDir,
30
- emit: {
31
- target: "vite",
32
- jsExtension: false
33
- }
26
+ plugins: [vitePlugin(), loaderPlugin()]
34
27
  });
35
28
  }
36
- function applyDefaults(options) {
29
+ function vitePlugin() {
37
30
  return {
38
- updateViteConfig: options.updateViteConfig ?? true,
39
- configPath: options.configPath ?? Core.defaultOptions.configPath,
40
- outDir: options.outDir ?? Core.defaultOptions.outDir
31
+ name: "vite",
32
+ config(config) {
33
+ config.emit ??= {
34
+ target: "vite",
35
+ jsExtension: false
36
+ };
37
+ }
41
38
  };
42
39
  }
40
+ async function createStandaloneCore(pluginOptions = {}) {
41
+ const { loadConfig } = await import("../load-from-file-BZxc_BhC.js");
42
+ const core = createViteCore(pluginOptions);
43
+ await core.init({ config: loadConfig(core, true) });
44
+ return core;
45
+ }
43
46
 
44
47
  //#endregion
45
48
  export { createStandaloneCore, content as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/vite/index.ts"],"sourcesContent":["import type { PluginOption } from \"vite\";\nimport { buildConfig } from \"@/config/build\";\nimport type { FSWatcher } from \"chokidar\";\nimport { Core } from \"@/core\";\n\nexport interface PluginOptions {\n /**\n * @defaultValue content.config.ts\n */\n configPath?: string;\n\n /**\n * Update Vite config to fix module resolution of Fumadocs\n *\n * @defaultValue true\n */\n updateViteConfig?: boolean;\n\n /**\n * Output directory of generated files\n *\n * @defaultValue '.content'\n */\n outDir?: string;\n}\n\nexport default async function content(\n config: Record<string, unknown>,\n pluginOptions: PluginOptions = {},\n): Promise<PluginOption[]> {\n const options = applyDefaults(pluginOptions);\n const core = createViteCore(options);\n await core.init({\n config: buildConfig(config),\n });\n\n const ctx = core.getPluginContext();\n return [\n ...core\n .getPlugins(true)\n .map((plugin) => plugin.vite?.createPlugin?.call(ctx)),\n {\n name: \"fuma-content\",\n async buildStart() {\n await core.emit({ write: true });\n },\n async configureServer(server) {\n await core.initServer({\n watcher: server.watcher as unknown as FSWatcher,\n });\n },\n },\n ];\n}\n\nexport async function createStandaloneCore(pluginOptions: PluginOptions = {}) {\n const { loadConfig } = await import(\"@/config/load-from-file\");\n const core = createViteCore(applyDefaults(pluginOptions));\n await core.init({\n config: loadConfig(core, true),\n });\n return core;\n}\n\nfunction createViteCore({ configPath, outDir }: Required<PluginOptions>) {\n return new Core({\n configPath,\n outDir,\n emit: {\n target: \"vite\",\n jsExtension: false,\n },\n });\n}\n\nfunction applyDefaults(options: PluginOptions): Required<PluginOptions> {\n return {\n updateViteConfig: options.updateViteConfig ?? true,\n configPath: options.configPath ?? Core.defaultOptions.configPath,\n outDir: options.outDir ?? Core.defaultOptions.outDir,\n };\n}\n"],"mappings":";;;;;AA0BA,eAA8B,QAC5B,QACA,gBAA+B,EAAE,EACR;CAEzB,MAAM,OAAO,eADG,cAAc,cAAc,CACR;AACpC,OAAM,KAAK,KAAK,EACd,QAAQ,YAAY,OAAO,EAC5B,CAAC;CAEF,MAAM,MAAM,KAAK,kBAAkB;AACnC,QAAO,CACL,GAAG,KACA,WAAW,KAAK,CAChB,KAAK,WAAW,OAAO,MAAM,cAAc,KAAK,IAAI,CAAC,EACxD;EACE,MAAM;EACN,MAAM,aAAa;AACjB,SAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;;EAElC,MAAM,gBAAgB,QAAQ;AAC5B,SAAM,KAAK,WAAW,EACpB,SAAS,OAAO,SACjB,CAAC;;EAEL,CACF;;AAGH,eAAsB,qBAAqB,gBAA+B,EAAE,EAAE;CAC5E,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,OAAO,eAAe,cAAc,cAAc,CAAC;AACzD,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,QAAO;;AAGT,SAAS,eAAe,EAAE,YAAY,UAAmC;AACvE,QAAO,IAAI,KAAK;EACd;EACA;EACA,MAAM;GACJ,QAAQ;GACR,aAAa;GACd;EACF,CAAC;;AAGJ,SAAS,cAAc,SAAiD;AACtE,QAAO;EACL,kBAAkB,QAAQ,oBAAoB;EAC9C,YAAY,QAAQ,cAAc,KAAK,eAAe;EACtD,QAAQ,QAAQ,UAAU,KAAK,eAAe;EAC/C"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/vite/index.ts"],"sourcesContent":["import type { PluginOption } from \"vite\";\nimport type { FSWatcher } from \"chokidar\";\nimport { Core, CoreOptions, type Plugin } from \"@/core\";\nimport { loaderPlugin } from \"@/plugins/loader\";\n\nexport interface PluginOptions extends Pick<CoreOptions, \"configPath\" | \"cwd\" | \"outDir\"> {\n /**\n * clean output directory on start\n *\n * @defaultValue true\n */\n clean?: boolean;\n}\n\nexport default async function content(\n config: Record<string, unknown>,\n pluginOpitons: PluginOptions = {},\n): Promise<PluginOption[]> {\n const { clean = true } = pluginOpitons;\n const core = createViteCore(pluginOpitons);\n await core.init({\n config,\n });\n\n const ctx = core.getPluginContext();\n return [\n ...core.getPlugins(true).map((plugin) => plugin.vite?.createPlugin?.call(ctx)),\n {\n name: \"fuma-content\",\n async buildStart() {\n if (clean) await core.clearOutputDirectory();\n await core.emit({ write: true });\n },\n async configureServer(server) {\n await core.initServer({\n watcher: server.watcher as unknown as FSWatcher,\n });\n },\n },\n ];\n}\n\nfunction createViteCore({ configPath, outDir, cwd }: PluginOptions) {\n return new Core({\n cwd,\n configPath,\n outDir,\n plugins: [vitePlugin(), loaderPlugin()],\n });\n}\n\nfunction vitePlugin(): Plugin {\n return {\n name: \"vite\",\n config(config) {\n config.emit ??= {\n target: \"vite\",\n jsExtension: false,\n };\n },\n };\n}\n\nexport async function createStandaloneCore(pluginOptions: PluginOptions = {}) {\n const { loadConfig } = await import(\"@/config/load-from-file\");\n const core = createViteCore(pluginOptions);\n await core.init({\n config: loadConfig(core, true),\n });\n return core;\n}\n"],"mappings":";;;;AAcA,eAA8B,QAC5B,QACA,gBAA+B,EAAE,EACR;CACzB,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,OAAO,eAAe,cAAc;AAC1C,OAAM,KAAK,KAAK,EACd,QACD,CAAC;CAEF,MAAM,MAAM,KAAK,kBAAkB;AACnC,QAAO,CACL,GAAG,KAAK,WAAW,KAAK,CAAC,KAAK,WAAW,OAAO,MAAM,cAAc,KAAK,IAAI,CAAC,EAC9E;EACE,MAAM;EACN,MAAM,aAAa;AACjB,OAAI,MAAO,OAAM,KAAK,sBAAsB;AAC5C,SAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;;EAElC,MAAM,gBAAgB,QAAQ;AAC5B,SAAM,KAAK,WAAW,EACpB,SAAS,OAAO,SACjB,CAAC;;EAEL,CACF;;AAGH,SAAS,eAAe,EAAE,YAAY,QAAQ,OAAsB;AAClE,QAAO,IAAI,KAAK;EACd;EACA;EACA;EACA,SAAS,CAAC,YAAY,EAAE,cAAc,CAAC;EACxC,CAAC;;AAGJ,SAAS,aAAqB;AAC5B,QAAO;EACL,MAAM;EACN,OAAO,QAAQ;AACb,UAAO,SAAS;IACd,QAAQ;IACR,aAAa;IACd;;EAEJ;;AAGH,eAAsB,qBAAqB,gBAA+B,EAAE,EAAE;CAC5E,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,OAAO,eAAe,cAAc;AAC1C,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,QAAO"}