HEX
Server: LiteSpeed
System: Linux s3604.bom1.stableserver.net 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User: dmstechonline (1480)
PHP: 7.4.33
Disabled: NONE
Upload Files
File: /home/dmstechonline/whatsapp.dmstech.online/node_modules/yaml-eslint-parser/lib/convert.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertRoot = void 0;
const tags_1 = require("./tags");
const yaml_1 = require("yaml");
const isPair = yaml_1.isPair;
class PreTokens {
    constructor(array, ctx) {
        this.index = 0;
        this.array = array;
        this.ctx = ctx;
    }
    first() {
        let cst;
        while ((cst = this.array[this.index])) {
            if (processCommentOrSpace(cst, this.ctx)) {
                this.index++;
                continue;
            }
            return cst;
        }
        return null;
    }
    consume() {
        const cst = this.first();
        if (cst) {
            this.index++;
        }
        return cst;
    }
    back() {
        this.index--;
    }
    each(callback) {
        let cst;
        while ((cst = this.consume())) {
            callback(cst);
        }
    }
}
/** Checks whether the give cst node is plain scaler */
function isPlainScalarCST(cst) {
    return cst.type === "scalar";
}
/** Checks whether the give cst node is double-quoted-scalar */
function isDoubleQuotedScalarCST(cst) {
    return cst.type === "double-quoted-scalar";
}
/** Checks whether the give cst node is single-quoted-scalar */
function isSingleQuotedScalarCST(cst) {
    return cst.type === "single-quoted-scalar";
}
/** Checks whether the give cst node is alias scalar */
function isAliasScalarCST(cst) {
    return cst.type === "alias";
}
/** Checks whether the give cst node is anchor */
function isAnchorCST(cst) {
    return cst.type === "anchor";
}
/** Checks whether the give cst node is tag */
function isTagCST(cst) {
    return cst.type === "tag";
}
/** Get node type name */
function getNodeType(node) {
    /* istanbul ignore next */
    return (0, yaml_1.isMap)(node)
        ? "MAP"
        : (0, yaml_1.isSeq)(node)
            ? "SEQ"
            : (0, yaml_1.isScalar)(node)
                ? "SCALAR"
                : (0, yaml_1.isAlias)(node)
                    ? "ALIAS"
                    : isPair(node)
                        ? "PAIR"
                        : (0, yaml_1.isDocument)(node)
                            ? "DOCUMENT"
                            : "unknown";
}
/**
 * Convert yaml root to YAMLProgram
 */
function convertRoot(docs, ctx) {
    var _a;
    const { cstNodes, nodes } = docs;
    const ast = Object.assign({ type: "Program", body: [], comments: ctx.comments, sourceType: "module", tokens: ctx.tokens, parent: null }, ctx.getConvertLocation(0, ctx.code.length));
    let directives = [];
    let bufferDoc = null;
    const cstDocs = [];
    for (const n of cstNodes) {
        if (processCommentOrSpace(n, ctx)) {
            continue;
        }
        if (n.type === "doc-end") {
            /* istanbul ignore if */
            if (!bufferDoc) {
                throw ctx.throwUnexpectedTokenError(n);
            }
            bufferDoc.docEnd = n;
            cstDocs.push(bufferDoc);
            bufferDoc = null;
            (_a = n.end) === null || _a === void 0 ? void 0 : _a.forEach((t) => processAnyToken(t, ctx));
            continue;
        }
        if (bufferDoc) {
            cstDocs.push(bufferDoc);
            bufferDoc = null;
        }
        if (n.type === "directive") {
            directives.push(n);
            continue;
        }
        if (n.type === "document") {
            bufferDoc = {
                doc: n,
                directives,
            };
            directives = [];
            continue;
        }
        /* istanbul ignore next */
        throw ctx.throwUnexpectedTokenError(n);
    }
    if (bufferDoc) {
        cstDocs.push(bufferDoc);
        bufferDoc = null;
    }
    if (cstDocs.length > 0) {
        let startIndex = 0;
        ast.body = cstDocs.map((doc, index) => {
            const result = convertDocument(doc, nodes[index], ctx, ast, startIndex);
            startIndex = result.range[1];
            return result;
        });
    }
    else {
        const index = skipSpaces(ctx.code, 0);
        ast.body.push(Object.assign({ type: "YAMLDocument", directives: [], content: null, parent: ast, anchors: {}, version: docs.streamInfo.directives.yaml.version }, ctx.getConvertLocation(index, index)));
    }
    sort(ctx.comments);
    sort(ctx.tokens);
    const lastBody = ast.body[ast.body.length - 1];
    if (lastBody) {
        adjustEndLoc(lastBody, ctx.comments[ctx.comments.length - 1]);
    }
    return ast;
}
exports.convertRoot = convertRoot;
/**
 * Convert YAML.Document to YAMLDocument
 */
