markstream-svelte 0.0.1-beta.1
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 +77 -0
- package/dist/components/AdmonitionNode.svelte +8 -0
- package/dist/components/AdmonitionNode.svelte.d.ts +23 -0
- package/dist/components/AdmonitionNode.svelte.d.ts.map +1 -0
- package/dist/components/BlockquoteNode.svelte +10 -0
- package/dist/components/BlockquoteNode.svelte.d.ts +24 -0
- package/dist/components/BlockquoteNode.svelte.d.ts.map +1 -0
- package/dist/components/CheckboxNode.svelte +5 -0
- package/dist/components/CheckboxNode.svelte.d.ts +22 -0
- package/dist/components/CheckboxNode.svelte.d.ts.map +1 -0
- package/dist/components/CodeBlockNode.svelte +944 -0
- package/dist/components/CodeBlockNode.svelte.d.ts +43 -0
- package/dist/components/CodeBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/D2BlockNode.svelte +272 -0
- package/dist/components/D2BlockNode.svelte.d.ts +33 -0
- package/dist/components/D2BlockNode.svelte.d.ts.map +1 -0
- package/dist/components/DefinitionListNode.svelte +8 -0
- package/dist/components/DefinitionListNode.svelte.d.ts +23 -0
- package/dist/components/DefinitionListNode.svelte.d.ts.map +1 -0
- package/dist/components/EmojiNode.svelte +7 -0
- package/dist/components/EmojiNode.svelte.d.ts +22 -0
- package/dist/components/EmojiNode.svelte.d.ts.map +1 -0
- package/dist/components/EmphasisNode.svelte +8 -0
- package/dist/components/EmphasisNode.svelte.d.ts +24 -0
- package/dist/components/EmphasisNode.svelte.d.ts.map +1 -0
- package/dist/components/FallbackComponent.svelte +8 -0
- package/dist/components/FallbackComponent.svelte.d.ts +23 -0
- package/dist/components/FallbackComponent.svelte.d.ts.map +1 -0
- package/dist/components/FootnoteAnchorNode.svelte +21 -0
- package/dist/components/FootnoteAnchorNode.svelte.d.ts +22 -0
- package/dist/components/FootnoteAnchorNode.svelte.d.ts.map +1 -0
- package/dist/components/FootnoteNode.svelte +19 -0
- package/dist/components/FootnoteNode.svelte.d.ts +24 -0
- package/dist/components/FootnoteNode.svelte.d.ts.map +1 -0
- package/dist/components/FootnoteReferenceNode.svelte +26 -0
- package/dist/components/FootnoteReferenceNode.svelte.d.ts +22 -0
- package/dist/components/FootnoteReferenceNode.svelte.d.ts.map +1 -0
- package/dist/components/HardBreakNode.svelte +1 -0
- package/dist/components/HardBreakNode.svelte.d.ts +27 -0
- package/dist/components/HardBreakNode.svelte.d.ts.map +1 -0
- package/dist/components/HeadingNode.svelte +15 -0
- package/dist/components/HeadingNode.svelte.d.ts +24 -0
- package/dist/components/HeadingNode.svelte.d.ts.map +1 -0
- package/dist/components/HighlightNode.svelte +8 -0
- package/dist/components/HighlightNode.svelte.d.ts +24 -0
- package/dist/components/HighlightNode.svelte.d.ts.map +1 -0
- package/dist/components/HtmlBlockNode.svelte +8 -0
- package/dist/components/HtmlBlockNode.svelte.d.ts +23 -0
- package/dist/components/HtmlBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/HtmlInlineNode.svelte +8 -0
- package/dist/components/HtmlInlineNode.svelte.d.ts +23 -0
- package/dist/components/HtmlInlineNode.svelte.d.ts.map +1 -0
- package/dist/components/HtmlPreviewFrame.svelte +13 -0
- package/dist/components/HtmlPreviewFrame.svelte.d.ts +26 -0
- package/dist/components/HtmlPreviewFrame.svelte.d.ts.map +1 -0
- package/dist/components/ImageNode.svelte +86 -0
- package/dist/components/ImageNode.svelte.d.ts +25 -0
- package/dist/components/ImageNode.svelte.d.ts.map +1 -0
- package/dist/components/InfographicBlockNode.svelte +429 -0
- package/dist/components/InfographicBlockNode.svelte.d.ts +34 -0
- package/dist/components/InfographicBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/InlineCodeNode.svelte +7 -0
- package/dist/components/InlineCodeNode.svelte.d.ts +22 -0
- package/dist/components/InlineCodeNode.svelte.d.ts.map +1 -0
- package/dist/components/InlineWrapNode.svelte +10 -0
- package/dist/components/InlineWrapNode.svelte.d.ts +25 -0
- package/dist/components/InlineWrapNode.svelte.d.ts.map +1 -0
- package/dist/components/InsertNode.svelte +8 -0
- package/dist/components/InsertNode.svelte.d.ts +24 -0
- package/dist/components/InsertNode.svelte.d.ts.map +1 -0
- package/dist/components/LinkNode.svelte +41 -0
- package/dist/components/LinkNode.svelte.d.ts +25 -0
- package/dist/components/LinkNode.svelte.d.ts.map +1 -0
- package/dist/components/ListItemNode.svelte +9 -0
- package/dist/components/ListItemNode.svelte.d.ts +24 -0
- package/dist/components/ListItemNode.svelte.d.ts.map +1 -0
- package/dist/components/ListNode.svelte +16 -0
- package/dist/components/ListNode.svelte.d.ts +24 -0
- package/dist/components/ListNode.svelte.d.ts.map +1 -0
- package/dist/components/MarkdownCodeBlockNode.svelte +7 -0
- package/dist/components/MarkdownCodeBlockNode.svelte.d.ts +23 -0
- package/dist/components/MarkdownCodeBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/MathBlockNode.svelte +96 -0
- package/dist/components/MathBlockNode.svelte.d.ts +22 -0
- package/dist/components/MathBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/MathInlineNode.svelte +103 -0
- package/dist/components/MathInlineNode.svelte.d.ts +22 -0
- package/dist/components/MathInlineNode.svelte.d.ts.map +1 -0
- package/dist/components/MermaidBlockNode.svelte +557 -0
- package/dist/components/MermaidBlockNode.svelte.d.ts +40 -0
- package/dist/components/MermaidBlockNode.svelte.d.ts.map +1 -0
- package/dist/components/NodeOutlet.svelte +192 -0
- package/dist/components/NodeOutlet.svelte.d.ts +24 -0
- package/dist/components/NodeOutlet.svelte.d.ts.map +1 -0
- package/dist/components/NodeRenderer.svelte +349 -0
- package/dist/components/NodeRenderer.svelte.d.ts +64 -0
- package/dist/components/NodeRenderer.svelte.d.ts.map +1 -0
- package/dist/components/ParagraphNode.svelte +21 -0
- package/dist/components/ParagraphNode.svelte.d.ts +24 -0
- package/dist/components/ParagraphNode.svelte.d.ts.map +1 -0
- package/dist/components/PreCodeNode.svelte +13 -0
- package/dist/components/PreCodeNode.svelte.d.ts +22 -0
- package/dist/components/PreCodeNode.svelte.d.ts.map +1 -0
- package/dist/components/ReferenceNode.svelte +8 -0
- package/dist/components/ReferenceNode.svelte.d.ts +23 -0
- package/dist/components/ReferenceNode.svelte.d.ts.map +1 -0
- package/dist/components/RenderChildren.svelte +12 -0
- package/dist/components/RenderChildren.svelte.d.ts +24 -0
- package/dist/components/RenderChildren.svelte.d.ts.map +1 -0
- package/dist/components/StrikethroughNode.svelte +8 -0
- package/dist/components/StrikethroughNode.svelte.d.ts +24 -0
- package/dist/components/StrikethroughNode.svelte.d.ts.map +1 -0
- package/dist/components/StrongNode.svelte +8 -0
- package/dist/components/StrongNode.svelte.d.ts +24 -0
- package/dist/components/StrongNode.svelte.d.ts.map +1 -0
- package/dist/components/SubscriptNode.svelte +8 -0
- package/dist/components/SubscriptNode.svelte.d.ts +24 -0
- package/dist/components/SubscriptNode.svelte.d.ts.map +1 -0
- package/dist/components/SuperscriptNode.svelte +8 -0
- package/dist/components/SuperscriptNode.svelte.d.ts +24 -0
- package/dist/components/SuperscriptNode.svelte.d.ts.map +1 -0
- package/dist/components/TableNode.svelte +8 -0
- package/dist/components/TableNode.svelte.d.ts +23 -0
- package/dist/components/TableNode.svelte.d.ts.map +1 -0
- package/dist/components/TextNode.svelte +37 -0
- package/dist/components/TextNode.svelte.d.ts +25 -0
- package/dist/components/TextNode.svelte.d.ts.map +1 -0
- package/dist/components/ThematicBreakNode.svelte +1 -0
- package/dist/components/ThematicBreakNode.svelte.d.ts +27 -0
- package/dist/components/ThematicBreakNode.svelte.d.ts.map +1 -0
- package/dist/components/Tooltip.svelte +4 -0
- package/dist/components/Tooltip.svelte.d.ts +21 -0
- package/dist/components/Tooltip.svelte.d.ts.map +1 -0
- package/dist/components/VmrContainerNode.svelte +8 -0
- package/dist/components/VmrContainerNode.svelte.d.ts +23 -0
- package/dist/components/VmrContainerNode.svelte.d.ts.map +1 -0
- package/dist/components/shared/diagram-height.d.ts +10 -0
- package/dist/components/shared/diagram-height.d.ts.map +1 -0
- package/dist/components/shared/diagram-height.js +52 -0
- package/dist/components/shared/node-helpers.d.ts +108 -0
- package/dist/components/shared/node-helpers.d.ts.map +1 -0
- package/dist/components/shared/node-helpers.js +220 -0
- package/dist/components/shared/node-outlet-helpers.d.ts +9 -0
- package/dist/components/shared/node-outlet-helpers.d.ts.map +1 -0
- package/dist/components/shared/node-outlet-helpers.js +92 -0
- package/dist/components/shared/render-window.d.ts +19 -0
- package/dist/components/shared/render-window.d.ts.map +1 -0
- package/dist/components/shared/render-window.js +63 -0
- package/dist/components/shared/renderNodeHtml.d.ts +4 -0
- package/dist/components/shared/renderNodeHtml.d.ts.map +1 -0
- package/dist/components/shared/renderNodeHtml.js +19 -0
- package/dist/components/shared/rich-block-helpers.d.ts +7 -0
- package/dist/components/shared/rich-block-helpers.d.ts.map +1 -0
- package/dist/components/shared/rich-block-helpers.js +76 -0
- package/dist/customComponents.d.ts +10 -0
- package/dist/customComponents.d.ts.map +1 -0
- package/dist/customComponents.js +66 -0
- package/dist/enhanceRenderedHtml.d.ts +21 -0
- package/dist/enhanceRenderedHtml.d.ts.map +1 -0
- package/dist/enhanceRenderedHtml.js +768 -0
- package/dist/hydrateCustomTagContent.d.ts +3 -0
- package/dist/hydrateCustomTagContent.d.ts.map +1 -0
- package/dist/hydrateCustomTagContent.js +130 -0
- package/dist/i18n/useSafeI18n.d.ts +5 -0
- package/dist/i18n/useSafeI18n.d.ts.map +1 -0
- package/dist/i18n/useSafeI18n.js +42 -0
- package/dist/index.css +2009 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.px.css +2009 -0
- package/dist/index.tailwind.css +2009 -0
- package/dist/optional/d2.d.ts +7 -0
- package/dist/optional/d2.d.ts.map +1 -0
- package/dist/optional/d2.js +67 -0
- package/dist/optional/infographic.d.ts +2 -0
- package/dist/optional/infographic.d.ts.map +1 -0
- package/dist/optional/infographic.js +29 -0
- package/dist/optional/katex.d.ts +7 -0
- package/dist/optional/katex.d.ts.map +1 -0
- package/dist/optional/katex.js +93 -0
- package/dist/optional/mermaid.d.ts +7 -0
- package/dist/optional/mermaid.d.ts.map +1 -0
- package/dist/optional/mermaid.js +171 -0
- package/dist/optional/monaco.d.ts +5 -0
- package/dist/optional/monaco.d.ts.map +1 -0
- package/dist/optional/monaco.js +70 -0
- package/dist/parseNestedMarkdownToNodes.d.ts +15 -0
- package/dist/parseNestedMarkdownToNodes.d.ts.map +1 -0
- package/dist/parseNestedMarkdownToNodes.js +66 -0
- package/dist/renderMarkdownHtml.d.ts +31 -0
- package/dist/renderMarkdownHtml.d.ts.map +1 -0
- package/dist/renderMarkdownHtml.js +465 -0
- package/dist/sanitizeHtmlContent.d.ts +3 -0
- package/dist/sanitizeHtmlContent.d.ts.map +1 -0
- package/dist/sanitizeHtmlContent.js +175 -0
- package/dist/sanitizeSvg.d.ts +3 -0
- package/dist/sanitizeSvg.d.ts.map +1 -0
- package/dist/sanitizeSvg.js +76 -0
- package/dist/tailwind-entry.d.ts +2 -0
- package/dist/tailwind-entry.d.ts.map +1 -0
- package/dist/tailwind-entry.js +1 -0
- package/dist/tooltip/singletonTooltip.d.ts +8 -0
- package/dist/tooltip/singletonTooltip.d.ts.map +1 -0
- package/dist/tooltip/singletonTooltip.js +124 -0
- package/dist/types/monaco.d.ts +66 -0
- package/dist/types/monaco.d.ts.map +1 -0
- package/dist/types/monaco.js +1 -0
- package/dist/utils/languageIcon.d.ts +8 -0
- package/dist/utils/languageIcon.d.ts.map +1 -0
- package/dist/utils/languageIcon.js +182 -0
- package/dist/utils/normalizeKaTeXRenderInput.d.ts +2 -0
- package/dist/utils/normalizeKaTeXRenderInput.d.ts.map +1 -0
- package/dist/utils/normalizeKaTeXRenderInput.js +7 -0
- package/dist/workers/katexCdnWorker.d.ts +21 -0
- package/dist/workers/katexCdnWorker.d.ts.map +1 -0
- package/dist/workers/katexCdnWorker.js +193 -0
- package/dist/workers/katexRenderer.worker.d.ts +2 -0
- package/dist/workers/katexRenderer.worker.d.ts.map +1 -0
- package/dist/workers/katexRenderer.worker.js +55 -0
- package/dist/workers/katexWorkerClient.d.ts +36 -0
- package/dist/workers/katexWorkerClient.d.ts.map +1 -0
- package/dist/workers/katexWorkerClient.js +270 -0
- package/dist/workers/mermaidCdnWorker.d.ts +16 -0
- package/dist/workers/mermaidCdnWorker.d.ts.map +1 -0
- package/dist/workers/mermaidCdnWorker.js +235 -0
- package/dist/workers/mermaidParser.worker.d.ts +2 -0
- package/dist/workers/mermaidParser.worker.d.ts.map +1 -0
- package/dist/workers/mermaidParser.worker.js +85 -0
- package/dist/workers/mermaidWorkerClient.d.ts +16 -0
- package/dist/workers/mermaidWorkerClient.d.ts.map +1 -0
- package/dist/workers/mermaidWorkerClient.js +170 -0
- package/package.json +95 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
function stringifyForWorker(value) {
|
|
2
|
+
return JSON.stringify(value);
|
|
3
|
+
}
|
|
4
|
+
export function buildMermaidCDNWorkerSource(options) {
|
|
5
|
+
var _a;
|
|
6
|
+
const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : 'module';
|
|
7
|
+
const mermaidUrlLiteral = stringifyForWorker(options.mermaidUrl);
|
|
8
|
+
const initLiteral = stringifyForWorker({
|
|
9
|
+
startOnLoad: false,
|
|
10
|
+
securityLevel: 'strict',
|
|
11
|
+
flowchart: { htmlLabels: false },
|
|
12
|
+
...(options.initializeOptions || {}),
|
|
13
|
+
});
|
|
14
|
+
const sharedLogic = `
|
|
15
|
+
let DEBUG = false
|
|
16
|
+
let mermaid = null
|
|
17
|
+
let mermaidLoadError = null
|
|
18
|
+
|
|
19
|
+
function normalizeMermaidModule(mod) {
|
|
20
|
+
if (!mod)
|
|
21
|
+
return mod
|
|
22
|
+
const candidate = mod && mod.default ? mod.default : mod
|
|
23
|
+
if (candidate && (typeof candidate.render === 'function' || typeof candidate.parse === 'function' || typeof candidate.initialize === 'function'))
|
|
24
|
+
return candidate
|
|
25
|
+
if (candidate && candidate.mermaidAPI && (typeof candidate.mermaidAPI.render === 'function' || typeof candidate.mermaidAPI.parse === 'function')) {
|
|
26
|
+
const api = candidate.mermaidAPI
|
|
27
|
+
return {
|
|
28
|
+
...candidate,
|
|
29
|
+
render: api.render ? api.render.bind(api) : undefined,
|
|
30
|
+
parse: api.parse ? api.parse.bind(api) : undefined,
|
|
31
|
+
initialize: (opts) => {
|
|
32
|
+
if (typeof candidate.initialize === 'function')
|
|
33
|
+
return candidate.initialize(opts)
|
|
34
|
+
return api.initialize ? api.initialize(opts) : undefined
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (mod && mod.mermaid && typeof mod.mermaid.parse === 'function')
|
|
39
|
+
return mod.mermaid
|
|
40
|
+
return candidate
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function applyThemeTo(code, theme) {
|
|
44
|
+
const themeValue = theme === 'dark' ? 'dark' : 'default'
|
|
45
|
+
const themeConfig = \`%%{init: {"theme": "\${themeValue}"}}%%\\n\`
|
|
46
|
+
const trimmed = String(code || '').trimStart()
|
|
47
|
+
if (trimmed.startsWith('%%{'))
|
|
48
|
+
return code
|
|
49
|
+
return themeConfig + code
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function findHeaderIndex(lines) {
|
|
53
|
+
const headerRe = /^(?:graph|flowchart|flowchart\\s+tb|flowchart\\s+lr|sequenceDiagram|gantt|classDiagram|stateDiagram(?:-v2)?|erDiagram|journey|pie|quadrantChart|timeline|xychart(?:-beta)?)\\b/
|
|
54
|
+
for (let i = 0; i < lines.length; i++) {
|
|
55
|
+
const line = (lines[i] || '').trim()
|
|
56
|
+
if (!line || line.startsWith('%%'))
|
|
57
|
+
continue
|
|
58
|
+
if (headerRe.test(line))
|
|
59
|
+
return i
|
|
60
|
+
}
|
|
61
|
+
return -1
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function canParse(code, theme) {
|
|
65
|
+
const themed = applyThemeTo(code, theme)
|
|
66
|
+
if (mermaid && typeof mermaid.parse === 'function') {
|
|
67
|
+
await mermaid.parse(themed)
|
|
68
|
+
return true
|
|
69
|
+
}
|
|
70
|
+
throw new Error('mermaid.parse not available in worker')
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function findLastRenderablePrefix(baseCode, theme) {
|
|
74
|
+
const lines = String(baseCode || '').split('\\n')
|
|
75
|
+
const headerIndex = findHeaderIndex(lines)
|
|
76
|
+
if (headerIndex === -1)
|
|
77
|
+
return null
|
|
78
|
+
const head = lines.slice(0, headerIndex + 1)
|
|
79
|
+
await canParse(head.join('\\n'), theme)
|
|
80
|
+
|
|
81
|
+
let low = headerIndex + 1
|
|
82
|
+
let high = lines.length
|
|
83
|
+
let lastGood = headerIndex + 1
|
|
84
|
+
let tries = 0
|
|
85
|
+
const MAX_TRIES = 12
|
|
86
|
+
|
|
87
|
+
while (low <= high && tries < MAX_TRIES) {
|
|
88
|
+
const mid = Math.floor((low + high) / 2)
|
|
89
|
+
const candidate = [...head, ...lines.slice(headerIndex + 1, mid)].join('\\n')
|
|
90
|
+
tries += 1
|
|
91
|
+
try {
|
|
92
|
+
await canParse(candidate, theme)
|
|
93
|
+
lastGood = mid
|
|
94
|
+
low = mid + 1
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
high = mid - 1
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return [...head, ...lines.slice(headerIndex + 1, lastGood)].join('\\n')
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function initMermaidOnce() {
|
|
105
|
+
if (!mermaid)
|
|
106
|
+
return
|
|
107
|
+
try {
|
|
108
|
+
if (typeof mermaid.initialize === 'function')
|
|
109
|
+
mermaid.initialize(${initLiteral})
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
if (DEBUG)
|
|
113
|
+
console.warn('[markstream-svelte:mermaid-cdn-worker] initialize failed', e)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
globalThis.addEventListener('message', async (ev) => {
|
|
118
|
+
const msg = ev.data || {}
|
|
119
|
+
if (msg.type === 'init') {
|
|
120
|
+
DEBUG = !!msg.debug
|
|
121
|
+
return
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const id = msg.id
|
|
125
|
+
const action = msg.action
|
|
126
|
+
const payload = msg.payload || {}
|
|
127
|
+
|
|
128
|
+
if (!mermaid) {
|
|
129
|
+
const error = mermaidLoadError ? String(mermaidLoadError?.message || mermaidLoadError) : 'Mermaid is not available in worker'
|
|
130
|
+
globalThis.postMessage({ id, ok: false, error })
|
|
131
|
+
return
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
if (action === 'canParse') {
|
|
136
|
+
const ok = await canParse(payload.code, payload.theme)
|
|
137
|
+
globalThis.postMessage({ id, ok: true, result: ok })
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
if (action === 'findPrefix') {
|
|
141
|
+
const result = await findLastRenderablePrefix(payload.code, payload.theme)
|
|
142
|
+
globalThis.postMessage({ id, ok: true, result })
|
|
143
|
+
return
|
|
144
|
+
}
|
|
145
|
+
globalThis.postMessage({ id, ok: false, error: 'Unknown action' })
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
globalThis.postMessage({ id, ok: false, error: String(e?.message || e) })
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
`.trimStart();
|
|
152
|
+
if (mode === 'module') {
|
|
153
|
+
return `
|
|
154
|
+
${sharedLogic}
|
|
155
|
+
|
|
156
|
+
let loadPromise = null
|
|
157
|
+
async function loadMermaid() {
|
|
158
|
+
if (mermaid || mermaidLoadError)
|
|
159
|
+
return
|
|
160
|
+
if (!loadPromise) {
|
|
161
|
+
loadPromise = (async () => {
|
|
162
|
+
try {
|
|
163
|
+
const mod = await import(${mermaidUrlLiteral})
|
|
164
|
+
mermaid = normalizeMermaidModule(mod) || null
|
|
165
|
+
initMermaidOnce()
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
mermaidLoadError = e
|
|
169
|
+
}
|
|
170
|
+
})()
|
|
171
|
+
}
|
|
172
|
+
await loadPromise
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
await loadMermaid()
|
|
176
|
+
`.trimStart();
|
|
177
|
+
}
|
|
178
|
+
return `
|
|
179
|
+
${sharedLogic}
|
|
180
|
+
|
|
181
|
+
function loadMermaidClassic() {
|
|
182
|
+
if (mermaid || mermaidLoadError)
|
|
183
|
+
return
|
|
184
|
+
try {
|
|
185
|
+
importScripts(${mermaidUrlLiteral})
|
|
186
|
+
mermaid = normalizeMermaidModule(globalThis.mermaid) || null
|
|
187
|
+
initMermaidOnce()
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
mermaidLoadError = e
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
loadMermaidClassic()
|
|
195
|
+
`.trimStart();
|
|
196
|
+
}
|
|
197
|
+
export function createMermaidWorkerFromCDN(options) {
|
|
198
|
+
var _a, _b;
|
|
199
|
+
const source = buildMermaidCDNWorkerSource(options);
|
|
200
|
+
if (typeof Worker === 'undefined' || typeof URL === 'undefined' || typeof Blob === 'undefined') {
|
|
201
|
+
return {
|
|
202
|
+
worker: null,
|
|
203
|
+
dispose: () => { },
|
|
204
|
+
source,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
const blob = new Blob([source], { type: 'text/javascript' });
|
|
208
|
+
const url = URL.createObjectURL(blob);
|
|
209
|
+
let revoked = false;
|
|
210
|
+
const dispose = () => {
|
|
211
|
+
if (revoked)
|
|
212
|
+
return;
|
|
213
|
+
revoked = true;
|
|
214
|
+
try {
|
|
215
|
+
URL.revokeObjectURL(url);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Ignore revoke failures.
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : 'module';
|
|
222
|
+
const workerOptions = mode === 'module'
|
|
223
|
+
? { ...((_b = options.workerOptions) !== null && _b !== void 0 ? _b : {}), type: 'module' }
|
|
224
|
+
: options.workerOptions;
|
|
225
|
+
const worker = new Worker(url, workerOptions);
|
|
226
|
+
if (options.debug) {
|
|
227
|
+
try {
|
|
228
|
+
worker.postMessage({ type: 'init', debug: true });
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Ignore init messaging failures.
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { worker, dispose, source };
|
|
235
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaidParser.worker.d.ts","sourceRoot":"","sources":["../../src/workers/mermaidParser.worker.ts"],"names":[],"mappings":"AAiHA,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/// <reference lib="webworker" />
|
|
2
|
+
import mermaid from 'mermaid';
|
|
3
|
+
mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', flowchart: { htmlLabels: false } });
|
|
4
|
+
function applyThemeTo(code, theme) {
|
|
5
|
+
const themeValue = theme === 'dark' ? 'dark' : 'default';
|
|
6
|
+
const themeConfig = `%%{init: {"theme": "${themeValue}"}}%%\n`;
|
|
7
|
+
const trimmed = code.trimStart();
|
|
8
|
+
if (trimmed.startsWith('%%{'))
|
|
9
|
+
return code;
|
|
10
|
+
return themeConfig + code;
|
|
11
|
+
}
|
|
12
|
+
function findHeaderIndex(lines) {
|
|
13
|
+
const headerRe = /^(?:graph|flowchart|flowchart\s+tb|flowchart\s+lr|sequenceDiagram|gantt|classDiagram|stateDiagram(?:-v2)?|erDiagram|journey|pie|quadrantChart|timeline|xychart(?:-beta)?)\b/;
|
|
14
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
15
|
+
const line = lines[index].trim();
|
|
16
|
+
if (!line || line.startsWith('%%'))
|
|
17
|
+
continue;
|
|
18
|
+
if (headerRe.test(line))
|
|
19
|
+
return index;
|
|
20
|
+
}
|
|
21
|
+
return -1;
|
|
22
|
+
}
|
|
23
|
+
async function canParse(code, theme) {
|
|
24
|
+
const themed = applyThemeTo(code, theme);
|
|
25
|
+
const anyMermaid = mermaid;
|
|
26
|
+
if (typeof anyMermaid.parse === 'function') {
|
|
27
|
+
await anyMermaid.parse(themed);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
throw new Error('mermaid.parse not available in worker');
|
|
31
|
+
}
|
|
32
|
+
async function findLastRenderablePrefix(baseCode, theme) {
|
|
33
|
+
const lines = baseCode.split('\n');
|
|
34
|
+
const headerIndex = findHeaderIndex(lines);
|
|
35
|
+
if (headerIndex === -1)
|
|
36
|
+
return null;
|
|
37
|
+
const head = lines.slice(0, headerIndex + 1);
|
|
38
|
+
await canParse(head.join('\n'), theme);
|
|
39
|
+
let low = headerIndex + 1;
|
|
40
|
+
let high = lines.length;
|
|
41
|
+
let lastGood = headerIndex + 1;
|
|
42
|
+
let tries = 0;
|
|
43
|
+
const maxTries = 12;
|
|
44
|
+
while (low <= high && tries < maxTries) {
|
|
45
|
+
const mid = Math.floor((low + high) / 2);
|
|
46
|
+
const candidate = [...head, ...lines.slice(headerIndex + 1, mid)].join('\n');
|
|
47
|
+
tries += 1;
|
|
48
|
+
try {
|
|
49
|
+
await canParse(candidate, theme);
|
|
50
|
+
lastGood = mid;
|
|
51
|
+
low = mid + 1;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
high = mid - 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return [...head, ...lines.slice(headerIndex + 1, lastGood)].join('\n');
|
|
58
|
+
}
|
|
59
|
+
self.onmessage = async (event) => {
|
|
60
|
+
var _a;
|
|
61
|
+
const message = event.data;
|
|
62
|
+
const send = (response) => self.postMessage(response);
|
|
63
|
+
try {
|
|
64
|
+
if (message.action === 'canParse') {
|
|
65
|
+
send({
|
|
66
|
+
id: message.id,
|
|
67
|
+
ok: true,
|
|
68
|
+
result: await canParse(message.payload.code, message.payload.theme),
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (message.action === 'findPrefix') {
|
|
73
|
+
send({
|
|
74
|
+
id: message.id,
|
|
75
|
+
ok: true,
|
|
76
|
+
result: await findLastRenderablePrefix(message.payload.code, message.payload.theme),
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
send({ id: message.id, ok: false, error: 'Unknown action' });
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
send({ id: message.id, ok: false, error: (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : String(error) });
|
|
84
|
+
}
|
|
85
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type Theme = 'light' | 'dark';
|
|
2
|
+
export declare function setMermaidWorkerClientDebug(enabled: boolean): void;
|
|
3
|
+
export declare function setMermaidWorkerMaxConcurrency(value: number): void;
|
|
4
|
+
export declare function getMermaidWorkerLoad(): {
|
|
5
|
+
inFlight: number;
|
|
6
|
+
max: number;
|
|
7
|
+
};
|
|
8
|
+
export declare const MERMAID_WORKER_BUSY_CODE = "WORKER_BUSY";
|
|
9
|
+
export declare const MERMAID_DISABLED_CODE = "MERMAID_DISABLED";
|
|
10
|
+
export declare function setMermaidWorker(nextWorker: Worker): void;
|
|
11
|
+
export declare function clearMermaidWorker(): void;
|
|
12
|
+
export declare function canParseOffthread(code: string, theme: Theme, timeout?: number): Promise<boolean>;
|
|
13
|
+
export declare function findPrefixOffthread(code: string, theme: Theme, timeout?: number): Promise<string>;
|
|
14
|
+
export declare function terminateWorker(): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=mermaidWorkerClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mermaidWorkerClient.d.ts","sourceRoot":"","sources":["../../src/workers/mermaidWorkerClient.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;AAc7B,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,QAE3D;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,QAG3D;AAED,wBAAgB,oBAAoB;;;EAEnC;AAED,eAAO,MAAM,wBAAwB,gBAAgB,CAAA;AACrD,eAAO,MAAM,qBAAqB,qBAAqB,CAAA;AAEvD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,QAoDlD;AAED,wBAAgB,kBAAkB,SAcjC;AAgFD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,SAAO,oBAEjF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,SAAO,mBAEnF;AAED,wBAAgB,eAAe,SAY9B"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { isMermaidEnabled } from '../optional/mermaid';
|
|
2
|
+
let worker = null;
|
|
3
|
+
let workerInitError = null;
|
|
4
|
+
const rpcMap = new Map();
|
|
5
|
+
let maxConcurrency = 5;
|
|
6
|
+
let debugClient = false;
|
|
7
|
+
export function setMermaidWorkerClientDebug(enabled) {
|
|
8
|
+
debugClient = !!enabled;
|
|
9
|
+
}
|
|
10
|
+
export function setMermaidWorkerMaxConcurrency(value) {
|
|
11
|
+
if (Number.isFinite(value) && value > 0)
|
|
12
|
+
maxConcurrency = Math.floor(value);
|
|
13
|
+
}
|
|
14
|
+
export function getMermaidWorkerLoad() {
|
|
15
|
+
return { inFlight: rpcMap.size, max: maxConcurrency };
|
|
16
|
+
}
|
|
17
|
+
export const MERMAID_WORKER_BUSY_CODE = 'WORKER_BUSY';
|
|
18
|
+
export const MERMAID_DISABLED_CODE = 'MERMAID_DISABLED';
|
|
19
|
+
export function setMermaidWorker(nextWorker) {
|
|
20
|
+
worker = nextWorker;
|
|
21
|
+
workerInitError = null;
|
|
22
|
+
const current = nextWorker;
|
|
23
|
+
worker.onmessage = (event) => {
|
|
24
|
+
if (worker !== current)
|
|
25
|
+
return;
|
|
26
|
+
const { id, ok, result, error } = event.data || {};
|
|
27
|
+
const active = rpcMap.get(id);
|
|
28
|
+
if (!active)
|
|
29
|
+
return;
|
|
30
|
+
if (ok === false || error)
|
|
31
|
+
active.reject(new Error(error || 'Unknown error'));
|
|
32
|
+
else
|
|
33
|
+
active.resolve(result);
|
|
34
|
+
};
|
|
35
|
+
worker.onerror = (event) => {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
if (worker !== current)
|
|
38
|
+
return;
|
|
39
|
+
if (rpcMap.size === 0) {
|
|
40
|
+
(_a = console.debug) === null || _a === void 0 ? void 0 : _a.call(console, '[markstream-svelte:mermaidWorkerClient] Worker error (idle):', (event === null || event === void 0 ? void 0 : event.message) || event);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
if (debugClient)
|
|
45
|
+
console.error('[markstream-svelte:mermaidWorkerClient] Worker error:', (event === null || event === void 0 ? void 0 : event.message) || event);
|
|
46
|
+
else
|
|
47
|
+
(_b = console.debug) === null || _b === void 0 ? void 0 : _b.call(console, '[markstream-svelte:mermaidWorkerClient] Worker error:', (event === null || event === void 0 ? void 0 : event.message) || event);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Ignore logging failures.
|
|
51
|
+
}
|
|
52
|
+
for (const [, active] of rpcMap.entries())
|
|
53
|
+
active.reject(new Error(`Worker error: ${event.message}`));
|
|
54
|
+
rpcMap.clear();
|
|
55
|
+
};
|
|
56
|
+
worker.onmessageerror = (event) => {
|
|
57
|
+
var _a;
|
|
58
|
+
if (worker !== current)
|
|
59
|
+
return;
|
|
60
|
+
if (rpcMap.size === 0) {
|
|
61
|
+
(_a = console.debug) === null || _a === void 0 ? void 0 : _a.call(console, '[markstream-svelte:mermaidWorkerClient] Worker messageerror (idle):', event);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
for (const [, active] of rpcMap.entries())
|
|
65
|
+
active.reject(new Error('Worker messageerror'));
|
|
66
|
+
rpcMap.clear();
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function clearMermaidWorker() {
|
|
70
|
+
var _a;
|
|
71
|
+
if (worker) {
|
|
72
|
+
try {
|
|
73
|
+
for (const [, active] of rpcMap.entries())
|
|
74
|
+
active.reject(new Error('Worker cleared'));
|
|
75
|
+
rpcMap.clear();
|
|
76
|
+
(_a = worker.terminate) === null || _a === void 0 ? void 0 : _a.call(worker);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Ignore worker termination failures.
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
worker = null;
|
|
83
|
+
workerInitError = null;
|
|
84
|
+
}
|
|
85
|
+
function ensureWorker() {
|
|
86
|
+
if (worker)
|
|
87
|
+
return worker;
|
|
88
|
+
workerInitError = new Error('[markstream-svelte:mermaidWorkerClient] No worker instance set. Please inject a Worker via setMermaidWorker().');
|
|
89
|
+
workerInitError.name = 'WorkerInitError';
|
|
90
|
+
workerInitError.code = 'WORKER_INIT_ERROR';
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function callWorker(action, payload, timeout = 1400) {
|
|
94
|
+
if (!isMermaidEnabled()) {
|
|
95
|
+
const error = new Error('Mermaid rendering disabled');
|
|
96
|
+
error.name = 'MermaidDisabled';
|
|
97
|
+
error.code = MERMAID_DISABLED_CODE;
|
|
98
|
+
return Promise.reject(error);
|
|
99
|
+
}
|
|
100
|
+
if (workerInitError)
|
|
101
|
+
return Promise.reject(workerInitError);
|
|
102
|
+
const activeWorker = ensureWorker();
|
|
103
|
+
if (!activeWorker)
|
|
104
|
+
return Promise.reject(workerInitError);
|
|
105
|
+
if (rpcMap.size >= maxConcurrency) {
|
|
106
|
+
const error = new Error('Worker busy');
|
|
107
|
+
error.name = 'WorkerBusy';
|
|
108
|
+
error.code = MERMAID_WORKER_BUSY_CODE;
|
|
109
|
+
error.inFlight = rpcMap.size;
|
|
110
|
+
error.max = maxConcurrency;
|
|
111
|
+
return Promise.reject(error);
|
|
112
|
+
}
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
const id = Math.random().toString(36).slice(2);
|
|
115
|
+
let settled = false;
|
|
116
|
+
let timeoutId = null;
|
|
117
|
+
const cleanup = () => {
|
|
118
|
+
if (settled)
|
|
119
|
+
return;
|
|
120
|
+
settled = true;
|
|
121
|
+
if (timeoutId != null)
|
|
122
|
+
clearTimeout(timeoutId);
|
|
123
|
+
rpcMap.delete(id);
|
|
124
|
+
};
|
|
125
|
+
rpcMap.set(id, {
|
|
126
|
+
resolve: (value) => {
|
|
127
|
+
cleanup();
|
|
128
|
+
resolve(value);
|
|
129
|
+
},
|
|
130
|
+
reject: (error) => {
|
|
131
|
+
cleanup();
|
|
132
|
+
reject(error);
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
try {
|
|
136
|
+
activeWorker.postMessage({ id, action, payload });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
rpcMap.delete(id);
|
|
140
|
+
reject(error);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
timeoutId = setTimeout(() => {
|
|
144
|
+
const error = new Error('Worker call timed out');
|
|
145
|
+
error.name = 'WorkerTimeout';
|
|
146
|
+
error.code = 'WORKER_TIMEOUT';
|
|
147
|
+
const pending = rpcMap.get(id);
|
|
148
|
+
pending === null || pending === void 0 ? void 0 : pending.reject(error);
|
|
149
|
+
}, timeout);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
export async function canParseOffthread(code, theme, timeout = 1400) {
|
|
153
|
+
return await callWorker('canParse', { code, theme }, timeout);
|
|
154
|
+
}
|
|
155
|
+
export async function findPrefixOffthread(code, theme, timeout = 1400) {
|
|
156
|
+
return await callWorker('findPrefix', { code, theme }, timeout);
|
|
157
|
+
}
|
|
158
|
+
export function terminateWorker() {
|
|
159
|
+
if (worker) {
|
|
160
|
+
try {
|
|
161
|
+
for (const [, active] of rpcMap.entries())
|
|
162
|
+
active.reject(new Error('Worker terminated'));
|
|
163
|
+
rpcMap.clear();
|
|
164
|
+
worker.terminate();
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
worker = null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "markstream-svelte",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.1-beta.1",
|
|
5
|
+
"description": "Svelte Markdown renderer for Markstream, aligned with markstream-vue and markstream-react.",
|
|
6
|
+
"author": "Simon He",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"homepage": "https://github.com/Simon-He95/markstream-vue#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Simon-He95/markstream-vue.git",
|
|
12
|
+
"directory": "packages/markstream-svelte"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/Simon-He95/markstream-vue/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"svelte",
|
|
19
|
+
"markdown",
|
|
20
|
+
"markdown-renderer",
|
|
21
|
+
"streaming-markdown",
|
|
22
|
+
"markstream",
|
|
23
|
+
"markstream-svelte"
|
|
24
|
+
],
|
|
25
|
+
"sideEffects": [
|
|
26
|
+
"**/*.css"
|
|
27
|
+
],
|
|
28
|
+
"svelte": "./dist/index.js",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"svelte": "./dist/index.js",
|
|
33
|
+
"import": "./dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./index.css": "./dist/index.css",
|
|
36
|
+
"./index.px.css": "./dist/index.px.css",
|
|
37
|
+
"./index.tailwind.css": "./dist/index.tailwind.css",
|
|
38
|
+
"./workers/katexRenderer.worker": "./dist/workers/katexRenderer.worker.js",
|
|
39
|
+
"./workers/mermaidParser.worker": "./dist/workers/mermaidParser.worker.js"
|
|
40
|
+
},
|
|
41
|
+
"main": "./dist/index.js",
|
|
42
|
+
"module": "./dist/index.js",
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
44
|
+
"files": [
|
|
45
|
+
"dist"
|
|
46
|
+
],
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@antv/infographic": "^0.2.3",
|
|
49
|
+
"@terrastruct/d2": ">=0.1.33",
|
|
50
|
+
"katex": ">=0.16.22",
|
|
51
|
+
"mermaid": ">=11",
|
|
52
|
+
"stream-monaco": ">=0.0.40",
|
|
53
|
+
"svelte": ">=5"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"@antv/infographic": {
|
|
57
|
+
"optional": true
|
|
58
|
+
},
|
|
59
|
+
"@terrastruct/d2": {
|
|
60
|
+
"optional": true
|
|
61
|
+
},
|
|
62
|
+
"katex": {
|
|
63
|
+
"optional": true
|
|
64
|
+
},
|
|
65
|
+
"mermaid": {
|
|
66
|
+
"optional": true
|
|
67
|
+
},
|
|
68
|
+
"stream-monaco": {
|
|
69
|
+
"optional": true
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"dependencies": {
|
|
73
|
+
"@floating-ui/dom": "^1.7.6",
|
|
74
|
+
"stream-markdown-parser": "0.0.92"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@sveltejs/package": "^2.5.7",
|
|
78
|
+
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
79
|
+
"@types/node": "^18.19.130",
|
|
80
|
+
"autoprefixer": "^10.4.27",
|
|
81
|
+
"postcss-cli": "^11.0.1",
|
|
82
|
+
"svelte": "^5.55.5",
|
|
83
|
+
"svelte-check": "^4.4.8",
|
|
84
|
+
"tailwindcss": "^3.4.19",
|
|
85
|
+
"typescript": "^5.9.3",
|
|
86
|
+
"vite": "^7.3.1"
|
|
87
|
+
},
|
|
88
|
+
"scripts": {
|
|
89
|
+
"build": "svelte-package -i src -o dist && postcss src/index.css -o dist/index.css && cp dist/index.css dist/index.tailwind.css && node ../../scripts/generate-px-css.mjs",
|
|
90
|
+
"dev": "vite dev",
|
|
91
|
+
"preview": "vite preview",
|
|
92
|
+
"typecheck": "svelte-check --tsconfig ./tsconfig.json",
|
|
93
|
+
"release": "bumpp --commit --no-tag --no-push && pnpm publish --access public && node ../../scripts/tag-package.mjs --package-json package.json --push"
|
|
94
|
+
}
|
|
95
|
+
}
|