{"version":3,"sources":["jsdelivr-header.js","/npm/@doc-tools/docs@3.25.0/scripts/client.js","/npm/@doc-tools/docs@3.25.0/src/index.ts","/npm/@doc-tools/docs@3.25.0/src/constants.ts","/npm/@doc-tools/docs@3.25.0/src/validator.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/build/index.ts","/npm/@doc-tools/docs@3.25.0/src/services/tocs.ts","/npm/@doc-tools/docs@3.25.0/src/services/metadata.ts","/npm/@doc-tools/docs@3.25.0/src/utils/logger.ts","/npm/@doc-tools/docs@3.25.0/src/utils/markup.ts","/npm/@doc-tools/docs@3.25.0/src/utils/singlePage.ts","/npm/@doc-tools/docs@3.25.0/src/utils/url.ts","/npm/@doc-tools/docs@3.25.0/src/utils/path.ts","/npm/@doc-tools/docs@3.25.0/src/utils/toc.ts","/npm/@doc-tools/docs@3.25.0/src/services/utils.ts","/npm/@doc-tools/docs@3.25.0/src/utils/presets.ts","/npm/@doc-tools/docs@3.25.0/src/utils/glob.ts","/npm/@doc-tools/docs@3.25.0/src/utils/file.ts","/npm/@doc-tools/docs@3.25.0/src/services/authors.ts","/npm/@doc-tools/docs@3.25.0/src/services/contributors.ts","/npm/@doc-tools/docs@3.25.0/src/services/includers/index.ts","/npm/@doc-tools/docs@3.25.0/src/services/includers/batteries/generic.ts","/npm/@doc-tools/docs@3.25.0/src/services/includers/batteries/sourcedocs.ts","/npm/@doc-tools/docs@3.25.0/src/services/includers/batteries/unarchive.ts","/npm/@doc-tools/docs@3.25.0/src/services/preset.ts","/npm/@doc-tools/docs@3.25.0/src/services/argv.ts","/npm/@doc-tools/docs@3.25.0/src/services/leading.ts","/npm/@doc-tools/docs@3.25.0/src/services/plugins.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processAssets.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processExcludedFiles.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processLogs.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processPages.ts","/npm/@doc-tools/docs@3.25.0/src/resolvers/md2md.ts","/npm/@doc-tools/docs@3.25.0/src/resolvers/md2html.ts","/npm/@doc-tools/docs@3.25.0/src/resolvers/lintPage.ts","/npm/@doc-tools/docs@3.25.0/src/vcs-connector/github.ts","/npm/@doc-tools/docs@3.25.0/src/vcs-connector/client/github.ts","/npm/@doc-tools/docs@3.25.0/src/vcs-connector/connector-validator.ts","/npm/@doc-tools/docs@3.25.0/src/vcs-connector/index.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processLinter.ts","/npm/@doc-tools/docs@3.25.0/src/utils/worker.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processServiceFiles.ts","/npm/@doc-tools/docs@3.25.0/src/steps/processMapFile.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/publish/upload.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/publish/index.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/xliff/extract.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/xliff/compose.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/xliff/index.ts","/npm/@doc-tools/docs@3.25.0/src/cmd/translate/index.ts","/npm/@doc-tools/docs@3.25.0/src/packages/credentials/yandex-oauth.ts"],"names":[],"mappings":"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","file":"/npm/@doc-tools/docs@3.25.0/build/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@doc-tools/docs@3.25.0/build/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const path = require('path');\n\nconst CLIENT_PATH = path.dirname(require.resolve('@diplodoc/client'));\nconst BUILD_PATH = path.resolve(__dirname, '..', 'build');\nconst BUNDLE_JS_FILENAME = 'app.client.js';\nconst BUNDLE_CSS_FILENAME = 'app.client.css';\n\nconst src = (target) => path.resolve(CLIENT_PATH, target);\nconst dst = (target) => path.resolve(BUILD_PATH, target);\n\n\nmodule.exports = {\n    dst: {\n        js: dst(BUNDLE_JS_FILENAME),\n        css: dst(BUNDLE_CSS_FILENAME),\n    },\n    src: {\n        js: src(BUNDLE_JS_FILENAME),\n        css: src(BUNDLE_CSS_FILENAME),\n    },\n    bundle: {\n        js(bundlePath) {\n            return path.join(bundlePath, BUNDLE_JS_FILENAME);\n        },\n        css(bundlePath) {\n            return path.join(bundlePath, BUNDLE_CSS_FILENAME);\n        },\n    },\n};\n","import yargs from 'yargs';\nimport {hideBin} from 'yargs/helpers';\nimport log from '@doc-tools/transform/lib/log';\nimport 'threads/register';\n\nimport {MAIN_TIMER_ID} from './constants';\n\nimport {build, xliff, translate, publish} from './cmd';\n\nconsole.time(MAIN_TIMER_ID);\n\nyargs\n    .command(build)\n    .command(publish)\n    .command(xliff)\n    .command(translate)\n    .option('config', {\n        alias: 'c',\n        describe: 'YFM configuration file',\n        type: 'string',\n    })\n    .option('strict', {\n        alias: 's',\n        default: false,\n        describe: 'Run in strict mode',\n        type: 'boolean',\n    })\n    .option('quiet', {\n        alias: 'q',\n        default: false,\n        describe: 'Run in quiet mode. Don\\'t write logs to stdout',\n        type: 'boolean',\n    })\n    .group(['config', 'strict', 'quiet', 'help', 'version'], 'Common options:')\n    .version(typeof VERSION !== 'undefined' ? VERSION : '')\n    .help()\n    .parse(hideBin(process.argv), {}, (err, {strict}, output) => {\n        console.timeEnd(MAIN_TIMER_ID);\n\n        if (err) {\n            console.error(err);\n            process.exit(1);\n        }\n\n        const {warn, error} = log.get();\n\n        if (strict && warn.length || error.length) {\n            process.exit(1);\n        }\n\n        console.log(output);\n\n        process.exit(0);\n    });\n","import {dirname} from 'path';\nconst os = require('os');\nconst notes = require('@doc-tools/transform/lib/plugins/notes');\nconst anchors = require('@doc-tools/transform/lib/plugins/anchors');\nconst code = require('@doc-tools/transform/lib/plugins/code');\nconst cut = require('@doc-tools/transform/lib/plugins/cut');\nconst deflist = require('@doc-tools/transform/lib/plugins/deflist');\nconst imsize = require('@doc-tools/transform/lib/plugins/imsize');\nconst meta = require('@doc-tools/transform/lib/plugins/meta');\nconst sup = require('@doc-tools/transform/lib/plugins/sup');\nconst tabs = require('@doc-tools/transform/lib/plugins/tabs');\nconst video = require('@doc-tools/transform/lib/plugins/video');\nconst includes = require('@doc-tools/transform/lib/plugins/includes');\nconst links = require('@doc-tools/transform/lib/plugins/links');\nconst images = require('@doc-tools/transform/lib/plugins/images');\nconst monospace = require('@doc-tools/transform/lib/plugins/monospace');\nconst table = require('@doc-tools/transform/lib/plugins/table');\nconst term = require('@doc-tools/transform/lib/plugins/term');\nconst changelog = require('@doc-tools/transform/lib/plugins/changelog');\nconst mermaid = require('@diplodoc/mermaid-extension');\nconst openapi = require('@diplodoc/openapi-extension');\n\nincludes.collect = require('@doc-tools/transform/lib/plugins/includes/collect');\nimages.collect = require('@doc-tools/transform/lib/plugins/images/collect');\nchangelog.collect = require('@doc-tools/transform/lib/plugins/changelog/collect');\n\nexport const BUILD_FOLDER = 'build';\nexport const BUNDLE_FOLDER = '_bundle';\nexport const BUNDLE_JS_FILENAME = 'app.client.js';\nexport const BUNDLE_CSS_FILENAME = 'app.client.css';\nexport const TMP_INPUT_FOLDER = '.tmp_input';\nexport const TMP_OUTPUT_FOLDER = '.tmp_output';\nexport const MAIN_TIMER_ID = 'Build time';\nexport const YFM_CONFIG_FILENAME = '.yfm';\nexport const REDIRECTS_FILENAME = 'redirects.yaml';\nexport const LINT_CONFIG_FILENAME = '.yfmlint';\nexport const SINGLE_PAGE_FILENAME = 'single-page.html';\nexport const SINGLE_PAGE_DATA_FILENAME = 'single-page.json';\nexport const CUSTOM_STYLE = 'custom-style';\n\nexport enum Stage {\n    NEW = 'new',\n    PREVIEW = 'preview',\n    TECH_PREVIEW = 'tech-preview',\n    SKIP = 'skip',\n}\n\nexport enum Lang {\n    RU = 'ru',\n    EN = 'en',\n}\n\nexport enum Platforms {\n    WINDOWS = 'win32',\n    MAC = 'darwin',\n    LINUX = 'linux',\n}\n\nexport enum IncludeMode {\n    ROOT_MERGE = 'root_merge',\n    MERGE = 'merge',\n    LINK = 'link'\n}\n\nexport enum ResourceType {\n    style = 'style',\n    script = 'script',\n}\n\nexport const BUILD_FOLDER_PATH = dirname(require.resolve('@diplodoc/client'));\n\nexport const YFM_PLUGINS = [\n    meta,\n    deflist,\n    includes,\n    cut,\n    links,\n    images,\n    notes,\n    anchors,\n    tabs,\n    code,\n    imsize,\n    sup,\n    video,\n    monospace,\n    table,\n    term,\n    openapi.transform(),\n    mermaid.transform(),\n    changelog,\n];\n\nexport const PROCESSING_FINISHED = 'Processing finished:';\nexport const LINTING_FINISHED = 'Linting finished:';\nexport const GETTING_ALL_CONTRIBUTORS = 'Getting all contributors.';\nexport const ALL_CONTRIBUTORS_RECEIVED = 'All contributors received.';\nexport const getMsgСonfigurationMustBeProvided =\n    (repo: string) => `Сonfiguration must be provided for ${repo} like env variables or in .yfm file`;\n\nexport const FIRST_COMMIT_FROM_ROBOT_IN_GITHUB = '2dce14271359cd20d7e874956d604de087560cf4';\n\n// Include example: 'master\\n' or 'nanov94/QUEUE-1234_some_branch_name.1.2.3\\n'\n// Regexp result: 'master' or 'nanov94/QUEUE-1234_some_branch_name'\nexport const REGEXP_BRANCH_NAME = /([\\d\\w\\-_/.]+)(?=\\r?\\n)/g;\n\n// Include example: {% include [createfolder](create-folder.md) %}\n// Regexp result: [createfolder](create-folder.md)\nexport const REGEXP_INCLUDE_CONTENTS = /(?<=[{%]\\sinclude\\s).+(?=\\s[%}])/gm;\n\n// Include example: [createfolder](create-folder.md)\n// Regexp result: create-folder.md\nexport const REGEXP_INCLUDE_FILE_PATH = /(?<=[(]).+(?=[)])/g;\n\n// Include example: author: authorLogin\n// Regexp result: authorLogin\nexport const REGEXP_AUTHOR = /(?<=author:\\s).+(?=\\r?\\n)/g;\n\nexport const MIN_CHUNK_SIZE = Number(process.env.MIN_CHUNK_SIZE) || 1000;\nexport const WORKERS_COUNT = Number(process.env.WORKERS_COUNT) || (os.cpus().length - 1);\n\nexport const metadataBorder = '---';\n","import {Arguments} from 'yargs';\nimport {join, resolve} from 'path';\nimport {readFileSync} from 'fs';\nimport {load} from 'js-yaml';\nimport merge from 'lodash/merge';\nimport log from '@doc-tools/transform/lib/log';\nimport {REDIRECTS_FILENAME, LINT_CONFIG_FILENAME, YFM_CONFIG_FILENAME} from './constants';\nimport {ConnectorValidatorProps} from './vcs-connector/connector-models';\n\nfunction notEmptyStringValidator(value: unknown): Boolean {\n    if (typeof value === 'string') {\n        return Boolean(value);\n    }\n\n    return false;\n}\n\nfunction requiredValueValidator(value: unknown): Boolean {\n    return Boolean(value);\n}\n\nconst validators: Record<string, ConnectorValidatorProps> = {\n    'storageEndpoint': {\n        errorMessage: 'Endpoint of S3 storage must be provided when publishes.',\n        validateFn: notEmptyStringValidator,\n    },\n    'storageBucket': {\n        errorMessage: 'Bucket name of S3 storage must be provided when publishes.',\n        validateFn: notEmptyStringValidator,\n    },\n    'storageKeyId': {\n        errorMessage: 'Key Id of S3 storage must be provided when publishes.',\n        validateFn: notEmptyStringValidator,\n        defaultValue: process.env.YFM_STORAGE_KEY_ID,\n    },\n    'storageSecretKey': {\n        errorMessage: 'Secret key of S3 storage must be provided when publishes.',\n        validateFn: notEmptyStringValidator,\n        defaultValue: process.env.YFM_STORAGE_SECRET_KEY,\n    },\n    'storageRegion': {\n        errorMessage: 'Region of S3 storage must be provided when publishes.',\n        validateFn: notEmptyStringValidator,\n        defaultValue: 'eu-central-1',\n    },\n};\n\ninterface Redirect {\n    from: string;\n    to: string;\n}\n\ninterface RedirectsConfig {\n    common: Redirect[];\n    [lang: string]: Redirect[];\n}\n\nfunction validateRedirects(redirectsConfig: RedirectsConfig, pathToRedirects: string) {\n    const redirects: Redirect[] = Object.keys(redirectsConfig).reduce((res, redirectSectionName) => {\n        const sectionRedirects = redirectsConfig[redirectSectionName];\n        res.push(...sectionRedirects);\n        return res;\n    }, [] as Redirect[]);\n\n    const getContext = (from: string, to: string) => ` [Context: \\n- from: ${from}\\n- to: ${to} ]`;\n    const formatMessage = (message: string, pathname: string, from: string, to: string) => (\n        `${pathname}: ${message} ${getContext(from, to)}`\n    );\n\n    redirects.forEach((redirect) => {\n        const {from, to} = redirect;\n\n        if (!from || !to) {\n            throw new Error(formatMessage('One of the two parameters is missing', pathToRedirects, from, to));\n        }\n\n        if (from === to) {\n            throw new Error(formatMessage('Parameters must be different', pathToRedirects, from, to));\n        }\n    });\n}\n\nexport function argvValidator(argv: Arguments<Object>): Boolean {\n    try {\n        // Combine passed argv and properties from configuration file.\n        const pathToConfig = argv.config ? String(argv.config) : join(String(argv.input), YFM_CONFIG_FILENAME);\n        const content = readFileSync(resolve(pathToConfig), 'utf8');\n        Object.assign(argv, load(content) || {});\n    } catch (error) {\n        if (error.name === 'YAMLException') {\n            log.error(`Error to parse ${YFM_CONFIG_FILENAME}: ${error.message}`);\n        }\n    }\n\n    let lintConfig: unknown = {};\n    try {\n        const pathToConfig = join(String(argv.input), LINT_CONFIG_FILENAME);\n        const content = readFileSync(resolve(pathToConfig), 'utf8');\n\n        lintConfig = load(content) || {};\n    } catch (error) {\n        if (error.name === 'YAMLException') {\n            log.error(`Error to parse ${LINT_CONFIG_FILENAME}: ${error.message}`);\n        }\n    } finally {\n        const preparedLintConfig = merge(lintConfig, {\n            'log-levels': {\n                MD033: argv.allowHTML ? 'disabled' : 'error',\n            },\n        });\n\n        Object.assign(argv, {lintConfig: preparedLintConfig});\n    }\n\n    try {\n        const pathToRedirects = join(String(argv.input), REDIRECTS_FILENAME);\n        const redirectsContent = readFileSync(resolve(pathToRedirects), 'utf8');\n        const redirects = load(redirectsContent);\n\n        validateRedirects(redirects as RedirectsConfig, pathToRedirects);\n    } catch (error) {\n        if (error.name === 'YAMLException') {\n            log.error(`Error to parse ${REDIRECTS_FILENAME}: ${error.message}`);\n        }\n\n        if (error.code !== 'ENOENT') {\n            throw error;\n        }\n    }\n\n    if (argv.publish) {\n        for (const [field, validator] of Object.entries(validators)) {\n            const value = argv[field] ?? validator.defaultValue;\n\n            if (!validator) {\n                continue;\n            }\n\n            const validateFn = validator.validateFn ?? requiredValueValidator;\n\n            if (!validateFn(value)) {\n                throw new Error(validator.errorMessage);\n            }\n\n            argv[field] = value;\n        }\n    }\n\n    return true;\n}\n","import {Arguments, Argv} from 'yargs';\nimport {\n    BUNDLE_FOLDER, LINT_CONFIG_FILENAME,\n    REDIRECTS_FILENAME,\n    Stage,\n    TMP_INPUT_FOLDER,\n    TMP_OUTPUT_FOLDER,\n    YFM_CONFIG_FILENAME,\n} from '../../constants';\nimport {argvValidator} from '../../validator';\nimport {join, resolve} from 'path';\nimport {ArgvService, Includers} from '../../services';\nimport OpenapiIncluder from '@diplodoc/openapi-extension/includer';\nimport {\n    initLinterWorkers,\n    processAssets,\n    processExcludedFiles,\n    processLinter, processLogs,\n    processPages,\n    processServiceFiles,\n} from '../../steps';\nimport {prepareMapFile} from '../../steps/processMapFile';\nimport shell from 'shelljs';\nimport {Resources} from '../../models';\nimport {copyFiles, logger} from '../../utils';\nimport {upload as publishFilesToS3} from '../publish/upload';\nimport glob from 'glob';\n\nexport const build = {\n    command: ['build', '$0'],\n    description: 'Build documentation in target directory',\n    handler,\n    builder,\n};\n\nfunction builder<T>(argv: Argv<T>) {\n    return argv\n        .option('input', {\n            alias: 'i',\n            describe: 'Path to input folder with .md files',\n            type: 'string',\n            group: 'Build options:',\n        })\n        .option('output', {\n            alias: 'o',\n            describe: 'Path to output folder',\n            type: 'string',\n            group: 'Build options:',\n        })\n        .option('varsPreset', {\n            default: 'default',\n            describe: 'Target vars preset of documentation <external|internal>',\n            group: 'Build options:',\n        })\n        .option('output-format', {\n            default: 'html',\n            describe: 'Format of output file <html|md>',\n            group: 'Build options:',\n        })\n        .option('vars', {\n            alias: 'v',\n            default: '{}',\n            describe: 'List of markdown variables',\n            group: 'Build options:',\n        })\n        .option('apply-presets', {\n            default: true,\n            describe: 'Should apply presets. Only for --output-format=md',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('resolve-conditions', {\n            default: true,\n            describe: 'Should resolve conditions. Only for --output-format=md',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('conditions-in-code', {\n            default: false,\n            describe: 'Meet conditions in code blocks',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('disable-liquid', {\n            default: false,\n            describe: 'Disable template engine',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('allowHTML', {\n            default: false,\n            describe: 'Allow to use HTML in Markdown files',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('ignore-stage', {\n            default: Stage.SKIP,\n            describe: 'Ignore tocs with stage',\n            group: 'Build options:',\n        })\n        .option('ignore-author-patterns', {\n            default: [] as string[],\n            describe: 'Ignore authors if they contain passed string',\n            group: 'Build options:',\n            type: 'array',\n        })\n        .option('contributors', {\n            default: false,\n            describe: 'Should attach contributors into files',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('add-system-meta', {\n            default: false,\n            describe: 'Should add system section variables form presets into files meta data',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('add-map-file', {\n            default: false,\n            describe: 'Should add all paths of documentation into file.json',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('single-page', {\n            default: false,\n            describe: 'Beta functionality: Build a single page in the output folder also',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('publish', {\n            default: false,\n            describe: 'Should upload output files to S3 storage',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('remove-hidden-toc-items', {\n            default: false,\n            describe: 'Remove hidden toc items',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('lint-disabled', {\n            default: false,\n            describe: 'Disable linting',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('build-disabled', {\n            default: false,\n            describe: 'Disable building',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('allow-custom-resources', {\n            default: false,\n            describe: 'Allow loading custom resources',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .option('static-content', {\n            default: false,\n            describe: 'Include static content in the page',\n            type: 'boolean',\n            group: 'Build options:',\n        })\n        .check(argvValidator)\n        .example('yfm -i ./input -o ./output', '')\n        .demandOption(['input', 'output'], 'Please provide input and output arguments to work with this tool');\n}\n\nasync function handler(args: Arguments<any>) {\n    const userOutputFolder = resolve(args.output);\n    const tmpInputFolder = resolve(args.output, TMP_INPUT_FOLDER);\n    const tmpOutputFolder = resolve(args.output, TMP_OUTPUT_FOLDER);\n\n    try {\n        ArgvService.init({\n            ...args,\n            rootInput: args.input,\n            input: tmpInputFolder,\n            output: tmpOutputFolder,\n        });\n        Includers.init([OpenapiIncluder as any]);\n\n        const {\n            output: outputFolderPath,\n            outputFormat,\n            publish,\n            lintDisabled,\n            buildDisabled,\n            addMapFile,\n            allowCustomResources,\n            resources,\n        } = ArgvService.getConfig();\n\n        preparingTemporaryFolders(userOutputFolder);\n\n        await processServiceFiles();\n        processExcludedFiles();\n\n        if (addMapFile) {\n            prepareMapFile();\n        }\n\n        const outputBundlePath = join(outputFolderPath, BUNDLE_FOLDER);\n        const pathToConfig = args.config || join(args.input, YFM_CONFIG_FILENAME);\n        const pathToRedirects = join(args.input, REDIRECTS_FILENAME);\n        const pathToLintConfig = join(args.input, LINT_CONFIG_FILENAME);\n\n        if (!lintDisabled) {\n            /* Initialize workers in advance to avoid a timeout failure due to not receiving a message from them */\n            await initLinterWorkers();\n        }\n\n        const processes = [\n            !lintDisabled && processLinter(),\n            !buildDisabled && processPages(outputBundlePath),\n        ].filter(Boolean) as Promise<void>[];\n\n        await Promise.all(processes);\n\n        if (!buildDisabled) {\n            // process additional files\n            switch (outputFormat) {\n                case 'html':\n                    processAssets(outputBundlePath);\n                    break;\n                case 'md': {\n                    shell.cp(resolve(pathToConfig), tmpOutputFolder);\n                    shell.cp(resolve(pathToRedirects), tmpOutputFolder);\n                    shell.cp(resolve(pathToLintConfig), tmpOutputFolder);\n\n                    if (resources && allowCustomResources) {\n                        const resourcePaths: string[] = [];\n\n                        // collect paths of all resources\n                        Object.keys(resources).forEach((type) =>\n                            resources[type as keyof Resources]?.forEach((path: string) => resourcePaths.push(path)));\n\n                        //copy resources\n                        copyFiles(args.input, tmpOutputFolder, resourcePaths);\n                    }\n\n                    break;\n                }\n            }\n\n            // Copy all generated files to user' output folder\n            shell.cp('-r', [join(tmpOutputFolder, '*'), join(tmpOutputFolder, '.*')], userOutputFolder);\n\n            if (publish) {\n                const DEFAULT_PREFIX = process.env.YFM_STORAGE_PREFIX ?? '';\n                const {\n                    ignore = [],\n                    storageRegion,\n                    storageEndpoint: endpoint,\n                    storageBucket: bucket,\n                    storagePrefix: prefix = DEFAULT_PREFIX,\n                    storageKeyId: accessKeyId,\n                    storageSecretKey: secretAccessKey,\n                } = ArgvService.getConfig();\n\n                await publishFilesToS3({\n                    input: userOutputFolder,\n                    region: storageRegion,\n                    ignore,\n                    endpoint,\n                    bucket,\n                    prefix,\n                    accessKeyId,\n                    secretAccessKey,\n                });\n            }\n        }\n    } catch (err) {\n        logger.error('', err.message);\n    } finally {\n        processLogs(tmpInputFolder);\n\n        shell.rm('-rf', tmpInputFolder, tmpOutputFolder);\n    }\n}\n\nfunction preparingTemporaryFolders(userOutputFolder: string) {\n    const args = ArgvService.getConfig();\n\n    shell.mkdir('-p', userOutputFolder);\n\n    // Create temporary input/output folders\n    shell.rm('-rf', args.input, args.output);\n    shell.mkdir(args.input, args.output);\n    shell.chmod('-R', 'u+w', args.input);\n\n    copyFiles(args.rootInput, args.input, glob.sync('**', {\n        cwd: args.rootInput,\n        nodir: true,\n        follow: true,\n        ignore: [\n            'node_modules/**',\n            '*/node_modules/**',\n        ],\n    }));\n}\n","import {dirname, extname, join, parse, resolve, relative, normalize, sep} from 'path';\nimport {copyFileSync, readFileSync, writeFileSync, existsSync} from 'fs';\nimport {load, dump} from 'js-yaml';\nimport shell from 'shelljs';\nimport walkSync from 'walk-sync';\nimport liquid from '@doc-tools/transform/lib/liquid';\nimport log from '@doc-tools/transform/lib/log';\nimport {bold} from 'chalk';\n\nimport {ArgvService, PresetService} from './index';\nimport {getContentWithUpdatedStaticMetadata} from './metadata';\nimport {YfmToc} from '../models';\nimport {Stage, IncludeMode} from '../constants';\nimport {isExternalHref, logger} from '../utils';\nimport {filterFiles, firstFilterTextItems, liquidField} from './utils';\nimport {applyIncluders, IncludersError} from './includers';\n\nexport interface TocServiceData {\n    storage: Map<string, YfmToc>;\n    navigationPaths: string[];\n    includedTocPaths: Set<string>;\n}\n\nconst storage: TocServiceData['storage'] = new Map();\nlet navigationPaths: TocServiceData['navigationPaths'] = [];\nconst includedTocPaths: TocServiceData['includedTocPaths'] = new Set();\n\nasync function add(path: string) {\n    const {\n        input: inputFolderPath,\n        output: outputFolderPath,\n        outputFormat,\n        ignoreStage,\n        vars,\n    } = ArgvService.getConfig();\n\n    const pathToDir = dirname(path);\n    const content = readFileSync(resolve(inputFolderPath, path), 'utf8');\n    const parsedToc = load(content) as YfmToc;\n\n    // Should ignore toc with specified stage.\n    if (parsedToc.stage === ignoreStage) {\n        return;\n    }\n\n    const combinedVars = {\n        ...PresetService.get(pathToDir),\n        ...vars,\n    };\n\n    if (parsedToc.title) {\n        parsedToc.title = firstFilterTextItems(\n            parsedToc.title,\n            combinedVars,\n            {resolveConditions: true},\n        );\n    }\n\n    if (typeof parsedToc.title === 'string') {\n        parsedToc.title = liquidField(parsedToc.title, combinedVars, path);\n    }\n\n    parsedToc.items = await processTocItems(\n        path,\n        parsedToc.items,\n        join(inputFolderPath, pathToDir),\n        resolve(inputFolderPath),\n        combinedVars,\n    );\n\n    /* Store parsed toc for .md output format */\n    storage.set(path, parsedToc);\n\n    /* Store path to toc file to handle relative paths in navigation */\n    parsedToc.base = pathToDir;\n\n    if (outputFormat === 'md') {\n        /* Should copy resolved and filtered toc to output folder */\n        const outputPath = resolve(outputFolderPath, path);\n        const outputToc = dump(parsedToc);\n        shell.mkdir('-p', dirname(outputPath));\n        writeFileSync(outputPath, outputToc);\n    }\n\n    prepareNavigationPaths(parsedToc, pathToDir);\n}\n\nasync function processTocItems(\n    path: string,\n    items: YfmToc[],\n    tocDir: string,\n    sourcesDir: string,\n    vars: Record<string, string>,\n) {\n    const {\n        resolveConditions,\n        removeHiddenTocItems,\n    } = ArgvService.getConfig();\n\n    let preparedItems = items;\n\n    /* Should remove all links with false expressions */\n    if (resolveConditions || removeHiddenTocItems) {\n        try {\n            preparedItems = filterFiles(items, 'items', vars, {\n                resolveConditions,\n                removeHiddenTocItems,\n            });\n        } catch (error) {\n            log.error(`Error while filtering toc file: ${path}. Error message: ${error}`);\n        }\n    }\n\n    /* Should resolve all includes */\n    return _replaceIncludes(path, preparedItems, tocDir, sourcesDir, vars);\n}\n\nfunction getForPath(path: string): YfmToc|undefined {\n    return storage.get(path);\n}\n\nfunction getNavigationPaths(): string[] {\n    return [...navigationPaths];\n}\n\nfunction getIncludedTocPaths(): string[] {\n    return [...includedTocPaths];\n}\n\nfunction prepareNavigationPaths(parsedToc: YfmToc, dirPath: string) {\n    function processItems(items: YfmToc[], pathToDir: string) {\n        items.forEach((item) => {\n            if (!parsedToc.singlePage && item.items) {\n                const preparedSubItems = item.items.map(((yfmToc: YfmToc, index: number) => {\n                    // Generate personal id for each navigation item\n                    yfmToc.id = `${yfmToc.name}-${index}-${Math.random()}`;\n                    return yfmToc;\n                }));\n                processItems(preparedSubItems, pathToDir);\n            }\n\n            if (item.href && !isExternalHref(item.href)) {\n                const href = join(pathToDir, item.href);\n                storage.set(href, parsedToc);\n\n                const navigationPath = _normalizeHref(href);\n                navigationPaths.push(navigationPath);\n            }\n        });\n    }\n\n    processItems([parsedToc], dirPath);\n}\n\n/**\n * Should normalize hrefs. MD and YAML files will be ignored.\n * @param href\n * @return {string}\n * @example instance-groups/create-with-coi/ -> instance-groups/create-with-coi/index.yaml\n * @example instance-groups/create-with-coi -> instance-groups/create-with-coi.md\n * @private\n */\nfunction _normalizeHref(href: string): string {\n    const preparedHref = normalize(href);\n\n    if (preparedHref.endsWith('.md') || preparedHref.endsWith('.yaml')) {\n        return preparedHref;\n    }\n\n    if (preparedHref.endsWith(sep)) {\n        return `${preparedHref}index.yaml`;\n    }\n\n    return `${preparedHref}.md`;\n}\n\n/**\n * Copies all files of include toc to original dir.\n * @param tocPath\n * @param destDir\n * @return\n * @private\n */\nfunction _copyTocDir(tocPath: string, destDir: string) {\n    const {input: inputFolderPath} = ArgvService.getConfig();\n\n    const {dir: tocDir} = parse(tocPath);\n    const files: string[] = walkSync(tocDir, {\n        globs: ['**/*.*'],\n        ignore: ['**/toc.yaml'],\n        directories: false,\n    });\n\n    files.forEach((relPath) => {\n        const from = resolve(tocDir, relPath);\n        const to = resolve(destDir, relPath);\n        const fileExtension = extname(relPath);\n        const isMdFile = fileExtension === '.md';\n\n        shell.mkdir('-p', parse(to).dir);\n\n        if (isMdFile) {\n            const fileContent = readFileSync(from, 'utf8');\n            const sourcePath = relative(inputFolderPath, from);\n            const updatedFileContent = getContentWithUpdatedStaticMetadata({\n                fileContent,\n                sourcePath,\n                addSourcePath: true,\n            });\n\n            writeFileSync(to, updatedFileContent);\n        } else {\n            copyFileSync(from, to);\n        }\n    });\n}\n\n/**\n * Make hrefs relative to the main toc in the included toc.\n * @param items\n * @param includeTocDir\n * @param tocDir\n * @return\n * @private\n */\nfunction _replaceIncludesHrefs(items: YfmToc[], includeTocDir: string, tocDir: string): YfmToc[] {\n    return items.reduce((acc, tocItem) => {\n        if (tocItem.href) {\n            tocItem.href = relative(tocDir, resolve(includeTocDir, tocItem.href));\n        }\n\n        if (tocItem.items) {\n            tocItem.items = _replaceIncludesHrefs(tocItem.items, includeTocDir, tocDir);\n        }\n\n        if (tocItem.include) {\n            const {path} = tocItem.include;\n            tocItem.include.path = relative(tocDir, resolve(includeTocDir, path));\n        }\n\n        return acc.concat(tocItem);\n    }, [] as YfmToc[]);\n}\n\n/**\n * Liquid substitutions in toc file.\n * @param input\n * @param vars\n * @param path\n * @return {string}\n * @private\n */\nfunction _liquidSubstitutions(input: string, vars: Record<string, string>, path: string) {\n    const {outputFormat, applyPresets} = ArgvService.getConfig();\n    if (outputFormat === 'md' && !applyPresets) {\n        return input;\n    }\n\n    return liquid(input, vars, path, {\n        conditions: false,\n        substitutions: true,\n    });\n}\n\nfunction addIncludeTocPath(includeTocPath: string) {\n    includedTocPaths.add(includeTocPath);\n}\n\n/**\n * Replaces include fields in toc file by resolved toc.\n * @param path\n * @param items\n * @param tocDir\n * @param sourcesDir\n * @param vars\n * @return\n * @private\n */\nasync function _replaceIncludes(\n    path: string,\n    items: YfmToc[],\n    tocDir: string,\n    sourcesDir: string,\n    vars: Record<string, string>,\n): Promise<YfmToc[]> {\n    const result: YfmToc[] = [];\n\n    for (const item of items) {\n        let includedInlineItems: YfmToc[] | null = null;\n\n        if (item.name) {\n            const tocPath = join(tocDir, 'toc.yaml');\n\n            item.name = _liquidSubstitutions(item.name, vars, tocPath);\n        }\n\n        try {\n            await applyIncluders(path, item, vars);\n        } catch (err) {\n            if (err instanceof Error || err instanceof IncludersError) {\n                const message = err.toString();\n\n                const file = err instanceof IncludersError ? err.path : path;\n\n                logger.error(file, message);\n            }\n        }\n\n        if (item.include) {\n            const {mode = IncludeMode.ROOT_MERGE} = item.include;\n            const includeTocPath = mode === IncludeMode.ROOT_MERGE\n                ? resolve(sourcesDir, item.include.path)\n                : resolve(tocDir, item.include.path);\n            const includeTocDir = dirname(includeTocPath);\n\n            try {\n                const includeToc = load(readFileSync(includeTocPath, 'utf8')) as YfmToc;\n\n                // Should ignore included toc with tech-preview stage.\n                if (includeToc.stage === Stage.TECH_PREVIEW) {\n                    continue;\n                }\n\n                if (mode === IncludeMode.MERGE || mode === IncludeMode.ROOT_MERGE) {\n                    _copyTocDir(includeTocPath, tocDir);\n                }\n\n                /* Save the path to exclude toc from the output directory in the next step */\n                addIncludeTocPath(includeTocPath);\n\n                let includedTocItems = (item.items || []).concat(includeToc.items);\n\n                /* Resolve nested toc inclusions */\n                const baseTocDir = mode === IncludeMode.LINK ? includeTocDir : tocDir;\n                includedTocItems = await processTocItems(path, includedTocItems, baseTocDir, sourcesDir, vars);\n\n                /* Make hrefs relative to the main toc */\n                if (mode === IncludeMode.LINK) {\n                    includedTocItems = _replaceIncludesHrefs(includedTocItems, includeTocDir, tocDir);\n                }\n\n                if (item.name) {\n                    item.items = includedTocItems;\n                } else {\n                    includedInlineItems = includedTocItems;\n                }\n            } catch (err) {\n                const message = (\n                    `Error while including toc: ${bold(includeTocPath)} to ${bold(join(tocDir, 'toc.yaml'))}`\n                );\n\n                log.error(message);\n\n                continue;\n            } finally {\n                delete item.include;\n            }\n        } else if (item.items) {\n            item.items = await processTocItems(path, item.items, tocDir, sourcesDir, vars);\n        }\n\n        if (includedInlineItems) {\n            result.push(...includedInlineItems);\n        } else {\n            result.push(item);\n        }\n    }\n\n    return result;\n}\n\nfunction getTocDir(pagePath: string): string {\n    const {input: inputFolderPath} = ArgvService.getConfig();\n\n    const tocDir = dirname(pagePath);\n    const tocPath = resolve(tocDir, 'toc.yaml');\n\n\n    if (!tocDir.includes(inputFolderPath)) {\n        throw new Error('Error while finding toc dir');\n    }\n\n    if (existsSync(tocPath)) {\n        return tocDir;\n    }\n\n    return getTocDir(tocDir);\n}\n\nfunction setNavigationPaths(paths: TocServiceData['navigationPaths']) {\n    navigationPaths = paths;\n}\n\nexport default {\n    add,\n    getForPath,\n    getNavigationPaths,\n    getTocDir,\n    getIncludedTocPaths,\n    setNavigationPaths,\n};\n","import {dump} from 'js-yaml';\n\nimport {VCSConnector} from '../vcs-connector/connector-models';\nimport {Metadata, MetaDataOptions, Resources} from '../models';\nimport {\n    getAuthorDetails,\n    updateAuthorMetadataStringByAuthorLogin,\n    updateAuthorMetadataStringByFilePath,\n} from './authors';\nimport {getFileContributorsMetadata, getFileContributorsString} from './contributors';\nimport {isObject} from './utils';\nimport {сarriage} from '../utils';\nimport {metadataBorder, REGEXP_AUTHOR} from '../constants';\nimport {dirname, relative, resolve} from 'path';\nimport {ArgvService} from './index';\n\nasync function getContentWithUpdatedMetadata(\n    fileContent: string,\n    options?: MetaDataOptions,\n    systemVars?: unknown,\n): Promise<string> {\n    let result;\n\n    result = getContentWithUpdatedStaticMetadata({\n        fileContent,\n        sourcePath: options?.fileData?.sourcePath,\n        addSystemMeta: options?.addSystemMeta,\n        addSourcePath: options?.addSourcePath,\n        resources: options?.resources,\n        systemVars,\n    });\n    result = await getContentWithUpdatedDynamicMetadata(result, options);\n\n    return result;\n}\n\nfunction getContentWithUpdatedStaticMetadata({\n    fileContent, sourcePath, addSystemMeta, addSourcePath, resources, systemVars,\n}: {\n    fileContent: string;\n    sourcePath?: string;\n    addSystemMeta?: boolean;\n    addSourcePath?: boolean;\n    resources?: Resources;\n    systemVars?: unknown;\n}): string {\n    const newMetadatas: string[] = [];\n\n    if ((!addSystemMeta || !systemVars) && !addSourcePath && !resources) {\n        return fileContent;\n    }\n\n    const matches = matchMetadata(fileContent);\n\n    if (addSystemMeta && systemVars && isObject(systemVars)) {\n        newMetadatas.push(getSystemVarsMetadataString(systemVars));\n    }\n\n    if (resources) {\n        newMetadatas.push(dump(resources));\n    }\n\n    if (addSourcePath && sourcePath) {\n        const sourcePathMetadataString = `sourcePath: ${sourcePath}`;\n        newMetadatas.push(sourcePathMetadataString);\n    }\n\n    if (matches && matches.length > 0) {\n        const [, fileMetadata, , fileMainContent] = matches;\n\n        return `${getUpdatedMetadataString(newMetadatas, fileMetadata)}${fileMainContent}`;\n    }\n\n    return `${getUpdatedMetadataString(newMetadatas)}${fileContent}`;\n}\n\nasync function getContentWithUpdatedDynamicMetadata(\n    fileContent: string,\n    options?: MetaDataOptions,\n): Promise<string> {\n    if (!options || !options?.isContributorsEnabled) {\n        return fileContent;\n    }\n\n    let fileMetadata: string | undefined, fileMainContent: string | undefined;\n    const matches = matchMetadata(fileContent);\n    if (matches && matches.length > 0) {\n        const [, matchedFileMetadata, , matchedFileMainContent] = matches;\n        fileMetadata = matchedFileMetadata;\n        fileMainContent = matchedFileMainContent;\n    }\n\n    const newMetadatas: string[] = [];\n\n    const {isContributorsEnabled} = options;\n\n    if (isContributorsEnabled) {\n        const contributorsMetaData = await getContributorsMetadataString(options, fileContent);\n        if (contributorsMetaData) {\n            newMetadatas.push(contributorsMetaData);\n        }\n\n        let authorMetadata = '';\n        if (fileMetadata) {\n            const matchAuthor = fileMetadata.match(REGEXP_AUTHOR);\n            if (matchAuthor) {\n                const matchedAuthor = matchAuthor[0];\n                authorMetadata = await updateAuthorMetadataStringByAuthorLogin(matchedAuthor, options.vcsConnector);\n            }\n        }\n\n        if (!authorMetadata) {\n            const {fileData: {tmpInputFilePath, inputFolderPathLength}} = options;\n            const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength);\n            authorMetadata = await updateAuthorMetadataStringByFilePath(relativeFilePath, options.vcsConnector);\n        }\n\n        if (authorMetadata) {\n            newMetadatas.push(`author: ${authorMetadata}`);\n        }\n    }\n\n    if (fileMetadata && fileMainContent) {\n        let updatedFileMetadata = fileMetadata;\n        const matchAuthor = fileMetadata.match(REGEXP_AUTHOR);\n\n        const isNewMetadataIncludesAuthor = newMetadatas.some((item) => /^author: /.test(item));\n        if (matchAuthor && isNewMetadataIncludesAuthor) {\n            updatedFileMetadata = updatedFileMetadata.replace(`author: ${matchAuthor[0]}`, '');\n        }\n\n        return `${getUpdatedMetadataString(newMetadatas, updatedFileMetadata)}${fileMainContent}`;\n    }\n\n    return `${getUpdatedMetadataString(newMetadatas)}${fileContent}`;\n}\n\nfunction matchMetadata(fileContent: string) {\n    if (!fileContent.startsWith('---')) {\n        return null;\n    }\n\n    // Search by format:\n    // ---\n    // metaName1: metaValue1\n    // metaName2: meta value2\n    // incorrectMetadata\n    // ---\n    const regexpMetadata = '(?<=-{3}\\\\r?\\\\n)((.*\\\\r?\\\\n)*?)(?=-{3}\\\\r?\\\\n)';\n    // Search by format:\n    // ---\n    // main content 123\n    const regexpFileContent = '-{3}((.*[\\r?\\n]*)*)';\n\n    const regexpParseFileContent = new RegExp(`${regexpMetadata}${regexpFileContent}`, 'gm');\n\n    return regexpParseFileContent.exec(fileContent);\n}\n\nasync function getContributorsMetadataString(\n    options: MetaDataOptions, fileContent: string,\n): Promise<string | undefined> {\n    const {isContributorsEnabled, vcsConnector, fileData} = options;\n\n    if (isContributorsEnabled && vcsConnector) {\n        const updatedFileData = {\n            ...fileData,\n            fileContent,\n        };\n\n        return getFileContributorsMetadata(updatedFileData, vcsConnector);\n    }\n\n    return undefined;\n}\n\nfunction getUpdatedMetadataString(newMetadatas: string[], defaultMetadata = ''): string {\n    const newMetadata = newMetadatas.join(сarriage) + (newMetadatas.length ? сarriage : '');\n    const preparedDefaultMetadata = defaultMetadata.trimRight();\n    const defaultMetadataСarriage = preparedDefaultMetadata ? сarriage : '';\n    const updatedMetadata = `${preparedDefaultMetadata}${defaultMetadataСarriage}${newMetadata}`;\n\n    return `${metadataBorder}${сarriage}${updatedMetadata}${metadataBorder}${defaultMetadata.length ? '' : сarriage}`;\n}\n\nasync function getUpdatedMetadata(options: MetaDataOptions, fileContent: string, meta?: Metadata): Promise<Metadata> {\n    const {vcsConnector} = options;\n\n    const newMetadata: Metadata = {\n        contributors: await getContributorsMetadata(options, fileContent),\n    };\n\n    if (!meta) {\n        return newMetadata;\n    }\n\n    const updatedAuthor = await getAuthorMetadata(meta as Metadata, vcsConnector);\n\n    return {\n        ...meta,\n        ...newMetadata,\n        author: updatedAuthor,\n    };\n}\n\nasync function getContributorsMetadata(options: MetaDataOptions, fileContent: string): Promise<string> {\n    const {isContributorsEnabled, vcsConnector, fileData} = options;\n\n    if (isContributorsEnabled && vcsConnector) {\n        const updatedFileData = {\n            ...fileData,\n            fileContent,\n        };\n\n        return getFileContributorsString(updatedFileData, vcsConnector);\n    }\n\n    return JSON.stringify([]);\n}\n\nasync function getAuthorMetadata(meta: Metadata, vcsConnector?: VCSConnector): Promise<string | null> {\n    if (meta.author && vcsConnector) {\n        const updatedAuthor = await getAuthorDetails(vcsConnector, meta.author);\n\n        return updatedAuthor;\n    }\n\n    return null;\n}\n\nfunction getSystemVarsMetadataString(systemVars: object) {\n    return `__system: ${JSON.stringify(systemVars)}`;\n}\n\n\nfunction getAssetsPublicPath(filePath: string) {\n    const {input} = ArgvService.getConfig();\n    const path: string = resolve(input, filePath);\n\n    /* Relative path from folder of .md file to root of user' output folder */\n    return relative(dirname(path), resolve(input));\n}\n\nexport {\n    getContentWithUpdatedMetadata,\n    getContentWithUpdatedStaticMetadata,\n    getUpdatedMetadata,\n    getAssetsPublicPath,\n};\n","import log from '@doc-tools/transform/lib/log';\nimport {blue, green, grey, red, yellow} from 'chalk';\nimport {ArgvService} from '../services';\n\nfunction writeLog(msg: string, fatal = false) {\n    const {quiet} = ArgvService.getConfig();\n\n    if (quiet && !fatal) {\n        return;\n    }\n\n    console.log(msg);\n}\n\nexport const logger = {\n    info: function (pathToFile: string, extraMessage?: string) {\n        writeLog(`${grey('INFO')} ${extraMessage} ${pathToFile}`);\n    },\n    proc: function (pathToFile: string) {\n        writeLog(`${blue('PROC')} Processing file ${pathToFile}`);\n    },\n    copy: function (pathToFile: string) {\n        writeLog(`${green('COPY')} Copying file ${pathToFile}`);\n    },\n    upload: function (pathToFile: string) {\n        writeLog(`${green('UPLOAD')} Uploading file ${pathToFile}`);\n    },\n    warn: function (pathToFile: string, extraMessage: string) {\n        const message = `${yellow('WARNING')} file: ${pathToFile} error: ${extraMessage}`;\n\n        writeLog(message);\n\n        log.warn(`file: ${pathToFile} ${extraMessage}`);\n    },\n    error: function (pathToFile: string, extraMessage: string) {\n        const message = `${red('ERROR')} file: ${pathToFile} error: ${extraMessage}`;\n\n        writeLog(message, true);\n\n        log.error(`file: ${pathToFile} ${extraMessage}`);\n    },\n};\n","import {platform} from 'process';\n\nimport {CUSTOM_STYLE, Platforms, ResourceType} from '../constants';\nimport {SinglePageResult, Resources} from '../models';\nimport {ArgvService, PluginService} from '../services';\nimport {preprocessPageHtmlForSinglePage} from './singlePage';\nimport {render, DocInnerProps, DocPageData} from '@diplodoc/client';\nimport client from '../../scripts/client';\n\nexport interface TitleMeta {\n    title?: string;\n}\nexport type Meta = TitleMeta & Resources;\n\nexport function generateStaticMarkup(props: DocInnerProps<DocPageData>, pathToBundle: string): string {\n    const {title: metaTitle, style, script} = props.data.meta as Meta || {};\n    const {title: tocTitle} = props.data.toc;\n    const {title: pageTitle} = props.data;\n\n    const title = getTitle({\n        metaTitle,\n        tocTitle: tocTitle as string,\n        pageTitle,\n    });\n    const resources = getResources({style, script});\n\n    const {staticContent} = ArgvService.getConfig();\n\n    const html = staticContent ? render(props) : '';\n\n    return `\n        <!DOCTYPE html>\n        <html lang=\"${props.lang}\">\n            <head>\n                <meta charset=\"utf-8\">\n                ${getMetadata(props.data.meta as Record<string, string>)}\n                <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n                <title>${title}</title>\n                <style type=\"text/css\">\n                    body {\n                        height: 100vh;\n                    }\n                </style>\n                <link type=\"text/css\" rel=\"stylesheet\" href=\"${client.bundle.css(pathToBundle)}\" />\n                ${PluginService.getHeadContent()}\n                ${resources}\n            </head>\n            <body class=\"yc-root yc-root_theme_light\">\n                <div id=\"root\">${html}</div>\n                <script type=\"application/javascript\">\n                   window.STATIC_CONTENT = ${staticContent}\n                   window.__DATA__ = ${JSON.stringify(props)};\n                </script>\n                <script type=\"application/javascript\" src=\"${client.bundle.js(pathToBundle)}\"></script>\n            </body>\n        </html>\n    `;\n}\n\ninterface GetTitleOptions {\n    tocTitle?: string;\n    metaTitle?: string;\n    pageTitle?: string;\n}\n\nfunction getTitle({tocTitle, metaTitle, pageTitle}: GetTitleOptions) {\n    const resultPageTitle = metaTitle || pageTitle;\n\n    if (!resultPageTitle && tocTitle) {\n        return tocTitle;\n    }\n\n    if (resultPageTitle && !tocTitle) {\n        return resultPageTitle;\n    }\n\n    return resultPageTitle && tocTitle ? `${resultPageTitle} | ${tocTitle}` : '';\n}\n\nfunction getMetadata(metadata: Record<string, string>): string {\n    if (!metadata) {\n        return '';\n    }\n\n    // Exclude resources from meta, proceed them separately\n    const metaEntries = Object.entries(metadata).filter(([key]) => !Object.keys(ResourceType).includes(key));\n\n    return metaEntries\n        .map(([name, content]) => {\n            return `<meta name=\"${name}\" content=\"${content}\">`;\n        })\n        .join('\\n');\n}\n\nfunction getResources({style, script}: Resources) {\n    const resourcesTags: string[] = [];\n\n    if (style) {\n        style.forEach((el, id) => resourcesTags.push(\n            `<link rel=\"stylesheet\" type=\"text/css\" href=\"${el}\" ${id === 0 && `id=\"${CUSTOM_STYLE}\"`}>`,\n        ));\n    }\n\n    if (script) {\n        script.forEach((el) => resourcesTags.push(\n            `<script src=\"${el}\"></script>`,\n        ));\n    }\n\n    return resourcesTags.join('\\n');\n}\n\nexport const сarriage = platform === Platforms.WINDOWS ? '\\r\\n' : '\\n';\n\nexport function joinSinglePageResults(singlePageResults: SinglePageResult[], root: string, tocDir: string): string {\n    const delimeter = `${сarriage}${сarriage}<hr class=\"yfm-page__delimeter\">${сarriage}${сarriage}`;\n    return singlePageResults\n        .filter(({content}) => content)\n        .map(({content, path, title}) => preprocessPageHtmlForSinglePage(content, {root, path, tocDir, title}))\n        .join(delimeter);\n}\n\nexport function replaceDoubleToSingleQuotes(str: string): string {\n    return str.replace(/\"/g, '\\'');\n}\n","import HTMLElement from 'node-html-parser/dist/nodes/html';\nimport {parse} from 'node-html-parser';\nimport {resolve, sep, relative} from 'path';\nimport {resolveRelativePath} from '@doc-tools/transform/lib/utilsFS';\nimport url from 'url';\nimport _ from 'lodash';\n\nimport {isExternalHref} from './url';\n\ninterface ModifyNode {\n    innerHTML: string;\n    rawTagName: string;\n    attrEntries?: string[][];\n}\n\ninterface PreprocessSinglePageOptions {\n    root: string;\n    path: string;\n    tocDir: string;\n    title?: string;\n}\n\nconst HEADERS_SELECTOR = 'h1, h2, h3, h4, h5, h6';\n\nfunction getNewNode(options: ModifyNode): HTMLElement | null {\n    const {rawTagName, innerHTML, attrEntries} = options;\n\n    const nodeNew = parse(`<html><${rawTagName}></${rawTagName}></html>`)\n        .querySelector(`${rawTagName}`);\n\n    if (!nodeNew) {\n        return null;\n    }\n\n    if (attrEntries) {\n        for (const [name, value] of attrEntries) {\n            nodeNew.setAttribute(name, value);\n        }\n    }\n\n    nodeNew.innerHTML = innerHTML;\n\n    return nodeNew;\n}\n\nexport function decreaseHeadingLevels(root: HTMLElement) {\n    const headersSelector = 'h1, h2, h3, h4, h5';\n\n    root.querySelectorAll(headersSelector).forEach((node) => {\n        const {rawTagName} = node;\n        const newHeadingLevel = Number(rawTagName.charAt(1)) + 1;\n\n        node.rawTagName = `h${newHeadingLevel}`;\n    });\n}\n\nexport function tryFixFirstPageHeader(root: HTMLElement) {\n    const firstPageHeader = root.querySelector(HEADERS_SELECTOR);\n    if (!firstPageHeader || firstPageHeader.rawTagName === 'h1') {\n        return;\n    }\n\n    firstPageHeader.rawTagName = 'h1';\n}\n\n\nexport function replaceLinks(rootEl: HTMLElement, options: PreprocessSinglePageOptions) {\n    const {root, path, tocDir} = options;\n\n    rootEl.querySelectorAll('a:not(.yfm-anchor):not([target=\"_blank\"])').forEach((node) => {\n        const href = node.getAttribute('href') || '';\n\n        const resolvedPath = resolve(root, path);\n        const linkFullPath = resolveRelativePath(resolvedPath, href);\n        const isLinkOutOfToc = !linkFullPath.startsWith(tocDir);\n\n\n        let preparedHref = href;\n\n        if (isLinkOutOfToc) {\n            preparedHref = relative(tocDir, linkFullPath);\n        } else {\n            const {pathname, hash} = url.parse(href);\n            if (pathname) {\n                preparedHref = getSinglePageAnchorId({\n                    root,\n                    currentPath: resolvedPath,\n                    pathname,\n                    hash,\n                });\n            } else if (hash) {\n                preparedHref = getSinglePageAnchorId({root, currentPath: resolvedPath, hash});\n            }\n        }\n\n\n        node.setAttribute('href', preparedHref);\n    });\n}\n\nexport function replaceImages(rootEl: HTMLElement, options: PreprocessSinglePageOptions) {\n    const {root, path, tocDir} = options;\n\n    rootEl.querySelectorAll('img').forEach((node) => {\n        const href = node.getAttribute('src') || '';\n\n        if (isExternalHref(href)) {\n            return;\n        }\n\n        const resolvedPath = resolve(root, path);\n        const linkFullPath = resolveRelativePath(resolvedPath, href);\n        const preparedHref = relative(tocDir, linkFullPath);\n\n\n        node.setAttribute('src', preparedHref);\n    });\n}\n\n\nfunction prepareAnchorAttr(name: string, value: string, pageId: string) {\n    switch (name) {\n        case 'href':\n            return `#${pageId}_${value.slice(1)}`;\n        case 'id':\n            return `${pageId}_${value}`;\n        default:\n            return value;\n    }\n}\n\nfunction prepareAnchorAttrs(node: HTMLElement, pageId: string) {\n    for (const [name, value] of Object.entries(node.attributes)) {\n        const preparedValue = prepareAnchorAttr(name, value, pageId);\n\n        node.setAttribute(name, preparedValue);\n    }\n}\n\nexport function addPagePrefixToAnchors(rootEl: HTMLElement, options: PreprocessSinglePageOptions) {\n    const {root, path} = options;\n\n    const resolvedPath = resolve(root, path);\n    const pageIdAnchor = getSinglePageAnchorId({root, currentPath: resolvedPath});\n    const originalArticleHref = transformLinkToOriginalArticle({root, currentPath: resolvedPath});\n    const pageId = pageIdAnchor.slice(1);\n    const anchorSelector = '.yfm-anchor';\n\n    // Add the page prefix id to all existing anchors\n    rootEl.querySelectorAll(anchorSelector).forEach((node) => {\n        prepareAnchorAttrs(node, pageId);\n    });\n\n    const mainHeader = rootEl.querySelector('h1');\n    if (mainHeader) {\n        const anchor = parse(`<a class=\"yfm-anchor\" aria-hidden=\"true\" href=\"${pageIdAnchor}\" id=\"${pageId}\"></a>`);\n        if (!anchor) {\n            return;\n        }\n\n        mainHeader.setAttribute('data-original-article', `${originalArticleHref}.html`);\n        mainHeader.appendChild(anchor);\n    }\n\n    rootEl.querySelectorAll(HEADERS_SELECTOR).forEach((node) => {\n        prepareAnchorAttrs(node, pageId);\n    });\n}\n\nexport function addMainTitle(rootEl: HTMLElement, options: PreprocessSinglePageOptions) {\n    const {title} = options;\n\n    if (!title) {\n        return;\n    }\n\n    const mainTitle = getNewNode({innerHTML: title, rawTagName: 'h1'});\n\n    if (!mainTitle) {\n        return;\n    }\n\n    rootEl.insertAdjacentHTML('afterbegin', mainTitle.toString());\n}\n\nexport function getSinglePageAnchorId(args: {\n    root: string;\n    currentPath: string;\n    pathname?: string;\n    hash?: string | null;\n}) {\n    const {root, currentPath, pathname, hash} = args;\n    let resultAnchor = currentPath;\n\n    if (pathname) {\n        resultAnchor = resolveRelativePath(currentPath, pathname);\n    }\n\n    resultAnchor = resultAnchor\n        .replace(root, '')\n        .replace(/\\.(md|ya?ml|html)$/i, '')\n        .replace(new RegExp(_.escapeRegExp(sep), 'gi'), '_');\n\n    if (hash) {\n        resultAnchor = resultAnchor + '_' + hash.slice(1);\n    }\n\n    return `#${resultAnchor}`;\n}\n\nexport function transformLinkToOriginalArticle(opts: {root: string; currentPath: string}) {\n    const {root, currentPath} = opts;\n\n    return currentPath.replace(root, '').replace(/\\.(md|ya?ml|html)$/i, '');\n}\n\nexport function preprocessPageHtmlForSinglePage(content: string, options: PreprocessSinglePageOptions) {\n    const root = parse(content);\n\n    addMainTitle(root, options);\n    tryFixFirstPageHeader(root);\n    addPagePrefixToAnchors(root, options);\n    decreaseHeadingLevels(root);\n    replaceLinks(root, options);\n    replaceImages(root, options);\n\n    return root.toString();\n}\n","export function isExternalHref(href: string) {\n    return href.startsWith('http') || href.startsWith('//');\n}\n","import {sep} from 'path';\nimport {Platforms} from '../constants';\n\nexport function addSlashPrefix(path: string): string {\n    const slashPrefix = path.startsWith(sep) ? '' : sep;\n\n    return `${slashPrefix}${path}`;\n}\n\nexport function convertBackSlashToSlash(path: string): string {\n    if (process.platform === Platforms.WINDOWS) {\n        return path.replace(/\\\\/g, '/');\n    }\n\n    return path;\n}\n\nexport function convertSlashToWindowsBackSlashes(path: string): string {\n    if (process.platform === Platforms.WINDOWS) {\n        return path.replace(/\\//g, '\\\\\\\\');\n    }\n\n    return path;\n}\n","import {relative, dirname, basename, extname, format, join} from 'path';\n\nimport {YfmToc} from '../models';\nimport {filterFiles} from '../services/utils';\nimport {isExternalHref} from './url';\nimport {getSinglePageAnchorId} from './singlePage';\n\nexport function transformToc(toc: YfmToc | null, pathToFileDirectory: string): YfmToc | null {\n    if (!toc) {\n        return null;\n    }\n\n    const localToc: YfmToc = JSON.parse(JSON.stringify(toc));\n\n    if (localToc.items) {\n        localToc.items = filterFiles(localToc.items, 'items', {}, {\n            removeHiddenTocItems: true,\n        });\n    }\n\n    const baseTocPath: string = localToc.base || '';\n    const navigationItemQueue = [localToc];\n\n    while (navigationItemQueue.length) {\n        const navigationItem = navigationItemQueue.shift();\n\n        if (!navigationItem) {\n            continue;\n        }\n\n        const {items, href} = navigationItem;\n\n        if (items) {\n            navigationItemQueue.push(...navigationItem.items);\n        }\n\n        if (href && !isExternalHref(href)) {\n            /* Path to directory with toc.yaml */\n            const pathToIndexDirectory: string = relative(pathToFileDirectory, baseTocPath);\n\n            const fileExtension: string = extname(href);\n            const filename: string = basename(href, fileExtension);\n            const transformedFilename: string = format({\n                name: filename,\n                ext: '.html',\n            });\n\n            navigationItem.href = join(pathToIndexDirectory, dirname(href), transformedFilename);\n        }\n    }\n\n    return localToc;\n}\n\nexport function transformTocForSinglePage(toc: YfmToc | null, options: {root: string; currentPath: string}) {\n    const {root, currentPath} = options;\n\n    if (!toc) {\n        return null;\n    }\n\n    const localToc: YfmToc = JSON.parse(JSON.stringify(toc));\n\n    if (localToc.items) {\n        localToc.items = filterFiles(localToc.items, 'items', {}, {\n            removeHiddenTocItems: true,\n        });\n    }\n\n    function processItems(items: YfmToc[]) {\n        items.forEach((item) => {\n            if (item.items) {\n                processItems(item.items);\n            }\n\n            if (item.href && !isExternalHref(item.href)) {\n                item.href = getSinglePageAnchorId({root, currentPath, pathname: item.href});\n            }\n        });\n    }\n\n    processItems(localToc.items);\n\n    localToc.singlePage = true;\n\n    return localToc;\n}\n","import evalExp from '@doc-tools/transform/lib/liquid/evaluation';\nimport {Filter, TextItems} from '../models';\nimport liquid from '@doc-tools/transform/lib/liquid';\nimport {ArgvService} from './index';\n\nexport interface FilterFilesOptions {\n    resolveConditions?: boolean;\n    removeHiddenTocItems?: boolean;\n}\n\n/**\n * Filters file by expression and removes empty file's items.\n * @param items\n * @param itemsKey\n * @param vars\n * @param options\n * @return {T[]}\n */\nexport function filterFiles<T extends Filter>(\n    items: T[],\n    itemsKey: string,\n    vars: Record<string, string>,\n    options?: FilterFilesOptions,\n): T[] {\n    if (!Array.isArray(items)) {\n        return [];\n    }\n\n    const reducer = (results: T[], item: T) => {\n        if (shouldProcessItem(item, vars, options)) {\n            const prop = item[itemsKey] as T[];\n\n            if (prop) {\n                const filteredProperty = filterFiles(prop, itemsKey, vars, options);\n\n                if (filteredProperty.length) {\n                    results.push({\n                        ...item,\n                        [itemsKey]: filteredProperty,\n                    });\n                }\n            } else {\n                results.push(item);\n            }\n        }\n\n        return results;\n    };\n\n    return items.reduce(reducer, []);\n}\n\nexport function filterTextItems(\n    items: undefined | TextItems,\n    vars: Record<string, string>,\n    options?: FilterFilesOptions,\n) {\n    if (!Array.isArray(items)) {\n        return items;\n    }\n\n    return items.reduce((result: string[], item) => {\n        if (!isObject(item)) {\n            result.push(item);\n            return result;\n        }\n\n        const useItem = shouldProcessItem(item, vars, options);\n\n        if (useItem) {\n            if (Array.isArray(item.text)) {\n                result.push(...item.text);\n            } else {\n                result.push(item.text);\n            }\n        }\n\n        return result;\n    }, []);\n}\n\nexport function firstFilterTextItems(\n    items: TextItems,\n    vars: Record<string, string>,\n    options?: FilterFilesOptions,\n) {\n    const filteredItems = filterTextItems(items, vars, options);\n\n    if (!Array.isArray(filteredItems)) {\n        return filteredItems || '';\n    }\n\n    return filteredItems[0] || '';\n}\n\nfunction shouldProcessItem<T extends Filter>(item: T, vars: Record<string, string>, options?: FilterFilesOptions) {\n    const {resolveConditions, removeHiddenTocItems} = options || {};\n    let useItem = true;\n\n    if (resolveConditions) {\n        const {when} = item;\n        useItem =\n            when === true || when === undefined || (typeof when === 'string' && evalExp(when, vars));\n\n        delete item.when;\n    }\n\n    if (useItem && removeHiddenTocItems) {\n        useItem = !item.hidden;\n\n        delete item.hidden;\n    }\n\n    return useItem;\n}\n\nexport function liquidFields(fields: undefined | string | string[], vars: Record<string, unknown>, path: string) {\n    if (typeof fields === 'string') {\n        return liquidField(fields, vars, path);\n    }\n\n    if (!Array.isArray(fields)) {\n        return fields;\n    }\n\n    return fields.map((item) => {\n        if (typeof item === 'string') {\n            return liquidField(item, vars, path);\n        }\n        return item;\n    });\n}\n\nexport function liquidField(input: string, vars: Record<string, unknown>, path: string) {\n    const {applyPresets, resolveConditions} = ArgvService.getConfig();\n\n    if (!applyPresets && !resolveConditions) {\n        return input;\n    }\n\n    return liquid(input, vars, path, {\n        substitutions: applyPresets,\n        conditions: resolveConditions,\n        keepNotVar: true,\n        withSourceMap: false,\n    });\n}\n\nexport function isObject(o: unknown): o is object {\n    return typeof o === 'object' && o !== null;\n}\n","import {dirname, relative, resolve} from 'path';\n\nimport {ArgvService, PresetService} from '../services';\n\nexport function getVarsPerFile(filePath: string): Record<string, string> {\n    const {vars: argVars} = ArgvService.getConfig();\n\n    return {\n        ...PresetService.get(dirname(filePath)),\n        ...argVars,\n    };\n}\n\nexport function getVarsPerRelativeFile(filePath: string): Record<string, string> {\n    const {input} = ArgvService.getConfig();\n    const root = resolve(input);\n    const relativeFilePath = relative(root, filePath);\n\n    return getVarsPerFile(relativeFilePath);\n}\n","import libglob, {IGlob, IOptions} from 'glob';\n\nexport type Glob = {state: IGlob};\n\nconst glob = async (pattern: string, options: IOptions): Promise<Glob> =>\n    new Promise((res, rej) => {\n        const state: IGlob = libglob(pattern, options, (err) =>\n            err ? rej(err) : res({state}),\n        );\n    });\n\nexport {glob};\n\nexport default {glob};\n","import {dirname, resolve} from 'path';\nimport shell from 'shelljs';\nimport {copyFileSync} from 'fs';\nimport {logger} from './logger';\n\nexport function copyFiles(inputFolderPath: string, outputFolderPath: string, files: string[]): void {\n    for (const pathToAsset of files) {\n        const outputDir: string = resolve(outputFolderPath, dirname(pathToAsset));\n        const from = resolve(inputFolderPath, pathToAsset);\n        const to = resolve(outputFolderPath, pathToAsset);\n\n        shell.mkdir('-p', outputDir);\n        copyFileSync(from, to);\n\n        logger.copy(pathToAsset);\n    }\n}\n","import {replaceDoubleToSingleQuotes} from '../utils';\nimport {VCSConnector} from '../vcs-connector/connector-models';\n\nasync function updateAuthorMetadataStringByAuthorLogin(\n    authorLogin: string,\n    vcsConnector?: VCSConnector,\n): Promise<string> {\n    if (!vcsConnector) {\n        return '';\n    }\n\n    const user = await getAuthorDetails(vcsConnector, authorLogin);\n\n    if (user) {\n        return user;\n    }\n\n    return '';\n}\n\n\nasync function updateAuthorMetadataStringByFilePath(\n    filePath: string,\n    vcsConnector?: VCSConnector,\n): Promise<string> {\n    if (!vcsConnector) {\n        return '';\n    }\n\n    const user = vcsConnector.getExternalAuthorByPath(filePath);\n\n    if (user) {\n        const author = replaceDoubleToSingleQuotes(JSON.stringify(user));\n        return author;\n    }\n\n    return '';\n}\n\nasync function getAuthorDetails(vcsConnector: VCSConnector, author: string | object): Promise<string | null> {\n    if (typeof author === 'object') {\n        // Avoiding problems when adding to html markup\n        return replaceDoubleToSingleQuotes(JSON.stringify(author));\n    }\n\n    try {\n        JSON.parse(author);\n        return replaceDoubleToSingleQuotes(author);\n    } catch {\n        const user = await vcsConnector.getUserByLogin(author);\n\n        if (user) {\n            return replaceDoubleToSingleQuotes(JSON.stringify(user));\n        }\n\n        return null;\n    }\n}\n\nexport {\n    updateAuthorMetadataStringByAuthorLogin,\n    updateAuthorMetadataStringByFilePath,\n    getAuthorDetails,\n};\n","import {readFile} from 'fs/promises';\nimport {dirname, join} from 'path';\n\nimport {replaceDoubleToSingleQuotes} from '../utils';\nimport {REGEXP_INCLUDE_CONTENTS, REGEXP_INCLUDE_FILE_PATH} from '../constants';\nimport {Contributor, Contributors, FileData} from '../models';\nimport {FileContributors, VCSConnector} from '../vcs-connector/connector-models';\n\nasync function getFileContributorsMetadata(fileData: FileData, vcsConnector: VCSConnector): Promise<string> {\n    const contributors = await getFileContributorsString(fileData, vcsConnector);\n\n    return `contributors: ${contributors}`;\n}\n\nasync function getFileContributorsString(fileData: FileData, vcsConnector: VCSConnector): Promise<string> {\n    const {tmpInputFilePath, inputFolderPathLength} = fileData;\n\n    const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength);\n    const fileContributors: FileContributors = await vcsConnector.getContributorsByPath(relativeFilePath);\n    let nestedContributors: Contributors = {};\n\n    if (!fileContributors.hasIncludes) {\n        nestedContributors = await getContributorsForNestedFiles(fileData, vcsConnector);\n        vcsConnector.addNestedContributorsForPath(relativeFilePath, nestedContributors);\n    }\n\n    const fileContributorsWithContributorsIncludedFiles: Contributors = {\n        ...fileContributors.contributors,\n        ...nestedContributors,\n    };\n\n    const contributorsArray: Contributor[] =\n        Object.entries(fileContributorsWithContributorsIncludedFiles).map(([, contributor]) => contributor);\n\n    return replaceDoubleToSingleQuotes(JSON.stringify(contributorsArray));\n}\n\nasync function getContributorsForNestedFiles(fileData: FileData, vcsConnector: VCSConnector): Promise<Contributors> {\n    const {fileContent, inputFolderPathLength} = fileData;\n\n    const includeContents = fileContent.match(REGEXP_INCLUDE_CONTENTS);\n    if (!includeContents || includeContents.length === 0) {\n        return {};\n    }\n\n    const includesContributors: Contributors[] = [];\n    const relativeIncludeFilePaths: Set<string> = getRelativeIncludeFilePaths(fileData, includeContents);\n\n    for (const relativeIncludeFilePath of relativeIncludeFilePaths.values()) {\n        const relativeFilePath = relativeIncludeFilePath.substring(inputFolderPathLength);\n        const includeContributors = await vcsConnector.getContributorsByPath(relativeFilePath);\n\n        let nestedContributors: Contributors = {};\n\n        if (!includeContributors.hasIncludes) {\n            let contentIncludeFile: string;\n            try {\n                contentIncludeFile = await readFile(relativeIncludeFilePath, 'utf8');\n            } catch (err) {\n                if (err.code === 'ENOENT') {\n                    continue;\n                }\n                throw err;\n            }\n\n            const newFileData: FileData = {\n                ...fileData,\n                fileContent: contentIncludeFile,\n                tmpInputFilePath: relativeIncludeFilePath,\n            };\n\n            nestedContributors = await getContributorsForNestedFiles(newFileData, vcsConnector);\n            vcsConnector.addNestedContributorsForPath(relativeFilePath, nestedContributors);\n        }\n\n        includesContributors.push(includeContributors.contributors);\n        includesContributors.push(nestedContributors);\n    }\n\n    return Object.assign({}, ...includesContributors);\n}\n\nfunction getRelativeIncludeFilePaths(fileData: FileData, includeContents: string[]): Set<string> {\n    const {tmpInputFilePath} = fileData;\n    const relativeIncludeFilePaths: Set<string> = new Set();\n\n    includeContents.forEach((includeContent: string) => {\n        const relativeIncludeFilePath = includeContent.match(REGEXP_INCLUDE_FILE_PATH);\n\n        if (relativeIncludeFilePath && relativeIncludeFilePath.length !== 0) {\n            const relativeIncludeFilePathWithoutHash = relativeIncludeFilePath[0].split('#');\n            const includeFilePath = join(dirname(tmpInputFilePath), relativeIncludeFilePathWithoutHash[0]);\n\n            relativeIncludeFilePaths.add(includeFilePath);\n        }\n    });\n\n    return relativeIncludeFilePaths;\n}\n\nexport {\n    getFileContributorsMetadata,\n    getFileContributorsString,\n};\n","import {join} from 'path';\n\nimport {isObject} from 'lodash';\n\nimport {ArgvService} from '../index';\nimport {IncludeMode} from '../../constants';\nimport {generic, sourcedocs, unarchive} from './batteries';\n\nimport type {\n    YfmPreset,\n    Includer,\n    YfmToc,\n    YfmTocInclude,\n    YfmTocIncluder,\n    YfmTocIncluders,\n} from '../../models';\n\nconst includersUsage = `include:\n  path: <path-where-to-include>\n  includers:\n    - name: <includer-name-0>\n      <includer-parameter>: <value-for-includer-parameter>\n    - name: <includer-name-1>\n      <includer-parameter>: <value-for-includer-parameter>\n`;\n\ntype IncludersMap = Record<string, Includer>;\n\nlet includersMap!: IncludersMap;\n\nclass IncludersError extends Error {\n    path: string;\n\n    constructor(message: string, path: string) {\n        super(message);\n\n        this.name = 'IncludersError';\n        this.path = path;\n    }\n}\n\nfunction init(custom: Includer[] = []) {\n    if (includersMap) { return; }\n\n    includersMap = {generic, sourcedocs, unarchive};\n\n    for (const includer of custom) {\n        includersMap[includer.name] = includer;\n    }\n}\n\nasync function applyIncluders(path: string, item: YfmToc, vars: YfmPreset) {\n    if (!item.include?.includers) {\n        return;\n    }\n\n    if (!includeValid(item.include)) {\n        throw new IncludersError('include doesn\\'t comply with includers standard', path);\n    }\n\n    // normalize include mode (includers support link mode only)\n    item.include.mode = IncludeMode.LINK;\n\n    const {status, message} = includersValid(item.include.includers);\n    if (!status) {\n        throw new IncludersError(message ?? '', path);\n    }\n\n    let index = 0;\n    for (const {name, ...rest} of item.include.includers) {\n        const includer = getIncluder(name);\n        const passedParams = {...rest};\n\n        await applyIncluder({path, item, includer, passedParams, index, vars});\n    }\n\n    // contract to be fullfilled by the includer:\n    // provide builder generated toc.yaml\n    item.include.path = join(item.include.path, 'toc.yaml');\n    index++;\n}\n\nfunction includeValid(include: YfmTocInclude) {\n    return (include.mode === IncludeMode.LINK || !include.mode) && include.path?.length;\n}\n\nfunction includersValid(includers: YfmTocIncluders) {\n    for (const includer of includers) {\n        const {status, message} = includerValid(includer);\n\n        if (!status) {\n            return {status, message};\n        }\n    }\n\n    return {status: true};\n}\n\nfunction includerValid(includer: YfmTocIncluder) {\n    if (isObject(includer)) {\n        if (typeof includer.name !== 'string') {\n            return {\n                status: false,\n                message: 'use string in the includer.name to specify includers name',\n            };\n        }\n\n        if (includerExists(includer)) {\n            return {status: true};\n        }\n\n        return {status: false, message: `includer ${includer.name} not implemented`};\n    }\n\n    return {\n        status: false,\n        message: `use appropriate includers format:\\n${includersUsage}`,\n    };\n}\n\nfunction getIncluder(includerName: string) {\n    return includersMap[includerName];\n}\n\nfunction includerExists(includer: YfmTocIncluder) {\n    return includersMap[includer.name as keyof typeof includersMap];\n}\n\nexport type applyIncluderParams = {\n    path: string;\n    item: YfmToc;\n    includer: Includer;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    passedParams: Record<string, any>;\n    index: number;\n    vars: YfmPreset;\n};\n\nasync function applyIncluder(args: applyIncluderParams) {\n    const {rootInput: readBasePath, input: writeBasePath} = ArgvService.getConfig();\n\n    const {path, item, includer, passedParams, index, vars} = args;\n\n    const params = {\n        tocPath: path,\n        passedParams,\n        index,\n        item,\n        readBasePath,\n        writeBasePath,\n        vars,\n    };\n\n    return await includer.includerFunction(params);\n}\n\nexport {init, applyIncluders, IncludersError};\n","import {readFile, writeFile, mkdir} from 'fs/promises';\nimport {parse, join, dirname} from 'path';\n\nimport {updateWith} from 'lodash';\nimport {dump} from 'js-yaml';\n\nimport {glob} from '../../../utils/glob';\n\nimport {IncluderFunctionParams} from '../../../models';\n\nclass GenericIncluderError extends Error {\n    path: string;\n\n    constructor(message: string, path: string) {\n        super(message);\n\n        this.name = 'GenericIncluderError';\n        this.path = path;\n    }\n}\n\nconst name = 'generic';\n\nconst MD_GLOB = '**/*.md';\n\ntype Params = {\n    input: string;\n    leadingPage: {\n        name?: string;\n    };\n};\n\nasync function includerFunction(params: IncluderFunctionParams<Params>) {\n    const {readBasePath, writeBasePath, tocPath, item, passedParams: {input, leadingPage}, index} = params;\n\n    if (!input?.length || !item.include?.path) {\n        throw new GenericIncluderError('provide includer with input parameter', tocPath);\n    }\n\n    try {\n        const leadingPageName = leadingPage?.name ?? 'Overview';\n\n        const tocDirPath = dirname(tocPath);\n\n        const contentPath = index === 0\n            ? join(writeBasePath, tocDirPath, input)\n            : join(readBasePath, tocDirPath, input);\n\n        let cache = {};\n        let found = [];\n\n        ({state: {found, cache}} = await glob(MD_GLOB, {\n            cwd: contentPath,\n            nosort: true,\n            nocase: true,\n            cache,\n        }));\n\n        const writePath = join(writeBasePath, tocDirPath, item.include.path);\n\n        await mkdir(writePath, {recursive: true});\n\n        for (const filePath of found) {\n            const file = await readFile(join(contentPath, filePath));\n\n            await mkdir(dirname(join(writePath, filePath)), {recursive: true});\n            await writeFile(join(writePath, filePath), file);\n        }\n\n        const graph = createGraphFromPaths(found);\n\n        const toc = createToc(leadingPageName, item.include.path)(graph, []);\n\n        await writeFile(join(writePath, 'toc.yaml'), dump(toc));\n    } catch (err) {\n        throw new GenericIncluderError(err.toString(), tocPath);\n    }\n}\n\nfunction createGraphFromPaths(paths: string[]) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const graph: Record<string, any> = {};\n\n    for (const path of paths) {\n        const chunks = path.split('/').filter(Boolean);\n        if (chunks.length < 2) {\n            if (chunks.length === 1) {\n                graph.files = chunks;\n            }\n\n            continue;\n        }\n\n        const file = chunks.pop();\n\n        updateWith(graph, chunks, (old) => {\n            return old ? {files: [...old.files, file]} : {files: [file]};\n        }, Object);\n    }\n\n    return graph;\n}\n\nfunction createToc(leadingPageName: string, tocName: string) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function createTocRec(graph: Record<string, any>, cursor: string[]): Record<string, any> {\n        const handler = (file: string) => ({\n            name: parse(file).name === 'index' ? leadingPageName : file,\n            href: join(...cursor, file),\n        });\n\n        const recurse = (key: string) => createTocRec(graph[key], [...cursor, key]);\n\n        const current = {\n            name: cursor[cursor.length - 1] ?? tocName,\n            items: [\n                ...(graph.files ?? []).map(handler),\n                ...Object.keys(graph)\n                    .filter((key) => key !== 'files')\n                    .map(recurse),\n            ],\n        };\n\n        return current;\n    };\n}\n\nexport {name, includerFunction};\n\nexport default {name, includerFunction};\n","import {logger} from '../../../utils/logger';\n\nimport generic from './generic';\n\nimport {IncluderFunctionParams} from '../../../models';\n\nconst name = 'sourcedocs';\n\nconst usage = `include:\n  path: <path-where-to-include>\n  includers:\n    - name: generic\n      input: <path-to-directory-with-markdown>\n      leadingPage:\n        name: <leading-page-name>\n`;\n\ntype Params = {\n    input: string;\n    leadingPage: {\n        name?: string;\n    };\n};\n\nasync function includerFunction(params: IncluderFunctionParams<Params>) {\n    logger.warn(params.tocPath, `sourcedocs inlcuder is getting depricated in favor of generic includer\\n${usage}`);\n\n    await generic.includerFunction(params);\n}\n\nexport {name, includerFunction};\n\nexport default {name, includerFunction};\n","import {mkdirSync, createReadStream, createWriteStream} from 'fs';\nimport {join, dirname} from 'path';\nimport {extract, Headers} from 'tar-stream';\n\nimport type {PassThrough} from 'stream';\n\nimport {IncluderFunctionParams} from '../../../models';\n\nconst name = 'unarchive';\n\nclass UnarchiveIncluderError extends Error {\n    path: string;\n\n    constructor(message: string, path: string) {\n        super(message);\n\n        this.name = 'UnarchiveIncluderError';\n        this.path = path;\n    }\n}\n\nfunction pipeline(readPath: string, writeBasePath: string): Promise<void> {\n    return new Promise((res, rej) => {\n        const reader = createReadStream(readPath);\n\n        reader.on('error', (err: Error) => {\n            rej(err);\n        });\n\n        const extractor = extract();\n\n        extractor.on('error', (err: Error) => {\n            rej(err);\n        });\n\n        mkdirSync(writeBasePath, {recursive: true});\n\n        extractor.on('entry', (header: Headers, stream: PassThrough, next: Function) => {\n            const {type, name} = header;\n\n            const writePath = join(writeBasePath, name);\n\n            const writeDirPath = type === 'directory' ? writePath : dirname(writePath);\n\n            mkdirSync(writeDirPath, {recursive: true});\n\n            if (type !== 'directory') {\n                const writer = createWriteStream(writePath, {flags: 'w'});\n\n                writer.on('error', (err) => {\n                    rej(err);\n                });\n\n                stream.pipe(writer);\n            }\n\n            stream.on('end', () => {\n                next();\n            });\n\n            stream.resume();\n        });\n\n        reader.pipe(extractor).on('finish', () => {\n            res();\n        });\n    });\n}\n\ntype Params = {\n    input: string;\n    output: string;\n};\n\nasync function includerFunction(params: IncluderFunctionParams<Params>) {\n    const {readBasePath, writeBasePath, tocPath, passedParams: {input, output}, index} = params;\n\n    if (!input?.length || !output?.length) {\n        throw new UnarchiveIncluderError('provide includer with input parameter', tocPath);\n    }\n\n    const contentPath = index === 0\n        ? join(writeBasePath, input)\n        : join(readBasePath, input);\n\n    const writePath = join(writeBasePath, output);\n\n    try {\n        await pipeline(contentPath, writePath);\n    } catch (err) {\n        throw new UnarchiveIncluderError(err.toString(), tocPath);\n    }\n}\n\nexport {name, includerFunction};\n\nexport default {name, includerFunction};\n","import {dirname, normalize} from 'path';\n\nimport {DocPreset, YfmPreset} from '../models';\n\nexport type PresetStorage = Map<string, YfmPreset>;\n\nlet presetStorage: PresetStorage = new Map();\n\nfunction add(parsedPreset: DocPreset, path: string, varsPreset: string) {\n    const combinedValues: YfmPreset = {\n        ...parsedPreset.default || {},\n        ...parsedPreset[varsPreset] || {},\n    };\n\n    const key = dirname(normalize(path));\n    presetStorage.set(key, combinedValues);\n}\n\nfunction get(path: string): YfmPreset {\n    let combinedValues: YfmPreset = {};\n    let localPath = normalize(path);\n\n    while (localPath !== '.') {\n        const presetValues: YfmPreset = presetStorage.get(localPath) || {};\n        localPath = dirname(localPath);\n\n        combinedValues = {\n            ...presetValues,\n            ...combinedValues,\n        };\n    }\n\n    // Add root' presets\n    combinedValues = {\n        ...presetStorage.get('.'),\n        ...combinedValues,\n    };\n\n    return combinedValues;\n}\n\nfunction getPresetStorage(): Map<string, YfmPreset> {\n    return presetStorage;\n}\n\nfunction setPresetStorage(preset: Map<string, YfmPreset>): void {\n    presetStorage = preset;\n}\n\nexport default {\n    add,\n    get,\n    getPresetStorage,\n    setPresetStorage,\n};\n","import {YfmArgv} from '../models';\nimport {join} from 'path';\nimport {readFileSync} from 'fs';\n\nlet _argv!: YfmArgv;\n\nfunction getConfig() {\n    return _argv;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction init(argv: any) {\n    _argv = {\n        ...argv,\n        ignore: Array.isArray(argv.ignore) ? argv.ignore : [],\n    } as YfmArgv;\n\n    if (argv.vars) {\n        _argv.vars = JSON.parse(argv.vars);\n    }\n\n    try {\n        const ignorefile = readFileSync(join(_argv.rootInput, '.yfmignore'), 'utf8');\n        const ignore = ignorefile.split('\\n');\n\n        _argv.ignore = _argv.ignore.concat(ignore);\n    } catch {}\n}\n\nfunction set(argv: YfmArgv) {\n    _argv = argv;\n}\n\nexport default {\n    getConfig,\n    init,\n    set,\n};\n","import {dirname, resolve} from 'path';\nimport {readFileSync, writeFileSync} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport log from '@doc-tools/transform/lib/log';\n\nimport {ArgvService, PresetService} from './index';\nimport {LeadingPage} from '../models';\nimport {filterTextItems, filterFiles, firstFilterTextItems, liquidFields, liquidField} from './utils';\n\nfunction filterFile(path: string) {\n    const {\n        input: inputFolderPath,\n        vars,\n    } = ArgvService.getConfig();\n\n    const pathToDir = dirname(path);\n    const filePath = resolve(inputFolderPath, path);\n    const content = readFileSync(filePath, 'utf8');\n    const parsedIndex = load(content) as LeadingPage;\n\n    const combinedVars = {\n        ...PresetService.get(pathToDir),\n        ...vars,\n    };\n\n    /* Should remove all links with false expressions */\n    try {\n        const title = firstFilterTextItems(\n            parsedIndex.title,\n            combinedVars,\n            {resolveConditions: true},\n        );\n        parsedIndex.title = liquidField(title, combinedVars, path);\n\n        const description = filterTextItems(\n            parsedIndex.description,\n            combinedVars,\n            {resolveConditions: true},\n        );\n        parsedIndex.description = liquidFields(description, combinedVars, path);\n\n        if (parsedIndex.meta?.title) {\n            const metaTitle = firstFilterTextItems(\n                parsedIndex.meta.title,\n                combinedVars,\n                {resolveConditions: true},\n            );\n            parsedIndex.meta.title = liquidField(metaTitle, combinedVars, path);\n        }\n\n        if (parsedIndex.meta?.description) {\n            const metaDescription = firstFilterTextItems(\n                parsedIndex.meta.description,\n                combinedVars,\n                {resolveConditions: true},\n            );\n            parsedIndex.meta.description = liquidField(metaDescription, combinedVars, path);\n        }\n\n        if (parsedIndex.nav) {\n            const navTitle = firstFilterTextItems(\n                parsedIndex.nav.title,\n                combinedVars,\n                {resolveConditions: true},\n            );\n            parsedIndex.nav.title = liquidField(navTitle, combinedVars, path);\n        }\n\n        parsedIndex.links = filterFiles(parsedIndex.links, 'links', combinedVars, {resolveConditions: true});\n\n        parsedIndex.links.forEach((link) => {\n            if (link.title) {\n                link.title = liquidField(link.title, combinedVars, path);\n            }\n            if (link.description) {\n                link.description = liquidField(link.description, combinedVars, path);\n            }\n        });\n\n        writeFileSync(filePath, dump(parsedIndex));\n    } catch (error) {\n        log.error(`Error while filtering index file: ${path}. Error message: ${error}`);\n    }\n}\n\nexport default {\n    filterFile,\n};\n","import {LintRule, LintConfig} from '@doc-tools/transform/lib/yfmlint';\n\nimport {PluginOptions, Plugin, CollectionOfPluginsFunction} from '../models';\nimport {YFM_PLUGINS} from '../constants';\n\nlet plugins: Function[] | Plugin[];\nlet collectionOfPlugins: CollectionOfPluginsFunction;\n\nexport function setPlugins(): void {\n    plugins = getAllPlugins();\n    collectionOfPlugins = makeCollectOfPlugins();\n}\n\nexport function getPlugins() {\n    return plugins;\n}\n\nexport function getCollectOfPlugins(): CollectionOfPluginsFunction {\n    return collectionOfPlugins;\n}\n\nfunction makeCollectOfPlugins(): CollectionOfPluginsFunction {\n    const pluginsWithCollect = (plugins as Plugin[]).filter((plugin: Plugin) => {\n        return typeof plugin.collect === 'function';\n    });\n\n    return (output: string, options: PluginOptions) => {\n        let collectsOutput = output;\n\n        pluginsWithCollect.forEach((plugin: Plugin) => {\n            const collectOutput = plugin.collect(collectsOutput, options);\n\n            collectsOutput = typeof collectOutput === 'string' ? collectOutput : collectsOutput;\n        });\n\n        return collectsOutput;\n    };\n}\n\nfunction getAllPlugins(): Function[] {\n    const customPlugins = getCustomPlugins();\n    return [...YFM_PLUGINS, ...customPlugins];\n}\n\nfunction getCustomPlugins(): Function[] {\n    try {\n        const customPlugins = require(require.resolve('./plugins'));\n        return Array.isArray(customPlugins) ? customPlugins : [];\n    } catch (e) {\n        return [];\n    }\n}\n\nexport function getHeadContent(): string {\n    try {\n        return require(require.resolve('./head-content.js'));\n    } catch (e) {\n        return '';\n    }\n}\n\nexport function getCustomLintRules(): LintRule[] {\n    try {\n        return require(require.resolve('./lint-rules'));\n    } catch (e) {\n        return [];\n    }\n}\n\nexport function getDefaultLintConfig(): LintConfig | undefined {\n    try {\n        return require(require.resolve('./default-lint-config'));\n    } catch (e) {\n        return undefined;\n    }\n}\n","import walkSync from 'walk-sync';\nimport shell from 'shelljs';\n\nimport client from '../../scripts/client';\nimport {ArgvService} from '../services';\nimport {copyFiles} from '../utils';\n\n/**\n * Processes assets files (everything except .yaml and .md files)\n * @param {string} outputBundlePath\n * @return {void}\n */\nexport function processAssets(outputBundlePath: string) {\n    const {\n        input: inputFolderPath,\n        output: outputFolderPath,\n    } = ArgvService.getConfig();\n\n    const assetFilePath: string[] = walkSync(inputFolderPath, {\n        directories: false,\n        includeBasePath: false,\n        ignore: [\n            '**/*.yaml',\n            '**/*.md',\n        ],\n    });\n\n    copyFiles(inputFolderPath, outputFolderPath, assetFilePath);\n\n    /* Copy js bundle to user' output folder */\n    shell.mkdir('-p', outputBundlePath);\n\n    for (const path of Object.values(client.dst)) {\n        shell.cp(path, outputBundlePath);\n    }\n}\n","import {resolve, relative} from 'path';\nimport walkSync from 'walk-sync';\nimport shell from 'shelljs';\n\nimport {ArgvService, TocService} from '../services';\nimport {convertBackSlashToSlash} from '../utils';\n\n/**\n * Removes all content files that unspecified in toc files or ignored.\n * @return {void}\n */\nexport function processExcludedFiles() {\n    const {\n        input: inputFolderPath,\n        output: outputFolderPath,\n        ignore,\n    } = ArgvService.getConfig();\n\n    const allContentFiles: string[] = walkSync(inputFolderPath, {\n        directories: false,\n        includeBasePath: true,\n        globs: [\n            '**/*.md',\n            '**/index.yaml',\n            ...ignore,\n        ],\n        // Ignores service directories like \"_includes\", \"_templates\" and etc.\n        ignore: ['**/_*/**/*'],\n    });\n    const navigationPaths = TocService.getNavigationPaths()\n        .map((filePath) => convertBackSlashToSlash(resolve(inputFolderPath, filePath)));\n    const tocSpecifiedFiles = new Set(navigationPaths);\n    const excludedFiles = allContentFiles\n        .filter((filePath) => !tocSpecifiedFiles.has(filePath));\n\n    shell.rm('-f', excludedFiles);\n\n    const includedTocPaths = TocService.getIncludedTocPaths()\n        .map((filePath) => {\n            const relativeTocPath = relative(inputFolderPath, filePath);\n            const destTocPath = resolve(outputFolderPath, relativeTocPath);\n\n            return convertBackSlashToSlash(destTocPath);\n        });\n\n    shell.rm('-rf', includedTocPaths);\n}\n","import log from '@doc-tools/transform/lib/log';\nimport _uniq from 'lodash/uniq';\n\nexport function processLogs(inputFolder: string) {\n    const replacementRegExp = new RegExp(inputFolder, 'ig');\n    const {info, warn, error} = log.get();\n    const outputLogs = _uniq([\n        '', ...info,\n        '', ...warn,\n        '', ...error,\n        '',\n    ]);\n\n    for (const outputLog of outputLogs) {\n        const preparedLog = outputLog.replace(replacementRegExp, '');\n        console.log(preparedLog);\n    }\n}\n","import type {DocInnerProps} from '@diplodoc/client';\nimport {basename, dirname, extname, resolve, join, relative} from 'path';\nimport shell from 'shelljs';\nimport {copyFileSync, readFileSync, writeFileSync} from 'fs';\nimport {bold} from 'chalk';\nimport {dump, load} from 'js-yaml';\nimport {mapLimit, asyncify} from 'async';\n\nimport log from '@doc-tools/transform/lib/log';\n\nimport {ArgvService, LeadingService, TocService, PluginService} from '../services';\nimport {resolveMd2HTML, resolveMd2Md} from '../resolvers';\nimport {generateStaticMarkup, joinSinglePageResults, logger, transformTocForSinglePage} from '../utils';\nimport {\n    MetaDataOptions,\n    SinglePageResult,\n    PathData,\n    YfmToc,\n    Resources,\n    LeadingPage,\n} from '../models';\nimport {VCSConnector} from '../vcs-connector/connector-models';\nimport {getVCSConnector} from '../vcs-connector';\nimport {\n    SINGLE_PAGE_FILENAME,\n    SINGLE_PAGE_DATA_FILENAME,\n    Lang, ResourceType,\n} from '../constants';\n\nconst singlePageResults: Record<string, SinglePageResult[]> = {};\nconst singlePagePaths: Record<string, Set<string>> = {};\n\n// Processes files of documentation (like index.yaml, *.md)\nexport async function processPages(outputBundlePath: string): Promise<void> {\n    const {\n        input: inputFolderPath,\n        output: outputFolderPath,\n        outputFormat,\n        singlePage,\n        resolveConditions,\n    } = ArgvService.getConfig();\n\n    const vcsConnector = await getVCSConnector();\n\n    PluginService.setPlugins();\n\n    const navigationPaths = TocService.getNavigationPaths();\n    const concurrency = 500;\n\n    await mapLimit(navigationPaths, concurrency, asyncify(async (pathToFile: string) => {\n        const pathData = getPathData(pathToFile, inputFolderPath, outputFolderPath, outputFormat, outputBundlePath);\n\n        logger.proc(pathToFile);\n\n        const metaDataOptions = getMetaDataOptions(pathData, inputFolderPath.length, vcsConnector);\n\n        await preparingPagesByOutputFormat(pathData, metaDataOptions, resolveConditions, singlePage);\n    }));\n\n    if (singlePage) {\n        await saveSinglePages(outputBundlePath);\n    }\n}\n\nfunction getPathData(\n    pathToFile: string,\n    inputFolderPath: string,\n    outputFolderPath: string,\n    outputFormat: string,\n    outputBundlePath: string,\n): PathData {\n    const pathToDir: string = dirname(pathToFile);\n    const filename: string = basename(pathToFile);\n    const fileExtension: string = extname(pathToFile);\n    const fileBaseName: string = basename(filename, fileExtension);\n    const outputDir = resolve(outputFolderPath, pathToDir);\n    const outputFileName = `${fileBaseName}.${outputFormat}`;\n    const outputPath = resolve(outputDir, outputFileName);\n    const resolvedPathToFile = resolve(inputFolderPath, pathToFile);\n    const outputTocDir = TocService.getTocDir(resolvedPathToFile);\n\n    const pathData: PathData = {\n        pathToFile,\n        resolvedPathToFile,\n        filename,\n        fileBaseName,\n        fileExtension,\n        outputDir,\n        outputPath,\n        outputFormat,\n        outputBundlePath,\n        outputTocDir,\n        inputFolderPath,\n        outputFolderPath,\n    };\n\n    return pathData;\n}\n\nasync function saveSinglePages(outputBundlePath: string) {\n    const {\n        input: inputFolderPath,\n        output: outputFolderPath,\n        lang,\n        resources,\n    } = ArgvService.getConfig();\n\n    try {\n        await Promise.all(Object.keys(singlePageResults).map(async (tocDir) => {\n            if (!singlePageResults[tocDir].length) {\n                return;\n            }\n\n            const singlePageBody = joinSinglePageResults(singlePageResults[tocDir], inputFolderPath, tocDir);\n            const tocPath = join(relative(inputFolderPath, tocDir), 'toc.yaml');\n            const toc: YfmToc|null = TocService.getForPath(tocPath) || null;\n            const preparedToc = transformTocForSinglePage(toc, {\n                root: inputFolderPath,\n                currentPath: join(tocDir, SINGLE_PAGE_FILENAME),\n            }) as YfmToc;\n\n            const pageData = {\n                data: {\n                    leading: false as const,\n                    html: singlePageBody,\n                    headings: [],\n                    meta: resources || {},\n                    toc: preparedToc,\n                },\n                router: {\n                    pathname: SINGLE_PAGE_FILENAME,\n                },\n                lang: lang || Lang.RU,\n            };\n\n            const outputTocDir = resolve(outputFolderPath, relative(inputFolderPath, tocDir));\n            const relativeOutputBundlePath = relative(outputTocDir, outputBundlePath);\n\n            // Save the full single page for viewing locally\n            const singlePageFn = join(tocDir, SINGLE_PAGE_FILENAME);\n            const singlePageDataFn = join(tocDir, SINGLE_PAGE_DATA_FILENAME);\n            const singlePageContent = generateStaticMarkup(pageData, relativeOutputBundlePath);\n\n            writeFileSync(singlePageFn, singlePageContent);\n            writeFileSync(singlePageDataFn, JSON.stringify(pageData));\n        }));\n    } catch (error) {\n        console.log(error);\n    }\n}\n\nfunction savePageResultForSinglePage(pageProps: DocInnerProps, pathData: PathData): void {\n    const {pathToFile, outputTocDir} = pathData;\n\n    if (pageProps.data.leading) {\n        return;\n    }\n\n    singlePagePaths[outputTocDir] = singlePagePaths[outputTocDir] || new Set();\n\n    if (singlePagePaths[outputTocDir].has(pathToFile)) {\n        return;\n    }\n\n    singlePagePaths[outputTocDir].add(pathToFile);\n\n    singlePageResults[outputTocDir] = singlePageResults[outputTocDir] || [];\n    singlePageResults[outputTocDir].push({\n        path: pathToFile,\n        content: pageProps.data.html,\n        title: pageProps.data.title,\n    });\n}\n\nfunction getMetaDataOptions(pathData: PathData, inputFolderPathLength: number, vcsConnector?: VCSConnector,\n): MetaDataOptions {\n    const {contributors, addSystemMeta, resources, allowCustomResources} = ArgvService.getConfig();\n\n    const metaDataOptions: MetaDataOptions = {\n        vcsConnector,\n        fileData: {\n            tmpInputFilePath: pathData.resolvedPathToFile,\n            inputFolderPathLength,\n            fileContent: '',\n        },\n        isContributorsEnabled: Boolean(contributors && vcsConnector),\n        addSystemMeta,\n    };\n\n\n    if (allowCustomResources && resources) {\n        const allowedResources = Object.entries(resources).reduce((acc: Resources, [key, val]) => {\n            if (Object.keys(ResourceType).includes(key)) {\n                acc[key as keyof typeof ResourceType] = val;\n            }\n            return acc;\n        }, {});\n\n        metaDataOptions.resources = allowedResources;\n    }\n\n\n    return metaDataOptions;\n}\n\nasync function preparingPagesByOutputFormat(\n    path: PathData,\n    metaDataOptions: MetaDataOptions,\n    resolveConditions: boolean,\n    singlePage: boolean,\n): Promise<void> {\n    const {\n        filename,\n        fileExtension,\n        fileBaseName,\n        outputDir,\n        resolvedPathToFile,\n        outputFormat,\n        pathToFile,\n    } = path;\n    const {allowCustomResources} = ArgvService.getConfig();\n\n    try {\n        shell.mkdir('-p', outputDir);\n\n        const isYamlFileExtension = fileExtension === '.yaml';\n\n        if (resolveConditions && fileBaseName === 'index' && isYamlFileExtension) {\n            LeadingService.filterFile(pathToFile);\n        }\n\n        if (outputFormat === 'md' && isYamlFileExtension && allowCustomResources) {\n            processingYamlFile(path, metaDataOptions);\n            return;\n        }\n\n        if (outputFormat === 'md' && isYamlFileExtension ||\n            outputFormat === 'html' && !isYamlFileExtension && fileExtension !== '.md') {\n            copyFileWithoutChanges(resolvedPathToFile, outputDir, filename);\n            return;\n        }\n\n        switch (outputFormat) {\n            case 'md':\n                await processingFileToMd(path, metaDataOptions);\n                return;\n            case 'html': {\n                const resolvedFileProps = await processingFileToHtml(path, metaDataOptions);\n\n                if (singlePage) {\n                    savePageResultForSinglePage(resolvedFileProps, path);\n                }\n\n                return;\n            }\n        }\n    } catch (e) {\n        const message = `No such file or has no access to ${bold(resolvedPathToFile)}`;\n        console.log(message, e);\n        log.error(message);\n    }\n}\n//@ts-ignore\nfunction processingYamlFile(path: PathData, metaDataOptions: MetaDataOptions) {\n    const {pathToFile, outputFolderPath, inputFolderPath} = path;\n\n    const filePath = resolve(inputFolderPath, pathToFile);\n    const content = readFileSync(filePath, 'utf8');\n    const parsedContent = load(content) as LeadingPage;\n\n    if (metaDataOptions.resources) {\n        parsedContent.meta = {...parsedContent.meta, ...metaDataOptions.resources};\n    }\n\n    writeFileSync(resolve(outputFolderPath, pathToFile), dump(parsedContent));\n}\n\nfunction copyFileWithoutChanges(resolvedPathToFile: string, outputDir: string, filename: string): void {\n    const from = resolvedPathToFile;\n    const to = resolve(outputDir, filename);\n\n    copyFileSync(from, to);\n}\n\nasync function processingFileToMd(path: PathData, metaDataOptions: MetaDataOptions): Promise<void> {\n    const {outputPath, pathToFile} = path;\n\n    await resolveMd2Md({\n        inputPath: pathToFile,\n        outputPath,\n        metadata: metaDataOptions,\n    });\n}\n\nasync function processingFileToHtml(path: PathData, metaDataOptions: MetaDataOptions): Promise<DocInnerProps> {\n    const {\n        outputBundlePath,\n        filename,\n        fileExtension,\n        outputPath,\n        pathToFile,\n    } = path;\n\n    return resolveMd2HTML({\n        inputPath: pathToFile,\n        outputBundlePath,\n        fileExtension,\n        outputPath,\n        filename,\n        metadata: metaDataOptions,\n    });\n}\n","import {existsSync, readFileSync, writeFileSync} from 'fs';\nimport {dirname, resolve, join, basename, extname} from 'path';\nimport shell from 'shelljs';\nimport log from '@doc-tools/transform/lib/log';\nimport liquid from '@doc-tools/transform/lib/liquid';\n\nimport {ArgvService, PluginService} from '../services';\nimport {logger, getVarsPerFile} from '../utils';\nimport {PluginOptions, ResolveMd2MdOptions} from '../models';\nimport {PROCESSING_FINISHED} from '../constants';\nimport {getContentWithUpdatedMetadata} from '../services/metadata';\nimport {ChangelogItem} from '@doc-tools/transform/lib/plugins/changelog/types';\n\nexport async function resolveMd2Md(options: ResolveMd2MdOptions): Promise<void> {\n    const {inputPath, outputPath, metadata} = options;\n    const {input, output} = ArgvService.getConfig();\n    const resolvedInputPath = resolve(input, inputPath);\n    const vars = getVarsPerFile(inputPath);\n\n    const content = await getContentWithUpdatedMetadata(\n        readFileSync(resolvedInputPath, 'utf8'),\n        metadata,\n        vars.__system,\n    );\n\n    const {result, changelogs} = transformMd2Md(content, {\n        path: resolvedInputPath,\n        destPath: outputPath,\n        root: resolve(input),\n        destRoot: resolve(output),\n        collectOfPlugins: PluginService.getCollectOfPlugins(),\n        vars,\n        log,\n        copyFile,\n    });\n\n    writeFileSync(outputPath, result);\n\n    if (changelogs?.length) {\n        const mdFilename = basename(outputPath, extname(outputPath));\n        const outputDir = dirname(outputPath);\n        changelogs.forEach((changes, index) => {\n            let changesName;\n            const changesDate = changes.date as string | undefined;\n            const changesIdx = changes.index as number | undefined;\n            if (typeof changesIdx === 'number') {\n                changesName = String(changesIdx);\n            }\n            if (!changesName && changesDate && /^\\d{4}/.test(changesDate)) {\n                changesName = Math.trunc(new Date(changesDate).getTime() / 1000);\n            }\n            if (!changesName) {\n                changesName = `name-${mdFilename}-${String(changelogs.length - index).padStart(3, '0')}`;\n            }\n\n            const changesPath = join(outputDir, `changes-${changesName}.json`);\n\n            if (existsSync(changesPath)) {\n                throw new Error(`Changelog ${changesPath} already exists!`);\n            }\n\n            writeFileSync(changesPath, JSON.stringify({\n                ...changes,\n                source: mdFilename,\n            }));\n        });\n    }\n\n    logger.info(inputPath, PROCESSING_FINISHED);\n\n    return undefined;\n}\n\nfunction copyFile(targetPath: string, targetDestPath: string, options?: PluginOptions) {\n    shell.mkdir('-p', dirname(targetDestPath));\n\n    if (options) {\n        const sourceIncludeContent = readFileSync(targetPath, 'utf8');\n        const {result} = transformMd2Md(sourceIncludeContent, options);\n\n        writeFileSync(targetDestPath, result);\n    } else {\n        shell.cp(targetPath, targetDestPath);\n    }\n}\n\nexport function liquidMd2Md(input: string, vars: Record<string, unknown>, path: string) {\n    const {\n        applyPresets,\n        resolveConditions,\n        conditionsInCode,\n    } = ArgvService.getConfig();\n\n    return liquid(input, vars, path, {\n        conditions: resolveConditions,\n        substitutions: applyPresets,\n        conditionsInCode,\n        withSourceMap: true,\n        keepNotVar: true,\n    });\n}\n\nfunction transformMd2Md(input: string, options: PluginOptions) {\n    const {\n        disableLiquid,\n    } = ArgvService.getConfig();\n    const {\n        vars = {},\n        path,\n        root,\n        destPath,\n        destRoot,\n        collectOfPlugins,\n        log: pluginLog,\n        copyFile: pluginCopyFile,\n    } = options;\n\n    let output = input;\n    const changelogs: ChangelogItem[] = [];\n\n    if (!disableLiquid) {\n        const liquidResult = liquidMd2Md(input, vars, path);\n\n        output = liquidResult.output;\n    }\n\n    if (collectOfPlugins) {\n        output = collectOfPlugins(output, {\n            vars,\n            path,\n            root,\n            destPath,\n            destRoot,\n            log: pluginLog,\n            copyFile: pluginCopyFile,\n            collectOfPlugins,\n            changelogs,\n            extractChangelogs: true,\n        });\n    }\n\n    return {\n        result: output,\n        changelogs,\n        logs: pluginLog.get(),\n    };\n}\n","import {basename, dirname, join, relative, resolve, sep} from 'path';\nimport {readFileSync, writeFileSync} from 'fs';\nimport yaml from 'js-yaml';\n\nimport transform, {Output} from '@doc-tools/transform';\nimport log from '@doc-tools/transform/lib/log';\nimport liquid from '@doc-tools/transform/lib/liquid';\n\nimport {ResolverOptions, YfmToc, ResolveMd2HTMLResult, LeadingPage} from '../models';\nimport {ArgvService, TocService, PluginService} from '../services';\nimport {generateStaticMarkup, logger, transformToc, getVarsPerFile, getVarsPerRelativeFile} from '../utils';\nimport {PROCESSING_FINISHED, Lang} from '../constants';\nimport {getAssetsPublicPath, getUpdatedMetadata} from '../services/metadata';\nimport {MarkdownItPluginCb} from '@doc-tools/transform/lib/plugins/typings';\n\nexport interface FileTransformOptions {\n    path: string;\n    root?: string;\n}\n\nconst FileTransformer: Record<string, Function> = {\n    '.yaml': YamlFileTransformer,\n    '.md': MdFileTransformer,\n};\n\nconst fixRelativePath = (relativeTo: string) => (path: string) => {\n    return join(getAssetsPublicPath(relativeTo), path);\n};\n\nexport async function resolveMd2HTML(options: ResolverOptions): Promise<ResolveMd2HTMLResult> {\n    const {inputPath, fileExtension, outputPath, outputBundlePath, metadata} = options;\n\n    const pathToDir: string = dirname(inputPath);\n    const toc: YfmToc|null = TocService.getForPath(inputPath) || null;\n    const tocBase: string = toc && toc.base ? toc.base : '';\n    const pathToFileDir: string = pathToDir === tocBase ? '' : pathToDir.replace(`${tocBase}${sep}`, '');\n    const relativePathToIndex = relative(pathToDir, `${tocBase}${sep}`);\n\n    const {input, lang, allowCustomResources} = ArgvService.getConfig();\n    const resolvedPath: string = resolve(input, inputPath);\n    const content: string = readFileSync(resolvedPath, 'utf8');\n\n    const transformFn: Function = FileTransformer[fileExtension];\n    const {result} = transformFn(content, {path: inputPath});\n\n    const updatedMetadata = metadata && metadata.isContributorsEnabled\n        ? await getUpdatedMetadata(metadata, content, result?.meta)\n        : result.meta;\n\n    const fileMeta = fileExtension === '.yaml' ? (result.data.meta ?? {}) : updatedMetadata;\n\n    if (allowCustomResources) {\n        const {script, style} = metadata?.resources || {};\n        fileMeta.style = (fileMeta.style || []).concat(style || [])\n            .map(fixRelativePath(inputPath));\n        fileMeta.script = (fileMeta.script || []).concat(script || [])\n            .map(fixRelativePath(inputPath));\n    } else {\n        fileMeta.style = [];\n        fileMeta.script = [];\n    }\n\n    const props = {\n        data: {\n            leading: inputPath.endsWith('.yaml'),\n            toc: transformToc(toc, pathToDir) || {},\n            ...result,\n            meta: fileMeta,\n        },\n        router: {\n            pathname: join(relativePathToIndex, pathToFileDir, basename(outputPath)),\n        },\n        lang: lang || Lang.RU,\n    };\n\n    const outputDir = dirname(outputPath);\n    const relativePathToBundle: string = relative(resolve(outputDir), resolve(outputBundlePath));\n\n    const outputFileContent = generateStaticMarkup(props, relativePathToBundle);\n    writeFileSync(outputPath, outputFileContent);\n    logger.info(inputPath, PROCESSING_FINISHED);\n\n    return props;\n}\n\nfunction YamlFileTransformer(content: string): Object {\n    let data: LeadingPage | null = null;\n\n    try {\n        data = yaml.load(content) as LeadingPage;\n    } catch (error) {\n        log.error(`Yaml transform has been failed. Error: ${error}`);\n    }\n\n    if (!data) {\n        return {\n            result: {data: {}},\n        };\n    }\n\n    const links = data?.links?.map(\n        (link) =>\n            link.href ? ({...link, href: link.href.replace(/.md$/gmu, '.html')}) : link,\n    );\n\n    if (links) { data.links = links; }\n\n    return {\n        result: {data},\n    };\n}\n\nexport function liquidMd2Html(input: string, vars: Record<string, unknown>, path: string) {\n    const {conditionsInCode} = ArgvService.getConfig();\n\n    return liquid(input, vars, path, {\n        conditionsInCode,\n        withSourceMap: true,\n    });\n}\n\nfunction MdFileTransformer(content: string, transformOptions: FileTransformOptions): Output {\n    const {input, ...options} = ArgvService.getConfig();\n    const {path: filePath} = transformOptions;\n\n    const plugins = PluginService.getPlugins();\n    const vars = getVarsPerFile(filePath);\n    const root = resolve(input);\n    const path: string = resolve(input, filePath);\n\n\n    return transform(content, {\n        ...options,\n        plugins: plugins as MarkdownItPluginCb<unknown>[],\n        vars,\n        root,\n        path,\n        assetsPublicPath: getAssetsPublicPath(filePath),\n        getVarsPerFile: getVarsPerRelativeFile,\n        extractTitle: true,\n    });\n}\n","import {dirname, relative, resolve} from 'path';\nimport log from '@doc-tools/transform/lib/log';\nimport {\n    default as yfmlint,\n    LintMarkdownFunctionOptions,\n    PluginOptions,\n} from '@doc-tools/transform/lib/yfmlint';\nimport {readFileSync} from 'fs';\nimport {bold} from 'chalk';\n\nimport {ArgvService, PluginService} from '../services';\nimport {getVarsPerFile, getVarsPerRelativeFile} from '../utils';\nimport {liquidMd2Html} from './md2html';\nimport {liquidMd2Md} from './md2md';\n\ninterface FileTransformOptions {\n    path: string;\n    root?: string;\n}\n\nconst FileLinter: Record<string, Function> = {\n    '.md': MdFileLinter,\n};\n\nexport interface ResolverLintOptions {\n    inputPath: string;\n    fileExtension: string;\n    onFinish?: () => void;\n}\n\nexport function lintPage(options: ResolverLintOptions) {\n    const {inputPath, fileExtension, onFinish} = options;\n    const {input} = ArgvService.getConfig();\n    const resolvedPath: string = resolve(input, inputPath);\n\n    try {\n        const content: string = readFileSync(resolvedPath, 'utf8');\n\n        const lintFn: Function = FileLinter[fileExtension];\n        if (!lintFn) {\n            return;\n        }\n\n        lintFn(content, {path: inputPath});\n    } catch (e) {\n        const message = `No such file or has no access to ${bold(resolvedPath)}`;\n        console.error(message, e);\n        log.error(message);\n    }\n\n    if (onFinish) {\n        onFinish();\n    }\n}\n\nfunction MdFileLinter(content: string, lintOptions: FileTransformOptions): void {\n    const {\n        input,\n        lintConfig,\n        disableLiquid,\n        outputFormat,\n        ...options\n    } = ArgvService.getConfig();\n    const {path: filePath} = lintOptions;\n\n    const plugins = outputFormat === 'md' ? [] : PluginService.getPlugins();\n    const vars = getVarsPerFile(filePath);\n    const root = resolve(input);\n    const path: string = resolve(input, filePath);\n    let preparedContent = content;\n\n    /* Relative path from folder of .md file to root of user' output folder */\n    const assetsPublicPath = relative(dirname(path), root);\n\n    const lintMarkdown = function lintMarkdown(opts: LintMarkdownFunctionOptions) {\n        const {input: localInput, path: localPath, sourceMap} = opts;\n\n        const pluginOptions: PluginOptions = {\n            ...options,\n            vars,\n            root,\n            path: localPath,\n            lintMarkdown, // Should pass the function for linting included files\n            assetsPublicPath,\n            disableLiquid,\n            log,\n            getVarsPerFile: getVarsPerRelativeFile,\n        };\n\n        yfmlint({\n            input: localInput,\n            lintConfig,\n            pluginOptions,\n            plugins,\n            defaultLintConfig: PluginService.getDefaultLintConfig(),\n            customLintRules: PluginService.getCustomLintRules(),\n            sourceMap,\n        });\n    };\n\n    let sourceMap;\n    if (!disableLiquid) {\n        let liquidResult;\n        if (outputFormat === 'md') {\n            liquidResult = liquidMd2Md(content, vars, path);\n        } else {\n            liquidResult = liquidMd2Html(content, vars, path);\n        }\n\n        preparedContent = liquidResult.output;\n        sourceMap = liquidResult.sourceMap;\n    }\n\n    lintMarkdown({\n        input: preparedContent,\n        path,\n        sourceMap,\n    });\n}\n","import {Octokit} from '@octokit/core';\nimport {join, normalize} from 'path';\nimport simpleGit, {SimpleGitOptions} from 'simple-git';\nimport {minimatch} from 'minimatch';\n\nimport github from './client/github';\nimport {ArgvService} from '../services';\nimport {\n    CommitInfo,\n    Contributor,\n    Contributors,\n    ContributorsByPathFunction,\n    ExternalAuthorByPathFunction,\n    NestedContributorsForPathFunction,\n} from '../models';\nimport {\n    FileContributors,\n    GitHubConnectorFields,\n    SourceType,\n    VCSConnector,\n} from './connector-models';\nimport {\n    ALL_CONTRIBUTORS_RECEIVED,\n    FIRST_COMMIT_FROM_ROBOT_IN_GITHUB,\n    GETTING_ALL_CONTRIBUTORS,\n} from '../constants';\nimport {addSlashPrefix, logger} from '../utils';\nimport {validateConnectorFields} from './connector-validator';\nimport process from 'process';\n\nconst authorByGitEmail: Map<string, Contributor | null> = new Map();\nconst authorByPath: Map<string, Contributor | null> = new Map();\nconst contributorsByPath: Map<string, FileContributors> = new Map();\nconst contributorsData: Map<string, Contributor | null> = new Map();\n\nasync function getGitHubVCSConnector(): Promise<VCSConnector | undefined> {\n    const {contributors} = ArgvService.getConfig();\n\n    const httpClientByToken = getHttpClientByToken();\n    if (!httpClientByToken) {\n        return undefined;\n    }\n\n    let addNestedContributorsForPath: NestedContributorsForPathFunction = () => { };\n    let getContributorsByPath: ContributorsByPathFunction = () => Promise.resolve({} as FileContributors);\n    const getExternalAuthorByPath: ExternalAuthorByPathFunction = (path: string) => authorByPath.get(path) ?? null;\n\n    if (contributors) {\n        await getAllContributorsTocFiles(httpClientByToken);\n        addNestedContributorsForPath = (path: string, nestedContributors: Contributors) =>\n            addNestedContributorsForPathFunction(path, nestedContributors);\n        getContributorsByPath = async (path: string) => getFileContributorsByPath(path);\n    }\n\n    return {\n        getExternalAuthorByPath,\n        addNestedContributorsForPath,\n        getContributorsByPath,\n        getUserByLogin: (login: string) => getUserByLogin(httpClientByToken, login),\n    };\n}\n\nfunction getHttpClientByToken(): Octokit | null {\n    const {connector, contributors} = ArgvService.getConfig();\n\n    if (!contributors) {\n        return null;\n    }\n\n    const neededProperties = [GitHubConnectorFields.TOKEN, GitHubConnectorFields.ENDPOINT];\n    const validatedFileds = validateConnectorFields(SourceType.GITHUB, neededProperties, connector);\n\n    if (Object.keys(validatedFileds).length === 0) {\n        return null;\n    }\n\n    const octokit = new Octokit({\n        auth: validatedFileds[GitHubConnectorFields.TOKEN] as string,\n        baseUrl: validatedFileds[GitHubConnectorFields.ENDPOINT] as string,\n    });\n\n    return octokit;\n}\n\nasync function getAllContributorsTocFiles(httpClientByToken: Octokit): Promise<void> {\n    const {rootInput} = ArgvService.getConfig();\n\n    const options: Partial<SimpleGitOptions> = {\n        baseDir: rootInput,\n    };\n\n    logger.info('', GETTING_ALL_CONTRIBUTORS);\n\n    const masterDir = './_yfm-master';\n    const tmpMasterBranch = 'yfm-tmp-master';\n\n    try {\n        await simpleGit(options).raw('worktree', 'add', '-b', tmpMasterBranch, masterDir, 'origin/master');\n        const fullRepoLogString = await simpleGit({\n            baseDir: join(rootInput, masterDir),\n        }).raw(\n            'log',\n            `${FIRST_COMMIT_FROM_ROBOT_IN_GITHUB}..HEAD`,\n            '--pretty=format:%ae, %an, %H',\n            '--name-only',\n        );\n        const repoLogs = fullRepoLogString.split('\\n\\n');\n        if (process.env.ENABLE_EXPERIMANTAL_AUTHORS) {\n            const fullAuthorRepoLogString = await simpleGit({\n                baseDir: join(rootInput, masterDir),\n            }).raw(\n                'log',\n                `${FIRST_COMMIT_FROM_ROBOT_IN_GITHUB}..HEAD`,\n                '--diff-filter=A',\n                '--pretty=format:%ae;%an;%H',\n                '--name-only',\n            );\n            const authorRepoLog = fullAuthorRepoLogString.split('\\n\\n');\n            await matchAuthorsForEachPath(authorRepoLog, httpClientByToken);\n        }\n        await matchContributionsForEachPath(repoLogs, httpClientByToken);\n    } finally {\n        await simpleGit(options).raw('worktree', 'remove', masterDir);\n        await simpleGit(options).raw('branch', '-d', tmpMasterBranch);\n    }\n\n    logger.info('', ALL_CONTRIBUTORS_RECEIVED);\n}\n\nasync function matchContributionsForEachPath(repoLogs: string[], httpClientByToken: Octokit): Promise<void> {\n\n    for (const repoLog of repoLogs) {\n        if (!repoLog) {\n            continue;\n        }\n\n        const dataArray = repoLog.split('\\n');\n        const userData = dataArray[0];\n        const [email, name, hashCommit] = userData.split(', ');\n\n        if (shouldAuthorBeIgnored({email, name})) {\n            continue;\n        }\n\n        const hasContributorData = contributorsData.get(email);\n\n        let contributorDataByHash;\n\n        if (hasContributorData === undefined) {\n            logger.info('Contributors: Getting data for', email);\n\n            contributorDataByHash = await getContributorDataByHashCommit(httpClientByToken, hashCommit);\n\n            if (contributorDataByHash) {\n                const paths = dataArray.splice(1);\n                addContributorForPath(paths, {\n                    [email]: contributorDataByHash,\n                });\n            }\n            contributorsData.set(email, contributorDataByHash);\n        } else if (hasContributorData) {\n            const paths = dataArray.splice(1);\n            addContributorForPath(paths, {\n                [email]: hasContributorData,\n            });\n        }\n    }\n}\n\nasync function matchAuthorsForEachPath(authorRepoLogs: string[], httpClientByToken: Octokit) {\n    for (const repoLog of authorRepoLogs) {\n        if (!repoLog) {\n            continue;\n        }\n\n        const dataArray = repoLog.split('\\n');\n        const [userData, ...paths] = dataArray;\n        const [email, name, hashCommit] = userData.split(';');\n\n        if (shouldAuthorBeIgnored({email, name})) {\n            continue;\n        }\n\n        await getAuthorByPaths({email, hashCommit}, paths, httpClientByToken);\n    }\n}\n\nasync function getContributorDataByHashCommit(httpClientByToken: Octokit, hashCommit: string,\n): Promise<Contributor | null> {\n    const repoCommit = await github.getRepoCommitByHash(httpClientByToken, hashCommit);\n\n    if (!repoCommit) {\n        return null;\n    }\n\n    const {author, commit} = repoCommit;\n\n    if (!author) {\n        return null;\n    }\n\n    const {avatar_url: avatar, html_url: url, login} = author;\n\n    return {\n        avatar,\n        email: commit.author.email,\n        login,\n        name: commit.author.name,\n        url,\n    };\n}\n\nasync function getAuthorByPaths(commitInfo: CommitInfo, paths: string[], httpClientByToken: Octokit) {\n    for (const path of paths) {\n        if (!path) {\n            continue;\n        }\n        const normalizePath = normalize(addSlashPrefix(path));\n        const {email, hashCommit} = commitInfo;\n\n        let authorToReturn = authorByGitEmail.get(email) || null;\n\n        if (!authorToReturn) {\n            logger.info('Authors: Getting data for', email);\n\n            const repoCommit = await github.getRepoCommitByHash(httpClientByToken, hashCommit);\n            if (!repoCommit) {\n                continue;\n            }\n\n            const {author, commit} = repoCommit;\n            if (!author) {\n                continue;\n            }\n\n            const {avatar_url: avatar, html_url: url, login} = author;\n            authorToReturn = {\n                avatar,\n                email: commit.author.email,\n                login,\n                name: commit.author.name,\n                url,\n            };\n            authorByGitEmail.set(email, authorToReturn);\n        }\n\n        authorByPath.set(normalizePath, authorToReturn);\n    }\n}\n\nasync function getFileContributorsByPath(path: string): Promise<FileContributors> {\n    if (contributorsData.size === 0 || !contributorsByPath.has(path)) {\n        return {} as FileContributors;\n    }\n\n    return contributorsByPath.get(path) as FileContributors;\n}\n\nasync function getUserByLogin(octokit: Octokit, userLogin: string): Promise<Contributor | null> {\n    const user = await github.getRepoUser(octokit, userLogin);\n\n    if (!user) {\n        return null;\n    }\n\n    const {avatar_url: avatar, html_url: url, email, login, name} = user;\n\n    return {\n        avatar,\n        email,\n        login,\n        name,\n        url,\n    };\n}\n\nfunction addNestedContributorsForPathFunction(path: string, nestedContributors: Contributors): void {\n    addContributorForPath([path], nestedContributors, true);\n}\n\nfunction addContributorForPath(paths: string[], newContributor: Contributors, hasIncludes = false): void {\n    paths.forEach((path: string) => {\n        const normalizePath = normalize(addSlashPrefix(path));\n\n        if (!contributorsByPath.has(normalizePath)) {\n            contributorsByPath.set(normalizePath, {\n                contributors: newContributor,\n                hasIncludes,\n            });\n            return;\n        }\n\n        const oldContributors = contributorsByPath.get(normalizePath);\n\n        contributorsByPath.set(normalizePath, {\n            contributors: {\n                ...oldContributors?.contributors,\n                ...newContributor,\n            },\n            hasIncludes,\n        });\n    });\n}\n\ntype ShouldAuthorBeIgnoredArgs = {\n    email?: string;\n    name?: string;\n};\n\nfunction shouldAuthorBeIgnored({email, name}: ShouldAuthorBeIgnoredArgs) {\n    if (!(email || name)) {\n        return false;\n    }\n\n    const {ignoreAuthorPatterns} = ArgvService.getConfig();\n    if (!ignoreAuthorPatterns) {\n        return false;\n    }\n\n    for (const pattern of ignoreAuthorPatterns) {\n        if (email && minimatch(email, pattern)) {\n            return true;\n        }\n\n        if (name && minimatch(name, pattern)) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nexport default getGitHubVCSConnector;\n","import log from '@doc-tools/transform/lib/log';\nimport {Octokit} from '@octokit/core';\nimport {ArgvService} from '../../services';\nimport {\n    GithubCommitDTO,\n    GitHubConnectorFields,\n    SourceType,\n    GithubUserDTO,\n} from '../connector-models';\nimport {validateConnectorFields} from '../connector-validator';\n\nasync function getRepoUser(octokit: Octokit, username: string): Promise<GithubUserDTO | null> {\n    try {\n        const user = await octokit.request('GET /users/{username}', {\n            username,\n        });\n\n        return user.data as GithubUserDTO;\n    } catch (error) {\n        log.warn(`Getting user for GitHub has been failed. Username: ${username}. Error: ${error}`);\n        return null;\n    }\n}\n\nasync function getRepoCommitByHash(httpClientByToken: Octokit, hashCommit: string): Promise<GithubCommitDTO | null> {\n    const {connector} = ArgvService.getConfig();\n\n    const neededProperties = [GitHubConnectorFields.OWNER, GitHubConnectorFields.REPO];\n    const validatedFileds = validateConnectorFields(SourceType.GITHUB, neededProperties, connector);\n\n    if (Object.keys(validatedFileds).length === 0) {\n        return null;\n    }\n\n    try {\n        const commit = await httpClientByToken.request('GET /repos/{owner}/{repo}/commits/{commit_sha}', {\n            owner: validatedFileds[GitHubConnectorFields.OWNER] as string,\n            repo: validatedFileds[GitHubConnectorFields.REPO] as string,\n            commit_sha: hashCommit,\n        });\n\n        return commit.data;\n    } catch (error) {\n        log.warn(`Getting commit by sha has been failed for GitHub. SHA commit: ${hashCommit}. Error: ${error}`);\n        return null;\n    }\n}\n\nexport default {\n    getRepoUser,\n    getRepoCommitByHash,\n};\n","import log from '@doc-tools/transform/lib/log';\nimport {ConnectorValidatorProps, GitHubConnectorFields, SourceType, VCSConnectorConfig} from './connector-models';\nimport {getMsgСonfigurationMustBeProvided} from '../constants';\n\nconst githubConnectorValidator: Record<string, ConnectorValidatorProps> = {\n    [GitHubConnectorFields.ENDPOINT]: {\n        warnMessage: `'${GitHubConnectorFields.ENDPOINT}' must be provided for GitHub repo.`,\n        validateFn: notEmptyValue,\n        defaultValue: process.env.GITHUB_BASE_URL,\n    },\n    [GitHubConnectorFields.TOKEN]: {\n        warnMessage: `'${GitHubConnectorFields.TOKEN}' must be provided for GitHub repo.`,\n        validateFn: notEmptyValue,\n        defaultValue: process.env.GITHUB_TOKEN,\n    },\n    [GitHubConnectorFields.OWNER]: {\n        warnMessage: `'${GitHubConnectorFields.OWNER}' must be provided for GitHub repo.`,\n        validateFn: notEmptyValue,\n        defaultValue: process.env.GITHUB_OWNER,\n    },\n    [GitHubConnectorFields.REPO]: {\n        warnMessage: `'${GitHubConnectorFields.REPO}' must be provided for GitHub repo.`,\n        validateFn: notEmptyValue,\n        defaultValue: process.env.GITHUB_REPO,\n    },\n};\n\nconst connectorValidator: Record<string, ConnectorValidatorProps> = {\n    'type': {\n        warnMessage: '\\'type\\' must be provided for repo.',\n        validateFn: notEmptyValue,\n    },\n    [SourceType.GITHUB]: {\n        warnMessage: `'${SourceType.GITHUB}' object must be filled needed fields.`,\n        validateFn: notEmptyObject,\n        relatedValidator: githubConnectorValidator,\n    },\n};\n\nfunction notEmptyObject(filed?: unknown): boolean {\n    if (typeof filed === 'object') {\n        return Boolean(filed && Object.getOwnPropertyNames(filed).length);\n    }\n\n    return false;\n}\n\nfunction notEmptyValue(value?: unknown): boolean {\n    if (typeof value === 'string') {\n        return Boolean(value);\n    }\n\n    return false;\n}\n\nexport function validateConnectorFields(\n    sourceType: SourceType,\n    fieldNames: GitHubConnectorFields[],\n    repoProperties?: VCSConnectorConfig): Record<string, unknown> {\n\n    const repoValidator = connectorValidator[sourceType];\n\n    if (!repoValidator) {\n        log.error(`Invalid repo type: ${repoValidator}`);\n        return {};\n    }\n\n    const isValidRepo = repoValidator.validateFn(repoProperties && repoProperties[sourceType]);\n    const relatedRepoValidator = repoValidator.relatedValidator;\n    if (!repoProperties || !isValidRepo || !relatedRepoValidator) {\n        createLog(repoValidator);\n        return {};\n    }\n\n    let isValidProperties = true;\n    const validatedFields: Record<string, unknown> = {};\n\n    for (const property of fieldNames) {\n        const propertyValidator = relatedRepoValidator[property];\n\n        if (!propertyValidator) {\n            log.warn(`The property '${property}' doesn't exist in ${sourceType} repo.`);\n            continue;\n        }\n\n        const propertyValue = propertyValidator.defaultValue || repoProperties[sourceType]?.[property];\n\n        if (!propertyValidator.validateFn(propertyValue)) {\n            createLog(propertyValidator);\n            isValidProperties = false;\n        }\n\n        validatedFields[property] = propertyValue;\n    }\n\n    if (isValidProperties) {\n        return validatedFields;\n    }\n\n    log.warn(getMsgСonfigurationMustBeProvided(sourceType));\n    return {};\n}\n\nfunction createLog(validator: ConnectorValidatorProps): void {\n    if (validator.errorMessage) {\n        return log.error(validator.errorMessage);\n    }\n\n    if (validator.warnMessage) {\n        return log.warn(validator.warnMessage);\n    }\n\n    throw new Error(`Invalid validator: ${JSON.stringify(validator)}.`);\n}\n","import {ArgvService} from '../services';\nimport getGitHubVCSConnector from './github';\nimport {VCSConnector, SourceType} from './connector-models';\n\nexport async function getVCSConnector(): Promise<VCSConnector | undefined> {\n    const {connector} = ArgvService.getConfig();\n    const connectorType = process.env.VCS_CONNECTOR_TYPE || connector && connector.type;\n\n    switch (connectorType) {\n        case SourceType.GITHUB:\n            return getGitHubVCSConnector();\n        default:\n            return undefined;\n    }\n}\n","import log from '@doc-tools/transform/lib/log';\nimport {spawn, Worker, Thread} from 'threads';\nimport {extname} from 'path';\n\nimport {ArgvService, TocService, PresetService, PluginService} from '../services';\nimport {ProcessLinterWorker} from '../workers/linter';\nimport {logger} from '../utils';\nimport {LINTING_FINISHED, WORKERS_COUNT, MIN_CHUNK_SIZE} from '../constants';\nimport {lintPage} from '../resolvers';\nimport {splitOnChunks} from '../utils/worker';\n\nlet processLinterWorkers: (ProcessLinterWorker & Thread)[];\nlet navigationPathsChunks: (string[])[];\n\nexport async function processLinter(): Promise<void> {\n    const argvConfig = ArgvService.getConfig();\n\n    const navigationPaths = TocService.getNavigationPaths();\n\n    if (!processLinterWorkers) {\n        lintPagesFallback(navigationPaths);\n\n        return;\n    }\n\n    const presetStorage = PresetService.getPresetStorage();\n\n    /* Subscribe on the linted page event */\n    processLinterWorkers.forEach((worker) => {\n        worker.getProcessedPages().subscribe((pathToFile) => {\n            logger.info(pathToFile as string, LINTING_FINISHED);\n        });\n    });\n\n    /* Run processing the linter */\n    await Promise.all(\n        processLinterWorkers.map((worker, i) => {\n            const navigationPathsChunk = navigationPathsChunks[i];\n\n            return worker.run({\n                argvConfig,\n                presetStorage,\n                navigationPaths: navigationPathsChunk,\n            });\n        }),\n    );\n\n    /* Unsubscribe from workers */\n    await Promise.all(\n        processLinterWorkers.map((worker) => {\n            return worker.finish().then((logs) => {\n                log.add(logs);\n            });\n        }),\n    );\n\n    /* Terminate workers */\n    await Promise.all(\n        processLinterWorkers.map((worker) => {\n            return Thread.terminate(worker);\n        }),\n    );\n}\n\nexport async function initLinterWorkers() {\n    const navigationPaths = TocService.getNavigationPaths();\n    const chunkSize = getChunkSize(navigationPaths);\n\n    if (process.env.DISABLE_PARALLEL_BUILD || chunkSize < MIN_CHUNK_SIZE || WORKERS_COUNT <= 0) {\n        return;\n    }\n\n    navigationPathsChunks = splitOnChunks(navigationPaths, chunkSize)\n        .filter((arr) => arr.length);\n\n    const workersCount = navigationPathsChunks.length;\n\n    processLinterWorkers = await Promise.all((new Array(workersCount)).fill(null).map(() => {\n        // TODO: get linter path from env\n        return spawn<ProcessLinterWorker>(new Worker('./linter'), {timeout: 60000});\n    }));\n}\n\nfunction getChunkSize(arr: string[]) {\n    return Math.ceil(arr.length / WORKERS_COUNT);\n}\n\nfunction lintPagesFallback(navigationPaths: string[]) {\n    PluginService.setPlugins();\n\n    navigationPaths.forEach((pathToFile) => {\n        lintPage({\n            inputPath: pathToFile,\n            fileExtension: extname(pathToFile),\n            onFinish: () => {\n                logger.info(pathToFile, LINTING_FINISHED);\n            },\n        });\n    });\n}\n","export function splitOnChunks<T>(array: T[], chunkSize = 1000) {\n    const chunks: (T[])[] = [];\n\n    for (let i = 0, j = array.length; i < j; i += chunkSize) {\n        const chunk: T[] = array.slice(i, i + chunkSize);\n        chunks.push(chunk);\n    }\n\n    return chunks;\n}\n","import {dirname, resolve} from 'path';\nimport walkSync from 'walk-sync';\nimport {readFileSync, writeFileSync} from 'fs';\nimport {load, dump} from 'js-yaml';\nimport log from '@doc-tools/transform/lib/log';\n\nimport {ArgvService, PresetService, TocService} from '../services';\nimport {logger} from '../utils';\nimport {DocPreset} from '../models';\nimport shell from 'shelljs';\n\ntype GetFilePathsByGlobalsFunction = (globs: string[]) => string[];\n\nexport async function processServiceFiles(): Promise<void> {\n    const {input: inputFolderPath, ignore = []} = ArgvService.getConfig();\n\n    const getFilePathsByGlobals = (globs: string[]): string[] => {\n        return walkSync(inputFolderPath, {\n            directories: false,\n            includeBasePath: false,\n            globs,\n            ignore,\n        });\n    };\n\n    preparingPresetFiles(getFilePathsByGlobals);\n    await preparingTocFiles(getFilePathsByGlobals);\n}\n\nfunction preparingPresetFiles(getFilePathsByGlobals: GetFilePathsByGlobalsFunction): void {\n    const {\n        input: inputFolderPath,\n        varsPreset = '',\n        outputFormat,\n        applyPresets,\n        resolveConditions,\n    } = ArgvService.getConfig();\n\n    try {\n        const presetsFilePaths = getFilePathsByGlobals(['**/presets.yaml']);\n\n        for (const path of presetsFilePaths) {\n            logger.proc(path);\n\n            const pathToPresetFile = resolve(inputFolderPath, path);\n            const content = readFileSync(pathToPresetFile, 'utf8');\n            const parsedPreset = load(content) as DocPreset;\n\n            PresetService.add(parsedPreset, path, varsPreset);\n\n            if (outputFormat === 'md' && (!applyPresets || !resolveConditions)) {\n                // Should save filtered presets.yaml only when --apply-presets=false or --resolve-conditions=false\n                saveFilteredPresets(path, parsedPreset);\n            }\n        }\n    } catch (error) {\n        log.error(`Preparing presets.yaml files failed. Error: ${error}`);\n        throw error;\n    }\n}\n\nfunction saveFilteredPresets(path: string, parsedPreset: DocPreset): void {\n    const {output: outputFolderPath, varsPreset = ''} = ArgvService.getConfig();\n\n    const outputPath = resolve(outputFolderPath, path);\n    const filteredPreset: Record<string, Object> = {\n        default: parsedPreset.default,\n    };\n\n    if (parsedPreset[varsPreset]) {\n        filteredPreset[varsPreset] = parsedPreset[varsPreset];\n    }\n\n    const outputPreset = dump(filteredPreset, {\n        lineWidth: 120,\n    });\n\n    shell.mkdir('-p', dirname(outputPath));\n    writeFileSync(outputPath, outputPreset);\n}\n\nasync function preparingTocFiles(getFilePathsByGlobals: GetFilePathsByGlobalsFunction): Promise<void> {\n    try {\n        const tocFilePaths = getFilePathsByGlobals(['**/toc.yaml']);\n\n        for (const path of tocFilePaths) {\n            logger.proc(path);\n\n            await TocService.add(path);\n        }\n    } catch (error) {\n        log.error(`Preparing toc.yaml files failed. Error: ${error}`);\n        throw error;\n    }\n}\n","import {writeFileSync} from 'fs';\nimport {extname, join} from 'path';\n\nimport {ArgvService, TocService} from '../services';\nimport {convertBackSlashToSlash} from '../utils';\n\ntype TocItem = {\n    name: string;\n    items?: TocItems;\n    href?: string;\n};\n\ntype TocItems = TocItem[];\n\nexport function prepareMapFile(): void {\n    const {\n        output: outputFolderPath,\n    } = ArgvService.getConfig();\n\n    const navigationPathsWithoutExtensions =\n        TocService.getNavigationPaths().map((path) => {\n            let preparedPath = convertBackSlashToSlash(path.replace(extname(path), ''));\n\n            if (preparedPath.endsWith('/index')) {\n                preparedPath = preparedPath.substring(0, preparedPath.length - 5);\n            }\n\n            return preparedPath;\n        });\n    const navigationPaths = {files: [...new Set(navigationPathsWithoutExtensions)]};\n    const filesMapBuffer = Buffer.from(JSON.stringify(navigationPaths, null, '\\t'), 'utf8');\n    const mapFile = join(outputFolderPath, 'files.json');\n\n    writeFileSync(mapFile, filesMapBuffer);\n}\n","import {createReadStream} from 'fs';\nimport walkSync from 'walk-sync';\nimport {resolve, join} from 'path';\nimport {S3Client, PutObjectCommand} from '@aws-sdk/client-s3';\nimport mime from 'mime-types';\n\nimport {convertBackSlashToSlash, logger} from '../../utils';\nimport {asyncify, mapLimit} from 'async';\n\ninterface UploadProps {\n    input: string;\n    ignore: string[];\n    endpoint: string;\n    bucket: string;\n    prefix: string;\n    accessKeyId: string;\n    secretAccessKey: string;\n    region: string;\n}\n\nexport async function upload(props: UploadProps): Promise<void> {\n    const {\n        input,\n        ignore = [],\n        endpoint,\n        region,\n        bucket,\n        prefix,\n        accessKeyId,\n        secretAccessKey,\n    } = props;\n\n    const s3Client = new S3Client({\n        endpoint,\n        region,\n        credentials: {accessKeyId, secretAccessKey},\n    });\n\n    const filesToPublish: string[] = walkSync(resolve(input), {\n        directories: false,\n        includeBasePath: false,\n        ignore,\n    });\n\n    await mapLimit(filesToPublish, 100, asyncify(async (pathToFile: string) => {\n        const mimeType = mime.lookup(pathToFile);\n\n        logger.upload(pathToFile);\n\n        try {\n            await s3Client.send(new PutObjectCommand({\n                ContentType: mimeType ? mimeType : undefined,\n                Bucket: bucket,\n                Key: convertBackSlashToSlash(join(prefix, pathToFile)),\n                Body: createReadStream(resolve(input, pathToFile)),\n            }));\n        } catch (error) {\n            logger.error(pathToFile, error.message);\n        }\n    }));\n}\n","import {join} from 'path';\nimport {ArgvService} from '../../services';\nimport {logger} from '../../utils';\n\nimport {Argv, Arguments} from 'yargs';\n\nimport {upload} from './upload';\n\nconst command = 'publish';\n\nconst description = 'Upload builded documentation to target S3 bucket';\n\nconst publish = {\n    command,\n    description,\n    handler,\n    builder,\n};\n\nfunction builder<T>(argv: Argv<T>) {\n    return argv\n        .option('strict', {\n            default: true,\n        })\n        .option('input', {\n            alias: 'i',\n            describe: 'Path to folder with builded files',\n            type: 'string',\n            required: true,\n            group: 'Upload options',\n        })\n        .option('endpoint', {\n            describe: 'S3 bucket endpoint',\n            default: 'https://s3.amazonaws.com',\n            type: 'string',\n            group: 'Upload options',\n        })\n        .option('region', {\n            describe: 'S3 bucket region',\n            default: 'eu-central-1',\n            type: 'string',\n            group: 'Upload options',\n        })\n        .option('bucket', {\n            describe: 'S3 bucket name',\n            type: 'string',\n            required: true,\n            group: 'Upload options',\n        })\n        .option('prefix', {\n            describe: 'S3 bucket ',\n            default: '',\n            type: 'string',\n            group: 'Upload options',\n        })\n        .option('access-key-id', {\n            describe: 'S3 bucket AccessKeyId',\n            type: 'string',\n            required: true,\n            group: 'Upload options',\n        })\n        .option('secret-access-key', {\n            describe: 'S3 bucket SecretAccessKey',\n            type: 'string',\n            required: true,\n            group: 'Upload options',\n        });\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nasync function handler(args: Arguments<any>) {\n    ArgvService.init({\n        ...args,\n    });\n\n    const {\n        input,\n        endpoint,\n        bucket,\n        prefix,\n    } = ArgvService.getConfig();\n\n    logger.info('', `Upload artifacts from ${input} to ${join(endpoint, bucket, prefix)}`);\n\n    try {\n        await upload(ArgvService.getConfig());\n    } catch (error) {\n        logger.error('', error.message);\n    }\n}\n\nexport {publish};\n","const {promises: {readFile, writeFile, mkdir}} = require('fs');\nimport {join, dirname, extname} from 'path';\n\nimport markdownTranslation, {ExtractParameters} from '@diplodoc/markdown-translation';\nimport {Arguments, Argv} from 'yargs';\nimport {eachLimit, asyncify} from 'async';\n\nimport {ArgvService} from '../../services';\nimport {glob, logger} from '../../utils';\n\nconst command = 'extract';\n\nconst description = 'extract xliff and skeleton from yfm documentation';\n\nconst extract = {command, description, handler, builder};\n\nconst MD_GLOB = '**/*.md';\n\nconst MAX_CONCURRENCY = 50;\n\nclass ExtractError extends Error {\n    path: string;\n\n    constructor(message: string, path: string) {\n        super(message);\n\n        this.path = path;\n    }\n}\n\nconst USAGE = `yfm xliff extract \\\n--input <folder-with-markdown> \\\n--output <folder-to-store-xlff-and-skeleton> \\\n--sll <source-language>-<source-locale> \\\n--tll <target-language>-<target-locale>\n\nwhere <source/target-language> is the language code, as described in ISO 639-1.\n\nwhere <source/target-locale> is the locale code in alpha-2 format, as described in ISO 3166-1`;\n\nfunction builder<T>(argv: Argv<T>) {\n    return argv\n        .option('source-language-locale', {\n            alias: 'sll',\n            describe: 'source language and locale',\n            type: 'string',\n        }).option('target-language-locale', {\n            alias: 'tll',\n            describe: 'target language and locale',\n            type: 'string',\n        }).option('input', {\n            alias: 'i',\n            describe: 'input folder with markdown files',\n            type: 'string',\n        }).option('output', {\n            alias: 'o',\n            describe: 'output folder to store xliff and skeleton files',\n            type: 'string',\n        }).demandOption(['source-language-locale', 'target-language-locale', 'input', 'output'], USAGE);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function handler(args: Arguments<any>) {\n    ArgvService.init({\n        ...args,\n    });\n\n    const {input, output, sourceLanguageLocale, targetLanguageLocale} = args;\n\n    let source;\n    let target;\n\n    try {\n        source = parseLanguageLocale(sourceLanguageLocale);\n        target = parseLanguageLocale(targetLanguageLocale);\n    } catch (err) {\n        if (err instanceof Error) {\n            logger.error(input, err.message);\n        }\n    }\n\n    let cache = {};\n    let found: string[] = [];\n\n    try {\n        ({state: {found, cache}} = await glob(join(input, MD_GLOB), {\n            nosort: true,\n            cache,\n        }));\n    } catch (err) {\n        if (err instanceof Error) {\n            logger.error(input, err.message);\n        }\n    }\n\n    const pipelineParameters = {source, target, input, output};\n    const configuredPipeline = pipeline(pipelineParameters);\n\n    try {\n        logger.info(input, 'starting xliff and skeleton generation pipeline');\n\n        await eachLimit(found, MAX_CONCURRENCY, asyncify(configuredPipeline));\n\n        logger.info(input, 'finished xliff and skeleton generation pipeline');\n    } catch (err) {\n        if (err instanceof Error || err instanceof ExtractError) {\n            const file = err instanceof ExtractError ? err.path : input;\n\n            logger.error(file, err.message);\n        }\n    }\n}\n\nfunction parseLanguageLocale(languageLocale: string) {\n    const [language, locale] = languageLocale.split('-');\n    if (language?.length && locale?.length) {\n        return {language, locale};\n    }\n\n    throw new Error('invalid language-locale string');\n}\n\nexport type PipelineParameters = {\n    input: string;\n    output: string;\n    source: ExtractParameters['source'];\n    target: ExtractParameters['target'];\n};\n\nfunction pipeline(params: PipelineParameters) {\n    const {input, output, source, target} = params;\n\n    return async (markdownPath: string) => {\n        const markdown = await reader({path: markdownPath});\n        const extension = extname(markdownPath);\n\n        const outputRelativePath = markdownPath\n            .replace(extension, '')\n            .slice(input.length);\n\n        const outputPath = join(output, outputRelativePath);\n        const xlfPath = outputPath + '.xliff';\n        const skeletonPath = outputPath + '.skl.md';\n\n        const extractParameters = {\n            markdownPath,\n            skeletonPath,\n            markdown,\n            source,\n            target,\n        };\n\n        const extracted = await extractor(extractParameters);\n\n        const writerParameters = {\n            ...extracted,\n            xlfPath,\n            skeletonPath,\n        };\n\n        await writer(writerParameters);\n    };\n}\n\nexport type ReaderParameters = {\n    path: string;\n};\n\nasync function reader(params: ReaderParameters) {\n    const {path} = params;\n\n    let markdown;\n    try {\n        logger.info(path, 'reading markdown file');\n\n        markdown = await readFile(path, {encoding: 'utf-8'});\n\n        logger.info(path, 'finished reading markdown file');\n    } catch (err) {\n        if (err instanceof Error) {\n            throw new ExtractError(err.message, path);\n        }\n    }\n\n    return markdown;\n}\n\nexport type ExtractorParameters = {\n    source: ExtractParameters['source'];\n    target: ExtractParameters['target'];\n    skeletonPath: string;\n    markdownPath: string;\n    markdown: string;\n};\n\nasync function extractor(params: ExtractorParameters) {\n    let extracted;\n\n    logger.info(params.markdownPath, 'generating skeleton and xliff from markdown');\n\n    try {\n        extracted = markdownTranslation.extract(params);\n    } catch (err) {\n        if (err instanceof Error) {\n            throw new ExtractError(err.message, params.markdownPath);\n        }\n    }\n\n    logger.info(params.markdownPath, 'finished generating skeleton and xliff from markdown');\n\n    return extracted;\n}\n\nexport type WriterParameters = {\n    skeletonPath: string;\n    skeleton: string;\n    xlfPath: string;\n    xlf: string;\n};\n\nasync function writer(params: WriterParameters) {\n    const {xlfPath, skeletonPath, xlf, skeleton} = params;\n\n    logger.info(params.xlfPath, 'writing xliff file');\n    logger.info(params.skeletonPath, 'writing skeleton file');\n\n    await mkdir(dirname(xlfPath), {recursive: true});\n\n    await Promise.all([writeFile(skeletonPath, skeleton), writeFile(xlfPath, xlf)]);\n\n    logger.info(params.xlfPath, 'finished writing xliff file');\n    logger.info(params.skeletonPath, 'finished writing skeleton file');\n}\n\nexport {extract};\n\nexport default {extract};\n","const {promises: {readFile, writeFile, mkdir}} = require('fs');\nimport {join, extname, dirname} from 'path';\n\nimport markdownTranslation, {ComposeParameters} from '@diplodoc/markdown-translation';\nimport {Arguments, Argv} from 'yargs';\nimport {eachLimit} from 'async';\n\nimport {ArgvService} from '../../services';\nimport {glob, logger} from '../../utils';\n\nconst command = 'compose';\n\nconst description = 'compose xliff and skeleton into documentation';\n\nconst compose = {command, description, handler, builder};\n\nconst SKL_MD_GLOB = '**/*.skl.md';\nconst XLF_GLOB = '**/*.xliff';\nconst MAX_CONCURRENCY = 50;\n\nclass ComposeError extends Error {\n    path: string;\n\n    constructor(message: string, path: string) {\n        super(message);\n\n        this.path = path;\n    }\n}\n\nconst USAGE = 'yfm xliff compose \\\n--input <folder-with-xliff-and-skeleton> \\\n--ouput <folder-to-store-translated-markdown>';\n\nfunction builder<T>(argv: Argv<T>) {\n    return argv\n        .option('input', {\n            alias: 'i',\n            describe: 'input folder with xliff and skeleton files',\n            type: 'string',\n        }).option('output', {\n            alias: 'o',\n            describe: 'output folder where translated markdown will be stored',\n            type: 'string',\n        }).demandOption(['input', 'output'], USAGE);\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nasync function handler(args: Arguments<any>) {\n    ArgvService.init({\n        ...args,\n    });\n\n    const {input, output} = args;\n\n    let cache = {};\n    let skeletonPaths: string[] = [];\n    let xliffPaths: string[] = [];\n\n    try {\n        ({state: {found: skeletonPaths, cache}} = await glob(join(input, SKL_MD_GLOB), {\n            nosort: false,\n            cache,\n        }));\n\n        ({state: {found: xliffPaths, cache}} = await glob(join(input, XLF_GLOB), {\n            nosort: false,\n            cache,\n        }));\n\n        if (xliffPaths.length !== skeletonPaths.length) {\n            throw new ComposeError('number of xliff and skeleton files does\\'not match', input);\n        }\n    } catch (err) {\n        if (err instanceof Error || err instanceof ComposeError) {\n            const file = err instanceof ComposeError ? err.path : input;\n\n            logger.error(file, err.message);\n        }\n    }\n\n    const pipelineParameters = {input, output};\n    const configuredPipeline = pipeline(pipelineParameters);\n\n    try {\n        logger.info(input, 'staring translated markdown composition pipeline');\n\n        await eachLimit(xliffPaths, MAX_CONCURRENCY, configuredPipeline);\n\n        logger.info(input, 'finished translated markdown composition pipeline');\n    } catch (err) {\n        if (err instanceof Error || err instanceof ComposeError) {\n            const file = err instanceof ComposeError ? err.path : input;\n\n            logger.error(file, err.message);\n        }\n    }\n}\n\nexport type PipelineParameters = {\n    input: string;\n    output: string;\n};\n\nfunction pipeline(params: PipelineParameters) {\n    const {input, output} = params;\n\n    return async (xliffPath: string) => {\n        const extension = extname(xliffPath);\n        const extensionLessPath = xliffPath.replace(extension, '');\n        const skeletonPath = extensionLessPath + '.skl.md';\n\n        const readerParameters = {xliffPath, skeletonPath};\n        const read = await reader(readerParameters);\n\n        const composerParameters = {\n            ...read,\n            skeletonPath,\n            xliffPath,\n        };\n        const {markdown} = await composer(composerParameters);\n\n        const inputRelativePath = extensionLessPath.slice(input.length);\n        const markdownPath = join(output, inputRelativePath) + '.md';\n\n        const writerParameters = {\n            markdown,\n            markdownPath,\n        };\n        await writer(writerParameters);\n    };\n}\n\nexport type ReaderParameters = {\n    skeletonPath: string;\n    xliffPath: string;\n};\n\nasync function reader(params: ReaderParameters) {\n    const {skeletonPath, xliffPath} = params;\n\n    let skeleton;\n    let xlf;\n\n    try {\n        logger.info(skeletonPath, 'reading skeleton file');\n\n        skeleton = await readFile(skeletonPath, {encoding: 'utf-8'});\n\n        logger.info(skeletonPath, 'finished reading skeleton file');\n    } catch (err) {\n        if (err instanceof Error) {\n            throw new ComposeError(err.message, skeletonPath);\n        }\n    }\n\n    try {\n        logger.info(xliffPath, 'reading xliff file');\n\n        xlf = await readFile(xliffPath, {encoding: 'utf-8'});\n\n        logger.info(xliffPath, 'finished reading xliff file');\n    } catch (err) {\n        if (err instanceof Error) {\n            throw new ComposeError(err.message, xliffPath);\n        }\n    }\n\n    return {skeleton, xlf};\n}\n\nexport type ComposerParameters = {\n    skeletonPath: string;\n    xliffPath: string;\n} & ComposeParameters;\n\nasync function composer(params: ComposerParameters) {\n    const {skeletonPath, xliffPath} = params;\n    let markdown;\n\n    try {\n        logger.info(skeletonPath, 'composing markdown from xliff and skeleton');\n        logger.info(xliffPath, 'composing markdown from xliff and skeleton');\n\n        markdown = markdownTranslation.compose(params);\n\n        logger.info(skeletonPath, 'finished composing markdown from xliff and skeleton');\n        logger.info(xliffPath, 'finished composing markdown from xliff and skeleton');\n    } catch (err) {\n        if (err instanceof Error) {\n            throw new ComposeError(err.message, `${xliffPath} ${skeletonPath}`);\n        }\n    }\n\n    return {markdown};\n}\n\nexport type WriterParameters = {\n    markdown: string;\n    markdownPath: string;\n};\n\nasync function writer(params: WriterParameters) {\n    const {markdown, markdownPath} = params;\n\n    try {\n        logger.info(markdownPath, 'writing markdown file');\n\n        await mkdir(dirname(markdownPath), {recursive: true});\n        await writeFile(markdownPath, markdown);\n\n        logger.info(markdownPath, 'finished writing markdown file');\n    } catch (err) {\n        if (err instanceof Error) {\n            throw new ComposeError(err.message, markdownPath);\n        }\n    }\n}\n\nexport {compose};\n\nexport default {compose};\n","import {extract} from './extract';\nimport {compose} from './compose';\n\nimport {Argv} from 'yargs';\n\nconst command = 'xliff';\n\nconst description =\n    'extract xliff and skeleton from documentation files\\ncompose xliff and skeleton into documentation';\n\nconst xliff = {\n    command,\n    description,\n    handler: () => {},\n    builder,\n};\n\nfunction builder<T>(argv: Argv<T>) {\n    return argv\n        .command(extract)\n        .command(compose)\n        .demandCommand(1, `provide one of the folowing ${command} commands: ${extract.command}, ${compose.command}`);\n}\n\nexport {xliff};\n\nexport default {xliff};\n","import {\n    eachLimit,\n    retry,\n    asyncify,\n} from 'async';\n\nimport {dirname, resolve, join} from 'path';\nimport {readFile, writeFile, mkdir} from 'fs/promises';\nimport {XMLParser} from 'fast-xml-parser';\n\nimport {Session} from '@yandex-cloud/nodejs-sdk/dist/session';\nimport {TranslationServiceClient} from '@yandex-cloud/nodejs-sdk/dist/generated/yandex/cloud/service_clients';\nimport {\n    TranslateRequest,\n    TranslateRequest_Format as Format,\n} from '@yandex-cloud/nodejs-sdk/dist/generated/yandex/cloud/ai/translate/v2/translation_service';\n\nconst yfm2xliff = require('@doc-tools/yfm2xliff/lib/cjs');\n\nimport {ArgvService} from '../../services';\nimport {getYandexOAuthToken} from '../../packages/credentials';\nimport {glob, logger} from '../../utils';\n\nimport {Argv, Arguments} from 'yargs';\n\nimport {YandexCloudTranslateGlossaryPair} from '../../models';\n\nconst composer = async (xliff: string, skeleton: string): Promise<string> => new Promise((res, rej) =>\n    yfm2xliff.compose(xliff, skeleton, (err: Error, composed: string) => {\n        if (err) {\n            rej(err);\n        }\n\n        return res(composed);\n    }));\n\nconst command = 'translate';\n\nconst description = 'translate documentation with Yandex.Cloud Translator API';\n\nconst translate = {\n    command,\n    description,\n    handler,\n    builder,\n};\n\nconst MD_GLOB = '**/*.md';\nconst REQUESTS_LIMIT = 20;\nconst RETRY_LIMIT = 8;\nconst MTRANS_LOCALE = 'MTRANS';\n\nfunction builder<T>(argv: Argv<T>) {\n    return argv\n        .option('source-language', {\n            alias: 'sl',\n            describe: 'source language code',\n            type: 'string',\n        })\n        .option('target-language', {\n            alias: 'tl',\n            describe: 'target language code',\n            type: 'string',\n        })\n        .demandOption(\n            ['source-language', 'target-language'],\n            'command requires to specify source and target languages');\n}\n\nclass TranslatorError extends Error {\n    path: string;\n\n    constructor(message: string, path: string) {\n        super(message);\n\n        this.path = path;\n    }\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nasync function handler(args: Arguments<any>) {\n    ArgvService.init({\n        ...args,\n    });\n\n    const {input,\n        output,\n        yandexCloudTranslateFolderId,\n        yandexCloudTranslateGlossaryPairs,\n        sl: sourceLanguage,\n        tl: targetLanguage,\n    } = args;\n\n    logger.info(input, `translating documentation from ${sourceLanguage} to ${targetLanguage} language`);\n\n    try {\n        let found = [];\n\n        ({state: {found}} = await glob(join(input, MD_GLOB), {\n            nosort: true,\n        }));\n\n        const oauthToken = await getYandexOAuthToken();\n\n        const translatorParams = {\n            input,\n            output,\n            sourceLanguage,\n            targetLanguage,\n            yandexCloudTranslateGlossaryPairs,\n            folderId: yandexCloudTranslateFolderId,\n            oauthToken,\n        };\n\n        const translateFn = translator(translatorParams);\n\n        await eachLimit(found, REQUESTS_LIMIT, asyncify(translateFn));\n    } catch (err) {\n        if (err instanceof Error || err instanceof TranslatorError) {\n            const message = err.message;\n\n            const file = err instanceof TranslatorError ? err.path : '';\n\n            logger.error(file, message);\n        }\n    }\n\n    logger.info(output, `translated documentation from ${sourceLanguage} to ${targetLanguage} language`);\n}\n\nexport type TranslatorParams = {\n    oauthToken: string;\n    folderId: string;\n    input: string;\n    output: string;\n    sourceLanguage: string;\n    targetLanguage: string;\n    yandexCloudTranslateGlossaryPairs: YandexCloudTranslateGlossaryPair[];\n};\n\nfunction translator(params: TranslatorParams) {\n    const {\n        oauthToken,\n        folderId,\n        input,\n        output,\n        sourceLanguage,\n        targetLanguage,\n        yandexCloudTranslateGlossaryPairs,\n    } = params;\n\n    const session = new Session({oauthToken});\n    const client = session.client(TranslationServiceClient);\n\n    return async (mdPath: string) => {\n        try {\n            logger.info(mdPath, 'translating');\n\n            const md = await readFile(resolve(mdPath), {encoding: 'utf-8'});\n\n            const extracted = await yfm2xliff.extract({\n                md,\n                mdPath,\n                source: sourceLanguage,\n                target: targetLanguage,\n                sklPath: '',\n                xlfPath: '',\n            });\n\n            const texts = parseSourcesFromXLIFF(extracted.xliff);\n\n            const machineTranslateParams = TranslateRequest.fromPartial({\n                texts,\n                folderId,\n                sourceLanguageCode: sourceLanguage,\n                targetLanguageCode: targetLanguage,\n                glossaryConfig: {\n                    glossaryData: {\n                        glossaryPairs: yandexCloudTranslateGlossaryPairs,\n                    },\n                },\n                format: Format.PLAIN_TEXT,\n            });\n\n            const translations = await retry({times: RETRY_LIMIT, interval: (count: number) => {\n                // eslint-disable-next-line no-bitwise\n                return (1 << count) * 1000;\n            }}, asyncify(async () =>\n                await client.translate(machineTranslateParams)\n                    .then((results: {translations: {text: string}[]}) =>\n                        results.translations.map(({text}: {text: string}) => text)),\n            ));\n\n            const createXLIFFDocumentParams = {\n                sourceLanguage: sourceLanguage + '-' + MTRANS_LOCALE,\n                targetLanguage: targetLanguage + '-' + MTRANS_LOCALE,\n                sources: texts,\n                targets: translations as string[],\n            };\n\n            const translatedXLIFF = createXLIFFDocument(createXLIFFDocumentParams);\n\n            const composed = await composer(translatedXLIFF, extracted.skeleton);\n\n            const outputPath = mdPath.replace(input, output);\n\n            await mkdir(dirname(outputPath), {recursive: true});\n            await writeFile(outputPath, composed);\n\n            logger.info(outputPath, 'finished translating');\n        } catch (err) {\n            if (err instanceof Error) {\n                throw new TranslatorError(err.toString(), mdPath);\n            }\n        }\n    };\n}\n\nfunction parseSourcesFromXLIFF(xliff: string) {\n    const parser = new XMLParser();\n\n    const inputs = parser.parse(xliff)?.xliff?.file?.body['trans-unit'] ?? [];\n\n    return Array.isArray(inputs)\n        ? inputs.map(({source}: {source: string}) => source)\n        : [inputs.source];\n}\n\nexport type CreateXLIFFDocumentParams = {\n    sourceLanguage: string;\n    targetLanguage: string;\n    sources: string[];\n    targets: string[];\n};\n\nfunction createXLIFFDocument(params: CreateXLIFFDocumentParams) {\n    const {sourceLanguage, targetLanguage, sources, targets} = params;\n\n    const unit = (text: string, i: number): string => `\n<trans-unit id=\"${i + 1}\">\n    <source xml:lang=\"${sourceLanguage}\">${sources[i]}</source>\n    <target xml:lang=\"${targetLanguage}\">${text}</target>\n</trans-unit>`;\n\n    const doc = `\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xliff xmlns=\"urn:oasis:names:tc:xliff:document:1.2\" version=\"1.2\">\n    <file original=\"\" source-language=\"${sourceLanguage}\" target-language=\"${targetLanguage}\">\n        <header>\n            <skl><external-file href=\"\" /></skl>\n        </header>\n        <body>${targets.map(unit)}</body>\n    </file>\n</xliff>`;\n\n    return doc;\n}\n\nexport {translate};\n\nexport default {translate};\n","import {readFile} from 'fs/promises';\nimport {env} from 'process';\nimport {homedir} from 'os';\nimport {join} from 'path';\n\nimport {logger} from '../../utils';\n\nconst YANDEX_OAUTH_TOKEN_FILENAME = '.ya_oauth_token';\n\nasync function getYandexOAuthToken() {\n    const {YANDEX_OAUTH_TOKEN} = env;\n\n    return YANDEX_OAUTH_TOKEN ?? getYandexOAuthTokenFromHomeDir();\n}\n\nasync function getYandexOAuthTokenFromHomeDir() {\n    const error = 'failed reading yandex oauth token';\n\n    const path = join(homedir(), YANDEX_OAUTH_TOKEN_FILENAME);\n\n    let token;\n\n    try {\n        token = await readFile(path, {encoding: 'utf8'});\n\n        token = token.trim();\n\n        if (!token?.length) {\n            throw new Error(error);\n        }\n    } catch (err) {\n        logger.error(error);\n\n        throw err;\n    }\n\n    return token;\n}\n\nexport {getYandexOAuthToken};\n\nexport default {getYandexOAuthToken};\n"]}