@marko/language-server 1.1.20 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1437,211 +1437,13 @@ var doComplete = async (doc, params) => {
1437
1437
  };
1438
1438
  };
1439
1439
 
1440
- // src/service/marko/validate.ts
1441
- var import_path5 = __toESM(require("path"));
1442
- var import_language_tools8 = require("@marko/language-tools");
1443
- var import_vscode_languageserver7 = require("vscode-languageserver");
1444
- var import_babel_utils = require("@marko/babel-utils");
1445
- var markoErrorRegExp = /^(.+?)\.marko(?:\((\d+)(?:\s*,\s*(\d+))?\))?: (.*)$/gm;
1446
- var compilerConfig = {
1447
- code: false,
1448
- output: "migrate",
1449
- sourceMaps: false,
1450
- errorRecovery: true,
1451
- babelConfig: {
1452
- babelrc: false,
1453
- configFile: false,
1454
- browserslistConfigFile: false,
1455
- caller: {
1456
- name: "@marko/language-server",
1457
- supportsStaticESM: true,
1458
- supportsDynamicImport: true,
1459
- supportsTopLevelAwait: true,
1460
- supportsExportNamespaceFrom: true
1461
- }
1462
- }
1463
- };
1464
- var doValidate = (doc) => {
1465
- const filename = getFSPath(doc);
1466
- const diagnostics = [];
1467
- try {
1468
- const { meta } = import_language_tools8.Project.getCompiler(
1469
- filename && import_path5.default.dirname(filename)
1470
- ).compileSync(doc.getText(), filename || "untitled.marko", compilerConfig);
1471
- if (meta.diagnostics) {
1472
- for (const diag of meta.diagnostics) {
1473
- const range = diag.loc ? {
1474
- start: {
1475
- line: diag.loc.start.line - 1,
1476
- character: diag.loc.start.column
1477
- },
1478
- end: {
1479
- line: diag.loc.end.line - 1,
1480
- character: diag.loc.end.column
1481
- }
1482
- } : {
1483
- start: { line: 0, character: 0 },
1484
- end: { line: 0, character: 0 }
1485
- };
1486
- let severity;
1487
- switch (diag.type) {
1488
- case import_babel_utils.DiagnosticType.Warning:
1489
- case import_babel_utils.DiagnosticType.Deprecation:
1490
- severity = import_vscode_languageserver7.DiagnosticSeverity.Warning;
1491
- break;
1492
- case import_babel_utils.DiagnosticType.Suggestion:
1493
- severity = import_vscode_languageserver7.DiagnosticSeverity.Hint;
1494
- break;
1495
- default:
1496
- severity = import_vscode_languageserver7.DiagnosticSeverity.Error;
1497
- break;
1498
- }
1499
- diagnostics.push({
1500
- range,
1501
- source: "marko",
1502
- code: void 0,
1503
- tags: void 0,
1504
- severity,
1505
- message: diag.label
1506
- });
1507
- }
1508
- }
1509
- } catch (err) {
1510
- addDiagnosticsForError(err, diagnostics);
1511
- }
1512
- return diagnostics;
1513
- };
1514
- function addDiagnosticsForError(err, diagnostics) {
1515
- if (!isError(err)) {
1516
- diagnostics.push({
1517
- range: {
1518
- start: { line: 0, character: 0 },
1519
- end: { line: 0, character: 0 }
1520
- },
1521
- source: "marko",
1522
- code: void 0,
1523
- tags: void 0,
1524
- severity: import_vscode_languageserver7.DiagnosticSeverity.Error,
1525
- message: String(err)
1526
- });
1527
- } else if (isAggregateError(err)) {
1528
- for (const nestedError of err.errors) {
1529
- addDiagnosticsForError(nestedError, diagnostics);
1530
- }
1531
- } else if (isErrorWithLoc(err)) {
1532
- const message = err.label || err.message || err.stack;
1533
- if (!message)
1534
- return;
1535
- const { loc } = err;
1536
- diagnostics.push({
1537
- range: {
1538
- start: {
1539
- line: loc.start.line - 1,
1540
- character: loc.start.column
1541
- },
1542
- end: {
1543
- line: loc.end.line - 1,
1544
- character: loc.end.column
1545
- }
1546
- },
1547
- source: "marko",
1548
- code: void 0,
1549
- tags: void 0,
1550
- severity: import_vscode_languageserver7.DiagnosticSeverity.Error,
1551
- message
1552
- });
1553
- } else {
1554
- let match;
1555
- while (match = markoErrorRegExp.exec(err.message)) {
1556
- const [, , rawLine, rawCol, message] = match;
1557
- const pos = {
1558
- line: (parseInt(rawLine, 10) || 1) - 1,
1559
- character: (parseInt(rawCol, 10) || 1) - 1
1560
- };
1561
- diagnostics.push({
1562
- range: { start: pos, end: pos },
1563
- source: "marko",
1564
- code: void 0,
1565
- tags: void 0,
1566
- severity: import_vscode_languageserver7.DiagnosticSeverity.Error,
1567
- message
1568
- });
1569
- }
1570
- }
1571
- }
1572
- function isError(err) {
1573
- return err != null && typeof err === "object" && typeof err.message === "string";
1574
- }
1575
- function isAggregateError(err) {
1576
- return Array.isArray(err == null ? void 0 : err.errors);
1577
- }
1578
- function isErrorWithLoc(err) {
1579
- const loc = err == null ? void 0 : err.loc;
1580
- if (typeof loc !== "object")
1581
- return false;
1582
- return loc !== null && typeof loc === "object" && typeof loc.start === "object" && typeof loc.end === "object" && typeof loc.start.line === "number" && typeof loc.start.column === "number" && typeof loc.end.line === "number" && typeof loc.end.column === "number";
1583
- }
1584
-
1585
- // src/service/marko/hover/index.ts
1586
- var import_language_tools9 = require("@marko/language-tools");
1587
-
1588
- // src/utils/constants.ts
1589
- var START_POSITION = {
1590
- line: 0,
1591
- character: 0
1592
- };
1593
- var START_LOCATION = {
1594
- start: START_POSITION,
1595
- end: START_POSITION
1596
- };
1597
-
1598
- // src/service/marko/hover/OpenTagName.ts
1599
- function OpenTagName2({
1600
- node,
1601
- file: { parsed, filename, lookup }
1602
- }) {
1603
- const tag = node.parent;
1604
- const range = parsed.locationAt(node);
1605
- const tagDef = tag.nameText && lookup.getTag(tag.nameText);
1606
- if (tagDef) {
1607
- const completion = getTagNameCompletion({
1608
- tag: tagDef,
1609
- range: START_LOCATION,
1610
- importer: filename
1611
- });
1612
- if (completion.documentation) {
1613
- return {
1614
- range,
1615
- contents: completion.documentation
1616
- };
1617
- }
1618
- }
1619
- }
1620
-
1621
- // src/service/marko/hover/index.ts
1622
- var handlers2 = {
1623
- OpenTagName: OpenTagName2
1624
- };
1625
- var doHover = async (doc, params) => {
1626
- var _a;
1627
- const file = getMarkoFile(doc);
1628
- const offset = doc.offsetAt(params.position);
1629
- const node = file.parsed.nodeAt(offset);
1630
- return await ((_a = handlers2[import_language_tools9.NodeType[node.type]]) == null ? void 0 : _a.call(handlers2, {
1631
- file,
1632
- params,
1633
- offset,
1634
- node
1635
- }));
1636
- };
1637
-
1638
1440
  // src/service/marko/definition/index.ts
