mdast-control 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +359 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +534 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lsp/requests.d.ts +215 -0
- package/dist/lsp/requests.js +613 -0
- package/dist/lsp/requests.js.map +1 -0
- package/dist/lsp/server.d.ts +1 -0
- package/dist/lsp/server.js +110 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/lsp-methods.d.ts +25 -0
- package/dist/lsp-methods.js +26 -0
- package/dist/lsp-methods.js.map +1 -0
- package/dist/markdown.d.ts +17 -0
- package/dist/markdown.js +140 -0
- package/dist/markdown.js.map +1 -0
- package/dist/plugins.d.ts +144 -0
- package/dist/plugins.js +833 -0
- package/dist/plugins.js.map +1 -0
- package/dist/query.d.ts +8 -0
- package/dist/query.js +518 -0
- package/dist/query.js.map +1 -0
- package/dist/table-interchange.d.ts +22 -0
- package/dist/table-interchange.js +191 -0
- package/dist/table-interchange.js.map +1 -0
- package/dist/table-model.d.ts +15 -0
- package/dist/table-model.js +105 -0
- package/dist/table-model.js.map +1 -0
- package/dist/table-structural.d.ts +9 -0
- package/dist/table-structural.js +190 -0
- package/dist/table-structural.js.map +1 -0
- package/dist/table.d.ts +49 -0
- package/dist/table.js +131 -0
- package/dist/table.js.map +1 -0
- package/dist/transport.d.ts +6 -0
- package/dist/transport.js +7 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
- package/scripts/verify-package.mjs +252 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createConnection, DiagnosticSeverity, ProposedFeatures, SymbolKind, TextDocuments, TextDocumentSyncKind, } from 'vscode-languageserver/node.js';
|
|
2
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
3
|
+
import { parseMarkdown, validateQuery, } from '../markdown.js';
|
|
4
|
+
import { registerMdastRequestHandlers, } from './requests.js';
|
|
5
|
+
const connection = createConnection(ProposedFeatures.all);
|
|
6
|
+
const documents = new TextDocuments(TextDocument);
|
|
7
|
+
connection.onInitialize(() => ({
|
|
8
|
+
capabilities: {
|
|
9
|
+
textDocumentSync: TextDocumentSyncKind.Incremental,
|
|
10
|
+
documentSymbolProvider: true,
|
|
11
|
+
},
|
|
12
|
+
}));
|
|
13
|
+
documents.onDidOpen(({ document }) => {
|
|
14
|
+
validateDocument(document);
|
|
15
|
+
});
|
|
16
|
+
documents.onDidChangeContent(({ document }) => {
|
|
17
|
+
validateDocument(document);
|
|
18
|
+
});
|
|
19
|
+
connection.onDocumentSymbol(({ textDocument }) => {
|
|
20
|
+
const document = documents.get(textDocument.uri);
|
|
21
|
+
if (!document) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const tree = parseMarkdown(document.getText());
|
|
25
|
+
const symbols = [];
|
|
26
|
+
buildSymbols(tree, [], symbols);
|
|
27
|
+
return symbols;
|
|
28
|
+
});
|
|
29
|
+
registerMdastRequestHandlers(connection, (uri) => documents.get(uri)?.getText());
|
|
30
|
+
documents.listen(connection);
|
|
31
|
+
connection.listen();
|
|
32
|
+
function validateDocument(document) {
|
|
33
|
+
const diagnostics = [];
|
|
34
|
+
const text = document.getText();
|
|
35
|
+
const fencePattern = /^```mdast-query\r?\n([\s\S]*?)\r?\n```$/gm;
|
|
36
|
+
for (const match of text.matchAll(fencePattern)) {
|
|
37
|
+
if (match.index === undefined) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const query = match[1];
|
|
41
|
+
const lineBreakLength = match[0].includes('\r\n') ? 2 : 1;
|
|
42
|
+
const queryStart = match.index + '```mdast-query'.length + lineBreakLength;
|
|
43
|
+
const errors = validateQuery(query);
|
|
44
|
+
for (const error of errors) {
|
|
45
|
+
diagnostics.push({
|
|
46
|
+
severity: DiagnosticSeverity.Error,
|
|
47
|
+
range: {
|
|
48
|
+
start: document.positionAt(queryStart),
|
|
49
|
+
end: document.positionAt(queryStart + query.length),
|
|
50
|
+
},
|
|
51
|
+
message: error,
|
|
52
|
+
source: 'mdast-query',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
connection.sendDiagnostics({ uri: document.uri, diagnostics });
|
|
57
|
+
}
|
|
58
|
+
function buildSymbols(node, path, target) {
|
|
59
|
+
for (const [index, child] of (node.children ?? []).entries()) {
|
|
60
|
+
const currentPath = [...path, index];
|
|
61
|
+
const name = symbolName(child, currentPath);
|
|
62
|
+
const range = nodeRange(child);
|
|
63
|
+
const symbol = {
|
|
64
|
+
name,
|
|
65
|
+
kind: symbolKind(child),
|
|
66
|
+
range,
|
|
67
|
+
selectionRange: range,
|
|
68
|
+
children: [],
|
|
69
|
+
};
|
|
70
|
+
buildSymbols(child, currentPath, symbol.children);
|
|
71
|
+
target.push(symbol);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function symbolName(node, path) {
|
|
75
|
+
if (node.type === 'heading') {
|
|
76
|
+
const text = flattenText(node).trim();
|
|
77
|
+
return text ? `H${String(node.depth ?? '?')}: ${text}` : `heading ${path.join('.')}`;
|
|
78
|
+
}
|
|
79
|
+
if (node.type === 'paragraph') {
|
|
80
|
+
const text = flattenText(node).trim();
|
|
81
|
+
return text ? `paragraph: ${text.slice(0, 30)}` : 'paragraph';
|
|
82
|
+
}
|
|
83
|
+
return node.type;
|
|
84
|
+
}
|
|
85
|
+
function symbolKind(node) {
|
|
86
|
+
if (node.type === 'heading') {
|
|
87
|
+
return SymbolKind.Namespace;
|
|
88
|
+
}
|
|
89
|
+
if (node.children?.length) {
|
|
90
|
+
return SymbolKind.Object;
|
|
91
|
+
}
|
|
92
|
+
return SymbolKind.String;
|
|
93
|
+
}
|
|
94
|
+
function flattenText(node) {
|
|
95
|
+
if (typeof node.value === 'string') {
|
|
96
|
+
return node.value;
|
|
97
|
+
}
|
|
98
|
+
return (node.children ?? []).map(flattenText).join(' ');
|
|
99
|
+
}
|
|
100
|
+
function nodeRange(node) {
|
|
101
|
+
const startLine = Math.max(Number(node.position?.start?.line ?? 1) - 1, 0);
|
|
102
|
+
const startCharacter = Math.max(Number(node.position?.start?.column ?? 1) - 1, 0);
|
|
103
|
+
const endLine = Math.max(Number(node.position?.end?.line ?? startLine + 1) - 1, startLine);
|
|
104
|
+
const endCharacter = Math.max(Number(node.position?.end?.column ?? startCharacter + 1) - 1, startCharacter + 1);
|
|
105
|
+
return {
|
|
106
|
+
start: { line: startLine, character: startCharacter },
|
|
107
|
+
end: { line: endLine, character: endCharacter },
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lsp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const MDAST_REQUEST_METHODS: {
|
|
2
|
+
readonly capabilities: "mdast/capabilities";
|
|
3
|
+
readonly pluginList: "mdast/pluginList";
|
|
4
|
+
readonly pluginShow: "mdast/pluginShow";
|
|
5
|
+
readonly elementCapabilities: "mdast/elementCapabilities";
|
|
6
|
+
readonly pluginOperation: "mdast/pluginOperation";
|
|
7
|
+
readonly pluginRun: "mdast/pluginRun";
|
|
8
|
+
readonly query: "mdast/query";
|
|
9
|
+
readonly insert: "mdast/insert";
|
|
10
|
+
readonly delete: "mdast/delete";
|
|
11
|
+
readonly replace: "mdast/replace";
|
|
12
|
+
readonly wrap: "mdast/wrap";
|
|
13
|
+
readonly unwrap: "mdast/unwrap";
|
|
14
|
+
readonly move: "mdast/move";
|
|
15
|
+
readonly copy: "mdast/copy";
|
|
16
|
+
readonly tableQuery: "mdast/tableQuery";
|
|
17
|
+
readonly tableExport: "mdast/tableExport";
|
|
18
|
+
readonly tableImport: "mdast/tableImport";
|
|
19
|
+
readonly tableUpdateCell: "mdast/tableUpdateCell";
|
|
20
|
+
readonly tableInsertRow: "mdast/tableInsertRow";
|
|
21
|
+
readonly tableDeleteRow: "mdast/tableDeleteRow";
|
|
22
|
+
readonly tableAddColumn: "mdast/tableAddColumn";
|
|
23
|
+
readonly tableDeleteColumn: "mdast/tableDeleteColumn";
|
|
24
|
+
readonly tableSort: "mdast/tableSort";
|
|
25
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const MDAST_REQUEST_METHODS = {
|
|
2
|
+
capabilities: 'mdast/capabilities',
|
|
3
|
+
pluginList: 'mdast/pluginList',
|
|
4
|
+
pluginShow: 'mdast/pluginShow',
|
|
5
|
+
elementCapabilities: 'mdast/elementCapabilities',
|
|
6
|
+
pluginOperation: 'mdast/pluginOperation',
|
|
7
|
+
pluginRun: 'mdast/pluginRun',
|
|
8
|
+
query: 'mdast/query',
|
|
9
|
+
insert: 'mdast/insert',
|
|
10
|
+
delete: 'mdast/delete',
|
|
11
|
+
replace: 'mdast/replace',
|
|
12
|
+
wrap: 'mdast/wrap',
|
|
13
|
+
unwrap: 'mdast/unwrap',
|
|
14
|
+
move: 'mdast/move',
|
|
15
|
+
copy: 'mdast/copy',
|
|
16
|
+
tableQuery: 'mdast/tableQuery',
|
|
17
|
+
tableExport: 'mdast/tableExport',
|
|
18
|
+
tableImport: 'mdast/tableImport',
|
|
19
|
+
tableUpdateCell: 'mdast/tableUpdateCell',
|
|
20
|
+
tableInsertRow: 'mdast/tableInsertRow',
|
|
21
|
+
tableDeleteRow: 'mdast/tableDeleteRow',
|
|
22
|
+
tableAddColumn: 'mdast/tableAddColumn',
|
|
23
|
+
tableDeleteColumn: 'mdast/tableDeleteColumn',
|
|
24
|
+
tableSort: 'mdast/tableSort',
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=lsp-methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-methods.js","sourceRoot":"","sources":["../src/lsp-methods.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,YAAY,EAAE,oBAAoB;IAClC,UAAU,EAAE,kBAAkB;IAC9B,UAAU,EAAE,kBAAkB;IAC9B,mBAAmB,EAAE,2BAA2B;IAChD,eAAe,EAAE,uBAAuB;IACxC,SAAS,EAAE,iBAAiB;IAC5B,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,cAAc;IACtB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,UAAU,EAAE,kBAAkB;IAC9B,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,mBAAmB;IAChC,eAAe,EAAE,uBAAuB;IACxC,cAAc,EAAE,sBAAsB;IACtC,cAAc,EAAE,sBAAsB;IACtC,cAAc,EAAE,sBAAsB;IACtC,iBAAiB,EAAE,yBAAyB;IAC5C,SAAS,EAAE,iBAAiB;CACpB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { InsertPosition, InsertResult, MdastNode, MoveTargetPolicy, MutationResult } from './types.js';
|
|
2
|
+
export declare function parseMarkdown(markdown: string): MdastNode;
|
|
3
|
+
export declare function stringifyAst(tree: MdastNode): string;
|
|
4
|
+
export declare function astToJson(tree: MdastNode, pretty?: boolean): string;
|
|
5
|
+
export declare function jsonToAst(input: string): MdastNode;
|
|
6
|
+
export declare function convertMarkdownToAstJson(markdown: string, pretty?: boolean): string;
|
|
7
|
+
export declare function restoreMarkdownFromAstJson(input: string): string;
|
|
8
|
+
export declare function insertMarkdown(markdown: string, query: string, position: InsertPosition, snippetMarkdown: string): InsertResult;
|
|
9
|
+
export declare function deleteMarkdown(markdown: string, query: string): MutationResult;
|
|
10
|
+
export declare function replaceMarkdown(markdown: string, query: string, snippetMarkdown: string): MutationResult;
|
|
11
|
+
export declare function wrapMarkdown(markdown: string, query: string, wrapperMarkdown: string): MutationResult;
|
|
12
|
+
export declare function unwrapMarkdown(markdown: string, query: string): MutationResult;
|
|
13
|
+
export declare function moveMarkdown(markdown: string, sourceQuery: string, targetQuery: string, position: InsertPosition, targetPolicy?: MoveTargetPolicy): MutationResult;
|
|
14
|
+
export declare function copyMarkdown(markdown: string, sourceQuery: string, targetQuery: string, position: InsertPosition, targetPolicy?: MoveTargetPolicy): MutationResult;
|
|
15
|
+
export declare function validateQuery(input: string): string[];
|
|
16
|
+
export declare function isInsertPosition(input: string): input is InsertPosition;
|
|
17
|
+
export declare function isMoveTargetPolicy(input: string): input is MoveTargetPolicy;
|
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { unified } from 'unified';
|
|
2
|
+
import remarkGfm from 'remark-gfm';
|
|
3
|
+
import remarkParse from 'remark-parse';
|
|
4
|
+
import remarkStringify from 'remark-stringify';
|
|
5
|
+
import { applyDelete, applyInsert, applyReplace, applyUnwrap, applyWrap, parseQuery, queryAst } from './query.js';
|
|
6
|
+
const parser = unified().use(remarkParse).use(remarkGfm);
|
|
7
|
+
const compiler = unified().use(remarkStringify, {
|
|
8
|
+
bullet: '-',
|
|
9
|
+
fences: true,
|
|
10
|
+
listItemIndent: 'one',
|
|
11
|
+
}).use(remarkGfm);
|
|
12
|
+
export function parseMarkdown(markdown) {
|
|
13
|
+
return parser.parse(markdown);
|
|
14
|
+
}
|
|
15
|
+
export function stringifyAst(tree) {
|
|
16
|
+
return String(compiler.stringify(tree));
|
|
17
|
+
}
|
|
18
|
+
export function astToJson(tree, pretty = true) {
|
|
19
|
+
return JSON.stringify(tree, null, pretty ? 2 : 0);
|
|
20
|
+
}
|
|
21
|
+
export function jsonToAst(input) {
|
|
22
|
+
const parsed = JSON.parse(input);
|
|
23
|
+
assertMdastNode(parsed, '$');
|
|
24
|
+
return parsed;
|
|
25
|
+
}
|
|
26
|
+
export function convertMarkdownToAstJson(markdown, pretty = true) {
|
|
27
|
+
return astToJson(parseMarkdown(markdown), pretty);
|
|
28
|
+
}
|
|
29
|
+
export function restoreMarkdownFromAstJson(input) {
|
|
30
|
+
return stringifyAst(jsonToAst(input));
|
|
31
|
+
}
|
|
32
|
+
export function insertMarkdown(markdown, query, position, snippetMarkdown) {
|
|
33
|
+
const tree = parseMarkdown(markdown);
|
|
34
|
+
const snippetTree = parseMarkdown(snippetMarkdown);
|
|
35
|
+
const matches = queryAst(tree, query);
|
|
36
|
+
return applyInsert(tree, matches, position, snippetTree.children ?? []);
|
|
37
|
+
}
|
|
38
|
+
export function deleteMarkdown(markdown, query) {
|
|
39
|
+
const tree = parseMarkdown(markdown);
|
|
40
|
+
const matches = queryAst(tree, query);
|
|
41
|
+
return applyDelete(tree, matches);
|
|
42
|
+
}
|
|
43
|
+
export function replaceMarkdown(markdown, query, snippetMarkdown) {
|
|
44
|
+
const tree = parseMarkdown(markdown);
|
|
45
|
+
const snippetTree = parseMarkdown(snippetMarkdown);
|
|
46
|
+
const matches = queryAst(tree, query);
|
|
47
|
+
return applyReplace(tree, matches, snippetTree.children ?? []);
|
|
48
|
+
}
|
|
49
|
+
export function wrapMarkdown(markdown, query, wrapperMarkdown) {
|
|
50
|
+
const tree = parseMarkdown(markdown);
|
|
51
|
+
const wrapperTree = parseMarkdown(wrapperMarkdown);
|
|
52
|
+
const matches = queryAst(tree, query);
|
|
53
|
+
return applyWrap(tree, matches, wrapperTree.children ?? []);
|
|
54
|
+
}
|
|
55
|
+
export function unwrapMarkdown(markdown, query) {
|
|
56
|
+
const tree = parseMarkdown(markdown);
|
|
57
|
+
const matches = queryAst(tree, query);
|
|
58
|
+
return applyUnwrap(tree, matches);
|
|
59
|
+
}
|
|
60
|
+
export function moveMarkdown(markdown, sourceQuery, targetQuery, position, targetPolicy = 'exactly-one') {
|
|
61
|
+
const tree = parseMarkdown(markdown);
|
|
62
|
+
const sourceMatches = normalizeNonOverlappingMatches(queryAst(tree, sourceQuery));
|
|
63
|
+
const movedNodes = sourceMatches.map((match) => structuredClone(match.node));
|
|
64
|
+
applyDelete(tree, sourceMatches);
|
|
65
|
+
const target = selectTargetMatch(queryAst(tree, targetQuery), targetPolicy, 'Move');
|
|
66
|
+
const result = applyInsert(tree, [target], position, movedNodes);
|
|
67
|
+
return { tree: result.tree, changed: movedNodes.length };
|
|
68
|
+
}
|
|
69
|
+
export function copyMarkdown(markdown, sourceQuery, targetQuery, position, targetPolicy = 'exactly-one') {
|
|
70
|
+
const tree = parseMarkdown(markdown);
|
|
71
|
+
const sourceMatches = normalizeNonOverlappingMatches(queryAst(tree, sourceQuery));
|
|
72
|
+
if (sourceMatches.some((match) => match.path.length === 0)) {
|
|
73
|
+
throw new Error('Cannot copy root node');
|
|
74
|
+
}
|
|
75
|
+
const copiedNodes = sourceMatches.map((match) => structuredClone(match.node));
|
|
76
|
+
const target = selectTargetMatch(queryAst(tree, targetQuery), targetPolicy, 'Copy');
|
|
77
|
+
const result = applyInsert(tree, [target], position, copiedNodes);
|
|
78
|
+
return { tree: result.tree, changed: copiedNodes.length };
|
|
79
|
+
}
|
|
80
|
+
export function validateQuery(input) {
|
|
81
|
+
try {
|
|
82
|
+
parseQuery(input);
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return [error instanceof Error ? error.message : 'Unknown query error'];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function isInsertPosition(input) {
|
|
90
|
+
return input === 'before' || input === 'after' || input === 'prepend' || input === 'append';
|
|
91
|
+
}
|
|
92
|
+
export function isMoveTargetPolicy(input) {
|
|
93
|
+
return input === 'exactly-one' || input === 'first' || input === 'last';
|
|
94
|
+
}
|
|
95
|
+
function selectTargetMatch(matches, policy, operation) {
|
|
96
|
+
if (!isMoveTargetPolicy(policy)) {
|
|
97
|
+
throw new Error(`Unsupported move target policy "${String(policy)}"`);
|
|
98
|
+
}
|
|
99
|
+
if (policy === 'exactly-one') {
|
|
100
|
+
if (matches.length !== 1) {
|
|
101
|
+
throw new Error(`${operation} requires exactly one target match, received ${String(matches.length)}`);
|
|
102
|
+
}
|
|
103
|
+
return matches[0];
|
|
104
|
+
}
|
|
105
|
+
if (matches.length === 0) {
|
|
106
|
+
throw new Error(`${operation} target policy "${policy}" requires at least one target match`);
|
|
107
|
+
}
|
|
108
|
+
return policy === 'first' ? matches[0] : matches[matches.length - 1];
|
|
109
|
+
}
|
|
110
|
+
function normalizeNonOverlappingMatches(matches) {
|
|
111
|
+
return matches.filter((candidate) => {
|
|
112
|
+
return !matches.some((other) => {
|
|
113
|
+
if (other === candidate || other.path.length >= candidate.path.length) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
return other.path.every((value, index) => candidate.path[index] === value);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function assertMdastNode(value, path) {
|
|
121
|
+
if (!isRecord(value)) {
|
|
122
|
+
throw new Error(`Invalid mdast node at ${path}: expected an object`);
|
|
123
|
+
}
|
|
124
|
+
if (typeof value.type !== 'string' || value.type.length === 0) {
|
|
125
|
+
throw new Error(`Invalid mdast node at ${path}: "type" must be a non-empty string`);
|
|
126
|
+
}
|
|
127
|
+
if (!Object.hasOwn(value, 'children')) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (!Array.isArray(value.children)) {
|
|
131
|
+
throw new Error(`Invalid mdast node at ${path}: "children" must be an array when present`);
|
|
132
|
+
}
|
|
133
|
+
for (const [index, child] of value.children.entries()) {
|
|
134
|
+
assertMdastNode(child, `${path}.children[${String(index)}]`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function isRecord(value) {
|
|
138
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { MdastNode, QueryMatch } from './types.js';
|
|
2
|
+
export type CapabilityAvailability = 'available' | 'planned';
|
|
3
|
+
export type OperationParamType = 'string' | 'number' | 'boolean' | 'enum' | 'json';
|
|
4
|
+
export type OperationParamDescriptor = {
|
|
5
|
+
name: string;
|
|
6
|
+
type: OperationParamType;
|
|
7
|
+
required: boolean;
|
|
8
|
+
description: string;
|
|
9
|
+
enumValues?: string[];
|
|
10
|
+
defaultValue?: unknown;
|
|
11
|
+
};
|
|
12
|
+
export type OperationResultDescriptor = {
|
|
13
|
+
type: 'markdown' | 'json' | 'text' | 'mutation';
|
|
14
|
+
shapeDescription: string;
|
|
15
|
+
};
|
|
16
|
+
export type OperationDescriptor = {
|
|
17
|
+
name: string;
|
|
18
|
+
title: string;
|
|
19
|
+
description: string;
|
|
20
|
+
targetKinds: string[];
|
|
21
|
+
targetCardinality: 'exactly-one' | 'zero-or-one' | 'one-or-more' | 'zero-or-more';
|
|
22
|
+
category: 'query' | 'edit' | 'convert' | 'analyze';
|
|
23
|
+
params: OperationParamDescriptor[];
|
|
24
|
+
result: OperationResultDescriptor;
|
|
25
|
+
availability: CapabilityAvailability;
|
|
26
|
+
examples?: string[];
|
|
27
|
+
stability: 'experimental' | 'stable';
|
|
28
|
+
};
|
|
29
|
+
export type QueryExtensionDescriptor = {
|
|
30
|
+
kind: 'pseudo-field' | 'selector-sugar';
|
|
31
|
+
name: string;
|
|
32
|
+
targetKinds: string[];
|
|
33
|
+
valueType: 'string' | 'number' | 'boolean';
|
|
34
|
+
operators: string[];
|
|
35
|
+
description: string;
|
|
36
|
+
availability: CapabilityAvailability;
|
|
37
|
+
};
|
|
38
|
+
export type ConverterDescriptor = {
|
|
39
|
+
name: string;
|
|
40
|
+
sourceFormat: string;
|
|
41
|
+
targetFormat: string;
|
|
42
|
+
description: string;
|
|
43
|
+
params: OperationParamDescriptor[];
|
|
44
|
+
availability: CapabilityAvailability;
|
|
45
|
+
};
|
|
46
|
+
export type AstElementPlugin = {
|
|
47
|
+
id: string;
|
|
48
|
+
version: string;
|
|
49
|
+
elementKinds: string[];
|
|
50
|
+
title: string;
|
|
51
|
+
description: string;
|
|
52
|
+
availability: CapabilityAvailability;
|
|
53
|
+
queryExtensions?: QueryExtensionDescriptor[];
|
|
54
|
+
operations: OperationDescriptor[];
|
|
55
|
+
converters?: ConverterDescriptor[];
|
|
56
|
+
handlers?: Record<string, PluginOperationHandler>;
|
|
57
|
+
};
|
|
58
|
+
export type PluginOperationArgs = Record<string, unknown>;
|
|
59
|
+
export type PluginOperationContext = {
|
|
60
|
+
markdown: string;
|
|
61
|
+
query: string;
|
|
62
|
+
args: PluginOperationArgs;
|
|
63
|
+
descriptor: OperationDescriptor;
|
|
64
|
+
tree: MdastNode;
|
|
65
|
+
matches: QueryMatch[];
|
|
66
|
+
};
|
|
67
|
+
export type PluginRunResult = {
|
|
68
|
+
kind: 'mutation';
|
|
69
|
+
changed: number;
|
|
70
|
+
markdown: string;
|
|
71
|
+
} | {
|
|
72
|
+
kind: 'text';
|
|
73
|
+
text: string;
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'json';
|
|
76
|
+
value: unknown;
|
|
77
|
+
};
|
|
78
|
+
export type PluginOperationHandler = (context: PluginOperationContext) => PluginRunResult;
|
|
79
|
+
export type PluginRunRequest = {
|
|
80
|
+
plugin: string;
|
|
81
|
+
operation: string;
|
|
82
|
+
markdown: string;
|
|
83
|
+
query: string;
|
|
84
|
+
args?: PluginOperationArgs;
|
|
85
|
+
};
|
|
86
|
+
export type PluginOperationErrorCode = 'unknown-plugin' | 'unknown-operation' | 'operation-unavailable' | 'invalid-query' | 'invalid-params' | 'unsupported-target' | 'target-cardinality' | 'semantic-error';
|
|
87
|
+
export type PluginOperationErrorShape = {
|
|
88
|
+
code: PluginOperationErrorCode;
|
|
89
|
+
plugin: string;
|
|
90
|
+
operation: string;
|
|
91
|
+
message: string;
|
|
92
|
+
details?: Record<string, unknown>;
|
|
93
|
+
};
|
|
94
|
+
export declare class PluginOperationError extends Error {
|
|
95
|
+
readonly code: PluginOperationErrorCode;
|
|
96
|
+
readonly plugin: string;
|
|
97
|
+
readonly operation: string;
|
|
98
|
+
readonly details?: Record<string, unknown>;
|
|
99
|
+
constructor(shape: PluginOperationErrorShape);
|
|
100
|
+
toJSON(): PluginOperationErrorShape;
|
|
101
|
+
}
|
|
102
|
+
export type CoreCapabilities = {
|
|
103
|
+
queryOperators: string[];
|
|
104
|
+
genericOperations: string[];
|
|
105
|
+
customRequests: string[];
|
|
106
|
+
};
|
|
107
|
+
export type PluginCapabilities = Omit<AstElementPlugin, 'elementKinds' | 'handlers'> & {
|
|
108
|
+
elementKinds: string[];
|
|
109
|
+
};
|
|
110
|
+
export type CapabilitiesSnapshot = {
|
|
111
|
+
core: CoreCapabilities;
|
|
112
|
+
plugins: PluginCapabilities[];
|
|
113
|
+
};
|
|
114
|
+
export type ElementCapabilities = {
|
|
115
|
+
elementKind: string;
|
|
116
|
+
plugins: PluginCapabilities[];
|
|
117
|
+
};
|
|
118
|
+
export declare class PluginRegistry {
|
|
119
|
+
private readonly core;
|
|
120
|
+
private readonly plugins;
|
|
121
|
+
private readonly byId;
|
|
122
|
+
private readonly byElementKind;
|
|
123
|
+
constructor(core?: CoreCapabilities, plugins?: AstElementPlugin[]);
|
|
124
|
+
registerPlugin(plugin: AstElementPlugin): void;
|
|
125
|
+
registerPlugins(plugins: AstElementPlugin[]): void;
|
|
126
|
+
getPlugin(id: string): PluginCapabilities | undefined;
|
|
127
|
+
listPlugins(): PluginCapabilities[];
|
|
128
|
+
listPluginsForElementKind(kind: string): PluginCapabilities[];
|
|
129
|
+
getCapabilities(): CapabilitiesSnapshot;
|
|
130
|
+
getPluginCapabilities(pluginId: string): PluginCapabilities | undefined;
|
|
131
|
+
getElementCapabilities(elementKind: string): ElementCapabilities;
|
|
132
|
+
getOperationDescriptor(pluginId: string, operationName: string): OperationDescriptor | undefined;
|
|
133
|
+
listQueryExtensions(): QueryExtensionDescriptor[];
|
|
134
|
+
runOperation(request: PluginRunRequest): PluginRunResult;
|
|
135
|
+
}
|
|
136
|
+
export declare const defaultPluginRegistry: PluginRegistry;
|
|
137
|
+
export declare function getCapabilities(): CapabilitiesSnapshot;
|
|
138
|
+
export declare function getPluginCapabilities(pluginId: string): PluginCapabilities | undefined;
|
|
139
|
+
export declare function getElementCapabilities(elementKind: string): ElementCapabilities;
|
|
140
|
+
export declare function getOperationDescriptor(pluginId: string, operationName: string): OperationDescriptor | undefined;
|
|
141
|
+
export declare function listPlugins(): PluginCapabilities[];
|
|
142
|
+
export declare function listPluginsForElementKind(kind: string): PluginCapabilities[];
|
|
143
|
+
export declare function listQueryExtensions(): QueryExtensionDescriptor[];
|
|
144
|
+
export declare function runPluginOperation(request: PluginRunRequest): PluginRunResult;
|