@player-ui/markdown-plugin 1.2.0 → 1.2.1-next.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.
@@ -256,7 +256,8 @@ function parseAssetMarkdownContent({
256
256
  mappers,
257
257
  parser
258
258
  }) {
259
- const input = asset.value ?? "";
259
+ const rawValue = asset.value;
260
+ const input = rawValue === void 0 || rawValue === null ? "" : String(rawValue);
260
261
  const { children } = (0, import_mdast_util_from_markdown.fromMarkdown)(input);
261
262
  if (children.length === 0) {
262
263
  const empty = mappers.text({ originalAsset: asset, value: "" });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/markdownParser.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/transformers.ts"],"sourcesContent":["import type { Player, PlayerPlugin, Node } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers, MarkdownAsset } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\n\n/** Type guard to identify a markdown asset node */\nfunction isMarkdownAssetNode(\n node: Node.Node,\n): node is Node.Asset<MarkdownAsset> {\n if (node.type !== NodeType.Asset) return false;\n return node.value.type === \"markdown\";\n}\n\n/**\n * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.\n */\nexport class MarkdownPlugin implements PlayerPlugin {\n name = \"MarkdownPlugin\";\n\n private mappers: Mappers;\n\n constructor(mappers: Mappers) {\n this.mappers = mappers;\n }\n\n apply(player: Player): void {\n player.hooks.view.tap(this.name, (view) => {\n view.hooks.resolver.tap(this.name, (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (node && isMarkdownAssetNode(node)) {\n const rawValue = node.value.value ?? \"\";\n\n const resolvedContent = resolveDataRefsInString(rawValue, {\n evaluate: options.evaluate,\n model: options.data.model,\n });\n\n const parsed = parseAssetMarkdownContent({\n asset: {\n ...node.value,\n value: resolvedContent,\n },\n mappers: this.mappers,\n parser: options.parseNode,\n });\n\n return parsed;\n }\n\n return node;\n });\n });\n });\n }\n}\n","import type { Node, ParseObjectOptions } from \"@player-ui/player\";\nimport { NodeType } from \"@player-ui/player\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers, MarkdownAsset } from \"../types\";\nimport { transformers } from \"./transformers\";\n\n/**\n * Parses markdown content using a provided mappers record.\n */\nexport function parseAssetMarkdownContent({\n asset,\n mappers,\n parser,\n}: {\n /**\n * Asset to be parsed\n */\n asset: MarkdownAsset;\n /**\n * Mappers record of AST Node to Player Content\n *\n * @see {@link Mappers}\n */\n mappers: Mappers;\n /**\n * Parser object to AST\n */\n parser?: (\n obj: object,\n type?: Node.ChildrenTypes,\n options?: ParseObjectOptions,\n ) => Node.Node | null;\n}): Node.Node | null {\n const input = asset.value ?? \"\";\n const { children } = fromMarkdown(input);\n\n // No markdown content: return an empty text asset\n if (children.length === 0) {\n const empty = mappers.text({ originalAsset: asset, value: \"\" });\n return parser?.(empty, NodeType.Asset) || null;\n }\n\n // Map all children to their transformed content\n const value = children\n .map((node) => {\n const transformer = transformers[node.type];\n if (!transformer) {\n if (mappers.null) {\n return mappers?.null({ originalAsset: asset });\n } else {\n return null;\n }\n }\n return transformer({\n astNode: node,\n asset,\n mappers,\n transformers,\n });\n })\n .filter((x) => x !== null);\n\n // If only one item, return it directly; otherwise wrap in collection\n if (value.length === 1) {\n const [first] = value;\n return parser?.(first!, NodeType.Asset) || null;\n }\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n}\n","import type { Asset } from \"@player-ui/types\";\nimport type {\n Blockquote,\n Code,\n Emphasis,\n Heading,\n Image,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n Strong,\n Text,\n ThematicBreak,\n} from \"mdast-util-from-markdown/lib\";\nimport type { Transformer } from \"../types\";\n\n/**\n * Swap markdown type to text\n */\nfunction swapMarkdownType(asset: Asset): Asset {\n return { ...asset, type: \"text\" };\n}\n\n/**\n * Transforms Text AST Node into Player Content\n */\nconst textTransformer: Transformer<Text> = ({ astNode, asset, mappers }) => {\n const { value } = astNode;\n\n return mappers.text({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Emphasis AST Node into Player Content\n */\nconst emphasisTransformer: Transformer<Emphasis> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.emphasis) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.emphasis({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Strong AST Node into Player Content\n */\nconst strongTransformer: Transformer<Strong> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.strong) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.strong({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Paragraph AST Node into Player Content\n */\nconst paragraphTransformer: Transformer<Paragraph> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n if (\n children.every(({ type }) => Boolean(mappers[type as keyof typeof mappers]))\n ) {\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.paragraph({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms List AST Node into Player Content\n */\nconst listTransformer: Transformer<List> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.list) {\n const { children, ordered, start } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.list({\n originalAsset: asset,\n value,\n ordered: Boolean(ordered),\n start: start || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms ListItem AST Node into Player Content\n */\nconst listItemTransformer: Transformer<ListItem> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n const mapper = mappers.listItem || mappers.paragraph;\n\n return mapper({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Link AST Node into Player Content\n */\nconst linkTransformer: Transformer<Link> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.link) {\n const { children, url } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.link({\n originalAsset: asset,\n href: url,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Image AST Node into Player Content\n */\nconst imageTransformer: Transformer<Image> = ({ astNode, asset, mappers }) => {\n if (mappers.image) {\n const { title, url, alt } = astNode;\n\n return mappers.image({\n originalAsset: asset,\n src: url,\n value: title || alt || \"\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Blockquote AST Node into Player Content\n */\nconst blockquoteTransformer: Transformer<Blockquote> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.blockquote) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.blockquote({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms InlineCode AST Node into Player Content\n */\nconst inlineCodeTransformer: Transformer<InlineCode> = ({\n astNode,\n asset,\n mappers,\n}) => {\n if (mappers.inlineCode) {\n const { value } = astNode;\n\n return mappers.inlineCode({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Code block AST Node into Player Content\n */\nconst codeTransformer: Transformer<Code> = ({ astNode, asset, mappers }) => {\n if (mappers.code) {\n const { value, lang } = astNode;\n\n return mappers.code({\n originalAsset: asset,\n value,\n lang: lang || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Horizontal Rule (Thematic Break) AST Node into Player Content\n */\nconst horizontalRuleTransformer: Transformer<ThematicBreak> = ({\n asset,\n mappers,\n}) => {\n if (mappers.horizontalRule) {\n return mappers.horizontalRule({\n originalAsset: asset,\n value: \"---\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Heading AST Node into Player Content\n */\nconst headingTransformer: Transformer<Heading> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.heading) {\n const { children, depth } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.heading({\n originalAsset: asset,\n value,\n depth,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\nexport const transformers: Record<string, Transformer> = {\n horizontalRule: horizontalRuleTransformer,\n text: textTransformer,\n emphasis: emphasisTransformer,\n strong: strongTransformer,\n blockquote: blockquoteTransformer,\n list: listTransformer,\n listItem: listItemTransformer,\n link: linkTransformer,\n image: imageTransformer,\n paragraph: paragraphTransformer,\n code: codeTransformer,\n heading: headingTransformer,\n inlineCode: inlineCodeTransformer,\n};\n"],"mappings":"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","names":["import_player","transformers"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/markdownParser.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/transformers.ts"],"sourcesContent":["import type { Player, PlayerPlugin, Node } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers, MarkdownAsset } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\n\n/** Type guard to identify a markdown asset node */\nfunction isMarkdownAssetNode(\n node: Node.Node,\n): node is Node.Asset<MarkdownAsset> {\n if (node.type !== NodeType.Asset) return false;\n return node.value.type === \"markdown\";\n}\n\n/**\n * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.\n */\nexport class MarkdownPlugin implements PlayerPlugin {\n name = \"MarkdownPlugin\";\n\n private mappers: Mappers;\n\n constructor(mappers: Mappers) {\n this.mappers = mappers;\n }\n\n apply(player: Player): void {\n player.hooks.view.tap(this.name, (view) => {\n view.hooks.resolver.tap(this.name, (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (node && isMarkdownAssetNode(node)) {\n const rawValue = node.value.value ?? \"\";\n\n const resolvedContent = resolveDataRefsInString(rawValue, {\n evaluate: options.evaluate,\n model: options.data.model,\n });\n\n const parsed = parseAssetMarkdownContent({\n asset: {\n ...node.value,\n value: resolvedContent,\n },\n mappers: this.mappers,\n parser: options.parseNode,\n });\n\n return parsed;\n }\n\n return node;\n });\n });\n });\n }\n}\n","import type { Node, ParseObjectOptions } from \"@player-ui/player\";\nimport { NodeType } from \"@player-ui/player\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers, MarkdownAsset } from \"../types\";\nimport { transformers } from \"./transformers\";\n\n/**\n * Parses markdown content using a provided mappers record.\n */\nexport function parseAssetMarkdownContent({\n asset,\n mappers,\n parser,\n}: {\n /**\n * Asset to be parsed\n */\n asset: MarkdownAsset;\n /**\n * Mappers record of AST Node to Player Content\n *\n * @see {@link Mappers}\n */\n mappers: Mappers;\n /**\n * Parser object to AST\n */\n parser?: (\n obj: object,\n type?: Node.ChildrenTypes,\n options?: ParseObjectOptions,\n ) => Node.Node | null;\n}): Node.Node | null {\n // asset.value can resolve to a non-string at runtime (e.g. unresolved\n // template); fromMarkdown only accepts string/Buffer and throws\n // \"TextDecoder is not defined\" on J2V8 for anything else, so coerce here.\n const rawValue = asset.value;\n const input =\n rawValue === undefined || rawValue === null ? \"\" : String(rawValue);\n const { children } = fromMarkdown(input);\n\n // No markdown content: return an empty text asset\n if (children.length === 0) {\n const empty = mappers.text({ originalAsset: asset, value: \"\" });\n return parser?.(empty, NodeType.Asset) || null;\n }\n\n // Map all children to their transformed content\n const value = children\n .map((node) => {\n const transformer = transformers[node.type];\n if (!transformer) {\n if (mappers.null) {\n return mappers?.null({ originalAsset: asset });\n } else {\n return null;\n }\n }\n return transformer({\n astNode: node,\n asset,\n mappers,\n transformers,\n });\n })\n .filter((x) => x !== null);\n\n // If only one item, return it directly; otherwise wrap in collection\n if (value.length === 1) {\n const [first] = value;\n return parser?.(first!, NodeType.Asset) || null;\n }\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n}\n","import type { Asset } from \"@player-ui/types\";\nimport type {\n Blockquote,\n Code,\n Emphasis,\n Heading,\n Image,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n Strong,\n Text,\n ThematicBreak,\n} from \"mdast-util-from-markdown/lib\";\nimport type { Transformer } from \"../types\";\n\n/**\n * Swap markdown type to text\n */\nfunction swapMarkdownType(asset: Asset): Asset {\n return { ...asset, type: \"text\" };\n}\n\n/**\n * Transforms Text AST Node into Player Content\n */\nconst textTransformer: Transformer<Text> = ({ astNode, asset, mappers }) => {\n const { value } = astNode;\n\n return mappers.text({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Emphasis AST Node into Player Content\n */\nconst emphasisTransformer: Transformer<Emphasis> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.emphasis) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.emphasis({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Strong AST Node into Player Content\n */\nconst strongTransformer: Transformer<Strong> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.strong) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.strong({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Paragraph AST Node into Player Content\n */\nconst paragraphTransformer: Transformer<Paragraph> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n if (\n children.every(({ type }) => Boolean(mappers[type as keyof typeof mappers]))\n ) {\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.paragraph({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms List AST Node into Player Content\n */\nconst listTransformer: Transformer<List> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.list) {\n const { children, ordered, start } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.list({\n originalAsset: asset,\n value,\n ordered: Boolean(ordered),\n start: start || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms ListItem AST Node into Player Content\n */\nconst listItemTransformer: Transformer<ListItem> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n const mapper = mappers.listItem || mappers.paragraph;\n\n return mapper({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Link AST Node into Player Content\n */\nconst linkTransformer: Transformer<Link> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.link) {\n const { children, url } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.link({\n originalAsset: asset,\n href: url,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Image AST Node into Player Content\n */\nconst imageTransformer: Transformer<Image> = ({ astNode, asset, mappers }) => {\n if (mappers.image) {\n const { title, url, alt } = astNode;\n\n return mappers.image({\n originalAsset: asset,\n src: url,\n value: title || alt || \"\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Blockquote AST Node into Player Content\n */\nconst blockquoteTransformer: Transformer<Blockquote> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.blockquote) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.blockquote({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms InlineCode AST Node into Player Content\n */\nconst inlineCodeTransformer: Transformer<InlineCode> = ({\n astNode,\n asset,\n mappers,\n}) => {\n if (mappers.inlineCode) {\n const { value } = astNode;\n\n return mappers.inlineCode({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Code block AST Node into Player Content\n */\nconst codeTransformer: Transformer<Code> = ({ astNode, asset, mappers }) => {\n if (mappers.code) {\n const { value, lang } = astNode;\n\n return mappers.code({\n originalAsset: asset,\n value,\n lang: lang || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Horizontal Rule (Thematic Break) AST Node into Player Content\n */\nconst horizontalRuleTransformer: Transformer<ThematicBreak> = ({\n asset,\n mappers,\n}) => {\n if (mappers.horizontalRule) {\n return mappers.horizontalRule({\n originalAsset: asset,\n value: \"---\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Heading AST Node into Player Content\n */\nconst headingTransformer: Transformer<Heading> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.heading) {\n const { children, depth } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.heading({\n originalAsset: asset,\n value,\n depth,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\nexport const transformers: Record<string, Transformer> = {\n horizontalRule: horizontalRuleTransformer,\n text: textTransformer,\n emphasis: emphasisTransformer,\n strong: strongTransformer,\n blockquote: blockquoteTransformer,\n list: listTransformer,\n listItem: listItemTransformer,\n link: linkTransformer,\n image: imageTransformer,\n paragraph: paragraphTransformer,\n code: codeTransformer,\n heading: headingTransformer,\n inlineCode: inlineCodeTransformer,\n};\n"],"mappings":"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","names":["import_player","transformers"]}
