update site to kdlv2

This commit is contained in:
Kat Marchán 2024-12-16 23:54:58 -08:00
parent a79d0413d1
commit 3c9e89273e
No known key found for this signature in database
GPG Key ID: AEB529C08A3C7E9E
14 changed files with 615 additions and 543 deletions

View File

@ -1,34 +0,0 @@
const {
Worker,
receiveMessageOnPort,
MessageChannel,
} = require("worker_threads");
// See https://giuseppegurgone.com/synchronizing-async-functions/
function wait_highlight(...args) {
const worker = new Worker("./highlight_worker.js");
const signal = new Int32Array(new SharedArrayBuffer(4));
signal[0] = 0;
try {
const subChannel = new MessageChannel();
worker.postMessage({ signal, port: subChannel.port1, args }, [
subChannel.port1,
]);
Atomics.wait(signal, 0, 0);
return receiveMessageOnPort(subChannel.port2).message.result;
} finally {
worker.unref();
}
}
module.exports = (eleventyConfig) => {
eleventyConfig.addPassthroughCopy("src/CNAME");
eleventyConfig.addMarkdownHighlighter(wait_highlight);
return {
dir: {
input: "src",
output: "docs",
},
};
};

32
.eleventy.mjs Normal file
View File

@ -0,0 +1,32 @@
import { createHighlighter } from "shiki";
import path from "node:path";
import { readFile } from "node:fs/promises";
export default function (eleventyConfig) {
eleventyConfig.addPassthroughCopy("src/CNAME");
eleventyConfig.addMarkdownHighlighter(shikiHighlight);
return {
dir: {
input: "src",
output: "docs",
},
};
};
const kdlGrammar = JSON.parse(await readFile(path.join(process.cwd(), "kdl.tmLanguage.json"), "utf8"));
const highlighter = await createHighlighter({
themes: ["nord"],
langs: [
{
name: "kdl",
scopeName: "source.kdl",
...kdlGrammar
},
],
});
function shikiHighlight(code, lang) {
return highlighter.codeToHtml(code, { lang, theme: "nord" });
}

View File

