diff --git a/docs/infra/api-markdown-documenter/admonition-node.mjs b/docs/infra/api-markdown-documenter/admonition-node.mjs deleted file mode 100644 index 2219e4de563b..000000000000 --- a/docs/infra/api-markdown-documenter/admonition-node.mjs +++ /dev/null @@ -1,106 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation and contributors. All rights reserved. - * Licensed under the MIT License. - */ - -//@ts-check -/** @typedef {import("@fluid-tools/api-markdown-documenter").BlockContent} BlockContent */ -/** @typedef {import("@fluid-tools/api-markdown-documenter").ToMarkdownContext} ToMarkdownContext */ -/** @typedef {import("mdast").BlockContent} MdastBlockContent */ -/** @typedef {import("mdast").PhrasingContent} MdastPhrasingContent */ -/** @typedef {"note" | "tip" | "info" | "warning" | "danger"} AdmonitionKind */ - -import { - blockContentToMarkdown, - DocumentationParentNodeBase, -} from "@fluid-tools/api-markdown-documenter"; - -/** - * A block of content representing a notice that should be highlighted for the user. - * E.g., a tip or warning for the reader about the described API. - * - * @see {@link https://docusaurus.io/docs/markdown-features/admonitions} - * - * @remarks {@link renderAdmonitionNode} demonstrates how the contents are rendered to take advantage of Docusaurus's `admonition` syntax. - * - * @example Example rendering output (in Docusaurus Markdown) - * - * With title: - * - * ```md - * :::note[Unit tests are super useful!] - * - * More details about unit testing... - * - * ::: - * ``` - * - * Without title: - * - * ```md - * :::danger - * - * Notes about the danger! - * - * ::: - * ``` - * - * @public - */ -export class AdmonitionNode extends DocumentationParentNodeBase { - /** - * @param {BlockContent[]} children - Child node content. - * @param {AdmonitionKind} admonitionKind - The kind of admonition. See {@link https://docusaurus.io/docs/markdown-features/admonitions}. - * @param {string | undefined} title - (Optional) Title text for the admonition. - */ - constructor(children, admonitionKind, title) { - super(children); - - this.type = "admonition"; - - this.admonitionKind = admonitionKind; - this.title = title; - } - - /** - * Generates Markdown representing a Docusaurus Admonition. - * - * @param {ToMarkdownContext} context - The transformation context. - * - * @returns {MdastBlockContent[]} The Markdown AST representing the admonition. - */ - toMarkdown(context) { - /** - * @type {MdastBlockContent[]} - */ - const transformedChildren = []; - for (const child of this.children) { - // @ts-ignore -- Limitation of using types in JavaScript: we can't explicitly mark `AdmonitionNode` as only containing phrasing content. - transformedChildren.push(...blockContentToMarkdown(child, context)); - } - - // If the admonition has a title, prepend it to the list of children with the `directiveLabel` property set. - if (this.title !== undefined) { - transformedChildren.unshift({ - type: "paragraph", - data: { - directiveLabel: true, - }, - children: [ - { - type: "text", - value: this.title, - }, - ], - }); - } - - return [ - { - type: "containerDirective", - name: this.admonitionKind, - children: transformedChildren, - }, - ]; - } -} diff --git a/docs/infra/api-markdown-documenter/admonition.mjs b/docs/infra/api-markdown-documenter/admonition.mjs new file mode 100644 index 000000000000..ed9e7bac540f --- /dev/null +++ b/docs/infra/api-markdown-documenter/admonition.mjs @@ -0,0 +1,48 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +//@ts-check +/** @typedef {import("mdast").BlockContent} BlockContent */ +/** @typedef {import("mdast-util-directive").ContainerDirective} ContainerDirective */ +/** @typedef {import("mdast").PhrasingContent} PhrasingContent */ +/** @typedef {"note" | "tip" | "info" | "warning" | "danger"} AdmonitionKind */ + +/** + * Generates Markdown representing a Docusaurus Admonition. + * + * @param {BlockContent[]} body - Admonition body content. + * @param {AdmonitionKind} admonitionKind - The kind of admonition. See {@link https://docusaurus.io/docs/markdown-features/admonitions}. + * @param {string | undefined} title - (Optional) Title text for the admonition. + * + * @returns {ContainerDirective} The Markdown AST representing the admonition. + */ +export function createAdmonition(body, admonitionKind, title) { + /** @type {BlockContent[]} */ + const children = []; + + // If the admonition has a title, prepend it to the list of children with the `directiveLabel` property set. + if (title !== undefined) { + children.push({ + type: "paragraph", + data: { + directiveLabel: true, + }, + children: [ + { + type: "text", + value: title, + }, + ], + }); + } + + children.push(...body); + + return { + type: "containerDirective", + name: admonitionKind, + children, + }; +} diff --git a/docs/infra/api-markdown-documenter/api-documentation-layout.mjs b/docs/infra/api-markdown-documenter/api-documentation-layout.mjs index b9b44b5ac643..27bd75caf62f 100644 --- a/docs/infra/api-markdown-documenter/api-documentation-layout.mjs +++ b/docs/infra/api-markdown-documenter/api-documentation-layout.mjs @@ -6,75 +6,86 @@ //@ts-check /** @typedef {import("@fluid-tools/api-markdown-documenter").ApiItem} ApiItem */ /** @typedef {import("@fluid-tools/api-markdown-documenter").ApiItemTransformationConfiguration} ApiItemTransformationConfiguration */ -/** @typedef {import("@fluid-tools/api-markdown-documenter").BlockContent} BlockContent */ -/** @typedef {import("@fluid-tools/api-markdown-documenter").DocumentationNode} DocumentationNode */ +/** @typedef {import("@fluid-tools/api-markdown-documenter").Section} Section */ +/** @typedef {import("mdast").BlockContent} BlockContent */ +/** @typedef {import("mdast").Paragraph} Paragraph */ import { ApiItemKind, ApiItemUtilities, - CodeSpanNode, - HeadingNode, LayoutUtilities, - LinkNode, - ParagraphNode, - PlainTextNode, ReleaseTag, - SectionNode, transformTsdoc, } from "@fluid-tools/api-markdown-documenter"; -import { AdmonitionNode } from "./admonition-node.mjs"; +import { createAdmonition } from "./admonition.mjs"; const customExamplesSectionTitle = "Usage"; const customThrowsSectionTitle = "Error Handling"; -const supportDocsLinkParagraph = new ParagraphNode([ - new PlainTextNode("For more information about our API support guarantees, see "), - new LinkNode( - "here", - // Is there a URL that would be relative to the current site? (For development use) - "https://fluidframework.com/docs/build/releases-and-apitags/#api-support-levels", - ), - new PlainTextNode("."), -]); +/** + * A paragraph containing a link to the Fluid Framework API support documentation. + * @type Paragraph + */ +const supportDocsLinkParagraph = { + type: "paragraph", + children: [ + { type: "text", value: "For more information about our API support guarantees, see " }, + { + type: "link", + children: [{ type: "text", value: "here" }], + // Is there a URL that would be relative to the current site? (For development use) + url: "https://fluidframework.com/docs/build/releases-and-apitags/#api-support-levels", + }, + { type: "text", value: "." }, + ], +}; /** * A special use notice for the "@system" tag. */ -const systemNotice = new AdmonitionNode( +const systemNotice = createAdmonition( [supportDocsLinkParagraph], /* admonitionKind: */ "warning", - "This API is reserved for internal system use and should not be imported directly. It may change at any time without notice.", + /* title: */ "This API is reserved for internal system use and should not be imported directly. It may change at any time without notice.", ); /** * A special use notice for the "@sealed" tag. */ -const sealedNotice = new AdmonitionNode( +const sealedNotice = createAdmonition( [ - new ParagraphNode([ - new PlainTextNode( - 'This type is "sealed," meaning that code outside of the library defining it should not implement or extend it. Future versions of this type may add members or make typing of readonly members more specific.', - ), - ]), + { + type: "paragraph", + children: [ + { + type: "text", + value: 'This type is "sealed," meaning that code outside of the library defining it should not implement or extend it. Future versions of this type may add members or make typing of readonly members more specific.', + }, + ], + }, ], /* admonitionKind: */ "info", - "Sealed", + /* title: */ "Sealed", ); /** * A special use notice for the "@input" tag. */ -const inputNotice = new AdmonitionNode( +const inputNotice = createAdmonition( [ - new ParagraphNode([ - new PlainTextNode( - 'This type is "input," meaning that code outside of the library defining it should not read from it. Future versions of this type may add optional members or make typing of members more general.', - ), - ]), + { + type: "paragraph", + children: [ + { + type: "text", + value: 'This type is "input," meaning that code outside of the library defining it should not read from it. Future versions of this type may add optional members or make typing of members more general.', + }, + ], + }, ], /* admonitionKind: */ "info", - "Input", + /* title: */ "Input", ); /** @@ -104,20 +115,21 @@ function createSupportNotice(apiItem, isImportable) { * @param {string} importSubpath - Subpath beneath the item's package through which the item can be imported. * @param {string} admonitionTitle - Title to display for the admonition. */ - function createAdmonition(importSubpath, admonitionTitle) { + function createImportAdmonition(importSubpath, admonitionTitle) { /** @type {BlockContent[]} */ const admonitionChildren = []; if (isImportable) { - admonitionChildren.push( - new ParagraphNode([ - new PlainTextNode("To use, import via "), - CodeSpanNode.createFromPlainText(`${packageName}/${importSubpath}`), - new PlainTextNode("."), - ]), - ); + admonitionChildren.push({ + type: "paragraph", + children: [ + { type: "text", value: "To use, import via " }, + { type: "inlineCode", value: `${packageName}/${importSubpath}` }, + { type: "text", value: "." }, + ], + }); } admonitionChildren.push(supportDocsLinkParagraph); - return new AdmonitionNode( + return createAdmonition( admonitionChildren, /* admonitionKind: */ "warning", admonitionTitle, @@ -125,7 +137,7 @@ function createSupportNotice(apiItem, isImportable) { } if (ApiItemUtilities.ancestryHasModifierTag(apiItem, "@legacy")) { - return createAdmonition( + return createImportAdmonition( "legacy", "This API is provided for existing users, but is not recommended for new users.", ); @@ -134,14 +146,14 @@ function createSupportNotice(apiItem, isImportable) { const releaseLevel = ApiItemUtilities.getEffectiveReleaseLevel(apiItem); if (releaseLevel === ReleaseTag.Alpha) { - return createAdmonition( + return createImportAdmonition( "alpha", "This API is provided as an alpha preview and may change without notice.", ); } if (releaseLevel === ReleaseTag.Beta) { - return createAdmonition( + return createImportAdmonition( "beta", "This API is provided as a beta preview and may change without notice.", ); @@ -159,7 +171,7 @@ function createSupportNotice(apiItem, isImportable) { * @param {`@${string}`} tag - The tag to check for. * @param {boolean} includeContainingAncestry - Whether or not to include the `apiItem`'s containing ancestry when checking for the tag. * E.g. whether or not a class member should inherit the tag from its containing class. Or a class inherit from its containing package/namespace. - * @param {AdmonitionNode} notice - The notice to display if the tag is present. + * @param {BlockContent} notice - The notice to display if the tag is present. */ function createTagNotice(apiItem, tag, includeContainingAncestry, notice) { if (includeContainingAncestry && ApiItemUtilities.ancestryHasModifierTag(apiItem, tag)) { @@ -199,7 +211,7 @@ function createTagNotice(apiItem, tag, includeContainingAncestry, notice) { * 1. See (if any) * * @param {ApiItem} apiItem - The API item being rendered. - * @param {SectionNode[] | undefined} itemSpecificContent - API item-specific details to be included in the default layout. + * @param {Section[] | undefined} itemSpecificContent - API item-specific details to be included in the default layout. * @param {ApiItemTransformationConfiguration} config - Transformation configuration. * * @returns An array of sections describing the layout. See {@link @fluid-tools/api-markdown-documenter#ApiItemTransformationConfiguration.createDefaultLayout}. @@ -224,12 +236,12 @@ export function layoutContent(apiItem, itemSpecificContent, config) { /** * Adds node (if not undefined) to `sections`, wrapping in a `SectionNode` if not already a `SectionNode`. - * @param {DocumentationNode | undefined} node - The node to add to `sections`. + * @param {Section | BlockContent | undefined} node - The node to add to `sections`. * @returns true if the node was added, false otherwise. */ function addSection(node) { if (node !== undefined) { - sections.push(node instanceof SectionNode ? new SectionNode([node]) : node); + sections.push(node.type === "section" ? node : { type: "section", children: [node] }); return true; } return false; @@ -279,12 +291,11 @@ export function layoutContent(apiItem, itemSpecificContent, config) { return isDocumentItem ? sections : [ - new SectionNode( - sections, - HeadingNode.createFromPlainTextHeading( - ApiItemUtilities.getHeadingForApiItem(apiItem, config), - ), - ), + { + type: "section", + children: sections, + heading: ApiItemUtilities.getHeadingForApiItem(apiItem, config), + }, ]; } @@ -310,7 +321,7 @@ function createDeprecationNoticeSection(apiItem, config) { throw new Error("Failed to transform deprecated block."); } - return new AdmonitionNode( + return createAdmonition( transformedDeprecatedBlockContents, "warning", "This API is deprecated and will be removed in a future release.", diff --git a/docs/infra/api-markdown-documenter/custom-transformations.mjs b/docs/infra/api-markdown-documenter/custom-transformations.mjs deleted file mode 100644 index 2b305692ca9f..000000000000 --- a/docs/infra/api-markdown-documenter/custom-transformations.mjs +++ /dev/null @@ -1,72 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation and contributors. All rights reserved. - * Licensed under the MIT License. - */ - -//@ts-check -/** @typedef {import("@fluid-tools/api-markdown-documenter").BlockContent} BlockContent */ -/** @typedef {import("@fluid-tools/api-markdown-documenter").ToMarkdownContext} ToMarkdownContext */ -/** @typedef {import("mdast").BlockContent} MdastBlockContent */ -/** @typedef {import("mdast").RootContent} MdastRootContent */ - -import { - documentationNodeToHtml, - HtmlRenderer, - TableNode, -} from "@fluid-tools/api-markdown-documenter"; -import { AdmonitionNode } from "./admonition-node.mjs"; - -/** - * Generates Markdown for an {@link AdmonitionNode} using Docusaurus syntax. - * - * @param {AdmonitionNode} admonitionNode - The node to render. - * @param {ToMarkdownContext} context - The transformation context. - * - * @type {import("@fluid-tools/api-markdown-documenter").ToMarkdownTransformation} - */ -export const transformAdmonitionNode = (admonitionNode, context) => { - return admonitionNode.toMarkdown(context); -}; - -/** - * Type guard for element HAST nodes. - * @param {import("hast").Nodes} node - The node to check. - * @returns {node is import("hast").Element} Whether the node is an element. - */ -function isElement(node) { - return node.type === "element"; -} - -/** - * Renders a {@link TableNode} using HTML syntax, and applies the desired CSS class to it. - * - * @param {TableNode} tableNode - The node to render. - * @param {ToMarkdownContext} context - The transformation context. - * - * @type {import("@fluid-tools/api-markdown-documenter").ToMarkdownTransformation} - */ -export const transformTableNode = (tableNode, context) => { - // Generate HTML AST for the table node. - - const htmlTree = documentationNodeToHtml(tableNode, { - startingHeadingLevel: context.headingLevel, - logger: context.logger, - customTransformations: undefined, - }); - - if (!isElement(htmlTree)) { - throw new Error("Expected an HTML element as output from table node transformation."); - } - - htmlTree.properties.class = "table table-striped table-hover"; - - // Convert the HTML AST to a string. - const htmlString = HtmlRenderer.renderHtml(htmlTree, { prettyFormatting: true }); - - return [ - { - type: "html", - value: htmlString, - }, - ]; -}; diff --git a/docs/infra/api-markdown-documenter/render-api-documentation.mjs b/docs/infra/api-markdown-documenter/render-api-documentation.mjs index e19e294821a1..f62e5577735d 100644 --- a/docs/infra/api-markdown-documenter/render-api-documentation.mjs +++ b/docs/infra/api-markdown-documenter/render-api-documentation.mjs @@ -26,7 +26,6 @@ import path from "path"; import { cleanIgnored } from "../clean-ignored.mjs"; import { layoutContent } from "./api-documentation-layout.mjs"; -import { transformAdmonitionNode, transformTableNode } from "./custom-transformations.mjs"; const generatedContentNotice = ""; @@ -87,16 +86,6 @@ export async function renderApiDocumentation(inputDir, outputDir, uriRootDir, ap const apiModel = await loadModel({ modelDirectoryPath: inputDir }); - /** - * Custom renderers that utilize Docusaurus syntax for certain kinds of documentation elements. - * @type {import("@fluid-tools/api-markdown-documenter").ToMarkdownTransformations} - */ - const customTransformations = { - table: transformTableNode, - // @ts-ignore -- Limitation of using types in JavaScript: we can't opt into the documenter library's extensibility model to extend supported node types. - admonition: transformAdmonitionNode, - }; - const config = getApiItemTransformationConfigurationWithDefaults({ apiModel, hierarchy: { @@ -138,6 +127,7 @@ export async function renderApiDocumentation(inputDir, outputDir, uriRootDir, ap uriRoot: uriRootDir, includeBreadcrumb: false, // Docusaurus includes this by default based on file hierarchy includeTopLevelDocumentHeading: false, // We inject `title` front-matter metadata instead + startingHeadingLevel: 2, defaultSectionLayout: layoutContent, getAlertsForItem: (apiItem) => { const alerts = []; @@ -224,13 +214,11 @@ export async function renderApiDocumentation(inputDir, outputDir, uriRootDir, ap let fileContents; try { const documentBody = MarkdownRenderer.renderDocument(document, { - startingHeadingLevel: 2, - customTransformations, mdastToMarkdownOptions: { // Ensure the `mdast-util-directive` plugin is included so we can render admonitions. extensions: [directiveToMarkdown()], }, - }); + }).contents; const frontMatter = createFrontMatter(documentApiItem, config); diff --git a/docs/package.json b/docs/package.json index e82c06b6f87c..c5e0651d46a1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -69,7 +69,7 @@ "@docusaurus/theme-mermaid": "^3.6.2", "@docusaurus/tsconfig": "^3.6.2", "@docusaurus/types": "^3.6.2", - "@fluid-tools/api-markdown-documenter": "^0.21.0", + "@fluid-tools/api-markdown-documenter": "^0.23.0", "@fluid-tools/markdown-magic": "file:../tools/markdown-magic", "@fluidframework/build-common": "^2.0.3", "@fluidframework/eslint-config-fluid": "^6.1.0", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index e4904994178b..9f62802ef01a 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^3.6.2 version: 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@fluid-tools/api-markdown-documenter': - specifier: ^0.21.0 - version: 0.21.0(@types/node@22.9.1) + specifier: ^0.23.0 + version: 0.23.0(@types/node@22.9.1) '@fluid-tools/markdown-magic': specifier: file:../tools/markdown-magic version: file:../tools/markdown-magic(@types/node@22.9.1)(markdown-magic@2.6.1) @@ -61,7 +61,7 @@ importers: version: 1.49.0 '@rushstack/node-core-library': specifier: ^5.9.0 - version: 5.9.0(@types/node@22.9.1) + version: 5.14.0(@types/node@22.9.1) '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -76,7 +76,7 @@ importers: version: 22.9.1 chalk: specifier: ^5.3.0 - version: 5.3.0 + version: 5.6.2 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -118,7 +118,7 @@ importers: version: 3.1.5(eslint@8.57.1) fs-extra: specifier: ^11.2.0 - version: 11.2.0 + version: 11.3.2 linkcheck-bin: specifier: 3.0.0-2 version: 3.0.0-2 @@ -1451,8 +1451,8 @@ packages: '@fluid-internal/eslint-plugin-fluid@0.2.0': resolution: {integrity: sha512-KAES3hOge6htTmYCTjBObjhi1oaVkT+XPyFV7tgOgIicaS9PZgD9ErFV2wiFdWtZiqoThKFlZewfwWNd+mqeXg==} - '@fluid-tools/api-markdown-documenter@0.21.0': - resolution: {integrity: sha512-+28JywOXuZeE1Zwyk8aTJ8eZEueOfxRNLbJosEoKijPsapKJ3luCYYSwvexeYYPGp+YrH4DdRzVEMalk3oCXnw==} + '@fluid-tools/api-markdown-documenter@0.23.0': + resolution: {integrity: sha512-iTdSUCW8G2bkfg0/Y7kbiVIa9m6xoS4mV2Ypbn/3waO1x6aiedR0LfYk3+u/4Pf2MPAtPYYaDquSW09rq2gM3A==} '@fluid-tools/markdown-magic@file:../tools/markdown-magic': resolution: {directory: ../tools/markdown-magic, type: directory} @@ -1544,8 +1544,8 @@ packages: '@mermaid-js/parser@0.6.3': resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} - '@microsoft/api-extractor-model@7.28.21': - resolution: {integrity: sha512-AZSdhK/vO4ddukfheXZmrkI5180XLeAqwzu/5pTsJHsXYSyNt3H3VJyynUYKMeNcveG9QLgljH3XRr/LqEfC0Q==} + '@microsoft/api-extractor-model@7.30.7': + resolution: {integrity: sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==} '@microsoft/applicationinsights-analytics-js@3.3.4': resolution: {integrity: sha512-RxxyiIgt3TJ/tvLhg1wth1862wrPmru6dBS7vyThFEUkCZ/AYqEAzdH1JiixgTL/e72NesqmgKcvUUPv9kl9rg==} @@ -1600,15 +1600,9 @@ packages: '@microsoft/dynamicproto-js@2.0.3': resolution: {integrity: sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==} - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - '@microsoft/tsdoc-config@0.17.1': resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -1796,16 +1790,8 @@ packages: '@types/node': optional: true - '@rushstack/node-core-library@5.3.0': - resolution: {integrity: sha512-t23gjdZV6aWkbwXSE3TkKr1UXJFbXICvAOJ0MRQEB/ZYGhfSJqqrQFaGd20I1a/nIIHJEkNO0xzycHixjcbCPw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - '@rushstack/node-core-library@5.9.0': - resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==} + '@rushstack/node-core-library@5.14.0': + resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -2961,8 +2947,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} char-regex@1.0.2: @@ -4454,8 +4440,8 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -4727,8 +4713,8 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -7251,9 +7237,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -9967,7 +9950,7 @@ snapshots: '@docusaurus/logger': 3.6.2 '@docusaurus/utils': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) babel-plugin-dynamic-import-node: 2.3.3 - fs-extra: 11.2.0 + fs-extra: 11.3.2 tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' @@ -10047,7 +10030,7 @@ snapshots: escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - fs-extra: 11.2.0 + fs-extra: 11.3.2 html-tags: 3.3.1 html-webpack-plugin: 5.6.3(webpack@5.96.1) leven: 3.1.0 @@ -10124,7 +10107,7 @@ snapshots: escape-html: 1.0.3 estree-util-value-to-estree: 3.4.0 file-loader: 6.2.0(webpack@5.96.1) - fs-extra: 11.2.0 + fs-extra: 11.3.2 image-size: 1.2.1 mdast-util-mdx: 3.0.0 mdast-util-to-string: 4.0.0 @@ -10183,7 +10166,7 @@ snapshots: '@docusaurus/utils-validation': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) cheerio: 1.0.0-rc.12 feed: 4.2.2 - fs-extra: 11.2.0 + fs-extra: 11.3.2 lodash: 4.17.21 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10227,7 +10210,7 @@ snapshots: '@docusaurus/utils-validation': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 - fs-extra: 11.2.0 + fs-extra: 11.3.2 js-yaml: 4.1.0 lodash: 4.17.21 react: 18.3.1 @@ -10263,7 +10246,7 @@ snapshots: '@docusaurus/types': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/utils-validation': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) - fs-extra: 11.2.0 + fs-extra: 11.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -10294,7 +10277,7 @@ snapshots: '@docusaurus/core': 3.6.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.15.0)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/types': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) - fs-extra: 11.2.0 + fs-extra: 11.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-json-view-lite: 1.5.0(react@18.3.1) @@ -10416,7 +10399,7 @@ snapshots: '@docusaurus/utils': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/utils-common': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) - fs-extra: 11.2.0 + fs-extra: 11.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) sitemap: 7.1.2 @@ -10612,7 +10595,7 @@ snapshots: algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 2.1.1 eta: 2.2.0 - fs-extra: 11.2.0 + fs-extra: 11.3.2 lodash: 4.17.21 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -10644,7 +10627,7 @@ snapshots: '@docusaurus/theme-translations@3.6.2': dependencies: - fs-extra: 11.2.0 + fs-extra: 11.3.2 tslib: 2.8.1 '@docusaurus/tsconfig@3.6.2': {} @@ -10689,7 +10672,7 @@ snapshots: '@docusaurus/logger': 3.6.2 '@docusaurus/utils': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) '@docusaurus/utils-common': 3.6.2(acorn@8.15.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fs-extra: 11.2.0 + fs-extra: 11.3.2 joi: 17.13.3 js-yaml: 4.1.0 lodash: 4.17.21 @@ -10713,7 +10696,7 @@ snapshots: '@svgr/webpack': 8.1.0(typescript@5.5.4) escape-string-regexp: 4.0.0 file-loader: 6.2.0(webpack@5.96.1) - fs-extra: 11.2.0 + fs-extra: 11.3.2 github-slugger: 1.5.0 globby: 11.1.0 gray-matter: 4.0.3 @@ -10796,18 +10779,20 @@ snapshots: - supports-color - typescript - '@fluid-tools/api-markdown-documenter@0.21.0(@types/node@22.9.1)': + '@fluid-tools/api-markdown-documenter@0.23.0(@types/node@22.9.1)': dependencies: - '@microsoft/api-extractor-model': 7.28.21(@types/node@22.9.1) - '@microsoft/tsdoc': 0.14.2 - '@rushstack/node-core-library': 3.66.1(@types/node@22.9.1) - chalk: 4.1.2 + '@microsoft/api-extractor-model': 7.30.7(@types/node@22.9.1) + '@microsoft/tsdoc': 0.15.1 + '@rushstack/node-core-library': 5.14.0(@types/node@22.9.1) + chalk: 5.6.2 hast-util-format: 1.1.0 hast-util-from-html: 2.0.3 hast-util-to-html: 9.0.5 - hastscript: 9.0.0 + hastscript: 9.0.1 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-hast: 13.2.0 mdast-util-to-markdown: 2.1.2 unist-util-remove-position: 5.0.0 transitivePeerDependencies: @@ -10982,11 +10967,11 @@ snapshots: dependencies: langium: 3.3.1 - '@microsoft/api-extractor-model@7.28.21(@types/node@22.9.1)': + '@microsoft/api-extractor-model@7.30.7(@types/node@22.9.1)': dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 5.3.0(@types/node@22.9.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.14.0(@types/node@22.9.1) transitivePeerDependencies: - '@types/node' @@ -11088,13 +11073,6 @@ snapshots: dependencies: '@nevware21/ts-utils': 0.11.6 - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - '@microsoft/tsdoc-config@0.17.1': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -11102,8 +11080,6 @@ snapshots: jju: 1.4.0 resolve: 1.22.8 - '@microsoft/tsdoc@0.14.2': {} - '@microsoft/tsdoc@0.15.1': {} '@napi-rs/wasm-runtime@0.2.12': @@ -11324,25 +11300,12 @@ snapshots: optionalDependencies: '@types/node': 22.9.1 - '@rushstack/node-core-library@5.3.0(@types/node@22.9.1)': - dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - optionalDependencies: - '@types/node': 22.9.1 - - '@rushstack/node-core-library@5.9.0(@types/node@22.9.1)': + '@rushstack/node-core-library@5.14.0(@types/node@22.9.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 + fs-extra: 11.3.2 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.8 @@ -11553,11 +11516,11 @@ snapshots: '@tylerbu/cli-api@0.5.0(typescript@5.5.4)': dependencies: '@oclif/core': 4.0.33 - chalk: 5.3.0 + chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.5.4) debug: 4.4.3(supports-color@8.1.1) detect-indent: 7.0.1 - fs-extra: 11.2.0 + fs-extra: 11.3.2 simple-git: 3.27.0 strip-ansi: 7.1.0 transitivePeerDependencies: @@ -12614,7 +12577,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.3.0 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -12625,7 +12588,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.3.0 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 type-fest: 4.27.0 @@ -12733,7 +12696,7 @@ snapshots: dependencies: debug: 4.4.3(supports-color@8.1.1) decompress: 4.2.1 - fs-extra: 11.2.0 + fs-extra: 11.3.2 got: 12.6.1 is-path-inside: 4.0.0 tempy: 3.1.0 @@ -12751,7 +12714,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + chalk@5.6.2: {} char-regex@1.0.2: {} @@ -13626,7 +13589,7 @@ snapshots: '@tylerbu/cli-api': 0.5.0(typescript@5.5.4) fflate: 0.8.2 file-type: 19.6.0 - fs-extra: 11.2.0 + fs-extra: 11.3.2 mime: 4.0.4 untar.js: '@andrewbranch/untar.js@1.0.3' whatwg-mimetype: 4.0.0 @@ -13674,7 +13637,7 @@ snapshots: algoliasearch-helper: 3.22.5(algoliasearch@5.15.0) clsx: 2.1.1 eta: 2.2.0 - fs-extra: 11.2.0 + fs-extra: 11.3.2 lodash: 4.17.21 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14563,7 +14526,7 @@ snapshots: fs-constants@1.0.0: {} - fs-extra@11.2.0: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -14842,7 +14805,7 @@ snapshots: '@types/hast': 3.0.4 '@types/unist': 3.0.3 devlop: 1.1.0 - hastscript: 9.0.0 + hastscript: 9.0.1 property-information: 6.5.0 vfile: 6.0.3 vfile-location: 5.0.3 @@ -14965,12 +14928,12 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hastscript@9.0.0: + hastscript@9.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 he@1.2.0: {} @@ -17994,11 +17957,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.19.0: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -19068,7 +19026,7 @@ snapshots: update-notifier@6.0.2: dependencies: boxen: 7.1.1 - chalk: 5.3.0 + chalk: 5.6.2 configstore: 6.0.0 has-yarn: 3.0.0 import-lazy: 4.0.0 @@ -19085,7 +19043,7 @@ snapshots: update-notifier@7.3.1: dependencies: boxen: 8.0.1 - chalk: 5.3.0 + chalk: 5.6.2 configstore: 7.0.0 is-in-ci: 1.0.0 is-installed-globally: 1.0.0