function convertDocument({ directives, doc, docEnd }, node, ctx, parent, startIndex) {
    const loc = ctx.getConvertLocation(skipSpaces(ctx.code, startIndex), node.range[1]);
    const ast = Object.assign({ type: "YAMLDocument", directives: [], content: null, parent, anchors: {}, version: node.directives.yaml.version }, loc);
    ast.directives.push(...convertDocumentHead(node.directives, directives, ctx, ast));
    let last = ast.directives[ast.directives.length - 1];
    const startTokens = new PreTokens(doc.start, ctx);
    let t;
    while ((t = startTokens.consume())) {
        if (t.type === "doc-start") {
            last = ctx.addToken("Marker", toRange(t));
            continue;
        }
        startTokens.back();
        break;
    }
    ast.content = convertDocumentBody(startTokens, doc.value || null, node.contents, ctx, ast);
    last = ast.content || last;
    if (doc.end) {
        doc.end.forEach((token) => processAnyToken(token, ctx));
    }
    // Marker
    if (docEnd) {
        last = ctx.addToken("Marker", toRange(docEnd));
    }
    adjustEndLoc(ast, last);
    return ast;
}
/**
 * Convert YAML.Document.Parsed to YAMLDirective[]
 */
function* convertDocumentHead(node, directives, ctx, parent) {
    for (const n of directives) {
        yield convertDirective(node, n, ctx, parent);
    }
}
/**
 * Convert CSTDirective to YAMLDirective
 */
function convertDirective(node, cst, ctx, parent) {
    const loc = ctx.getConvertLocation(...toRange(cst));
    const value = ctx.code.slice(...loc.range);
    const parts = cst.source.trim().split(/[\t ]+/);
    const name = parts.shift();
    let ast;
    if (name === "%YAML") {
        ast = Object.assign({ type: "YAMLDirective", value, kind: "YAML", version: node.yaml.version, parent }, loc);
    }
    else if (name === "%TAG") {
        const [handle, prefix] = parts;
        ast = Object.assign({ type: "YAMLDirective", value, kind: "TAG", handle,
            prefix,
            parent }, loc);
    }
    else {
        ast = Object.assign({ type: "YAMLDirective", value, kind: null, parent }, loc);
    }
    ctx.addToken("Directive", loc.range);
    return ast;
}
/**
 * Convert Document body to YAMLContent
 */
function convertDocumentBody(preTokens, cst, node, ctx, parent) {
    if (cst) {
        return convertContentNode(preTokens, cst, node, ctx, parent, parent);
    }
    const token = preTokens.first();
    /* istanbul ignore if */
    if (token) {
        throw ctx.throwUnexpectedTokenError(token);
    }
    return null;
}
/* eslint-disable complexity -- X */
/**
 * Convert ContentNode to YAMLContent
 */
function convertContentNode(
/* eslint-enable complexity -- X */
preTokens, cst, node, ctx, parent, doc) {
    var _a;
    /* istanbul ignore if */
    if (!node) {
        throw ctx.throwError(`unknown error: AST is null. Unable to process content CST (${cst.type}).`, cst);
    }
    /* istanbul ignore if */
    if (node.srcToken !== cst) {
        throw ctx.throwError(`unknown error: CST is mismatched. Unable to process content CST (${cst.type}: ${(_a = node.srcToken) === null || _a === void 0 ? void 0 : _a.type}).`, cst);
    }
    if (cst.type === "block-scalar") {
        /* istanbul ignore if */
        if (!(0, yaml_1.isScalar)(node)) {
            throw ctx.throwError(`unknown error: AST is not Scalar (${getNodeType(node)}). Unable to process Scalar CST.`, cst);
        }
        return convertBlockScalar(preTokens, cst, node, ctx, parent, doc);
    }
    if (cst.type === "block-seq") {
        /* istanbul ignore if */
        if (!(0, yaml_1.isSeq)(node)) {
            throw ctx.throwError(`unknown error: AST is not Seq (${getNodeType(node)}). Unable to process Seq CST.`, cst);
        }
        return convertSequence(preTokens, cst, node, ctx, parent, doc);
    }
    if (cst.type === "block-map") {
        /* istanbul ignore if */
        if (!(0, yaml_1.isMap)(node)) {
            throw ctx.throwError(`unknown error: AST is not Map and Pair (${getNodeType(node)}). Unable to process Map CST.`, cst);
        }
        return convertMapping(preTokens, cst, node, ctx, parent, doc);
    }
    if (cst.type === "flow-collection") {
        return convertFlowCollection(preTokens, cst, node, ctx, parent, doc);
    }
    if (isPlainScalarCST(cst)) {
        /* istanbul ignore if */
        if (!(0, yaml_1.isScalar)(node)) {
            throw ctx.throwError(`unknown error: AST is not Scalar (${getNodeType(node)}). Unable to process Scalar CST.`, cst);
        }
        return convertPlain(preTokens, cst, node, ctx, parent, doc);
    }
    if (isDoubleQuotedScalarCST(cst)) {
        /* istanbul ignore if */
        if (!(0, yaml_1.isScalar)(node)) {
            throw ctx.throwError(`unknown error: AST is not Scalar (${getNodeType(node)}). Unable to process Scalar CST.`, cst);
        }
        return convertQuoteDouble(preTokens, cst, node, ctx, parent, doc);
    }
    if (isSingleQuotedScalarCST(cst)) {
        /* istanbul ignore if */
        if (!(0, yaml_1.isScalar)(node)) {
            throw ctx.throwError(`unknown error: AST is not Scalar (${getNodeType(node)}). Unable to process Scalar CST.`, cst);
        }
        return convertQuoteSingle(preTokens, cst, node, ctx, parent, doc);
    }
    if (isAliasScalarCST(cst)) {
        /* istanbul ignore if */
        if (!(0, yaml_1.isAlias)(node)) {
            throw ctx.throwError(`unknown error: AST is not Alias (${getNodeType(node)}). Unable to process Alias CST.`, cst);
        }
        return convertAlias(preTokens, cst, node, ctx, parent, doc);
    }
    /* istanbul ignore next */
    throw new Error(`Unsupported node: ${cst.type}`);
}
/* eslint-disable complexity -- X */
/**
 * Convert Map to YAMLBlockMapping
 */
