@marko/language-server 0.12.0 → 0.12.3
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/index.js +13 -6
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +27 -18
- package/dist/index.mjs.map +2 -2
- package/dist/utils/completions/types/openTag.d.ts +1 -1
- package/dist/utils/completions/types/styleContent.d.ts +1 -1
- package/dist/utils/definitions/types/attributeName.d.ts +1 -1
- package/dist/utils/definitions/types/openTagName.d.ts +1 -1
- package/package.json +15 -14
- package/LICENSE +0 -20
package/dist/index.js
CHANGED
|
@@ -37,6 +37,7 @@ var import_node = require("vscode-languageserver/node");
|
|
|
37
37
|
var import_vscode_uri6 = require("vscode-uri");
|
|
38
38
|
var import_vscode_languageserver_textdocument3 = require("vscode-languageserver-textdocument");
|
|
39
39
|
var prettier = __toESM(require("prettier"));
|
|
40
|
+
var markoPrettier = __toESM(require("prettier-plugin-marko"));
|
|
40
41
|
var import_util = require("util");
|
|
41
42
|
|
|
42
43
|
// src/utils/compiler.ts
|
|
@@ -46,6 +47,7 @@ var import_resolve_from = __toESM(require("resolve-from"));
|
|
|
46
47
|
var import_lasso_package_root = __toESM(require("lasso-package-root"));
|
|
47
48
|
var builtinCompiler = __toESM(require("@marko/compiler"));
|
|
48
49
|
var builtinTranslator = __toESM(require("@marko/translator-default"));
|
|
50
|
+
builtinCompiler.configure({ translator: builtinTranslator });
|
|
49
51
|
var compilerAndTranslatorForDoc = /* @__PURE__ */ new WeakMap();
|
|
50
52
|
function getCompilerAndTranslatorForDoc(doc) {
|
|
51
53
|
let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);
|
|
@@ -427,8 +429,8 @@ function closeTag(_taglib, document, _params, event) {
|
|
|
427
429
|
|
|
428
430
|
// src/utils/completions/types/openTag.ts
|
|
429
431
|
var import_vscode_languageserver5 = require("vscode-languageserver");
|
|
430
|
-
function openTag(_taglib,
|
|
431
|
-
const triggerCharacter = params.context && params.context.triggerCharacter;
|
|
432
|
+
function openTag(_taglib, doc, params, event) {
|
|
433
|
+
const triggerCharacter = params.context && params.context.triggerCharacter || doc.getText(import_vscode_languageserver5.Range.create(import_vscode_languageserver5.Position.create(params.position.line, params.position.character - 1), params.position));
|
|
432
434
|
if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
|
|
433
435
|
return;
|
|
434
436
|
}
|
|
@@ -566,11 +568,11 @@ function attributeName2(taglib, document, _params, event) {
|
|
|
566
568
|
const attrDef = taglib.getAttribute(tagName || "*", event.name);
|
|
567
569
|
let range = START_OF_FILE;
|
|
568
570
|
if (!attrDef) {
|
|
569
|
-
return;
|
|
571
|
+
return [];
|
|
570
572
|
}
|
|
571
573
|
const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
|
|
572
574
|
if (!attrEntryFile) {
|
|
573
|
-
return;
|
|
575
|
+
return [];
|
|
574
576
|
}
|
|
575
577
|
if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
|
|
576
578
|
const tagDefDoc = createTextDocument(attrEntryFile);
|
|
@@ -585,6 +587,7 @@ function attributeName2(taglib, document, _params, event) {
|
|
|
585
587
|
}
|
|
586
588
|
|
|
587
589
|
// src/utils/definitions/types/openTagName.ts
|
|
590
|
+
var import_path3 = __toESM(require("path"));
|
|
588
591
|
var import_vscode_uri5 = require("vscode-uri");
|
|
589
592
|
var import_vscode_languageserver9 = require("vscode-languageserver");
|
|
590
593
|
function openTagName2(taglib, document, _params, event) {
|
|
@@ -598,12 +601,15 @@ function openTagName2(taglib, document, _params, event) {
|
|
|
598
601
|
tagDef = taglib.getTag(event.tagName);
|
|
599
602
|
}
|
|
600
603
|
if (!tagDef) {
|
|
601
|
-
return;
|
|
604
|
+
return [];
|
|
602
605
|
}
|
|
603
606
|
const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
|
|
607
|
+
if (!import_path3.default.isAbsolute(tagEntryFile)) {
|
|
608
|
+
return [];
|
|
609
|
+
}
|
|
604
610
|
if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
|
|
605
611
|
const tagDefDoc = createTextDocument(tagEntryFile);
|
|
606
|
-
const match = RegExpBuilder`/"
|
|
612
|
+
const match = RegExpBuilder`/"(?:<${event.tagName}>|${event.tagName})"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
|
|
607
613
|
if (match && match.index) {
|
|
608
614
|
range = import_vscode_languageserver9.Range.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
|
|
609
615
|
}
|
|
@@ -683,6 +689,7 @@ connection.onDocumentFormatting(async ({
|
|
|
683
689
|
const formatted = prettier.format(text, __spreadValues({
|
|
684
690
|
parser: "marko",
|
|
685
691
|
filepath: fsPath,
|
|
692
|
+
plugins: [markoPrettier],
|
|
686
693
|
tabWidth: options.tabSize,
|
|
687
694
|
useTabs: options.insertSpaces === false
|
|
688
695
|
}, scheme === "file" ? await prettier.resolveConfig(fsPath, {
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/utils/compiler.ts", "../src/utils/htmljs-parser.ts", "../src/utils/completions/index.ts", "../src/utils/completions/types/attributeModifier.ts", "../src/utils/completions/types/attributeName.ts", "../src/utils/utils.ts", "../src/utils/completions/types/closeTag.ts", "../src/utils/completions/types/openTag.ts", "../src/utils/completions/types/openTagName.ts", "../src/utils/completions/types/styleContent.ts", "../src/utils/definitions/index.ts", "../src/utils/definitions/types/attributeName.ts", "../src/utils/regexp-builder.ts", "../src/utils/definitions/types/openTagName.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n _document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter = params.context && params.context.triggerCharacter;\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return;\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return;\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return;\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match = RegExpBuilder`/\"<${event.tagName}>\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n plugins: [markoPrettier],\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\nbuiltinCompiler.configure({ translator: builtinTranslator as any });\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n Range,\n Position,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n doc: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) ||\n doc.getText(\n Range.create(\n Position.create(params.position.line, params.position.character - 1),\n params.position\n )\n );\n\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return [];\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return [];\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (!path.isAbsolute(tagEntryFile)) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match =\n RegExpBuilder`/\"(?:<${event.tagName}>|${event.tagName})\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -30,8 +30,8 @@ var __export = (target, all) => {
|
|
|
30
30
|
import {
|
|
31
31
|
createConnection,
|
|
32
32
|
ProposedFeatures,
|
|
33
|
-
Range as
|
|
34
|
-
Position as
|
|
33
|
+
Range as Range5,
|
|
34
|
+
Position as Position4,
|
|
35
35
|
CompletionList as CompletionList6,
|
|
36
36
|
Diagnostic,
|
|
37
37
|
DiagnosticSeverity,
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
import { URI as URI6 } from "vscode-uri";
|
|
43
43
|
import { TextDocument as TextDocument3 } from "vscode-languageserver-textdocument";
|
|
44
44
|
import * as prettier from "prettier";
|
|
45
|
+
import * as markoPrettier from "prettier-plugin-marko";
|
|
45
46
|
import { inspect, isDeepStrictEqual } from "util";
|
|
46
47
|
|
|
47
48
|
// src/utils/compiler.ts
|
|
@@ -51,6 +52,7 @@ import resolveFrom from "resolve-from";
|
|
|
51
52
|
import lassoPackageRoot from "lasso-package-root";
|
|
52
53
|
import * as builtinCompiler from "@marko/compiler";
|
|
53
54
|
import * as builtinTranslator from "@marko/translator-default";
|
|
55
|
+
builtinCompiler.configure({ translator: builtinTranslator });
|
|
54
56
|
var compilerAndTranslatorForDoc = /* @__PURE__ */ new WeakMap();
|
|
55
57
|
function getCompilerAndTranslatorForDoc(doc) {
|
|
56
58
|
let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);
|
|
@@ -452,10 +454,12 @@ function closeTag(_taglib, document, _params, event) {
|
|
|
452
454
|
import {
|
|
453
455
|
CompletionList as CompletionList4,
|
|
454
456
|
CompletionItemKind as CompletionItemKind4,
|
|
455
|
-
InsertTextFormat as InsertTextFormat3
|
|
457
|
+
InsertTextFormat as InsertTextFormat3,
|
|
458
|
+
Range as Range2,
|
|
459
|
+
Position as Position2
|
|
456
460
|
} from "vscode-languageserver";
|
|
457
|
-
function openTag(_taglib,
|
|
458
|
-
const triggerCharacter = params.context && params.context.triggerCharacter;
|
|
461
|
+
function openTag(_taglib, doc, params, event) {
|
|
462
|
+
const triggerCharacter = params.context && params.context.triggerCharacter || doc.getText(Range2.create(Position2.create(params.position.line, params.position.character - 1), params.position));
|
|
459
463
|
if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
|
|
460
464
|
return;
|
|
461
465
|
}
|
|
@@ -540,7 +544,7 @@ ${autocomplete.description}`;
|
|
|
540
544
|
}
|
|
541
545
|
|
|
542
546
|
// src/utils/completions/types/styleContent.ts
|
|
543
|
-
import { Position as
|
|
547
|
+
import { Position as Position3 } from "vscode-languageserver";
|
|
544
548
|
import { TextDocument as TextDocument2 } from "vscode-languageserver-textdocument";
|
|
545
549
|
import {
|
|
546
550
|
getCSSLanguageService,
|
|
@@ -555,7 +559,7 @@ var services = {
|
|
|
555
559
|
function styleContent(_taglib, document, params, event) {
|
|
556
560
|
const service = services[event.language]();
|
|
557
561
|
const startPos = document.positionAt(event.pos);
|
|
558
|
-
const relativePos = shiftPosition(params.position,
|
|
562
|
+
const relativePos = shiftPosition(params.position, Position3.create(startPos.line * -1, startPos.character * -1));
|
|
559
563
|
const contentDocument = TextDocument2.create(document.uri, event.language, document.version, event.content);
|
|
560
564
|
const completions = service.doComplete(contentDocument, relativePos, service.parseStylesheet(contentDocument));
|
|
561
565
|
return shiftCompletionRanges(completions, startPos);
|
|
@@ -571,7 +575,7 @@ __export(definitions_exports, {
|
|
|
571
575
|
// src/utils/definitions/types/attributeName.ts
|
|
572
576
|
import { URI as URI4 } from "vscode-uri";
|
|
573
577
|
import {
|
|
574
|
-
Range as
|
|
578
|
+
Range as Range3,
|
|
575
579
|
LocationLink
|
|
576
580
|
} from "vscode-languageserver";
|
|
577
581
|
|
|
@@ -606,17 +610,17 @@ function attributeName2(taglib, document, _params, event) {
|
|
|
606
610
|
const attrDef = taglib.getAttribute(tagName || "*", event.name);
|
|
607
611
|
let range = START_OF_FILE;
|
|
608
612
|
if (!attrDef) {
|
|
609
|
-
return;
|
|
613
|
+
return [];
|
|
610
614
|
}
|
|
611
615
|
const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
|
|
612
616
|
if (!attrEntryFile) {
|
|
613
|
-
return;
|
|
617
|
+
return [];
|
|
614
618
|
}
|
|
615
619
|
if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
|
|
616
620
|
const tagDefDoc = createTextDocument(attrEntryFile);
|
|
617
621
|
const match = RegExpBuilder`/"@${event.name}"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
|
|
618
622
|
if (match && match.index) {
|
|
619
|
-
range =
|
|
623
|
+
range = Range3.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
|
|
620
624
|
}
|
|
621
625
|
}
|
|
622
626
|
return [
|
|
@@ -625,9 +629,10 @@ function attributeName2(taglib, document, _params, event) {
|
|
|
625
629
|
}
|
|
626
630
|
|
|
627
631
|
// src/utils/definitions/types/openTagName.ts
|
|
632
|
+
import path3 from "path";
|
|
628
633
|
import { URI as URI5 } from "vscode-uri";
|
|
629
634
|
import {
|
|
630
|
-
Range as
|
|
635
|
+
Range as Range4,
|
|
631
636
|
LocationLink as LocationLink2
|
|
632
637
|
} from "vscode-languageserver";
|
|
633
638
|
function openTagName2(taglib, document, _params, event) {
|
|
@@ -641,14 +646,17 @@ function openTagName2(taglib, document, _params, event) {
|
|
|
641
646
|
tagDef = taglib.getTag(event.tagName);
|
|
642
647
|
}
|
|
643
648
|
if (!tagDef) {
|
|
644
|
-
return;
|
|
649
|
+
return [];
|
|
645
650
|
}
|
|
646
651
|
const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
|
|
652
|
+
if (!path3.isAbsolute(tagEntryFile)) {
|
|
653
|
+
return [];
|
|
654
|
+
}
|
|
647
655
|
if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
|
|
648
656
|
const tagDefDoc = createTextDocument(tagEntryFile);
|
|
649
|
-
const match = RegExpBuilder`/"
|
|
657
|
+
const match = RegExpBuilder`/"(?:<${event.tagName}>|${event.tagName})"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
|
|
650
658
|
if (match && match.index) {
|
|
651
|
-
range =
|
|
659
|
+
range = Range4.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
|
|
652
660
|
}
|
|
653
661
|
}
|
|
654
662
|
return [
|
|
@@ -726,19 +734,20 @@ connection.onDocumentFormatting(async ({
|
|
|
726
734
|
const formatted = prettier.format(text, __spreadValues({
|
|
727
735
|
parser: "marko",
|
|
728
736
|
filepath: fsPath,
|
|
737
|
+
plugins: [markoPrettier],
|
|
729
738
|
tabWidth: options.tabSize,
|
|
730
739
|
useTabs: options.insertSpaces === false
|
|
731
740
|
}, scheme === "file" ? await prettier.resolveConfig(fsPath, {
|
|
732
741
|
editorconfig: true
|
|
733
742
|
}).catch(() => null) : null));
|
|
734
743
|
return [
|
|
735
|
-
TextEdit5.replace(
|
|
744
|
+
TextEdit5.replace(Range5.create(doc.positionAt(0), doc.positionAt(text.length)), formatted)
|
|
736
745
|
];
|
|
737
746
|
} catch (e) {
|
|
738
747
|
displayMessage("Error", inspect(e, { colors: false }));
|
|
739
748
|
}
|
|
740
749
|
return [
|
|
741
|
-
TextEdit5.replace(
|
|
750
|
+
TextEdit5.replace(Range5.create(Position4.create(0, 0), Position4.create(0, 0)), "")
|
|
742
751
|
];
|
|
743
752
|
});
|
|
744
753
|
connection.onDidChangeWatchedFiles(() => {
|
|
@@ -792,7 +801,7 @@ function doValidate(doc) {
|
|
|
792
801
|
const [, fileName, rawLine, rawCol, msg] = match;
|
|
793
802
|
const line = (parseInt(rawLine, 10) || 1) - 1;
|
|
794
803
|
const col = (parseInt(rawCol, 10) || 1) - 1;
|
|
795
|
-
diagnostics.push(Diagnostic.create(
|
|
804
|
+
diagnostics.push(Diagnostic.create(Range5.create(line, col, line, col), msg, DiagnosticSeverity.Error, void 0, fileName));
|
|
796
805
|
}
|
|
797
806
|
}
|
|
798
807
|
return diagnostics;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/utils/compiler.ts", "../src/utils/htmljs-parser.ts", "../src/utils/completions/index.ts", "../src/utils/completions/types/attributeModifier.ts", "../src/utils/completions/types/attributeName.ts", "../src/utils/utils.ts", "../src/utils/completions/types/closeTag.ts", "../src/utils/completions/types/openTag.ts", "../src/utils/completions/types/openTagName.ts", "../src/utils/completions/types/styleContent.ts", "../src/utils/definitions/index.ts", "../src/utils/definitions/types/attributeName.ts", "../src/utils/regexp-builder.ts", "../src/utils/definitions/types/openTagName.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n _document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter = params.context && params.context.triggerCharacter;\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return;\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return;\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return;\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match = RegExpBuilder`/\"<${event.tagName}>\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n plugins: [markoPrettier],\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\nbuiltinCompiler.configure({ translator: builtinTranslator as any });\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n Range,\n Position,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n doc: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) ||\n doc.getText(\n Range.create(\n Position.create(params.position.line, params.position.character - 1),\n params.position\n )\n );\n\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return [];\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return [];\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (!path.isAbsolute(tagEntryFile)) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match =\n RegExpBuilder`/\"(?:<${event.tagName}>|${event.tagName})\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA;AACA;AACA;AACA;AACA;;;AClBA;AACA;AACA;AACA;AAQA;AACA;AACA,AAAgB,0BAAU,EAAE,YAAY,kBAAyB,CAAC;AASlE,IAAM,8BAA8B,oBAAI,QAGtC;AAEK,wCACL,KACuB;AACvB,MAAI,wBAAwB,4BAA4B,IAAI,GAAG;AAC/D,MAAI,CAAC,uBAAuB;AAC1B,gCAA4B,IAC1B,KACC,wBAAwB,aACvB,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,MAAM,CACxC,CACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,yBACL,UAC0B;AAC1B,MAAI;AACF,UAAM,EAAE,UAAU,eAAe,+BAA+B,QAAQ;AACxE,WAAO,SAAS,OAAO,YACrB,IAAI,MAAM,SAAS,GAAG,EAAE,QACxB,UACF;AAAA,EAEF,QAAE;AAAA,EAAO;AACX;AAEA,sBAAsB,KAAoC;AACxD,QAAM,UAAU,iBAAiB,WAAW,GAAG;AAC/C,QAAM,UACJ,WAAW,YAAY,OAAO,SAAS,8BAA8B;AACvE,QAAM,MAAM,WAAW,UAAQ;AAE/B,MAAI,OAAO,OAAO,KAAK,IAAI,OAAO,GAAG;AACnC,QAAI;AAEF,UAAI,aAAc,CAAC,EAChB,OACC,OAAO,KAAK,IAAI,YAAY,GAC5B,OAAO,KAAK,IAAI,gBAAgB,GAChC,OAAO,KAAK,IAAI,eAAe,CACjC,EACC,KAAK,CAAC,SAAS,0CAA0C,KAAK,IAAI,CAAC;AAEtE,UAAI,eAAe,WAAW,CAAC,YAAY;AAEzC,qBAAa,UAAQ,YAAY,KAAK,wBAAwB,GAC3D;AAAA,MACL;AAEA,gBAAQ,YAAY,KAAK,UAAU;AACnC,aAAO;AAAA,QACL,UAAU,UAAQ,YAAY,KAAK,iBAAiB;AAAA,QACpD;AAAA,MACF;AAAA,IAEF,QAAE;AAAA,IAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;;;AC5FA;AAqIA,IAAM,wBAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAEO,0BAA0B,SAK9B;AACD,QAAM,EAAE,QAAQ,MAAM,QAAQ,kBAAkB;AAChD,MAAI,SAAkC;AACtC,MAAI,YAAoE;AACxE,QAAM,SAAS,aACb;AAAA,IACE,SAAS,iBAAiB;AAAA,IAC1B,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc,IAA8B;AAC1C,UAAI,WAAW;AACb,WAAG,SAAS;AAAA,MACd;AAGA,UAAI,CAAC,GAAG,SAAS;AACf,WAAG,OAAO;AAAA,MACZ;AAEA,SAAG,SAAS,GAAG,MAAM,GAAG,QAAQ;AAChC,kBAAY;AACZ,aAAO,EAAE;AAAA,IACX;AAAA,IACA,UAAU,IAA0B;AAClC,SAAG,SAAS,UAAW;AACvB,kBAAY;AAEZ,UAAI,GAAG,YAAY,SAAS;AAC1B,cAAM,YAAY,GAAG,WAAW;AAChC,cAAM,UAAU,aAAa,UAAU,KAAK,WAAW,GAAG;AAE1D,YAAI,SAAS;AACX,gBAAM,UAAU,UAAU,KAAK,MAAM,GAAG,EAAE;AAC1C,gBAAM,MAAM,KAAK,QAAQ,SAAS,GAAG,aAAa;AAClD,gBAAM,SAAS,MAAM,QAAQ;AAC7B,gBAAM,oBAAqB,GAAG,uBAC5B,GAAG,oBAAoB,GAAG,SAAS,MACnC,GAAG,oBAAoB,GAAG,SAAS,GAAG;AAGxC,gBAAM,WACJ,qBAAqB,sBAAsB,qBACvC,oBACA;AAEN,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA,OAAO;AAAA,YACP,SAAS,KAAK,MAAM,KAAK,MAAM;AAAA,YAC/B;AAAA,YACA;AAAA,UACF,CAAC;AAED;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa,GAAG;AACpB,iBAAW,QAAQ,GAAG,YAAY;AAChC,YAAI,CAAC,KAAK,MAAM;AAEd,cAAI,KAAK,UAAU,QAAW;AAC5B,0BAAc,KAAK,MAAM;AAAA,UAC3B;AACA;AAAA,QACF;AAEA,YAAI,KAAK,KAAK,MAAM,GAAG,CAAC,MAAM,OAAO;AACnC,uBAAa,KAAK,WAAW,KAAK,SAAS,SAAS,IAAI,KAAK;AAC7D;AAAA,QACF;AAEA,cAAM,eAAe,KAAK,QAAQ,KAAK,MAAM,UAAU;AACvD,cAAM,QAAQ,SAAS,KAAK,KAAK,IAAI;AACrC,cAAM,WAAW,SAAS,MAAM;AAChC,YAAI,OAAO,KAAK;AAEhB,YAAI,UAAU;AACZ,iBAAO,KAAK,MAAM,GAAG,KAAK,SAAS,SAAS,SAAS,CAAC;AACtD,gBAAM,mBAAmB,eAAe,KAAK;AAC7C,gBAAM,iBAAiB,mBAAmB,SAAS,SAAS;AAC5D,cACE,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,QAAQ;AAAA,UACV,CAAC,GACD;AACA;AAAA,UACF;AAAA,QACF;AAEA,cAAM,iBAAiB,eAAe,KAAK;AAE3C,YACE,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK;AAAA,UACL;AAAA,UACA,KAAK;AAAA,UACL,QAAQ;AAAA,QACV,CAAC,GACD;AACA;AAAA,QACF;AAEA,YAAI,KAAK,OAAO;AACd,uBAAa,KAAK;AAClB,gBAAM,gBAAgB,KAAK,MAAM;AACjC,cACE,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK;AAAA,YACL;AAAA,YACA,OAAO,KAAK,MAAM,eAAe,UAAU;AAAA,YAC3C,KAAK;AAAA,YACL,QAAQ,KAAK;AAAA,UACf,CAAC,GACD;AACA;AAAA,UACF;AAAA,QACF,OAAO;AACL,uBAAa,KAAK,WAAW,KAAK,SAAS,SAAS,IAAI,KAAK;AAAA,QAC/D;AAAA,MACF;AAEA,aAAO,EAAE;AAAA,IACX;AAAA,IACA,OAAO,IAAuB;AAC5B,SAAG,SAAS,OAAO;AACnB,SAAG,MAAM,GAAG,SAAS,GAAG,MAAM;AAE9B,UAAI,WAAW;AACb,WAAG,SAAS;AAEZ,YAAI,UAAU,YAAY,SAAS;AACjC,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,YACP,SAAS,GAAG;AAAA,YACZ,KAAK,GAAG;AAAA,YACR,QAAQ,GAAG;AAAA,UACb,CAAC;AAED;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE;AAAA,IACX;AAAA,IACA,WAAW,IAA2B;AACpC,kBAAY,aAAa,UAAU;AACnC,aAAO,EAAE;AAAA,IACX;AAAA,EACF,GACA;AAAA,IACE,cAAc,IAAY;AACxB,YAAM,SAAS,OAAO,OAAO,EAAE;AAC/B,aAAO,UAAU,OAAO;AAAA,IAC1B;AAAA,EACF,CACF;AAEA,MAAI;AAEF,WAAO,MAAM,GAAG;AAAA,CAAQ;AAAA,EAC1B,SAAS,KAAP;AACA,WAAO,gBACF;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAU,IAAc;AAAA,MACxB,KAAK,OAAO;AAAA,MACZ,QAAQ,OAAO;AAAA,IACjB,IACA;AAAA,EACN;AAEA,SAAO;AAEP,kBAAgB,OAAkC;AAChD,UAAM,EAAE,MAAM,KAAK,WAAW;AAC9B,QACE,CAAC,UACA,UAAS,WACP,OAAO,QAAQ,OAAO,UAAU,UAAU,QAAQ,UAAU,SAC/D;AACA,eAAS;AACT,aAAO,IAAI;AACX,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AACF;;;ACvVA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AASO,2BACL,SACA,WACA,SACA,QACA;AACA,SAAO,eAAe,OACpB;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,MACzB,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,MACzB,QAAQ;AAAA,IACV;AAAA,EACF,GACA,IACF;AACF;;;AC9BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAOA;AAGO,IAAM,gBAAgB,MAAM,OACjC,SAAS,OAAO,GAAG,CAAC,GACpB,SAAS,OAAO,GAAG,CAAC,CACtB;AAEO,kCAAkC,KAA+B;AACtE,MAAI,SAAS,IAAI;AAEjB,SAAO,QAAQ;AACb,QAAI,CAAC,gCAAgC,KAAK,OAAO,OAAO,GAAG;AACzD,aAAO;AAAA,IACT;AAEA,aAAS,OAAO;AAAA,EAClB;AAEA,SAAO;AACT;AAEO,wBACL,UACA,OACA;AACA,SAAO,MAAM,OACX,SAAS,WAAW,MAAM,GAAG,GAC7B,SAAS,WAAW,MAAM,MAAM,CAClC;AACF;AAEO,4BAA4B,UAAgC;AACjE,QAAM,MAAM,KAAI,KAAK,QAAQ,EAAE,SAAS;AACxC,QAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,SAAO,aAAa,OAAO,KAAK,aAAa,GAAG,OAAO;AACzD;AAEO,+BAA+B,MAAsB,QAAkB;AAC5E,OAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,QAAI,KAAK,qBAAqB;AAC5B,WAAK,oBAAoB,QAAQ,CAAC,SAChC,WAAW,KAAK,OAAO,MAAM,CAC/B;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACjB,gBAAU,KAAK,UAAU,MAAM;AAAA,IACjC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,mBACL,MACA,QACA;AACA,MAAI,SAAS,GAAG,IAAI,GAAG;AACrB,eAAW,KAAK,OAAO,MAAM;AAAA,EAC/B,OAAO;AACL,eAAW,KAAK,QAAQ,MAAM;AAC9B,eAAW,KAAK,SAAS,MAAM;AAAA,EACjC;AACF;AAEO,oBAAoB,OAA0B,QAAkB;AACrE,MAAI,OAAO;AACT,kBAAc,MAAM,OAAO,MAAM;AACjC,kBAAc,MAAM,KAAK,MAAM;AAAA,EACjC;AACF;AAEO,uBAAuB,KAAe,QAAkB;AAC7D,MAAI,IAAI,SAAS,GAAG;AAClB,QAAI,aAAa,OAAO;AAAA,EAC1B;AAEA,MAAI,QAAQ,OAAO;AACnB,SAAO;AACT;;;AD1EO,uBACL,QACA,UACA,SACA,OACA;AACA,QAAM,cAAgC,CAAC;AACvC,QAAM,gBAAgB,eAAe,UAAU,KAAK;AACpD,QAAM,SACJ,CAAC,MAAM,IAAI,qBAAqB,OAAO,OAAO,MAAM,IAAI,OAAO;AACjE,QAAM,UAAW,UAAU,OAAO,QAAS;AAC3C,QAAM,iBAA2C,CAAC;AAClD,QAAM,aAA0B,oBAAI,IAAI;AAExC,MAAI,UAAU,OAAO,YAAY;AAC/B,eAAW,OAAO,OAAO,YAAY;AACnC,YAAM,eAAe,OAAO,WAAW;AACvC,qBAAe,aAAa,kBAAkB;AAAA,IAChD;AAAA,EACF;AAEA,SAAO,iBAAiB,SAAS,CAAC,SAAS;AACzC,QAAI,KAAK,SAAS,SAAS;AACzB,iBAAW,IAAI,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,SAAO,iBAAiB,SAAS,CAAC,MAAM,WAAW;AACjD,QACE,KAAK,cACL,eAAe,KAAK,SACpB,KAAK,SAAS,OACd,WAAW,IAAI,KAAK,IAAI,KACvB,KAAK,KAAK,OAAO,OAChB,mBAAmB,KAAK,KAAK,YAAY,OAAO,QAAQ,GAC1D;AACA;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAS,MAAK,OAAO,WAAW;AAClD,UAAM,gBAA+B;AAAA,MACnC,MAAM,WAAW;AAAA,MACjB,OAAO,KAAK,eAAe;AAAA,IAC7B;AACA,QAAI,QAAQ,KAAK;AACjB,QAAI,UAAU,KAAK;AAEnB,QAAI,KAAK,MAAM;AACb,iBAAW,UAAU,KAAK,KAAK,KAAK;AAAA,IACtC,OAAO;AACL,cAAQ;AAAA,aACD;AACH,qBAAW;AACX;AAAA,aACG;AACH,qBAAW;AACX;AAAA,aACG;AAAA,aACA;AAAA,aACA;AACH;AAAA;AAEA,qBAAW;AACX;AAAA;AAAA,IAEN;AAEA,UAAM,eACJ,KAAK,gBAAgB,MAAM,QAAQ,KAAK,YAAY,IAChD,KAAK,aAAa,KAClB,KAAK;AAEX,QAAI,cAAc;AAChB,cAAQ,aAAa,eAAe;AACpC,gBAAU,aAAa,WAAW;AAElC,UAAI,aAAa,oBAAoB;AACnC,YAAI,cAAc,OAAO;AACvB,wBAAc,SAAS;AAAA;AAAA;AAAA,QACzB;AAEA,sBAAc,SAAS,eAAe,aAAa;AAAA,MACrD;AAAA,IACF;AAEA,gBAAY,KAAK;AAAA,MACf;AAAA,MACA,eAAe,cAAc,QAAQ,gBAAgB;AAAA,MACrD,MAAM,oBAAmB;AAAA,MACzB,kBAAkB,iBAAiB;AAAA,MACnC,UAAU,UAAS,QAAQ,eAAe,OAAO;AAAA,IACnD,CAAC;AAAA,EACH,CAAC;AAED,SAAO,gBAAe,OAAO,aAAa,IAAI;AAChD;;;AE9GA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYO,kBACL,SACA,UACA,SACA,OACA;AACA,MAAI,MAAM,QAAQ,OAAO,KAAK;AAC5B;AAAA,EACF;AAEA,QAAM,gBAAgB,KAAK,MAAM;AAEjC,SAAO,gBAAe,OACpB;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,MAAM,oBAAmB;AAAA,MACzB,kBAAkB,kBAAiB;AAAA,MACnC,UAAU,UAAS,QACjB,eAAe,UAAU,KAAK,GAC9B,aACF;AAAA,IACF;AAAA,EACF,GACA,IACF;AACF;;;ACtCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYO,iBACL,SACA,KACA,QACA,OACA;AACA,QAAM,mBACH,OAAO,WAAW,OAAO,QAAQ,oBAClC,IAAI,QACF,OAAM,OACJ,UAAS,OAAO,OAAO,SAAS,MAAM,OAAO,SAAS,YAAY,CAAC,GACnE,OAAO,QACT,CACF;AAEF,MAAI,qBAAqB,OAAO,MAAM,eAAe,MAAM,YAAY;AACrE;AAAA,EACF;AAEA,QAAM,gBAAgB,KAAK,MAAM,QAAQ,OAAO,MAAM,KAAK,MAAM;AAEjE,SAAO,gBAAe,OACpB;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,MAAM,oBAAmB;AAAA,MACzB,kBAAkB,kBAAiB;AAAA,MACnC,YAAY;AAAA;AAAA,EAAW;AAAA,IACzB;AAAA,EACF,GACA,IACF;AACF;;;AC5CA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcO,qBACL,QACA,UACA,QACA,OACA;AACA,QAAM,EAAE,QAAQ,4BAA4B,KAAI,MAAM,SAAS,GAAG;AAClE,MAAI;AACJ,QAAM,mBACH,OAAO,WAAW,OAAO,QAAQ,oBAAqB,MAAM,QAAQ;AACvE,QAAM,iBAAiB,qBAAqB;AAC5C,QAAM,eAAe,eAAe,UAAU,KAAK;AAEnD,MAAI,gBAAgB;AAClB,UAAM,YAAY,yBAAyB,KAAK;AAChD,UAAM,eACJ,aACA,CAAC,UAAU,qBACX,OAAO,OAAO,UAAU,OAAO;AACjC,WACG,gBACC,aAAa,cACb,OAAO,OAAO,aAAa,UAAU,KACvC,CAAC;AAAA,EACL,OAAO;AACL,WAAO,OAAO,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW;AAAA,EAC9D;AAEA,SAAO,gBAAe,OACpB,KACG,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,EAC7B,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,EAC9B,OACC,CAAC,OAAO,QAAQ,KAAK,GAAG,IAAI,KAAK,CAAC,mBAAmB,KAAK,GAAG,QAAQ,CACvE,EACC,IAAI,CAAC,OAAO;AACX,QAAI,QAAQ,GAAG,cAAc,IAAI,GAAG,SAAS,GAAG;AAChD,UAAM,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG;AACpD,UAAM,gBAAgB,KAAI,KAAK,UAAU,EAAE,SAAS;AACpD,UAAM,kBAAkB,uCAAuC,KAC7D,UACF;AAEA,UAAM,iBAAiB,mBAAmB,gBAAgB;AAC1D,UAAM,YAAY,mBAAmB;AAErC,UAAM,gBAAgB;AAAA,MACpB,MAAM,YAAW;AAAA,MACjB,OAAO,GAAG,OACN,cAAc,GAAG,oEAAoE,GAAG,oBACxF,iBACA,YACE,gBAAgB,GAAG,UAAU,wBAC7B,0CAA0C,oBAAoB,gCAChE;AAAA;AAAA,GAAyC,MAAK,SAC5C,yBACA,UACF,MAAM;AAAA,IACZ;AAEA,QAAI,GAAG,aAAa;AAClB,oBAAc,SAAS;AAAA;AAAA,EAAO,GAAG;AAAA,IACnC;AAEA,UAAM,eAAe,GAAG,gBAAgB,GAAG,aAAa;AAExD,QAAI,cAAc;AAChB,UAAI,aAAa,aAAa;AAC5B,gBAAQ,aAAa;AAAA,MACvB;AAEA,UAAI,aAAa,aAAa;AAC5B,sBAAc,SAAS;AAAA;AAAA,EAAO,aAAa;AAAA,MAC7C;AAEA,UAAI,aAAa,oBAAoB;AACnC,sBAAc,SAAS;AAAA;AAAA,cAAmB,aAAa;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM,oBAAmB;AAAA,MACzB,kBAAkB,kBAAiB;AAAA,MACnC,UAAU,UAAS,QACjB,cACC,gBAAgB,aAAa,WAAY,KAC5C;AAAA,IACF;AAAA,EACF,CAAC,GACH,IACF;AACF;;;AC7GA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAUA,IAAM,WAAW;AAAA,EACf,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AACR;AAEO,sBACL,SACA,UACA,QACA,OACA;AACA,QAAM,UAAU,SAAS,MAAM,UAAU;AACzC,QAAM,WAAW,SAAS,WAAW,MAAM,GAAG;AAC9C,QAAM,cAAc,cAClB,OAAO,UACP,UAAS,OAAO,SAAS,OAAO,IAAI,SAAS,YAAY,EAAE,CAC7D;AACA,QAAM,kBAAkB,cAAa,OACnC,SAAS,KACT,MAAM,UACN,SAAS,SACT,MAAM,OACR;AAEA,QAAM,cAAc,QAAQ,WAC1B,iBACA,aACA,QAAQ,gBAAgB,eAAe,CACzC;AAEA,SAAO,sBAAsB,aAAa,QAAQ;AACpD;;;AC5CA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AACA;AAAA;AAAA;AAAA;;;ACDe,uBACb,YACG,aACH;AACA,MAAI,IAAI;AACR,MAAI,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;AACtD,QAAM,sBAAsB,QAAQ,SAAS;AAE7C,SAAO,IAAI,qBAAqB,KAAK;AACnC,WAAO,OAAO,YAAY,EAAE,IAAI,QAAQ,IAAI;AAAA,EAC9C;AAEA,SAAO,OAAO,YAAY,EAAE;AAE5B,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,iBAAiB,QAAQ,YAAY,GAAG;AAC9C,MAAI,QAAQ;AAEZ,MAAI,mBAAmB,IAAI;AACzB,WAAO;AAAA,EACT,OAAO;AACL,YAAQ,QAAQ,MAAM,iBAAiB,CAAC;AACxC,WAAO,QAAQ,MAAM,GAAG,cAAc;AAAA,EACxC;AAEA,SAAO,IAAI,OAAO,KAAK,KAAK;AAC9B;AAEA,gBAAgB,KAAc;AAC5B,SAAO,OAAO,GAAG,EAAE,QAAQ,yBAAyB,MAAM;AAC5D;;;ADlBO,wBACL,QACA,UACA,SACA,OACA;AACA,QAAM,UAAU,MAAM,IAAI,oBAAoB,SAAY,MAAM,IAAI;AACpE,QAAM,SAAS,WAAW,OAAO,OAAO,OAAO;AAC/C,QAAM,UAAU,OAAO,aAAa,WAAW,KAAK,MAAM,IAAI;AAC9D,MAAI,QAAQ;AAEZ,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,QAAQ,YAAa,UAAU,OAAO;AAE5D,MAAI,CAAC,eAAe;AAClB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,0BAA0B,KAAK,aAAa,GAAG;AACjD,UAAM,YAAY,mBAAmB,aAAa;AAClD,UAAM,QAAQ,mBAAmB,MAAM,0BAA0B,KAC/D,UAAU,QAAQ,CACpB;AAEA,QAAI,SAAS,MAAM,OAAO;AACxB,cAAQ,OAAM,OACZ,UAAU,WAAW,MAAM,KAAK,GAChC,UAAU,WAAW,MAAM,QAAQ,MAAM,GAAG,MAAM,CACpD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,OACX,KAAI,KAAK,aAAa,EAAE,SAAS,GACjC,OACA,OACA,eAAe,UAAU,KAAK,CAChC;AAAA,EACF;AACF;;;AEvDA;AACA;AACA;AAAA;AAAA;AAAA;AAgBO,sBACL,QACA,UACA,SACA,OACA;AACA,MAAI;AACJ,MAAI,QAAQ;AACZ,QAAM,iBAAiB,MAAM,QAAQ,OAAO;AAE5C,MAAI,gBAAgB;AAClB,UAAM,YAAY,yBAAyB,KAAK;AAChD,aACE,aACC,WAAU,oBACP,SACA,OAAO,OAAO,UAAU,OAAO;AAAA,EACvC,OAAO;AACL,aAAS,OAAO,OAAO,MAAM,OAAO;AAAA,EACtC;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAe,OAAO,YAAY,OAAO,YAAY,OAAO;AAElE,MAAI,CAAC,MAAK,WAAW,YAAY,GAAG;AAClC,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,0BAA0B,KAAK,YAAY,GAAG;AAChD,UAAM,YAAY,mBAAmB,YAAY;AACjD,UAAM,QACJ,sBAAsB,MAAM,YAAY,MAAM,8BAA8B,KAC1E,UAAU,QAAQ,CACpB;AAEF,QAAI,SAAS,MAAM,OAAO;AACxB,cAAQ,OAAM,OACZ,UAAU,WAAW,MAAM,KAAK,GAChC,UAAU,WAAW,MAAM,QAAQ,MAAM,GAAG,MAAM,CACpD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAa,OACX,KAAI,KAAK,YAAY,EAAE,SAAS,GAChC,OACA,OACA,eAAe,UAAU,KAAK,CAChC;AAAA,EACF;AACF;;;Ad5CA,IACE,OAAO,cAAY,eACnB,UAAQ,cACR,CAAE,UAAS,UAAQ,aACnB;AAEA,YAAQ,WAAW,SAAS;AAC9B;AAEA,IAAM,mBAAmB,oBAAI,QAAyC;AACtE,IAAM,aAAa,iBAAiB,iBAAiB,GAAG;AACxD,IAAM,kBAAkB,oBAAI,QAAoC;AAChE,IAAM,qBAAqB,oBAAI,QAG7B;AACF,IAAM,YAAY,IAAI,cAAc,aAAY;AAChD,IAAM,mBAAmB;AAEzB,QAAQ,MAAM,IAAI,SAAoB;AACpC,aAAW,QAAQ,IAAI,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAC9D;AACA,QAAQ,QAAQ,IAAI,SAAoB;AACtC,aAAW,QAAQ,MAAM,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAChE;AACA,QAAQ,GAAG,qBAAqB,QAAQ,KAAK;AAC7C,QAAQ,GAAG,sBAAsB,QAAQ,KAAK;AAE9C,WAAW,aAAa,MAAM;AAC5B,SAAO;AAAA,IACL,cAAc;AAAA,MACZ,kBAAkB,qBAAqB;AAAA,MACvC,4BAA4B;AAAA,MAC5B,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,QAClB,mBAAmB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,WAAW,cAAc,MAAM;AAC7B,YAAU,IAAI,EAAE,QAAQ,CAAC,QAAQ,gBAAgB,GAAG,CAAC;AACvD,CAAC;AAED,WAAW,aAAa,CAAC,WAA6C;AACpE,QAAM,MAAM,UAAU,IAAI,OAAO,aAAa,GAAG;AACjD,QAAM,SAAS,gBAAgB,GAAG;AAClC,MAAI,CAAC;AAAQ,WAAO,gBAAe,OAAO,CAAC,GAAG,IAAI;AAElD,QAAM,QAAQ,iBAAiB;AAAA,IAC7B;AAAA,IACA,QAAQ,IAAI,SAAS,OAAO,QAAQ;AAAA,IACpC,MAAM,IAAI,QAAQ;AAAA,EACpB,CAAC;AAED,QAAM,UACJ,SAAS,oBAAgB,MAAM;AACjC,SACG,WAAW,QAAQ,QAAQ,KAAK,QAAQ,KAAY,KACrD,gBAAe,OAAO,CAAC,GAAG,IAAI;AAElC,CAAC;AAED,WAAW,aAAa,CAAC,WAAW;AAClC,QAAM,MAAM,UAAU,IAAI,OAAO,aAAa,GAAG;AACjD,QAAM,SAAS,gBAAgB,GAAG;AAClC,MAAI,CAAC;AAAQ;AAEb,QAAM,QAAQ,iBAAiB;AAAA,IAC7B;AAAA,IACA,QAAQ,IAAI,SAAS,OAAO,QAAQ;AAAA,IACpC,MAAM,IAAI,QAAQ;AAAA,EACpB,CAAC;AAED,QAAM,UACJ,SAAS,oBAAgB,MAAM;AACjC,SAAO,WAAW,QAAQ,QAAQ,KAAK,QAAQ,KAAY;AAC7D,CAAC;AAED,WAAW,qBACT,OAAO;AAAA,EACL;AAAA,EACA;AAAA,MACmD;AACnD,MAAI;AACF,UAAM,MAAM,UAAU,IAAI,aAAa,GAAG;AAC1C,UAAM,EAAE,QAAQ,WAAW,KAAI,MAAM,aAAa,GAAG;AACrD,UAAM,OAAO,IAAI,QAAQ;AACzB,UAAM,YAAY,AAAS,gBAAO,MAAM;AAAA,MACtC,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,CAAC,aAAa;AAAA,MACvB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ,iBAAiB;AAAA,OAC9B,WAAW,SACX,MAAM,AACH,uBAAc,QAAQ;AAAA,MACrB,cAAc;AAAA,IAChB,CAAC,EACA,MAAM,MAAM,IAAI,IACnB,KACL;AAED,WAAO;AAAA,MACL,UAAS,QACP,OAAM,OAAO,IAAI,WAAW,CAAC,GAAG,IAAI,WAAW,KAAK,MAAM,CAAC,GAC3D,SACF;AAAA,IACF;AAAA,EACF,SAAS,GAAP;AACA,mBAAe,SAAS,QAAQ,GAAG,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,UAAS,QACP,OAAM,OAAO,UAAS,OAAO,GAAG,CAAC,GAAG,UAAS,OAAO,GAAG,CAAC,CAAC,GACzD,EACF;AAAA,EACF;AACF,CACF;AAEA,WAAW,wBAAwB,MAAM;AACvC,QAAM,mBAAmB,oBAAI,IAAc;AAC3C,aAAW,OAAO,UAAU,IAAI,GAAG;AACjC,UAAM,EAAE,aAAa,+BAA+B,GAAG;AAEvD,QAAI,CAAC,iBAAiB,IAAI,QAAQ,GAAG;AACnC,kBAAY,QAAQ;AACpB,uBAAiB,IAAI,QAAQ;AAAA,IAC/B;AAAA,EACF;AACF,CAAC;AAED,UAAU,mBAAmB,CAAC,WAAW;AACvC,kBAAgB,OAAO,QAAQ;AAE/B,MAAI,OAAO,SAAS,UAAU,GAAG;AAC/B,gBAAY,+BAA+B,OAAO,QAAQ,EAAE,QAAQ;AAAA,EACtE;AACF,CAAC;AAED,yBAAyB,KAAmB;AAC1C,eAAa,mBAAmB,IAAI,GAAG,CAAE;AACzC,qBAAmB,IACjB,KACA,WAAW,MAAM;AACf,UAAM,WAAW,gBAAgB,IAAI,GAAG;AACxC,UAAM,WAAW,WAAW,GAAG;AAE/B,QAAI,YAAY,kBAAkB,UAAU,QAAQ,GAAG;AACrD;AAAA,IACF;AAEA,oBAAgB,IAAI,KAAK,QAAQ;AACjC,eAAW,gBAAgB;AAAA,MACzB,KAAK,IAAI;AAAA,MACT,aAAa;AAAA,IACf,CAAC;AAAA,EACH,GAAG,GAAG,CACR;AACF;AAEA,oBAAoB,KAAiC;AACnD,QAAM,EAAE,QAAQ,WAAW,KAAI,MAAM,IAAI,GAAG;AAE5C,MAAI,WAAW,QAAQ;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,EAAE,UAAU,eAAe,+BAA+B,GAAG;AACnE,QAAM,cAA4B,CAAC;AAEnC,MAAI;AACF,aAAS,YAAY,IAAI,QAAQ,GAAG,QAAQ;AAAA,MAC1C,OAAO,oBAAoB,QAAQ;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH,SAAS,GAAP;AACA,QAAI;AACJ,WAAQ,QAAQ,iBAAiB,KAAM,EAAY,OAAO,GAAI;AAC5D,YAAM,CAAC,EAAE,UAAU,SAAS,QAAQ,OAAO;AAC3C,YAAM,OAAQ,UAAS,SAAS,EAAE,KAAK,KAAK;AAC5C,YAAM,MAAO,UAAS,QAAQ,EAAE,KAAK,KAAK;AAC1C,kBAAY,KACV,WAAW,OACT,OAAM,OAAO,MAAM,KAAK,MAAM,GAAG,GACjC,KACA,mBAAmB,OACnB,QACA,QACF,CACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,qBAAqB,UAAoB;AAtOzC;AAuOE,yBAAiB,IAAI,QAAQ,MAA7B,mBAAgC;AAChC,WAAS,OAAO,YAAY;AAC9B;AAEA,6BAA6B,UAAoB;AAC/C,MAAI,QAAQ,iBAAiB,IAAI,QAAQ;AACzC,MAAI,CAAC,OAAO;AACV,qBAAiB,IAAI,UAAW,QAAQ,oBAAI,IAAI,CAAE;AAAA,EACpD;AACA,SAAO;AACT;AAEA,wBACE,MACA,KACA;AACA,eAAa,MAAM;AACjB,eAAW,iBAAiB,OAAO,QAAQ,GAAG;AAAA,EAChD,CAAC;AACH;AAEA,UAAU,OAAO,UAAU;AAC3B,WAAW,OAAO;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,4 +2,4 @@ import { type CompletionParams, CompletionList } from "vscode-languageserver";
|
|
|
2
2
|
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
3
3
|
import type { ParserEvents } from "../../htmljs-parser";
|
|
4
4
|
import type { TaglibLookup } from "../../compiler";
|
|
5
|
-
export declare function openTag(_taglib: TaglibLookup,
|
|
5
|
+
export declare function openTag(_taglib: TaglibLookup, doc: TextDocument, params: CompletionParams, event: ParserEvents.OpenTag): CompletionList | undefined;
|
|
@@ -2,4 +2,4 @@ import { type CompletionParams } from "vscode-languageserver";
|
|
|
2
2
|
import { TextDocument } from "vscode-languageserver-textdocument";
|
|
3
3
|
import type { ParserEvents } from "../../htmljs-parser";
|
|
4
4
|
import type { TaglibLookup } from "../../compiler";
|
|
5
|
-
export declare function styleContent(_taglib: TaglibLookup, document: TextDocument, params: CompletionParams, event: ParserEvents.StyleContent): import("vscode-languageserver").CompletionList;
|
|
5
|
+
export declare function styleContent(_taglib: TaglibLookup, document: TextDocument, params: CompletionParams, event: ParserEvents.StyleContent): import("vscode-languageserver-types").CompletionList;
|
|
@@ -2,4 +2,4 @@ import { type TextDocumentPositionParams, LocationLink } from "vscode-languagese
|
|
|
2
2
|
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
3
3
|
import type { TaglibLookup } from "../../compiler";
|
|
4
4
|
import type { ParserEvents } from "../../htmljs-parser";
|
|
5
|
-
export declare function attributeName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.AttributeName): LocationLink[]
|
|
5
|
+
export declare function attributeName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.AttributeName): LocationLink[];
|
|
@@ -2,4 +2,4 @@ import { type TextDocumentPositionParams, LocationLink } from "vscode-languagese
|
|
|
2
2
|
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
3
3
|
import type { ParserEvents } from "../../htmljs-parser";
|
|
4
4
|
import type { TaglibLookup } from "../../compiler";
|
|
5
|
-
export declare function openTagName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.OpenTagName): LocationLink[]
|
|
5
|
+
export declare function openTagName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.OpenTagName): LocationLink[];
|
package/package.json
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marko/language-server",
|
|
3
3
|
"description": "Marko Language Server",
|
|
4
|
-
"version": "0.12.
|
|
4
|
+
"version": "0.12.3",
|
|
5
5
|
"bin": {
|
|
6
6
|
"marko-language-server": "./bin.js"
|
|
7
7
|
},
|
|
8
8
|
"bugs": "https://github.com/marko-js/language-server/issues/new?template=Bug_report.md",
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@marko/babel-utils": "^5.
|
|
11
|
-
"@marko/compiler": "^5.
|
|
12
|
-
"@marko/translator-default": "^5.
|
|
13
|
-
"htmljs-parser": "^2.11.
|
|
10
|
+
"@marko/babel-utils": "^5.21.1",
|
|
11
|
+
"@marko/compiler": "^5.21.4",
|
|
12
|
+
"@marko/translator-default": "^5.21.2",
|
|
13
|
+
"htmljs-parser": "^2.11.3",
|
|
14
14
|
"lasso-package-root": "^1.0.1",
|
|
15
|
-
"marko": "^5.
|
|
16
|
-
"prettier": "^2.6.
|
|
17
|
-
"prettier-plugin-marko": "^1.1
|
|
15
|
+
"marko": "^5.21.2",
|
|
16
|
+
"prettier": "^2.6.2",
|
|
17
|
+
"prettier-plugin-marko": "^1.2.1",
|
|
18
18
|
"resolve-from": "^5.0.0",
|
|
19
|
-
"
|
|
20
|
-
"vscode-
|
|
21
|
-
"vscode-languageserver
|
|
19
|
+
"tsx": "^3.4.2",
|
|
20
|
+
"vscode-css-languageservice": "^6.0.1",
|
|
21
|
+
"vscode-languageserver": "^8.0.1",
|
|
22
|
+
"vscode-languageserver-textdocument": "^1.0.5",
|
|
22
23
|
"vscode-uri": "^3.0.3"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@types/prettier": "^2.
|
|
26
|
+
"@types/prettier": "^2.6.3"
|
|
26
27
|
},
|
|
27
28
|
"exports": {
|
|
28
29
|
".": {
|
|
@@ -51,6 +52,6 @@
|
|
|
51
52
|
"url": "https://github.com/marko-js/language-server/tree/master/server"
|
|
52
53
|
},
|
|
53
54
|
"scripts": {
|
|
54
|
-
"build": "tsc -b &&
|
|
55
|
+
"build": "tsc -b && tsx build.mts"
|
|
55
56
|
}
|
|
56
|
-
}
|
|
57
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright 2022 eBay Inc.
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
-
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
-
the Software without restriction, including without limitation the rights to
|
|
8
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
-
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
-
subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
-
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
-
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|