@shopify/theme-language-server-common
Version: 
<h1 align="center" style="position: relative;" > <br> <img src="https://github.com/Shopify/theme-check-vscode/blob/main/images/shopify_glyph.png?raw=true" alt="logo" width="141" height="160"> <br> Theme Language Server </h1>
67 lines • 3.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocumentLinksProvider = void 0;
const liquid_html_parser_1 = require("@shopify/liquid-html-parser");
const theme_check_common_1 = require("@shopify/theme-check-common");
const vscode_languageserver_1 = require("vscode-languageserver");
const vscode_uri_1 = require("vscode-uri");
const visitor_1 = require("../visitor");
class DocumentLinksProvider {
    constructor(documentManager, findThemeRootURI) {
        this.documentManager = documentManager;
        this.findThemeRootURI = findThemeRootURI;
    }
    async documentLinks(uriString) {
        const sourceCode = this.documentManager.get(uriString);
        if (!sourceCode ||
            sourceCode.type !== theme_check_common_1.SourceCodeType.LiquidHtml ||
            sourceCode.ast instanceof Error) {
            return [];
        }
        const rootUri = await this.findThemeRootURI(uriString);
        const visitor = documentLinksVisitor(sourceCode.textDocument, vscode_uri_1.URI.parse(rootUri));
        return (0, visitor_1.visit)(sourceCode.ast, visitor);
    }
}
exports.DocumentLinksProvider = DocumentLinksProvider;
function documentLinksVisitor(textDocument, root) {
    return {
        LiquidTag(node) {
            // {% render 'snippet' %}
            // {% include 'snippet' %}
            if ((node.name === 'render' || node.name === 'include') &&
                typeof node.markup !== 'string' &&
                isLiquidString(node.markup.snippet)) {
                const snippet = node.markup.snippet;
                return vscode_languageserver_1.DocumentLink.create(range(textDocument, snippet), vscode_uri_1.Utils.resolvePath(root, 'snippets', snippet.value + '.liquid').toString());
            }
            // {% section 'section' %}
            if (node.name === 'section' &&
                typeof node.markup !== 'string' &&
                isLiquidString(node.markup)) {
                const sectionName = node.markup;
                return vscode_languageserver_1.DocumentLink.create(range(textDocument, sectionName), vscode_uri_1.Utils.resolvePath(root, 'sections', sectionName.value + '.liquid').toString());
            }
        },
        // {{ 'theme.js' | asset_url }}
        LiquidVariable(node) {
            if (node.filters.length === 0 || node.filters[0].name !== 'asset_url') {
                return;
            }
            if (!isLiquidString(node.expression)) {
                return;
            }
            const expression = node.expression;
            return vscode_languageserver_1.DocumentLink.create(range(textDocument, node.expression), vscode_uri_1.Utils.resolvePath(root, 'assets', expression.value).toString());
        },
    };
}
function range(textDocument, node) {
    const start = textDocument.positionAt(node.position.start);
    const end = textDocument.positionAt(node.position.end);
    return vscode_languageserver_1.Range.create(start, end);
}
function isLiquidString(node) {
    return node.type === liquid_html_parser_1.NodeTypes.String;
}
//# sourceMappingURL=DocumentLinksProvider.js.map