@diplodoc/cli 5.20.1 → 5.21.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/build/index.js CHANGED
@@ -346180,7 +346180,7 @@ var import_config72 = require("@diplodoc/cli/lib/config");
346180
346180
 
346181
346181
  // src/constants.ts
346182
346182
  var import_node_path2 = require("node:path");
346183
- var VERSION = "5.20.1" ? "5.20.1" : "0.0.0";
346183
+ var VERSION = "5.21.0" ? "5.21.0" : "0.0.0";
346184
346184
  var MAIN_TIMER_ID = "Build time";
346185
346185
  var ASSETS_FOLDER = (0, import_node_path2.resolve)(__dirname, "../assets");
346186
346186
  var BUNDLE_FOLDER = "_bundle";
@@ -380342,8 +380342,8 @@ var run2 = async (argv2) => {
380342
380342
  if (import_node_worker_threads4.isMainThread && require.main === module) {
380343
380343
  (async () => {
380344
380344
  import_utils312.console.time(MAIN_TIMER_ID);
380345
- if ("5.20.1") {
380346
- import_utils312.console.log(`Using v${"5.20.1"} version`);
380345
+ if ("5.21.0") {
380346
+ import_utils312.console.log(`Using v${"5.21.0"} version`);
380347
380347
  }
380348
380348
  const report = await run2(process.argv);
380349
380349
  import_utils312.console.timeEnd(MAIN_TIMER_ID);
package/build/index.mjs CHANGED
@@ -346167,7 +346167,7 @@ import { Command as Command7 } from "@diplodoc/cli/lib/config";
346167
346167
 
346168
346168
  // src/constants.ts
346169
346169
  import { resolve as resolve2 } from "node:path";
346170
- var VERSION = "5.20.1" ? "5.20.1" : "0.0.0";
346170
+ var VERSION = "5.21.0" ? "5.21.0" : "0.0.0";
346171
346171
  var MAIN_TIMER_ID = "Build time";
346172
346172
  var ASSETS_FOLDER = resolve2(__dirname, "../assets");
346173
346173
  var BUNDLE_FOLDER = "_bundle";
@@ -380362,8 +380362,8 @@ var run2 = async (argv2) => {
380362
380362
  if (isMainThread4 && __require.main === module) {
380363
380363
  (async () => {
380364
380364
  console5.time(MAIN_TIMER_ID);
380365
- if ("5.20.1") {
380366
- console5.log(`Using v${"5.20.1"} version`);
380365
+ if ("5.21.0") {
380366
+ console5.log(`Using v${"5.21.0"} version`);
380367
380367
  }
380368
380368
  const report = await run2(process.argv);
380369
380369
  console5.timeEnd(MAIN_TIMER_ID);
package/lib/toc/index.js CHANGED
@@ -246,6 +246,9 @@ async function validateToc(toc) {
246
246
  }
247
247
  async function templateFields(toc) {
248
248
  const { conditions, substitutions } = this.settings;
249
+ if (!conditions && !substitutions) {
250
+ return toc;
251
+ }
249
252
  const interpolate = (box, field) => {
250
253
  const value = box[field];
251
254
  if (typeof value !== "string") {
@@ -253,11 +256,32 @@ async function templateFields(toc) {
253
256
  }
254
257
  box[field] = import_liquid2.liquidSnippet.call(this, value, this.vars);
255
258
  };
256
- if (!conditions && !substitutions) {
257
- return toc;
258
- }
259
+ const interpolateDeep = (obj) => {
260
+ for (const key of Object.keys(obj)) {
261
+ const value = obj[key];
262
+ if (typeof value === "string") {
263
+ interpolate(obj, key);
264
+ } else if (Array.isArray(value)) {
265
+ for (let i = 0; i < value.length; i++) {
266
+ const item = value[i];
267
+ if (typeof item === "string") {
268
+ value[i] = import_liquid2.liquidSnippet.call(this, item, this.vars);
269
+ } else if (item && typeof item === "object") {
270
+ interpolateDeep(item);
271
+ }
272
+ }
273
+ } else if (value && typeof value === "object") {
274
+ interpolateDeep(value);
275
+ }
276
+ }
277
+ };
259
278
  for (const field of ["href", "title", "label", "navigation"]) {
260
- interpolate(toc, field);
279
+ const value = toc[field];
280
+ if (typeof value === "string") {
281
+ interpolate(toc, field);
282
+ } else if (value && typeof value === "object") {
283
+ interpolateDeep(value);
284
+ }
261
285
  }
262
286
  toc.items = await this.toc.walkItems(toc.items, (item) => {
263
287
  for (const field of ["name", "href"]) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/core/toc/index.ts", "../../src/core/toc/hooks.ts", "../../src/core/toc/loader.ts", "../../src/core/toc/utils.ts", "../../src/core/toc/TocService.ts"],
4
- "sourcesContent": ["export type * from './types';\nexport type {LoaderContext} from './loader';\n\nexport {getHooks} from './hooks';\nexport {IncludeMode} from './loader';\nexport {TocService} from './TocService';\n", "import type {VFile} from '~/core/utils';\nimport type {IncludeInfo, IncluderOptions, RawToc, RawTocItem, Toc} from './types';\n\nimport {\n AsyncParallelHook,\n AsyncSeriesHook,\n AsyncSeriesWaterfallHook,\n HookMap,\n SyncHook,\n} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n /**\n * Called before item data processing (but after data interpolation)\n */\n Item: new AsyncSeriesWaterfallHook<[RawTocItem, NormalizedPath]>(\n ['TocItem', 'TocPath'],\n `${name}.Item`,\n ),\n /**\n * AsyncSeriesWaterfall HookMap called for each includer name detected in toc.<br>\n * Expects RawToc as result of waterfall.\n */\n Includer: new HookMap(\n (type: string) =>\n new AsyncSeriesWaterfallHook<[RawToc, IncluderOptions, NormalizedPath]>(\n ['Toc', 'options', 'from'],\n `${name}.Includer(${type})`,\n ),\n ),\n Loaded: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Loaded`),\n Resolved: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Resolved`),\n Included: new AsyncParallelHook<[Toc, IncludeInfo]>(\n ['Toc', 'IncludeInfo'],\n `${name}.Included`,\n ),\n Dump: new AsyncSeriesHook<[VFile<Toc>]>(['vfile'], `${name}.Dump`),\n Filtered: new SyncHook<[NormalizedPath]>(['path'], `${name}.Filtered`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Toc', hooks);\n\nexport {getHooks, withHooks};\n", "import type {LiquidContext} from '@diplodoc/liquid';\nimport type {TocService} from './TocService';\nimport type {\n EntryTocItem,\n IncludeInfo,\n Navigation,\n NavigationHeaderItem,\n RawToc,\n RawTocItem,\n Toc,\n TocInclude,\n YfmString,\n} from './types';\n\nimport {ok} from 'node:assert';\nimport {dirname, join, relative} from 'node:path';\nimport {omit} from 'lodash';\nimport {liquidSnippet} from '@diplodoc/liquid';\n\nimport {evaluateWhen, normalizePath, own} from '~/core/utils';\n\nimport {getHooks} from './hooks';\nimport {getFirstValuable, isRelative} from './utils';\n\nexport type LoaderContext = LiquidContext & {\n /** Relative to run.input path to current processing toc */\n path: NormalizedPath;\n /** Path of last include level */\n from: NormalizedPath;\n /** Path of last include level with 'merge' mode */\n base?: NormalizedPath;\n mode: IncludeMode | undefined;\n vars: Hash;\n include: (path: RelativePath, include: IncludeInfo) => Promise<Toc | undefined>;\n options: {\n removeHiddenItems: boolean;\n removeEmptyItems: boolean;\n skipMissingVars?: boolean;\n mode: string;\n };\n toc: TocService;\n};\n\nexport enum IncludeMode {\n RootMerge = 'root_merge',\n Merge = 'merge',\n Link = 'link',\n}\n\ntype MergeIncludeInfo = IncludeInfo & {\n mode: IncludeMode.RootMerge | IncludeMode.Merge;\n base: RelativePath;\n};\n\ntype LinkIncludeInfo = IncludeInfo & {\n mode: IncludeMode.Link;\n base?: undefined;\n};\n\nexport function isLinkMode(include: IncludeInfo | LoaderContext): include is LinkIncludeInfo {\n return IncludeMode.Link === include.mode;\n}\n\nexport function isMergeMode(include: IncludeInfo | LoaderContext): include is MergeIncludeInfo {\n return IncludeMode.RootMerge === include.mode || IncludeMode.Merge === include.mode;\n}\n\n// Designed to be isolated loaders in future\nexport async function loader(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n // Resolves toc fields which can be filterable arrays.\n // Apply when filter in some toc fields\n toc = await resolveFields.call(this, toc);\n\n // Apply when filter in navigation header items\n toc = await resolveNavigation.call(this, toc);\n\n // validate toc to [object Object] in fields\n toc = await validateToc.call(this, toc);\n\n // Apply when filter in toc.items\n // Drop hidden items\n toc = await resolveItems.call(this, toc);\n\n // Interpolate liquid vars in some toc fields\n toc = await templateFields.call(this, toc);\n\n // Make include paths relative to project root instead of toc root\n toc = await rebaseIncludes.call(this, toc);\n\n // Resolve includes and includers in toc items\n toc = await processItems.call(this, toc);\n\n // Rebase items href path for deep includes\n toc = await rebaseItems.call(this, toc);\n\n // Fix item href extensions\n toc = await normalizeItems.call(this, toc);\n\n // Remove empty items (no children and no href) if needed\n toc = await removeEmptyItems.call(this, toc);\n\n return toc;\n}\n\n/**\n * Resolves toc fields which can be filterable arrays.\n * Convert arrays to text fields (gets first truth value)\n */\nasync function resolveFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n for (const field of ['title', 'label'] as const) {\n const value = toc[field];\n if (value) {\n toc[field] = getFirstValuable<YfmString>(value, this.vars);\n }\n }\n\n return toc;\n}\n\n/**\n * Filters navigation header items (leftItems and rightItems) by `when` condition.\n */\nasync function resolveNavigation(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {skipMissingVars} = this.options;\n const {conditions} = this.settings;\n\n if (!conditions || !toc.navigation || typeof toc.navigation !== 'object') {\n return toc;\n }\n\n const navigation = toc.navigation as Navigation;\n\n if (!navigation.header) {\n return toc;\n }\n\n const filterItems = (items: NavigationHeaderItem[] | undefined): NavigationHeaderItem[] => {\n if (!items || !Array.isArray(items)) {\n return [];\n }\n\n return items.filter((item) => {\n if (typeof item.when === 'string') {\n const result = evaluateWhen(item.when, this.vars, skipMissingVars);\n delete item.when;\n\n return result;\n }\n\n if (item.when === false) {\n delete item.when;\n\n return false;\n }\n\n delete item.when;\n\n return true;\n });\n };\n\n if (navigation.header.leftItems) {\n navigation.header.leftItems = filterItems(navigation.header.leftItems);\n }\n\n if (navigation.header.rightItems) {\n navigation.header.rightItems = filterItems(navigation.header.rightItems);\n }\n\n return toc;\n}\n\n/**\n * Checks table of contents items for invalid object values.\n * Recursively checks nested items.\n */\nfunction checkTocItems(items: RawTocItem[], path = 'items'): string[] {\n const errors: string[] = [];\n const CHECK_FIELDS = ['name', 'href', 'title', 'label', 'navigation'] as const;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const currentPath = `${path}[${i}]`;\n\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n for (const field of CHECK_FIELDS) {\n if (\n item[field as keyof RawTocItem] !== undefined &&\n item[field as keyof RawTocItem]?.toString() === '[object Object]'\n ) {\n errors.push(`${currentPath}.${field}`);\n }\n }\n\n if (item.items && Array.isArray(item.items)) {\n const nestedErrors = checkTocItems(item.items, `${currentPath}.items`);\n errors.push(...nestedErrors);\n }\n }\n }\n return errors;\n}\n\nasync function validateToc(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n if (toc.items && Array.isArray(toc.items)) {\n const errors = checkTocItems(toc.items);\n const path = this.from ? this.from + ' -> ' + this.path : this.path;\n for (const error of errors) {\n this.logger.error(\n `Invalid toc structure in ${path.toString()} at ${error}: found [object Object] value`,\n );\n }\n }\n\n return toc;\n}\n\n/**\n * Applies liquid substitutions for some toc fields\n */\nasync function templateFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {conditions, substitutions} = this.settings;\n const interpolate = (box: Hash, field: string) => {\n const value = box[field];\n if (typeof value !== 'string') {\n return;\n }\n\n box[field] = liquidSnippet.call(this, value, this.vars);\n };\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n for (const field of ['href', 'title', 'label', 'navigation'] as const) {\n interpolate(toc, field);\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n for (const field of ['name', 'href'] as const) {\n interpolate(item, field);\n }\n\n return item;\n });\n\n return toc;\n}\n\n/**\n * Applies `when` filter in toc items.\n * Also drops hidden items if needed.\n */\nasync function resolveItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeHiddenItems, skipMissingVars} = this.options;\n const {conditions, substitutions} = this.settings;\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n let when = true;\n\n if (conditions) {\n if (typeof item.when === 'string') {\n when = evaluateWhen(item.when, this.vars, skipMissingVars);\n } else {\n // when: null/undefined/false are handled here\n when = item.when !== false;\n }\n\n delete item.when;\n }\n\n if (removeHiddenItems) {\n when = when && !item.hidden;\n delete item.hidden;\n }\n\n if (when) {\n return item;\n }\n\n if ('href' in item && item['href'] === null) {\n this.logger.warn(\n `Empty href property in item with name: ${item.name} in toc: ${this.path}`,\n );\n }\n\n return undefined;\n });\n\n return toc;\n}\n\n/**\n * Processes items includes and includers.\n * Then merges result in original place in `named` or `inline` mode.\n */\nasync function processItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rawToc = toc;\n const isTranslateMode = this.options.mode === 'translate';\n\n toc.items = await this.toc.walkItems(toc.items, async (item) => {\n item = await getHooks(this.toc).Item.promise(item, this.path);\n\n if (\n !item ||\n !own(item, 'include') ||\n (isTranslateMode && item.include.path === 'openapi')\n ) {\n return item;\n }\n\n const {include} = item;\n\n ok(include.path, 'Invalid value for include path.');\n\n let toc: RawToc;\n if (own(include, 'includers')) {\n ok(\n include.mode === IncludeMode.Link || !include.mode,\n 'Invalid mode value for include with includers.',\n );\n ok(Array.isArray(include.includers), 'Includers should be an array.');\n\n const tocPath = include.path.endsWith('toc.yaml')\n ? normalizePath(include.path)\n : normalizePath(join(include.path, 'toc.yaml'));\n\n toc = {path: tocPath};\n\n for (const includer of include.includers) {\n const hook = getHooks(this.toc).Includer.get(includer.name);\n\n ok(includer.name, 'Includer name should be a string.');\n ok(hook, `Includer with name '${includer.name}' is not registered.`);\n\n const options = {\n ...includer,\n path: tocPath,\n rawToc,\n include,\n };\n\n toc = await hook.promise(toc, options, this.path);\n }\n\n toc = (await this.include(tocPath, {\n from: this.path,\n mode: IncludeMode.Link,\n content: toc,\n })) as RawToc;\n } else {\n const includeInfo = {\n from: this.path,\n mode: include.mode,\n } as IncludeInfo;\n\n if (isMergeMode(includeInfo)) {\n includeInfo.base = this.base || this.path;\n }\n\n toc = (await this.include(include.path, includeInfo)) as RawToc;\n }\n\n item = omit(item, ['include']) as RawTocItem;\n\n if (!toc) {\n return null;\n }\n\n // named mode\n if (item.name) {\n item.items = (item.items || []).concat((toc.items as RawTocItem[]) || []);\n\n return item;\n } else {\n return toc.items as RawTocItem[];\n }\n });\n\n return toc;\n}\n\n/**\n * Rebases items includes path.\n * For link mode path should be always relative to original toc source.\n * For merge modes path should be relative to merge base, which can be inherited from parent->parent->toc.\n */\nasync function rebaseIncludes(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseIncludes = (item: RawTocItem | RawToc) => {\n if (!own<TocInclude, 'include'>(item, 'include')) {\n return item;\n }\n\n if (!item.include.mode) {\n item.include.mode = own<unknown, 'includers'>(item.include, 'includers')\n ? IncludeMode.Link\n : IncludeMode.RootMerge;\n }\n\n if (item.include.mode === IncludeMode.RootMerge) {\n return item;\n }\n\n if (isLinkMode(this)) {\n item.include.path = join(dirname(this.path), item.include.path);\n } else {\n item.include.path = join(dirname(this.base || this.path), item.include.path);\n }\n\n return item;\n };\n\n await this.toc.walkItems([toc], rebaseIncludes);\n\n return toc;\n}\n\n/**\n * Rebase items href after include in parent toc\n */\nasync function rebaseItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseHrefs = (item: RawTocItem | RawToc) => {\n if (own<AnyPath, 'href'>(item, 'href') && isRelative(item.href)) {\n const absBase = dirname(this.from);\n const absPath = join(dirname(this.base || this.path), item.href);\n\n item.href = relative(absBase, absPath) as YfmString & RelativePath;\n }\n\n return item;\n };\n\n if (isLinkMode(this)) {\n await this.toc.walkItems([toc], rebaseHrefs);\n }\n\n return toc;\n}\n\n/**\n * Fixes item href extensions\n */\nasync function normalizeItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n await this.toc.walkEntries([toc as unknown as EntryTocItem], (item) => {\n if (!item.href) {\n // @ts-ignore\n delete item['href'];\n return item;\n }\n\n let href: string = normalizePath(item.href);\n\n if (href.endsWith('/')) {\n href += 'index.yaml';\n }\n\n if (!href.endsWith('.md') && !href.endsWith('.yaml')) {\n href += '.md';\n }\n\n item.href = href as YfmString & NormalizedPath;\n return item;\n });\n\n return toc;\n}\n\n/**\n * Removes empty items (no children and no href) if needed.\n */\nasync function removeEmptyItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeEmptyItems} = this.options;\n\n if (!removeEmptyItems) {\n return toc;\n }\n\n const removeEmpty = (item: RawTocItem) => {\n // An item is empty if it has no children (no items property or empty items array) AND no href\n const hasChildren = item.items && item.items.length > 0;\n\n if (!hasChildren && !own(item, 'href')) {\n return null;\n }\n return item;\n };\n\n toc.items = await this.toc.walkItems(toc.items, removeEmpty);\n\n return toc;\n}\n", "import type {TextFilter} from './types';\n\nimport {evaluate} from '@diplodoc/liquid';\n\nimport {isExternalHref, own} from '~/core/utils';\n\nexport function isRelative(path: AnyPath): path is RelativePath {\n return /^\\.{1,2}\\//.test(path) || !/^(\\w{0,7}:)?\\/\\//.test(path);\n}\n\nexport function isEntryItem(item: unknown): item is {href: string} {\n return own<string, 'href'>(item, 'href') && !isExternalHref(item.href);\n}\n\nexport function getFirstValuable<T>(\n items: TextFilter[] | string,\n vars: Hash,\n fallback?: T,\n): T | undefined {\n if (typeof items === 'string') {\n items = [{text: items, when: true}];\n }\n\n if (!Array.isArray(items)) {\n items = [];\n }\n\n for (const item of items) {\n let {when = true} = item;\n delete item.when;\n\n if (typeof when === 'string') {\n when = Boolean(evaluate(when, vars));\n }\n\n if (when) {\n return item.text as T;\n }\n }\n\n return fallback;\n}\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {MetaService} from '~/core/meta';\nimport type {\n EntryTocItem,\n GraphData,\n GraphTocData,\n IncludeInfo,\n RawToc,\n RawTocItem,\n Toc,\n WithItems,\n} from './types';\nimport type {LoaderContext} from './loader';\nimport type {WatchConfig} from '~/commands/build/features/watch';\n\nimport {basename, dirname, join, relative} from 'node:path';\nimport {dump, load} from 'js-yaml';\nimport {dedent} from 'ts-dedent';\n\nimport {\n Defer,\n Graph,\n VFile,\n bounded,\n copyJson,\n errorMessage,\n memoize,\n normalizePath,\n own,\n} from '~/core/utils';\n\nimport {getHooks, withHooks} from './hooks';\nimport {isEntryItem} from './utils';\nimport {isMergeMode, loader} from './loader';\n\nexport type TocServiceConfig = {\n ignore: string[];\n ignoreStage: string[];\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n features: {\n conditions: boolean | string;\n substitutions: boolean;\n };\n scopes: {\n code: boolean;\n text: boolean;\n };\n };\n removeHiddenTocItems: boolean;\n removeEmptyTocItems: boolean;\n} & Partial<WatchConfig>;\n\ntype WalkStepResult<I> = I | I[] | null | undefined;\n\nexport type WalkStepContext<T extends object = {}> = Hash<unknown> & T;\n\ntype RestrictedAccessContext = WalkStepContext<{\n 'restricted-access'?: string[][];\n}>;\n\ntype WalkOptions<T> = {\n accept: (item: T) => boolean;\n};\n\ntype Run = BaseRun<TocServiceConfig> & {\n vars: VarsService;\n meta: MetaService;\n};\n\ntype Options = Partial<{\n skipMissingVars: boolean;\n mode: 'translate' | 'build';\n pdfDebug: boolean;\n}>;\n\n@withHooks\nexport class TocService {\n readonly name = 'Toc';\n\n readonly relations = new Graph<GraphData>();\n\n get tocs() {\n return (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc).map(this.for);\n }\n\n get entries() {\n const allEntries = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isEntry);\n\n // Find all TOC files and determine the minimum nesting level\n const allTocPaths = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc);\n if (allTocPaths.length === 0) {\n return allEntries;\n }\n\n // Calculate nesting levels for all TOC files\n const nestingLevels = allTocPaths.map((tocPath) => tocPath.split('/').length);\n const minNestingLevel = Math.min(...nestingLevels);\n\n // Filter entries to include only those from TOC files that are either:\n // 1. At the minimum nesting level (root TOC files)\n // 2. Or TOC files that are referenced by includes from other TOC files\n const filteredEntries = allEntries.filter((entry) => {\n // Find all TOC files that reference this entry\n const tocPaths = (this.relations.dependantsOf(entry) as NormalizedPath[]).filter(\n this.isToc,\n );\n\n // Check if any of the referencing TOC files is a root TOC or is referenced itself\n return tocPaths.some((tocPath) => {\n const nestingLevel = tocPath.split('/').length;\n const isRootToc = nestingLevel === minNestingLevel;\n const isReferenced = this.relations.dependenciesOf(tocPath).length > 0;\n return isRootToc || isReferenced;\n });\n });\n\n return filteredEntries;\n }\n\n private run: Run;\n\n private logger: Run['logger'];\n\n private config: TocServiceConfig;\n\n private options;\n\n private get vars() {\n return this.run.vars;\n }\n\n private get meta() {\n return this.run.meta;\n }\n\n constructor(run: Run, options: Options) {\n this.run = run;\n this.logger = run.logger;\n this.config = run.config;\n this.options = {\n skipMissingVars: false,\n mode: 'build',\n pdfDebug: false,\n ...options,\n };\n }\n\n async init(paths: NormalizedPath[]) {\n for (const path of paths) {\n await this.load(path);\n }\n\n return this.tocs.filter((toc) => paths.includes(toc.path));\n }\n\n async pushAdditionalEntries(path: NormalizedPath, toc: Toc) {\n await this.addEntries(path, toc);\n }\n\n async dump(file: NormalizedPath, toc?: Toc): Promise<VFile<Toc>> {\n toc = toc || this.for(file);\n\n return this._dump(toc.path, toc);\n }\n\n /**\n * Visits items which will be project entries. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkEntries<T extends WithItems<T> & {href: NormalizedPath}>(\n items: T[] | undefined,\n actor: (item: T) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n ): Promise<T[] | undefined> {\n return this.walkItems(items, actor, {accept: isEntryItem});\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T> = {accept: () => true},\n ): Promise<T[] | undefined> {\n return this._walkItems(items, actor, options);\n }\n\n /**\n * Resolves toc path and data for any page path.\n * Expects what all paths are already loaded in service.\n */\n @bounded for(path: RelativePath): Toc {\n const file = normalizePath(path);\n\n if (this.isToc(file)) {\n return this.relations.getNodeData(file).data as Toc;\n }\n\n const tocPaths = (this.relations.dependantsOf(file) as NormalizedPath[]).filter(this.isToc);\n if (!tocPaths.length) {\n throw new Error('Error while finding toc dir.');\n }\n\n if (tocPaths.length === 1) {\n return this.relations.getNodeData(tocPaths[0]).data as Toc;\n }\n\n const fileParts = normalizePath(join(dirname(file), 'toc.yaml')).split('/');\n const toc = tocPaths.reduce(\n (result, path) => {\n const tocParts = path.split('/');\n\n let index = 0;\n let score = 0;\n while (tocParts.length > index && fileParts[index] === tocParts[index]) {\n index++;\n score++;\n }\n\n if (score > result.score) {\n return {score, path};\n }\n\n return result;\n },\n {score: 0, path: null} as {score: number; path: null | NormalizedPath},\n );\n\n if (toc.path === null) {\n throw new Error('Error while finding toc dir.');\n }\n\n return this.relations.getNodeData(toc.path).data as Toc;\n }\n\n release(path: NormalizedPath) {\n memoize.release(this._dump, path);\n }\n\n @bounded isToc(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'toc' && data.data;\n }\n\n @bounded isEntry(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'entry';\n }\n\n @bounded isGenerator(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'generator';\n }\n\n @memoize('path')\n private async _dump(file: NormalizedPath, toc: Toc): Promise<VFile<Toc>> {\n const vfile = new VFile<Toc>(file, copyJson(toc), dump);\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n private async load(file: NormalizedPath): Promise<Toc | undefined> {\n // There is no error. We really skip toc processing, if it was processed previously in any way.\n // For example toc can be processed as include of some other toc.\n if (this.relations.hasNode(file)) {\n return (this.relations.getNodeData(file) as GraphTocData).data;\n }\n\n this.logger.proc(file);\n\n const defer = new Defer<Toc | undefined>();\n\n this.relations.addNode(file, {type: 'toc', data: defer.promise});\n\n defer.promise.then((result) => {\n if (this.relations.hasNode(file)) {\n this.relations.setNodeData(file, {type: 'toc', data: result});\n }\n });\n\n const context: LoaderContext = this.loaderContext(file);\n const content = await read(this.run, file);\n\n content.path = file;\n\n if (this.shouldSkip(content)) {\n defer.resolve(undefined);\n return undefined;\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Loaded.promise(toc);\n\n // This looks how small optimization, but there was cases when toc is an array...\n // This is not that we expect.\n if (toc.href || toc.items?.length) {\n await this.addEntries(file, toc);\n await this.restrictAccess(file, toc);\n }\n\n const pdfStartPages = toc?.pdf?.startPages;\n const {pdfDebug} = this.options;\n\n if (pdfStartPages && pdfDebug) {\n const tocLikeEntries = pdfStartPages.map((page) => ({href: page}));\n\n // We want to treat pdf start pages as regular entries for puprose of debug\n this.addEntries(file, {items: tocLikeEntries, path: toc.path} as Toc);\n }\n\n defer.resolve(toc);\n\n return defer.promise;\n }\n\n @bounded\n private async include(path: RelativePath, include: IncludeInfo): Promise<Toc | undefined> {\n const file = normalizePath(path);\n\n this.relations.addNode(file);\n this.relations.setNodeData(file, {type: 'source', data: undefined});\n this.relations.addNode(include.from);\n // Don't add dependency for include - this prevents included TOC files from being considered \"referenced\"\n // Use only in watch mode\n if (this.config.watch) {\n this.relations.addDependency(include.from, file);\n }\n\n this.logger.proc(file);\n\n const context: LoaderContext = this.loaderContext(file, include);\n const content = include.content || (await read(this.run, file, include.from));\n\n if (this.shouldSkip(content)) {\n return undefined;\n }\n\n if (isMergeMode(include)) {\n const from = normalizePath(dirname(file));\n const to = normalizePath(dirname(include.base));\n\n context.vars = this.vars.for(include.base);\n context.path = context.path.replace(from, to) as NormalizedPath;\n context.from = include.from;\n\n const files = await this.run.copy(\n normalizePath(join(this.run.input, from)) as AbsolutePath,\n normalizePath(join(this.run.input, to)) as AbsolutePath,\n [basename(file), '**/toc.yaml'],\n );\n\n for (const pair of files) {\n const [from, to] = pair.map((path) =>\n normalizePath(relative(this.run.input, path)),\n );\n const {sourcePath, vcsPath} = this.meta.get(from);\n this.meta.add(to, {sourcePath: vcsPath || sourcePath || from});\n this.logger.copy(pair[0], pair[1]);\n }\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Included.promise(toc, include);\n\n return toc;\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n * DFS\n */\n private async _walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T>,\n context: Hash = {},\n ): Promise<T[] | undefined> {\n const {accept} = options;\n\n if (!items || !items.length) {\n return items;\n }\n\n const results: T[] = [];\n\n for (const item of items) {\n const itemContext: WalkStepContext = {...context};\n\n const result = (accept(item) ? await actor(item, itemContext) : item) as T &\n Record<'items', unknown>;\n\n if (result) {\n results.push(...([] as T[]).concat(result));\n\n if (own(result, 'items')) {\n // Sometime users defines items as object (one item) instead of array of one item.\n if (!Array.isArray(result.items) && result.items) {\n result.items = ([] as T[]).concat(result.items);\n }\n\n if (result.items?.length) {\n result.items = await this._walkItems(\n result.items,\n actor,\n options,\n itemContext,\n );\n }\n }\n }\n }\n\n return results;\n }\n\n private shouldSkip(toc: RawToc) {\n const {ignoreStage} = this.config;\n if (toc.stage && ignoreStage.length && ignoreStage.includes(toc.stage)) {\n return true;\n }\n\n return false;\n }\n\n private async addEntries(path: NormalizedPath, toc: Toc) {\n await this.walkEntries([toc as unknown as EntryTocItem], (item) => {\n const entryPath = normalizePath(join(dirname(path), item.href));\n this.relations.addNode(entryPath, {type: 'entry', data: undefined});\n this.relations.addDependency(toc.path, entryPath);\n\n return item;\n });\n }\n\n private async restrictAccess(path: NormalizedPath, toc: Toc) {\n await this.walkItems(\n [toc as unknown as RawTocItem],\n (item, context: RestrictedAccessContext) => {\n if (own<string | string[]>(item, 'restricted-access')) {\n let itemAccess = ([] as string[]).concat(item['restricted-access'] || []);\n\n const contextAccess: string[][] =\n (context['restricted-access'] as string[][]) ?? [];\n if (contextAccess.some(isEqualAccess(itemAccess.sort().join(',')))) {\n itemAccess = [];\n }\n\n if (itemAccess.length > 0) {\n context['restricted-access'] = [...contextAccess, itemAccess];\n }\n }\n\n if (context['restricted-access']?.length && isEntryItem(item)) {\n const href = normalizePath(join(dirname(path), item.href));\n this.meta.add(href, {\n 'restricted-access': context['restricted-access'],\n });\n }\n\n return item;\n },\n );\n\n return toc;\n }\n\n private loaderContext(path: NormalizedPath, {from, mode, base}: Partial<IncludeInfo> = {}) {\n return {\n path,\n from: from || path,\n mode,\n base,\n vars: this.vars.for(path),\n toc: this,\n logger: this.logger,\n include: this.include,\n settings: {\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n substitutions: this.config.template.features.substitutions,\n },\n options: {\n removeHiddenItems: this.config.removeHiddenTocItems,\n removeEmptyItems: this.config.removeEmptyTocItems,\n skipMissingVars: this.options.skipMissingVars,\n mode: this.options.mode,\n },\n };\n }\n}\n\nasync function read(run: Run, path: RelativePath, from?: string): Promise<RawToc> {\n try {\n const source = normalizePath(join(run.input, path)) as AbsolutePath;\n return load((await run.read(source)) || '{}') as RawToc;\n } catch (error) {\n throw new Error(dedent`\n Unable to resolve ${path}${from ? ' from ' + from : ''}.\n Original error:\n ${errorMessage(error)}\n `);\n }\n}\n\nfunction isEqualAccess(match: string) {\n return function (access: string[]) {\n return access.sort().join() === match;\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export type * from './types';\nexport type {LoaderContext} from './loader';\n\nexport {getHooks} from './hooks';\nexport {IncludeMode} from './loader';\nexport {TocService} from './TocService';\n", "import type {VFile} from '~/core/utils';\nimport type {IncludeInfo, IncluderOptions, RawToc, RawTocItem, Toc} from './types';\n\nimport {\n AsyncParallelHook,\n AsyncSeriesHook,\n AsyncSeriesWaterfallHook,\n HookMap,\n SyncHook,\n} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n /**\n * Called before item data processing (but after data interpolation)\n */\n Item: new AsyncSeriesWaterfallHook<[RawTocItem, NormalizedPath]>(\n ['TocItem', 'TocPath'],\n `${name}.Item`,\n ),\n /**\n * AsyncSeriesWaterfall HookMap called for each includer name detected in toc.<br>\n * Expects RawToc as result of waterfall.\n */\n Includer: new HookMap(\n (type: string) =>\n new AsyncSeriesWaterfallHook<[RawToc, IncluderOptions, NormalizedPath]>(\n ['Toc', 'options', 'from'],\n `${name}.Includer(${type})`,\n ),\n ),\n Loaded: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Loaded`),\n Resolved: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Resolved`),\n Included: new AsyncParallelHook<[Toc, IncludeInfo]>(\n ['Toc', 'IncludeInfo'],\n `${name}.Included`,\n ),\n Dump: new AsyncSeriesHook<[VFile<Toc>]>(['vfile'], `${name}.Dump`),\n Filtered: new SyncHook<[NormalizedPath]>(['path'], `${name}.Filtered`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Toc', hooks);\n\nexport {getHooks, withHooks};\n", "import type {LiquidContext} from '@diplodoc/liquid';\nimport type {TocService} from './TocService';\nimport type {\n EntryTocItem,\n IncludeInfo,\n Navigation,\n NavigationHeaderItem,\n RawToc,\n RawTocItem,\n Toc,\n TocInclude,\n YfmString,\n} from './types';\n\nimport {ok} from 'node:assert';\nimport {dirname, join, relative} from 'node:path';\nimport {omit} from 'lodash';\nimport {liquidSnippet} from '@diplodoc/liquid';\n\nimport {evaluateWhen, normalizePath, own} from '~/core/utils';\n\nimport {getHooks} from './hooks';\nimport {getFirstValuable, isRelative} from './utils';\n\nexport type LoaderContext = LiquidContext & {\n /** Relative to run.input path to current processing toc */\n path: NormalizedPath;\n /** Path of last include level */\n from: NormalizedPath;\n /** Path of last include level with 'merge' mode */\n base?: NormalizedPath;\n mode: IncludeMode | undefined;\n vars: Hash;\n include: (path: RelativePath, include: IncludeInfo) => Promise<Toc | undefined>;\n options: {\n removeHiddenItems: boolean;\n removeEmptyItems: boolean;\n skipMissingVars?: boolean;\n mode: string;\n };\n toc: TocService;\n};\n\nexport enum IncludeMode {\n RootMerge = 'root_merge',\n Merge = 'merge',\n Link = 'link',\n}\n\ntype MergeIncludeInfo = IncludeInfo & {\n mode: IncludeMode.RootMerge | IncludeMode.Merge;\n base: RelativePath;\n};\n\ntype LinkIncludeInfo = IncludeInfo & {\n mode: IncludeMode.Link;\n base?: undefined;\n};\n\nexport function isLinkMode(include: IncludeInfo | LoaderContext): include is LinkIncludeInfo {\n return IncludeMode.Link === include.mode;\n}\n\nexport function isMergeMode(include: IncludeInfo | LoaderContext): include is MergeIncludeInfo {\n return IncludeMode.RootMerge === include.mode || IncludeMode.Merge === include.mode;\n}\n\n// Designed to be isolated loaders in future\nexport async function loader(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n // Resolves toc fields which can be filterable arrays.\n // Apply when filter in some toc fields\n toc = await resolveFields.call(this, toc);\n\n // Apply when filter in navigation header items\n toc = await resolveNavigation.call(this, toc);\n\n // validate toc to [object Object] in fields\n toc = await validateToc.call(this, toc);\n\n // Apply when filter in toc.items\n // Drop hidden items\n toc = await resolveItems.call(this, toc);\n\n // Interpolate liquid vars in some toc fields\n toc = await templateFields.call(this, toc);\n\n // Make include paths relative to project root instead of toc root\n toc = await rebaseIncludes.call(this, toc);\n\n // Resolve includes and includers in toc items\n toc = await processItems.call(this, toc);\n\n // Rebase items href path for deep includes\n toc = await rebaseItems.call(this, toc);\n\n // Fix item href extensions\n toc = await normalizeItems.call(this, toc);\n\n // Remove empty items (no children and no href) if needed\n toc = await removeEmptyItems.call(this, toc);\n\n return toc;\n}\n\n/**\n * Resolves toc fields which can be filterable arrays.\n * Convert arrays to text fields (gets first truth value)\n */\nasync function resolveFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n for (const field of ['title', 'label'] as const) {\n const value = toc[field];\n if (value) {\n toc[field] = getFirstValuable<YfmString>(value, this.vars);\n }\n }\n\n return toc;\n}\n\n/**\n * Filters navigation header items (leftItems and rightItems) by `when` condition.\n */\nasync function resolveNavigation(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {skipMissingVars} = this.options;\n const {conditions} = this.settings;\n\n if (!conditions || !toc.navigation || typeof toc.navigation !== 'object') {\n return toc;\n }\n\n const navigation = toc.navigation as Navigation;\n\n if (!navigation.header) {\n return toc;\n }\n\n const filterItems = (items: NavigationHeaderItem[] | undefined): NavigationHeaderItem[] => {\n if (!items || !Array.isArray(items)) {\n return [];\n }\n\n return items.filter((item) => {\n if (typeof item.when === 'string') {\n const result = evaluateWhen(item.when, this.vars, skipMissingVars);\n delete item.when;\n\n return result;\n }\n\n if (item.when === false) {\n delete item.when;\n\n return false;\n }\n\n delete item.when;\n\n return true;\n });\n };\n\n if (navigation.header.leftItems) {\n navigation.header.leftItems = filterItems(navigation.header.leftItems);\n }\n\n if (navigation.header.rightItems) {\n navigation.header.rightItems = filterItems(navigation.header.rightItems);\n }\n\n return toc;\n}\n\n/**\n * Checks table of contents items for invalid object values.\n * Recursively checks nested items.\n */\nfunction checkTocItems(items: RawTocItem[], path = 'items'): string[] {\n const errors: string[] = [];\n const CHECK_FIELDS = ['name', 'href', 'title', 'label', 'navigation'] as const;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const currentPath = `${path}[${i}]`;\n\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n for (const field of CHECK_FIELDS) {\n if (\n item[field as keyof RawTocItem] !== undefined &&\n item[field as keyof RawTocItem]?.toString() === '[object Object]'\n ) {\n errors.push(`${currentPath}.${field}`);\n }\n }\n\n if (item.items && Array.isArray(item.items)) {\n const nestedErrors = checkTocItems(item.items, `${currentPath}.items`);\n errors.push(...nestedErrors);\n }\n }\n }\n return errors;\n}\n\nasync function validateToc(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n if (toc.items && Array.isArray(toc.items)) {\n const errors = checkTocItems(toc.items);\n const path = this.from ? this.from + ' -> ' + this.path : this.path;\n for (const error of errors) {\n this.logger.error(\n `Invalid toc structure in ${path.toString()} at ${error}: found [object Object] value`,\n );\n }\n }\n\n return toc;\n}\n\n/**\n * Applies liquid substitutions for some toc fields\n */\nasync function templateFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {conditions, substitutions} = this.settings;\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n const interpolate = (box: Hash, field: string) => {\n const value = box[field];\n if (typeof value !== 'string') {\n return;\n }\n\n box[field] = liquidSnippet.call(this, value, this.vars);\n };\n\n /**\n * Recursively interpolates all string fields in an object,\n * traversing nested objects and arrays.\n */\n const interpolateDeep = (obj: Hash) => {\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (typeof value === 'string') {\n interpolate(obj, key);\n } else if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n\n if (typeof item === 'string') {\n value[i] = liquidSnippet.call(this, item, this.vars);\n } else if (item && typeof item === 'object') {\n interpolateDeep(item as Hash);\n }\n }\n } else if (value && typeof value === 'object') {\n interpolateDeep(value as Hash);\n }\n }\n };\n\n for (const field of ['href', 'title', 'label', 'navigation'] as const) {\n const value = toc[field];\n\n if (typeof value === 'string') {\n interpolate(toc, field);\n } else if (value && typeof value === 'object') {\n interpolateDeep(value as Hash);\n }\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n for (const field of ['name', 'href'] as const) {\n interpolate(item, field);\n }\n\n return item;\n });\n\n return toc;\n}\n\n/**\n * Applies `when` filter in toc items.\n * Also drops hidden items if needed.\n */\nasync function resolveItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeHiddenItems, skipMissingVars} = this.options;\n const {conditions, substitutions} = this.settings;\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n let when = true;\n\n if (conditions) {\n if (typeof item.when === 'string') {\n when = evaluateWhen(item.when, this.vars, skipMissingVars);\n } else {\n // when: null/undefined/false are handled here\n when = item.when !== false;\n }\n\n delete item.when;\n }\n\n if (removeHiddenItems) {\n when = when && !item.hidden;\n delete item.hidden;\n }\n\n if (when) {\n return item;\n }\n\n if ('href' in item && item['href'] === null) {\n this.logger.warn(\n `Empty href property in item with name: ${item.name} in toc: ${this.path}`,\n );\n }\n\n return undefined;\n });\n\n return toc;\n}\n\n/**\n * Processes items includes and includers.\n * Then merges result in original place in `named` or `inline` mode.\n */\nasync function processItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rawToc = toc;\n const isTranslateMode = this.options.mode === 'translate';\n\n toc.items = await this.toc.walkItems(toc.items, async (item) => {\n item = await getHooks(this.toc).Item.promise(item, this.path);\n\n if (\n !item ||\n !own(item, 'include') ||\n (isTranslateMode && item.include.path === 'openapi')\n ) {\n return item;\n }\n\n const {include} = item;\n\n ok(include.path, 'Invalid value for include path.');\n\n let toc: RawToc;\n if (own(include, 'includers')) {\n ok(\n include.mode === IncludeMode.Link || !include.mode,\n 'Invalid mode value for include with includers.',\n );\n ok(Array.isArray(include.includers), 'Includers should be an array.');\n\n const tocPath = include.path.endsWith('toc.yaml')\n ? normalizePath(include.path)\n : normalizePath(join(include.path, 'toc.yaml'));\n\n toc = {path: tocPath};\n\n for (const includer of include.includers) {\n const hook = getHooks(this.toc).Includer.get(includer.name);\n\n ok(includer.name, 'Includer name should be a string.');\n ok(hook, `Includer with name '${includer.name}' is not registered.`);\n\n const options = {\n ...includer,\n path: tocPath,\n rawToc,\n include,\n };\n\n toc = await hook.promise(toc, options, this.path);\n }\n\n toc = (await this.include(tocPath, {\n from: this.path,\n mode: IncludeMode.Link,\n content: toc,\n })) as RawToc;\n } else {\n const includeInfo = {\n from: this.path,\n mode: include.mode,\n } as IncludeInfo;\n\n if (isMergeMode(includeInfo)) {\n includeInfo.base = this.base || this.path;\n }\n\n toc = (await this.include(include.path, includeInfo)) as RawToc;\n }\n\n item = omit(item, ['include']) as RawTocItem;\n\n if (!toc) {\n return null;\n }\n\n // named mode\n if (item.name) {\n item.items = (item.items || []).concat((toc.items as RawTocItem[]) || []);\n\n return item;\n } else {\n return toc.items as RawTocItem[];\n }\n });\n\n return toc;\n}\n\n/**\n * Rebases items includes path.\n * For link mode path should be always relative to original toc source.\n * For merge modes path should be relative to merge base, which can be inherited from parent->parent->toc.\n */\nasync function rebaseIncludes(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseIncludes = (item: RawTocItem | RawToc) => {\n if (!own<TocInclude, 'include'>(item, 'include')) {\n return item;\n }\n\n if (!item.include.mode) {\n item.include.mode = own<unknown, 'includers'>(item.include, 'includers')\n ? IncludeMode.Link\n : IncludeMode.RootMerge;\n }\n\n if (item.include.mode === IncludeMode.RootMerge) {\n return item;\n }\n\n if (isLinkMode(this)) {\n item.include.path = join(dirname(this.path), item.include.path);\n } else {\n item.include.path = join(dirname(this.base || this.path), item.include.path);\n }\n\n return item;\n };\n\n await this.toc.walkItems([toc], rebaseIncludes);\n\n return toc;\n}\n\n/**\n * Rebase items href after include in parent toc\n */\nasync function rebaseItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseHrefs = (item: RawTocItem | RawToc) => {\n if (own<AnyPath, 'href'>(item, 'href') && isRelative(item.href)) {\n const absBase = dirname(this.from);\n const absPath = join(dirname(this.base || this.path), item.href);\n\n item.href = relative(absBase, absPath) as YfmString & RelativePath;\n }\n\n return item;\n };\n\n if (isLinkMode(this)) {\n await this.toc.walkItems([toc], rebaseHrefs);\n }\n\n return toc;\n}\n\n/**\n * Fixes item href extensions\n */\nasync function normalizeItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n await this.toc.walkEntries([toc as unknown as EntryTocItem], (item) => {\n if (!item.href) {\n // @ts-ignore\n delete item['href'];\n return item;\n }\n\n let href: string = normalizePath(item.href);\n\n if (href.endsWith('/')) {\n href += 'index.yaml';\n }\n\n if (!href.endsWith('.md') && !href.endsWith('.yaml')) {\n href += '.md';\n }\n\n item.href = href as YfmString & NormalizedPath;\n return item;\n });\n\n return toc;\n}\n\n/**\n * Removes empty items (no children and no href) if needed.\n */\nasync function removeEmptyItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeEmptyItems} = this.options;\n\n if (!removeEmptyItems) {\n return toc;\n }\n\n const removeEmpty = (item: RawTocItem) => {\n // An item is empty if it has no children (no items property or empty items array) AND no href\n const hasChildren = item.items && item.items.length > 0;\n\n if (!hasChildren && !own(item, 'href')) {\n return null;\n }\n return item;\n };\n\n toc.items = await this.toc.walkItems(toc.items, removeEmpty);\n\n return toc;\n}\n", "import type {TextFilter} from './types';\n\nimport {evaluate} from '@diplodoc/liquid';\n\nimport {isExternalHref, own} from '~/core/utils';\n\nexport function isRelative(path: AnyPath): path is RelativePath {\n return /^\\.{1,2}\\//.test(path) || !/^(\\w{0,7}:)?\\/\\//.test(path);\n}\n\nexport function isEntryItem(item: unknown): item is {href: string} {\n return own<string, 'href'>(item, 'href') && !isExternalHref(item.href);\n}\n\nexport function getFirstValuable<T>(\n items: TextFilter[] | string,\n vars: Hash,\n fallback?: T,\n): T | undefined {\n if (typeof items === 'string') {\n items = [{text: items, when: true}];\n }\n\n if (!Array.isArray(items)) {\n items = [];\n }\n\n for (const item of items) {\n let {when = true} = item;\n delete item.when;\n\n if (typeof when === 'string') {\n when = Boolean(evaluate(when, vars));\n }\n\n if (when) {\n return item.text as T;\n }\n }\n\n return fallback;\n}\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {MetaService} from '~/core/meta';\nimport type {\n EntryTocItem,\n GraphData,\n GraphTocData,\n IncludeInfo,\n RawToc,\n RawTocItem,\n Toc,\n WithItems,\n} from './types';\nimport type {LoaderContext} from './loader';\nimport type {WatchConfig} from '~/commands/build/features/watch';\n\nimport {basename, dirname, join, relative} from 'node:path';\nimport {dump, load} from 'js-yaml';\nimport {dedent} from 'ts-dedent';\n\nimport {\n Defer,\n Graph,\n VFile,\n bounded,\n copyJson,\n errorMessage,\n memoize,\n normalizePath,\n own,\n} from '~/core/utils';\n\nimport {getHooks, withHooks} from './hooks';\nimport {isEntryItem} from './utils';\nimport {isMergeMode, loader} from './loader';\n\nexport type TocServiceConfig = {\n ignore: string[];\n ignoreStage: string[];\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n features: {\n conditions: boolean | string;\n substitutions: boolean;\n };\n scopes: {\n code: boolean;\n text: boolean;\n };\n };\n removeHiddenTocItems: boolean;\n removeEmptyTocItems: boolean;\n} & Partial<WatchConfig>;\n\ntype WalkStepResult<I> = I | I[] | null | undefined;\n\nexport type WalkStepContext<T extends object = {}> = Hash<unknown> & T;\n\ntype RestrictedAccessContext = WalkStepContext<{\n 'restricted-access'?: string[][];\n}>;\n\ntype WalkOptions<T> = {\n accept: (item: T) => boolean;\n};\n\ntype Run = BaseRun<TocServiceConfig> & {\n vars: VarsService;\n meta: MetaService;\n};\n\ntype Options = Partial<{\n skipMissingVars: boolean;\n mode: 'translate' | 'build';\n pdfDebug: boolean;\n}>;\n\n@withHooks\nexport class TocService {\n readonly name = 'Toc';\n\n readonly relations = new Graph<GraphData>();\n\n get tocs() {\n return (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc).map(this.for);\n }\n\n get entries() {\n const allEntries = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isEntry);\n\n // Find all TOC files and determine the minimum nesting level\n const allTocPaths = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc);\n if (allTocPaths.length === 0) {\n return allEntries;\n }\n\n // Calculate nesting levels for all TOC files\n const nestingLevels = allTocPaths.map((tocPath) => tocPath.split('/').length);\n const minNestingLevel = Math.min(...nestingLevels);\n\n // Filter entries to include only those from TOC files that are either:\n // 1. At the minimum nesting level (root TOC files)\n // 2. Or TOC files that are referenced by includes from other TOC files\n const filteredEntries = allEntries.filter((entry) => {\n // Find all TOC files that reference this entry\n const tocPaths = (this.relations.dependantsOf(entry) as NormalizedPath[]).filter(\n this.isToc,\n );\n\n // Check if any of the referencing TOC files is a root TOC or is referenced itself\n return tocPaths.some((tocPath) => {\n const nestingLevel = tocPath.split('/').length;\n const isRootToc = nestingLevel === minNestingLevel;\n const isReferenced = this.relations.dependenciesOf(tocPath).length > 0;\n return isRootToc || isReferenced;\n });\n });\n\n return filteredEntries;\n }\n\n private run: Run;\n\n private logger: Run['logger'];\n\n private config: TocServiceConfig;\n\n private options;\n\n private get vars() {\n return this.run.vars;\n }\n\n private get meta() {\n return this.run.meta;\n }\n\n constructor(run: Run, options: Options) {\n this.run = run;\n this.logger = run.logger;\n this.config = run.config;\n this.options = {\n skipMissingVars: false,\n mode: 'build',\n pdfDebug: false,\n ...options,\n };\n }\n\n async init(paths: NormalizedPath[]) {\n for (const path of paths) {\n await this.load(path);\n }\n\n return this.tocs.filter((toc) => paths.includes(toc.path));\n }\n\n async pushAdditionalEntries(path: NormalizedPath, toc: Toc) {\n await this.addEntries(path, toc);\n }\n\n async dump(file: NormalizedPath, toc?: Toc): Promise<VFile<Toc>> {\n toc = toc || this.for(file);\n\n return this._dump(toc.path, toc);\n }\n\n /**\n * Visits items which will be project entries. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkEntries<T extends WithItems<T> & {href: NormalizedPath}>(\n items: T[] | undefined,\n actor: (item: T) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n ): Promise<T[] | undefined> {\n return this.walkItems(items, actor, {accept: isEntryItem});\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T> = {accept: () => true},\n ): Promise<T[] | undefined> {\n return this._walkItems(items, actor, options);\n }\n\n /**\n * Resolves toc path and data for any page path.\n * Expects what all paths are already loaded in service.\n */\n @bounded for(path: RelativePath): Toc {\n const file = normalizePath(path);\n\n if (this.isToc(file)) {\n return this.relations.getNodeData(file).data as Toc;\n }\n\n const tocPaths = (this.relations.dependantsOf(file) as NormalizedPath[]).filter(this.isToc);\n if (!tocPaths.length) {\n throw new Error('Error while finding toc dir.');\n }\n\n if (tocPaths.length === 1) {\n return this.relations.getNodeData(tocPaths[0]).data as Toc;\n }\n\n const fileParts = normalizePath(join(dirname(file), 'toc.yaml')).split('/');\n const toc = tocPaths.reduce(\n (result, path) => {\n const tocParts = path.split('/');\n\n let index = 0;\n let score = 0;\n while (tocParts.length > index && fileParts[index] === tocParts[index]) {\n index++;\n score++;\n }\n\n if (score > result.score) {\n return {score, path};\n }\n\n return result;\n },\n {score: 0, path: null} as {score: number; path: null | NormalizedPath},\n );\n\n if (toc.path === null) {\n throw new Error('Error while finding toc dir.');\n }\n\n return this.relations.getNodeData(toc.path).data as Toc;\n }\n\n release(path: NormalizedPath) {\n memoize.release(this._dump, path);\n }\n\n @bounded isToc(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'toc' && data.data;\n }\n\n @bounded isEntry(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'entry';\n }\n\n @bounded isGenerator(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'generator';\n }\n\n @memoize('path')\n private async _dump(file: NormalizedPath, toc: Toc): Promise<VFile<Toc>> {\n const vfile = new VFile<Toc>(file, copyJson(toc), dump);\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n private async load(file: NormalizedPath): Promise<Toc | undefined> {\n // There is no error. We really skip toc processing, if it was processed previously in any way.\n // For example toc can be processed as include of some other toc.\n if (this.relations.hasNode(file)) {\n return (this.relations.getNodeData(file) as GraphTocData).data;\n }\n\n this.logger.proc(file);\n\n const defer = new Defer<Toc | undefined>();\n\n this.relations.addNode(file, {type: 'toc', data: defer.promise});\n\n defer.promise.then((result) => {\n if (this.relations.hasNode(file)) {\n this.relations.setNodeData(file, {type: 'toc', data: result});\n }\n });\n\n const context: LoaderContext = this.loaderContext(file);\n const content = await read(this.run, file);\n\n content.path = file;\n\n if (this.shouldSkip(content)) {\n defer.resolve(undefined);\n return undefined;\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Loaded.promise(toc);\n\n // This looks how small optimization, but there was cases when toc is an array...\n // This is not that we expect.\n if (toc.href || toc.items?.length) {\n await this.addEntries(file, toc);\n await this.restrictAccess(file, toc);\n }\n\n const pdfStartPages = toc?.pdf?.startPages;\n const {pdfDebug} = this.options;\n\n if (pdfStartPages && pdfDebug) {\n const tocLikeEntries = pdfStartPages.map((page) => ({href: page}));\n\n // We want to treat pdf start pages as regular entries for puprose of debug\n this.addEntries(file, {items: tocLikeEntries, path: toc.path} as Toc);\n }\n\n defer.resolve(toc);\n\n return defer.promise;\n }\n\n @bounded\n private async include(path: RelativePath, include: IncludeInfo): Promise<Toc | undefined> {\n const file = normalizePath(path);\n\n this.relations.addNode(file);\n this.relations.setNodeData(file, {type: 'source', data: undefined});\n this.relations.addNode(include.from);\n // Don't add dependency for include - this prevents included TOC files from being considered \"referenced\"\n // Use only in watch mode\n if (this.config.watch) {\n this.relations.addDependency(include.from, file);\n }\n\n this.logger.proc(file);\n\n const context: LoaderContext = this.loaderContext(file, include);\n const content = include.content || (await read(this.run, file, include.from));\n\n if (this.shouldSkip(content)) {\n return undefined;\n }\n\n if (isMergeMode(include)) {\n const from = normalizePath(dirname(file));\n const to = normalizePath(dirname(include.base));\n\n context.vars = this.vars.for(include.base);\n context.path = context.path.replace(from, to) as NormalizedPath;\n context.from = include.from;\n\n const files = await this.run.copy(\n normalizePath(join(this.run.input, from)) as AbsolutePath,\n normalizePath(join(this.run.input, to)) as AbsolutePath,\n [basename(file), '**/toc.yaml'],\n );\n\n for (const pair of files) {\n const [from, to] = pair.map((path) =>\n normalizePath(relative(this.run.input, path)),\n );\n const {sourcePath, vcsPath} = this.meta.get(from);\n this.meta.add(to, {sourcePath: vcsPath || sourcePath || from});\n this.logger.copy(pair[0], pair[1]);\n }\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Included.promise(toc, include);\n\n return toc;\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n * DFS\n */\n private async _walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T>,\n context: Hash = {},\n ): Promise<T[] | undefined> {\n const {accept} = options;\n\n if (!items || !items.length) {\n return items;\n }\n\n const results: T[] = [];\n\n for (const item of items) {\n const itemContext: WalkStepContext = {...context};\n\n const result = (accept(item) ? await actor(item, itemContext) : item) as T &\n Record<'items', unknown>;\n\n if (result) {\n results.push(...([] as T[]).concat(result));\n\n if (own(result, 'items')) {\n // Sometime users defines items as object (one item) instead of array of one item.\n if (!Array.isArray(result.items) && result.items) {\n result.items = ([] as T[]).concat(result.items);\n }\n\n if (result.items?.length) {\n result.items = await this._walkItems(\n result.items,\n actor,\n options,\n itemContext,\n );\n }\n }\n }\n }\n\n return results;\n }\n\n private shouldSkip(toc: RawToc) {\n const {ignoreStage} = this.config;\n if (toc.stage && ignoreStage.length && ignoreStage.includes(toc.stage)) {\n return true;\n }\n\n return false;\n }\n\n private async addEntries(path: NormalizedPath, toc: Toc) {\n await this.walkEntries([toc as unknown as EntryTocItem], (item) => {\n const entryPath = normalizePath(join(dirname(path), item.href));\n this.relations.addNode(entryPath, {type: 'entry', data: undefined});\n this.relations.addDependency(toc.path, entryPath);\n\n return item;\n });\n }\n\n private async restrictAccess(path: NormalizedPath, toc: Toc) {\n await this.walkItems(\n [toc as unknown as RawTocItem],\n (item, context: RestrictedAccessContext) => {\n if (own<string | string[]>(item, 'restricted-access')) {\n let itemAccess = ([] as string[]).concat(item['restricted-access'] || []);\n\n const contextAccess: string[][] =\n (context['restricted-access'] as string[][]) ?? [];\n if (contextAccess.some(isEqualAccess(itemAccess.sort().join(',')))) {\n itemAccess = [];\n }\n\n if (itemAccess.length > 0) {\n context['restricted-access'] = [...contextAccess, itemAccess];\n }\n }\n\n if (context['restricted-access']?.length && isEntryItem(item)) {\n const href = normalizePath(join(dirname(path), item.href));\n this.meta.add(href, {\n 'restricted-access': context['restricted-access'],\n });\n }\n\n return item;\n },\n );\n\n return toc;\n }\n\n private loaderContext(path: NormalizedPath, {from, mode, base}: Partial<IncludeInfo> = {}) {\n return {\n path,\n from: from || path,\n mode,\n base,\n vars: this.vars.for(path),\n toc: this,\n logger: this.logger,\n include: this.include,\n settings: {\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n substitutions: this.config.template.features.substitutions,\n },\n options: {\n removeHiddenItems: this.config.removeHiddenTocItems,\n removeEmptyItems: this.config.removeEmptyTocItems,\n skipMissingVars: this.options.skipMissingVars,\n mode: this.options.mode,\n },\n };\n }\n}\n\nasync function read(run: Run, path: RelativePath, from?: string): Promise<RawToc> {\n try {\n const source = normalizePath(join(run.input, path)) as AbsolutePath;\n return load((await run.read(source)) || '{}') as RawToc;\n } catch (error) {\n throw new Error(dedent`\n Unable to resolve ${path}${from ? ' from ' + from : ''}.\n Original error:\n ${errorMessage(error)}\n `);\n }\n}\n\nfunction isEqualAccess(match: string) {\n return function (access: string[]) {\n return access.sort().join() === match;\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_liquid", "import_utils", "import_utils", "IncludeMode", "toc", "rebaseIncludes", "removeEmptyItems", "import_node_path", "import_utils", "path", "from", "to"]
7
7
  }
package/lib/toc/index.mjs CHANGED
@@ -227,6 +227,9 @@ async function validateToc(toc) {
227
227
  }
228
228
  async function templateFields(toc) {
229
229
  const { conditions, substitutions } = this.settings;
230
+ if (!conditions && !substitutions) {
231
+ return toc;
232
+ }
230
233
  const interpolate = (box, field) => {
231
234
  const value = box[field];
232
235
  if (typeof value !== "string") {
@@ -234,11 +237,32 @@ async function templateFields(toc) {
234
237
  }
235
238
  box[field] = liquidSnippet.call(this, value, this.vars);
236
239
  };
237
- if (!conditions && !substitutions) {
238
- return toc;
239
- }
240
+ const interpolateDeep = (obj) => {
241
+ for (const key of Object.keys(obj)) {
242
+ const value = obj[key];
243
+ if (typeof value === "string") {
244
+ interpolate(obj, key);
245
+ } else if (Array.isArray(value)) {
246
+ for (let i = 0; i < value.length; i++) {
247
+ const item = value[i];
248
+ if (typeof item === "string") {
249
+ value[i] = liquidSnippet.call(this, item, this.vars);
250
+ } else if (item && typeof item === "object") {
251
+ interpolateDeep(item);
252
+ }
253
+ }
254
+ } else if (value && typeof value === "object") {
255
+ interpolateDeep(value);
256
+ }
257
+ }
258
+ };
240
259
  for (const field of ["href", "title", "label", "navigation"]) {
241
- interpolate(toc, field);
260
+ const value = toc[field];
261
+ if (typeof value === "string") {
262
+ interpolate(toc, field);
263
+ } else if (value && typeof value === "object") {
264
+ interpolateDeep(value);
265
+ }
242
266
  }
243
267
  toc.items = await this.toc.walkItems(toc.items, (item) => {
244
268
  for (const field of ["name", "href"]) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/core/toc/hooks.ts", "../../src/core/toc/loader.ts", "../../src/core/toc/utils.ts", "../../src/core/toc/TocService.ts"],
4
- "sourcesContent": ["import type {VFile} from '~/core/utils';\nimport type {IncludeInfo, IncluderOptions, RawToc, RawTocItem, Toc} from './types';\n\nimport {\n AsyncParallelHook,\n AsyncSeriesHook,\n AsyncSeriesWaterfallHook,\n HookMap,\n SyncHook,\n} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n /**\n * Called before item data processing (but after data interpolation)\n */\n Item: new AsyncSeriesWaterfallHook<[RawTocItem, NormalizedPath]>(\n ['TocItem', 'TocPath'],\n `${name}.Item`,\n ),\n /**\n * AsyncSeriesWaterfall HookMap called for each includer name detected in toc.<br>\n * Expects RawToc as result of waterfall.\n */\n Includer: new HookMap(\n (type: string) =>\n new AsyncSeriesWaterfallHook<[RawToc, IncluderOptions, NormalizedPath]>(\n ['Toc', 'options', 'from'],\n `${name}.Includer(${type})`,\n ),\n ),\n Loaded: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Loaded`),\n Resolved: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Resolved`),\n Included: new AsyncParallelHook<[Toc, IncludeInfo]>(\n ['Toc', 'IncludeInfo'],\n `${name}.Included`,\n ),\n Dump: new AsyncSeriesHook<[VFile<Toc>]>(['vfile'], `${name}.Dump`),\n Filtered: new SyncHook<[NormalizedPath]>(['path'], `${name}.Filtered`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Toc', hooks);\n\nexport {getHooks, withHooks};\n", "import type {LiquidContext} from '@diplodoc/liquid';\nimport type {TocService} from './TocService';\nimport type {\n EntryTocItem,\n IncludeInfo,\n Navigation,\n NavigationHeaderItem,\n RawToc,\n RawTocItem,\n Toc,\n TocInclude,\n YfmString,\n} from './types';\n\nimport {ok} from 'node:assert';\nimport {dirname, join, relative} from 'node:path';\nimport {omit} from 'lodash';\nimport {liquidSnippet} from '@diplodoc/liquid';\n\nimport {evaluateWhen, normalizePath, own} from '~/core/utils';\n\nimport {getHooks} from './hooks';\nimport {getFirstValuable, isRelative} from './utils';\n\nexport type LoaderContext = LiquidContext & {\n /** Relative to run.input path to current processing toc */\n path: NormalizedPath;\n /** Path of last include level */\n from: NormalizedPath;\n /** Path of last include level with 'merge' mode */\n base?: NormalizedPath;\n mode: IncludeMode | undefined;\n vars: Hash;\n include: (path: RelativePath, include: IncludeInfo) => Promise<Toc | undefined>;\n options: {\n removeHiddenItems: boolean;\n removeEmptyItems: boolean;\n skipMissingVars?: boolean;\n mode: string;\n };\n toc: TocService;\n};\n\nexport enum IncludeMode {\n RootMerge = 'root_merge',\n Merge = 'merge',\n Link = 'link',\n}\n\ntype MergeIncludeInfo = IncludeInfo & {\n mode: IncludeMode.RootMerge | IncludeMode.Merge;\n base: RelativePath;\n};\n\ntype LinkIncludeInfo = IncludeInfo & {\n mode: IncludeMode.Link;\n base?: undefined;\n};\n\nexport function isLinkMode(include: IncludeInfo | LoaderContext): include is LinkIncludeInfo {\n return IncludeMode.Link === include.mode;\n}\n\nexport function isMergeMode(include: IncludeInfo | LoaderContext): include is MergeIncludeInfo {\n return IncludeMode.RootMerge === include.mode || IncludeMode.Merge === include.mode;\n}\n\n// Designed to be isolated loaders in future\nexport async function loader(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n // Resolves toc fields which can be filterable arrays.\n // Apply when filter in some toc fields\n toc = await resolveFields.call(this, toc);\n\n // Apply when filter in navigation header items\n toc = await resolveNavigation.call(this, toc);\n\n // validate toc to [object Object] in fields\n toc = await validateToc.call(this, toc);\n\n // Apply when filter in toc.items\n // Drop hidden items\n toc = await resolveItems.call(this, toc);\n\n // Interpolate liquid vars in some toc fields\n toc = await templateFields.call(this, toc);\n\n // Make include paths relative to project root instead of toc root\n toc = await rebaseIncludes.call(this, toc);\n\n // Resolve includes and includers in toc items\n toc = await processItems.call(this, toc);\n\n // Rebase items href path for deep includes\n toc = await rebaseItems.call(this, toc);\n\n // Fix item href extensions\n toc = await normalizeItems.call(this, toc);\n\n // Remove empty items (no children and no href) if needed\n toc = await removeEmptyItems.call(this, toc);\n\n return toc;\n}\n\n/**\n * Resolves toc fields which can be filterable arrays.\n * Convert arrays to text fields (gets first truth value)\n */\nasync function resolveFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n for (const field of ['title', 'label'] as const) {\n const value = toc[field];\n if (value) {\n toc[field] = getFirstValuable<YfmString>(value, this.vars);\n }\n }\n\n return toc;\n}\n\n/**\n * Filters navigation header items (leftItems and rightItems) by `when` condition.\n */\nasync function resolveNavigation(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {skipMissingVars} = this.options;\n const {conditions} = this.settings;\n\n if (!conditions || !toc.navigation || typeof toc.navigation !== 'object') {\n return toc;\n }\n\n const navigation = toc.navigation as Navigation;\n\n if (!navigation.header) {\n return toc;\n }\n\n const filterItems = (items: NavigationHeaderItem[] | undefined): NavigationHeaderItem[] => {\n if (!items || !Array.isArray(items)) {\n return [];\n }\n\n return items.filter((item) => {\n if (typeof item.when === 'string') {\n const result = evaluateWhen(item.when, this.vars, skipMissingVars);\n delete item.when;\n\n return result;\n }\n\n if (item.when === false) {\n delete item.when;\n\n return false;\n }\n\n delete item.when;\n\n return true;\n });\n };\n\n if (navigation.header.leftItems) {\n navigation.header.leftItems = filterItems(navigation.header.leftItems);\n }\n\n if (navigation.header.rightItems) {\n navigation.header.rightItems = filterItems(navigation.header.rightItems);\n }\n\n return toc;\n}\n\n/**\n * Checks table of contents items for invalid object values.\n * Recursively checks nested items.\n */\nfunction checkTocItems(items: RawTocItem[], path = 'items'): string[] {\n const errors: string[] = [];\n const CHECK_FIELDS = ['name', 'href', 'title', 'label', 'navigation'] as const;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const currentPath = `${path}[${i}]`;\n\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n for (const field of CHECK_FIELDS) {\n if (\n item[field as keyof RawTocItem] !== undefined &&\n item[field as keyof RawTocItem]?.toString() === '[object Object]'\n ) {\n errors.push(`${currentPath}.${field}`);\n }\n }\n\n if (item.items && Array.isArray(item.items)) {\n const nestedErrors = checkTocItems(item.items, `${currentPath}.items`);\n errors.push(...nestedErrors);\n }\n }\n }\n return errors;\n}\n\nasync function validateToc(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n if (toc.items && Array.isArray(toc.items)) {\n const errors = checkTocItems(toc.items);\n const path = this.from ? this.from + ' -> ' + this.path : this.path;\n for (const error of errors) {\n this.logger.error(\n `Invalid toc structure in ${path.toString()} at ${error}: found [object Object] value`,\n );\n }\n }\n\n return toc;\n}\n\n/**\n * Applies liquid substitutions for some toc fields\n */\nasync function templateFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {conditions, substitutions} = this.settings;\n const interpolate = (box: Hash, field: string) => {\n const value = box[field];\n if (typeof value !== 'string') {\n return;\n }\n\n box[field] = liquidSnippet.call(this, value, this.vars);\n };\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n for (const field of ['href', 'title', 'label', 'navigation'] as const) {\n interpolate(toc, field);\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n for (const field of ['name', 'href'] as const) {\n interpolate(item, field);\n }\n\n return item;\n });\n\n return toc;\n}\n\n/**\n * Applies `when` filter in toc items.\n * Also drops hidden items if needed.\n */\nasync function resolveItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeHiddenItems, skipMissingVars} = this.options;\n const {conditions, substitutions} = this.settings;\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n let when = true;\n\n if (conditions) {\n if (typeof item.when === 'string') {\n when = evaluateWhen(item.when, this.vars, skipMissingVars);\n } else {\n // when: null/undefined/false are handled here\n when = item.when !== false;\n }\n\n delete item.when;\n }\n\n if (removeHiddenItems) {\n when = when && !item.hidden;\n delete item.hidden;\n }\n\n if (when) {\n return item;\n }\n\n if ('href' in item && item['href'] === null) {\n this.logger.warn(\n `Empty href property in item with name: ${item.name} in toc: ${this.path}`,\n );\n }\n\n return undefined;\n });\n\n return toc;\n}\n\n/**\n * Processes items includes and includers.\n * Then merges result in original place in `named` or `inline` mode.\n */\nasync function processItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rawToc = toc;\n const isTranslateMode = this.options.mode === 'translate';\n\n toc.items = await this.toc.walkItems(toc.items, async (item) => {\n item = await getHooks(this.toc).Item.promise(item, this.path);\n\n if (\n !item ||\n !own(item, 'include') ||\n (isTranslateMode && item.include.path === 'openapi')\n ) {\n return item;\n }\n\n const {include} = item;\n\n ok(include.path, 'Invalid value for include path.');\n\n let toc: RawToc;\n if (own(include, 'includers')) {\n ok(\n include.mode === IncludeMode.Link || !include.mode,\n 'Invalid mode value for include with includers.',\n );\n ok(Array.isArray(include.includers), 'Includers should be an array.');\n\n const tocPath = include.path.endsWith('toc.yaml')\n ? normalizePath(include.path)\n : normalizePath(join(include.path, 'toc.yaml'));\n\n toc = {path: tocPath};\n\n for (const includer of include.includers) {\n const hook = getHooks(this.toc).Includer.get(includer.name);\n\n ok(includer.name, 'Includer name should be a string.');\n ok(hook, `Includer with name '${includer.name}' is not registered.`);\n\n const options = {\n ...includer,\n path: tocPath,\n rawToc,\n include,\n };\n\n toc = await hook.promise(toc, options, this.path);\n }\n\n toc = (await this.include(tocPath, {\n from: this.path,\n mode: IncludeMode.Link,\n content: toc,\n })) as RawToc;\n } else {\n const includeInfo = {\n from: this.path,\n mode: include.mode,\n } as IncludeInfo;\n\n if (isMergeMode(includeInfo)) {\n includeInfo.base = this.base || this.path;\n }\n\n toc = (await this.include(include.path, includeInfo)) as RawToc;\n }\n\n item = omit(item, ['include']) as RawTocItem;\n\n if (!toc) {\n return null;\n }\n\n // named mode\n if (item.name) {\n item.items = (item.items || []).concat((toc.items as RawTocItem[]) || []);\n\n return item;\n } else {\n return toc.items as RawTocItem[];\n }\n });\n\n return toc;\n}\n\n/**\n * Rebases items includes path.\n * For link mode path should be always relative to original toc source.\n * For merge modes path should be relative to merge base, which can be inherited from parent->parent->toc.\n */\nasync function rebaseIncludes(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseIncludes = (item: RawTocItem | RawToc) => {\n if (!own<TocInclude, 'include'>(item, 'include')) {\n return item;\n }\n\n if (!item.include.mode) {\n item.include.mode = own<unknown, 'includers'>(item.include, 'includers')\n ? IncludeMode.Link\n : IncludeMode.RootMerge;\n }\n\n if (item.include.mode === IncludeMode.RootMerge) {\n return item;\n }\n\n if (isLinkMode(this)) {\n item.include.path = join(dirname(this.path), item.include.path);\n } else {\n item.include.path = join(dirname(this.base || this.path), item.include.path);\n }\n\n return item;\n };\n\n await this.toc.walkItems([toc], rebaseIncludes);\n\n return toc;\n}\n\n/**\n * Rebase items href after include in parent toc\n */\nasync function rebaseItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseHrefs = (item: RawTocItem | RawToc) => {\n if (own<AnyPath, 'href'>(item, 'href') && isRelative(item.href)) {\n const absBase = dirname(this.from);\n const absPath = join(dirname(this.base || this.path), item.href);\n\n item.href = relative(absBase, absPath) as YfmString & RelativePath;\n }\n\n return item;\n };\n\n if (isLinkMode(this)) {\n await this.toc.walkItems([toc], rebaseHrefs);\n }\n\n return toc;\n}\n\n/**\n * Fixes item href extensions\n */\nasync function normalizeItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n await this.toc.walkEntries([toc as unknown as EntryTocItem], (item) => {\n if (!item.href) {\n // @ts-ignore\n delete item['href'];\n return item;\n }\n\n let href: string = normalizePath(item.href);\n\n if (href.endsWith('/')) {\n href += 'index.yaml';\n }\n\n if (!href.endsWith('.md') && !href.endsWith('.yaml')) {\n href += '.md';\n }\n\n item.href = href as YfmString & NormalizedPath;\n return item;\n });\n\n return toc;\n}\n\n/**\n * Removes empty items (no children and no href) if needed.\n */\nasync function removeEmptyItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeEmptyItems} = this.options;\n\n if (!removeEmptyItems) {\n return toc;\n }\n\n const removeEmpty = (item: RawTocItem) => {\n // An item is empty if it has no children (no items property or empty items array) AND no href\n const hasChildren = item.items && item.items.length > 0;\n\n if (!hasChildren && !own(item, 'href')) {\n return null;\n }\n return item;\n };\n\n toc.items = await this.toc.walkItems(toc.items, removeEmpty);\n\n return toc;\n}\n", "import type {TextFilter} from './types';\n\nimport {evaluate} from '@diplodoc/liquid';\n\nimport {isExternalHref, own} from '~/core/utils';\n\nexport function isRelative(path: AnyPath): path is RelativePath {\n return /^\\.{1,2}\\//.test(path) || !/^(\\w{0,7}:)?\\/\\//.test(path);\n}\n\nexport function isEntryItem(item: unknown): item is {href: string} {\n return own<string, 'href'>(item, 'href') && !isExternalHref(item.href);\n}\n\nexport function getFirstValuable<T>(\n items: TextFilter[] | string,\n vars: Hash,\n fallback?: T,\n): T | undefined {\n if (typeof items === 'string') {\n items = [{text: items, when: true}];\n }\n\n if (!Array.isArray(items)) {\n items = [];\n }\n\n for (const item of items) {\n let {when = true} = item;\n delete item.when;\n\n if (typeof when === 'string') {\n when = Boolean(evaluate(when, vars));\n }\n\n if (when) {\n return item.text as T;\n }\n }\n\n return fallback;\n}\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {MetaService} from '~/core/meta';\nimport type {\n EntryTocItem,\n GraphData,\n GraphTocData,\n IncludeInfo,\n RawToc,\n RawTocItem,\n Toc,\n WithItems,\n} from './types';\nimport type {LoaderContext} from './loader';\nimport type {WatchConfig} from '~/commands/build/features/watch';\n\nimport {basename, dirname, join, relative} from 'node:path';\nimport {dump, load} from 'js-yaml';\nimport {dedent} from 'ts-dedent';\n\nimport {\n Defer,\n Graph,\n VFile,\n bounded,\n copyJson,\n errorMessage,\n memoize,\n normalizePath,\n own,\n} from '~/core/utils';\n\nimport {getHooks, withHooks} from './hooks';\nimport {isEntryItem} from './utils';\nimport {isMergeMode, loader} from './loader';\n\nexport type TocServiceConfig = {\n ignore: string[];\n ignoreStage: string[];\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n features: {\n conditions: boolean | string;\n substitutions: boolean;\n };\n scopes: {\n code: boolean;\n text: boolean;\n };\n };\n removeHiddenTocItems: boolean;\n removeEmptyTocItems: boolean;\n} & Partial<WatchConfig>;\n\ntype WalkStepResult<I> = I | I[] | null | undefined;\n\nexport type WalkStepContext<T extends object = {}> = Hash<unknown> & T;\n\ntype RestrictedAccessContext = WalkStepContext<{\n 'restricted-access'?: string[][];\n}>;\n\ntype WalkOptions<T> = {\n accept: (item: T) => boolean;\n};\n\ntype Run = BaseRun<TocServiceConfig> & {\n vars: VarsService;\n meta: MetaService;\n};\n\ntype Options = Partial<{\n skipMissingVars: boolean;\n mode: 'translate' | 'build';\n pdfDebug: boolean;\n}>;\n\n@withHooks\nexport class TocService {\n readonly name = 'Toc';\n\n readonly relations = new Graph<GraphData>();\n\n get tocs() {\n return (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc).map(this.for);\n }\n\n get entries() {\n const allEntries = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isEntry);\n\n // Find all TOC files and determine the minimum nesting level\n const allTocPaths = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc);\n if (allTocPaths.length === 0) {\n return allEntries;\n }\n\n // Calculate nesting levels for all TOC files\n const nestingLevels = allTocPaths.map((tocPath) => tocPath.split('/').length);\n const minNestingLevel = Math.min(...nestingLevels);\n\n // Filter entries to include only those from TOC files that are either:\n // 1. At the minimum nesting level (root TOC files)\n // 2. Or TOC files that are referenced by includes from other TOC files\n const filteredEntries = allEntries.filter((entry) => {\n // Find all TOC files that reference this entry\n const tocPaths = (this.relations.dependantsOf(entry) as NormalizedPath[]).filter(\n this.isToc,\n );\n\n // Check if any of the referencing TOC files is a root TOC or is referenced itself\n return tocPaths.some((tocPath) => {\n const nestingLevel = tocPath.split('/').length;\n const isRootToc = nestingLevel === minNestingLevel;\n const isReferenced = this.relations.dependenciesOf(tocPath).length > 0;\n return isRootToc || isReferenced;\n });\n });\n\n return filteredEntries;\n }\n\n private run: Run;\n\n private logger: Run['logger'];\n\n private config: TocServiceConfig;\n\n private options;\n\n private get vars() {\n return this.run.vars;\n }\n\n private get meta() {\n return this.run.meta;\n }\n\n constructor(run: Run, options: Options) {\n this.run = run;\n this.logger = run.logger;\n this.config = run.config;\n this.options = {\n skipMissingVars: false,\n mode: 'build',\n pdfDebug: false,\n ...options,\n };\n }\n\n async init(paths: NormalizedPath[]) {\n for (const path of paths) {\n await this.load(path);\n }\n\n return this.tocs.filter((toc) => paths.includes(toc.path));\n }\n\n async pushAdditionalEntries(path: NormalizedPath, toc: Toc) {\n await this.addEntries(path, toc);\n }\n\n async dump(file: NormalizedPath, toc?: Toc): Promise<VFile<Toc>> {\n toc = toc || this.for(file);\n\n return this._dump(toc.path, toc);\n }\n\n /**\n * Visits items which will be project entries. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkEntries<T extends WithItems<T> & {href: NormalizedPath}>(\n items: T[] | undefined,\n actor: (item: T) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n ): Promise<T[] | undefined> {\n return this.walkItems(items, actor, {accept: isEntryItem});\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T> = {accept: () => true},\n ): Promise<T[] | undefined> {\n return this._walkItems(items, actor, options);\n }\n\n /**\n * Resolves toc path and data for any page path.\n * Expects what all paths are already loaded in service.\n */\n @bounded for(path: RelativePath): Toc {\n const file = normalizePath(path);\n\n if (this.isToc(file)) {\n return this.relations.getNodeData(file).data as Toc;\n }\n\n const tocPaths = (this.relations.dependantsOf(file) as NormalizedPath[]).filter(this.isToc);\n if (!tocPaths.length) {\n throw new Error('Error while finding toc dir.');\n }\n\n if (tocPaths.length === 1) {\n return this.relations.getNodeData(tocPaths[0]).data as Toc;\n }\n\n const fileParts = normalizePath(join(dirname(file), 'toc.yaml')).split('/');\n const toc = tocPaths.reduce(\n (result, path) => {\n const tocParts = path.split('/');\n\n let index = 0;\n let score = 0;\n while (tocParts.length > index && fileParts[index] === tocParts[index]) {\n index++;\n score++;\n }\n\n if (score > result.score) {\n return {score, path};\n }\n\n return result;\n },\n {score: 0, path: null} as {score: number; path: null | NormalizedPath},\n );\n\n if (toc.path === null) {\n throw new Error('Error while finding toc dir.');\n }\n\n return this.relations.getNodeData(toc.path).data as Toc;\n }\n\n release(path: NormalizedPath) {\n memoize.release(this._dump, path);\n }\n\n @bounded isToc(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'toc' && data.data;\n }\n\n @bounded isEntry(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'entry';\n }\n\n @bounded isGenerator(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'generator';\n }\n\n @memoize('path')\n private async _dump(file: NormalizedPath, toc: Toc): Promise<VFile<Toc>> {\n const vfile = new VFile<Toc>(file, copyJson(toc), dump);\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n private async load(file: NormalizedPath): Promise<Toc | undefined> {\n // There is no error. We really skip toc processing, if it was processed previously in any way.\n // For example toc can be processed as include of some other toc.\n if (this.relations.hasNode(file)) {\n return (this.relations.getNodeData(file) as GraphTocData).data;\n }\n\n this.logger.proc(file);\n\n const defer = new Defer<Toc | undefined>();\n\n this.relations.addNode(file, {type: 'toc', data: defer.promise});\n\n defer.promise.then((result) => {\n if (this.relations.hasNode(file)) {\n this.relations.setNodeData(file, {type: 'toc', data: result});\n }\n });\n\n const context: LoaderContext = this.loaderContext(file);\n const content = await read(this.run, file);\n\n content.path = file;\n\n if (this.shouldSkip(content)) {\n defer.resolve(undefined);\n return undefined;\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Loaded.promise(toc);\n\n // This looks how small optimization, but there was cases when toc is an array...\n // This is not that we expect.\n if (toc.href || toc.items?.length) {\n await this.addEntries(file, toc);\n await this.restrictAccess(file, toc);\n }\n\n const pdfStartPages = toc?.pdf?.startPages;\n const {pdfDebug} = this.options;\n\n if (pdfStartPages && pdfDebug) {\n const tocLikeEntries = pdfStartPages.map((page) => ({href: page}));\n\n // We want to treat pdf start pages as regular entries for puprose of debug\n this.addEntries(file, {items: tocLikeEntries, path: toc.path} as Toc);\n }\n\n defer.resolve(toc);\n\n return defer.promise;\n }\n\n @bounded\n private async include(path: RelativePath, include: IncludeInfo): Promise<Toc | undefined> {\n const file = normalizePath(path);\n\n this.relations.addNode(file);\n this.relations.setNodeData(file, {type: 'source', data: undefined});\n this.relations.addNode(include.from);\n // Don't add dependency for include - this prevents included TOC files from being considered \"referenced\"\n // Use only in watch mode\n if (this.config.watch) {\n this.relations.addDependency(include.from, file);\n }\n\n this.logger.proc(file);\n\n const context: LoaderContext = this.loaderContext(file, include);\n const content = include.content || (await read(this.run, file, include.from));\n\n if (this.shouldSkip(content)) {\n return undefined;\n }\n\n if (isMergeMode(include)) {\n const from = normalizePath(dirname(file));\n const to = normalizePath(dirname(include.base));\n\n context.vars = this.vars.for(include.base);\n context.path = context.path.replace(from, to) as NormalizedPath;\n context.from = include.from;\n\n const files = await this.run.copy(\n normalizePath(join(this.run.input, from)) as AbsolutePath,\n normalizePath(join(this.run.input, to)) as AbsolutePath,\n [basename(file), '**/toc.yaml'],\n );\n\n for (const pair of files) {\n const [from, to] = pair.map((path) =>\n normalizePath(relative(this.run.input, path)),\n );\n const {sourcePath, vcsPath} = this.meta.get(from);\n this.meta.add(to, {sourcePath: vcsPath || sourcePath || from});\n this.logger.copy(pair[0], pair[1]);\n }\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Included.promise(toc, include);\n\n return toc;\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n * DFS\n */\n private async _walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T>,\n context: Hash = {},\n ): Promise<T[] | undefined> {\n const {accept} = options;\n\n if (!items || !items.length) {\n return items;\n }\n\n const results: T[] = [];\n\n for (const item of items) {\n const itemContext: WalkStepContext = {...context};\n\n const result = (accept(item) ? await actor(item, itemContext) : item) as T &\n Record<'items', unknown>;\n\n if (result) {\n results.push(...([] as T[]).concat(result));\n\n if (own(result, 'items')) {\n // Sometime users defines items as object (one item) instead of array of one item.\n if (!Array.isArray(result.items) && result.items) {\n result.items = ([] as T[]).concat(result.items);\n }\n\n if (result.items?.length) {\n result.items = await this._walkItems(\n result.items,\n actor,\n options,\n itemContext,\n );\n }\n }\n }\n }\n\n return results;\n }\n\n private shouldSkip(toc: RawToc) {\n const {ignoreStage} = this.config;\n if (toc.stage && ignoreStage.length && ignoreStage.includes(toc.stage)) {\n return true;\n }\n\n return false;\n }\n\n private async addEntries(path: NormalizedPath, toc: Toc) {\n await this.walkEntries([toc as unknown as EntryTocItem], (item) => {\n const entryPath = normalizePath(join(dirname(path), item.href));\n this.relations.addNode(entryPath, {type: 'entry', data: undefined});\n this.relations.addDependency(toc.path, entryPath);\n\n return item;\n });\n }\n\n private async restrictAccess(path: NormalizedPath, toc: Toc) {\n await this.walkItems(\n [toc as unknown as RawTocItem],\n (item, context: RestrictedAccessContext) => {\n if (own<string | string[]>(item, 'restricted-access')) {\n let itemAccess = ([] as string[]).concat(item['restricted-access'] || []);\n\n const contextAccess: string[][] =\n (context['restricted-access'] as string[][]) ?? [];\n if (contextAccess.some(isEqualAccess(itemAccess.sort().join(',')))) {\n itemAccess = [];\n }\n\n if (itemAccess.length > 0) {\n context['restricted-access'] = [...contextAccess, itemAccess];\n }\n }\n\n if (context['restricted-access']?.length && isEntryItem(item)) {\n const href = normalizePath(join(dirname(path), item.href));\n this.meta.add(href, {\n 'restricted-access': context['restricted-access'],\n });\n }\n\n return item;\n },\n );\n\n return toc;\n }\n\n private loaderContext(path: NormalizedPath, {from, mode, base}: Partial<IncludeInfo> = {}) {\n return {\n path,\n from: from || path,\n mode,\n base,\n vars: this.vars.for(path),\n toc: this,\n logger: this.logger,\n include: this.include,\n settings: {\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n substitutions: this.config.template.features.substitutions,\n },\n options: {\n removeHiddenItems: this.config.removeHiddenTocItems,\n removeEmptyItems: this.config.removeEmptyTocItems,\n skipMissingVars: this.options.skipMissingVars,\n mode: this.options.mode,\n },\n };\n }\n}\n\nasync function read(run: Run, path: RelativePath, from?: string): Promise<RawToc> {\n try {\n const source = normalizePath(join(run.input, path)) as AbsolutePath;\n return load((await run.read(source)) || '{}') as RawToc;\n } catch (error) {\n throw new Error(dedent`\n Unable to resolve ${path}${from ? ' from ' + from : ''}.\n Original error:\n ${errorMessage(error)}\n `);\n }\n}\n\nfunction isEqualAccess(match: string) {\n return function (access: string[]) {\n return access.sort().join() === match;\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {VFile} from '~/core/utils';\nimport type {IncludeInfo, IncluderOptions, RawToc, RawTocItem, Toc} from './types';\n\nimport {\n AsyncParallelHook,\n AsyncSeriesHook,\n AsyncSeriesWaterfallHook,\n HookMap,\n SyncHook,\n} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n /**\n * Called before item data processing (but after data interpolation)\n */\n Item: new AsyncSeriesWaterfallHook<[RawTocItem, NormalizedPath]>(\n ['TocItem', 'TocPath'],\n `${name}.Item`,\n ),\n /**\n * AsyncSeriesWaterfall HookMap called for each includer name detected in toc.<br>\n * Expects RawToc as result of waterfall.\n */\n Includer: new HookMap(\n (type: string) =>\n new AsyncSeriesWaterfallHook<[RawToc, IncluderOptions, NormalizedPath]>(\n ['Toc', 'options', 'from'],\n `${name}.Includer(${type})`,\n ),\n ),\n Loaded: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Loaded`),\n Resolved: new AsyncParallelHook<[DeepFrozen<Toc>]>(['Toc'], `${name}.Resolved`),\n Included: new AsyncParallelHook<[Toc, IncludeInfo]>(\n ['Toc', 'IncludeInfo'],\n `${name}.Included`,\n ),\n Dump: new AsyncSeriesHook<[VFile<Toc>]>(['vfile'], `${name}.Dump`),\n Filtered: new SyncHook<[NormalizedPath]>(['path'], `${name}.Filtered`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Toc', hooks);\n\nexport {getHooks, withHooks};\n", "import type {LiquidContext} from '@diplodoc/liquid';\nimport type {TocService} from './TocService';\nimport type {\n EntryTocItem,\n IncludeInfo,\n Navigation,\n NavigationHeaderItem,\n RawToc,\n RawTocItem,\n Toc,\n TocInclude,\n YfmString,\n} from './types';\n\nimport {ok} from 'node:assert';\nimport {dirname, join, relative} from 'node:path';\nimport {omit} from 'lodash';\nimport {liquidSnippet} from '@diplodoc/liquid';\n\nimport {evaluateWhen, normalizePath, own} from '~/core/utils';\n\nimport {getHooks} from './hooks';\nimport {getFirstValuable, isRelative} from './utils';\n\nexport type LoaderContext = LiquidContext & {\n /** Relative to run.input path to current processing toc */\n path: NormalizedPath;\n /** Path of last include level */\n from: NormalizedPath;\n /** Path of last include level with 'merge' mode */\n base?: NormalizedPath;\n mode: IncludeMode | undefined;\n vars: Hash;\n include: (path: RelativePath, include: IncludeInfo) => Promise<Toc | undefined>;\n options: {\n removeHiddenItems: boolean;\n removeEmptyItems: boolean;\n skipMissingVars?: boolean;\n mode: string;\n };\n toc: TocService;\n};\n\nexport enum IncludeMode {\n RootMerge = 'root_merge',\n Merge = 'merge',\n Link = 'link',\n}\n\ntype MergeIncludeInfo = IncludeInfo & {\n mode: IncludeMode.RootMerge | IncludeMode.Merge;\n base: RelativePath;\n};\n\ntype LinkIncludeInfo = IncludeInfo & {\n mode: IncludeMode.Link;\n base?: undefined;\n};\n\nexport function isLinkMode(include: IncludeInfo | LoaderContext): include is LinkIncludeInfo {\n return IncludeMode.Link === include.mode;\n}\n\nexport function isMergeMode(include: IncludeInfo | LoaderContext): include is MergeIncludeInfo {\n return IncludeMode.RootMerge === include.mode || IncludeMode.Merge === include.mode;\n}\n\n// Designed to be isolated loaders in future\nexport async function loader(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n // Resolves toc fields which can be filterable arrays.\n // Apply when filter in some toc fields\n toc = await resolveFields.call(this, toc);\n\n // Apply when filter in navigation header items\n toc = await resolveNavigation.call(this, toc);\n\n // validate toc to [object Object] in fields\n toc = await validateToc.call(this, toc);\n\n // Apply when filter in toc.items\n // Drop hidden items\n toc = await resolveItems.call(this, toc);\n\n // Interpolate liquid vars in some toc fields\n toc = await templateFields.call(this, toc);\n\n // Make include paths relative to project root instead of toc root\n toc = await rebaseIncludes.call(this, toc);\n\n // Resolve includes and includers in toc items\n toc = await processItems.call(this, toc);\n\n // Rebase items href path for deep includes\n toc = await rebaseItems.call(this, toc);\n\n // Fix item href extensions\n toc = await normalizeItems.call(this, toc);\n\n // Remove empty items (no children and no href) if needed\n toc = await removeEmptyItems.call(this, toc);\n\n return toc;\n}\n\n/**\n * Resolves toc fields which can be filterable arrays.\n * Convert arrays to text fields (gets first truth value)\n */\nasync function resolveFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n for (const field of ['title', 'label'] as const) {\n const value = toc[field];\n if (value) {\n toc[field] = getFirstValuable<YfmString>(value, this.vars);\n }\n }\n\n return toc;\n}\n\n/**\n * Filters navigation header items (leftItems and rightItems) by `when` condition.\n */\nasync function resolveNavigation(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {skipMissingVars} = this.options;\n const {conditions} = this.settings;\n\n if (!conditions || !toc.navigation || typeof toc.navigation !== 'object') {\n return toc;\n }\n\n const navigation = toc.navigation as Navigation;\n\n if (!navigation.header) {\n return toc;\n }\n\n const filterItems = (items: NavigationHeaderItem[] | undefined): NavigationHeaderItem[] => {\n if (!items || !Array.isArray(items)) {\n return [];\n }\n\n return items.filter((item) => {\n if (typeof item.when === 'string') {\n const result = evaluateWhen(item.when, this.vars, skipMissingVars);\n delete item.when;\n\n return result;\n }\n\n if (item.when === false) {\n delete item.when;\n\n return false;\n }\n\n delete item.when;\n\n return true;\n });\n };\n\n if (navigation.header.leftItems) {\n navigation.header.leftItems = filterItems(navigation.header.leftItems);\n }\n\n if (navigation.header.rightItems) {\n navigation.header.rightItems = filterItems(navigation.header.rightItems);\n }\n\n return toc;\n}\n\n/**\n * Checks table of contents items for invalid object values.\n * Recursively checks nested items.\n */\nfunction checkTocItems(items: RawTocItem[], path = 'items'): string[] {\n const errors: string[] = [];\n const CHECK_FIELDS = ['name', 'href', 'title', 'label', 'navigation'] as const;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const currentPath = `${path}[${i}]`;\n\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n for (const field of CHECK_FIELDS) {\n if (\n item[field as keyof RawTocItem] !== undefined &&\n item[field as keyof RawTocItem]?.toString() === '[object Object]'\n ) {\n errors.push(`${currentPath}.${field}`);\n }\n }\n\n if (item.items && Array.isArray(item.items)) {\n const nestedErrors = checkTocItems(item.items, `${currentPath}.items`);\n errors.push(...nestedErrors);\n }\n }\n }\n return errors;\n}\n\nasync function validateToc(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n if (toc.items && Array.isArray(toc.items)) {\n const errors = checkTocItems(toc.items);\n const path = this.from ? this.from + ' -> ' + this.path : this.path;\n for (const error of errors) {\n this.logger.error(\n `Invalid toc structure in ${path.toString()} at ${error}: found [object Object] value`,\n );\n }\n }\n\n return toc;\n}\n\n/**\n * Applies liquid substitutions for some toc fields\n */\nasync function templateFields(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {conditions, substitutions} = this.settings;\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n const interpolate = (box: Hash, field: string) => {\n const value = box[field];\n if (typeof value !== 'string') {\n return;\n }\n\n box[field] = liquidSnippet.call(this, value, this.vars);\n };\n\n /**\n * Recursively interpolates all string fields in an object,\n * traversing nested objects and arrays.\n */\n const interpolateDeep = (obj: Hash) => {\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (typeof value === 'string') {\n interpolate(obj, key);\n } else if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n\n if (typeof item === 'string') {\n value[i] = liquidSnippet.call(this, item, this.vars);\n } else if (item && typeof item === 'object') {\n interpolateDeep(item as Hash);\n }\n }\n } else if (value && typeof value === 'object') {\n interpolateDeep(value as Hash);\n }\n }\n };\n\n for (const field of ['href', 'title', 'label', 'navigation'] as const) {\n const value = toc[field];\n\n if (typeof value === 'string') {\n interpolate(toc, field);\n } else if (value && typeof value === 'object') {\n interpolateDeep(value as Hash);\n }\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n for (const field of ['name', 'href'] as const) {\n interpolate(item, field);\n }\n\n return item;\n });\n\n return toc;\n}\n\n/**\n * Applies `when` filter in toc items.\n * Also drops hidden items if needed.\n */\nasync function resolveItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeHiddenItems, skipMissingVars} = this.options;\n const {conditions, substitutions} = this.settings;\n\n if (!conditions && !substitutions) {\n return toc;\n }\n\n toc.items = await this.toc.walkItems(toc.items, (item: RawTocItem) => {\n let when = true;\n\n if (conditions) {\n if (typeof item.when === 'string') {\n when = evaluateWhen(item.when, this.vars, skipMissingVars);\n } else {\n // when: null/undefined/false are handled here\n when = item.when !== false;\n }\n\n delete item.when;\n }\n\n if (removeHiddenItems) {\n when = when && !item.hidden;\n delete item.hidden;\n }\n\n if (when) {\n return item;\n }\n\n if ('href' in item && item['href'] === null) {\n this.logger.warn(\n `Empty href property in item with name: ${item.name} in toc: ${this.path}`,\n );\n }\n\n return undefined;\n });\n\n return toc;\n}\n\n/**\n * Processes items includes and includers.\n * Then merges result in original place in `named` or `inline` mode.\n */\nasync function processItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rawToc = toc;\n const isTranslateMode = this.options.mode === 'translate';\n\n toc.items = await this.toc.walkItems(toc.items, async (item) => {\n item = await getHooks(this.toc).Item.promise(item, this.path);\n\n if (\n !item ||\n !own(item, 'include') ||\n (isTranslateMode && item.include.path === 'openapi')\n ) {\n return item;\n }\n\n const {include} = item;\n\n ok(include.path, 'Invalid value for include path.');\n\n let toc: RawToc;\n if (own(include, 'includers')) {\n ok(\n include.mode === IncludeMode.Link || !include.mode,\n 'Invalid mode value for include with includers.',\n );\n ok(Array.isArray(include.includers), 'Includers should be an array.');\n\n const tocPath = include.path.endsWith('toc.yaml')\n ? normalizePath(include.path)\n : normalizePath(join(include.path, 'toc.yaml'));\n\n toc = {path: tocPath};\n\n for (const includer of include.includers) {\n const hook = getHooks(this.toc).Includer.get(includer.name);\n\n ok(includer.name, 'Includer name should be a string.');\n ok(hook, `Includer with name '${includer.name}' is not registered.`);\n\n const options = {\n ...includer,\n path: tocPath,\n rawToc,\n include,\n };\n\n toc = await hook.promise(toc, options, this.path);\n }\n\n toc = (await this.include(tocPath, {\n from: this.path,\n mode: IncludeMode.Link,\n content: toc,\n })) as RawToc;\n } else {\n const includeInfo = {\n from: this.path,\n mode: include.mode,\n } as IncludeInfo;\n\n if (isMergeMode(includeInfo)) {\n includeInfo.base = this.base || this.path;\n }\n\n toc = (await this.include(include.path, includeInfo)) as RawToc;\n }\n\n item = omit(item, ['include']) as RawTocItem;\n\n if (!toc) {\n return null;\n }\n\n // named mode\n if (item.name) {\n item.items = (item.items || []).concat((toc.items as RawTocItem[]) || []);\n\n return item;\n } else {\n return toc.items as RawTocItem[];\n }\n });\n\n return toc;\n}\n\n/**\n * Rebases items includes path.\n * For link mode path should be always relative to original toc source.\n * For merge modes path should be relative to merge base, which can be inherited from parent->parent->toc.\n */\nasync function rebaseIncludes(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseIncludes = (item: RawTocItem | RawToc) => {\n if (!own<TocInclude, 'include'>(item, 'include')) {\n return item;\n }\n\n if (!item.include.mode) {\n item.include.mode = own<unknown, 'includers'>(item.include, 'includers')\n ? IncludeMode.Link\n : IncludeMode.RootMerge;\n }\n\n if (item.include.mode === IncludeMode.RootMerge) {\n return item;\n }\n\n if (isLinkMode(this)) {\n item.include.path = join(dirname(this.path), item.include.path);\n } else {\n item.include.path = join(dirname(this.base || this.path), item.include.path);\n }\n\n return item;\n };\n\n await this.toc.walkItems([toc], rebaseIncludes);\n\n return toc;\n}\n\n/**\n * Rebase items href after include in parent toc\n */\nasync function rebaseItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const rebaseHrefs = (item: RawTocItem | RawToc) => {\n if (own<AnyPath, 'href'>(item, 'href') && isRelative(item.href)) {\n const absBase = dirname(this.from);\n const absPath = join(dirname(this.base || this.path), item.href);\n\n item.href = relative(absBase, absPath) as YfmString & RelativePath;\n }\n\n return item;\n };\n\n if (isLinkMode(this)) {\n await this.toc.walkItems([toc], rebaseHrefs);\n }\n\n return toc;\n}\n\n/**\n * Fixes item href extensions\n */\nasync function normalizeItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n await this.toc.walkEntries([toc as unknown as EntryTocItem], (item) => {\n if (!item.href) {\n // @ts-ignore\n delete item['href'];\n return item;\n }\n\n let href: string = normalizePath(item.href);\n\n if (href.endsWith('/')) {\n href += 'index.yaml';\n }\n\n if (!href.endsWith('.md') && !href.endsWith('.yaml')) {\n href += '.md';\n }\n\n item.href = href as YfmString & NormalizedPath;\n return item;\n });\n\n return toc;\n}\n\n/**\n * Removes empty items (no children and no href) if needed.\n */\nasync function removeEmptyItems(this: LoaderContext, toc: RawToc): Promise<RawToc> {\n const {removeEmptyItems} = this.options;\n\n if (!removeEmptyItems) {\n return toc;\n }\n\n const removeEmpty = (item: RawTocItem) => {\n // An item is empty if it has no children (no items property or empty items array) AND no href\n const hasChildren = item.items && item.items.length > 0;\n\n if (!hasChildren && !own(item, 'href')) {\n return null;\n }\n return item;\n };\n\n toc.items = await this.toc.walkItems(toc.items, removeEmpty);\n\n return toc;\n}\n", "import type {TextFilter} from './types';\n\nimport {evaluate} from '@diplodoc/liquid';\n\nimport {isExternalHref, own} from '~/core/utils';\n\nexport function isRelative(path: AnyPath): path is RelativePath {\n return /^\\.{1,2}\\//.test(path) || !/^(\\w{0,7}:)?\\/\\//.test(path);\n}\n\nexport function isEntryItem(item: unknown): item is {href: string} {\n return own<string, 'href'>(item, 'href') && !isExternalHref(item.href);\n}\n\nexport function getFirstValuable<T>(\n items: TextFilter[] | string,\n vars: Hash,\n fallback?: T,\n): T | undefined {\n if (typeof items === 'string') {\n items = [{text: items, when: true}];\n }\n\n if (!Array.isArray(items)) {\n items = [];\n }\n\n for (const item of items) {\n let {when = true} = item;\n delete item.when;\n\n if (typeof when === 'string') {\n when = Boolean(evaluate(when, vars));\n }\n\n if (when) {\n return item.text as T;\n }\n }\n\n return fallback;\n}\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {MetaService} from '~/core/meta';\nimport type {\n EntryTocItem,\n GraphData,\n GraphTocData,\n IncludeInfo,\n RawToc,\n RawTocItem,\n Toc,\n WithItems,\n} from './types';\nimport type {LoaderContext} from './loader';\nimport type {WatchConfig} from '~/commands/build/features/watch';\n\nimport {basename, dirname, join, relative} from 'node:path';\nimport {dump, load} from 'js-yaml';\nimport {dedent} from 'ts-dedent';\n\nimport {\n Defer,\n Graph,\n VFile,\n bounded,\n copyJson,\n errorMessage,\n memoize,\n normalizePath,\n own,\n} from '~/core/utils';\n\nimport {getHooks, withHooks} from './hooks';\nimport {isEntryItem} from './utils';\nimport {isMergeMode, loader} from './loader';\n\nexport type TocServiceConfig = {\n ignore: string[];\n ignoreStage: string[];\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n features: {\n conditions: boolean | string;\n substitutions: boolean;\n };\n scopes: {\n code: boolean;\n text: boolean;\n };\n };\n removeHiddenTocItems: boolean;\n removeEmptyTocItems: boolean;\n} & Partial<WatchConfig>;\n\ntype WalkStepResult<I> = I | I[] | null | undefined;\n\nexport type WalkStepContext<T extends object = {}> = Hash<unknown> & T;\n\ntype RestrictedAccessContext = WalkStepContext<{\n 'restricted-access'?: string[][];\n}>;\n\ntype WalkOptions<T> = {\n accept: (item: T) => boolean;\n};\n\ntype Run = BaseRun<TocServiceConfig> & {\n vars: VarsService;\n meta: MetaService;\n};\n\ntype Options = Partial<{\n skipMissingVars: boolean;\n mode: 'translate' | 'build';\n pdfDebug: boolean;\n}>;\n\n@withHooks\nexport class TocService {\n readonly name = 'Toc';\n\n readonly relations = new Graph<GraphData>();\n\n get tocs() {\n return (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc).map(this.for);\n }\n\n get entries() {\n const allEntries = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isEntry);\n\n // Find all TOC files and determine the minimum nesting level\n const allTocPaths = (this.relations.overallOrder() as NormalizedPath[]).filter(this.isToc);\n if (allTocPaths.length === 0) {\n return allEntries;\n }\n\n // Calculate nesting levels for all TOC files\n const nestingLevels = allTocPaths.map((tocPath) => tocPath.split('/').length);\n const minNestingLevel = Math.min(...nestingLevels);\n\n // Filter entries to include only those from TOC files that are either:\n // 1. At the minimum nesting level (root TOC files)\n // 2. Or TOC files that are referenced by includes from other TOC files\n const filteredEntries = allEntries.filter((entry) => {\n // Find all TOC files that reference this entry\n const tocPaths = (this.relations.dependantsOf(entry) as NormalizedPath[]).filter(\n this.isToc,\n );\n\n // Check if any of the referencing TOC files is a root TOC or is referenced itself\n return tocPaths.some((tocPath) => {\n const nestingLevel = tocPath.split('/').length;\n const isRootToc = nestingLevel === minNestingLevel;\n const isReferenced = this.relations.dependenciesOf(tocPath).length > 0;\n return isRootToc || isReferenced;\n });\n });\n\n return filteredEntries;\n }\n\n private run: Run;\n\n private logger: Run['logger'];\n\n private config: TocServiceConfig;\n\n private options;\n\n private get vars() {\n return this.run.vars;\n }\n\n private get meta() {\n return this.run.meta;\n }\n\n constructor(run: Run, options: Options) {\n this.run = run;\n this.logger = run.logger;\n this.config = run.config;\n this.options = {\n skipMissingVars: false,\n mode: 'build',\n pdfDebug: false,\n ...options,\n };\n }\n\n async init(paths: NormalizedPath[]) {\n for (const path of paths) {\n await this.load(path);\n }\n\n return this.tocs.filter((toc) => paths.includes(toc.path));\n }\n\n async pushAdditionalEntries(path: NormalizedPath, toc: Toc) {\n await this.addEntries(path, toc);\n }\n\n async dump(file: NormalizedPath, toc?: Toc): Promise<VFile<Toc>> {\n toc = toc || this.for(file);\n\n return this._dump(toc.path, toc);\n }\n\n /**\n * Visits items which will be project entries. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkEntries<T extends WithItems<T> & {href: NormalizedPath}>(\n items: T[] | undefined,\n actor: (item: T) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n ): Promise<T[] | undefined> {\n return this.walkItems(items, actor, {accept: isEntryItem});\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n */\n async walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T> = {accept: () => true},\n ): Promise<T[] | undefined> {\n return this._walkItems(items, actor, options);\n }\n\n /**\n * Resolves toc path and data for any page path.\n * Expects what all paths are already loaded in service.\n */\n @bounded for(path: RelativePath): Toc {\n const file = normalizePath(path);\n\n if (this.isToc(file)) {\n return this.relations.getNodeData(file).data as Toc;\n }\n\n const tocPaths = (this.relations.dependantsOf(file) as NormalizedPath[]).filter(this.isToc);\n if (!tocPaths.length) {\n throw new Error('Error while finding toc dir.');\n }\n\n if (tocPaths.length === 1) {\n return this.relations.getNodeData(tocPaths[0]).data as Toc;\n }\n\n const fileParts = normalizePath(join(dirname(file), 'toc.yaml')).split('/');\n const toc = tocPaths.reduce(\n (result, path) => {\n const tocParts = path.split('/');\n\n let index = 0;\n let score = 0;\n while (tocParts.length > index && fileParts[index] === tocParts[index]) {\n index++;\n score++;\n }\n\n if (score > result.score) {\n return {score, path};\n }\n\n return result;\n },\n {score: 0, path: null} as {score: number; path: null | NormalizedPath},\n );\n\n if (toc.path === null) {\n throw new Error('Error while finding toc dir.');\n }\n\n return this.relations.getNodeData(toc.path).data as Toc;\n }\n\n release(path: NormalizedPath) {\n memoize.release(this._dump, path);\n }\n\n @bounded isToc(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'toc' && data.data;\n }\n\n @bounded isEntry(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'entry';\n }\n\n @bounded isGenerator(path: NormalizedPath) {\n if (!this.relations.hasNode(path)) {\n return false;\n }\n\n const data = this.relations.getNodeData(path);\n\n return data.type === 'generator';\n }\n\n @memoize('path')\n private async _dump(file: NormalizedPath, toc: Toc): Promise<VFile<Toc>> {\n const vfile = new VFile<Toc>(file, copyJson(toc), dump);\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n private async load(file: NormalizedPath): Promise<Toc | undefined> {\n // There is no error. We really skip toc processing, if it was processed previously in any way.\n // For example toc can be processed as include of some other toc.\n if (this.relations.hasNode(file)) {\n return (this.relations.getNodeData(file) as GraphTocData).data;\n }\n\n this.logger.proc(file);\n\n const defer = new Defer<Toc | undefined>();\n\n this.relations.addNode(file, {type: 'toc', data: defer.promise});\n\n defer.promise.then((result) => {\n if (this.relations.hasNode(file)) {\n this.relations.setNodeData(file, {type: 'toc', data: result});\n }\n });\n\n const context: LoaderContext = this.loaderContext(file);\n const content = await read(this.run, file);\n\n content.path = file;\n\n if (this.shouldSkip(content)) {\n defer.resolve(undefined);\n return undefined;\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Loaded.promise(toc);\n\n // This looks how small optimization, but there was cases when toc is an array...\n // This is not that we expect.\n if (toc.href || toc.items?.length) {\n await this.addEntries(file, toc);\n await this.restrictAccess(file, toc);\n }\n\n const pdfStartPages = toc?.pdf?.startPages;\n const {pdfDebug} = this.options;\n\n if (pdfStartPages && pdfDebug) {\n const tocLikeEntries = pdfStartPages.map((page) => ({href: page}));\n\n // We want to treat pdf start pages as regular entries for puprose of debug\n this.addEntries(file, {items: tocLikeEntries, path: toc.path} as Toc);\n }\n\n defer.resolve(toc);\n\n return defer.promise;\n }\n\n @bounded\n private async include(path: RelativePath, include: IncludeInfo): Promise<Toc | undefined> {\n const file = normalizePath(path);\n\n this.relations.addNode(file);\n this.relations.setNodeData(file, {type: 'source', data: undefined});\n this.relations.addNode(include.from);\n // Don't add dependency for include - this prevents included TOC files from being considered \"referenced\"\n // Use only in watch mode\n if (this.config.watch) {\n this.relations.addDependency(include.from, file);\n }\n\n this.logger.proc(file);\n\n const context: LoaderContext = this.loaderContext(file, include);\n const content = include.content || (await read(this.run, file, include.from));\n\n if (this.shouldSkip(content)) {\n return undefined;\n }\n\n if (isMergeMode(include)) {\n const from = normalizePath(dirname(file));\n const to = normalizePath(dirname(include.base));\n\n context.vars = this.vars.for(include.base);\n context.path = context.path.replace(from, to) as NormalizedPath;\n context.from = include.from;\n\n const files = await this.run.copy(\n normalizePath(join(this.run.input, from)) as AbsolutePath,\n normalizePath(join(this.run.input, to)) as AbsolutePath,\n [basename(file), '**/toc.yaml'],\n );\n\n for (const pair of files) {\n const [from, to] = pair.map((path) =>\n normalizePath(relative(this.run.input, path)),\n );\n const {sourcePath, vcsPath} = this.meta.get(from);\n this.meta.add(to, {sourcePath: vcsPath || sourcePath || from});\n this.logger.copy(pair[0], pair[1]);\n }\n }\n\n const toc = (await loader.call(context, content)) as Toc;\n\n await getHooks(this).Included.promise(toc, include);\n\n return toc;\n }\n\n /**\n * Visits all passed items. Applies actor to each item.\n * Then applies actor to each item in actor result.items.\n * Returns actor results.\n * DFS\n */\n private async _walkItems<T extends WithItems<T>>(\n items: T[] | undefined,\n actor: (\n item: T,\n context: WalkStepContext,\n ) => Promise<WalkStepResult<T>> | WalkStepResult<T>,\n options: WalkOptions<T>,\n context: Hash = {},\n ): Promise<T[] | undefined> {\n const {accept} = options;\n\n if (!items || !items.length) {\n return items;\n }\n\n const results: T[] = [];\n\n for (const item of items) {\n const itemContext: WalkStepContext = {...context};\n\n const result = (accept(item) ? await actor(item, itemContext) : item) as T &\n Record<'items', unknown>;\n\n if (result) {\n results.push(...([] as T[]).concat(result));\n\n if (own(result, 'items')) {\n // Sometime users defines items as object (one item) instead of array of one item.\n if (!Array.isArray(result.items) && result.items) {\n result.items = ([] as T[]).concat(result.items);\n }\n\n if (result.items?.length) {\n result.items = await this._walkItems(\n result.items,\n actor,\n options,\n itemContext,\n );\n }\n }\n }\n }\n\n return results;\n }\n\n private shouldSkip(toc: RawToc) {\n const {ignoreStage} = this.config;\n if (toc.stage && ignoreStage.length && ignoreStage.includes(toc.stage)) {\n return true;\n }\n\n return false;\n }\n\n private async addEntries(path: NormalizedPath, toc: Toc) {\n await this.walkEntries([toc as unknown as EntryTocItem], (item) => {\n const entryPath = normalizePath(join(dirname(path), item.href));\n this.relations.addNode(entryPath, {type: 'entry', data: undefined});\n this.relations.addDependency(toc.path, entryPath);\n\n return item;\n });\n }\n\n private async restrictAccess(path: NormalizedPath, toc: Toc) {\n await this.walkItems(\n [toc as unknown as RawTocItem],\n (item, context: RestrictedAccessContext) => {\n if (own<string | string[]>(item, 'restricted-access')) {\n let itemAccess = ([] as string[]).concat(item['restricted-access'] || []);\n\n const contextAccess: string[][] =\n (context['restricted-access'] as string[][]) ?? [];\n if (contextAccess.some(isEqualAccess(itemAccess.sort().join(',')))) {\n itemAccess = [];\n }\n\n if (itemAccess.length > 0) {\n context['restricted-access'] = [...contextAccess, itemAccess];\n }\n }\n\n if (context['restricted-access']?.length && isEntryItem(item)) {\n const href = normalizePath(join(dirname(path), item.href));\n this.meta.add(href, {\n 'restricted-access': context['restricted-access'],\n });\n }\n\n return item;\n },\n );\n\n return toc;\n }\n\n private loaderContext(path: NormalizedPath, {from, mode, base}: Partial<IncludeInfo> = {}) {\n return {\n path,\n from: from || path,\n mode,\n base,\n vars: this.vars.for(path),\n toc: this,\n logger: this.logger,\n include: this.include,\n settings: {\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n substitutions: this.config.template.features.substitutions,\n },\n options: {\n removeHiddenItems: this.config.removeHiddenTocItems,\n removeEmptyItems: this.config.removeEmptyTocItems,\n skipMissingVars: this.options.skipMissingVars,\n mode: this.options.mode,\n },\n };\n }\n}\n\nasync function read(run: Run, path: RelativePath, from?: string): Promise<RawToc> {\n try {\n const source = normalizePath(join(run.input, path)) as AbsolutePath;\n return load((await run.read(source)) || '{}') as RawToc;\n } catch (error) {\n throw new Error(dedent`\n Unable to resolve ${path}${from ? ' from ' + from : ''}.\n Original error:\n ${errorMessage(error)}\n `);\n }\n}\n\nfunction isEqualAccess(match: string) {\n return function (access: string[]) {\n return access.sort().join() === match;\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["own", "IncludeMode", "own", "toc", "rebaseIncludes", "removeEmptyItems", "dirname", "join", "relative", "normalizePath", "own", "normalizePath", "join", "dirname", "path", "from", "to", "relative", "own"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diplodoc/cli",
3
- "version": "5.20.1",
3
+ "version": "5.21.0",
4
4
  "description": "Make documentation using yfm-docs in Markdown and HTML formats",
5
5
  "keywords": [
6
6
  "markdown",