@primate/markdown 0.4.3 → 0.6.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.
@@ -0,0 +1,12 @@
1
+ import type Dict from "@rcompat/type/Dict";
2
+ type Component = {
3
+ html: string;
4
+ meta: Dict | null;
5
+ toc: {
6
+ depth: number;
7
+ slug: string;
8
+ text: string;
9
+ }[];
10
+ };
11
+ export type { Component as default };
12
+ //# sourceMappingURL=Component.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1,7 @@
1
+ import Runtime from "#Runtime";
2
+ export default class Default extends Runtime {
3
+ compile: {
4
+ server: (text: string) => Promise<string>;
5
+ };
6
+ }
7
+ //# sourceMappingURL=Default.d.ts.map
@@ -0,0 +1,79 @@
1
+ import Runtime from "#Runtime";
2
+ import dedent from "@rcompat/string/dedent";
3
+ import { marked } from "marked";
4
+ function slugify(text) {
5
+ return text
6
+ .toLowerCase()
7
+ .replace(/[^\w]+/g, "-")
8
+ .replace(/^-+|-+$/g, "");
9
+ }
10
+ function frontmatter(src) {
11
+ const input = src.replace(/^\uFEFF/, "");
12
+ const match = input.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);
13
+ if (!match)
14
+ return {
15
+ body: input,
16
+ meta: null,
17
+ };
18
+ const raw = match[1].trim();
19
+ const body = input.slice(match[0].length);
20
+ // Try JSON first
21
+ try {
22
+ return { body, meta: JSON.parse(raw) };
23
+ }
24
+ catch { /* fall through */ }
25
+ // Minimal key: value parser (not YAML; single-line only)
26
+ const meta = {};
27
+ for (const line of raw.split(/\r?\n/)) {
28
+ const s = line.trim();
29
+ if (!s || s.startsWith("#"))
30
+ continue;
31
+ const i = s.indexOf(":");
32
+ if (i < 0)
33
+ continue;
34
+ const key = s.slice(0, i).trim();
35
+ const val = s.slice(i + 1).trim();
36
+ // quoted strings
37
+ if ((val.startsWith("\"") && val.endsWith("\""))
38
+ || (val.startsWith("'") && val.endsWith("'"))) {
39
+ meta[key] = val.slice(1, -1);
40
+ continue;
41
+ }
42
+ // booleans / numbers
43
+ if (/^(true|false)$/i.test(val)) {
44
+ meta[key] = /^true$/i.test(val);
45
+ continue;
46
+ }
47
+ if (/^-?\d+(\.\d+)?$/.test(val)) {
48
+ meta[key] = Number(val);
49
+ continue;
50
+ }
51
+ meta[key] = val; // fallback string
52
+ }
53
+ return { body, meta };
54
+ }
55
+ ;
56
+ export default class Default extends Runtime {
57
+ compile = {
58
+ server: async (text) => {
59
+ const pretransformed = await this.pretransform(text);
60
+ const { body, meta } = frontmatter(pretransformed);
61
+ const tokens = marked.lexer(body);
62
+ const toc = tokens
63
+ .filter(token => token.type === "heading")
64
+ .map(token => ({
65
+ depth: token.depth,
66
+ slug: slugify(token.text),
67
+ text: token.text,
68
+ }));
69
+ return dedent `
70
+ export default {
71
+ html: ${JSON.stringify(await marked.parse(body))},
72
+ toc: JSON.parse(${JSON.stringify(JSON.stringify(toc))}),
73
+ meta: ${meta ? JSON.stringify(meta) : "null"},
74
+ };
75
+ `;
76
+ },
77
+ };
78
+ }
79
+ //# sourceMappingURL=Default.js.map
@@ -0,0 +1,41 @@
1
+ import type Component from "#Component";
2
+ import FrontendModule from "@primate/core/frontend/Module";
3
+ import type MaybePromise from "@rcompat/type/MaybePromise";
4
+ import type { MarkedExtension } from "marked";
5
+ declare function render(component: Component): {
6
+ body: string;
7
+ };
8
+ type Pretransform = (text: string) => MaybePromise<string>;
9
+ export default class Runtime extends FrontendModule<Component> {
10
+ #private;
11
+ name: string;
12
+ defaultExtensions: string[];
13
+ layouts: boolean;
14
+ client: boolean;
15
+ render: typeof render;
16
+ static schema: import("pema").ObjectType<{
17
+ fileExtensions: import("pema").OptionalType<import("pema/array").ArrayType<import("pema/string").StringType>>;
18
+ marked: import("pema").OptionalType<import("pema").PureType<MarkedExtension<string, string>, "PureType">>;
19
+ pretransform: import("pema").OptionalType<import("pema").PureType<Pretransform, "PureType">>;
20
+ spa: import("pema").DefaultType<import("pema/boolean").BooleanType, true>;
21
+ ssr: import("pema").DefaultType<import("pema/boolean").BooleanType, true>;
22
+ }>;
23
+ static options: {
24
+ fileExtensions: string[] | undefined;
25
+ marked: MarkedExtension<string, string> | undefined;
26
+ pretransform: Pretransform | undefined;
27
+ spa: boolean;
28
+ ssr: boolean;
29
+ };
30
+ static input: {
31
+ fileExtensions?: string[] | undefined;
32
+ marked?: MarkedExtension<string, string> | undefined;
33
+ pretransform?: Pretransform | undefined;
34
+ spa?: boolean | undefined;
35
+ ssr?: boolean | undefined;
36
+ } | undefined;
37
+ constructor(config?: typeof Runtime.input);
38
+ get pretransform(): Pretransform;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=Runtime.d.ts.map
@@ -0,0 +1,41 @@
1
+ import FrontendModule from "@primate/core/frontend/Module";
2
+ import maybe from "@rcompat/assert/maybe";
3
+ import { marked } from "marked";
4
+ import pema from "pema";
5
+ import array from "pema/array";
6
+ import boolean from "pema/boolean";
7
+ import pure from "pema/pure";
8
+ import string from "pema/string";
9
+ function render(component) {
10
+ return { body: component.html };
11
+ }
12
+ export default class Runtime extends FrontendModule {
13
+ name = "markdown";
14
+ defaultExtensions = [".md"];
15
+ layouts = false;
16
+ client = false;
17
+ render = render;
18
+ #pretransform;
19
+ static schema = pema({
20
+ fileExtensions: array(string).optional(),
21
+ marked: pure().optional(),
22
+ pretransform: pure().optional(),
23
+ spa: boolean.default(true),
24
+ ssr: boolean.default(true),
25
+ });
26
+ static options = Runtime.schema.infer;
27
+ static input = Runtime.schema.input;
28
+ constructor(config = {}) {
29
+ const { marked: markedOptions, pretransform, ...superConfig } = config;
30
+ super(superConfig);
31
+ maybe(markedOptions).object();
32
+ maybe(pretransform).function();
33
+ this.#pretransform = (pretransform ?? ((m) => m));
34
+ const renderer = { ...markedOptions?.renderer ?? {} };
35
+ marked.use({ ...markedOptions, renderer });
36
+ }
37
+ get pretransform() {
38
+ return this.#pretransform;
39
+ }
40
+ }
41
+ //# sourceMappingURL=Runtime.js.map
@@ -0,0 +1,2 @@
1
+ export { default } from "#Component";
2
+ //# sourceMappingURL=Component.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Component.js.map
@@ -0,0 +1,4 @@
1
+ import Default from "#Default";
2
+ declare const _default: (config: typeof Default.input) => Default;
3
+ export default _default;
4
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1,3 @@
1
+ import Default from "#Default";
2
+ export default (config) => new Default(config);
3
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1,4 @@
1
+ import Runtime from "#Runtime";
2
+ declare const _default: (config: typeof Runtime.input) => Runtime;
3
+ export default _default;
4
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1,3 @@
1
+ import Runtime from "#Runtime";
2
+ export default (config) => new Runtime(config);
3
+ //# sourceMappingURL=runtime.js.map
package/package.json CHANGED
@@ -1,45 +1,50 @@
1
1
  {
2
2
  "name": "@primate/markdown",
3
- "version": "0.4.3",
3
+ "version": "0.6.0",
4
4
  "description": "Primate Markdown frontend",
5
- "homepage": "https://primatejs.com/modules/markdown",
6
- "bugs": "https://github.com/primatejs/primate/issues",
5
+ "homepage": "https://primate.run/docs/frontend/markdown",
6
+ "bugs": "https://github.com/primate-run/primate/issues",
7
7
  "license": "MIT",
8
8
  "files": [
9
- "src/**/*.js",
10
- "!src/**/*.spec.js"
9
+ "/lib/**/*.js",
10
+ "/lib/**/*.d.ts",
11
+ "!/**/*.spec.*"
11
12
  ],
12
13
  "repository": {
13
14
  "type": "git",
14
- "url": "https://github.com/primatejs/primate",
15
+ "url": "https://github.com/primate-run/primate",
15
16
  "directory": "packages/markdown"
16
17
  },
17
18
  "dependencies": {
18
- "marked": "^13.0.3",
19
- "@primate/frontend": "^0.16.3"
19
+ "@rcompat/assert": "^0.3.1",
20
+ "@rcompat/string": "^0.10.0",
21
+ "marked": "^16.2.1",
22
+ "@primate/core": "^0.3.0",
23
+ "pema": "^0.3.0"
20
24
  },
21
25
  "peerDependencies": {
22
- "primate": "^0.32.5"
26
+ "primate": "^0.34.0"
23
27
  },
24
28
  "type": "module",
25
29
  "imports": {
26
30
  "#*": {
27
- "livetypes": "./src/private/*.js",
28
- "default": "./src/private/*.js"
29
- },
30
- "#build": {
31
- "livetypes": "./src/private/build/index.js",
32
- "default": "./src/private/build/index.js"
33
- },
34
- "#serve": {
35
- "livetypes": "./src/private/serve/index.js",
36
- "default": "./src/private/serve/index.js"
31
+ "apekit": "./src/private/*.ts",
32
+ "default": "./lib/private/*.js"
37
33
  }
38
34
  },
39
35
  "exports": {
40
36
  ".": {
41
- "runtime": "./src/public/runtime.js",
42
- "default": "./src/public/default.js"
37
+ "runtime": "./lib/public/runtime.js",
38
+ "default": "./lib/public/default.js"
39
+ },
40
+ "./*": {
41
+ "apekit": "./src/public/*.ts",
42
+ "default": "./lib/public/*.js"
43
43
  }
44
+ },
45
+ "scripts": {
46
+ "build": "npm run clean && tsc",
47
+ "clean": "rm -rf ./lib",
48
+ "lint": "eslint ."
44
49
  }
45
50
  }
@@ -1,18 +0,0 @@
1
- import name from "#name";
2
- import compile from "@primate/frontend/core/compile";
3
- import server from "./server.js";
4
-
5
- export default (extension, options) => async (app, next) => {
6
- app.register(extension, {
7
- ...await compile({
8
- app,
9
- extension,
10
- name,
11
- compile: { server: server(options) },
12
- }),
13
- // no support for hydration
14
- client: _ => _,
15
- });
16
-
17
- return next(app);
18
- };
@@ -1,10 +0,0 @@
1
- import { marked } from "marked";
2
-
3
- const compile = text => `export default () => ${JSON.stringify(text)};`;
4
-
5
- export default options => async (text) => {
6
- const renderer = { ...options?.renderer ?? {} };
7
- marked.use({ ...options, renderer });
8
-
9
- return compile(await marked.parse(text));
10
- };
@@ -1 +0,0 @@
1
- export default ".md";
@@ -1 +0,0 @@
1
- export default "markdown";
@@ -1 +0,0 @@
1
- export default "@primate/markdown";
@@ -1,3 +0,0 @@
1
- import serve from "@primate/frontend/core/serve";
2
-
3
- export default serve();
@@ -1,10 +0,0 @@
1
- import build from "#build";
2
- import default_extension from "#extension";
3
- import pkgname from "#pkgname";
4
- import serve from "#serve";
5
-
6
- export default ({ extension = default_extension } = {}) => ({
7
- name: pkgname,
8
- build: build(extension),
9
- serve: serve(extension),
10
- });
@@ -1,8 +0,0 @@
1
- import default_extension from "#extension";
2
- import pkgname from "#pkgname";
3
- import serve from "#serve";
4
-
5
- export default ({ extension = default_extension } = {}) => ({
6
- name: pkgname,
7
- serve: serve(extension),
8
- });