@ -13,7 +13,10 @@ async function shiki_highlight(code, lang) {
}, },
], ],
}); });
return highlighter.codeToHtml(code, lang); console.log("highlighting...");
const ret = highlighter.codeToHtml(code, lang);
console.log("highlighted!");
return ret;
} }
parentPort.addListener("message", async ({ signal, port, args }) => { parentPort.addListener("message", async ({ signal, port, args }) => {
@ -21,8 +24,11 @@ parentPort.addListener("message", async ({ signal, port, args }) => {
const result = await shiki_highlight(...args); const result = await shiki_highlight(...args);
// Post the result to the main thread before unlocking "signal" // Post the result to the main thread before unlocking "signal"
console.log("posting result...");
port.postMessage({ result }); port.postMessage({ result });
console.log("posted result");
port.close(); port.close();
console.log("port closed");
// Change the value of signal[0] to 1 // Change the value of signal[0] to 1
Atomics.store(signal, 0, 1); Atomics.store(signal, 0, 1);

View File

@ -1,14 +1,20 @@
{ {
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"comment": "Some of these patterns are taken straight from rust-analyzer: https://github.com/rust-lang/vscode-rust/blob/master/rust-analyzer/editors/code/rust.tmGrammar.json. Some was also taken from https://github.com/arm32x/vscode-sdlang/blob/master/syntaxes/sdlang.tmLanguage.json", "comment": "Some of these patterns are taken straight from rust-analyzer: https://github.com/rust-lang/vscode-rust/blob/master/rust-analyzer/editors/code/rust.tmGrammar.json. Some was also taken from https://github.com/arm32x/vscode-sdlang/blob/master/syntaxes/sdlang.tmLanguage.json",
"name": "KDL", "name": "kdl",
"patterns": [ "patterns": [
{
"include": "#forbidden_ident"
},
{ {
"include": "#null" "include": "#null"
}, },
{ {
"include": "#boolean" "include": "#boolean"
}, },
{
"include": "#float_keyword"
},
{ {
"include": "#float_fraction" "include": "#float_fraction"
}, },
@ -28,10 +34,13 @@
"include": "#binary" "include": "#binary"
}, },
{ {
"include": "#raw-strings" "include": "#raw-string"
}, },
{ {
"include": "#strings" "include": "#string_multi_line"
},
{
"include": "#string_single_line"
}, },
{ {
"include": "#block_comment" "include": "#block_comment"
@ -45,6 +54,9 @@
{ {
"include": "#slashdash_comment" "include": "#slashdash_comment"
}, },
{
"include": "#slashdash_node_with_children_comment"
},
{ {
"include": "#slashdash_node_comment" "include": "#slashdash_node_comment"
}, },
@ -56,6 +68,9 @@
}, },
{ {
"include": "#node_name" "include": "#node_name"
},
{
"include": "#ident_string"
} }
], ],
"repository": { "repository": {
@ -77,54 +92,77 @@
"hexadecimal": { "hexadecimal": {
"comment": "Integer literal (hexadecimal)", "comment": "Integer literal (hexadecimal)",
"name": "constant.numeric.integer.hexadecimal.rust", "name": "constant.numeric.integer.hexadecimal.rust",
"match": "\\b0x[a-fA-F0-9_]+\\b" "match": "\\b0x[a-fA-F0-9][a-fA-F0-9_]*\\b"
}, },
"octal": { "octal": {
"comment": "Integer literal (octal)", "comment": "Integer literal (octal)",
"name": "constant.numeric.integer.octal.rust", "name": "constant.numeric.integer.octal.rust",
"match": "\\b0o[0-7_]+\\b" "match": "\\b0o[0-7][0-7_]*\\b"
}, },
"binary": { "binary": {
"comment": "Integer literal (binary)", "comment": "Integer literal (binary)",
"name": "constant.numeric.integer.binary.rust", "name": "constant.numeric.integer.binary.rust",
"match": "\\b0b[01_]+\\b" "match": "\\b0b[01][01_]*\\b"
},
"forbidden_ident": {
"name": "invalid.illegal.kdl.bad-ident",
"match": "(?<!#)(?:true|false|null|nan|[-]?inf)"
}, },
"node_name": { "node_name": {
"name": "entity.name.tag", "name": "entity.name.tag",
"match": "(?![\\\\{\\}<>;\\[\\]\\=,])[\\w\\-_~!@#\\$%^&*+|/.\\(\\)]+" "match": "((?<={|;)|^)\\s*(?![/\\\\{\\}#;\\[\\]\\=])[<>:\\w\\-_~,'`!\\?@\\$%^&*+|.\\(\\)]+\\d*[<>:\\w\\-_~,'`!\\?@\\$%^&*+|.\\(\\)]*"
}, },
"attribute": { "attribute": {
"name": "entity.other.attribute-name.kdl", "name": "entity.other.attribute-name.kdl",
"match": "(?![\\\\{\\}<>;\\[\\]\\=,])[\\w\\-_~!@#\\$%^&*+|/.]+(=)", "match": "(?![/\\\\{\\}#;\\[\\]\\=])[<>:\\w\\-_~,'`!\\?@\\$%^&*+|.\\(\\)]+\\d*[<>:\\w\\-_~,'`!\\?@\\$%^&*+|.\\(\\)]*(=)",
"captures": { "captures": {
"1": { "1": {
"name": "punctuation.separator.key-value.kdl" "name": "punctuation.separator.key-value.kdl"
} }
} }
}, },
"ident_string": {
"name": "string.unquoted",
"match": "(?![/\\\\{\\}#;\\[\\]\\=])[<>:\\w\\-_~,'`!\\?@\\$%^&*+|.\\(\\)]+\\d*[<>:\\w\\-_~,'`!\\?@\\$%^&*+|.\\(\\)]*"
},
"float_keyword": {
"name": "constant.language.other.kdl",
"match": "#nan|#inf|#-inf"
},
"null": { "null": {
"name": "constant.language.null.kdl", "name": "constant.language.null.kdl",
"match": "\\bnull\\b" "match": "#null"
}, },
"boolean": { "boolean": {
"name": "constant.language.boolean.kdl", "name": "constant.language.boolean.kdl",
"match": "\\b(true|false)\\b" "match": "#true|#false"
}, },
"strings": { "string_single_line": {
"name": "string.quoted.double.kdl", "name": "string.quoted.double.kdl",
"begin": "\"", "begin": "\"",
"end": "\"", "end": "\"",
"patterns": [ "patterns": [
{ {
"name": "constant.character.escape.kdl", "name": "constant.character.escape.kdl",
"match": "\\\\(:?[nrtbf\\\\\"]|u\\{[a-fA-F0-9]{1,6}\\})" "match": "\\\\(:?[nrtbfs\\\\\"]|u\\{[a-fA-F0-9]{1,6}\\})"
} }
] ]
}, },
"raw-strings": { "string_multi_line": {
"name": "string.quoted.double.raw.kdl", "name": "string.quoted.triple.kdl",
"begin": "b?r(#*)\"", "begin": "\"\"\"",
"end": "\"\\1" "end": "\"\"\"",
"patterns": [
{
"name": "constant.character.escape.kdl",
"match": "\\\\(:?[nrtbfs\\\\\"]|u\\{[a-fA-F0-9]{1,6}\\})"
}
]
},
"raw-string": {
"name": "string.quoted.other.raw.kdl",
"begin": "(#+)(\"{3,1})",
"end": "\\2\\1"
}, },
"block_doc_comment": { "block_doc_comment": {
"comment": "Block documentation comment", "comment": "Block documentation comment",
@ -156,26 +194,32 @@
}, },
"line_comment": { "line_comment": {
"comment": "Single-line comment", "comment": "Single-line comment",
"name": "comment.line.double-slash.rust", "name": "comment.line.double-slash.kdl",
"begin": "//", "begin": "//",
"end": "$" "end": "$"
}, },
"slashdash_comment": { "slashdash_comment": {
"name": "comment.line.double-slash", "name": "comment.block.slashdash.kdl",
"comment": "Slashdash inline comment", "comment": "Slashdash inline comment",
"begin": "(?<!^)/-", "begin": "(?<!^)/-",
"end": "\\s" "end": "\\s"
}, },
"slashdash_node_comment": { "slashdash_node_comment": {
"name": "comment.block", "name": "comment.block.slashdash.kdl",
"comment": "Slashdash node comment", "comment": "Slashdash node comment",
"begin": "(?<=^)/-", "begin": "(?<=^)/-",
"end": "}" "end": "(?:;|(?<!\\\\)$)"
},
"slashdash_node_with_children_comment": {
"name": "comment.block.slashdash.kdl",
"comment": "Slashdash node comment",
"begin": "(?<=^)/-[^{]+{",
"end": "\\}"
}, },
"slashdash_block_comment": { "slashdash_block_comment": {
"name": "comment.block", "name": "comment.block.slashdash.kdl",
"comment": "Slashdash block comment", "comment": "Slashdash block comment",
"begin": "/-{", "begin": "/-(?:\\s*){",
"end": "}" "end": "}"
} }
}, },

559
package-lock.json generated
View File

@ -15,7 +15,7 @@
"postcss": "^8.2.1", "postcss": "^8.2.1",
"postcss-cli": "^8.3.1", "postcss-cli": "^8.3.1",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"shiki": "^0.2.7", "shiki": "^1.24.2",
"tailwindcss": "^2.0.2" "tailwindcss": "^2.0.2"
} }
}, },
@ -291,6 +291,57 @@
"node": ">=14" "node": ">=14"
} }
}, },
"node_modules/@shikijs/core": {
"version": "1.24.2",
"resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.2.tgz",
"integrity": "sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==",
"dev": true,
"dependencies": {
"@shikijs/engine-javascript": "1.24.2",
"@shikijs/engine-oniguruma": "1.24.2",
"@shikijs/types": "1.24.2",
"@shikijs/vscode-textmate": "^9.3.0",
"@types/hast": "^3.0.4",
"hast-util-to-html": "^9.0.3"
}
},
"node_modules/@shikijs/engine-javascript": {
"version": "1.24.2",
"resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz",
"integrity": "sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==",
"dev": true,
"dependencies": {
"@shikijs/types": "1.24.2",
"@shikijs/vscode-textmate": "^9.3.0",
"oniguruma-to-es": "0.7.0"
}
},
"node_modules/@shikijs/engine-oniguruma": {
"version": "1.24.2",
"resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz",
"integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==",
"dev": true,
"dependencies": {
"@shikijs/types": "1.24.2",
"@shikijs/vscode-textmate": "^9.3.0"
}
},
"node_modules/@shikijs/types": {
"version": "1.24.2",
"resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz",
"integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==",
"dev": true,
"dependencies": {
"@shikijs/vscode-textmate": "^9.3.0",
"@types/hast": "^3.0.4"
}
},
"node_modules/@shikijs/vscode-textmate": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz",
"integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==",
"dev": true
},
"node_modules/@sindresorhus/slugify": { "node_modules/@sindresorhus/slugify": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz",
@ -331,12 +382,42 @@
"tailwindcss": "2.0.0-alpha.24 || ^2.0.0" "tailwindcss": "2.0.0-alpha.24 || ^2.0.0"
} }
}, },
"node_modules/@types/hast": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
"integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
"dev": true,
"dependencies": {
"@types/unist": "*"
}
},
"node_modules/@types/mdast": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
"integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
"dev": true,
"dependencies": {
"@types/unist": "*"
}
},
"node_modules/@types/parse-json": { "node_modules/@types/parse-json": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
"integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
"dev": true "dev": true
}, },
"node_modules/@types/unist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
"dev": true
},
"node_modules/@ungap/structured-clone": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
"integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==",
"dev": true
},
"node_modules/a-sync-waterfall": { "node_modules/a-sync-waterfall": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz",
@ -731,6 +812,16 @@
} }
] ]
}, },
"node_modules/ccount": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
"integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/chalk": { "node_modules/chalk": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -747,6 +838,26 @@
"url": "https://github.com/chalk/chalk?sponsor=1" "url": "https://github.com/chalk/chalk?sponsor=1"
} }
}, },
"node_modules/character-entities-html4": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
"integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/character-entities-legacy": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
"integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/chardet": { "node_modules/chardet": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-2.0.0.tgz", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.0.0.tgz",
@ -887,6 +998,16 @@
"simple-swizzle": "^0.2.2" "simple-swizzle": "^0.2.2"
} }
}, },
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
"integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/commander": { "node_modules/commander": {
"version": "10.0.1", "version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
@ -1037,6 +1158,15 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/destroy": { "node_modules/destroy": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
@ -1076,6 +1206,19 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/devlop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
"integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
"dev": true,
"dependencies": {
"dequal": "^2.0.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/didyoumean": { "node_modules/didyoumean": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@ -1202,6 +1345,12 @@
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true "dev": true
}, },
"node_modules/emoji-regex-xs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
"integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==",
"dev": true
},
"node_modules/encodeurl": { "node_modules/encodeurl": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@ -1753,6 +1902,42 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/hast-util-to-html": {
"version": "9.0.4",
"resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz",
"integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==",
"dev": true,
"dependencies": {
"@types/hast": "^3.0.0",
"@types/unist": "^3.0.0",
"ccount": "^2.0.0",
"comma-separated-tokens": "^2.0.0",
"hast-util-whitespace": "^3.0.0",
"html-void-elements": "^3.0.0",
"mdast-util-to-hast": "^13.0.0",
"property-information": "^6.0.0",
"space-separated-tokens": "^2.0.0",
"stringify-entities": "^4.0.0",
"zwitch": "^2.0.4"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hast-util-whitespace": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
"integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
"dev": true,
"dependencies": {
"@types/hast": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/hex-color-regex": { "node_modules/hex-color-regex": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
@ -1783,6 +1968,16 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/html-void-elements": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
"integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/htmlparser2": { "node_modules/htmlparser2": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
@ -2070,18 +2265,6 @@
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true "dev": true
}, },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/jsonfile": { "node_modules/jsonfile": {
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@ -2251,6 +2434,27 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/mdast-util-to-hast": {
"version": "13.2.0",
"resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
"integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
"dev": true,
"dependencies": {
"@types/hast": "^3.0.0",
"@types/mdast": "^4.0.0",
"@ungap/structured-clone": "^1.0.0",
"devlop": "^1.0.0",
"micromark-util-sanitize-uri": "^2.0.0",
"trim-lines": "^3.0.0",
"unist-util-position": "^5.0.0",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/mdurl": { "node_modules/mdurl": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
@ -2266,6 +2470,95 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/micromark-util-character": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
"integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
"dev": true,
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
],
"dependencies": {
"micromark-util-symbol": "^2.0.0",
"micromark-util-types": "^2.0.0"
}
},
"node_modules/micromark-util-encode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
"integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
"dev": true,
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
]
},
"node_modules/micromark-util-sanitize-uri": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
"integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
"dev": true,
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
],
"dependencies": {
"micromark-util-character": "^2.0.0",
"micromark-util-encode": "^2.0.0",
"micromark-util-symbol": "^2.0.0"
}
},
"node_modules/micromark-util-symbol": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
"integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
"dev": true,
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
]
},
"node_modules/micromark-util-types": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
"integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
"dev": true,
"funding": [
{
"type": "GitHub Sponsors",
"url": "https://github.com/sponsors/unifiedjs"
},
{
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
]
},
"node_modules/micromatch": { "node_modules/micromatch": {
"version": "4.0.8", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@ -2515,22 +2808,15 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"node_modules/onigasm": { "node_modules/oniguruma-to-es": {
"version": "2.2.5", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz",
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", "integrity": "sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"lru-cache": "^5.1.1" "emoji-regex-xs": "^1.0.0",
} "regex": "^5.0.2",
}, "regex-recursion": "^4.3.0"
"node_modules/onigasm/node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"dependencies": {
"yallist": "^3.0.2"
} }
}, },
"node_modules/package-json-from-dist": { "node_modules/package-json-from-dist": {
@ -2936,6 +3222,16 @@
"asap": "~2.0.3" "asap": "~2.0.3"
} }
}, },
"node_modules/property-information": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
"integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/prr": { "node_modules/prr": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@ -3074,6 +3370,30 @@
"integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
"dev": true "dev": true
}, },
"node_modules/regex": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz",
"integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==",
"dev": true,
"dependencies": {
"regex-utilities": "^2.3.0"
}
},
"node_modules/regex-recursion": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.3.0.tgz",
"integrity": "sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==",
"dev": true,
"dependencies": {
"regex-utilities": "^2.3.0"
}
},
"node_modules/regex-utilities": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
"integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
"dev": true
},
"node_modules/require-directory": { "node_modules/require-directory": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@ -3296,34 +3616,17 @@
} }
}, },
"node_modules/shiki": { "node_modules/shiki": {
"version": "0.2.7", "version": "1.24.2",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.2.7.tgz", "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.2.tgz",
"integrity": "sha512-bwVc7cdtYYHEO9O+XJ8aNOskKRfaQd5Y4ovLRfbQkmiLSUaR+bdlssbZUUhbQ0JAFMYcTcJ5tjG5KtnufttDHQ==", "integrity": "sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"onigasm": "^2.2.5", "@shikijs/core": "1.24.2",
"shiki-languages": "^0.2.7", "@shikijs/engine-javascript": "1.24.2",
"shiki-themes": "^0.2.7", "@shikijs/engine-oniguruma": "1.24.2",
"vscode-textmate": "^5.2.0" "@shikijs/types": "1.24.2",
} "@shikijs/vscode-textmate": "^9.3.0",
}, "@types/hast": "^3.0.4"
"node_modules/shiki-languages": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/shiki-languages/-/shiki-languages-0.2.7.tgz",
"integrity": "sha512-REmakh7pn2jCn9GDMRSK36oDgqhh+rSvJPo77sdWTOmk44C5b0XlYPwJZcFOMJWUZJE0c7FCbKclw4FLwUKLRw==",
"dev": true,
"dependencies": {
"vscode-textmate": "^5.2.0"
}
},
"node_modules/shiki-themes": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/shiki-themes/-/shiki-themes-0.2.7.tgz",
"integrity": "sha512-ZMmboDYw5+SEpugM8KGUq3tkZ0vXg+k60XX6NngDK7gc1Sv6YLUlanpvG3evm57uKJvfXsky/S5MzSOTtYKLjA==",
"dev": true,
"dependencies": {
"json5": "^2.1.0",
"vscode-textmate": "^5.2.0"
} }
}, },
"node_modules/signal-exit": { "node_modules/signal-exit": {
@ -3380,6 +3683,16 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/space-separated-tokens": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
"integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/sprintf-js": { "node_modules/sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -3466,6 +3779,20 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/stringify-entities": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
"integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
"dev": true,
"dependencies": {
"character-entities-html4": "^2.0.0",
"character-entities-legacy": "^3.0.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/strip-ansi": { "node_modules/strip-ansi": {
"version": "7.1.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
@ -3649,12 +3976,90 @@
"node": ">=0.6" "node": ">=0.6"
} }
}, },
"node_modules/trim-lines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
"integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/uc.micro": { "node_modules/uc.micro": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
"integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
"dev": true "dev": true
}, },
"node_modules/unist-util-is": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
"integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
"dev": true,
"dependencies": {
"@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/unist-util-position": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
"integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
"dev": true,
"dependencies": {
"@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/unist-util-stringify-position": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
"integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
"dev": true,
"dependencies": {
"@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/unist-util-visit": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
"integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
"dev": true,
"dependencies": {
"@types/unist": "^3.0.0",
"unist-util-is": "^6.0.0",
"unist-util-visit-parents": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/unist-util-visit-parents": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
"integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
"dev": true,
"dependencies": {
"@types/unist": "^3.0.0",
"unist-util-is": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/universalify": { "node_modules/universalify": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@ -3715,11 +4120,33 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true "dev": true
}, },
"node_modules/vscode-textmate": { "node_modules/vfile": {
"version": "5.5.0", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.5.0.tgz", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
"integrity": "sha512-jToQkPGMNKn0eyKyitYeINJF0NoD240aYyKPIWJv5W2jfPt++jIRg0OSergubtGhbw6SoefkvBYEpX7TsfoSUQ==", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
"dev": true "dev": true,
"dependencies": {
"@types/unist": "^3.0.0",
"vfile-message": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
"node_modules/vfile-message": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
"integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
"dev": true,
"dependencies": {
"@types/unist": "^3.0.0",
"unist-util-stringify-position": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
}, },
"node_modules/which": { "node_modules/which": {
"version": "2.0.2", "version": "2.0.2",
@ -3869,12 +4296,6 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
"node_modules/yaml": { "node_modules/yaml": {
"version": "1.10.2", "version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
@ -3951,6 +4372,16 @@
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
},
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
"integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
"dev": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
} }
} }
} }

View File

@ -7,8 +7,8 @@
"clean": "rm -rf docs && mkdir -p docs/styles", "clean": "rm -rf docs && mkdir -p docs/styles",
"static": "cp -r static/* docs", "static": "cp -r static/* docs",
"build": "npm run clean && npm run static && postcss src/styles/global.css > docs/styles/global.css", "build": "npm run clean && npm run static && postcss src/styles/global.css > docs/styles/global.css",
"dev": "npm run build && eleventy --serve", "dev": "npm run build && eleventy --config=.eleventy.mjs --serve",
"prod": "NODE_ENV=production npm run build && eleventy", "prod": "NODE_ENV=production npm run build && eleventy --config=.eleventy.mjs",
"format": "prettier --write src ./*.js ./.*.js" "format": "prettier --write src ./*.js ./.*.js"
}, },
"keywords": [], "keywords": [],
@ -21,7 +21,7 @@
"postcss": "^8.2.1", "postcss": "^8.2.1",
"postcss-cli": "^8.3.1", "postcss-cli": "^8.3.1",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"shiki": "^0.2.7", "shiki": "^1.24.2",
"tailwindcss": "^2.0.2" "tailwindcss": "^2.0.2"
} }
} }

