@echozedlabs/core 0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Zimmerman (echozed)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @echozedlabs/core
2
+
3
+ Markdown parsing/serialization core for the [echozed markdown editor](https://github.com/echozulucode/markdown-editor): a byte-stable Markdown codec (parse → serialize is byte-identical), frontmatter split that preserves bytes verbatim, and the shared types used across the editor packages.
4
+
5
+ Most consumers don't use this directly — install [`@echozedlabs/react`](https://www.npmjs.com/package/@echozedlabs/react) for the full editor. Use `@echozedlabs/core` if you only need the headless codec.
6
+
7
+ ## License
8
+
9
+ [MIT](https://github.com/echozulucode/markdown-editor/blob/main/LICENSE) © Eric Zimmerman (echozed)
@@ -0,0 +1,7 @@
1
+ import type { FrontmatterSplit, ParsedMarkdown } from './types.js';
2
+ export declare function parseMarkdown(raw: string): ParsedMarkdown;
3
+ export declare function serializeMarkdown(parsed: ParsedMarkdown): string;
4
+ export declare function replaceBody(parsedOrRaw: ParsedMarkdown | string, newBody: string): string;
5
+ export declare function roundTripMarkdown(raw: string): string;
6
+ export declare function splitFrontmatter(raw: string): FrontmatterSplit;
7
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIhF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAgBzD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AA8BD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAyC9D"}
package/dist/codec.js ADDED
@@ -0,0 +1,110 @@
1
+ import matter from 'gray-matter';
2
+ import remarkGfm from 'remark-gfm';
3
+ import remarkParse from 'remark-parse';
4
+ import { unified } from 'unified';
5
+ const FRONTMATTER_FENCE = /^---\r?\n/;
6
+ export function parseMarkdown(raw) {
7
+ const { rawFrontmatter, body, hasFrontmatter, frontmatter, trailing } = splitFrontmatter(raw);
8
+ const processor = unified().use(remarkParse).use(remarkGfm);
9
+ const ast = processor.parse(body);
10
+ return {
11
+ raw,
12
+ frontmatter,
13
+ body,
14
+ ast,
15
+ hasFrontmatter,
16
+ rawFrontmatter,
17
+ trailing,
18
+ };
19
+ }
20
+ export function serializeMarkdown(parsed) {
21
+ return parsed.raw;
22
+ }
23
+ export function replaceBody(parsedOrRaw, newBody) {
24
+ const parsed = typeof parsedOrRaw === 'string' ? parseMarkdown(parsedOrRaw) : parsedOrRaw;
25
+ return `${parsed.rawFrontmatter}${newBody}${parsed.trailing}`;
26
+ }
27
+ export function roundTripMarkdown(raw) {
28
+ return serializeMarkdown(parseMarkdown(raw));
29
+ }
30
+ /** Keys that must never be copied off untrusted YAML onto a JS object. */
31
+ const FORBIDDEN_FRONTMATTER_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
32
+ /**
33
+ * Copy frontmatter onto a null-prototype object, dropping prototype-polluting
34
+ * keys (`__proto__`/`constructor`/`prototype`). gray-matter/js-yaml can surface
35
+ * these as own properties from a hostile document; stripping them here keeps
36
+ * every downstream consumer (which spreads/indexes frontmatter) safe.
37
+ */
38
+ function sanitizeFrontmatter(data) {
39
+ const clean = Object.create(null);
40
+ for (const [key, value] of Object.entries(data)) {
41
+ if (FORBIDDEN_FRONTMATTER_KEYS.has(key))
42
+ continue;
43
+ clean[key] = value;
44
+ }
45
+ return clean;
46
+ }
47
+ function noFrontmatter(raw) {
48
+ return {
49
+ rawFrontmatter: '',
50
+ body: raw,
51
+ hasFrontmatter: false,
52
+ frontmatter: sanitizeFrontmatter({}),
53
+ trailing: '',
54
+ };
55
+ }
56
+ export function splitFrontmatter(raw) {
57
+ // Tolerate a leading UTF-8 BOM: detect the fence after it, but keep the BOM
58
+ // byte attached to rawFrontmatter so the round-trip stays byte-stable.
59
+ // Without this, a BOM'd document parsed as having no frontmatter.
60
+ const bom = raw.charCodeAt(0) === 0xfeff ? '\uFEFF' : '';
61
+ const text = bom ? raw.slice(bom.length) : raw;
62
+ if (!FRONTMATTER_FENCE.test(text)) {
63
+ return noFrontmatter(raw);
64
+ }
65
+ const firstNewline = text.indexOf('\n');
66
+ if (firstNewline === -1) {
67
+ return noFrontmatter(raw);
68
+ }
69
+ const afterOpen = firstNewline + 1;
70
+ const closing = findClosingFence(text, afterOpen);
71
+ if (closing === -1) {
72
+ return noFrontmatter(raw);
73
+ }
74
+ const rawFrontmatterNoBom = text.slice(0, closing.endIdx);
75
+ const body = text.slice(closing.endIdx);
76
+ let frontmatter = sanitizeFrontmatter({});
77
+ try {
78
+ const parsed = matter(rawFrontmatterNoBom + body);
79
+ frontmatter = sanitizeFrontmatter((parsed.data ?? {}));
80
+ }
81
+ catch {
82
+ frontmatter = sanitizeFrontmatter({});
83
+ }
84
+ return {
85
+ // Re-attach the BOM so replaceBody (rawFrontmatter + body) round-trips.
86
+ rawFrontmatter: bom + rawFrontmatterNoBom,
87
+ body,
88
+ hasFrontmatter: true,
89
+ frontmatter,
90
+ trailing: '',
91
+ };
92
+ }
93
+ function findClosingFence(raw, fromIdx) {
94
+ let cursor = fromIdx;
95
+ while (cursor < raw.length) {
96
+ const lineEnd = raw.indexOf('\n', cursor);
97
+ const lineRawEnd = lineEnd === -1 ? raw.length : lineEnd;
98
+ const line = raw.slice(cursor, lineRawEnd).replace(/\r$/, '');
99
+ if (line === '---') {
100
+ const endIdx = lineEnd === -1 ? raw.length : lineEnd + 1;
101
+ return { startIdx: cursor, endIdx };
102
+ }
103
+ if (lineEnd === -1) {
104
+ break;
105
+ }
106
+ cursor = lineEnd + 1;
107
+ }
108
+ return -1;
109
+ }
110
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { parseMarkdown, replaceBody, roundTripMarkdown, serializeMarkdown, splitFrontmatter, } from './codec.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { parseMarkdown, replaceBody, roundTripMarkdown, serializeMarkdown, splitFrontmatter, } from './codec.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,194 @@
1
+ import type { Root } from 'mdast';
2
+ export type EditorMode = 'markdown' | 'hybrid' | 'preview' | 'wysiwyg';
3
+ export interface Frontmatter {
4
+ title?: string;
5
+ status?: 'draft' | 'published';
6
+ tags?: string[];
7
+ owner?: string;
8
+ created_at?: string;
9
+ updated_at?: string;
10
+ authors?: string[];
11
+ slug?: string;
12
+ [key: string]: unknown;
13
+ }
14
+ export interface ParsedMarkdown {
15
+ raw: string;
16
+ frontmatter: Frontmatter;
17
+ body: string;
18
+ ast: Root;
19
+ hasFrontmatter: boolean;
20
+ rawFrontmatter: string;
21
+ trailing: string;
22
+ }
23
+ export type MarkdownDocument = ParsedMarkdown;
24
+ export interface FrontmatterSplit {
25
+ rawFrontmatter: string;
26
+ body: string;
27
+ hasFrontmatter: boolean;
28
+ frontmatter: Frontmatter;
29
+ trailing: string;
30
+ }
31
+ export interface TextSelection {
32
+ from: number;
33
+ to: number;
34
+ }
35
+ export interface DocumentSnapshot {
36
+ markdown: string;
37
+ version: number;
38
+ mode?: EditorMode;
39
+ selection?: SelectionSnapshot;
40
+ }
41
+ export interface SelectionRangeSnapshot {
42
+ anchor: number;
43
+ head: number;
44
+ }
45
+ export interface SelectionSnapshot {
46
+ ranges: SelectionRangeSnapshot[];
47
+ mainIndex: number;
48
+ }
49
+ export interface ChangeMeta {
50
+ source: 'user' | 'programmatic' | 'host' | 'history' | 'api' | 'mode-switch';
51
+ timestamp: number;
52
+ mode?: EditorMode;
53
+ previousMarkdown?: string;
54
+ selection?: SelectionSnapshot;
55
+ }
56
+ export interface ModeChangeMeta {
57
+ previousMode: EditorMode;
58
+ nextMode: EditorMode;
59
+ timestamp: number;
60
+ source: 'user' | 'programmatic' | 'host';
61
+ }
62
+ export type DiagnosticSeverity = 'info' | 'warning' | 'error';
63
+ export interface MarkdownDiagnostic {
64
+ id?: string;
65
+ code: string;
66
+ message: string;
67
+ severity: DiagnosticSeverity;
68
+ range?: SelectionRangeSnapshot;
69
+ source?: 'markdown' | 'renderer' | 'mode' | 'host-service' | 'extension' | string;
70
+ details?: unknown;
71
+ }
72
+ export type EditorDiagnostic = MarkdownDiagnostic;
73
+ export interface RenderContext {
74
+ mode?: EditorMode;
75
+ signal?: AbortSignal;
76
+ services?: HostServices;
77
+ hostServices?: HostServices;
78
+ }
79
+ export interface RenderResult {
80
+ html: string;
81
+ diagnostics?: MarkdownDiagnostic[];
82
+ }
83
+ export interface BlockRenderer {
84
+ name: string;
85
+ canRender(info: RendererBlockInfo): boolean;
86
+ render(info: RendererBlockInfo, context: RenderContext): RenderResult | Promise<RenderResult>;
87
+ }
88
+ export interface RendererBlockInfo {
89
+ type: string;
90
+ source: string;
91
+ language?: string;
92
+ meta?: string;
93
+ }
94
+ export interface RendererRegistry {
95
+ register(renderer: BlockRenderer): void;
96
+ resolve(info: RendererBlockInfo): BlockRenderer | undefined;
97
+ }
98
+ export interface HostServices {
99
+ searchLinks?(query: string, signal?: AbortSignal): Promise<LinkSuggestion[]>;
100
+ resolveLink?(href: string, signal?: AbortSignal): Promise<{
101
+ exists: boolean;
102
+ title?: string;
103
+ }>;
104
+ navigateLink?(href: string): void;
105
+ resolveWikiLink?(target: string): string | Promise<string | undefined> | undefined;
106
+ renderPlantUml?(source: string, options?: Record<string, unknown> | AbortSignal): Promise<RenderResult>;
107
+ uploadAsset?(file: File, signal?: AbortSignal): Promise<{
108
+ url: string;
109
+ alt?: string;
110
+ }>;
111
+ reportDiagnostics?(diagnostics: EditorDiagnostic[]): void;
112
+ }
113
+ export interface LinkSuggestion {
114
+ id: string;
115
+ label: string;
116
+ insertText: string;
117
+ description?: string;
118
+ }
119
+ export type FrontmatterPropertyType = 'text' | 'date' | 'time' | 'datetime' | 'tags' | 'boolean' | 'link';
120
+ export interface FrontmatterPropertySchema {
121
+ key: string;
122
+ type: FrontmatterPropertyType;
123
+ label?: string;
124
+ icon?: string;
125
+ required?: boolean;
126
+ defaultValue?: string | boolean | string[];
127
+ allowedValues?: string[];
128
+ description?: string;
129
+ order?: number;
130
+ }
131
+ export interface EditorFeatureFlags {
132
+ toolbar: boolean;
133
+ modeSwitcher: boolean;
134
+ syntaxHighlighting: boolean;
135
+ diagrams: boolean;
136
+ mermaid: boolean;
137
+ plantUml: boolean;
138
+ tables: boolean;
139
+ images: boolean;
140
+ callouts: boolean;
141
+ wikiLinks: boolean;
142
+ slashMenu: boolean;
143
+ }
144
+ export interface EditorThemeTokens {
145
+ fontFamily: string;
146
+ monoFontFamily: string;
147
+ canvasColor: string;
148
+ surfaceColor: string;
149
+ textColor: string;
150
+ mutedTextColor: string;
151
+ borderColor: string;
152
+ accentColor: string;
153
+ }
154
+ export interface MarkdownEditorExtension {
155
+ name: string;
156
+ }
157
+ export interface MarkdownEditorHandle {
158
+ focus(): void;
159
+ getMarkdown(): string;
160
+ setMarkdown(markdown: string): void;
161
+ getMode(): EditorMode;
162
+ setMode(mode: EditorMode): void;
163
+ getSelection(): TextSelection | null;
164
+ setSelection(selection: TextSelection): void;
165
+ insertMarkdown(markdown: string): void;
166
+ clearHistory(): void;
167
+ getSnapshot(): DocumentSnapshot;
168
+ replaceMarkdown(markdown: string, meta?: ChangeMeta): void;
169
+ }
170
+ export interface MarkdownEditorProps {
171
+ value?: string;
172
+ defaultValue?: string;
173
+ mode?: EditorMode;
174
+ defaultMode?: EditorMode;
175
+ initialMode?: EditorMode;
176
+ modes?: EditorMode[];
177
+ readOnly?: boolean;
178
+ extensions?: MarkdownEditorExtension[];
179
+ rendererRegistry?: RendererRegistry;
180
+ renderers?: RendererRegistry;
181
+ hostServices?: HostServices;
182
+ propertySchema?: FrontmatterPropertySchema[];
183
+ frontmatterDisplay?: 'expanded' | 'collapsed' | 'hidden';
184
+ features?: Partial<EditorFeatureFlags>;
185
+ theme?: 'light' | 'dark' | 'system' | Partial<EditorThemeTokens>;
186
+ className?: string;
187
+ ariaLabel?: string;
188
+ onSaveShortcut?: () => void;
189
+ onCancelShortcut?: () => void;
190
+ onDiagnostics?: (diagnostics: EditorDiagnostic[]) => void;
191
+ onChange?: (markdown: string, meta: ChangeMeta) => void;
192
+ onModeChange?: (mode: EditorMode, meta: ModeChangeMeta) => void;
193
+ }
194
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@echozedlabs/core",
3
+ "version": "0.1.0",
4
+ "description": "Markdown parsing and serialization core (mdast + frontmatter) for the echozed markdown editor.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Eric Zimmerman (https://echozed.com)",
8
+ "homepage": "https://echozed.com",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/echozulucode/markdown-editor.git",
12
+ "directory": "packages/core"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/echozulucode/markdown-editor/issues"
16
+ },
17
+ "keywords": [
18
+ "markdown",
19
+ "mdast",
20
+ "remark",
21
+ "frontmatter",
22
+ "editor"
23
+ ],
24
+ "sideEffects": false,
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@types/mdast": "^4.0.4",
41
+ "gray-matter": "^4.0.3",
42
+ "remark-gfm": "^4.0.0",
43
+ "remark-parse": "^11.0.0",
44
+ "unified": "^11.0.5"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc -p tsconfig.json",
48
+ "test": "vitest run",
49
+ "typecheck": "tsc -p tsconfig.json --noEmit"
50
+ }
51
+ }