@temelj/mdx 0.3.0 → 0.4.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.
package/README.md CHANGED
@@ -88,22 +88,26 @@ whoamai
88
88
  @temelj/mdx
89
89
  \`\`\`
90
90
  `.trim();
91
- const artifact = await compiler.compile(source, {
92
- frontmatterOnly: false,
93
- frontmatterSchema: z.object({
94
- title: z.string(),
95
- }),
96
- mdxOptions: {
97
- rehypePlugins: [
98
- [
99
- treeProcessorPlugin,
100
- {
101
- process: (node: HastElement) => assert(typeof node.type === "string"),
102
- },
91
+ const artifact = await compiler.compile(
92
+ source,
93
+ {
94
+ frontmatterOnly: false,
95
+ mdxOptions: {
96
+ rehypePlugins: [
97
+ [
98
+ treeProcessorPlugin,
99
+ {
100
+ process: (node: HastElement) =>
101
+ assert(typeof node.type === "string"),
102
+ },
103
+ ],
103
104
  ],
104
- ],
105
+ },
105
106
  },
106
- });
107
+ z.object({
108
+ title: z.string(),
109
+ }),
110
+ );
107
111
  assert(artifact.compiled !== undefined);
108
112
  assertEquals(artifact.frontmatter, {
109
113
  title: "Demo",
package/esm/compiler.js CHANGED
@@ -49,7 +49,7 @@ export class MdxCompiler {
49
49
  }
50
50
  return this;
51
51
  }
52
- async compile(source, { frontmatterOnly = false, frontmatterSchema, mdxOptions, } = {}) {
52
+ async compile(source, { frontmatterOnly = false, mdxOptions, } = {}, frontmatterSchema) {
53
53
  const vfile = new VFile({
54
54
  value: source,
55
55
  // Needed so vfile doesn't need to access fs.
@@ -80,12 +80,19 @@ export class MdxCompiler {
80
80
  });
81
81
  compiled = compiledFile.value.toString();
82
82
  }
83
- const frontmatter = frontmatterSchema === undefined
84
- ? (vfile.data.matter ?? {})
85
- : frontmatterSchema.parse(vfile.data.matter ?? {});
83
+ let frontmatter = {};
84
+ if (frontmatterSchema && vfile.data.matter) {
85
+ if ("parse" in frontmatterSchema) {
86
+ frontmatter = frontmatterSchema.parse(vfile.data.matter);
87
+ }
88
+ else if ("kind" in frontmatterSchema && frontmatterSchema.kind === "schema") {
89
+ const valibot = await import("valibot");
90
+ frontmatter = valibot.parse(frontmatterSchema, vfile.data.matter);
91
+ }
92
+ }
86
93
  return {
87
94
  compiled,
88
- frontmatter,
95
+ frontmatter: frontmatter,
89
96
  };
90
97
  }
91
98
  }
@@ -1,14 +1,14 @@
1
- import { z } from "zod";
2
1
  import { parseNumericRange } from "@temelj/iterator";
2
+ import * as v from "valibot";
3
3
  export function extractCodeMeta(node) {
4
4
  const meta = node?.data?.meta ?? node?.properties?.metastring ?? "";
5
5
  return parseMetaString(meta);
6
6
  }
7
- const metaSchema = z.object({
8
- highlight: z.string().optional(),
9
- showLineNumbers: z.boolean().or(z.string()).optional(),
10
- commandLine: z.boolean().or(z.string()).optional(),
11
- fileName: z.string().optional(),
7
+ const metaSchema = v.object({
8
+ highlight: v.optional(v.string()),
9
+ showLineNumbers: v.optional(v.union([v.boolean(), v.string()])),
10
+ commandLine: v.optional(v.union([v.boolean(), v.string()])),
11
+ fileName: v.optional(v.string()),
12
12
  });
13
13
  function parseMetaString(meta) {
14
14
  let raw;
@@ -18,7 +18,7 @@ function parseMetaString(meta) {
18
18
  catch {
19
19
  return {};
20
20
  }
21
- const parsed = metaSchema.parse(raw);
21
+ const parsed = v.parse(metaSchema, raw);
22
22
  const options = {};
23
23
  if (parsed.highlight !== undefined) {
24
24
  options.highlight = { lineRange: parseNumericRange(parsed.highlight) };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@temelj/mdx",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Utilities for working with MDX.",
5
5
  "keywords": [
6
6
  "mdx"
@@ -26,20 +26,21 @@
26
26
  "dependencies": {
27
27
  "@temelj/iterator": "^0.2.1",
28
28
  "@mdx-js/mdx": "^3.1.0",
29
- "@shikijs/transformers": "^2.3.0",
29
+ "@shikijs/transformers": "^2.3.2",
30
30
  "@types/hast": "^3.0.4",
31
31
  "github-slugger": "^2.0.0",
32
32
  "hast": "^1.0.0",
33
33
  "hast-util-to-string": "^3.0.1",
34
34
  "remark-frontmatter": "^5.0.0",
35
- "remark-gfm": "^4.0.0",
36
- "shiki": "^2.3.0",
35
+ "remark-gfm": "^4.0.1",
36
+ "shiki": "^2.3.2",
37
37
  "unified": "^11.0.5",
38
38
  "unist-util-remove": "^4.0.0",
39
39
  "unist-util-visit": "^5.0.0",
40
40
  "vfile": "^6.0.3",
41
41
  "vfile-matter": "^5.0.0",
42
- "zod": "^3.24.1"
42
+ "zod": "^3.24.1",
43
+ "valibot": "^1.0.0-rc.0"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@types/node": "^20.9.0"
@@ -1,6 +1,7 @@
1
1
  import { type CompileOptions as MdxJsCompileOptions } from "@mdx-js/mdx";
2
2
  import remarkFrontmatterPlugin from "remark-frontmatter";
3
3
  import remarkGfmPlugin from "remark-gfm";
4
+ import type * as v from "valibot";
4
5
  import type { z } from "zod";
5
6
  import type { PluginFactory } from "./types.js";
6
7
  export { remarkFrontmatterPlugin, remarkGfmPlugin };
@@ -11,11 +12,18 @@ export type MdxSource = string | Uint8Array;
11
12
  /**
12
13
  * Options for compiling an MDX document.
13
14
  */
14
- export interface MdxCompileOptions<TFrontmatter extends z.ZodSchema> {
15
+ export interface MdxCompileOptions {
15
16
  frontmatterOnly?: boolean | undefined;
16
- frontmatterSchema?: TFrontmatter;
17
17
  mdxOptions?: MdxJsCompileOptions;
18
18
  }
19
+ /**
20
+ * The input frontmatter schema.
21
+ */
22
+ export type FrontmatterInput = z.AnyZodObject | v.ObjectSchema<v.ObjectEntries, undefined>;
23
+ /**
24
+ * The output frontmatter type for a schema.
25
+ */
26
+ export type FrontmatterOutput<T extends z.AnyZodObject | v.ObjectSchema<v.ObjectEntries, undefined>> = T extends z.ZodSchema ? z.infer<T> : T extends v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>> ? v.InferOutput<T> : never;
19
27
  /**
20
28
  * The result of compiling an MDX document.
21
29
  * Compiled content is optional, because sometimes we only need the frontmatter.
@@ -34,6 +42,6 @@ export declare class MdxCompiler {
34
42
  constructor(mdxOptions?: MdxJsCompileOptions);
35
43
  withRemarkPlugin<TOptions>(plugin: (options?: TOptions) => PluginFactory, options?: TOptions): MdxCompiler;
36
44
  withRehypePlugin<TOptions>(plugin: (options?: TOptions) => PluginFactory, options?: TOptions): MdxCompiler;
37
- compile<TFrontmatterSchema extends z.ZodSchema>(source: MdxSource, { frontmatterOnly, frontmatterSchema, mdxOptions, }?: MdxCompileOptions<TFrontmatterSchema>): Promise<MdxArtifact<z.output<TFrontmatterSchema>>>;
45
+ compile<TFrontmatterSchema extends FrontmatterInput>(source: MdxSource, { frontmatterOnly, mdxOptions, }?: MdxCompileOptions, frontmatterSchema?: TFrontmatterSchema): Promise<MdxArtifact<FrontmatterOutput<TFrontmatterSchema>>>;
38
46
  }
39
47
  //# sourceMappingURL=compiler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,IAAI,mBAAmB,EAC3C,MAAM,aAAa,CAAC;AACrB,OAAO,uBAAuB,MAAM,oBAAoB,CAAC;AACzD,OAAO,eAAe,MAAM,YAAY,CAAC;AAIzC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,YAAY,SAAS,CAAC,CAAC,SAAS;IACjE,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,iBAAiB,CAAC,EAAE,YAAY,CAAC;IACjC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,YAAY,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAE3B,UAAU,GAAE,mBAAwB;IAMhD,gBAAgB,CAAC,QAAQ,EAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,aAAa,EAC7C,OAAO,CAAC,EAAE,QAAQ,GACjB,WAAW;IASP,gBAAgB,CAAC,QAAQ,EAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,aAAa,EAC7C,OAAO,CAAC,EAAE,QAAQ,GACjB,WAAW;IASD,OAAO,CAAC,kBAAkB,SAAS,CAAC,CAAC,SAAS,EACzD,MAAM,EAAE,SAAS,EACjB,EACE,eAAuB,EACvB,iBAAiB,EACjB,UAAU,GACX,GAAE,iBAAiB,CAAC,kBAAkB,CAAM,GAC5C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;CA2CtD"}
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,IAAI,mBAAmB,EAC3C,MAAM,aAAa,CAAC;AACrB,OAAO,uBAAuB,MAAM,oBAAoB,CAAC;AACzD,OAAO,eAAe,MAAM,YAAY,CAAC;AAIzC,OAAO,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,CAAC,CAAC,YAAY,GACd,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SACG,CAAC,CAAC,YAAY,GACd,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,IAC5C,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAClC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAC5D,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAClB,KAAK,CAAC;AAEV;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,YAAY,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAE3B,UAAU,GAAE,mBAAwB;IAMhD,gBAAgB,CAAC,QAAQ,EAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,aAAa,EAC7C,OAAO,CAAC,EAAE,QAAQ,GACjB,WAAW;IASP,gBAAgB,CAAC,QAAQ,EAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,aAAa,EAC7C,OAAO,CAAC,EAAE,QAAQ,GACjB,WAAW;IASD,OAAO,CAAC,kBAAkB,SAAS,gBAAgB,EAC9D,MAAM,EAAE,SAAS,EACjB,EACE,eAAuB,EACvB,UAAU,GACX,GAAE,iBAAsB,EACzB,iBAAiB,CAAC,EAAE,kBAAkB,GACrC,OAAO,CACR,WAAW,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CACnD;CAmDF"}
@@ -1 +1 @@
1
- {"version":3,"file":"code-meta.d.ts","sourceRoot":"","sources":["../../../src/plugins/syntax-highlight/code-meta.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,kBAAkB,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAG9D"}
1
+ {"version":3,"file":"code-meta.d.ts","sourceRoot":"","sources":["../../../src/plugins/syntax-highlight/code-meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,kBAAkB,CAAC;AAGxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAG9D"}