markstream-svelte 0.0.1-beta.3 → 0.0.1-beta.4

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.
@@ -250,7 +250,8 @@
250
250
  lastRenderedCode = normalized
251
251
  svgCache[theme] = safeSvg
252
252
  }
253
- rendered?.bindFunctions?.(document.createElement('div'))
253
+ if (typeof rendered !== 'string')
254
+ rendered?.bindFunctions?.(document.createElement('div'))
254
255
  }
255
256
  catch (error) {
256
257
  if (token === renderToken) {
@@ -582,4 +583,4 @@
582
583
  </div>
583
584
  {/if}
584
585
  </div>
585
- {/if}
586
+ {/if}
@@ -4,9 +4,72 @@ import type { CodeBlockMonacoOptions, CodeBlockMonacoTheme } from '../../types/m
4
4
  import { getHtmlTagFromContent, hasCompleteHtmlTagContent, normalizeCustomHtmlTags, normalizeCustomHtmlTagName as normalizeTagName, stripCustomHtmlWrapper } from 'stream-markdown-parser';
5
5
  export { getHtmlTagFromContent, hasCompleteHtmlTagContent, normalizeCustomHtmlTags, normalizeTagName, stripCustomHtmlWrapper, };
6
6
  export type SvelteRenderableNode = (ParsedNode | BaseNode) & Record<string, unknown>;
7
+ export interface CodeBlockPreviewPayload {
8
+ node: SvelteRenderableNode;
9
+ artifactType: 'text/html' | 'image/svg+xml';
10
+ artifactTitle: string;
11
+ id: string;
12
+ }
13
+ export type NodeRendererCodeBlockProps = Partial<{
14
+ stream: boolean;
15
+ darkTheme: CodeBlockMonacoTheme;
16
+ lightTheme: CodeBlockMonacoTheme;
17
+ themes: CodeBlockMonacoTheme[];
18
+ monacoOptions: CodeBlockMonacoOptions;
19
+ minWidth: string | number;
20
+ maxWidth: string | number;
21
+ isShowPreview: boolean;
22
+ enableFontSizeControl: boolean;
23
+ showHeader: boolean;
24
+ showCopyButton: boolean;
25
+ showExpandButton: boolean;
26
+ showPreviewButton: boolean;
27
+ showCollapseButton: boolean;
28
+ showFontSizeButtons: boolean;
29
+ htmlPreviewAllowScripts: boolean;
30
+ htmlPreviewSandbox: string;
31
+ }> & Record<string, unknown>;
32
+ export type NodeRendererMermaidProps = Partial<{
33
+ maxHeight: string | null;
34
+ estimatedPreviewHeightPx: number;
35
+ workerTimeoutMs: number;
36
+ parseTimeoutMs: number;
37
+ renderTimeoutMs: number;
38
+ fullRenderTimeoutMs: number;
39
+ renderDebounceMs: number;
40
+ showHeader: boolean;
41
+ showModeToggle: boolean;
42
+ showCopyButton: boolean;
43
+ showExportButton: boolean;
44
+ showFullscreenButton: boolean;
45
+ showCollapseButton: boolean;
46
+ showZoomControls: boolean;
47
+ isStrict: boolean;
48
+ }> & Record<string, unknown>;
49
+ export type NodeRendererD2Props = Partial<{
50
+ maxHeight: string | null;
51
+ themeId: number | null;
52
+ darkThemeId: number | null;
53
+ showHeader: boolean;
54
+ showModeToggle: boolean;
55
+ showCopyButton: boolean;
56
+ showExportButton: boolean;
57
+ showCollapseButton: boolean;
58
+ }> & Record<string, unknown>;
59
+ export type NodeRendererInfographicProps = Partial<{
60
+ maxHeight: string | null;
61
+ estimatedPreviewHeightPx: number;
62
+ showHeader: boolean;
63
+ showModeToggle: boolean;
64
+ showCopyButton: boolean;
65
+ showCollapseButton: boolean;
66
+ showExportButton: boolean;
67
+ showFullscreenButton: boolean;
68
+ showZoomControls: boolean;
69
+ }> & Record<string, unknown>;
7
70
  export interface NodeRendererEvents {
8
71
  onCopy?: (code: string) => void;
9
- onHandleArtifactClick?: (payload: any) => void;
72
+ onHandleArtifactClick?: (payload: CodeBlockPreviewPayload) => void;
10
73
  }
11
74
  export interface NodeRendererProps {
12
75
  content?: string;
@@ -25,10 +88,10 @@ export interface NodeRendererProps {
25
88
  renderCodeBlocksAsPre?: boolean;
26
89
  codeBlockMinWidth?: string | number;
27
90
  codeBlockMaxWidth?: string | number;
28
- codeBlockProps?: Record<string, any>;
29
- mermaidProps?: Record<string, any>;
30
- d2Props?: Record<string, any>;
31
- infographicProps?: Record<string, any>;
91
+ codeBlockProps?: NodeRendererCodeBlockProps;
92
+ mermaidProps?: NodeRendererMermaidProps;
93
+ d2Props?: NodeRendererD2Props;
94
+ infographicProps?: NodeRendererInfographicProps;
32
95
  customComponents?: CustomComponentMap;
33
96
  showTooltips?: boolean;
34
97
  themes?: CodeBlockMonacoTheme[];
@@ -63,10 +126,10 @@ export interface SvelteRenderContext {
63
126
  customHtmlTags?: readonly string[];
64
127
  parseOptions?: ParseOptions;
65
128
  customMarkdownIt?: (md: MarkdownIt) => MarkdownIt;
66
- codeBlockProps?: Record<string, any>;
67
- mermaidProps?: Record<string, any>;
68
- d2Props?: Record<string, any>;
69
- infographicProps?: Record<string, any>;
129
+ codeBlockProps?: NodeRendererCodeBlockProps;
130
+ mermaidProps?: NodeRendererMermaidProps;
131
+ d2Props?: NodeRendererD2Props;
132
+ infographicProps?: NodeRendererInfographicProps;
70
133
  customComponents?: CustomComponentMap;
71
134
  codeBlockThemes?: {
72
135
  themes?: CodeBlockMonacoTheme[];
@@ -4,5 +4,7 @@ export declare function resolveNodeOutletCodeMode(node: SvelteRenderableNode, co
4
4
  export declare function resolveHtmlTag(node: SvelteRenderableNode): string;
5
5
  export declare function coerceCustomHtmlNode(node: SvelteRenderableNode): SvelteRenderableNode;
6
6
  export declare function coerceBuiltinHtmlNode(node: SvelteRenderableNode, resolvedType: string): SvelteRenderableNode;
7
- export declare function resolveNodeOutletCustomInputs(node: SvelteRenderableNode, context?: SvelteRenderContext): Record<string, any>;
7
+ export declare function resolveNodeOutletCustomInputs(node: SvelteRenderableNode, context?: SvelteRenderContext): {
8
+ [x: string]: any;
9
+ };
8
10
  export declare function resolveNodeOutletCustomComponent(node: SvelteRenderableNode, context?: SvelteRenderContext, customComponents?: Record<string, any> | null): any;
@@ -1,5 +1,5 @@
1
1
  import type { Component } from 'svelte';
2
- export type MarkstreamSvelteComponent = Component<Record<string, any>>;
2
+ export type MarkstreamSvelteComponent = Component<never>;
3
3
  export type CustomComponentMap = Record<string, MarkstreamSvelteComponent>;
4
4
  export declare function subscribeCustomComponents(listener: () => void): () => void;
5
5
  export declare function getCustomComponentsRevision(): number;
@@ -1,15 +1,17 @@
1
+ import type { NodeRendererCodeBlockProps, NodeRendererD2Props, NodeRendererInfographicProps, NodeRendererMermaidProps } from './components/shared/node-helpers';
2
+ import type { CodeBlockMonacoOptions } from './types/monaco';
1
3
  export interface EnhanceRenderedHtmlOptions {
2
4
  final?: boolean;
3
5
  isDark?: boolean;
4
6
  renderCodeBlocksAsPre?: boolean;
5
- monacoOptions?: Record<string, any>;
7
+ monacoOptions?: CodeBlockMonacoOptions;
6
8
  d2ThemeId?: number | null;
7
9
  d2DarkThemeId?: number | null;
8
10
  showTooltips?: boolean;
9
- codeBlockProps?: Record<string, any>;
10
- mermaidProps?: Record<string, any>;
11
- d2Props?: Record<string, any>;
12
- infographicProps?: Record<string, any>;
11
+ codeBlockProps?: NodeRendererCodeBlockProps;
12
+ mermaidProps?: NodeRendererMermaidProps;
13
+ d2Props?: NodeRendererD2Props;
14
+ infographicProps?: NodeRendererInfographicProps;
13
15
  onCopy?: (code: string) => void;
14
16
  isCancelled?: () => boolean;
15
17
  }
@@ -270,7 +270,8 @@ async function renderMermaid(root, cleanupFns, options, isActive) {
270
270
  shell.body.innerHTML = safeSvg;
271
271
  shell.body.classList.add('markstream-svelte-mermaid');
272
272
  shell.wrapper.dataset.markstreamMermaid = '1';
273
- (_g = rendered === null || rendered === void 0 ? void 0 : rendered.bindFunctions) === null || _g === void 0 ? void 0 : _g.call(rendered, shell.body);
273
+ if (typeof rendered !== 'string')
274
+ (_g = rendered === null || rendered === void 0 ? void 0 : rendered.bindFunctions) === null || _g === void 0 ? void 0 : _g.call(rendered, shell.body);
274
275
  cleanupFns.push(() => {
275
276
  if (shell.wrapper.isConnected)
276
277
  shell.wrapper.replaceWith(originalPre.cloneNode(true));
@@ -28,8 +28,10 @@ export function hydrateCustomTagContent(nodes, source, customHtmlTags) {
28
28
  for (const value of Object.values(node)) {
29
29
  if (!Array.isArray(value))
30
30
  continue;
31
- for (const child of value)
32
- visitNode(child);
31
+ for (const child of value) {
32
+ if (child && typeof child === 'object')
33
+ visitNode(child);
34
+ }
33
35
  }
34
36
  };
35
37
  for (const node of cloned)
@@ -122,8 +124,9 @@ function cloneNodeTree(node) {
122
124
  : { ...node };
123
125
  if (!Array.isArray(cloned)) {
124
126
  for (const [key, value] of Object.entries(cloned)) {
125
- if (Array.isArray(value))
127
+ if (Array.isArray(value)) {
126
128
  cloned[key] = value.map(item => cloneNodeTree(item));
129
+ }
127
130
  }
128
131
  }
129
132
  return cloned;
package/dist/index.d.ts CHANGED
@@ -39,7 +39,7 @@ export { default as PreCodeNode } from './components/PreCodeNode.svelte';
39
39
  export { default as ReferenceNode } from './components/ReferenceNode.svelte';
40
40
  export { default as RenderChildren } from './components/RenderChildren.svelte';
41
41
  export { buildRenderContext, resolveParsedNodes, } from './components/shared/node-helpers';
42
- export type { NodeRendererEvents, NodeRendererProps, SvelteRenderableNode, SvelteRenderContext, } from './components/shared/node-helpers';
42
+ export type { CodeBlockPreviewPayload, NodeRendererCodeBlockProps, NodeRendererD2Props, NodeRendererEvents, NodeRendererInfographicProps, NodeRendererMermaidProps, NodeRendererProps, SvelteRenderableNode, SvelteRenderContext, } from './components/shared/node-helpers';
43
43
  export { default as StrikethroughNode } from './components/StrikethroughNode.svelte';
44
44
  export { default as StrongNode } from './components/StrongNode.svelte';
45
45
  export { default as SubscriptNode } from './components/SubscriptNode.svelte';
@@ -1,6 +1,17 @@
1
- export type D2Loader = () => Promise<any> | any;
1
+ export interface D2Instance {
2
+ D2?: D2Constructor;
3
+ compile?: (source: string, options?: Record<string, unknown>) => Promise<unknown> | unknown;
4
+ render?: (input: unknown, options?: Record<string, unknown>) => Promise<unknown> | unknown;
5
+ }
6
+ export interface D2Constructor {
7
+ new (): D2Instance;
8
+ D2?: D2Constructor;
9
+ compile?: D2Instance['compile'];
10
+ }
11
+ export type D2Module = D2Constructor | D2Instance;
12
+ export type D2Loader = () => Promise<unknown> | unknown;
2
13
  export declare function setD2Loader(loader: D2Loader | null): void;
3
14
  export declare function enableD2(loader?: D2Loader): void;
4
15
  export declare function disableD2(): void;
5
16
  export declare function isD2Enabled(): boolean;
6
- export declare function getD2(): Promise<any>;
17
+ export declare function getD2(): Promise<D2Module | null>;
@@ -1 +1,13 @@
1
- export declare function getInfographic(): Promise<any>;
1
+ export interface InfographicInstance {
2
+ render: (source: string) => unknown;
3
+ destroy?: () => unknown;
4
+ on?: (event: string, handler: (payload: unknown) => void) => unknown;
5
+ }
6
+ export interface InfographicConstructor {
7
+ new (options: {
8
+ container: HTMLElement;
9
+ width?: string | number;
10
+ height?: string | number;
11
+ }): InfographicInstance;
12
+ }
13
+ export declare function getInfographic(): Promise<InfographicConstructor | null>;
@@ -1,6 +1,9 @@
1
- export type KatexLoader = () => Promise<any> | any;
1
+ export interface KatexModule {
2
+ renderToString: (content: string, options?: Record<string, unknown>) => string;
3
+ }
4
+ export type KatexLoader = () => Promise<unknown> | unknown;
2
5
  export declare function setKatexLoader(loader: KatexLoader | null): void;
3
6
  export declare function enableKatex(loader?: KatexLoader): void;
4
7
  export declare function disableKatex(): void;
5
8
  export declare function isKatexEnabled(): boolean;
6
- export declare function getKatex(): Promise<any>;
9
+ export declare function getKatex(): Promise<KatexModule | null>;
@@ -1,6 +1,27 @@
1
- export type MermaidLoader = () => Promise<any> | any;
1
+ export type MermaidLoader = () => Promise<unknown> | unknown;
2
+ export interface MermaidModule {
3
+ render: (id: string, source: string) => Promise<MermaidRenderResult> | MermaidRenderResult;
4
+ parse?: (source: string) => Promise<unknown> | unknown;
5
+ initialize?: (config?: Record<string, unknown>) => unknown;
6
+ mermaidAPI?: {
7
+ render?: MermaidModule['render'];
8
+ parse?: MermaidModule['parse'];
9
+ initialize?: MermaidModule['initialize'];
10
+ };
11
+ }
12
+ export type MermaidRenderResult = string | {
13
+ svg?: string;
14
+ bindFunctions?: (element: Element) => unknown;
15
+ };
16
+ interface MermaidInitConfig extends Record<string, unknown> {
17
+ securityLevel?: unknown;
18
+ flowchart?: {
19
+ htmlLabels?: unknown;
20
+ };
21
+ }
2
22
  export declare function setMermaidLoader(loader: MermaidLoader | null): void;
3
23
  export declare function enableMermaid(loader?: MermaidLoader): void;
4
24
  export declare function disableMermaid(): void;
5
25
  export declare function isMermaidEnabled(): boolean;
6
- export declare function getMermaid(initConfig?: Record<string, any>): Promise<any>;
26
+ export declare function getMermaid(initConfig?: MermaidInitConfig): Promise<MermaidModule | null>;
27
+ export {};
@@ -1,4 +1,21 @@
1
+ export interface MonacoRuntimeHelpers {
2
+ createEditor?: (container: HTMLElement, code: string, language: string) => Promise<unknown> | unknown;
3
+ createDiffEditor?: (container: HTMLElement, original: string, modified: string, language: string) => Promise<unknown> | unknown;
4
+ updateCode?: (code: string, language?: string) => Promise<unknown> | unknown;
5
+ updateDiff?: (original: string, modified: string, language?: string) => Promise<unknown> | unknown;
6
+ cleanupEditor?: () => unknown;
7
+ safeClean?: () => unknown;
8
+ setTheme?: (theme?: string | Record<string, unknown>) => Promise<unknown> | unknown;
9
+ getEditorView?: () => unknown;
10
+ getDiffEditorView?: () => unknown;
11
+ refreshDiffPresentation?: () => unknown;
12
+ }
13
+ export interface MonacoRuntimeModule {
14
+ useMonaco: (options?: Record<string, unknown>) => MonacoRuntimeHelpers;
15
+ preloadMonacoWorkers?: () => Promise<unknown> | unknown;
16
+ getOrCreateHighlighter?: (...args: unknown[]) => Promise<unknown> | unknown;
17
+ }
1
18
  export declare function isCodeBlockRuntimeReady(): boolean;
2
19
  export declare function resetCodeBlockRuntimeReadyForTest(): void;
3
20
  export declare function preloadCodeBlockRuntime(): Promise<boolean>;
4
- export declare function getUseMonaco(): Promise<any>;
21
+ export declare function getUseMonaco(): Promise<MonacoRuntimeModule | null>;
@@ -1,6 +1,10 @@
1
1
  import type { BaseNode, MarkdownIt, ParseOptions } from 'stream-markdown-parser';
2
+ type NestedMarkdownSourceNode = BaseNode & {
3
+ children?: BaseNode[];
4
+ content?: string;
5
+ };
2
6
  export interface NestedMarkdownNodesInput {
3
- node?: (BaseNode & Record<string, any>) | null;
7
+ node?: NestedMarkdownSourceNode | null;
4
8
  nodes?: readonly BaseNode[] | null;
5
9
  content?: string | null;
6
10
  }
@@ -12,3 +16,4 @@ export interface NestedMarkdownNodesOptions {
12
16
  customMarkdownIt?: (markdown: MarkdownIt) => MarkdownIt;
13
17
  }
14
18
  export declare function parseNestedMarkdownToNodes(input: NestedMarkdownNodesInput, options?: NestedMarkdownNodesOptions): BaseNode[];
19
+ export {};
@@ -7,7 +7,7 @@ export interface CodeBlockMonacoThemeObject {
7
7
  [key: string]: unknown;
8
8
  }
9
9
  export type CodeBlockMonacoTheme = string | CodeBlockMonacoThemeObject;
10
- export type CodeBlockMonacoLanguage = string | ((...args: any[]) => unknown);
10
+ export type CodeBlockMonacoLanguage = string | ((...args: unknown[]) => unknown);
11
11
  export interface CodeBlockDiffHideUnchangedRegionsOptions {
12
12
  enabled?: boolean;
13
13
  contextLineCount?: number;
@@ -60,6 +60,6 @@ export interface CodeBlockMonacoOptions {
60
60
  diffHunkActionsOnHover?: boolean;
61
61
  diffHunkHoverHideDelayMs?: number;
62
62
  onDiffHunkAction?: (context: CodeBlockDiffHunkActionContext) => void | boolean | Promise<void | boolean>;
63
- scrollbar?: Record<string, any>;
64
- [key: string]: any;
63
+ scrollbar?: Record<string, unknown>;
64
+ [key: string]: unknown;
65
65
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "markstream-svelte",
3
3
  "type": "module",
4
- "version": "0.0.1-beta.3",
4
+ "version": "0.0.1-beta.4",
5
5
  "description": "Svelte Markdown renderer for Markstream, aligned with markstream-vue and markstream-react.",
6
6
  "author": "Simon He",
7
7
  "license": "MIT",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "@floating-ui/dom": "^1.7.6",
74
- "stream-markdown-parser": "0.0.92"
74
+ "stream-markdown-parser": "0.0.93"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@sveltejs/package": "^2.5.7",