@diplodoc/cli 4.7.0 → 4.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/app.css +4 -0
- package/assets/app.js +2 -0
- package/assets/react.js +3 -0
- package/{build/app.client.css → assets/vendor.css} +857 -19
- package/assets/vendor.js +3 -0
- package/build/index.js +317 -233
- package/build/index.js.map +4 -4
- package/build/linter.js +88 -112
- package/build/linter.js.map +4 -4
- package/package.json +8 -23
- package/src/cmd/publish/index.ts +16 -4
- package/src/constants.ts +4 -6
- package/src/models.ts +1 -0
- package/src/resolvers/md2html.ts +4 -0
- package/src/services/contributors.ts +46 -2
- package/src/services/metadata.ts +42 -2
- package/src/services/tocs.ts +10 -0
- package/src/steps/processAssets.ts +3 -5
- package/src/utils/markup.ts +18 -7
- package/src/utils/path.ts +0 -8
- package/src/utils/singlePage.ts +10 -5
- package/src/vcs-connector/connector-models.ts +2 -0
- package/src/vcs-connector/github.ts +42 -1
- package/build/app.client.js +0 -3
package/build/linter.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../
|
|
4
|
-
"sourcesContent": ["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 log from '@diplodoc/transform/lib/log';\nimport {extname} from 'path';\nimport {Observable, Subject} from 'threads/observable';\nimport {expose} from 'threads';\n\nimport {ArgvService, PluginService, PresetService, TocService} from '../../services';\nimport {TocServiceData} from '../../services/tocs';\nimport {PresetStorage} from '../../services/preset';\nimport {YfmArgv} from '../../models';\nimport {lintPage} from '../../resolvers';\n\nlet processedPages = new Subject();\n\ninterface ProcessLinterWorkerOptions {\n argvConfig: YfmArgv;\n navigationPaths: TocServiceData['navigationPaths'];\n presetStorage: PresetStorage;\n}\n\nasync function run({argvConfig, presetStorage, navigationPaths}: ProcessLinterWorkerOptions) {\n ArgvService.set(argvConfig);\n PresetService.setPresetStorage(presetStorage);\n TocService.setNavigationPaths(navigationPaths);\n PluginService.setPlugins();\n\n TocService.getNavigationPaths().forEach((pathToFile) => {\n lintPage({\n inputPath: pathToFile,\n fileExtension: extname(pathToFile),\n onFinish: () => {\n processedPages.next(pathToFile);\n },\n });\n });\n}\n\nasync function finish() {\n processedPages.complete();\n processedPages = new Subject();\n\n return log.get();\n}\n\nfunction getProcessedPages() {\n return Observable.from(processedPages);\n}\n\nexport type ProcessLinterWorker = {\n run: typeof run;\n finish: typeof finish;\n getProcessedPages: typeof getProcessedPages;\n};\n\nexpose({\n run,\n finish,\n getProcessedPages,\n});\n", "import {dirname, extname, join, normalize, parse, relative, resolve, sep} from 'path';\nimport {existsSync, readFileSync, writeFileSync} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport shell from 'shelljs';\nimport walkSync from 'walk-sync';\nimport liquid from '@diplodoc/transform/lib/liquid';\nimport log from '@diplodoc/transform/lib/log';\nimport {bold} from 'chalk';\n\nimport {ArgvService, PresetService} from './index';\nimport {getContentWithUpdatedStaticMetadata} from './metadata';\nimport {YfmToc} from '../models';\nimport {IncludeMode, Stage} from '../constants';\nimport {isExternalHref, logger} from '../utils';\nimport {filterFiles, firstFilterTextItems, liquidField} from './utils';\nimport {IncludersError, applyIncluders} 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(parsedToc.title, 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 {resolveConditions, removeHiddenTocItems} = 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 shell.cp(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 =\n 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(\n path,\n includedTocItems,\n baseTocDir,\n sourcesDir,\n vars,\n );\n\n /* Make hrefs relative to the main toc */\n if (mode === IncludeMode.LINK) {\n includedTocItems = _replaceIncludesHrefs(\n includedTocItems,\n includeTocDir,\n tocDir,\n );\n }\n\n if (item.name) {\n item.items = includedTocItems;\n } else {\n includedInlineItems = includedTocItems;\n }\n } catch (err) {\n const message = `Error while including toc: ${bold(includeTocPath)} to ${bold(\n 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 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 {MetaDataOptions, Metadata, Resources} from '../models';\nimport {\n getAuthorDetails,\n updateAuthorMetadataStringByAuthorLogin,\n updateAuthorMetadataStringByFilePath,\n} from './authors';\nimport {getFileContributorsMetadata, getFileContributorsString} from './contributors';\nimport {isObject} from './utils';\nimport {\u0441arriage} from '../utils';\nimport {REGEXP_AUTHOR, metadataBorder} 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,\n sourcePath,\n addSystemMeta,\n addSourcePath,\n resources,\n 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(\n matchedAuthor,\n options.vcsConnector,\n );\n }\n }\n\n if (!authorMetadata) {\n const {\n fileData: {tmpInputFilePath, inputFolderPathLength},\n } = options;\n const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength);\n authorMetadata = await updateAuthorMetadataStringByFilePath(\n relativeFilePath,\n options.vcsConnector,\n );\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,\n 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(\u0441arriage) + (newMetadatas.length ? \u0441arriage : '');\n const preparedDefaultMetadata = defaultMetadata.trimRight();\n const defaultMetadata\u0421arriage = preparedDefaultMetadata ? \u0441arriage : '';\n const updatedMetadata = `${preparedDefaultMetadata}${defaultMetadata\u0421arriage}${newMetadata}`;\n\n return `${metadataBorder}${\u0441arriage}${updatedMetadata}${metadataBorder}${\n defaultMetadata.length ? '' : \u0441arriage\n }`;\n}\n\nasync function getUpdatedMetadata(\n options: MetaDataOptions,\n fileContent: string,\n meta?: Metadata,\n): 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(\n options: MetaDataOptions,\n fileContent: string,\n): 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(\n meta: Metadata,\n vcsConnector?: VCSConnector,\n): 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\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 '@diplodoc/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 {Resources, SinglePageResult} from '../models';\nimport {ArgvService, PluginService} from '../services';\nimport {preprocessPageHtmlForSinglePage} from './singlePage';\nimport {DocInnerProps, DocPageData, render} 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(\n props: DocInnerProps<DocPageData>,\n pathToBundle: string,\n): 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(\n pathToBundle,\n )}\"></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(\n ([key]) => !Object.keys(ResourceType).includes(key),\n );\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) =>\n resourcesTags.push(\n `<link rel=\"stylesheet\" type=\"text/css\" href=\"${el}\" ${\n id === 0 && `id=\"${CUSTOM_STYLE}\"`\n }>`,\n ),\n );\n }\n\n if (script) {\n script.forEach((el) => resourcesTags.push(`<script src=\"${el}\"></script>`));\n }\n\n return resourcesTags.join('\\n');\n}\n\nexport const \u0441arriage = platform === Platforms.WINDOWS ? '\\r\\n' : '\\n';\n\nexport function joinSinglePageResults(\n singlePageResults: SinglePageResult[],\n root: string,\n tocDir: string,\n): string {\n const delimeter = `${\u0441arriage}${\u0441arriage}<hr class=\"yfm-page__delimeter\">${\u0441arriage}${\u0441arriage}`;\n return singlePageResults\n .filter(({content}) => content)\n .map(({content, path, title}) =>\n preprocessPageHtmlForSinglePage(content, {root, path, tocDir, title}),\n )\n .join(delimeter);\n}\n\nexport function replaceDoubleToSingleQuotes(str: string): string {\n return str.replace(/\"/g, \"'\");\n}\n", "import {dirname} from 'path';\nconst os = require('os');\nconst notes = require('@diplodoc/transform/lib/plugins/notes');\nconst anchors = require('@diplodoc/transform/lib/plugins/anchors');\nconst code = require('@diplodoc/transform/lib/plugins/code');\nconst cut = require('@diplodoc/transform/lib/plugins/cut');\nconst deflist = require('@diplodoc/transform/lib/plugins/deflist');\nconst imsize = require('@diplodoc/transform/lib/plugins/imsize');\nconst meta = require('@diplodoc/transform/lib/plugins/meta');\nconst sup = require('@diplodoc/transform/lib/plugins/sup');\nconst tabs = require('@diplodoc/transform/lib/plugins/tabs');\nconst video = require('@diplodoc/transform/lib/plugins/video');\nconst includes = require('@diplodoc/transform/lib/plugins/includes');\nconst links = require('@diplodoc/transform/lib/plugins/links');\nconst images = require('@diplodoc/transform/lib/plugins/images');\nconst monospace = require('@diplodoc/transform/lib/plugins/monospace');\nconst table = require('@diplodoc/transform/lib/plugins/table');\nconst term = require('@diplodoc/transform/lib/plugins/term');\nconst blockAnchor = require('@diplodoc/transform/lib/plugins/block-anchor');\nconst changelog = require('@diplodoc/transform/lib/plugins/changelog');\nconst mermaid = require('@diplodoc/mermaid-extension');\nconst openapi = require('@diplodoc/openapi-extension');\n\nincludes.collect = require('@diplodoc/transform/lib/plugins/includes/collect');\nimages.collect = require('@diplodoc/transform/lib/plugins/images/collect');\nchangelog.collect = require('@diplodoc/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 blockAnchor,\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\u0421onfigurationMustBeProvided = (repo: string) =>\n `\u0421onfiguration 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;\nexport const PAGE_PROCESS_CONCURRENCY = Number(process.env.PAGE_PROCESS_CONCURRENCY) || 500;\n\nexport const metadataBorder = '---';\n", "import HTMLElement from 'node-html-parser/dist/nodes/html';\nimport {parse} from 'node-html-parser';\nimport {relative, resolve, sep} from 'path';\nimport {resolveRelativePath} from '@diplodoc/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>`).querySelector(\n `${rawTagName}`,\n );\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\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 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 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 node.setAttribute('src', preparedHref);\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(\n `<a class=\"yfm-anchor\" aria-hidden=\"true\" href=\"${pageIdAnchor}\" id=\"${pageId}\"></a>`,\n );\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(\n content: string,\n options: PreprocessSinglePageOptions,\n) {\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 {basename, dirname, extname, format, join, relative} 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(\n localToc.items,\n 'items',\n {},\n {\n removeHiddenTocItems: true,\n },\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(\n toc: YfmToc | null,\n options: {root: string; currentPath: string},\n) {\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(\n localToc.items,\n 'items',\n {},\n {\n removeHiddenTocItems: true,\n },\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 '@diplodoc/transform/lib/liquid/evaluation';\nimport {Filter, TextItems} from '../models';\nimport liquid from '@diplodoc/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>(\n item: T,\n vars: Record<string, string>,\n options?: FilterFilesOptions,\n) {\n const {resolveConditions, removeHiddenTocItems} = options || {};\n let useItem = true;\n\n if (resolveConditions) {\n const {when} = item;\n useItem =\n when === true ||\n when === undefined ||\n (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(\n fields: undefined | string | string[],\n vars: Record<string, unknown>,\n path: string,\n) {\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) => (err ? rej(err) : res({state})));\n });\n\nexport {glob};\n\nexport default {glob};\n", "import {dirname, resolve} from 'path';\nimport shell from 'shelljs';\nimport {logger} from './logger';\n\nexport function copyFiles(\n inputFolderPath: string,\n outputFolderPath: string,\n files: string[],\n): void {\n const dirs = new Set<string>();\n\n files.forEach((pathToAsset) => {\n const outputDir = resolve(outputFolderPath, dirname(pathToAsset));\n const from = resolve(inputFolderPath, pathToAsset);\n const to = resolve(outputFolderPath, pathToAsset);\n\n if (!dirs.has(outputDir)) {\n dirs.add(outputDir);\n shell.mkdir('-p', outputDir);\n }\n\n shell.cp(from, to);\n\n logger.copy(pathToAsset);\n });\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(\n fileData: FileData,\n vcsConnector: VCSConnector,\n): Promise<string> {\n const contributors = await getFileContributorsString(fileData, vcsConnector);\n\n return `contributors: ${contributors}`;\n}\n\nasync function getFileContributorsString(\n fileData: FileData,\n vcsConnector: VCSConnector,\n): Promise<string> {\n const {tmpInputFilePath, inputFolderPathLength} = fileData;\n\n const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength);\n const fileContributors: FileContributors =\n 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[] = Object.entries(\n fileContributorsWithContributorsIncludedFiles,\n ).map(([, contributor]) => contributor);\n\n return replaceDoubleToSingleQuotes(JSON.stringify(contributorsArray));\n}\n\nasync function getContributorsForNestedFiles(\n fileData: FileData,\n vcsConnector: VCSConnector,\n): 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(\n fileData,\n includeContents,\n );\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(\n dirname(tmpInputFilePath),\n relativeIncludeFilePathWithoutHash[0],\n );\n\n relativeIncludeFilePaths.add(includeFilePath);\n }\n });\n\n return relativeIncludeFilePaths;\n}\n\nexport {getFileContributorsMetadata, getFileContributorsString};\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 Includer,\n YfmPreset,\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) {\n return;\n }\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 {mkdir, readFile, writeFile} from 'fs/promises';\nimport {dirname, join, parse} 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 {\n readBasePath,\n writeBasePath,\n tocPath,\n item,\n passedParams: {input, leadingPage},\n index,\n } = 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 =\n index === 0\n ? join(writeBasePath, tocDirPath, input)\n : join(readBasePath, tocDirPath, input);\n\n let cache = {};\n let found = [];\n\n ({\n state: {found, cache},\n } = 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(\n graph,\n chunks,\n (old) => {\n return old ? {files: [...old.files, file]} : {files: [file]};\n },\n Object,\n );\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(\n graph: Record<string, any>,\n cursor: string[],\n ): 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(\n params.tocPath,\n `sourcedocs inlcuder is getting depricated in favor of generic includer\\n${usage}`,\n );\n\n await generic.includerFunction(params);\n}\n\nexport {name, includerFunction};\n\nexport default {name, includerFunction};\n", "import {createReadStream, createWriteStream, mkdirSync} from 'fs';\nimport {dirname, join} from 'path';\nimport {Headers, extract} 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 {\n readBasePath,\n writeBasePath,\n tocPath,\n passedParams: {input, output},\n index,\n } = 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 ? join(writeBasePath, input) : 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 '@diplodoc/transform/lib/log';\n\nimport {ArgvService, PresetService} from './index';\nimport {LeadingPage} from '../models';\nimport {\n filterFiles,\n filterTextItems,\n firstFilterTextItems,\n liquidField,\n liquidFields,\n} from './utils';\n\nfunction filterFile(path: string) {\n const {input: inputFolderPath, vars} = 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(parsedIndex.title, combinedVars, {\n resolveConditions: true,\n });\n parsedIndex.title = liquidField(title, combinedVars, path);\n\n const description = filterTextItems(parsedIndex.description, combinedVars, {\n resolveConditions: true,\n });\n parsedIndex.description = liquidFields(description, combinedVars, path);\n\n if (parsedIndex.meta?.title) {\n const metaTitle = firstFilterTextItems(parsedIndex.meta.title, 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(parsedIndex.nav.title, combinedVars, {\n resolveConditions: true,\n });\n parsedIndex.nav.title = liquidField(navTitle, combinedVars, path);\n }\n\n parsedIndex.links = filterFiles(parsedIndex.links, 'links', combinedVars, {\n resolveConditions: true,\n });\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 {LintConfig, LintRule} from '@diplodoc/transform/lib/yfmlint';\n\nimport {CollectionOfPluginsFunction, Plugin, PluginOptions} 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 {existsSync, readFileSync, writeFileSync} from 'fs';\nimport {basename, dirname, extname, join, resolve} from 'path';\nimport shell from 'shelljs';\nimport log from '@diplodoc/transform/lib/log';\nimport liquid from '@diplodoc/transform/lib/liquid';\n\nimport {ArgvService, PluginService} from '../services';\nimport {getVarsPerFile, logger} from '../utils';\nimport {PluginOptions, ResolveMd2MdOptions} from '../models';\nimport {PROCESSING_FINISHED} from '../constants';\nimport {getContentWithUpdatedMetadata} from '../services/metadata';\nimport {ChangelogItem} from '@diplodoc/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(\n 3,\n '0',\n )}`;\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(\n changesPath,\n JSON.stringify({\n ...changes,\n source: mdFilename,\n }),\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 {applyPresets, resolveConditions, conditionsInCode} = 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 {disableLiquid} = 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 '@diplodoc/transform';\nimport log from '@diplodoc/transform/lib/log';\nimport liquid from '@diplodoc/transform/lib/liquid';\n\nimport {LeadingPage, ResolveMd2HTMLResult, ResolverOptions, YfmToc} from '../models';\nimport {ArgvService, PluginService, TocService} from '../services';\nimport {\n generateStaticMarkup,\n getVarsPerFile,\n getVarsPerRelativeFile,\n logger,\n transformToc,\n} from '../utils';\nimport {Lang, PROCESSING_FINISHED} from '../constants';\nimport {getAssetsPublicPath, getUpdatedMetadata} from '../services/metadata';\nimport {MarkdownItPluginCb} from '@diplodoc/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 =\n 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 =\n 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 || []).map(fixRelativePath(inputPath));\n fileMeta.script = (fileMeta.script || [])\n .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((link) =>\n link.href ? {...link, href: link.href.replace(/.md$/gmu, '.html')} : link,\n );\n\n if (links) {\n data.links = links;\n }\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 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 '@diplodoc/transform/lib/log';\nimport {\n LintMarkdownFunctionOptions,\n PluginOptions,\n default as yfmlint,\n} from '@diplodoc/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 {input, lintConfig, disableLiquid, outputFormat, ...options} = 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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../src/workers/linter/index.ts", "../src/services/tocs.ts", "../src/services/metadata.ts", "../src/utils/logger.ts", "../src/utils/markup.ts", "../src/constants.ts", "../src/utils/singlePage.ts", "../src/utils/url.ts", "../src/utils/path.ts", "../src/utils/toc.ts", "../src/services/utils.ts", "../src/utils/presets.ts", "../src/utils/glob.ts", "../src/utils/file.ts", "../src/services/contributors.ts", "../src/services/includers/index.ts", "../src/services/includers/batteries/generic.ts", "../src/services/includers/batteries/sourcedocs.ts", "../src/services/includers/batteries/unarchive.ts", "../src/services/preset.ts", "../src/services/argv.ts", "../src/services/leading.ts", "../src/services/plugins.ts", "../src/resolvers/md2md.ts", "../src/resolvers/md2html.ts", "../src/resolvers/lintPage.ts"],
|
|
4
|
+
"sourcesContent": ["import log from '@diplodoc/transform/lib/log';\nimport {extname} from 'path';\nimport {Observable, Subject} from 'threads/observable';\nimport {expose} from 'threads';\n\nimport {ArgvService, PluginService, PresetService, TocService} from '../../services';\nimport {TocServiceData} from '../../services/tocs';\nimport {PresetStorage} from '../../services/preset';\nimport {YfmArgv} from '../../models';\nimport {lintPage} from '../../resolvers';\n\nlet processedPages = new Subject();\n\ninterface ProcessLinterWorkerOptions {\n argvConfig: YfmArgv;\n navigationPaths: TocServiceData['navigationPaths'];\n presetStorage: PresetStorage;\n}\n\nasync function run({argvConfig, presetStorage, navigationPaths}: ProcessLinterWorkerOptions) {\n ArgvService.set(argvConfig);\n PresetService.setPresetStorage(presetStorage);\n TocService.setNavigationPaths(navigationPaths);\n PluginService.setPlugins();\n\n TocService.getNavigationPaths().forEach((pathToFile) => {\n lintPage({\n inputPath: pathToFile,\n fileExtension: extname(pathToFile),\n onFinish: () => {\n processedPages.next(pathToFile);\n },\n });\n });\n}\n\nasync function finish() {\n processedPages.complete();\n processedPages = new Subject();\n\n return log.get();\n}\n\nfunction getProcessedPages() {\n return Observable.from(processedPages);\n}\n\nexport type ProcessLinterWorker = {\n run: typeof run;\n finish: typeof finish;\n getProcessedPages: typeof getProcessedPages;\n};\n\nexpose({\n run,\n finish,\n getProcessedPages,\n});\n", "import {dirname, extname, join, normalize, parse, relative, resolve, sep} from 'path';\nimport {existsSync, readFileSync, writeFileSync} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport shell from 'shelljs';\nimport walkSync from 'walk-sync';\nimport liquid from '@diplodoc/transform/lib/liquid';\nimport log from '@diplodoc/transform/lib/log';\nimport {bold} from 'chalk';\n\nimport {ArgvService, PresetService} from './index';\nimport {getContentWithUpdatedStaticMetadata} from './metadata';\nimport {YfmToc} from '../models';\nimport {IncludeMode, Stage} from '../constants';\nimport {isExternalHref, logger} from '../utils';\nimport {filterFiles, firstFilterTextItems, liquidField} from './utils';\nimport {IncludersError, applyIncluders} 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();\nconst tocFileCopyMap = new Map<string, string>();\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(parsedToc.title, 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 {resolveConditions, removeHiddenTocItems} = 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 shell.cp(from, to);\n }\n\n const relFrom = relative(inputFolderPath, from);\n const relTo = relative(inputFolderPath, to);\n tocFileCopyMap.set(relTo, relFrom);\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 =\n 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(\n path,\n includedTocItems,\n baseTocDir,\n sourcesDir,\n vars,\n );\n\n /* Make hrefs relative to the main toc */\n if (mode === IncludeMode.LINK) {\n includedTocItems = _replaceIncludesHrefs(\n includedTocItems,\n includeTocDir,\n tocDir,\n );\n }\n\n if (item.name) {\n item.items = includedTocItems;\n } else {\n includedInlineItems = includedTocItems;\n }\n } catch (err) {\n const message = `Error while including toc: ${bold(includeTocPath)} to ${bold(\n 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 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\nfunction getCopyFileMap() {\n return tocFileCopyMap;\n}\n\nexport default {\n add,\n getForPath,\n getNavigationPaths,\n getTocDir,\n getIncludedTocPaths,\n setNavigationPaths,\n getCopyFileMap,\n};\n", "import {dump} from 'js-yaml';\n\nimport {VCSConnector} from '../vcs-connector/connector-models';\nimport {MetaDataOptions, Metadata, Resources} from '../models';\nimport {\n getAuthorDetails,\n updateAuthorMetadataStringByAuthorLogin,\n updateAuthorMetadataStringByFilePath,\n} from './authors';\nimport {\n getFileContributorsMetadata,\n getFileContributorsString,\n getFileIncludes,\n} from './contributors';\nimport {isObject} from './utils';\nimport {\u0441arriage} from '../utils';\nimport {REGEXP_AUTHOR, metadataBorder} from '../constants';\nimport {dirname, relative, resolve} from 'path';\nimport {ArgvService, TocService} 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,\n sourcePath,\n addSystemMeta,\n addSourcePath,\n resources,\n 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 const mtimeMetadata = await getModifiedTimeMetadataString(options, fileContent);\n if (mtimeMetadata) {\n newMetadatas.push(mtimeMetadata);\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(\n matchedAuthor,\n options.vcsConnector,\n );\n }\n }\n\n if (!authorMetadata) {\n const {\n fileData: {tmpInputFilePath, inputFolderPathLength},\n } = options;\n const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength);\n authorMetadata = await updateAuthorMetadataStringByFilePath(\n relativeFilePath,\n options.vcsConnector,\n );\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,\n 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\nasync function getModifiedTimeMetadataString(options: MetaDataOptions, fileContent: string) {\n const {isContributorsEnabled, vcsConnector, fileData} = options;\n\n const {tmpInputFilePath, inputFolderPathLength} = fileData;\n\n const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength + 1);\n\n if (!isContributorsEnabled || !vcsConnector) {\n return undefined;\n }\n\n const includedFiles = await getFileIncludes({...fileData, fileContent});\n includedFiles.push(relativeFilePath);\n\n const tocCopyFileMap = TocService.getCopyFileMap();\n\n const mtimeList = includedFiles\n .map((path) => {\n const mappedPath = tocCopyFileMap.get(path) || path;\n return vcsConnector.getModifiedTimeByPath(mappedPath);\n })\n .filter((v) => typeof v === 'number') as number[];\n\n if (mtimeList.length) {\n const mtime = Math.max(...mtimeList);\n return `updatedAt: ${new Date(mtime * 1000).toISOString()}`;\n }\n\n return undefined;\n}\n\nfunction getUpdatedMetadataString(newMetadatas: string[], defaultMetadata = ''): string {\n const newMetadata = newMetadatas.join(\u0441arriage) + (newMetadatas.length ? \u0441arriage : '');\n const preparedDefaultMetadata = defaultMetadata.trimRight();\n const defaultMetadata\u0421arriage = preparedDefaultMetadata ? \u0441arriage : '';\n const updatedMetadata = `${preparedDefaultMetadata}${defaultMetadata\u0421arriage}${newMetadata}`;\n\n return `${metadataBorder}${\u0441arriage}${updatedMetadata}${metadataBorder}${\n defaultMetadata.length ? '' : \u0441arriage\n }`;\n}\n\nasync function getUpdatedMetadata(\n options: MetaDataOptions,\n fileContent: string,\n meta?: Metadata,\n): 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(\n options: MetaDataOptions,\n fileContent: string,\n): 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(\n meta: Metadata,\n vcsConnector?: VCSConnector,\n): 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\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 '@diplodoc/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 {join} from 'path';\nimport {platform} from 'process';\n\nimport {CUSTOM_STYLE, Platforms, ResourceType} from '../constants';\nimport {Resources, SinglePageResult} from '../models';\nimport {ArgvService, PluginService} from '../services';\nimport {preprocessPageHtmlForSinglePage} from './singlePage';\n\nimport {DocInnerProps, DocPageData, render} from '@diplodoc/client/ssr';\nimport manifest from '@diplodoc/client/manifest';\n\nconst dst = (bundlePath: string) => (target: string) => join(bundlePath, target);\n\nexport interface TitleMeta {\n title?: string;\n}\nexport type Meta = TitleMeta & Resources;\n\nexport function generateStaticMarkup(\n props: DocInnerProps<DocPageData>,\n pathToBundle: string,\n): 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 ${manifest.css\n .map(dst(pathToBundle))\n .map((src: string) => `<link type=\"text/css\" rel=\"stylesheet\" href=\"${src}\" />`)\n .join('\\n')}\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 ${manifest.js\n .map(dst(pathToBundle))\n .map(\n (src: string) =>\n `<script type=\"application/javascript\" src=\"${src}\"></script>`,\n )\n .join('\\n')}\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(\n ([key]) => !Object.keys(ResourceType).includes(key),\n );\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) =>\n resourcesTags.push(\n `<link rel=\"stylesheet\" type=\"text/css\" href=\"${el}\" ${\n id === 0 && `id=\"${CUSTOM_STYLE}\"`\n }>`,\n ),\n );\n }\n\n if (script) {\n script.forEach((el) => resourcesTags.push(`<script src=\"${el}\"></script>`));\n }\n\n return resourcesTags.join('\\n');\n}\n\nexport const \u0441arriage = platform === Platforms.WINDOWS ? '\\r\\n' : '\\n';\n\nexport function joinSinglePageResults(\n singlePageResults: SinglePageResult[],\n root: string,\n tocDir: string,\n): string {\n const delimeter = `<hr class=\"yfm-page__delimeter\">`;\n return singlePageResults\n .filter(({content}) => content)\n .map(({content, path, title}) =>\n preprocessPageHtmlForSinglePage(content, {root, path, tocDir, title}),\n )\n .join(delimeter);\n}\n\nexport function replaceDoubleToSingleQuotes(str: string): string {\n return str.replace(/\"/g, \"'\");\n}\n", "import {resolve} from 'path';\nconst os = require('os');\nconst notes = require('@diplodoc/transform/lib/plugins/notes');\nconst anchors = require('@diplodoc/transform/lib/plugins/anchors');\nconst code = require('@diplodoc/transform/lib/plugins/code');\nconst cut = require('@diplodoc/transform/lib/plugins/cut');\nconst deflist = require('@diplodoc/transform/lib/plugins/deflist');\nconst imsize = require('@diplodoc/transform/lib/plugins/imsize');\nconst meta = require('@diplodoc/transform/lib/plugins/meta');\nconst sup = require('@diplodoc/transform/lib/plugins/sup');\nconst tabs = require('@diplodoc/transform/lib/plugins/tabs');\nconst video = require('@diplodoc/transform/lib/plugins/video');\nconst includes = require('@diplodoc/transform/lib/plugins/includes');\nconst links = require('@diplodoc/transform/lib/plugins/links');\nconst images = require('@diplodoc/transform/lib/plugins/images');\nconst monospace = require('@diplodoc/transform/lib/plugins/monospace');\nconst table = require('@diplodoc/transform/lib/plugins/table');\nconst term = require('@diplodoc/transform/lib/plugins/term');\nconst blockAnchor = require('@diplodoc/transform/lib/plugins/block-anchor');\nconst changelog = require('@diplodoc/transform/lib/plugins/changelog');\nconst mermaid = require('@diplodoc/mermaid-extension');\nconst latex = require('@diplodoc/latex-extension');\nconst openapi = require('@diplodoc/openapi-extension');\n\nincludes.collect = require('@diplodoc/transform/lib/plugins/includes/collect');\nimages.collect = require('@diplodoc/transform/lib/plugins/images/collect');\nchangelog.collect = require('@diplodoc/transform/lib/plugins/changelog/collect');\n\nexport const ASSETS_FOLDER = resolve(__dirname, '../assets');\nexport const BUNDLE_FOLDER = '_bundle';\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 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 latex.transform(),\n changelog,\n blockAnchor,\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\u0421onfigurationMustBeProvided = (repo: string) =>\n `\u0421onfiguration 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;\nexport const PAGE_PROCESS_CONCURRENCY = Number(process.env.PAGE_PROCESS_CONCURRENCY) || 500;\n\nexport const metadataBorder = '---';\n", "import HTMLElement from 'node-html-parser/dist/nodes/html';\nimport {parse} from 'node-html-parser';\nimport {relative, resolve, sep} from 'path';\nimport {resolveRelativePath} from '@diplodoc/transform/lib/utilsFS';\nimport url from 'url';\nimport escape from 'lodash/escapeRegExp';\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 toUrl(path: string) {\n // replace windows backslashes\n return path.replace(new RegExp(escape(sep), 'g'), '/');\n}\n\nfunction getNewNode(options: ModifyNode): HTMLElement | null {\n const {rawTagName, innerHTML, attrEntries} = options;\n\n const nodeNew = parse(`<html><${rawTagName}></${rawTagName}></html>`).querySelector(\n `${rawTagName}`,\n );\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\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 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 node.setAttribute('href', toUrl(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 node.setAttribute('src', toUrl(preparedHref));\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, toUrl(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(\n `<a class=\"yfm-anchor\" aria-hidden=\"true\" href=\"${pageIdAnchor}\" id=\"${pageId}\"></a>`,\n );\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(escape(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(\n content: string,\n options: PreprocessSinglePageOptions,\n) {\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", "import {basename, dirname, extname, format, join, relative} 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(\n localToc.items,\n 'items',\n {},\n {\n removeHiddenTocItems: true,\n },\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(\n toc: YfmToc | null,\n options: {root: string; currentPath: string},\n) {\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(\n localToc.items,\n 'items',\n {},\n {\n removeHiddenTocItems: true,\n },\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 '@diplodoc/transform/lib/liquid/evaluation';\nimport {Filter, TextItems} from '../models';\nimport liquid from '@diplodoc/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>(\n item: T,\n vars: Record<string, string>,\n options?: FilterFilesOptions,\n) {\n const {resolveConditions, removeHiddenTocItems} = options || {};\n let useItem = true;\n\n if (resolveConditions) {\n const {when} = item;\n useItem =\n when === true ||\n when === undefined ||\n (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(\n fields: undefined | string | string[],\n vars: Record<string, unknown>,\n path: string,\n) {\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) => (err ? rej(err) : res({state})));\n });\n\nexport {glob};\n\nexport default {glob};\n", "import {dirname, resolve} from 'path';\nimport shell from 'shelljs';\nimport {logger} from './logger';\n\nexport function copyFiles(\n inputFolderPath: string,\n outputFolderPath: string,\n files: string[],\n): void {\n const dirs = new Set<string>();\n\n files.forEach((pathToAsset) => {\n const outputDir = resolve(outputFolderPath, dirname(pathToAsset));\n const from = resolve(inputFolderPath, pathToAsset);\n const to = resolve(outputFolderPath, pathToAsset);\n\n if (!dirs.has(outputDir)) {\n dirs.add(outputDir);\n shell.mkdir('-p', outputDir);\n }\n\n shell.cp(from, to);\n\n logger.copy(pathToAsset);\n });\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(\n fileData: FileData,\n vcsConnector: VCSConnector,\n): Promise<string> {\n const contributors = await getFileContributorsString(fileData, vcsConnector);\n\n return `contributors: ${contributors}`;\n}\n\nasync function getFileContributorsString(\n fileData: FileData,\n vcsConnector: VCSConnector,\n): Promise<string> {\n const {tmpInputFilePath, inputFolderPathLength} = fileData;\n\n const relativeFilePath = tmpInputFilePath.substring(inputFolderPathLength);\n const fileContributors: FileContributors =\n 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[] = Object.entries(\n fileContributorsWithContributorsIncludedFiles,\n ).map(([, contributor]) => contributor);\n\n return replaceDoubleToSingleQuotes(JSON.stringify(contributorsArray));\n}\n\nasync function getContributorsForNestedFiles(\n fileData: FileData,\n vcsConnector: VCSConnector,\n): 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(\n fileData,\n includeContents,\n );\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(\n fileData: Pick<FileData, 'tmpInputFilePath'>,\n includeContents: string[],\n): 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(\n dirname(tmpInputFilePath),\n relativeIncludeFilePathWithoutHash[0],\n );\n\n relativeIncludeFilePaths.add(includeFilePath);\n }\n });\n\n return relativeIncludeFilePaths;\n}\n\nasync function getFileIncludes(\n fileData: Pick<FileData, 'fileContent' | 'tmpInputFilePath' | 'inputFolderPathLength'>,\n) {\n const {fileContent, tmpInputFilePath, inputFolderPathLength} = fileData;\n\n const results = new Set<string>();\n\n const includeContents = fileContent.match(REGEXP_INCLUDE_CONTENTS);\n if (!includeContents || includeContents.length === 0) {\n return [];\n }\n const relativeIncludeFilePaths: Set<string> = getRelativeIncludeFilePaths(\n {tmpInputFilePath},\n includeContents,\n );\n for (const relativeIncludeFilePath of relativeIncludeFilePaths.values()) {\n const relativeFilePath = relativeIncludeFilePath.substring(inputFolderPathLength + 1);\n if (results.has(relativeFilePath)) continue;\n results.add(relativeFilePath);\n\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 includedPaths = await getFileIncludes({\n inputFolderPathLength,\n fileContent: contentIncludeFile,\n tmpInputFilePath: relativeIncludeFilePath,\n });\n includedPaths.forEach((path) => results.add(path));\n }\n\n return Array.from(results.values());\n}\n\nexport {getFileContributorsMetadata, getFileContributorsString, getFileIncludes};\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 Includer,\n YfmPreset,\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) {\n return;\n }\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 {mkdir, readFile, writeFile} from 'fs/promises';\nimport {dirname, join, parse} 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 {\n readBasePath,\n writeBasePath,\n tocPath,\n item,\n passedParams: {input, leadingPage},\n index,\n } = 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 =\n index === 0\n ? join(writeBasePath, tocDirPath, input)\n : join(readBasePath, tocDirPath, input);\n\n let cache = {};\n let found = [];\n\n ({\n state: {found, cache},\n } = 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(\n graph,\n chunks,\n (old) => {\n return old ? {files: [...old.files, file]} : {files: [file]};\n },\n Object,\n );\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(\n graph: Record<string, any>,\n cursor: string[],\n ): 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(\n params.tocPath,\n `sourcedocs inlcuder is getting depricated in favor of generic includer\\n${usage}`,\n );\n\n await generic.includerFunction(params);\n}\n\nexport {name, includerFunction};\n\nexport default {name, includerFunction};\n", "import {createReadStream, createWriteStream, mkdirSync} from 'fs';\nimport {dirname, join} from 'path';\nimport {Headers, extract} 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 {\n readBasePath,\n writeBasePath,\n tocPath,\n passedParams: {input, output},\n index,\n } = 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 ? join(writeBasePath, input) : 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 '@diplodoc/transform/lib/log';\n\nimport {ArgvService, PresetService} from './index';\nimport {LeadingPage} from '../models';\nimport {\n filterFiles,\n filterTextItems,\n firstFilterTextItems,\n liquidField,\n liquidFields,\n} from './utils';\n\nfunction filterFile(path: string) {\n const {input: inputFolderPath, vars} = 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(parsedIndex.title, combinedVars, {\n resolveConditions: true,\n });\n parsedIndex.title = liquidField(title, combinedVars, path);\n\n const description = filterTextItems(parsedIndex.description, combinedVars, {\n resolveConditions: true,\n });\n parsedIndex.description = liquidFields(description, combinedVars, path);\n\n if (parsedIndex.meta?.title) {\n const metaTitle = firstFilterTextItems(parsedIndex.meta.title, 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(parsedIndex.nav.title, combinedVars, {\n resolveConditions: true,\n });\n parsedIndex.nav.title = liquidField(navTitle, combinedVars, path);\n }\n\n parsedIndex.links = filterFiles(parsedIndex.links, 'links', combinedVars, {\n resolveConditions: true,\n });\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 {LintConfig, LintRule} from '@diplodoc/transform/lib/yfmlint';\n\nimport {CollectionOfPluginsFunction, Plugin, PluginOptions} 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 {existsSync, readFileSync, writeFileSync} from 'fs';\nimport {basename, dirname, extname, join, resolve} from 'path';\nimport shell from 'shelljs';\nimport log from '@diplodoc/transform/lib/log';\nimport liquid from '@diplodoc/transform/lib/liquid';\n\nimport {ArgvService, PluginService} from '../services';\nimport {getVarsPerFile, logger} from '../utils';\nimport {PluginOptions, ResolveMd2MdOptions} from '../models';\nimport {PROCESSING_FINISHED} from '../constants';\nimport {getContentWithUpdatedMetadata} from '../services/metadata';\nimport {ChangelogItem} from '@diplodoc/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(\n 3,\n '0',\n )}`;\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(\n changesPath,\n JSON.stringify({\n ...changes,\n source: mdFilename,\n }),\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 {applyPresets, resolveConditions, conditionsInCode} = 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 {disableLiquid} = 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 '@diplodoc/transform';\nimport log from '@diplodoc/transform/lib/log';\nimport liquid from '@diplodoc/transform/lib/liquid';\n\nimport {LeadingPage, ResolveMd2HTMLResult, ResolverOptions, YfmToc} from '../models';\nimport {ArgvService, PluginService, TocService} from '../services';\nimport {\n generateStaticMarkup,\n getVarsPerFile,\n getVarsPerRelativeFile,\n logger,\n transformToc,\n} from '../utils';\nimport {Lang, PROCESSING_FINISHED} from '../constants';\nimport {getAssetsPublicPath, getUpdatedMetadata} from '../services/metadata';\nimport {MarkdownItPluginCb} from '@diplodoc/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 =\n 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 if (result.html) {\n result.html = result.html.replace(/\\n+/gm, '');\n }\n\n const updatedMetadata =\n 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 || []).map(fixRelativePath(inputPath));\n fileMeta.script = (fileMeta.script || [])\n .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((link) =>\n link.href ? {...link, href: link.href.replace(/.md$/gmu, '.html')} : link,\n );\n\n if (links) {\n data.links = links;\n }\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 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 '@diplodoc/transform/lib/log';\nimport {\n LintMarkdownFunctionOptions,\n PluginOptions,\n default as yfmlint,\n} from '@diplodoc/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 {input, lintConfig, disableLiquid, outputFormat, ...options} = 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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_log", "import_path", "import_path", "import_fs", "import_js_yaml", "import_shelljs", "import_liquid", "import_log", "import_chalk", "log", "import_path", "import_path", "import_path", "import_path", "evalExp", "liquid", "import_path", "libglob", "import_path", "import_path", "import_path", "import_path", "import_lodash", "import_promises", "import_path", "import_js_yaml", "includerFunction", "name", "name", "includerFunction", "name", "includerFunction", "includerFunction", "name", "import_path", "name", "includerFunction", "name", "includerFunction", "name", "shell", "log", "walkSync", "liquid", "import_path", "add", "import_path", "import_fs", "init", "import_path", "import_fs", "import_js_yaml", "import_log", "import_fs", "import_path", "import_shelljs", "import_log", "import_liquid", "liquid", "import_path", "import_fs", "import_js_yaml", "import_log", "import_liquid", "liquid", "import_path", "import_log", "import_fs", "import_chalk", "log", "plugins", "lintMarkdown", "sourceMap", "yfmlint", "presetStorage", "navigationPaths", "log"]
|
|
7
7
|
}
|