@forsakringskassan/docs-generator 2.25.0 → 2.26.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/dist/compile-example.js +2 -2
- package/dist/{create-markdown-renderer-CoJjMIzN.js → create-markdown-renderer-BaB7AmXn.js} +63 -54
- package/dist/create-markdown-renderer-BaB7AmXn.js.map +1 -0
- package/dist/index.js +21 -6
- package/dist/index.js.map +1 -1
- package/dist/markdown.d.ts +2 -0
- package/dist/markdown.js +3 -3
- package/dist/runtime.js +1 -1
- package/dist/style/core.css +1 -0
- package/dist/style/index.css +1 -0
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/{vendor-y4sQkzVC.js → vendor-CIZoJHXd.js} +9 -4
- package/dist/vendor-CIZoJHXd.js.map +1 -0
- package/dist/{vue3-DXIVBodU.js → vue3-CkmHk7uJ.js} +2 -2
- package/dist/{vue3-DXIVBodU.js.map → vue3-CkmHk7uJ.js.map} +1 -1
- package/package.json +1 -1
- package/dist/create-markdown-renderer-CoJjMIzN.js.map +0 -1
- package/dist/vendor-y4sQkzVC.js.map +0 -1
package/dist/compile-example.js
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
var path$1 = require('node:path');
|
|
4
4
|
var esbuild = require('esbuild');
|
|
5
5
|
var vue = require('vue');
|
|
6
|
-
var vue3 = require('./vue3-
|
|
6
|
+
var vue3 = require('./vue3-CkmHk7uJ.js');
|
|
7
7
|
var path = require('node:path/posix');
|
|
8
8
|
require('node:crypto');
|
|
9
9
|
require('@vue/compiler-sfc');
|
|
10
|
-
require('./vendor-
|
|
10
|
+
require('./vendor-CIZoJHXd.js');
|
|
11
11
|
require('node:url');
|
|
12
12
|
require('fs');
|
|
13
13
|
require('node:fs');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var vendor = require('./vendor-
|
|
3
|
+
var vendor = require('./vendor-CIZoJHXd.js');
|
|
4
4
|
var path = require('node:path/posix');
|
|
5
5
|
var path$1 = require('node:path');
|
|
6
6
|
require('crypto');
|
|
@@ -8,7 +8,7 @@ var crypto = require('node:crypto');
|
|
|
8
8
|
require('node:child_process');
|
|
9
9
|
var fs = require('node:fs');
|
|
10
10
|
var vue = require('vue');
|
|
11
|
-
var vue3 = require('./vue3-
|
|
11
|
+
var vue3 = require('./vue3-CkmHk7uJ.js');
|
|
12
12
|
|
|
13
13
|
function isDocumentPage(doc) {
|
|
14
14
|
return doc.kind === "page";
|
|
@@ -122,20 +122,6 @@ function parseImport(raw) {
|
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
function getExampleImport(searchDirs, filename) {
|
|
126
|
-
const pattern = searchDirs.map((dir) => `${dir}/**/${filename}`);
|
|
127
|
-
const matches = vendor.globSync(pattern);
|
|
128
|
-
if (matches.length === 0) {
|
|
129
|
-
const message = `No files matched import "${filename}"`;
|
|
130
|
-
throw new Error(message);
|
|
131
|
-
} else if (matches.length > 1) {
|
|
132
|
-
const message = `Multiple files matched import "${filename}"`;
|
|
133
|
-
throw new Error(message);
|
|
134
|
-
} else {
|
|
135
|
-
return normalizePath(matches[0]);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
125
|
function getExampleName(filename) {
|
|
140
126
|
return path$1.parse(filename).name;
|
|
141
127
|
}
|
|
@@ -152,13 +138,10 @@ function vueGenerator() {
|
|
|
152
138
|
}
|
|
153
139
|
}
|
|
154
140
|
function generateExample(options) {
|
|
155
|
-
const { language } = options;
|
|
141
|
+
const { language, fileMatcher } = options;
|
|
156
142
|
if (language === "import") {
|
|
157
143
|
const parsed = parseImport(options.source);
|
|
158
|
-
const filename =
|
|
159
|
-
options.exampleFolders,
|
|
160
|
-
parsed.filename
|
|
161
|
-
);
|
|
144
|
+
const filename = fileMatcher(parsed.filename, "when importing example");
|
|
162
145
|
const language2 = parsed.extension;
|
|
163
146
|
const comments = parsed.comments;
|
|
164
147
|
const content = fs.readFileSync(filename, "utf-8");
|
|
@@ -554,44 +537,68 @@ function getStandalonePath(output) {
|
|
|
554
537
|
const { dir, name } = path$1.parse(output);
|
|
555
538
|
return path$1.join(dir, `${name}.html`);
|
|
556
539
|
}
|
|
557
|
-
function
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
throw new Error(
|
|
564
|
-
`Failed to find referenced example "${compare.value}"`
|
|
565
|
-
);
|
|
566
|
-
}
|
|
567
|
-
const a = transformCode(reference.content, reference.language);
|
|
568
|
-
const b = transformCode(content, language);
|
|
569
|
-
const diff = vendor.createTwoFilesPatch("a", "b", a, b, "", "", {
|
|
570
|
-
context: context ? parseInt(context, 10) : 3
|
|
571
|
-
}).split("\n").slice(4).join("\n");
|
|
572
|
-
return {
|
|
573
|
-
source: diff,
|
|
574
|
-
language: "diff"
|
|
575
|
-
};
|
|
540
|
+
function ensureTrailingNewline(text) {
|
|
541
|
+
if (text.endsWith("\n")) {
|
|
542
|
+
return text;
|
|
543
|
+
} else {
|
|
544
|
+
return `${text}
|
|
545
|
+
`;
|
|
576
546
|
}
|
|
577
|
-
return { source: content, language };
|
|
578
547
|
}
|
|
579
548
|
function codePreview(options) {
|
|
580
|
-
const { generateExample } = options;
|
|
549
|
+
const { generateExample, getImportedSource } = options;
|
|
581
550
|
return (md) => {
|
|
582
551
|
md.renderer.rules.fence = fence.bind(void 0, md);
|
|
583
552
|
};
|
|
553
|
+
function getSource(content, language, tags, env) {
|
|
554
|
+
const { namedExamples } = env;
|
|
555
|
+
if (language === "import") {
|
|
556
|
+
const parsed = parseImport(content);
|
|
557
|
+
const importedContent = getImportedSource(parsed.filename);
|
|
558
|
+
return getSource(importedContent, parsed.extension, tags, env);
|
|
559
|
+
}
|
|
560
|
+
const compare = findTag(tags, "compare");
|
|
561
|
+
if (compare && compare.value !== null) {
|
|
562
|
+
const { value: context } = findTag(tags, "context") ?? {};
|
|
563
|
+
const reference = namedExamples.get(compare.value);
|
|
564
|
+
if (!reference) {
|
|
565
|
+
throw new Error(
|
|
566
|
+
`Failed to find referenced example "${compare.value}"`
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
const a = ensureTrailingNewline(
|
|
570
|
+
transformCode(reference.content, reference.language)
|
|
571
|
+
);
|
|
572
|
+
const b = ensureTrailingNewline(transformCode(content, language));
|
|
573
|
+
const diff = vendor.createTwoFilesPatch("a", "b", a, b, "", "", {
|
|
574
|
+
context: context ? parseInt(context, 10) : 3,
|
|
575
|
+
ignoreWhitespace: true
|
|
576
|
+
}).split("\n").slice(4).join("\n");
|
|
577
|
+
return {
|
|
578
|
+
source: diff,
|
|
579
|
+
language: "diff"
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
return { source: content, language };
|
|
583
|
+
}
|
|
584
584
|
function fence(_md, tokens, idx, _options, env) {
|
|
585
585
|
const { fileInfo } = env;
|
|
586
586
|
const { content: rawContent, info, map } = tokens[idx];
|
|
587
587
|
const { language: rawLanguage, tags: rawTags } = parseInfostring(info);
|
|
588
|
+
const { source, language } = getSource(
|
|
589
|
+
rawContent,
|
|
590
|
+
rawLanguage,
|
|
591
|
+
rawTags,
|
|
592
|
+
env
|
|
593
|
+
);
|
|
588
594
|
const name = findTag(rawTags, "name")?.value;
|
|
589
595
|
if (name) {
|
|
590
596
|
env.namedExamples.set(name, {
|
|
591
597
|
name,
|
|
592
598
|
tags: rawTags,
|
|
593
|
-
content
|
|
594
|
-
|
|
599
|
+
/* store original raw content unless it is an imported example */
|
|
600
|
+
content: rawLanguage === "import" ? source : rawContent,
|
|
601
|
+
language: rawLanguage === "import" ? language : rawLanguage
|
|
595
602
|
});
|
|
596
603
|
}
|
|
597
604
|
if (hasTag(rawTags, "hidden")) {
|
|
@@ -605,12 +612,6 @@ function codePreview(options) {
|
|
|
605
612
|
`
|
|
606
613
|
);
|
|
607
614
|
}
|
|
608
|
-
const { source, language } = getSource(
|
|
609
|
-
rawContent,
|
|
610
|
-
rawLanguage,
|
|
611
|
-
rawTags,
|
|
612
|
-
env
|
|
613
|
-
);
|
|
614
615
|
const example = generateExample({
|
|
615
616
|
source,
|
|
616
617
|
language,
|
|
@@ -1044,9 +1045,16 @@ function containerRenderer(doc, docs, env, included, handleSoftError, options) {
|
|
|
1044
1045
|
}
|
|
1045
1046
|
|
|
1046
1047
|
function paragraph() {
|
|
1048
|
+
const renderToken = (...args) => {
|
|
1049
|
+
const [tokens, idx, options, , self] = args;
|
|
1050
|
+
return self.renderToken(tokens, idx, options);
|
|
1051
|
+
};
|
|
1047
1052
|
return function(md) {
|
|
1048
|
-
md.renderer.rules.paragraph_open
|
|
1049
|
-
md.renderer.rules.
|
|
1053
|
+
const renderRule = md.renderer.rules.paragraph_open ?? renderToken;
|
|
1054
|
+
md.renderer.rules.paragraph_open = (tokens, idx, index, env, self) => {
|
|
1055
|
+
tokens[idx].attrJoin("class", "docs-paragraph");
|
|
1056
|
+
return renderRule(tokens, idx, index, env, self);
|
|
1057
|
+
};
|
|
1050
1058
|
};
|
|
1051
1059
|
}
|
|
1052
1060
|
|
|
@@ -1100,7 +1108,8 @@ function createMarkdownRenderer(options) {
|
|
|
1100
1108
|
md.use(vendor.deflist_plugin);
|
|
1101
1109
|
md.use(
|
|
1102
1110
|
codePreview({
|
|
1103
|
-
generateExample: options.generateExample
|
|
1111
|
+
generateExample: options.generateExample,
|
|
1112
|
+
getImportedSource: options.getImportedSource
|
|
1104
1113
|
})
|
|
1105
1114
|
);
|
|
1106
1115
|
md.use(headingLevel({ initialLevel: 1 }));
|
|
@@ -1155,4 +1164,4 @@ exports.htmlencode = htmlencode;
|
|
|
1155
1164
|
exports.isDocumentPage = isDocumentPage;
|
|
1156
1165
|
exports.normalizePath = normalizePath;
|
|
1157
1166
|
exports.parseInfostring = parseInfostring;
|
|
1158
|
-
//# sourceMappingURL=create-markdown-renderer-
|
|
1167
|
+
//# sourceMappingURL=create-markdown-renderer-BaB7AmXn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-markdown-renderer-BaB7AmXn.js","sources":["../src/document/is-document-page.ts","../src/utils/find-document.ts","../src/utils/find-tag.ts","../src/utils/generate-id.ts","../src/utils/get-fingerprint.ts","../src/utils/normalize-path.ts","../src/utils/get-output-filepath.ts","../src/utils/has-tag.ts","../src/utils/htmlencode.ts","../src/utils/parse-import.ts","../src/examples/get-example-name.ts","../src/examples/generate-example.ts","../src/examples/normalize-language.ts","../src/examples/parse-infostring.ts","../src/examples/transform-code.ts","../src/render/soft-error.ts","../src/render/process-inline-tags.ts","../src/render/inline-tags/link.ts","../src/render/inline-tags/optional.ts","../src/render/inline-tags/index.ts","../src/render/markdown/utils/find-test-id.ts","../src/render/markdown/utils/highlight.ts","../src/render/markdown/utils/replace-at-link.ts","../src/render/markdown/code-preview.ts","../src/render/markdown/heading-level.ts","../src/render/markdown/image-resources.ts","../src/render/markdown/container/alt-container.ts","../src/render/markdown/container/api-container.ts","../src/render/markdown/container/details-container.ts","../src/render/markdown/container/messagebox-container.ts","../src/render/markdown/container-renderer.ts","../src/render/markdown/paragraph.ts","../src/render/markdown/table.ts","../src/render/markdown/code-inline.ts","../src/render/create-markdown-renderer.ts"],"sourcesContent":["import { type Document } from \"./document\";\nimport { type DocumentPage } from \"./document-page\";\n\n/**\n * @internal\n */\nexport function isDocumentPage(doc: Document): doc is DocumentPage {\n return doc.kind === \"page\";\n}\n","import { type Document } from \"../document\";\n\n/**\n * Find a document by id, name or alias.\n *\n * In case multiple document matches the \"first\" match is returned but the order\n * is in no way guaranteed so results may change over time.\n *\n * @internal\n * @param haystack - All available documents.\n * @param needle - What to search for.\n * @returns Matching document or `null` if no document matches.\n */\nexport function findDocument(\n haystack: Document[],\n needle: string,\n): Document | null {\n const match = haystack.find((it) => {\n if (it.id === needle) {\n return true;\n }\n if (it.name === needle) {\n return true;\n }\n if (it.alias.includes(needle)) {\n return true;\n }\n return false;\n });\n return match ?? null;\n}\n","/**\n * From a list of parsed tags in an infoline find a specific tag.\n *\n * @internal\n */\nexport function findTag(\n tags: string[],\n tag: string,\n): { tag: string; value: string | null } | null {\n const match = tags.find((it) => it === tag || it.startsWith(`${tag}=`));\n if (!match) {\n return null;\n }\n if (match === tag) {\n return { tag, value: null };\n } else {\n return { tag, value: match.slice(tag.length + 1) };\n }\n}\n","const replacements = {\n å: \"a\",\n ä: \"a\",\n ö: \"o\",\n};\n\nfunction findVersion(text: string): [number, number, number] | null {\n const match = text.match(/(\\d+)\\.(\\d+)\\.(\\d+) \\(\\d+-\\d+-\\d+\\)/);\n if (match) {\n return [\n parseInt(match[1], 10),\n parseInt(match[2], 10),\n parseInt(match[3], 10),\n ];\n } else {\n return null;\n }\n}\n\n/**\n * Generate a URL safe id from a text, suitable to use with headings etc.\n *\n * @internal\n */\nexport function generateId(text: string): string {\n const version = findVersion(text);\n if (version) {\n return `v${version.join(\"-\")}`;\n }\n return text\n .toLowerCase()\n .trim()\n .replace(/[åäö]/g, (m) => replacements[m as keyof typeof replacements]) // åäö to aao\n .replace(/[^a-z0-9]+/g, \"_\") // non-alphanum to dashes\n .replace(/^_+/, \"\") // remove leading dashes\n .replace(/_+$/, \"\"); // remove trailing dashes\n}\n","import crypto from \"node:crypto\";\n\nexport function getFingerprint(source: string): string {\n return crypto.createHash(\"md5\").update(source).digest(\"hex\").slice(0, 6);\n}\n","import path from \"node:path/posix\";\n\n/**\n * @internal\n */\nexport function normalizePath(...pathSegments: string[]): string {\n const filePath = path.join(...pathSegments);\n return path.normalize(filePath).replace(/\\\\/g, \"/\");\n}\n","import { normalizePath } from \"./normalize-path\";\n\nexport interface FileInfoLike {\n path: string;\n outputName: string | false;\n}\n\n/**\n * Get the final output filename.\n *\n * @internal\n */\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike & { outputName: string },\n): string;\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike & { outputName: false },\n): null;\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike,\n): string | null;\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike,\n): string | null {\n const { path, outputName } = fileInfo;\n if (outputName === false) {\n return null;\n }\n return normalizePath(outputFolder, path, outputName);\n}\n","/**\n * Tell if a specific tag is present in a list of parsed tags in an infoline.\n *\n * @internal\n */\nexport function hasTag(tags: string[], tag: string): boolean {\n const match = tags.find((it) => it === tag || it.startsWith(`${tag}=`));\n return Boolean(match);\n}\n","const replacement: Record<string, string> = {\n \"<\": `<`,\n \">\": `>`,\n \"&\": `&`,\n '\"': `"`,\n \"'\": `'`,\n};\n\n/**\n * Encodes symbols as HTML entities:\n *\n * - `<`\n * - `>`\n * - `&`\n * - `\"`\n * - `'`\n *\n * @internal\n */\nexport function htmlencode(text: string): string {\n return text.replace(/[<>&\"']/g, (m) => {\n return replacement[m];\n });\n}\n","import path from \"node:path\";\n\nexport interface ParsedImport {\n filename: string;\n extension: string;\n comments: string[];\n}\n\nexport function parseImport(raw: string): ParsedImport {\n const comments: string[] = [];\n let stripped = raw;\n let previous;\n do {\n previous = stripped;\n stripped = stripped.replace(/<!--.*?-->/gms, (match) => {\n comments.push(match);\n return \"\";\n });\n } while (stripped !== previous);\n const filename = stripped.trim();\n const extension = path.parse(filename).ext.slice(1);\n return {\n filename,\n extension,\n comments,\n };\n}\n","import path from \"node:path\";\n\n/**\n * Get name without path and extension.\n *\n * @internal\n */\nexport function getExampleName(filename: string): string {\n return path.parse(filename).name;\n}\n","import fs from \"node:fs\";\nimport { version } from \"vue\";\nimport { generateCode as vue3 } from \"plugin-vue3\";\nimport { getFingerprint, parseImport } from \"../utils\";\nimport { type ExampleOptions } from \"./example-options\";\nimport { type ExampleResult } from \"./example-result\";\nimport { getExampleName } from \"./get-example-name\";\n\nconst vueMajor = parseInt(version.split(\".\", 2)[0], 10) as 2 | 3;\n\nfunction vueGenerator(): typeof vue3 {\n switch (vueMajor) {\n case 2:\n throw new Error(\n \"Vue 2 is no longer supported, upgrade to Vue 3 or downgrade docs-generator\",\n );\n case 3:\n return vue3;\n }\n}\n\n/**\n * @internal\n */\nexport function generateExample(options: ExampleOptions): ExampleResult {\n const { language, fileMatcher } = options;\n\n if (language === \"import\") {\n const parsed = parseImport(options.source);\n const filename = fileMatcher(parsed.filename, \"when importing example\");\n const language = parsed.extension;\n const comments = parsed.comments;\n const content = fs.readFileSync(filename, \"utf-8\");\n const example = generateExample({\n ...options,\n source: content,\n language,\n filename,\n });\n return { ...example, comments };\n }\n\n switch (language) {\n case \"vue\":\n return generateVueExample(options);\n case \"html\":\n return generateStaticExample(options);\n default:\n return generateStaticExample(options);\n }\n}\n\nfunction generateVueExample(options: ExampleOptions): ExampleResult {\n const { filename, source, parent, setupPath, tags } = options;\n const fn = vueGenerator();\n const slug = getExampleName(filename);\n const fingerprint = getFingerprint(source);\n const { markup, sourcecode, output } = fn({\n filename,\n slug,\n fingerprint,\n code: source,\n setupPath,\n });\n if (output) {\n return {\n source,\n language: options.language,\n comments: [],\n tags,\n markup,\n output,\n runtime: true,\n task: {\n outputFile: output,\n sourcecode,\n sourceFile: filename,\n parent,\n },\n };\n } else {\n return {\n source: sourcecode,\n language: \"plaintext\",\n comments: [],\n tags,\n markup,\n output: null,\n runtime: true,\n task: null,\n };\n }\n}\n\nfunction generateStaticExample(options: ExampleOptions): ExampleResult {\n const { filename, source, language, tags } = options;\n const slug = getExampleName(filename);\n const fingerprint = getFingerprint(source);\n const asset = `${slug}-${fingerprint}.${language}`;\n const runtimeLanguages = [\"html\"];\n const runtime = runtimeLanguages.includes(language);\n return {\n source,\n language: options.language,\n comments: [],\n tags,\n markup: source,\n output: runtime ? asset : null,\n runtime,\n task: null,\n };\n}\n","/**\n * @internal\n */\nexport function normalizeLanguage(lang: string): string {\n switch (lang) {\n case \"ts\":\n return \"typescript\";\n case \"js\":\n return \"javascript\";\n default:\n return lang;\n }\n}\n","import { normalizeLanguage } from \"./normalize-language\";\n\n/**\n * Parse a markdown infostring from a code fence.\n *\n * @internal\n */\nexport function parseInfostring(infostring: string): {\n language: string;\n tags: string[];\n} {\n const [rawLanguage, ...rawTags] = infostring.trim().split(/\\s+/);\n return {\n language: normalizeLanguage(rawLanguage),\n tags: rawTags,\n };\n}\n","import dedent from \"dedent\";\nimport { normalizeLanguage } from \"./normalize-language\";\n\nfunction removeLinesInline(\n lines: string[],\n { begin, end }: { begin: number; end: number },\n): void {\n /* remove lines by blanking them (when the lines are later joined these\n * blank lines end up being nothing */\n for (let i = begin; i <= end; i++) {\n lines[i] = \"\";\n }\n\n /* if the previous line is just a blank line we remove that as well */\n if (lines[begin - 1] === \"\\n\") {\n lines[begin - 1] = \"\";\n begin--;\n }\n\n /* if the next line is just a blank line we remove that as well */\n if (lines[end + 1] === \"\\n\") {\n lines[end + 1] = \"\";\n }\n\n /* remove the trailing newline from the new last line or we end up with an\n * extra newline at the end of the string that wasn't there before */\n if (end === lines.length - 1 && begin > 0) {\n lines[begin - 1] = lines[begin - 1].slice(0, -1);\n }\n}\n\nfunction cutSnippets(code: string): string {\n const lines = code\n .split(/\\n/)\n .map((it, index, lines) => (index < lines.length - 1 ? `${it}\\n` : it));\n const directive =\n /(?:\\/\\* +--- +cut (?<js>above|below|begin|end) +--- +\\*\\/|<!---? +cut (?<html>above|below|begin|end) +---?>)/;\n\n let buffer = -1;\n lines.forEach((line, index) => {\n const match = line.match(directive);\n const { js, html } = match?.groups ?? { js: null, html: null };\n const instruction = js ?? html;\n if (!instruction) {\n return;\n }\n switch (instruction) {\n /* --- cut above --- */\n case \"above\":\n /* remove all lines above (including this one) */\n removeLinesInline(lines, {\n begin: 0,\n end: index,\n });\n break;\n /* --- cut below --- */\n case \"below\":\n /* remove all lines below (including this one) */\n removeLinesInline(lines, {\n begin: index,\n end: lines.length - 1,\n });\n break;\n /* --- cut begin --- */\n case \"begin\":\n /* here we only hold on to the line number until we\n * encounter the end instruction */\n if (buffer === -1) {\n buffer = index;\n }\n break;\n /* --- cut end --- */\n case \"end\":\n removeLinesInline(lines, {\n begin: Math.max(buffer, 0),\n end: index,\n });\n buffer = -1;\n break;\n default:\n break;\n }\n });\n\n /* if cut begin was used without end we still have the line number buffered\n * and should interpret it as cut below, i.e. we remove all lines from begin\n * and down */\n if (buffer >= 0) {\n removeLinesInline(lines, {\n begin: buffer,\n end: lines.length - 1,\n });\n }\n\n return lines.join(\"\");\n}\n\nfunction stripEslintComments(code: string): string {\n /* matches an eslint comment occupying the whole line (entire line including\n * newline is removed) */\n const matchLine =\n /^[ \\t]*(\\/\\* eslint-disable[^*]*\\*\\/|\\/\\/ eslint-disable.*)\\n/gm;\n\n /* matches an eslint comment embedded with other statements (only the\n * commend and whitespace before it is removed) */\n const matchEmbedded =\n /[ \\t]*(\\/\\* eslint-disable[^*]*\\*\\/|\\/\\/ eslint-disable.*)/g;\n\n return code.replace(matchLine, \"\").replace(matchEmbedded, \"\");\n}\n\nfunction maybeDedent(value: string): string {\n /* if the string is only whitespace we preserve it exactly as is */\n if (/^\\s*$/.test(value)) {\n return value;\n }\n\n /* Conditionally calling dedent due to\n * https://github.com/dmnd/dedent/issues/20\n *\n * - If the first line is indented we dedent the string as usual.\n *\n * - If the first line is not indented the dedention should be a no-op as\n * the indentation level is zero already but the referenced bug causes\n * `dedent` to pick up any other indented line as basis for the current\n * indentation level and thus removes to much.\n *\n * Consider the following input:\n *\n * ```\n * function foo() {\n * return \"...\";\n * }\n * ```\n *\n * The expected output is the same as the input.\n */\n if (/^\\s/.test(value)) {\n return dedent(value);\n } else {\n return value;\n }\n}\n\n/* transformations to apply based on language, transforms are run from left to right */\nconst transformations: Record<string, Array<(code: string) => string>> = {\n html: [cutSnippets, maybeDedent],\n vue: [cutSnippets, maybeDedent],\n javascript: [cutSnippets, stripEslintComments, maybeDedent],\n typescript: [cutSnippets, stripEslintComments, maybeDedent],\n};\n\nexport function transformCode(code: string, lang: string): string {\n const normalizedLanguage = normalizeLanguage(lang);\n const fns = transformations[normalizedLanguage] ?? [];\n for (const fn of fns) {\n code = fn(code);\n }\n return code;\n}\n","/**\n * @public\n */\nexport interface SoftErrorDetails {\n ELINKTARGET: { key: string; hash: string; title: string };\n ELINKFORMAT: undefined;\n ELINKPARTIAL: { key: string; hash: string; title: string };\n EINCLUDETARGET: { id: string };\n EINCLUDERECURSION: undefined;\n ETAGMISSING: undefined;\n}\n\n/**\n * @public\n */\nexport type SoftErrorCode = keyof SoftErrorDetails;\n\n/**\n * A soft error than can be recovered from.\n *\n * @public\n */\nexport class SoftError<T extends SoftErrorCode> extends Error {\n public readonly code: T;\n public readonly details: SoftErrorDetails[T];\n\n /**\n * @internal\n */\n public constructor(\n code: T,\n message: string,\n ...args: SoftErrorDetails[T] extends undefined\n ? []\n : [SoftErrorDetails[T]]\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n const [details] = args;\n this.details = details as typeof this.details;\n }\n}\n\n/**\n * @public\n */\nexport type SoftErrorType = {\n [T in SoftErrorCode]: SoftError<T>;\n}[SoftErrorCode];\n","import { type Document, type DocumentPage } from \"../document\";\nimport { type InlineTag } from \"./inline-tags\";\nimport { SoftError, type SoftErrorType } from \"./soft-error\";\n\n/**\n * @internal\n */\nexport function processInlineTags(\n tags: InlineTag[],\n doc: DocumentPage,\n docs: Document[],\n text: string,\n handleSoftError: (error: SoftErrorType) => string,\n): string {\n return text.replace(/{@(@?)([^{}]+)}/g, (_, escape, content) => {\n if (escape) {\n return `{@${content}}`;\n }\n const match = content.match(/^(\\S+)($|\\s[^]+)$/);\n\n /* istanbul ignore next: should never happen but just in case this is a\n * better fallback than crashing */\n if (!match) {\n return `{@${content}}`;\n }\n\n const [, name, text] = match;\n const tag = tags.find((it) => it.name === name);\n if (!tag) {\n return handleSoftError(\n new SoftError(\n \"ETAGMISSING\",\n `No inline tag registered with the name \"${name}\"`,\n ),\n );\n }\n try {\n return tag.handler(doc, docs, text.trim());\n } catch (err) {\n if (err instanceof SoftError) {\n return handleSoftError(err);\n } else {\n throw err;\n }\n }\n });\n}\n","import path from \"node:path/posix\";\nimport { type DocumentPage, isDocumentPage } from \"../../document\";\nimport { SoftError } from \"../soft-error\";\nimport { getOutputFilePath, findDocument } from \"../../utils\";\nimport { type InlineTag } from \"./inline-tag\";\n\nfunction getRelativeUrl(from: DocumentPage, to: DocumentPage): string {\n const fromResolved = getOutputFilePath(\".\", from.fileInfo);\n const toResolved = getOutputFilePath(\".\", to.fileInfo);\n if (!fromResolved || !toResolved) {\n throw new Error(\"Cannot create link to document with no output\");\n }\n\n const fromDir = path.dirname(fromResolved);\n const toDir = path.dirname(toResolved);\n const relative = path.relative(fromDir, toResolved);\n if (fromDir === toDir) {\n return relative === \"index.html\" ? \"./\" : `./${relative}`;\n } else if (relative.endsWith(\"/index.html\")) {\n return path.dirname(relative);\n } else {\n return relative;\n }\n}\n\nfunction getLinkTitle(\n doc: DocumentPage,\n key: string,\n explicitTitle?: string,\n): string {\n if (explicitTitle) {\n return explicitTitle;\n }\n const { title, component } = doc.attributes;\n if (component && component.some((it) => it.name === key)) {\n return `<code>${key}</code>`;\n } else {\n return title ?? doc.name;\n }\n}\n\nexport const linkTag: InlineTag = {\n name: \"link\",\n description: \"Create a link to another document\",\n handler(doc, docs, content) {\n const match = content.match(/^([^\\s#]+)(#\\S+)?\\s*(.+)?$/);\n if (!match) {\n throw new SoftError(\n \"ELINKFORMAT\",\n `Failed to parse link \"${content}\"`,\n );\n }\n const [, key, hash, explicitTitle] = match;\n\n if (key.startsWith(\"http://\") || key.startsWith(\"https://\")) {\n return `<a href=\"${key}${hash ?? \"\"}\">${explicitTitle ?? key}</a>`;\n }\n\n const linked = findDocument(docs, key);\n if (!linked) {\n throw new SoftError(\n \"ELINKTARGET\",\n `Failed to find linked document \"${key}\"`,\n {\n key,\n hash,\n title: explicitTitle,\n },\n );\n }\n\n /* if the document we are trying to linkt to is not a page document we\n * cannot link to it as we don't know the url (i.e. what page it exists\n * on or even if it is included on any page at all)\n */\n if (!isDocumentPage(linked)) {\n throw new SoftError(\n \"ELINKPARTIAL\",\n `Cannot link to partial document \"${key}\"`,\n {\n key,\n hash,\n title: explicitTitle,\n },\n );\n }\n\n const url = getRelativeUrl(doc, linked);\n const title = getLinkTitle(linked, key, explicitTitle);\n return `<a href=\"${url}${hash ?? \"\"}\">${title}</a>`;\n },\n};\n","import { type InlineTag } from \"./inline-tag\";\n\nexport const optionalTag: InlineTag = {\n name: \"optional\",\n description: \"Create a tag for symbolize optional content\",\n handler() {\n return `<span class=\"docs-tag docs-tag--default\">Optional</span>`;\n },\n};\n","import { type InlineTag } from \"./inline-tag\";\nimport { linkTag } from \"./link\";\nimport { optionalTag } from \"./optional\";\n\nexport { type InlineTag } from \"./inline-tag\";\n\nconst inlineTags: InlineTag[] = [linkTag, optionalTag];\n\nexport default inlineTags;\n","/**\n * Find test-id among a list of example tags.\n *\n * @internal\n */\nexport function findTestId(tags: string[]): string | null {\n const prefix = \"test-id=\";\n const tag = tags.find((it) => {\n return it.startsWith(prefix);\n });\n const match = tag?.match(/^test-id=(?:\"([^\"]+)\"|'([^']+)'|([^'\"]+))$/);\n if (!match) {\n return null;\n }\n /* the matched value will be in match[1], match[2] or match[3] depending on\n * which of the three that matches */\n return match.slice(1).find(Boolean) ?? null;\n}\n","import hljs from \"highlight.js/lib/common\";\n\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nconst HTML_REPLACEMENTS: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n};\n\nfunction escapeHtml(str: string): string {\n return str.replace(HTML_ESCAPE_REPLACE_RE, (ch) => HTML_REPLACEMENTS[ch]);\n}\n\nfunction wrap(content: string, language: string): string {\n const markup = /* HTML */ `\n <code class=\"hljs lang-${language}\" tabindex=\"0\">${content}</code>\n `;\n return markup.trim();\n}\n\n/**\n * @internal\n */\nexport function highlight({\n source,\n language,\n}: {\n source: string;\n language: string;\n}): string {\n switch (language) {\n case \"\":\n case \"import\":\n case \"mermaid\":\n case \"plaintext\":\n return `<code>${escapeHtml(source)}</code>`;\n case \"vue\":\n return highlight({ source, language: \"html\" });\n case \"html\":\n }\n try {\n const { value } = hljs.highlight(source, { language });\n return wrap(value, language);\n } catch (err) {\n return wrap(String(err), language);\n }\n}\n","export function replaceAtLink(text: string): string {\n return text.replace(/{@link [^}]+[$}]/g, (match) =>\n match.replace(/^{/, \"{\").replace(/}$/, \"}\"),\n );\n}\n","import path from \"node:path\";\nimport { createTwoFilesPatch } from \"diff\";\nimport type MarkdownIt from \"markdown-it\";\nimport {\n type ExampleResult,\n parseInfostring,\n transformCode,\n} from \"../../examples\";\nimport { type MarkdownEnv } from \"../markdown-env\";\nimport {\n findTag,\n getFingerprint,\n hasTag,\n htmlencode,\n parseImport,\n} from \"../../utils\";\nimport { findTestId, highlight, replaceAtLink } from \"./utils\";\n\n/**\n * @internal\n */\nexport interface CodePreviewOptions {\n /** Callback when an example should be generated */\n generateExample(options: {\n source: string;\n language: string;\n filename: string;\n tags: string[];\n }): ExampleResult;\n\n /** Callback to get source for an imported filename */\n getImportedSource(filename: string): string;\n}\n\nfunction getClassModifier(tags: string[]): string {\n if (tags.includes(\"borderless\")) {\n return \"code-preview--borderless\";\n }\n return \"code-preview--default\";\n}\n\nfunction getStandalonePath(output: string | null): string | null {\n if (!output) {\n return null;\n }\n const { dir, name } = path.parse(output);\n return path.join(dir, `${name}.html`);\n}\n\nfunction ensureTrailingNewline(text: string): string {\n if (text.endsWith(\"\\n\")) {\n return text;\n } else {\n return `${text}\\n`;\n }\n}\n\nexport function codePreview(\n options: CodePreviewOptions,\n): (md: MarkdownIt) => void {\n const { generateExample, getImportedSource } = options;\n\n return (md: MarkdownIt): void => {\n md.renderer.rules.fence = fence.bind(undefined, md);\n };\n\n function getSource(\n content: string,\n language: string,\n tags: string[],\n env: Pick<MarkdownEnv, \"namedExamples\">,\n ): { source: string; language: string } {\n const { namedExamples } = env;\n\n if (language === \"import\") {\n const parsed = parseImport(content);\n const importedContent = getImportedSource(parsed.filename);\n return getSource(importedContent, parsed.extension, tags, env);\n }\n\n const compare = findTag(tags, \"compare\");\n if (compare && compare.value !== null) {\n const { value: context } = findTag(tags, \"context\") ?? {};\n const reference = namedExamples.get(compare.value);\n if (!reference) {\n throw new Error(\n `Failed to find referenced example \"${compare.value}\"`,\n );\n }\n const a = ensureTrailingNewline(\n transformCode(reference.content, reference.language),\n );\n const b = ensureTrailingNewline(transformCode(content, language));\n const diff = createTwoFilesPatch(\"a\", \"b\", a, b, \"\", \"\", {\n context: context ? parseInt(context, 10) : 3,\n ignoreWhitespace: true,\n })\n .split(\"\\n\")\n .slice(4) // remove header\n .join(\"\\n\");\n return {\n source: diff,\n language: \"diff\",\n };\n }\n\n return { source: content, language };\n }\n\n function fence(\n _md: MarkdownIt,\n tokens: MarkdownIt.Token[],\n idx: number,\n _options: MarkdownIt.Options,\n env: MarkdownEnv,\n ): string {\n const { fileInfo } = env;\n const { content: rawContent, info, map } = tokens[idx];\n const { language: rawLanguage, tags: rawTags } = parseInfostring(info);\n\n const { source, language } = getSource(\n rawContent,\n rawLanguage,\n rawTags,\n env,\n );\n\n /* store a named reference to this example */\n const name = findTag(rawTags, \"name\")?.value;\n if (name) {\n env.namedExamples.set(name, {\n name,\n tags: rawTags,\n /* store original raw content unless it is an imported example */\n content: rawLanguage === \"import\" ? source : rawContent,\n language: rawLanguage === \"import\" ? language : rawLanguage,\n });\n }\n\n if (hasTag(rawTags, \"hidden\")) {\n return \"\";\n }\n\n if (rawLanguage === \"mermaid\") {\n return /* HTML */ `\n <pre class=\"mermaid\">${htmlencode(rawContent)}</pre>\n `;\n }\n\n const example = generateExample({\n source,\n language,\n filename: fileInfo.fullPath,\n tags: rawTags,\n });\n const { tags } = example;\n\n const hashContent = `${map?.[0]}:${map?.[1]}:${info}:${source}`;\n const fingerprint = getFingerprint(hashContent);\n const transformedCode = transformCode(example.source, example.language);\n const highlightedCode = replaceAtLink(\n highlight({ source: transformedCode, language: example.language }),\n );\n const testId = findTestId(tags) ?? findTag(tags, \"name\")?.value;\n const liveExample = tags.includes(\"live-example\");\n const staticCode = example.runtime === false || tags.includes(\"static\");\n const noMarkup = tags.includes(\"nomarkup\");\n const fullscreen = tags.includes(\"fullscreen\");\n const modifier = getClassModifier(tags);\n const standalonePath = getStandalonePath(example.output);\n const showFullscreen = Boolean(standalonePath) && fullscreen;\n const testIdAttr = testId ? `data-test=\"${testId}\"` : \"\";\n const filteredTags = tags.filter((it) => {\n if (\n it.startsWith(\"test-id=\") ||\n it.startsWith(\"name\") ||\n it.startsWith(\"compare\")\n ) {\n return false;\n }\n return true;\n });\n const dataTagsAttr =\n filteredTags.length > 0\n ? `data-tags=\"${htmlencode(filteredTags.join(\" \"))}\"`\n : \"\";\n\n if (liveExample) {\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview code-preview--borderless\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.markup}\n </div>\n `;\n }\n\n if (staticCode) {\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview ${modifier}\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.comments.join(\"\\n\")}\n <pre class=\"code-preview__markup\">${highlightedCode}</pre>\n </div>\n `;\n }\n\n if (noMarkup) {\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview ${modifier}\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.comments.join(\"\\n\")}\n <div class=\"code-preview__preview\">${example.markup}</div>\n </div>\n `;\n }\n\n const toggleMarkup = /* HTML */ `\n <button\n type=\"button\"\n class=\"button button--discrete code-preview__toggle-markup\"\n aria-expanded=\"false\"\n onclick=\"toggleMarkup(this)\"\n >\n <i class=\"icon icon--code\"></i>\n Visa kod\n </button>\n `;\n\n const toggleFullscreen = showFullscreen\n ? /* HTML */ `\n <a href=\"${standalonePath}\" class=\"code-preview__fullscreen\">\n <i class=\"icon icon--fullscreen\"></i>\n Helskärm\n </a>\n `\n : \"\";\n\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview ${modifier}\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.comments.join(\"\\n\")}\n <div class=\"code-preview__preview\">${example.markup}</div>\n <div>${toggleMarkup} ${toggleFullscreen}</div>\n <div\n class=\"code-preview__expand animate-expand\"\n style=\"height: 0px;\"\n hidden\n >\n <pre class=\"code-preview__markup\">${highlightedCode}</pre>\n </div>\n </div>\n `;\n }\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { generateId } from \"../../utils/generate-id\";\nimport { type MarkdownEnv } from \"../markdown-env\";\n\nfunction getTokensText(tokens: MarkdownIt.Token[]): string {\n return tokens\n .filter((token) => [\"text\", \"code_inline\"].includes(token.type))\n .map((token) => token.content)\n .join(\"\");\n}\n\nexport function headingLevel(options: {\n initialLevel: number;\n}): (md: MarkdownIt) => void {\n const { initialLevel } = options;\n const offset = initialLevel - 1;\n let counter = 1;\n return function (md: MarkdownIt): void {\n /* eslint-disable-next-line camelcase -- upstream library uses snake_case */\n md.renderer.rules.heading_open = function (\n tokens,\n idx,\n _options,\n env: MarkdownEnv,\n ) {\n const { ids } = env;\n const { tag } = tokens[idx];\n const title = getTokensText(tokens[idx + 1]?.children ?? []);\n let id = generateId(title);\n\n /* handles duplicate id's */\n if (ids.has(id)) {\n id += `--${counter++}`;\n }\n\n ids.add(id);\n\n return tag.replace(/h(\\d)/, (_, n: string) => {\n const level = parseInt(n, 10) + offset;\n env.currentHeading = level;\n return `<h${level} id=\"${id}\"><a class=\"header-anchor\" href=\"#${id}\">`;\n });\n };\n /* eslint-disable-next-line camelcase -- upstream library uses snake_case */\n md.renderer.rules.heading_close = function (tokens, idx) {\n const { tag } = tokens[idx];\n return tag.replace(/h(\\d)/, (_, n: string) => {\n const level = parseInt(n, 10) + offset;\n return `</a></h${level}>`;\n });\n };\n };\n}\n","import path from \"node:path/posix\";\nimport crypto from \"node:crypto\";\nimport type MarkdownIt from \"markdown-it\";\nimport { type FileInfo } from \"../../document\";\nimport { type MarkdownEnv } from \"../markdown-env\";\n\nfunction computeHash(source: string): string {\n return crypto.createHash(\"md5\").update(source).digest(\"hex\");\n}\n\nfunction getFilename(fileInfo: FileInfo, src: string): string {\n const key = [fileInfo.fullPath, src].join(\"-\");\n const hash = computeHash(key);\n const { ext } = path.parse(src);\n return `images/${hash}${ext}`;\n}\n\nexport function imageResources(options: {\n addResource(dst: string, src: string): void;\n}): (md: MarkdownIt) => void {\n const { addResource } = options;\n function imageResource(\n tokens: MarkdownIt.Token[],\n index: number,\n options: MarkdownIt.Options,\n env: MarkdownEnv,\n self: MarkdownIt.Renderer,\n ): string {\n const { fileInfo } = env;\n const token = tokens[index];\n\n token.attrs ??= [];\n\n /* copy image asset into the `assets/images` directory and rewrite the url to match */\n const srcAttr = token.attrGet(\"src\");\n if (srcAttr) {\n const dst = getFilename(fileInfo, srcAttr);\n const src = path.join(path.dirname(fileInfo.fullPath), srcAttr);\n const url = path.relative(fileInfo.path, path.join(\"assets\", dst));\n\n addResource(dst, src);\n token.attrs[token.attrIndex(\"src\")][1] = url;\n }\n\n /* from upstream original image renderer, sets the alt attribute */\n token.attrs[token.attrIndex(\"alt\")][1] = self.renderInlineAsText(\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- from upstream code */\n token.children!,\n options,\n env,\n );\n\n return self.renderToken(tokens, index, options);\n }\n\n return function (md: MarkdownIt): void {\n md.renderer.rules.image = imageResource;\n };\n}\n","import { findDocument } from \"../../../utils/find-document\";\nimport { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\n/**\n * Create a container renderer \"alt\" to render alternative texts.\n *\n * @internal\n */\nexport function altContainer(context: ContainerContext): ContainerCallback {\n const { md, env, docs } = context;\n return (tokens, index) => {\n const token = tokens[index];\n const needle = token.info;\n const tags = token.info.trim().split(/\\s+/);\n const doc = findDocument(docs, needle);\n\n if (doc && doc.format === \"markdown\") {\n const body =\n typeof doc.body === \"string\" ? doc.body : doc.body(tags);\n return md.render(body, env);\n }\n\n return md.render(token.content, env);\n };\n}\n","import { findDocument } from \"../../../utils/find-document\";\nimport { SoftError } from \"../../soft-error\";\nimport { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\n/**\n * Create a container renderer \"api\" to render API documentation.\n *\n * @internal\n */\nexport function apiContainer(context: ContainerContext): ContainerCallback {\n const { md, env, docs, included, handleSoftError } = context;\n return (tokens, index) => {\n const token = tokens[index];\n const needle = token.content.trim();\n const tags = token.info.trim().split(/\\s+/);\n const doc = findDocument(docs, needle);\n if (!doc) {\n return handleSoftError(\n new SoftError(\n \"EINCLUDETARGET\",\n `No document matches \"${needle}\" when trying to include content`,\n { id: needle },\n ),\n );\n }\n\n /* @todo here we should instead detect the chain of includes to\n * provide a better explanation of *why* it happened, not just\n * *that* it happend */\n const key = [doc.id, ...tags].join(\"|\");\n const loop = included.get(doc.id);\n if (loop && loop !== context.doc.id) {\n return handleSoftError(\n new SoftError(\n \"EINCLUDERECURSION\",\n `Recursion detected when including document \"${doc.id}\"`,\n ),\n );\n }\n included.set(key, context.doc.id);\n\n const body = typeof doc.body === \"string\" ? doc.body : doc.body(tags);\n\n if (doc.format === \"html\") {\n return body.replace(\n /* replace `<next-heading-level>` and `</next-heading-level>` with actual h-tags */\n /(?<=<\\/?)next-heading-level/g,\n `h${String(env.currentHeading + 1)}`,\n );\n }\n\n const content = md.render(body, env);\n return /* HTML */ ` <div>${content}</div> `;\n };\n}\n","import { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\n/**\n * Create a container renderer \"details\" to render details (special variant of\n * messagebox).\n *\n * @internal\n */\nexport function detailsContainer(\n context: ContainerContext,\n options: { title: Record<string, string | undefined> },\n): ContainerCallback {\n const { md, env } = context;\n\n function parseInfo(info: string | undefined): string {\n const customTitle = info ? info.split(\" \") : [];\n if (customTitle.length > 0) {\n return customTitle.join(\" \");\n } else {\n return options.title[\"details\"] || \"Details\";\n }\n }\n\n return (tokens, index) => {\n const token = tokens[index];\n const title = parseInfo(token.info);\n const text = token.content.trim();\n return /* HTML */ `\n <details class=\"docs-messagebox docs-messagebox--details\">\n <summary class=\"docs-messagebox__title\">\n ${md.renderInline(title, env)}\n </summary>\n ${md.render(text, env)}\n </details>\n `;\n };\n}\n","import { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\nconst defaultTitle: Record<string, string | undefined> = {\n info: \"INFO\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n};\n\n/**\n * Create a container renderer \"messagebox\" to render messageboxes.\n *\n * @internal\n * @param alias - If specified it creates a messagebox renderer only for given variant.\n */\nexport function messageboxContainer(\n context: ContainerContext,\n options: { title: Record<string, string | undefined> },\n alias?: string,\n): ContainerCallback {\n const { md, env } = context;\n\n function getTitle(\n variant: string,\n customTitle: string[] | undefined,\n ): string {\n if (customTitle && customTitle.length > 0) {\n return customTitle.join(\" \");\n } else {\n return options.title[variant] ?? defaultTitle[variant] ?? \"\";\n }\n }\n\n function parseInfo(info: string | undefined): {\n variant: string;\n title: string;\n } {\n if (alias) {\n const variant = alias;\n const customTitle = info ? info.split(\" \") : [];\n const title = getTitle(variant, customTitle);\n return { variant, title };\n } else {\n const [variant = \"info\", ...customTitle] = info\n ? info.split(\" \")\n : [];\n const title = getTitle(variant, customTitle);\n return { variant, title };\n }\n }\n\n return (tokens, index) => {\n const token = tokens[index];\n const { variant, title } = parseInfo(token.info);\n const text = token.content.trim();\n return /* HTML */ `\n <div class=\"docs-messagebox docs-messagebox--${variant}\">\n ${title\n ? `<p class=\"docs-messagebox__title\">${md.renderInline(\n title,\n env,\n )}</p>`\n : \"\"}\n ${md.render(text, env)}\n </div>\n `;\n };\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { type Document } from \"../../document\";\nimport { type MarkdownEnv } from \"../markdown-env\";\nimport { type SoftErrorType } from \"../soft-error\";\nimport {\n type ContainerCallback,\n type ContainerContext,\n altContainer,\n apiContainer,\n detailsContainer,\n messageboxContainer,\n} from \"./container\";\n\ntype Options = Record<string, ContainerCallback>;\n\nconst markerStr = \":\";\nconst markerChar = markerStr.charCodeAt(0);\n\n/**\n * @internal\n */\nexport function containerParser(md: MarkdownIt, options: Options): void {\n function container(\n state: MarkdownIt.StateBlock,\n startLine: number,\n endLine: number,\n silent: boolean,\n ): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine];\n let max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) {\n return false;\n }\n\n if (pos + 3 > max) {\n return false;\n }\n\n const marker = state.src.charCodeAt(pos);\n\n if (marker !== markerChar) {\n return false;\n }\n\n // scan marker length\n let mem = pos;\n pos = state.skipChars(pos, marker);\n\n let len = pos - mem;\n\n if (len < 3) {\n return false;\n }\n\n const markup = state.src.slice(mem, pos);\n const params = state.src.slice(pos, max).trim().split(/\\s+/);\n const kind = params[0];\n const info = params.slice(1).join(\" \");\n\n // Since start is found, we can report success here in validation mode\n if (silent) {\n return true;\n }\n\n // search end of block\n let nextLine = startLine;\n let haveEndMarker = false;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) {\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) {\n continue;\n }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) {\n continue;\n }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n const token = state.push(`doc_${kind}`, \"div\", 0);\n token.info = info?.trim();\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [startLine, state.line];\n\n return true;\n }\n\n md.block.ruler.before(\"fence\", \"container_include\", container, {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n for (const [kind, fn] of Object.entries(options)) {\n md.renderer.rules[`doc_${kind}`] = fn;\n }\n}\n\n/* eslint-disable-next-line @typescript-eslint/max-params -- technical debt: should create and interface or similar */\nexport function containerRenderer(\n doc: () => Document,\n docs: Document[],\n env: MarkdownEnv,\n included: Map<string, string>,\n handleSoftError: (error: SoftErrorType) => string,\n options: {\n messagebox: {\n title: Record<string, string>;\n };\n },\n): (md: MarkdownIt) => void {\n return function (md: MarkdownIt): void {\n const context: ContainerContext = {\n md,\n env,\n get doc() {\n return doc();\n },\n docs,\n included,\n handleSoftError,\n };\n md.use(containerParser, {\n alt: altContainer(context),\n api: apiContainer(context),\n details: detailsContainer(context, options.messagebox),\n messagebox: messageboxContainer(context, options.messagebox),\n\n /* aliases for messagebox containers */\n info: messageboxContainer(context, options.messagebox, \"info\"),\n tip: messageboxContainer(context, options.messagebox, \"tip\"),\n warning: messageboxContainer(\n context,\n options.messagebox,\n \"warning\",\n ),\n danger: messageboxContainer(context, options.messagebox, \"danger\"),\n });\n };\n}\n","import type MarkdownIt from \"markdown-it\";\n\nexport function paragraph(): (md: MarkdownIt) => void {\n const renderToken: MarkdownIt.Renderer.RenderRule = (...args) => {\n const [tokens, idx, options, , self] = args;\n return self.renderToken(tokens, idx, options);\n };\n\n return function (md: MarkdownIt): void {\n /* eslint-disable camelcase -- property is defined in upstream library */\n const renderRule = md.renderer.rules.paragraph_open ?? renderToken;\n md.renderer.rules.paragraph_open = (tokens, idx, index, env, self) => {\n tokens[idx].attrJoin(\"class\", \"docs-paragraph\");\n return renderRule(tokens, idx, index, env, self);\n };\n /* eslint-enable camelcase */\n };\n}\n","/* eslint-disable camelcase -- upstream library uses snake_case */\n\nimport type markdownIt from \"markdown-it\";\n\nexport function table(): (md: markdownIt) => void {\n return function (md: markdownIt): void {\n md.renderer.rules.table_open = () => `<table class=\"table\">\\n`;\n md.renderer.rules.tr_open = () => `<tr class=\"table__row\">\\n`;\n md.renderer.rules.th_open = () =>\n `<th class=\"table__column table__column--text\" scope=\"col\">`;\n md.renderer.rules.td_open = () =>\n `<td class=\"table__column table__column--text\">`;\n };\n}\n","/* eslint-disable camelcase -- upstream library uses snake_case */\nimport type markdownIt from \"markdown-it\";\nimport { replaceAtLink } from \"./utils\";\n\ntype RenderRule = markdownIt.Renderer.RenderRule;\n\nexport function codeInline(): (md: markdownIt) => void {\n return function (md: markdownIt): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- will never be undefined\n const original = md.renderer.rules.code_inline!;\n md.renderer.rules.code_inline = (...args: Parameters<RenderRule>) => {\n const tmp = original(...args);\n return replaceAtLink(tmp);\n };\n };\n}\n","import markdownIt from \"markdown-it\";\nimport markdownItDeflist from \"markdown-it-deflist\";\nimport { type Document, type DocumentPage } from \"../document\";\nimport { type ExampleResult } from \"../examples/example-result\";\nimport { processInlineTags } from \"./process-inline-tags\";\nimport inlineTags from \"./inline-tags\";\nimport {\n codeInline,\n codePreview,\n headingLevel,\n imageResources,\n containerRenderer,\n table,\n paragraph,\n} from \"./markdown\";\nimport { MarkdownEnv } from \"./markdown-env\";\nimport { SoftErrorType } from \"./soft-error\";\n\n/**\n * Options for [[createMarkdownRenderer]].\n *\n * @public\n */\nexport interface MarkdownOptions {\n /** List of all available documents */\n readonly docs: Document[];\n\n /** Callback for adding a static resource */\n addResource(dst: string, src: string): void;\n\n /** Callback when an example should be generated */\n generateExample(options: {\n source: string;\n language: string;\n filename: string;\n tags: string[];\n }): ExampleResult;\n\n /** Callback to get source for an imported filename */\n getImportedSource(filename: string): string;\n\n /**\n * Handle error which can be recovered from.\n *\n * If a string is returned it replaces the intended content but otherwise\n * continues rendering.\n *\n * If the exception is rethrown it will cause the renderer to bail out.\n *\n * @param error - The error to be handled.\n * @returns A replacement string or rethrows error.\n */\n handleSoftError(error: SoftErrorType): string;\n\n /**\n * Options for messagebox container.\n */\n messagebox?: {\n /** Default titles for messageboxes */\n title?: Record<string, string>;\n };\n}\n\n/**\n * Markdown renderer.\n *\n * @public\n */\nexport interface MarkdownRenderer {\n /**\n * Render given markdown content to HTML\n *\n * @param doc - Document metadata.\n * @param content - Markdown content to render.\n * @returns HTML rendered from markdown content.\n */\n render(doc: DocumentPage, content: string): string;\n}\n\n/**\n * @public\n */\nexport function createMarkdownRenderer(\n options: MarkdownOptions,\n): MarkdownRenderer {\n const { docs } = options;\n const env: MarkdownEnv = {\n fileInfo: {\n fullPath: \"\",\n name: \"\",\n path: \"\",\n outputName: false,\n },\n ids: new Set(),\n currentHeading: 1,\n namedExamples: new Map(),\n };\n\n let currentDoc: Document | null = null;\n const getCurrentDocument = (): Document => {\n if (!currentDoc) {\n throw new Error(\n \"Internal error: getting current document before rendering has started\",\n );\n }\n return currentDoc;\n };\n\n const included = new Map<string, string>();\n const md = markdownIt({\n html: true,\n });\n md.use(markdownItDeflist);\n md.use(\n codePreview({\n generateExample: options.generateExample,\n getImportedSource: options.getImportedSource,\n }),\n );\n md.use(headingLevel({ initialLevel: 1 }));\n md.use(\n imageResources({\n addResource: options.addResource,\n }),\n );\n md.use(\n containerRenderer(\n getCurrentDocument,\n docs,\n env,\n included,\n options.handleSoftError,\n {\n messagebox: { title: {}, ...options.messagebox },\n },\n ),\n );\n md.use(paragraph());\n md.use(table());\n md.use(codeInline());\n\n return {\n render(doc: DocumentPage, content: string): string {\n currentDoc = doc;\n included.clear();\n included.set(doc.id, doc.id);\n env.fileInfo = doc.fileInfo;\n env.ids = new Set();\n const html = md.render(content, env);\n return processInlineTags(\n inlineTags,\n doc,\n docs,\n html,\n options.handleSoftError,\n );\n },\n };\n}\n"],"names":["path","version","vue3","language","lines","dedent","text","hljs","createTwoFilesPatch","options","markdownIt","markdownItDeflist"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var fs = require('node:fs/promises');
|
|
4
4
|
var path = require('node:path/posix');
|
|
5
|
-
var vendor = require('./vendor-
|
|
6
|
-
var createMarkdownRenderer = require('./create-markdown-renderer-
|
|
5
|
+
var vendor = require('./vendor-CIZoJHXd.js');
|
|
6
|
+
var createMarkdownRenderer = require('./create-markdown-renderer-BaB7AmXn.js');
|
|
7
7
|
var path$1 = require('node:path');
|
|
8
8
|
var require$$1 = require('crypto');
|
|
9
9
|
require('node:crypto');
|
|
@@ -46,7 +46,7 @@ require('tls');
|
|
|
46
46
|
require('tty');
|
|
47
47
|
require('querystring');
|
|
48
48
|
require('vue');
|
|
49
|
-
require('./vue3-
|
|
49
|
+
require('./vue3-CkmHk7uJ.js');
|
|
50
50
|
|
|
51
51
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
52
52
|
function toArray$2(value) {
|
|
@@ -1507,6 +1507,13 @@ function findDocComment(path, node) {
|
|
|
1507
1507
|
return doc;
|
|
1508
1508
|
}
|
|
1509
1509
|
}
|
|
1510
|
+
const grandparent = path.parentPath?.parent;
|
|
1511
|
+
if (parent.type === "VariableDeclarator" && grandparent && grandparent.leadingComments) {
|
|
1512
|
+
const doc = grandparent.leadingComments.find(isDocComment);
|
|
1513
|
+
if (doc) {
|
|
1514
|
+
return doc;
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1510
1517
|
return null;
|
|
1511
1518
|
}
|
|
1512
1519
|
function findTranslations(filename, content) {
|
|
@@ -2471,7 +2478,7 @@ function stripPrettierComments(content) {
|
|
|
2471
2478
|
}
|
|
2472
2479
|
async function render(doc, docs, nav, vendors, options) {
|
|
2473
2480
|
const { fileInfo } = doc;
|
|
2474
|
-
const { i18n, outputFolder, cacheFolder, templateFolders } = options;
|
|
2481
|
+
const { i18n, outputFolder, cacheFolder, templateFolders, fileMatcher } = options;
|
|
2475
2482
|
if (!haveOutputFile(fileInfo)) {
|
|
2476
2483
|
return null;
|
|
2477
2484
|
}
|
|
@@ -2538,7 +2545,8 @@ async function render(doc, docs, nav, vendors, options) {
|
|
|
2538
2545
|
parent: fileInfo.fullPath,
|
|
2539
2546
|
setupPath: options.setupPath,
|
|
2540
2547
|
exampleFolders: options.exampleFolders,
|
|
2541
|
-
tags
|
|
2548
|
+
tags,
|
|
2549
|
+
fileMatcher
|
|
2542
2550
|
});
|
|
2543
2551
|
if (example.output) {
|
|
2544
2552
|
const { dir, name } = path$1.parse(example.output);
|
|
@@ -2552,6 +2560,11 @@ async function render(doc, docs, nav, vendors, options) {
|
|
|
2552
2560
|
}
|
|
2553
2561
|
return example;
|
|
2554
2562
|
},
|
|
2563
|
+
getImportedSource(filename) {
|
|
2564
|
+
const context = `when importing example from "${fileInfo.fullPath}"`;
|
|
2565
|
+
const match = fileMatcher(filename, context);
|
|
2566
|
+
return fs$1.readFileSync(match, "utf-8");
|
|
2567
|
+
},
|
|
2555
2568
|
addResource(dst2, src) {
|
|
2556
2569
|
if (!fs$1.existsSync(src)) {
|
|
2557
2570
|
throw new Error(`Failed to find image "${src}"`);
|
|
@@ -3197,6 +3210,7 @@ class Generator {
|
|
|
3197
3210
|
setupPath,
|
|
3198
3211
|
markdownOptions
|
|
3199
3212
|
} = this;
|
|
3213
|
+
const examplePatterns = this.exampleFolders.map((it) => `${it}/**/*`);
|
|
3200
3214
|
const i18n = vendor.createInstance({
|
|
3201
3215
|
lng: site.lang,
|
|
3202
3216
|
fallbackLng: "en",
|
|
@@ -3226,7 +3240,8 @@ class Generator {
|
|
|
3226
3240
|
exampleFolders,
|
|
3227
3241
|
templateFolders,
|
|
3228
3242
|
setupPath,
|
|
3229
|
-
markdown: markdownOptions ?? {}
|
|
3243
|
+
markdown: markdownOptions ?? {},
|
|
3244
|
+
fileMatcher: fileMatcher(examplePatterns)
|
|
3230
3245
|
}),
|
|
3231
3246
|
...this.processors
|
|
3232
3247
|
];
|