@primate/markdown 0.4.2 → 0.5.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/lib/private/Component.d.ts +12 -0
- package/lib/private/Component.js +2 -0
- package/lib/private/Default.d.ts +7 -0
- package/lib/private/Default.js +79 -0
- package/lib/private/Runtime.d.ts +41 -0
- package/lib/private/Runtime.js +41 -0
- package/lib/public/Component.d.ts +2 -0
- package/lib/public/Component.js +2 -0
- package/lib/public/default.d.ts +4 -0
- package/lib/public/default.js +3 -0
- package/lib/public/runtime.d.ts +4 -0
- package/lib/public/runtime.js +3 -0
- package/package.json +26 -21
- package/src/private/build/index.js +0 -18
- package/src/private/build/server.js +0 -10
- package/src/private/extension.js +0 -1
- package/src/private/name.js +0 -1
- package/src/private/pkgname.js +0 -1
- package/src/private/serve/index.js +0 -3
- package/src/public/default.js +0 -10
- package/src/public/runtime.js +0 -8
|
@@ -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
|
package/package.json
CHANGED
|
@@ -1,45 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@primate/markdown",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Primate Markdown frontend",
|
|
5
|
-
"homepage": "https://
|
|
6
|
-
"bugs": "https://github.com/
|
|
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
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"/lib/**/*.js",
|
|
10
|
+
"/lib/**/*.d.ts",
|
|
11
|
+
"!/**/*.spec.*"
|
|
11
12
|
],
|
|
12
13
|
"repository": {
|
|
13
14
|
"type": "git",
|
|
14
|
-
"url": "https://github.com/
|
|
15
|
+
"url": "https://github.com/primate-run/primate",
|
|
15
16
|
"directory": "packages/markdown"
|
|
16
17
|
},
|
|
17
18
|
"dependencies": {
|
|
18
|
-
"
|
|
19
|
-
"@
|
|
19
|
+
"@rcompat/assert": "^0.3.1",
|
|
20
|
+
"@rcompat/string": "^0.10.0",
|
|
21
|
+
"marked": "^16.2.1",
|
|
22
|
+
"@primate/core": "^0.2.0",
|
|
23
|
+
"pema": "^0.2.0"
|
|
20
24
|
},
|
|
21
25
|
"peerDependencies": {
|
|
22
|
-
"primate": "^0.
|
|
26
|
+
"primate": "^0.33.0"
|
|
23
27
|
},
|
|
24
28
|
"type": "module",
|
|
25
29
|
"imports": {
|
|
26
30
|
"#*": {
|
|
27
|
-
"
|
|
28
|
-
"default": "./
|
|
29
|
-
},
|
|
30
|
-
"#build": {
|
|
31
|
-
"@primate/lt": "./src/private/build/index.js",
|
|
32
|
-
"default": "./src/private/build/index.js"
|
|
33
|
-
},
|
|
34
|
-
"#serve": {
|
|
35
|
-
"@primate/lt": "./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": "./
|
|
42
|
-
"default": "./
|
|
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
|
-
};
|
package/src/private/extension.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default ".md";
|
package/src/private/name.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default "markdown";
|
package/src/private/pkgname.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default "@primate/markdown";
|
package/src/public/default.js
DELETED
|
@@ -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
|
-
});
|