@player-ui/markdown-plugin 0.14.1 → 0.14.2--canary.752.28969

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,35 +256,41 @@ function parseAssetMarkdownContent({
256
256
  mappers,
257
257
  parser
258
258
  }) {
259
- const { children } = (0, import_mdast_util_from_markdown.fromMarkdown)(asset.value);
260
- const isMultiParagraph = children.length > 1;
261
- if (isMultiParagraph) {
262
- const value = children.map((node) => {
263
- const transformer2 = transformers[node.type];
264
- return transformer2({
265
- astNode: node,
266
- asset,
267
- mappers,
268
- transformers
269
- });
270
- });
271
- const collection = mappers.collection({
272
- originalAsset: asset,
273
- value
259
+ const input = asset.value ?? "";
260
+ const { children } = (0, import_mdast_util_from_markdown.fromMarkdown)(input);
261
+ if (children.length === 0) {
262
+ const empty = mappers.text({ originalAsset: asset, value: "" });
263
+ return parser?.(empty, import_player.NodeType.Asset) || null;
264
+ }
265
+ const value = children.map((node) => {
266
+ const transformer = transformers[node.type];
267
+ if (!transformer) {
268
+ return mappers.text({ originalAsset: asset, value: "" });
269
+ }
270
+ return transformer({
271
+ astNode: node,
272
+ asset,
273
+ mappers,
274
+ transformers
274
275
  });
275
- return parser?.(collection, import_player.NodeType.Asset) || null;
276
+ });
277
+ if (value.length === 1) {
278
+ const [first] = value;
279
+ return parser?.(first, import_player.NodeType.Asset) || null;
276
280
  }
277
- const transformer = transformers[children[0].type];
278
- const content = transformer({
279
- astNode: children[0],
280
- asset,
281
- mappers,
282
- transformers
281
+ const collection = mappers.collection({
282
+ originalAsset: asset,
283
+ value
283
284
  });
284
- return parser?.(content, import_player.NodeType.Asset) || null;
285
+ return parser?.(collection, import_player.NodeType.Asset) || null;
285
286
  }
286
287
 
287
288
  // ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts
289
+ function isMarkdownAssetNode(node) {
290
+ if (node.type !== import_player2.NodeType.Asset)
291
+ return false;
292
+ return node.value.type === "markdown";
293
+ }
288
294
  var MarkdownPlugin = class {
289
295
  constructor(mappers) {
290
296
  this.name = "MarkdownPlugin";
@@ -294,14 +300,12 @@ var MarkdownPlugin = class {
294
300
  player.hooks.view.tap(this.name, (view) => {
295
301
  view.hooks.resolver.tap(this.name, (resolver) => {
296
302
  resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
297
- if (node?.type === import_player2.NodeType.Asset && node.value.type === "markdown") {
298
- const resolvedContent = (0, import_player2.resolveDataRefsInString)(
299
- node.value.value,
300
- {
301
- evaluate: options.evaluate,
302
- model: options.data.model
303
- }
304
- );
303
+ if (node && isMarkdownAssetNode(node)) {
304
+ const rawValue = node.value.value ?? "";
305
+ const resolvedContent = (0, import_player2.resolveDataRefsInString)(rawValue, {
306
+ evaluate: options.evaluate,
307
+ model: options.data.model
308
+ });
305
309
  const parsed = parseAssetMarkdownContent({
306
310
  asset: {
307
311
  ...node.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 } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\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) {\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?.type === NodeType.Asset && node.value.type === \"markdown\") {\n const resolvedContent = resolveDataRefsInString(\n node.value.value as string,\n {\n evaluate: options.evaluate,\n model: options.data.model,\n },\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 type { Asset } from \"@player-ui/types\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers } 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: Asset;\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 { children } = fromMarkdown(asset.value as string);\n const isMultiParagraph = children.length > 1;\n\n if (isMultiParagraph) {\n const value = children.map((node) => {\n const transformer = transformers[node.type as keyof typeof transformers];\n return transformer({\n astNode: node as any,\n asset,\n mappers,\n transformers,\n });\n });\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n }\n\n const transformer =\n transformers[children[0].type as keyof typeof transformers];\n const content = transformer({\n astNode: children[0] as any,\n asset,\n mappers,\n transformers,\n });\n\n return parser?.(content, 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","transformer"]}
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.map((node) => {\n const transformer = transformers[node.type];\n if (!transformer) {\n return mappers.text({ originalAsset: asset, value: \"\" });\n }\n return transformer({\n astNode: node,\n asset,\n mappers,\n transformers,\n });\n });\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,35 +232,41 @@ function parseAssetMarkdownContent({
232
232
  mappers,
233
233
  parser
234
234
  }) {
235
- const { children } = fromMarkdown(asset.value);
236
- const isMultiParagraph = children.length > 1;
237
- if (isMultiParagraph) {
238
- const value = children.map((node) => {
239
- const transformer2 = transformers[node.type];
240
- return transformer2({
241
- astNode: node,
242
- asset,
243
- mappers,
244
- transformers
245
- });
246
- });
247
- const collection = mappers.collection({
248
- originalAsset: asset,
249
- value
235
+ const input = asset.value ?? "";
236
+ const { children } = fromMarkdown(input);
237
+ if (children.length === 0) {
238
+ const empty = mappers.text({ originalAsset: asset, value: "" });
239
+ return parser?.(empty, NodeType.Asset) || null;
240
+ }
241
+ const value = children.map((node) => {
242
+ const transformer = transformers[node.type];
243
+ if (!transformer) {
244
+ return mappers.text({ originalAsset: asset, value: "" });
245
+ }
246
+ return transformer({
247
+ astNode: node,
248
+ asset,
249
+ mappers,
250
+ transformers
250
251
  });
251
- return parser?.(collection, NodeType.Asset) || null;
252
+ });
253
+ if (value.length === 1) {
254
+ const [first] = value;
255
+ return parser?.(first, NodeType.Asset) || null;
252
256
  }
253
- const transformer = transformers[children[0].type];
254
- const content = transformer({
255
- astNode: children[0],
256
- asset,
257
- mappers,
258
- transformers
257
+ const collection = mappers.collection({
258
+ originalAsset: asset,
259
+ value
259
260
  });
260
- return parser?.(content, NodeType.Asset) || null;
261
+ return parser?.(collection, NodeType.Asset) || null;
261
262
  }
262
263
 
263
264
  // ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts
265
+ function isMarkdownAssetNode(node) {
266
+ if (node.type !== NodeType2.Asset)
267
+ return false;
268
+ return node.value.type === "markdown";
269
+ }
264
270
  var MarkdownPlugin = class {
265
271
  constructor(mappers) {
266
272
  this.name = "MarkdownPlugin";
@@ -270,14 +276,12 @@ var MarkdownPlugin = class {
270
276
  player.hooks.view.tap(this.name, (view) => {
271
277
  view.hooks.resolver.tap(this.name, (resolver) => {
272
278
  resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
273
- if (node?.type === NodeType2.Asset && node.value.type === "markdown") {
274
- const resolvedContent = resolveDataRefsInString(
275
- node.value.value,
276
- {
277
- evaluate: options.evaluate,
278
- model: options.data.model
279
- }
280
- );
279
+ if (node && isMarkdownAssetNode(node)) {
280
+ const rawValue = node.value.value ?? "";
281
+ const resolvedContent = resolveDataRefsInString(rawValue, {
282
+ evaluate: options.evaluate,
283
+ model: options.data.model
284
+ });
281
285
  const parsed = parseAssetMarkdownContent({
282
286
  asset: {
283
287
  ...node.value,
package/dist/index.mjs CHANGED
@@ -232,35 +232,41 @@ function parseAssetMarkdownContent({
232
232
  mappers,
233
233
  parser
234
234
  }) {
235
- const { children } = fromMarkdown(asset.value);
236
- const isMultiParagraph = children.length > 1;
237
- if (isMultiParagraph) {
238
- const value = children.map((node) => {
239
- const transformer2 = transformers[node.type];
240
- return transformer2({
241
- astNode: node,
242
- asset,
243
- mappers,
244
- transformers
245
- });
246
- });
247
- const collection = mappers.collection({
248
- originalAsset: asset,
249
- value
235
+ const input = asset.value ?? "";
236
+ const { children } = fromMarkdown(input);
237
+ if (children.length === 0) {
238
+ const empty = mappers.text({ originalAsset: asset, value: "" });
239
+ return parser?.(empty, NodeType.Asset) || null;
240
+ }
241
+ const value = children.map((node) => {
242
+ const transformer = transformers[node.type];
243
+ if (!transformer) {
244
+ return mappers.text({ originalAsset: asset, value: "" });
245
+ }
246
+ return transformer({
247
+ astNode: node,
248
+ asset,
249
+ mappers,
250
+ transformers
250
251
  });
251
- return parser?.(collection, NodeType.Asset) || null;
252
+ });
253
+ if (value.length === 1) {
254
+ const [first] = value;
255
+ return parser?.(first, NodeType.Asset) || null;
252
256
  }
253
- const transformer = transformers[children[0].type];
254
- const content = transformer({
255
- astNode: children[0],
256
- asset,
257
- mappers,
258
- transformers
257
+ const collection = mappers.collection({
258
+ originalAsset: asset,
259
+ value
259
260
  });
260
- return parser?.(content, NodeType.Asset) || null;
261
+ return parser?.(collection, NodeType.Asset) || null;
261
262
  }
262
263
 
263
264
  // ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts
265
+ function isMarkdownAssetNode(node) {
266
+ if (node.type !== NodeType2.Asset)
267
+ return false;
268
+ return node.value.type === "markdown";
269
+ }
264
270
  var MarkdownPlugin = class {
265
271
  constructor(mappers) {
266
272
  this.name = "MarkdownPlugin";
@@ -270,14 +276,12 @@ var MarkdownPlugin = class {
270
276
  player.hooks.view.tap(this.name, (view) => {
271
277
  view.hooks.resolver.tap(this.name, (resolver) => {
272
278
  resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
273
- if (node?.type === NodeType2.Asset && node.value.type === "markdown") {
274
- const resolvedContent = resolveDataRefsInString(
275
- node.value.value,
276
- {
277
- evaluate: options.evaluate,
278
- model: options.data.model
279
- }
280
- );
279
+ if (node && isMarkdownAssetNode(node)) {
280
+ const rawValue = node.value.value ?? "";
281
+ const resolvedContent = resolveDataRefsInString(rawValue, {
282
+ evaluate: options.evaluate,
283
+ model: options.data.model
284
+ });
281
285
  const parsed = parseAssetMarkdownContent({
282
286
  asset: {
283
287
  ...node.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 } from \"@player-ui/player\";\nimport { resolveDataRefsInString, NodeType } from \"@player-ui/player\";\nimport type { Mappers } from \"./types\";\nimport { parseAssetMarkdownContent } from \"./utils\";\n\nexport * from \"./types\";\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) {\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?.type === NodeType.Asset && node.value.type === \"markdown\") {\n const resolvedContent = resolveDataRefsInString(\n node.value.value as string,\n {\n evaluate: options.evaluate,\n model: options.data.model,\n },\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 type { Asset } from \"@player-ui/types\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport type { Mappers } 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: Asset;\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 { children } = fromMarkdown(asset.value as string);\n const isMultiParagraph = children.length > 1;\n\n if (isMultiParagraph) {\n const value = children.map((node) => {\n const transformer = transformers[node.type as keyof typeof transformers];\n return transformer({\n astNode: node as any,\n asset,\n mappers,\n transformers,\n });\n });\n\n const collection = mappers.collection({\n originalAsset: asset,\n value,\n });\n\n return parser?.(collection, NodeType.Asset) || null;\n }\n\n const transformer =\n transformers[children[0].type as keyof typeof transformers];\n const content = transformer({\n astNode: children[0] as any,\n asset,\n mappers,\n transformers,\n });\n\n return parser?.(content, 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","transformer","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 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.map((node) => {\n const transformer = transformers[node.type];\n if (!transformer) {\n return mappers.text({ originalAsset: asset, value: \"\" });\n }\n return transformer({\n astNode: node,\n asset,\n mappers,\n transformers,\n });\n });\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": "0.14.1",
9
+ "version": "0.14.2--canary.752.28969",
10
10
  "main": "dist/cjs/index.cjs",
11
11
  "peerDependencies": {
12
- "@player-ui/player": "0.14.1",
13
- "@player-ui/types": "0.14.1"
12
+ "@player-ui/player": "0.14.2--canary.752.28969",
13
+ "@player-ui/types": "0.14.2--canary.752.28969"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@player-ui/partial-match-fingerprint-plugin": "workspace:*",
@@ -368,6 +368,103 @@ describe("MarkdownPlugin", () => {
368
368
  });
369
369
  });
370
370
 
371
+ it("handles undefined markdown values by outputting an empty text asset", () => {
372
+ const player = new Player({
373
+ plugins: [new MarkdownPlugin(buildMockMappers())],
374
+ });
375
+
376
+ const flowWithUndefined: Flow = {
377
+ id: "markdown-undefined-flow",
378
+ views: [
379
+ {
380
+ id: "action",
381
+ type: "action",
382
+ label: {
383
+ asset: {
384
+ id: "md-undefined",
385
+ type: "markdown",
386
+ // intentionally no `value` provided
387
+ } as any,
388
+ },
389
+ },
390
+ ],
391
+ navigation: {
392
+ BEGIN: "FLOW_1",
393
+ FLOW_1: {
394
+ startState: "VIEW_1",
395
+ VIEW_1: {
396
+ state_type: "VIEW",
397
+ ref: "action",
398
+ transitions: {
399
+ "*": "END_Done",
400
+ },
401
+ },
402
+ END_Done: {
403
+ state_type: "END",
404
+ outcome: "done",
405
+ },
406
+ },
407
+ },
408
+ };
409
+
410
+ player.start(flowWithUndefined);
411
+
412
+ const view = (player.getState() as InProgressState).controllers.view
413
+ .currentView?.lastUpdate as any;
414
+
415
+ // Expect plugin not to throw and to produce a text asset with empty value
416
+ expect(view?.label?.asset?.type).toBe("text");
417
+ expect(view?.label?.asset?.value).toBe("");
418
+ });
419
+
420
+ it("handles empty string markdown values by outputting an empty text asset", () => {
421
+ const player = new Player({
422
+ plugins: [new MarkdownPlugin(buildMockMappers())],
423
+ });
424
+
425
+ const flowWithEmpty: Flow = {
426
+ id: "markdown-empty-flow",
427
+ views: [
428
+ {
429
+ id: "action",
430
+ type: "action",
431
+ label: {
432
+ asset: {
433
+ id: "md-empty",
434
+ type: "markdown",
435
+ value: "",
436
+ },
437
+ },
438
+ },
439
+ ],
440
+ navigation: {
441
+ BEGIN: "FLOW_1",
442
+ FLOW_1: {
443
+ startState: "VIEW_1",
444
+ VIEW_1: {
445
+ state_type: "VIEW",
446
+ ref: "action",
447
+ transitions: {
448
+ "*": "END_Done",
449
+ },
450
+ },
451
+ END_Done: {
452
+ state_type: "END",
453
+ outcome: "done",
454
+ },
455
+ },
456
+ },
457
+ };
458
+
459
+ player.start(flowWithEmpty);
460
+
461
+ const view = (player.getState() as InProgressState).controllers.view
462
+ .currentView?.lastUpdate as any;
463
+
464
+ expect(view?.label?.asset?.type).toBe("text");
465
+ expect(view?.label?.asset?.value).toBe("");
466
+ });
467
+
371
468
  describe("Interactions with Asset Registry", () => {
372
469
  it("parses regular flow and maps assets", () => {
373
470
  const fingerprint = new PartialMatchFingerprintPlugin(new Registry());
package/src/index.ts CHANGED
@@ -1,10 +1,18 @@
1
- import type { Player, PlayerPlugin } from "@player-ui/player";
1
+ import type { Player, PlayerPlugin, Node } from "@player-ui/player";
2
2
  import { resolveDataRefsInString, NodeType } from "@player-ui/player";
3
- import type { Mappers } from "./types";
3
+ import type { Mappers, MarkdownAsset } from "./types";
4
4
  import { parseAssetMarkdownContent } from "./utils";
5
5
 
6
6
  export * from "./types";
7
7
 
8
+ /** Type guard to identify a markdown asset node */
9
+ function isMarkdownAssetNode(
10
+ node: Node.Node,
11
+ ): node is Node.Asset<MarkdownAsset> {
12
+ if (node.type !== NodeType.Asset) return false;
13
+ return node.value.type === "markdown";
14
+ }
15
+
8
16
  /**
9
17
  * A plugin that parses markdown written into text assets using the given converters for markdown features into existing assets.
10
18
  */
@@ -17,18 +25,17 @@ export class MarkdownPlugin implements PlayerPlugin {
17
25
  this.mappers = mappers;
18
26
  }
19
27
 
20
- apply(player: Player) {
28
+ apply(player: Player): void {
21
29
  player.hooks.view.tap(this.name, (view) => {
22
30
  view.hooks.resolver.tap(this.name, (resolver) => {
23
31
  resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
24
- if (node?.type === NodeType.Asset && node.value.type === "markdown") {
25
- const resolvedContent = resolveDataRefsInString(
26
- node.value.value as string,
27
- {
28
- evaluate: options.evaluate,
29
- model: options.data.model,
30
- },
31
- );
32
+ if (node && isMarkdownAssetNode(node)) {
33
+ const rawValue = node.value.value ?? "";
34
+
35
+ const resolvedContent = resolveDataRefsInString(rawValue, {
36
+ evaluate: options.evaluate,
37
+ model: options.data.model,
38
+ });
32
39
 
33
40
  const parsed = parseAssetMarkdownContent({
34
41
  asset: {
package/src/types.ts CHANGED
@@ -1,5 +1,13 @@
1
1
  import type { Asset } from "@player-ui/types";
2
2
 
3
+ /**
4
+ * A markdown asset authored in flows.
5
+ * The value may be undefined or a string.
6
+ */
7
+ export interface MarkdownAsset extends Asset<"markdown"> {
8
+ value?: string;
9
+ }
10
+
3
11
  export interface BaseArgs {
4
12
  /**
5
13
  * Unparsed Asset