@@ -232,7 +232,8 @@ function parseAssetMarkdownContent({
232
232
  mappers,
233
233
  parser
234
234
  }) {
235
- const input = asset.value ?? "";
235
+ const rawValue = asset.value;
236
+ const input = rawValue === void 0 || rawValue === null ? "" : String(rawValue);
236
237
  const { children } = fromMarkdown(input);
237
238
  if (children.length === 0) {
238
239
  const empty = mappers.text({ originalAsset: asset, value: "" });
package/dist/index.mjs CHANGED
@@ -232,7 +232,8 @@ function parseAssetMarkdownContent({
232
232
  mappers,
233
233
  parser
234
234
  }) {
235
- const input = asset.value ?? "";
235
+ const rawValue = asset.value;
236
+ const input = rawValue === void 0 || rawValue === null ? "" : String(rawValue);
236
237
  const { children } = fromMarkdown(input);
237
238
  if (children.length === 0) {
238
239
  const empty = mappers.text({ originalAsset: asset, value: "" });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/markdownParser.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/transformers.ts"],"sourcesContent":["import type { Player, PlayerPlugin, Node } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers, MarkdownAsset } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\n\n/** Type guard to identify a markdown asset node */\nfunction isMarkdownAssetNode(\n node: Node.Node,\n): node is Node.Asset<MarkdownAsset> {\n if (node.type !== NodeType.Asset) return false;\n return node.value.type === \"markdown\";\n}\n\n/**\n * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.\n */\nexport class MarkdownPlugin implements PlayerPlugin {\n name = \"MarkdownPlugin\";\n\n private mappers: Mappers;\n\n constructor(mappers: Mappers) {\n this.mappers = mappers;\n }\n\n apply(player: Player): void {\n player.hooks.view.tap(this.name, (view) => {\n view.hooks.resolver.tap(this.name, (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (node && isMarkdownAssetNode(node)) {\n const rawValue = node.value.value ?? \"\";\n\n const resolvedContent = resolveDataRefsInString(rawValue, {\n evaluate: options.evaluate,\n model: options.data.model,\n });\n\n const parsed = parseAssetMarkdownContent({\n asset: {\n ...node.value,\n value: resolvedContent,\n },\n mappers: this.mappers,\n parser: options.parseNode,\n });\n\n return parsed;\n }\n\n return node;\n });\n });\n });\n }\n}\n","import type { Node, ParseObjectOptions } from \"@player-ui/player\";\nimport { NodeType } from \"@player-ui/player\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers, MarkdownAsset } from \"../types\";\nimport { transformers } from \"./transformers\";\n\n/**\n * Parses markdown content using a provided mappers record.\n */\nexport function parseAssetMarkdownContent({\n asset,\n mappers,\n parser,\n}: {\n /**\n * Asset to be parsed\n */\n asset: MarkdownAsset;\n /**\n * Mappers record of AST Node to Player Content\n *\n * @see {@link Mappers}\n */\n mappers: Mappers;\n /**\n * Parser object to AST\n */\n parser?: (\n obj: object,\n type?: Node.ChildrenTypes,\n options?: ParseObjectOptions,\n ) => Node.Node | null;\n}): Node.Node | null {\n const input = asset.value ?? \"\";\n const { children } = fromMarkdown(input);\n\n // No markdown content: return an empty text asset\n if (children.length === 0) {\n const empty = mappers.text({ originalAsset: asset, value: \"\" });\n return parser?.(empty, NodeType.Asset) || null;\n }\n\n // Map all children to their transformed content\n const value = children\n .map((node) => {\n const transformer = transformers[node.type];\n if (!transformer) {\n if (mappers.null) {\n return mappers?.null({ originalAsset: asset });\n } else {\n return null;\n }\n }\n return transformer({\n astNode: node,\n asset,\n mappers,\n transformers,\n });\n })\n .filter((x) => x !== null);\n\n // If only one item, return it directly; otherwise wrap in collection\n if (value.length === 1) {\n const [first] = value;\n return parser?.(first!, NodeType.Asset) || null;\n }\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n}\n","import type { Asset } from \"@player-ui/types\";\nimport type {\n Blockquote,\n Code,\n Emphasis,\n Heading,\n Image,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n Strong,\n Text,\n ThematicBreak,\n} from \"mdast-util-from-markdown/lib\";\nimport type { Transformer } from \"../types\";\n\n/**\n * Swap markdown type to text\n */\nfunction swapMarkdownType(asset: Asset): Asset {\n return { ...asset, type: \"text\" };\n}\n\n/**\n * Transforms Text AST Node into Player Content\n */\nconst textTransformer: Transformer<Text> = ({ astNode, asset, mappers }) => {\n const { value } = astNode;\n\n return mappers.text({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Emphasis AST Node into Player Content\n */\nconst emphasisTransformer: Transformer<Emphasis> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.emphasis) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.emphasis({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Strong AST Node into Player Content\n */\nconst strongTransformer: Transformer<Strong> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.strong) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.strong({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Paragraph AST Node into Player Content\n */\nconst paragraphTransformer: Transformer<Paragraph> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n if (\n children.every(({ type }) => Boolean(mappers[type as keyof typeof mappers]))\n ) {\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.paragraph({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms List AST Node into Player Content\n */\nconst listTransformer: Transformer<List> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.list) {\n const { children, ordered, start } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.list({\n originalAsset: asset,\n value,\n ordered: Boolean(ordered),\n start: start || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms ListItem AST Node into Player Content\n */\nconst listItemTransformer: Transformer<ListItem> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n const mapper = mappers.listItem || mappers.paragraph;\n\n return mapper({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Link AST Node into Player Content\n */\nconst linkTransformer: Transformer<Link> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.link) {\n const { children, url } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.link({\n originalAsset: asset,\n href: url,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Image AST Node into Player Content\n */\nconst imageTransformer: Transformer<Image> = ({ astNode, asset, mappers }) => {\n if (mappers.image) {\n const { title, url, alt } = astNode;\n\n return mappers.image({\n originalAsset: asset,\n src: url,\n value: title || alt || \"\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Blockquote AST Node into Player Content\n */\nconst blockquoteTransformer: Transformer<Blockquote> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.blockquote) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.blockquote({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms InlineCode AST Node into Player Content\n */\nconst inlineCodeTransformer: Transformer<InlineCode> = ({\n astNode,\n asset,\n mappers,\n}) => {\n if (mappers.inlineCode) {\n const { value } = astNode;\n\n return mappers.inlineCode({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Code block AST Node into Player Content\n */\nconst codeTransformer: Transformer<Code> = ({ astNode, asset, mappers }) => {\n if (mappers.code) {\n const { value, lang } = astNode;\n\n return mappers.code({\n originalAsset: asset,\n value,\n lang: lang || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Horizontal Rule (Thematic Break) AST Node into Player Content\n */\nconst horizontalRuleTransformer: Transformer<ThematicBreak> = ({\n asset,\n mappers,\n}) => {\n if (mappers.horizontalRule) {\n return mappers.horizontalRule({\n originalAsset: asset,\n value: \"---\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Heading AST Node into Player Content\n */\nconst headingTransformer: Transformer<Heading> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.heading) {\n const { children, depth } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.heading({\n originalAsset: asset,\n value,\n depth,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\nexport const transformers: Record<string, Transformer> = {\n horizontalRule: horizontalRuleTransformer,\n text: textTransformer,\n emphasis: emphasisTransformer,\n strong: strongTransformer,\n blockquote: blockquoteTransformer,\n list: listTransformer,\n listItem: listItemTransformer,\n link: linkTransformer,\n image: imageTransformer,\n paragraph: paragraphTransformer,\n code: codeTransformer,\n heading: headingTransformer,\n inlineCode: inlineCodeTransformer,\n};\n"],"mappings":";AACA,SAAS,yBAAyB,YAAAA,iBAAgB;;;ACAlD,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;;;ACmB7B,SAAS,iBAAiB,OAAqB;AAC7C,SAAO,EAAE,GAAG,OAAO,MAAM,OAAO;AAClC;AAKA,IAAM,kBAAqC,CAAC,EAAE,SAAS,OAAO,QAAQ,MAAM;AAC1E,QAAM,EAAE,MAAM,IAAI;AAElB,SAAO,QAAQ,KAAK;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAKA,IAAM,sBAA6C,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AACF,MAAM;AACJ,MAAI,QAAQ,UAAU;AACpB,UAAM,EAAE,SAAS,IAAI;AAErB,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,SAAS;AAAA,MACtB,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,oBAAyC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,MAAI,QAAQ,QAAQ;AAClB,UAAM,EAAE,SAAS,IAAI;AAErB,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,OAAO;AAAA,MACpB,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,uBAA+C,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,QAAM,EAAE,SAAS,IAAI;AAErB,MACE,SAAS,MAAM,CAAC,EAAE,KAAK,MAAM,QAAQ,QAAQ,IAA4B,CAAC,CAAC,GAC3E;AACA,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,UAAU;AAAA,MACvB,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,kBAAqC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,MAAI,QAAQ,MAAM;AAChB,UAAM,EAAE,UAAU,SAAS,MAAM,IAAI;AAErC,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,KAAK;AAAA,MAClB,eAAe;AAAA,MACf;AAAA,MACA,SAAS,QAAQ,OAAO;AAAA,MACxB,OAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,sBAA6C,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,QAAQ,SAAS;AAAA,IAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,EACzE;AAEA,QAAM,SAAS,QAAQ,YAAY,QAAQ;AAE3C,SAAO,OAAO;AAAA,IACZ,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAKA,IAAM,kBAAqC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,MAAI,QAAQ,MAAM;AAChB,UAAM,EAAE,UAAU,IAAI,IAAI;AAE1B,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,KAAK;AAAA,MAClB,eAAe;AAAA,MACf,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,mBAAuC,CAAC,EAAE,SAAS,OAAO,QAAQ,MAAM;AAC5E,MAAI,QAAQ,OAAO;AACjB,UAAM,EAAE,OAAO,KAAK,IAAI,IAAI;AAE5B,WAAO,QAAQ,MAAM;AAAA,MACnB,eAAe;AAAA,MACf,KAAK;AAAA,MACL,OAAO,SAAS,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,wBAAiD,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,MAAI,QAAQ,YAAY;AACtB,UAAM,EAAE,SAAS,IAAI;AAErB,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,WAAW;AAAA,MACxB,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,wBAAiD,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,QAAQ,YAAY;AACtB,UAAM,EAAE,MAAM,IAAI;AAElB,WAAO,QAAQ,WAAW;AAAA,MACxB,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,kBAAqC,CAAC,EAAE,SAAS,OAAO,QAAQ,MAAM;AAC1E,MAAI,QAAQ,MAAM;AAChB,UAAM,EAAE,OAAO,KAAK,IAAI;AAExB,WAAO,QAAQ,KAAK;AAAA,MAClB,eAAe;AAAA,MACf;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,4BAAwD,CAAC;AAAA,EAC7D;AAAA,EACA;AACF,MAAM;AACJ,MAAI,QAAQ,gBAAgB;AAC1B,WAAO,QAAQ,eAAe;AAAA,MAC5B,eAAe;AAAA,MACf,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAKA,IAAM,qBAA2C,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAA;AACF,MAAM;AACJ,MAAI,QAAQ,SAAS;AACnB,UAAM,EAAE,UAAU,MAAM,IAAI;AAE5B,UAAM,QAAQ,SAAS;AAAA,MAAI,CAAC,SAC1BA,cAAa,KAAK,IAAI,EAAE,EAAE,SAAS,MAAM,OAAO,SAAS,cAAAA,cAAa,CAAC;AAAA,IACzE;AAEA,WAAO,QAAQ,QAAQ;AAAA,MACrB,eAAe;AAAA,MACf;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAEO,IAAM,eAA4C;AAAA,EACvD,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AACd;;;AD7TO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,GAmBqB;AACnB,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,EAAE,SAAS,IAAI,aAAa,KAAK;AAGvC,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,QAAQ,QAAQ,KAAK,EAAE,eAAe,OAAO,OAAO,GAAG,CAAC;AAC9D,WAAO,SAAS,OAAO,SAAS,KAAK,KAAK;AAAA,EAC5C;AAGA,QAAM,QAAQ,SACX,IAAI,CAAC,SAAS;AACb,UAAM,cAAc,aAAa,KAAK,IAAI;AAC1C,QAAI,CAAC,aAAa;AAChB,UAAI,QAAQ,MAAM;AAChB,eAAO,SAAS,KAAK,EAAE,eAAe,MAAM,CAAC;AAAA,MAC/C,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,YAAY;AAAA,MACjB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC,EACA,OAAO,CAAC,MAAM,MAAM,IAAI;AAG3B,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,CAAC,KAAK,IAAI;AAChB,WAAO,SAAS,OAAQ,SAAS,KAAK,KAAK;AAAA,EAC7C;AAEA,QAAM,aAAa,QAAQ,WAAW;AAAA,IACpC,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AAED,SAAO,SAAS,YAAY,SAAS,KAAK,KAAK;AACjD;;;ADlEA,SAAS,oBACP,MACmC;AACnC,MAAI,KAAK,SAASC,UAAS;AAAO,WAAO;AACzC,SAAO,KAAK,MAAM,SAAS;AAC7B;AAKO,IAAM,iBAAN,MAA6C;AAAA,EAKlD,YAAY,SAAkB;AAJ9B,gBAAO;AAKL,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,QAAsB;AAC1B,WAAO,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC,SAAS;AACzC,WAAK,MAAM,SAAS,IAAI,KAAK,MAAM,CAAC,aAAa;AAC/C,iBAAS,MAAM,cAAc,IAAI,KAAK,MAAM,CAAC,MAAM,YAAY;AAC7D,cAAI,QAAQ,oBAAoB,IAAI,GAAG;AACrC,kBAAM,WAAW,KAAK,MAAM,SAAS;AAErC,kBAAM,kBAAkB,wBAAwB,UAAU;AAAA,cACxD,UAAU,QAAQ;AAAA,cAClB,OAAO,QAAQ,KAAK;AAAA,YACtB,CAAC;AAED,kBAAM,SAAS,0BAA0B;AAAA,cACvC,OAAO;AAAA,gBACL,GAAG,KAAK;AAAA,gBACR,OAAO;AAAA,cACT;AAAA,cACA,SAAS,KAAK;AAAA,cACd,QAAQ,QAAQ;AAAA,YAClB,CAAC;AAED,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;","names":["NodeType","transformers","NodeType"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/markdownParser.ts","../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/utils/transformers.ts"],"sourcesContent":["import type { Player, PlayerPlugin, Node } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers, MarkdownAsset } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\n\n/** Type guard to identify a markdown asset node */\nfunction isMarkdownAssetNode(\n node: Node.Node,\n): node is Node.Asset<MarkdownAsset> {\n if (node.type !== NodeType.Asset) return false;\n return node.value.type === \"markdown\";\n}\n\n/**\n * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.\n */\nexport class MarkdownPlugin implements PlayerPlugin {\n name = \"MarkdownPlugin\";\n\n private mappers: Mappers;\n\n constructor(mappers: Mappers) {\n this.mappers = mappers;\n }\n\n apply(player: Player): void {\n player.hooks.view.tap(this.name, (view) => {\n view.hooks.resolver.tap(this.name, (resolver) => {\n resolver.hooks.beforeResolve.tap(this.name, (node, options) => {\n if (node && isMarkdownAssetNode(node)) {\n const rawValue = node.value.value ?? \"\";\n\n const resolvedContent = resolveDataRefsInString(rawValue, {\n evaluate: options.evaluate,\n model: options.data.model,\n });\n\n const parsed = parseAssetMarkdownContent({\n asset: {\n ...node.value,\n value: resolvedContent,\n },\n mappers: this.mappers,\n parser: options.parseNode,\n });\n\n return parsed;\n }\n\n return node;\n });\n });\n });\n }\n}\n","import type { Node, ParseObjectOptions } from \"@player-ui/player\";\nimport { NodeType } from \"@player-ui/player\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers, MarkdownAsset } from \"../types\";\nimport { transformers } from \"./transformers\";\n\n/**\n * Parses markdown content using a provided mappers record.\n */\nexport function parseAssetMarkdownContent({\n asset,\n mappers,\n parser,\n}: {\n /**\n * Asset to be parsed\n */\n asset: MarkdownAsset;\n /**\n * Mappers record of AST Node to Player Content\n *\n * @see {@link Mappers}\n */\n mappers: Mappers;\n /**\n * Parser object to AST\n */\n parser?: (\n obj: object,\n type?: Node.ChildrenTypes,\n options?: ParseObjectOptions,\n ) => Node.Node | null;\n}): Node.Node | null {\n // asset.value can resolve to a non-string at runtime (e.g. unresolved\n // template); fromMarkdown only accepts string/Buffer and throws\n // \"TextDecoder is not defined\" on J2V8 for anything else, so coerce here.\n const rawValue = asset.value;\n const input =\n rawValue === undefined || rawValue === null ? \"\" : String(rawValue);\n const { children } = fromMarkdown(input);\n\n // No markdown content: return an empty text asset\n if (children.length === 0) {\n const empty = mappers.text({ originalAsset: asset, value: \"\" });\n return parser?.(empty, NodeType.Asset) || null;\n }\n\n // Map all children to their transformed content\n const value = children\n .map((node) => {\n const transformer = transformers[node.type];\n if (!transformer) {\n if (mappers.null) {\n return mappers?.null({ originalAsset: asset });\n } else {\n return null;\n }\n }\n return transformer({\n astNode: node,\n asset,\n mappers,\n transformers,\n });\n })\n .filter((x) => x !== null);\n\n // If only one item, return it directly; otherwise wrap in collection\n if (value.length === 1) {\n const [first] = value;\n return parser?.(first!, NodeType.Asset) || null;\n }\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n}\n","import type { Asset } from \"@player-ui/types\";\nimport type {\n Blockquote,\n Code,\n Emphasis,\n Heading,\n Image,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n Strong,\n Text,\n ThematicBreak,\n} from \"mdast-util-from-markdown/lib\";\nimport type { Transformer } from \"../types\";\n\n/**\n * Swap markdown type to text\n */\nfunction swapMarkdownType(asset: Asset): Asset {\n return { ...asset, type: \"text\" };\n}\n\n/**\n * Transforms Text AST Node into Player Content\n */\nconst textTransformer: Transformer<Text> = ({ astNode, asset, mappers }) => {\n const { value } = astNode;\n\n return mappers.text({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Emphasis AST Node into Player Content\n */\nconst emphasisTransformer: Transformer<Emphasis> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.emphasis) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.emphasis({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Strong AST Node into Player Content\n */\nconst strongTransformer: Transformer<Strong> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.strong) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.strong({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Paragraph AST Node into Player Content\n */\nconst paragraphTransformer: Transformer<Paragraph> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n if (\n children.every(({ type }) => Boolean(mappers[type as keyof typeof mappers]))\n ) {\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.paragraph({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms List AST Node into Player Content\n */\nconst listTransformer: Transformer<List> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.list) {\n const { children, ordered, start } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.list({\n originalAsset: asset,\n value,\n ordered: Boolean(ordered),\n start: start || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms ListItem AST Node into Player Content\n */\nconst listItemTransformer: Transformer<ListItem> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n const mapper = mappers.listItem || mappers.paragraph;\n\n return mapper({\n originalAsset: asset,\n value,\n });\n};\n\n/**\n * Transforms Link AST Node into Player Content\n */\nconst linkTransformer: Transformer<Link> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.link) {\n const { children, url } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.link({\n originalAsset: asset,\n href: url,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Image AST Node into Player Content\n */\nconst imageTransformer: Transformer<Image> = ({ astNode, asset, mappers }) => {\n if (mappers.image) {\n const { title, url, alt } = astNode;\n\n return mappers.image({\n originalAsset: asset,\n src: url,\n value: title || alt || \"\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Blockquote AST Node into Player Content\n */\nconst blockquoteTransformer: Transformer<Blockquote> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.blockquote) {\n const { children } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.blockquote({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms InlineCode AST Node into Player Content\n */\nconst inlineCodeTransformer: Transformer<InlineCode> = ({\n astNode,\n asset,\n mappers,\n}) => {\n if (mappers.inlineCode) {\n const { value } = astNode;\n\n return mappers.inlineCode({\n originalAsset: asset,\n value,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Code block AST Node into Player Content\n */\nconst codeTransformer: Transformer<Code> = ({ astNode, asset, mappers }) => {\n if (mappers.code) {\n const { value, lang } = astNode;\n\n return mappers.code({\n originalAsset: asset,\n value,\n lang: lang || undefined,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Horizontal Rule (Thematic Break) AST Node into Player Content\n */\nconst horizontalRuleTransformer: Transformer<ThematicBreak> = ({\n asset,\n mappers,\n}) => {\n if (mappers.horizontalRule) {\n return mappers.horizontalRule({\n originalAsset: asset,\n value: \"---\",\n });\n }\n\n return swapMarkdownType(asset);\n};\n\n/**\n * Transforms Heading AST Node into Player Content\n */\nconst headingTransformer: Transformer<Heading> = ({\n astNode,\n asset,\n mappers,\n transformers,\n}) => {\n if (mappers.heading) {\n const { children, depth } = astNode;\n\n const value = children.map((node) =>\n transformers[node.type]({ astNode: node, asset, mappers, transformers }),\n );\n\n return mappers.heading({\n originalAsset: asset,\n value,\n depth,\n });\n }\n\n return swapMarkdownType(asset);\n};\n\nexport const transformers: Record<string, Transformer> = {\n horizontalRule: horizontalRuleTransformer,\n text: textTransformer,\n emphasis: emphasisTransformer,\n strong: strongTransformer,\n blockquote: blockquoteTransformer,\n list: listTransformer,\n listItem: listItemTransformer,\n link: linkTransformer,\n image: imageTransformer,\n paragraph: paragraphTransformer,\n code: codeTransformer,\n heading: headingTransformer,\n inlineCode: inlineCodeTransformer,\n};\n"],"mappings":"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","names":["NodeType","transformers","NodeType"]}
package/package.json CHANGED
@@ -6,11 +6,11 @@
6
6
  "types"
7
7
  ],
8
8
  "name": "@player-ui/markdown-plugin",
9
- "version": "1.2.0",
9
+ "version": "1.2.1-next.0",
10
10
  "main": "dist/cjs/index.cjs",
11
11
  "peerDependencies": {
12
- "@player-ui/player": "1.2.0",
13
- "@player-ui/types": "1.2.0"
12
+ "@player-ui/player": "1.2.1-next.0",
13
+ "@player-ui/types": "1.2.1-next.0"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@player-ui/partial-match-fingerprint-plugin": "workspace:^",
@@ -5,6 +5,8 @@ import { Registry } from "@player-ui/partial-match-registry";
5
5
  import { PartialMatchFingerprintPlugin } from "@player-ui/partial-match-fingerprint-plugin";
6
6
  import { buildMockMappers } from "./helpers";
7
7
  import { MarkdownPlugin } from "..";
8
+ import { parseAssetMarkdownContent } from "../utils";
9
+ import type { MarkdownAsset } from "../types";
8
10
 
9
11
  describe("MarkdownPlugin", () => {
10
12
  describe("Transform Operation", () => {
@@ -465,6 +467,35 @@ describe("MarkdownPlugin", () => {
465
467
  expect(view?.label?.asset?.value).toBe("");
466
468
  });
467
469
 
470
+ it("handles non-string markdown values without throwing", () => {
471
+ // Player's string-resolver can return a binding's raw non-string value
472
+ // so a markdown asset's value isn't guaranteed to be a string despite its type.
473
+ // Exercising this via a full flow needs schema machinery this plugin's
474
+ // tests don't set up, so we call parseAssetMarkdownContent directly.
475
+ const asset: MarkdownAsset = {
476
+ id: "md-non-string",
477
+ type: "markdown",
478
+ value: 42 as unknown as string,
479
+ };
480
+
481
+ expect(() =>
482
+ parseAssetMarkdownContent({
483
+ asset,
484
+ mappers: buildMockMappers(),
485
+ parser: (obj) => obj as any,
486
+ }),
487
+ ).not.toThrow();
488
+
489
+ const result = parseAssetMarkdownContent({
490
+ asset,
491
+ mappers: buildMockMappers(),
492
+ parser: (obj) => obj as any,
493
+ }) as any;
494
+
495
+ expect(result?.type).toBe("text");
496
+ expect(result?.value).toBe("42");
497
+ });
498
+
468
499
  describe("Interactions with Asset Registry", () => {
469
500
  it("parses regular flow and maps assets", () => {
470
501
  const fingerprint = new PartialMatchFingerprintPlugin(new Registry());
@@ -31,7 +31,12 @@ export function parseAssetMarkdownContent({
31
31
  options?: ParseObjectOptions,
32
32
  ) => Node.Node | null;
33
33
  }): Node.Node | null {
34
- const input = asset.value ?? "";
34
+ // asset.value can resolve to a non-string at runtime (e.g. unresolved
35
+ // template); fromMarkdown only accepts string/Buffer and throws
36
+ // "TextDecoder is not defined" on J2V8 for anything else, so coerce here.
37
+ const rawValue = asset.value;
38
+ const input =
39
+ rawValue === undefined || rawValue === null ? "" : String(rawValue);
35
40
  const { children } = fromMarkdown(input);
36
41
 
37
42
  // No markdown content: return an empty text asset