1639
- var import_language_tools12 = require("@marko/language-tools");
1441
+ var import_language_tools10 = require("@marko/language-tools");
1640
1442
 
1641
1443
  // src/service/marko/definition/AttrName.ts
1642
1444
  var import_fs2 = __toESM(require("fs"));
1643
1445
  var import_vscode_uri4 = require("vscode-uri");
1644
- var import_language_tools10 = require("@marko/language-tools");
1446
+ var import_language_tools8 = require("@marko/language-tools");
1645
1447
 
1646
1448
  // src/utils/regexp-builder.ts
1647
1449
  function RegExpBuilder(strings, ...expressions) {
@@ -1667,6 +1469,16 @@ function escape(val) {
1667
1469
  return String(val).replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
1668
1470
  }
1669
1471
 
1472
+ // src/utils/constants.ts
1473
+ var START_POSITION = {
1474
+ line: 0,
1475
+ character: 0
1476
+ };
1477
+ var START_LOCATION = {
1478
+ start: START_POSITION,
1479
+ end: START_POSITION
1480
+ };
1481
+
1670
1482
  // src/service/marko/definition/AttrName.ts
1671
1483
  function AttrName2({
1672
1484
  node,
@@ -1690,8 +1502,8 @@ function AttrName2({
1690
1502
  tagDefSource
1691
1503
  );
1692
1504
  if (match && match.index) {
1693
- range = (0, import_language_tools10.getLocation)(
1694
- (0, import_language_tools10.getLines)(tagDefSource),
1505
+ range = (0, import_language_tools8.getLocation)(
1506
+ (0, import_language_tools8.getLines)(tagDefSource),
1695
1507
  match.index,
1696
1508
  match.index + match[0].length
1697
1509
  );
@@ -1709,19 +1521,19 @@ function AttrName2({
1709
1521
 
1710
1522
  // src/service/marko/definition/OpenTagName.ts
1711
1523
  var import_fs3 = __toESM(require("fs"));
1712
- var import_path6 = __toESM(require("path"));
1524
+ var import_path5 = __toESM(require("path"));
1713
1525
  var import_vscode_uri5 = require("vscode-uri");
1714
- var import_language_tools11 = require("@marko/language-tools");
1715
- function OpenTagName3({
1526
+ var import_language_tools9 = require("@marko/language-tools");
1527
+ function OpenTagName2({
1716
1528
  node,
1717
1529
  file: { parsed, lookup }
1718
1530
  }) {
1719
1531
  const tag = node.parent;
1720
1532
  let tagDef;
1721
1533
  let range = START_LOCATION;
1722
- if (tag.type === import_language_tools11.NodeType.AttrTag) {
1534
+ if (tag.type === import_language_tools9.NodeType.AttrTag) {
1723
1535
  let parentTag = tag.owner;
1724
- while ((parentTag == null ? void 0 : parentTag.type) === import_language_tools11.NodeType.AttrTag)
1536
+ while ((parentTag == null ? void 0 : parentTag.type) === import_language_tools9.NodeType.AttrTag)
1725
1537
  parentTag = parentTag.owner;
1726
1538
  tagDef = parentTag && parentTag.nameText ? lookup.getTag(parentTag.nameText) : void 0;
1727
1539
  } else {
@@ -1731,7 +1543,7 @@ function OpenTagName3({
1731
1543
  return;
1732
1544
  }
1733
1545
  const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
1734
- if (!import_path6.default.isAbsolute(tagEntryFile)) {
1546
+ if (!import_path5.default.isAbsolute(tagEntryFile)) {
1735
1547
  return;
1736
1548
  }
1737
1549
  if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
@@ -1740,8 +1552,8 @@ function OpenTagName3({
1740
1552
  tagDefSource
1741
1553
  );
1742
1554
  if (match && match.index) {
1743
- range = (0, import_language_tools11.getLocation)(
1744
- (0, import_language_tools11.getLines)(tagDefSource),
1555
+ range = (0, import_language_tools9.getLocation)(
1556
+ (0, import_language_tools9.getLines)(tagDefSource),
1745
1557
  match.index,
1746
1558
  match.index + match[0].length
1747
1559
  );
@@ -1758,8 +1570,8 @@ function OpenTagName3({
1758
1570
  }
1759
1571
 
1760
1572
  // src/service/marko/definition/index.ts
1761
- var handlers3 = {
1762
- OpenTagName: OpenTagName3,
1573
+ var handlers2 = {
1574
+ OpenTagName: OpenTagName2,
1763
1575
  AttrName: AttrName2
1764
1576
  };
1765
1577
  var findDefinition = async (doc, params) => {
@@ -1767,7 +1579,7 @@ var findDefinition = async (doc, params) => {
1767
1579
  const file = getMarkoFile(doc);
1768
1580
  const offset = doc.offsetAt(params.position);
1769
1581
  const node = file.parsed.nodeAt(offset);
1770
- return await ((_a = handlers3[import_language_tools12.NodeType[node.type]]) == null ? void 0 : _a.call(handlers3, {
1582
+ return await ((_a = handlers2[import_language_tools10.NodeType[node.type]]) == null ? void 0 : _a.call(handlers2, {
1771
1583
  file,
1772
1584
  params,
1773
1585
  offset,
@@ -1776,7 +1588,7 @@ var findDefinition = async (doc, params) => {
1776
1588
  };
1777
1589
 
1778
1590
  // src/service/marko/document-links.ts
1779
- var import_language_tools13 = require("@marko/language-tools");
1591
+ var import_language_tools11 = require("@marko/language-tools");
1780
1592
  var importTagReg2 = /(['"])<((?:[^\1\\>]+|\\.)*)>?\1/g;
1781
1593
  var findDocumentLinks = async (doc) => {
1782
1594
  return processDoc(doc, extractDocumentLinks);
@@ -1795,14 +1607,14 @@ function extractDocumentLinks({
1795
1607
  const { program, read } = parsed;
1796
1608
  const visit = (node) => {
1797
1609
  switch (node.type) {
1798
- case import_language_tools13.NodeType.AttrTag:
1610
+ case import_language_tools11.NodeType.AttrTag:
1799
1611
  if (node.body) {
1800
1612
  for (const child of node.body) {
1801
1613
  visit(child);
1802
1614
  }
1803
1615
  }
1804
1616
  break;
1805
- case import_language_tools13.NodeType.Tag:
1617
+ case import_language_tools11.NodeType.Tag:
1806
1618
  if (node.attrs && node.nameText) {
1807
1619
  for (const attr of node.attrs) {
1808
1620
  if (isDocumentLinkAttr(code, node, attr)) {
@@ -1828,7 +1640,7 @@ function extractDocumentLinks({
1828
1640
  }
1829
1641
  };
1830
1642
  for (const node of program.static) {
1831
- if (node.type === import_language_tools13.NodeType.Import) {
1643
+ if (node.type === import_language_tools11.NodeType.Import) {
1832
1644
  importTagReg2.lastIndex = 0;
1833
1645
  const value = parsed.read(node);
1834
1646
  const match = importTagReg2.exec(value);
@@ -1855,8 +1667,8 @@ function extractDocumentLinks({
1855
1667
  }
1856
1668
 
1857
1669
  // src/service/marko/document-symbols.ts
1858
- var import_vscode_languageserver8 = require("vscode-languageserver");
1859
- var import_language_tools14 = require("@marko/language-tools");
1670
+ var import_vscode_languageserver7 = require("vscode-languageserver");
1671
+ var import_language_tools12 = require("@marko/language-tools");
1860
1672
  var findDocumentSymbols = async (doc) => processDoc(doc, extractDocumentSymbols);
1861
1673
  function extractDocumentSymbols({
1862
1674
  uri,
@@ -1872,11 +1684,11 @@ function extractDocumentSymbols({
1872
1684
  const visit = (node) => {
1873
1685
  var _a, _b;
1874
1686
  switch (node.type) {
1875
- case import_language_tools14.NodeType.Tag:
1876
- case import_language_tools14.NodeType.AttrTag:
1687
+ case import_language_tools12.NodeType.Tag:
1688
+ case import_language_tools12.NodeType.AttrTag:
1877
1689
  symbols.push({
1878
- name: (node.type === import_language_tools14.NodeType.AttrTag ? (_a = node.nameText) == null ? void 0 : _a.slice(node.nameText.indexOf("@")) : node.nameText) || "<${...}>",
1879
- kind: node.nameText && ((_b = lookup.getTag(node.nameText)) == null ? void 0 : _b.html) && import_vscode_languageserver8.SymbolKind.Property || import_vscode_languageserver8.SymbolKind.Class,
1690
+ name: (node.type === import_language_tools12.NodeType.AttrTag ? (_a = node.nameText) == null ? void 0 : _a.slice(node.nameText.indexOf("@")) : node.nameText) || "<${...}>",
1691
+ kind: node.nameText && ((_b = lookup.getTag(node.nameText)) == null ? void 0 : _b.html) && import_vscode_languageserver7.SymbolKind.Property || import_vscode_languageserver7.SymbolKind.Class,
1880
1692
  location: {
1881
1693
  uri,
1882
1694
  range: parsed.locationAt(node)
@@ -1897,11 +1709,11 @@ function extractDocumentSymbols({
1897
1709
  }
1898
1710
 
1899
1711
  // src/service/marko/format.ts
1900
- var import_vscode_languageserver9 = require("vscode-languageserver");
1712
+ var import_language_tools13 = require("@marko/language-tools");
1901
1713
  var prettier = __toESM(require("prettier"));
1902
1714
  var markoPrettier = __toESM(require("prettier-plugin-marko"));
1903
- var import_language_tools15 = require("@marko/language-tools");
1904
- var format2 = async (doc, params, cancel) => {
1715
+ var import_vscode_languageserver8 = require("vscode-languageserver");
1716
+ async function formatDocument(doc, formatOptions, cancel) {
1905
1717
  try {
1906
1718
  const dir = getFSDir(doc);
1907
1719
  const filepath = getFSPath(doc);
@@ -1910,17 +1722,18 @@ var format2 = async (doc, params, cancel) => {
1910
1722
  parser: "marko",
1911
1723
  filepath,
1912
1724
  plugins: [markoPrettier],
1913
- tabWidth: params.options.tabSize,
1914
- useTabs: params.options.insertSpaces === false,
1725
+ tabWidth: formatOptions.tabSize,
1726
+ useTabs: formatOptions.insertSpaces === false,
1727
+ markoSyntax: formatOptions.mode ?? "auto",
1915
1728
  ...filepath ? await prettier.resolveConfig(filepath, {
1916
1729
  editorconfig: true
1917
1730
  }).catch(() => null) : null
1918
1731
  };
1919
- if (cancel.isCancellationRequested)
1732
+ markoPrettier.setCompiler(import_language_tools13.Project.getCompiler(dir), import_language_tools13.Project.getConfig(dir));
1733
+ if (cancel == null ? void 0 : cancel.isCancellationRequested)
1920
1734
  return;
1921
- markoPrettier.setCompiler(import_language_tools15.Project.getCompiler(dir), import_language_tools15.Project.getConfig(dir));
1922
- const ret = [
1923
- import_vscode_languageserver9.TextEdit.replace(
1735
+ return [
1736
+ import_vscode_languageserver8.TextEdit.replace(
1924
1737
  {
1925
1738
  start: START_POSITION,
1926
1739
  end: doc.positionAt(text.length)
@@ -1928,12 +1741,202 @@ var format2 = async (doc, params, cancel) => {
1928
1741
  await prettier.format(text, options)
1929
1742
  )
1930
1743
  ];
1931
- return ret;
1932
1744
  } catch (e) {
1933
1745
  displayError(e);
1934
1746
  }
1747
+ }
1748
+ var format2 = async (doc, params, cancel) => {
1749
+ return formatDocument(doc, params.options, cancel);
1750
+ };
1751
+
1752
+ // src/service/marko/hover/index.ts
1753
+ var import_language_tools14 = require("@marko/language-tools");
1754
+
1755
+ // src/service/marko/hover/OpenTagName.ts
1756
+ function OpenTagName3({
1757
+ node,
1758
+ file: { parsed, filename, lookup }
1759
+ }) {
1760
+ const tag = node.parent;
1761
+ const range = parsed.locationAt(node);
1762
+ const tagDef = tag.nameText && lookup.getTag(tag.nameText);
1763
+ if (tagDef) {
1764
+ const completion = getTagNameCompletion({
1765
+ tag: tagDef,
1766
+ range: START_LOCATION,
1767
+ importer: filename
1768
+ });
1769
+ if (completion.documentation) {
1770
+ return {
1771
+ range,
1772
+ contents: completion.documentation
1773
+ };
1774
+ }
1775
+ }
1776
+ }
1777
+
1778
+ // src/service/marko/hover/index.ts
1779
+ var handlers3 = {
1780
+ OpenTagName: OpenTagName3
1781
+ };
1782
+ var doHover = async (doc, params) => {
1783
+ var _a;
1784
+ const file = getMarkoFile(doc);
1785
+ const offset = doc.offsetAt(params.position);
1786
+ const node = file.parsed.nodeAt(offset);
1787
+ return await ((_a = handlers3[import_language_tools14.NodeType[node.type]]) == null ? void 0 : _a.call(handlers3, {
1788
+ file,
1789
+ params,
1790
+ offset,
1791
+ node
1792
+ }));
1935
1793
  };
1936
1794
 
1795
+ // src/service/marko/validate.ts
1796
+ var import_path6 = __toESM(require("path"));
1797
+ var import_language_tools15 = require("@marko/language-tools");
1798
+ var import_vscode_languageserver9 = require("vscode-languageserver");
1799
+ var import_babel_utils = require("@marko/babel-utils");
1800
+ var markoErrorRegExp = /^(.+?)\.marko(?:\((\d+)(?:\s*,\s*(\d+))?\))?: (.*)$/gm;
1801
+ var compilerConfig = {
1802
+ code: false,
1803
+ output: "migrate",
1804
+ sourceMaps: false,
1805
+ errorRecovery: true,
1806
+ babelConfig: {
1807
+ babelrc: false,
1808
+ configFile: false,
1809
+ browserslistConfigFile: false,
1810
+ caller: {
1811
+ name: "@marko/language-server",
1812
+ supportsStaticESM: true,
1813
+ supportsDynamicImport: true,
1814
+ supportsTopLevelAwait: true,
1815
+ supportsExportNamespaceFrom: true
1816
+ }
1817
+ }
1818
+ };
1819
+ var doValidate = (doc) => {
1820
+ const filename = getFSPath(doc);
1821
+ const diagnostics = [];
1822
+ try {
1823
+ const { meta } = import_language_tools15.Project.getCompiler(
1824
+ filename && import_path6.default.dirname(filename)
1825
+ ).compileSync(doc.getText(), filename || "untitled.marko", compilerConfig);
1826
+ if (meta.diagnostics) {
1827
+ for (const diag of meta.diagnostics) {
1828
+ const range = diag.loc ? {
1829
+ start: {
1830
+ line: diag.loc.start.line - 1,
1831
+ character: diag.loc.start.column
1832
+ },
1833
+ end: {
1834
+ line: diag.loc.end.line - 1,
1835
+ character: diag.loc.end.column
1836
+ }
1837
+ } : {
1838
+ start: { line: 0, character: 0 },
1839
+ end: { line: 0, character: 0 }
1840
+ };
1841
+ let severity;
1842
+ switch (diag.type) {
1843
+ case import_babel_utils.DiagnosticType.Warning:
1844
+ case import_babel_utils.DiagnosticType.Deprecation:
1845
+ severity = import_vscode_languageserver9.DiagnosticSeverity.Warning;
1846
+ break;
1847
+ case import_babel_utils.DiagnosticType.Suggestion:
1848
+ severity = import_vscode_languageserver9.DiagnosticSeverity.Hint;
1849
+ break;
1850
+ default:
1851
+ severity = import_vscode_languageserver9.DiagnosticSeverity.Error;
1852
+ break;
1853
+ }
1854
+ diagnostics.push({
1855
+ range,
1856
+ source: "marko",
1857
+ code: void 0,
1858
+ tags: void 0,
1859
+ severity,
1860
+ message: diag.label
1861
+ });
1862
+ }
1863
+ }
1864
+ } catch (err) {
1865
+ addDiagnosticsForError(err, diagnostics);
1866
+ }
1867
+ return diagnostics;
1868
+ };
1869
+ function addDiagnosticsForError(err, diagnostics) {
1870
+ if (!isError(err)) {
1871
+ diagnostics.push({
1872
+ range: {
1873
+ start: { line: 0, character: 0 },
1874
+ end: { line: 0, character: 0 }
1875
+ },
1876
+ source: "marko",
1877
+ code: void 0,
1878
+ tags: void 0,
1879
+ severity: import_vscode_languageserver9.DiagnosticSeverity.Error,
1880
+ message: String(err)
1881
+ });
1882
+ } else if (isAggregateError(err)) {
1883
+ for (const nestedError of err.errors) {
1884
+ addDiagnosticsForError(nestedError, diagnostics);
1885
+ }
1886
+ } else if (isErrorWithLoc(err)) {
1887
+ const message = err.label || err.message || err.stack;
1888
+ if (!message)
1889
+ return;
1890
+ const { loc } = err;
1891
+ diagnostics.push({
1892
+ range: {
1893
+ start: {
1894
+ line: loc.start.line - 1,
1895
+ character: loc.start.column
1896
+ },
1897
+ end: {
1898
+ line: loc.end.line - 1,
1899
+ character: loc.end.column
1900
+ }
1901
+ },
1902
+ source: "marko",
1903
+ code: void 0,
1904
+ tags: void 0,
1905
+ severity: import_vscode_languageserver9.DiagnosticSeverity.Error,
1906
+ message
1907
+ });
1908
+ } else {
1909
+ let match;
1910
+ while (match = markoErrorRegExp.exec(err.message)) {
1911
+ const [, , rawLine, rawCol, message] = match;
1912
+ const pos = {
1913
+ line: (parseInt(rawLine, 10) || 1) - 1,
1914
+ character: (parseInt(rawCol, 10) || 1) - 1
1915
+ };
1916
+ diagnostics.push({
1917
+ range: { start: pos, end: pos },
1918
+ source: "marko",
1919
+ code: void 0,
1920
+ tags: void 0,
1921
+ severity: import_vscode_languageserver9.DiagnosticSeverity.Error,
1922
+ message
1923
+ });
1924
+ }
1925
+ }
1926
+ }
1927
+ function isError(err) {
1928
+ return err != null && typeof err === "object" && typeof err.message === "string";
1929
+ }
1930
+ function isAggregateError(err) {
1931
+ return Array.isArray(err == null ? void 0 : err.errors);
1932
+ }
1933
+ function isErrorWithLoc(err) {
1934
+ const loc = err == null ? void 0 : err.loc;
1935
+ if (typeof loc !== "object")
1936
+ return false;
1937
+ return loc !== null && typeof loc === "object" && typeof loc.start === "object" && typeof loc.end === "object" && typeof loc.start.line === "number" && typeof loc.start.column === "number" && typeof loc.end.line === "number" && typeof loc.end.column === "number";
1938
+ }
1939
+
1937
1940
  // src/service/marko/index.ts
1938
1941
  var marko_default = {
1939
1942
  doComplete,
@@ -1942,7 +1945,17 @@ var marko_default = {
1942
1945
  findDefinition,
1943
1946
  findDocumentLinks,
1944
1947
  findDocumentSymbols,
1945
- format: format2
1948
+ format: format2,
1949
+ commands: {
1950
+ "$/formatWithMode": async ({
1951
+ doc: docURI,
1952
+ options
1953
+ }) => {
1954
+ const doc = get(docURI);
1955
+ const formatted = await formatDocument(doc, options);
1956
+ return formatted;
1957
+ }
1958
+ }
1946
1959
  };
1947
1960
 
1948
1961
  // src/service/script/index.ts
@@ -2791,12 +2804,12 @@ function getTSProject(docFsPath) {
2791
2804
  markoScriptLang = import_language_tools17.ScriptLang.ts;
2792
2805
  }
2793
2806
  }
2794
- const rootDir = configFile && import_path8.default.dirname(configFile) || process.cwd();
2795
- const cache = import_language_tools17.Project.getCache(configFile && rootDir);
2807
+ const basePath = configFile && import_path8.default.dirname(configFile) || process.cwd();
2808
+ const cache = import_language_tools17.Project.getCache(configFile && basePath);
2796
2809
  let projectCache = cache.get(getTSProject);
2797
2810
  let cached;
2798
2811
  if (projectCache) {
2799
- cached = projectCache.get(rootDir);
2812
+ cached = projectCache.get(basePath);
2800
2813
  if (cached)
2801
2814
  return cached;
2802
2815
  } else {
@@ -2806,13 +2819,13 @@ function getTSProject(docFsPath) {
2806
2819
  const { fileNames, options, projectReferences } = import_tsserverlibrary.default.parseJsonConfigFileContent(
2807
2820
  configFile && import_tsserverlibrary.default.readConfigFile(configFile, import_tsserverlibrary.default.sys.readFile).config || defaultTSConfig,
2808
2821
  import_tsserverlibrary.default.sys,
2809
- rootDir,
2822
+ basePath,
2810
2823
  requiredTSCompilerOptions,
2811
2824
  configFile,
2812
2825
  void 0,
2813
2826
  extraTSCompilerExtensions
2814
2827
  );
2815
- options.rootDir ??= rootDir;
2828
+ options.rootDir = basePath;
2816
2829
  const potentialGlobalFiles = new Set(
2817
2830
  fileNames.filter((file) => /\.[cm]?ts$/.test(file))
2818
2831
  );
@@ -2822,7 +2835,7 @@ function getTSProject(docFsPath) {
2822
2835
  import_tsserverlibrary.default.getDefaultLibFileName(options)
2823
2836
  );
2824
2837
  const resolutionCache = import_tsserverlibrary.default.createModuleResolutionCache(
2825
- rootDir,
2838
+ basePath,
2826
2839
  getCanonicalFileName,
2827
2840
  options
2828
2841
  );
@@ -2927,7 +2940,7 @@ function getTSProject(docFsPath) {
2927
2940
  service: import_tsserverlibrary.default.createLanguageService(host),
2928
2941
  markoScriptLang
2929
2942
  };
2930
- projectCache.set(rootDir, tsProject);
2943
+ projectCache.set(basePath, tsProject);
2931
2944
  return tsProject;
2932
2945
  }
2933
2946
  function filenameToURI(filename) {