function convertMapping(
/* eslint-enable complexity -- X */
preTokens, cst, node, ctx, parent, doc) {
    var _a, _b;
    if (isPair(node)) {
        /* istanbul ignore if */
        if (node.srcToken !== cst.items[0]) {
            throw ctx.throwError(`unknown error: CST is mismatched. Unable to process mapping CST (${cst.type}: "CollectionItem").`, cst);
        }
    }
    else {
        /* istanbul ignore if */
        if (node.srcToken !== cst) {
            throw ctx.throwError(`unknown error: CST is mismatched. Unable to process mapping CST (${cst.type}: ${(_a = node.srcToken) === null || _a === void 0 ? void 0 : _a.type}).`, cst);
        }
    }
    const loc = ctx.getConvertLocation(cst.offset, cst.offset);
    const ast = Object.assign({ type: "YAMLMapping", style: "block", pairs: [], parent }, loc);
    const items = getPairs(node);
    let firstKeyInd;
    let lastKeyInd;
    for (const item of cst.items) {
        const startTokens = new PreTokens(item.start, ctx);
        let token;
        let keyInd = null;
        while ((token = startTokens.consume())) {
            if (token.type === "explicit-key-ind") {
                /* istanbul ignore if */
                if (keyInd) {
                    throw ctx.throwUnexpectedTokenError(token);
                }
                lastKeyInd = keyInd = ctx.addToken("Punctuator", toRange(token));
                firstKeyInd !== null && firstKeyInd !== void 0 ? firstKeyInd : (firstKeyInd = keyInd);
                continue;
            }
            startTokens.back();
            break;
        }
        const pair = items.shift();
        if (!pair) {
            const t = startTokens.first() ||
                keyInd ||
                item.key ||
                ((_b = item.sep) === null || _b === void 0 ? void 0 : _b[0]) ||
                item.value;
            if (!t) {
                // trailing spaces
                break;
            }
            /* istanbul ignore next */
            throw ctx.throwUnexpectedTokenError(t);
        }
        ast.pairs.push(convertMappingItem(keyInd, startTokens, item, pair, ctx, ast, doc));
    }
    adjustStartLoc(ast, firstKeyInd);
    adjustStartLoc(ast, ast.pairs[0]);
    adjustEndLoc(ast, ast.pairs[ast.pairs.length - 1] || lastKeyInd);
    if (!(0, yaml_1.isMap)(node)) {
        return ast;
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
}
/**
 * Convert FlowCollection to YAMLFlowMapping
 */
function convertFlowCollection(preTokens, cst, node, ctx, parent, doc) {
    if (cst.start.type === "flow-map-start") {
        const startToken = ctx.addToken("Punctuator", toRange(cst.start));
        /* istanbul ignore if */
        if (!(0, yaml_1.isMap)(node) && !isPair(node)) {
            throw ctx.throwError(`unknown error: AST is not Map and Pair (${getNodeType(node)}). Unable to process flow map CST.`, cst);
        }
        return convertFlowMapping(preTokens, startToken, cst, node, ctx, parent, doc);
    }
    if (cst.start.type === "flow-seq-start") {
        const startToken = ctx.addToken("Punctuator", toRange(cst.start));
        /* istanbul ignore if */
        if (!(0, yaml_1.isSeq)(node) || !node.flow) {
            throw ctx.throwError(`unknown error: AST is not flow Seq (${getNodeType(node)}). Unable to process flow seq CST.`, cst);
        }
        return convertFlowSequence(preTokens, startToken, cst, node, ctx, parent, doc);
    }
    /* istanbul ignore next */
    throw ctx.throwUnexpectedTokenError(cst.start);
}
/* eslint-disable complexity -- X */
/**
 * Convert FlowMap to YAMLFlowMapping
 */
function convertFlowMapping(
/* eslint-enable complexity -- X */
preTokens, startToken, cst, node, ctx, parent, doc) {
    var _a;
    const loc = ctx.getConvertLocation(startToken.range[0], cst.offset);
    const ast = Object.assign({ type: "YAMLMapping", style: "flow", pairs: [], parent }, loc);
    const items = getPairs(node);
    let lastToken;
    for (const item of cst.items) {
        const startTokens = new PreTokens(item.start, ctx);
        let token;
        let keyInd = null;
        while ((token = startTokens.consume())) {
            if (token.type === "comma") {
                lastToken = ctx.addToken("Punctuator", toRange(token));
                continue;
            }
            if (token.type === "explicit-key-ind") {
                /* istanbul ignore if */
                if (keyInd) {
                    throw ctx.throwUnexpectedTokenError(token);
                }
                lastToken = keyInd = ctx.addToken("Punctuator", toRange(token));
                continue;
            }
            startTokens.back();
            break;
        }
        const pair = items.shift();
        if (!pair) {
            const t = startTokens.first() ||
                keyInd ||
                item.key ||
                ((_a = item.sep) === null || _a === void 0 ? void 0 : _a[0]) ||
                item.value;
            if (!t) {
                // trailing spaces
                break;
            }
            /* istanbul ignore next */
            throw ctx.throwUnexpectedTokenError(t);
        }
        ast.pairs.push(convertMappingItem(keyInd, startTokens, item, pair, ctx, ast, doc));
    }
    let mapEnd;
    for (const token of cst.end) {
        if (processCommentOrSpace(token, ctx)) {
            continue;
        }
        if (token.type === "flow-map-end") {
            mapEnd = ctx.addToken("Punctuator", toRange(token));
            continue;
        }
        /* istanbul ignore next */
        throw ctx.throwUnexpectedTokenError(token);
    }
    adjustEndLoc(ast, mapEnd || ast.pairs[ast.pairs.length - 1] || lastToken);
    if (!(0, yaml_1.isMap)(node)) {
        return ast;
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
}
/* eslint-disable complexity -- X */
/**
 * Convert FlowSeq to YAMLFlowSequence
 */
function convertFlowSequence(
/* eslint-enable complexity -- X */
preTokens, startToken, cst, node, ctx, parent, doc) {
    var _a;
    const loc = ctx.getConvertLocation(startToken.range[0], cst.offset);
    const ast = Object.assign({ type: "YAMLSequence", style: "flow", entries: [], parent }, loc);
    let lastToken;
    const items = [...node.items];
    for (const item of cst.items) {
        const startTokens = new PreTokens(item.start, ctx);
        let token;
        while ((token = startTokens.consume())) {
            if (token.type === "comma") {
                lastToken = ctx.addToken("Punctuator", toRange(token));
                continue;
            }
            startTokens.back();
            break;
        }
        if (items.length === 0) {
            const t = startTokens.first() || item.key || ((_a = item.sep) === null || _a === void 0 ? void 0 : _a[0]) || item.value;
            if (!t) {
                // trailing spaces or comma
                break;
            }
            /* istanbul ignore next */
            throw ctx.throwUnexpectedTokenError(t);
        }
        const entry = items.shift();
        if (isPair(entry) || ((item.key || item.sep) && (0, yaml_1.isMap)(entry))) {
            ast.entries.push(convertMap(startTokens, item, entry));
        }
        else {
            ast.entries.push(convertFlowSequenceItem(startTokens, item.value || null, entry || null, ctx, ast, doc, (ast.entries[ast.entries.length - 1] || lastToken || startToken)
                .range[1]));
        }
    }
    let seqEnd;
    for (const token of cst.end) {
        if (processCommentOrSpace(token, ctx)) {
            continue;
        }
        if (token.type === "flow-seq-end") {
            seqEnd = ctx.addToken("Punctuator", toRange(token));
            continue;
        }
        /* istanbul ignore next */
        throw ctx.throwUnexpectedTokenError(token);
    }
    adjustEndLoc(ast, seqEnd || ast.entries[ast.entries.length - 1] || lastToken);
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
    /** Convert CollectionItem to YAMLBlockMapping */
    function convertMap(pairPreTokens, pairCst, entry) {
        var _a, _b, _c;
        const startTokens = pairPreTokens;
        let keyInd = null;
        let token;
        while ((token = startTokens.consume())) {
            if (token.type === "comma") {
                ctx.addToken("Punctuator", toRange(token));
                continue;
            }
            if (token.type === "explicit-key-ind") {
                /* istanbul ignore if */
                if (keyInd) {
                    throw ctx.throwUnexpectedTokenError(token);
                }
                keyInd = ctx.addToken("Punctuator", toRange(token));
                continue;
            }
            startTokens.back();
            break;
        }
        const pairStartToken = (_a = pairCst.key) !== null && _a !== void 0 ? _a : pairCst.sep[0];
        const mapAst = Object.assign({ type: "YAMLMapping", style: "block", pairs: [], parent: ast }, ctx.getConvertLocation((_b = keyInd === null || keyInd === void 0 ? void 0 : keyInd.range[0]) !== null && _b !== void 0 ? _b : pairStartToken.offset, (_c = keyInd === null || keyInd === void 0 ? void 0 : keyInd.range[1]) !== null && _c !== void 0 ? _c : pairStartToken.offset));
        const pair = convertMappingItem(keyInd, startTokens, pairCst, getPairs(entry)[0], ctx, mapAst, doc);
        mapAst.pairs.push(pair);
        adjustStartLoc(mapAst, keyInd || pair);
        adjustEndLoc(mapAst, pair || keyInd);
        return mapAst;
    }
}
/**
 * Convert Pair to YAMLPair
 */
function convertMappingItem(keyInd, preTokens, cst, node, ctx, parent, doc) {
    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
    const start = (_k = (_h = (_e = (_c = (_a = keyInd === null || keyInd === void 0 ? void 0 : keyInd.range[0]) !== null && _a !== void 0 ? _a : (_b = preTokens.first()) === null || _b === void 0 ? void 0 : _b.offset) !== null && _c !== void 0 ? _c : (_d = cst.key) === null || _d === void 0 ? void 0 : _d.offset) !== null && _e !== void 0 ? _e : (_g = (_f = cst.sep) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.offset) !== null && _h !== void 0 ? _h : (_j = cst.value) === null || _j === void 0 ? void 0 : _j.offset) !== null && _k !== void 0 ? _k : -1;
    const loc = ctx.getConvertLocation(start, start);
    const ast = Object.assign({ type: "YAMLPair", key: null, value: null, parent }, loc);
    ast.key = convertMappingKey(preTokens, cst.key || null, node.key, ctx, ast, doc, start);
    const valueStartTokens = new PreTokens(cst.sep || [], ctx);
    let valueInd;
    let token;
    while ((token = valueStartTokens.consume())) {
        if (token.type === "map-value-ind") {
            /* istanbul ignore if */
            if (valueInd) {
                throw ctx.throwUnexpectedTokenError(token);
            }
            valueInd = ctx.addToken("Punctuator", toRange(token));
            continue;
        }
        valueStartTokens.back();
        break;
    }
    ast.value = convertMappingValue(valueStartTokens, cst.value || null, node.value, ctx, ast, doc, start);
    adjustEndLoc(ast, ast.value || valueInd || ast.key || keyInd);
    return ast;
}
/**
 * Convert MapKey to YAMLContent
 */
function convertMappingKey(preTokens, cst, node, ctx, parent, doc, indexForError) {
    var _a;
    if (cst) {
        return convertContentNode(preTokens, cst, node, ctx, parent, doc);
    }
    /* istanbul ignore if */
    if (!isScalarOrNull(node)) {
        throw ctx.throwError(`unknown error: AST is not Scalar and null (${getNodeType(node)}). Unable to process empty map key CST.`, (_a = preTokens.first()) !== null && _a !== void 0 ? _a : indexForError);
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, null, doc, null);
}
/**
 * Convert MapValue to YAMLContent
 */
function convertMappingValue(preTokens, cst, node, ctx, parent, doc, indexForError) {
    var _a;
    if (cst) {
        return convertContentNode(preTokens, cst, node, ctx, parent, doc);
    }
    /* istanbul ignore if */
    if (!isScalarOrNull(node)) {
        throw ctx.throwError(`unknown error: AST is not Scalar and null (${getNodeType(node)}). Unable to process empty map value CST.`, (_a = preTokens.first()) !== null && _a !== void 0 ? _a : indexForError);
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, null, doc, null);
}
/**
 * Convert BlockSeq to YAMLBlockSequence
 */
function convertSequence(preTokens, cst, node, ctx, parent, doc) {
    var _a;
    const loc = ctx.getConvertLocation(cst.offset, cst.offset);
    const ast = Object.assign({ type: "YAMLSequence", style: "block", entries: [], parent }, loc);
    const items = [...node.items];
    let lastSeqInd;
    for (const item of cst.items) {
        const startTokens = new PreTokens(item.start, ctx);
        let seqInd;
        let token;
        while ((token = startTokens.consume())) {
            if (token.type === "seq-item-ind") {
                /* istanbul ignore if */
                if (seqInd) {
                    throw ctx.throwUnexpectedTokenError(token);
                }
                lastSeqInd = seqInd = ctx.addToken("Punctuator", toRange(token));
                continue;
            }
            startTokens.back();
            break;
        }
        if (items.length === 0) {
            const t = startTokens.first() || item.key || ((_a = item.sep) === null || _a === void 0 ? void 0 : _a[0]) || item.value;
            if (!t) {
                // trailing spaces or comma
                break;
            }
            /* istanbul ignore next */
            throw ctx.throwUnexpectedTokenError(t);
        }
        ast.entries.push(convertSequenceItem(startTokens, item, items.shift() || null, ctx, ast, doc, (ast.entries[ast.entries.length - 1] || ast).range[1]));
    }
    adjustEndLoc(ast, ast.entries[ast.entries.length - 1] || lastSeqInd);
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
}
/**
 * Convert SeqItem to YAMLContent
 */
function convertSequenceItem(preTokens, cst, node, ctx, parent, doc, indexForError) {
    var _a;
    /* istanbul ignore if */
    if (cst.key) {
        throw ctx.throwUnexpectedTokenError(cst.key);
    }
    /* istanbul ignore if */
    if (cst.sep) {
        throw ctx.throwUnexpectedTokenError(cst.sep);
    }
    if (cst.value) {
        if (isPair(node)) {
            if (cst.value.type === "block-map") {
                return convertMapping(preTokens, cst.value, node, ctx, parent, doc);
            }
            if (cst.value.type === "flow-collection") {
                return convertFlowCollection(preTokens, cst.value, node, ctx, parent, doc);
            }
            throw ctx.throwError(`unknown error: CST is not block-map and flow-collection (${cst.value.type}). Unable to process Pair AST.`, cst.value);
        }
        return convertContentNode(preTokens, cst.value, node, ctx, parent, doc);
    }
    /* istanbul ignore if */
    if (!isScalarOrNull(node)) {
        throw ctx.throwError(`unknown error: AST is not Scalar and null (${getNodeType(node)}). Unable to process empty seq item CST.`, (_a = preTokens.first()) !== null && _a !== void 0 ? _a : indexForError);
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, null, doc, null);
}
/**
 * Convert FlowSeqItem to YAMLContent
 */
function convertFlowSequenceItem(preTokens, cst, node, ctx, parent, doc, indexForError) {
    var _a;
    if (cst) {
        return convertContentNode(preTokens, cst, node, ctx, parent, doc);
    }
    /* istanbul ignore if */
    if (!isScalarOrNull(node)) {
        throw ctx.throwError(`unknown error: AST is not Scalar and null (${getNodeType(node)}). Unable to process empty seq item CST.`, (_a = preTokens.first()) !== null && _a !== void 0 ? _a : indexForError);
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, null, doc, null);
}
/**
 * Convert PlainValue to YAMLPlainScalar
 */
function convertPlain(preTokens, cst, node, ctx, parent, doc) {
    var _a;
    const loc = ctx.getConvertLocation(...toRange(cst));
    let ast;
    if (loc.range[0] < loc.range[1]) {
        const strValue = node.source || cst.source;
        const value = parseValueFromText(strValue, doc.version || "1.2");
        ast = Object.assign({ type: "YAMLScalar", style: "plain", strValue,
            value, raw: ctx.code.slice(...loc.range), parent }, loc);
        const type = typeof value;
        if (type === "boolean") {
            ctx.addToken("Boolean", loc.range);
        }
        else if (type === "number" && isFinite(Number(value))) {
            ctx.addToken("Numeric", loc.range);
        }
        else if (value === null) {
            ctx.addToken("Null", loc.range);
        }
        else {
            ctx.addToken("Identifier", loc.range);
        }
        ast = convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, loc);
    }
    else {
        ast = convertAnchorAndTag(preTokens, node, ctx, parent, null, doc, loc);
    }
    (_a = cst.end) === null || _a === void 0 ? void 0 : _a.forEach((t) => processAnyToken(t, ctx));
    return ast;
    /**
     * Parse value from text
     */
    function parseValueFromText(str, version) {
        for (const tagResolver of tags_1.tagResolvers[version]) {
            if (tagResolver.testString(str)) {
                return tagResolver.resolveString(str);
            }
        }
        return str;
    }
}
/**
 * Convert QuoteDouble to YAMLDoubleQuotedScalar
 */
function convertQuoteDouble(preTokens, cst, node, ctx, parent, doc) {
    var _a;
    const loc = ctx.getConvertLocation(...toRange(cst));
    const strValue = node.source;
    const ast = Object.assign({ type: "YAMLScalar", style: "double-quoted", strValue, value: strValue, raw: ctx.code.slice(...loc.range), parent }, loc);
    ctx.addToken("String", loc.range);
    (_a = cst.end) === null || _a === void 0 ? void 0 : _a.forEach((t) => processAnyToken(t, ctx));
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
}
/**
 * Convert QuoteSingle to YAMLSingleQuotedScalar
 */
function convertQuoteSingle(preTokens, cst, node, ctx, parent, doc) {
    var _a;
    const loc = ctx.getConvertLocation(...toRange(cst));
    const strValue = node.source;
    const ast = Object.assign({ type: "YAMLScalar", style: "single-quoted", strValue, value: strValue, raw: ctx.code.slice(...loc.range), parent }, loc);
    ctx.addToken("String", loc.range);
    (_a = cst.end) === null || _a === void 0 ? void 0 : _a.forEach((t) => processAnyToken(t, ctx));
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
}
/**
 * Convert BlockLiteral to YAMLBlockLiteral
 */
function convertBlockScalar(preTokens, cst, node, ctx, parent, doc) {
    let headerToken, ast;
    let blockStart = cst.offset;
    for (const token of cst.props) {
        if (processCommentOrSpace(token, ctx)) {
            blockStart = token.offset + token.source.length;
            continue;
        }
        if (token.type === "block-scalar-header") {
            headerToken = ctx.addToken("Punctuator", toRange(token));
            blockStart = headerToken.range[0];
            continue;
        }
        /* istanbul ignore next */
        throw ctx.throwUnexpectedTokenError(token);
    }
    const headerValue = headerToken.value;
    const end = node.source
        ? getBlockEnd(blockStart + cst.source.length, ctx)
        : ctx.lastSkipSpaces(cst.offset, blockStart + cst.source.length);
    const loc = ctx.getConvertLocation(headerToken.range[0], end);
    if (headerValue.startsWith(">")) {
        ast = Object.assign(Object.assign(Object.assign({ type: "YAMLScalar", style: "folded" }, parseHeader(headerValue)), { value: node.source, parent }), loc);
        const text = ctx.code.slice(blockStart, end);
        const offset = /^[^\S\n\r]*/.exec(text)[0].length;
        const tokenRange = [blockStart + offset, end];
        if (tokenRange[0] < tokenRange[1]) {
            ctx.addToken("BlockFolded", tokenRange);
        }
    }
    else {
        ast = Object.assign(Object.assign(Object.assign({ type: "YAMLScalar", style: "literal" }, parseHeader(headerValue)), { value: node.source, parent }), loc);
        const text = ctx.code.slice(blockStart, end);
        const offset = /^[^\S\n\r]*/.exec(text)[0].length;
        const tokenRange = [blockStart + offset, end];
        if (tokenRange[0] < tokenRange[1]) {
            ctx.addToken("BlockLiteral", tokenRange);
        }
    }
    return convertAnchorAndTag(preTokens, node, ctx, parent, ast, doc, ast);
    /** Get chomping kind */
    function parseHeader(header) {
        const parsed = /([+-]?)(\d*)([+-]?)$/u.exec(header);
        let indent = null;
        let chomping = "clip";
        if (parsed) {
            indent = parsed[2] ? Number(parsed[2]) : null;
            const chompingStr = parsed[3] || parsed[1];
            chomping =
                chompingStr === "+" ? "keep" : chompingStr === "-" ? "strip" : "clip";
        }
        return {
            chomping,
            indent,
        };
    }
}
/**
 * Get the end index from give block end
 */
function getBlockEnd(end, ctx) {
    let index = end;
    if (ctx.code[index - 1] === "\n" && index > 1) {
        index--;
        if (ctx.code[index - 1] === "\r" && index > 1) {
            index--;
        }
    }
    return index;
}
/**
 * Convert Alias to YAMLAlias
 */
function convertAlias(preTokens, cst, _node, ctx, parent, _doc) {
    var _a;
    const [start, end] = toRange(cst);
    const loc = ctx.getConvertLocation(start, ctx.lastSkipSpaces(start, end));
    const ast = Object.assign({ type: "YAMLAlias", name: cst.source.slice(1), parent }, loc);
    ctx.addToken("Punctuator", [loc.range[0], loc.range[0] + 1]);
    const tokenRange = [loc.range[0] + 1, loc.range[1]];
    if (tokenRange[0] < tokenRange[1]) {
        ctx.addToken("Identifier", tokenRange);
    }
    const token = preTokens.first();
    /* istanbul ignore if */
    if (token) {
        throw ctx.throwUnexpectedTokenError(token);
    }
    (_a = cst.end) === null || _a === void 0 ? void 0 : _a.forEach((t) => processAnyToken(t, ctx));
    return ast;
}
/**
 * Convert Anchor and Tag
 */
function convertAnchorAndTag(preTokens, node, ctx, parent, value, doc, valueLoc) {
    let meta = null;
    /**
     * Get YAMLWithMeta
     */
    function getMetaAst(cst) {
        if (meta) {
            return meta;
        }
        meta = Object.assign({ type: "YAMLWithMeta", anchor: null, tag: null, value,
            parent }, (valueLoc
            ? {
                range: [...valueLoc.range],
                loc: cloneLoc(valueLoc.loc),
            }
            : ctx.getConvertLocation(...toRange(cst))));
        if (value) {
            value.parent = meta;
        }
        return meta;
    }
    preTokens.each((cst) => {
        var _a;
        if (isAnchorCST(cst)) {
            const ast = getMetaAst(cst);
            const anchor = convertAnchor(cst, ctx, ast, doc);
            ast.anchor = anchor;
            adjustStartLoc(ast, anchor);
            adjustEndLoc(ast, anchor);
        }
        else if (isTagCST(cst)) {
            const ast = getMetaAst(cst);
            const tag = convertTag(cst, (_a = node === null || node === void 0 ? void 0 : node.tag) !== null && _a !== void 0 ? _a : null, ctx, ast);
            ast.tag = tag;
            adjustStartLoc(ast, tag);
            adjustEndLoc(ast, tag);
        }
        else {
            /* istanbul ignore next */
            throw ctx.throwUnexpectedTokenError(cst);
        }
    });
    return meta || value;
}
/**
 * Convert anchor to YAMLAnchor
 */
function convertAnchor(cst, ctx, parent, doc) {
    const name = cst.source.slice(1);
    const loc = ctx.getConvertLocation(...toRange(cst));
    const ast = Object.assign({ type: "YAMLAnchor", name,
        parent }, loc);
    const anchors = doc.anchors[name] || (doc.anchors[name] = []);
    anchors.push(ast);
    const punctuatorRange = [loc.range[0], loc.range[0] + 1];
    ctx.addToken("Punctuator", punctuatorRange);
    const tokenRange = [punctuatorRange[1], loc.range[1]];
    if (tokenRange[0] < tokenRange[1]) {
        ctx.addToken("Identifier", tokenRange);
    }
    return ast;
}
/**
 * Convert tag to YAMLTag
 */
function convertTag(cst, tag, ctx, parent) {
    const offset = cst.source.startsWith("!!") ? 2 : 1;
    let resolvedTag = tag !== null && tag !== void 0 ? tag : cst.source.slice(offset);
    if (resolvedTag === "!") {
        resolvedTag = "tag:yaml.org,2002:str";
    }
    const loc = ctx.getConvertLocation(...toRange(cst));
    const ast = Object.assign({ type: "YAMLTag", tag: resolvedTag, raw: cst.source, parent }, loc);
    const punctuatorRange = [loc.range[0], loc.range[0] + offset];
    ctx.addToken("Punctuator", punctuatorRange);
    const tokenRange = [punctuatorRange[1], loc.range[1]];
    if (tokenRange[0] < tokenRange[1]) {
        ctx.addToken("Identifier", tokenRange);
    }
    return ast;
}
/** Checks whether the give node is scaler or null */
function isScalarOrNull(node) {
    return (0, yaml_1.isScalar)(node) || node == null;
}
/** Get the pairs from the give node */
function getPairs(node) {
    return (0, yaml_1.isMap)(node) ? [...node.items] : [node];
}
/**
 * Process comments or spaces
 */
function processCommentOrSpace(node, ctx) {
    if (node.type === "space" || node.type === "newline") {
        return true;
    }
    /* istanbul ignore if */
    if (node.type === "flow-error-end" || node.type === "error") {
        throw ctx.throwUnexpectedTokenError(node);
    }
    if (node.type === "comment") {
        const comment = Object.assign({ type: "Block", value: node.source.slice(1) }, ctx.getConvertLocation(...toRange(node)));
        ctx.addComment(comment);
        return true;
    }
    return false;
}
/**
 * Process any token
 */
function processAnyToken(node, ctx) {
    /* istanbul ignore if */
    if (!processCommentOrSpace(node, ctx)) {
        throw ctx.throwUnexpectedTokenError(node);
    }
}
/**
 * Sort tokens
 */
function sort(tokens) {
    return tokens.sort((a, b) => {
        if (a.range[0] > b.range[0]) {
            return 1;
        }
        if (a.range[0] < b.range[0]) {
            return -1;
        }
        if (a.range[1] > b.range[1]) {
            return 1;
        }
        if (a.range[1] < b.range[1]) {
            return -1;
        }
        return 0;
    });
}
/**
 * clone the location.
 */
function clonePos(loc) {
    return {
        line: loc.line,
        column: loc.column,
    };
}
/**
 * clone the location.
 */
function cloneLoc(loc) {
    return {
        start: clonePos(loc.start),
        end: clonePos(loc.end),
    };
}
/**
 * Gets the first index with whitespace skipped.
 */
function skipSpaces(str, startIndex) {
    const len = str.length;
    for (let index = startIndex; index < len; index++) {
        if (str[index].trim()) {
            return index;
        }
    }
    return len;
}
/** SourceToken to location range */
function toRange(token) {
    return [token.offset, token.offset + token.source.length];
}
/** Adjust start location */
function adjustStartLoc(ast, first) {
    if (first && first.range[0] < ast.range[0]) {
        // adjust location
        ast.range[0] = first.range[0];
        ast.loc.start = clonePos(first.loc.start);
    }
}
/** Adjust end location */
function adjustEndLoc(ast, last) {
    if (last && ast.range[1] < last.range[1]) {
        // adjust location
        ast.range[1] = last.range[1];
        ast.loc.end = clonePos(last.loc.end);
    }
}