View File

@ -1,14 +0,0 @@
<section class="kdl-section" id="compatibility-with-json-and-xml">
## Compatibility with JSON and XML
There are two specifications for writing KDL that can be losslessly translated
between it and JSON or XML. These specifications define a stricter _subset_ of
KDL that, even if not entirely idiomatic, is still valid and fits into the
data models of the other two languages:
* [JSON in KDL](https://github.com/kdl-org/kdl/blob/main/JSON-IN-KDL.md)
* [XML in KDL](https://github.com/kdl-org/kdl/blob/main/XML-IN-KDL.md)
</section>

View File

@ -1,60 +0,0 @@
<section class="kdl-section" id="description">
KDL is a small, pleasing document language with xml-like semantics that looks
like you're invoking a bunch of CLI commands! It's meant to be used both as a
serialization format and a configuration language, much like JSON, YAML, or
XML. It looks like this:
```kdl
package {
name "my-pkg"
version "1.2.3"
dependencies {
// Nodes can have standalone values as well as
// key/value pairs.
lodash "^3.2.1" optional=true alias="underscore"
}
scripts {
// "Raw" and multi-line strings are supported.
build r#"
echo "foo"
node -c "console.log('hello, world!');"
echo "foo" > some-file.txt
"#
}
// `\` breaks up a single node across multiple lines.
the-matrix 1 2 3 \
4 5 6 \
7 8 9
// "Slashdash" comments operate at the node level,
// with just `/-`.
/-this-is-commented {
this "entire" "node" {
"is" "gone"
}
}
}
```
There's a living [specification](https://github.com/kdl-org/kdl/blob/main/SPEC.md), as well as various
[implementations](#implementations). You can also check out the [FAQ](#faq) to
answer all your burning questions!
In addition to a spec for KDL itself, there are also standard specs for [a KDL
Query Language](https://github.com/kdl-org/kdl/blob/main/QUERY-SPEC.md) based
on CSS selectors, and [a KDL Schema
Language](https://github.com/kdl-org/kdl/blob/main/SCHEMA-SPEC.md) loosely
based on JSON Schema.
The language is based on [SDLang](https://sdlang.org), with a number of
modifications and clarifications on its syntax and behavior.
The current version of the KDL spec is `1.0.0`.
[Play with it in your browser!](https://kdl-play.danini.dev/)
</section>

View File

@ -1,9 +0,0 @@
<section class="kdl-section" id="design-and-discussion">
## Design and Discussion
KDL is still extremely new, and discussion about the format should happen over
on the [discussions](https://github.com/kdl-org/kdl/discussions) page in the
Github repo. Feel free to jump in and give us your 2 cents!
</section>

View File

@ -1,11 +0,0 @@
<section class="kdl-section" id="design-principles">
## Design Principles
1. Maintainability
1. Flexibility
1. Cognitive simplicity and Learnability
1. Ease of de/serialization
1. Ease of implementation
</section>

View File

@ -1,103 +0,0 @@
<section class="kdl-section" id="faq">
## FAQ
#### How do you pronounce KDL?
Same as "cuddle".
#### Why yet another document language?
Because nothing out there felt quite right. The closest one I found was
SDLang, but that had some design choices I disagreed with.
#### Ok, then, why not SDLang?
SDLang is designed for use cases that are not interesting to me, but are very
relevant to the D-lang community. KDL is very similar in many ways, but is
different in the following ways:
* The grammar and expected semantics are [well-defined and specified](https://github.com/kdl-org/kdl/blob/main/SPEC.md).
* There is only one "number" type. KDL does not prescribe representations.
* Slashdash (`/-`) comments are great and useful!
* I am not interested in having first-class date types, and SDLang's are very
non-standard.
* Values and properties can be interspersed with each other, rather than one
having to follow the other.
* KDL does not have a first-class binary data type. Just use strings with base64.
* All strings in KDL are multi-line, and raw strings are written with
Rust-style syntax (`r"foo"`), instead of backticks.
* KDL identifiers can use UTF-8 and are much more lax about symbols than SDLang.
* KDL does not support "anonymous" nodes.
* Instead, KDL supports arbitrary identifiers for node names and attribute
names, meaning you can use arbitrary strings for those: `"123" "value"=1` is
a valid node, for example. This makes it easier to use KDL for
representing arbitrary key/value pairs.
#### Have you seen that one XKCD comic about standards?
Yes. I have. Please stop linking me to it.
#### What about YAML?
YAML is a great, widespread language. Unlike KDL, which is node-based (like
XML or HTML), it's based on map and array data structures, which can provide
an easier serialization experience in some cases.
At the same time, YAML can be ambiguous about what types the data written into
it is. There's also a persistent issue where very large YAML files become
unmanageable, especially due to the significant indentation feature.
KDL is designed to avoid these particular pitfalls by always being explicit
about types, and having clearly-delimited scope (and the ability to
auto-indent/auto-format). Syntax errors are easier to catch, and large files
are (hopefully!) much more manageable.
#### What about JSON?
JSON is a great serialization language, but it can be very difficult to use as
a human configuration language. This is largely due to its very specific, very
strict syntax, as well as its lack of support for comments.
KDL, on the other hand, has great comment support, and has a much more
forgiving syntax without being so flexible as to allow certain classes of
unfortunate mistakes. It also has much more flexibility around how to
represent data.
If you need to interoperate with a service that consumes or emits JSON, or for
some other reason have need to write "JSON in KDL", [we have JiK, an official
microsyntax for losslessly encoding JSON](https://github.com/kdl-org/kdl/blob/main/JSON-IN-KDL.md).
#### What about TOML?
It nests very poorly. It doesn't fare well with large files.
#### What about XML?
XML is actually pretty fantastic, and has long been a standard for data
exchange across many industries. At the same time, XML is known to be very
verbose, and editing it involves writing (and updating) matching tags. Another
large pitfall with XML is its lack of direct support for arbitrary string
key/value pairs, so what would be a simple `foo: x` in some languages has to
be represented as `<entry name="foo" value="x" />` or something similar. XML
also functions great as a **markup** language. That is, it is easy to
intersperse with text, like HTML.
KDL, just like XML, is a node/element-based language, but with much more
lightweight syntax. It also adds the ability to apply anonymous values
directly to a node, rather than as children. That is, `nodename 1 2 3` instead
of `<element><child>1</child><child>2</child>(etc)</element>`. This can make
it much more manageable and readable as a human configuration language, and is
also less verbose when exchanging documents across APIs!
Finally, KDL is **not** a markup language. XML or HTML do a much better job of
"marking up" a text document with special tags, although KDL can still be
useful for templating engines that want to be more strict about text
fragments.
If you need to interoperate with a service that consumes or emits XML, or for
some other reason have need to write "XML in KDL", [we have XiK, an official
microsyntax for losslessly encoding XML](https://github.com/kdl-org/kdl/blob/main/XML-IN-KDL.md).
</section>

View File

@ -1,32 +0,0 @@
<section class="kdl-section" id="implementations">
## Implementations
* Rust: [kdl-rs](https://github.com/kdl-org/kdl-rs), [knuffel](https://crates.io/crates/knuffel/) (latter includes derive macro), and [kaydle](https://github.com/Lucretiel/kaydle) (serde-based)
* JavaScript: [kdljs](https://github.com/kdl-org/kdljs), [@virtualstate/kdl](https://github.com/virtualstate/kdl) (query only, JSX based)
* Ruby: [kdl-rb](https://github.com/danini-the-panini/kdl-rb)
* Dart: [kdl-dart](https://github.com/danini-the-panini/kdl-dart)
* Java: [kdl4j](https://github.com/hkolbeck/kdl4j)
* PHP: [kdl-php](https://github.com/kdl-org/kdl-php)
* Python: [kdl-py](https://github.com/tabatkins/kdlpy), [cuddle](https://github.com/djmattyg007/python-cuddle), [ckdl](https://github.com/tjol/ckdl)
* Elixir: [kuddle](https://github.com/IceDragon200/kuddle)
* XSLT: [xml2kdl](https://github.com/Devasta/XML2KDL)
* Haskell: [Hustle](https://github.com/fuzzypixelz/Hustle)
* .NET: [Kadlet](https://github.com/oledfish/Kadlet)
* C: [ckdl](https://github.com/tjol/ckdl)
* C++: [kdlpp](https://github.com/tjol/ckdl) (part of ckdl, requires C++20)
* OCaml: [ocaml-kdl](https://github.com/Bannerets/ocaml-kdl)
* Nim: [kdl-nim](https://github.com/Patitotective/kdl-nim)
* Common Lisp: [kdlcl](https://github.com/chee/kdlcl)
* Go: [gokdl](https://github.com/lunjon/gokdl), [kdl-go](https://github.com/sblinch/kdl-go)
* Swift: [kdl-swift](https://github.com/danini-the-panini/kdl-swift)
* Crystal: [kdl-cr](https://github.com/danini-the-panini/kdl-cr)
* Lua: [kdlua](https://github.com/danini-the-panini/kdlua)
## Editor Support
* [VS Code](https://marketplace.visualstudio.com/items?itemName=kdl-org.kdl&ssr=false#review-details)
* [Sublime Text](https://packagecontrol.io/packages/KDL)
* [Intellij IDEA](https://plugins.jetbrains.com/plugin/20136-kdl-document-language)
* [vim](https://github.com/imsnif/kdl.vim)
</section>

View File

@ -1,180 +0,0 @@
<section class="kdl-section" id="overview">
## Overview
### Basics
A KDL node is a node name, followed by zero or more "arguments", and
children.
```kdl
title "Hello, World"
```
You can also have multiple values in a single node!
```kdl
bookmarks 12 15 188 1234
```
Nodes can have properties.
```kdl
author "Alex Monad" email="alex@example.com" active=true
```
And they can have nested child nodes, too!
```kdl
contents {
section "First section" {
paragraph "This is the first paragraph"
paragraph "This is the second paragraph"
}
}
```
Nodes without children are terminated by a newline, a semicolon, or the end of
a file stream:
```kdl
node1; node2; node3;
```
### Values
KDL supports 4 data types:
* Strings: `"hello world"`
* Numbers: `123.45`
* Booleans: `true` and `false`
* Null: `null`
#### Strings
It supports two different formats for string input: escaped and raw.
```kdl
node "this\nhas\tescapes"
other r"C:\Users\zkat\"
```
Both types of string can be multiline as-is, without a different syntax:
```kdl
string "my
multiline
value"
```
And for raw strings, you can add any number of # after the r and the last " to
disambiguate literal " characters:
```kdl
other-raw r#"hello"world"#
```
#### Numbers
There's 4 ways to represent numbers in KDL. KDL does not prescribe any
representation for these numbers, and it's entirely up to individual
implementations whether to represent all numbers with a single type, or to
have different representations for different forms.
KDL has regular decimal-radix numbers, with optional decimal part, as well as
an optional exponent.
```kdl
num 1.234e-42
```
And using the appropriate prefix, you can also enter hexadecimal, octal, and
binary literals:
```kdl
my-hex 0xdeadbeef
my-octal 0o755
my-binary 0b10101101
```
Finally, all numbers can have underscores to help readability:
```kdl
bignum 1_000_000
```
### Comments
KDL supports C-style comments, both line-based and multiline. Multiline
comments can be nested.
```kdl
// C style
/*
C style multiline
*/
tag /*foo=true*/ bar=false
/*/*
hello
*/*/
```
On top of that, KDL supports `/-` "slashdash" comments, which can be used to
comment out individual nodes, arguments, or children:
```kdl
// This entire node and its children are all commented out.
/-mynode "foo" key=1 {
a
b
c
}
mynode /-"commented" "not commented" /-key="value" /-{
a
b
}
```
### Type Annotations
KDL supports type annotations on both values and nodes. These can be
arbitrary, but can be used by individual implementations or use-cases to
constrain KDL's basic types. A number of type names are also reserved to have
specific meanings.
```kdl
numbers (u8)10 (i32)20 myfloat=(f32)1.5 {
strings (uuid)"123e4567-e89b-12d3-a456-426614174000" (date)"2021-02-03" filter=(regex)r"$\d+"
(author)person name="Alex"
}
```
### More Details
```kdl
// Nodes can be separated into multiple lines
title \
"Some title"
// Files must be utf8 encoded!
smile "😁"
// Instead of anonymous nodes, nodes and properties can be wrapped
// in "" for arbitrary node names.
"!@#$@$%Q#$%~@!40" "1.2.3" "!!!!!"=true
// The following is a legal bare identifier:
foo123~!@#$%^&*.:'|?+ "weeee"
// And you can also use unicode!
ノード お名前="☜(゚ヮ゚☜)"
// kdl specifically allows properties and values to be
// interspersed with each other, much like CLI commands.
foo bar=true "baz" quux=false 1 2 3
```
</section>

View File

@ -55,14 +55,15 @@ package {
For more details, see the [overview below](#overview). For more details, see the [overview below](#overview).
There's a living [specification](SPEC.md), as well as various There's a living
[implementations](#implementations). You can also check out the [FAQ](#faq) to [specification](https://github.com/kdl-org/kdl/blob/main/SPEC.md), as well as
answer all your burning questions! various [implementations](#implementations). You can also check out the
[FAQ](#faq) to answer all your burning questions!
The current version of the KDL spec is `2.0.0`. For legacy KDL, please refer to The current version of the KDL spec is `2.0.0`. For legacy KDL, please refer to
the [KDL 1.0 spec](./SPEC_v1.md). All users are encouraged to migrate. the [KDL 1.0 spec](https://github.com/kdl-org/kdl/blob/main/SPEC_v1.md). All
[Migration is forward-and-backward-compatible and users are encouraged to migrate. [Migration is forward-and-backward-compatible
safe](./SPEC.md#compatibility), and can be automated. and safe](./SPEC.md#compatibility), and can be automated.
In addition to a spec for KDL itself, there are specifications for [a KDL Query In addition to a spec for KDL itself, there are specifications for [a KDL Query
Language](QUERY-SPEC.md) based on CSS selectors, and [a KDL Schema Language](QUERY-SPEC.md) based on CSS selectors, and [a KDL Schema
@ -397,8 +398,8 @@ between it and JSON or XML. These specifications define a stricter _subset_ of
KDL that, even if not entirely idiomatic, is still valid and fits into the KDL that, even if not entirely idiomatic, is still valid and fits into the
data models of the other two languages: data models of the other two languages:
* [JSON in KDL](JSON-IN-KDL.md) * [JSON in KDL](https://github.com/kdl-org/kdl/blob/main/JSON-IN-KDL.md)
* [XML in KDL](XML-IN-KDL.md) * [XML in KDL](https://github.com/kdl-org/kdl/blob/main/JSON-IN-KDL.md)
</section> </section>
@ -485,7 +486,8 @@ represent data.
If you need to interoperate with a service that consumes or emits JSON, or for If you need to interoperate with a service that consumes or emits JSON, or for
some other reason have need to write "JSON in KDL", [we have JiK, an official some other reason have need to write "JSON in KDL", [we have JiK, an official
microsyntax for losslessly encoding JSON](JSON-IN-KDL.md). microsyntax for losslessly encoding
JSON](https://github.com/kdl-org/kdl/blob/main/JSON-IN-KDL.md).
#### What about TOML? #### What about TOML?
@ -516,6 +518,6 @@ fragments.
If you need to interoperate with a service that consumes or emits XML, or for If you need to interoperate with a service that consumes or emits XML, or for
some other reason have need to write "XML in KDL", [we have XiK, an official some other reason have need to write "XML in KDL", [we have XiK, an official
microsyntax for losslessly encoding XML](XML-IN-KDL.md). microsyntax for losslessly encoding XML](https://github.com/kdl-org/kdl/blob/main/XML-IN-KDL.md).
</section> </section>