@player-ui/markdown-plugin 0.14.1 → 0.15.0-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.
- package/dist/MarkdownPlugin.native.js +45 -26
- package/dist/MarkdownPlugin.native.js.map +1 -1
- package/dist/cjs/index.cjs +39 -31
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +39 -31
- package/dist/index.mjs +39 -31
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/index.test.ts +97 -0
- package/src/index.ts +18 -11
- package/src/types.ts +16 -0
- package/src/utils/markdownParser.ts +32 -24
- package/types/types.d.ts +12 -0
- package/types/utils/markdownParser.d.ts +2 -3
package/dist/cjs/index.cjs
CHANGED
|
@@ -256,35 +256,45 @@ function parseAssetMarkdownContent({
|
|
|
256
256
|
mappers,
|
|
257
257
|
parser
|
|
258
258
|
}) {
|
|
259
|
-
const
|
|
260
|
-
const
|
|
261
|
-
if (
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
+
if (mappers.null) {
|
|
269
|
+
return mappers?.null({ originalAsset: asset });
|
|
270
|
+
} else {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return transformer({
|
|
275
|
+
astNode: node,
|
|
276
|
+
asset,
|
|
277
|
+
mappers,
|
|
278
|
+
transformers
|
|
274
279
|
});
|
|
275
|
-
|
|
280
|
+
}).filter((x) => x !== null);
|
|
281
|
+
if (value.length === 1) {
|
|
282
|
+
const [first] = value;
|
|
283
|
+
return parser?.(first, import_player.NodeType.Asset) || null;
|
|
276
284
|
}
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
asset,
|
|
281
|
-
mappers,
|
|
282
|
-
transformers
|
|
285
|
+
const collection = mappers.collection({
|
|
286
|
+
originalAsset: asset,
|
|
287
|
+
value
|
|
283
288
|
});
|
|
284
|
-
return parser?.(
|
|
289
|
+
return parser?.(collection, import_player.NodeType.Asset) || null;
|
|
285
290
|
}
|
|
286
291
|
|
|
287
292
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts
|
|
293
|
+
function isMarkdownAssetNode(node) {
|
|
294
|
+
if (node.type !== import_player2.NodeType.Asset)
|
|
295
|
+
return false;
|
|
296
|
+
return node.value.type === "markdown";
|
|
297
|
+
}
|
|
288
298
|
var MarkdownPlugin = class {
|
|
289
299
|
constructor(mappers) {
|
|
290
300
|
this.name = "MarkdownPlugin";
|
|
@@ -294,14 +304,12 @@ var MarkdownPlugin = class {
|
|
|
294
304
|
player.hooks.view.tap(this.name, (view) => {
|
|
295
305
|
view.hooks.resolver.tap(this.name, (resolver) => {
|
|
296
306
|
resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
|
|
297
|
-
if (node
|
|
298
|
-
const
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
}
|
|
304
|
-
);
|
|
307
|
+
if (node && isMarkdownAssetNode(node)) {
|
|
308
|
+
const rawValue = node.value.value ?? "";
|
|
309
|
+
const resolvedContent = (0, import_player2.resolveDataRefsInString)(rawValue, {
|
|
310
|
+
evaluate: options.evaluate,
|
|
311
|
+
model: options.data.model
|
|
312
|
+
});
|
|
305
313
|
const parsed = parseAssetMarkdownContent({
|
|
306
314
|
asset: {
|
|
307
315
|
...node.value,
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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\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"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -232,35 +232,45 @@ function parseAssetMarkdownContent({
|
|
|
232
232
|
mappers,
|
|
233
233
|
parser
|
|
234
234
|
}) {
|
|
235
|
-
const
|
|
236
|
-
const
|
|
237
|
-
if (
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
+
if (mappers.null) {
|
|
245
|
+
return mappers?.null({ originalAsset: asset });
|
|
246
|
+
} else {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return transformer({
|
|
251
|
+
astNode: node,
|
|
252
|
+
asset,
|
|
253
|
+
mappers,
|
|
254
|
+
transformers
|
|
250
255
|
});
|
|
251
|
-
|
|
256
|
+
}).filter((x) => x !== null);
|
|
257
|
+
if (value.length === 1) {
|
|
258
|
+
const [first] = value;
|
|
259
|
+
return parser?.(first, NodeType.Asset) || null;
|
|
252
260
|
}
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
asset,
|
|
257
|
-
mappers,
|
|
258
|
-
transformers
|
|
261
|
+
const collection = mappers.collection({
|
|
262
|
+
originalAsset: asset,
|
|
263
|
+
value
|
|
259
264
|
});
|
|
260
|
-
return parser?.(
|
|
265
|
+
return parser?.(collection, NodeType.Asset) || null;
|
|
261
266
|
}
|
|
262
267
|
|
|
263
268
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts
|
|
269
|
+
function isMarkdownAssetNode(node) {
|
|
270
|
+
if (node.type !== NodeType2.Asset)
|
|
271
|
+
return false;
|
|
272
|
+
return node.value.type === "markdown";
|
|
273
|
+
}
|
|
264
274
|
var MarkdownPlugin = class {
|
|
265
275
|
constructor(mappers) {
|
|
266
276
|
this.name = "MarkdownPlugin";
|
|
@@ -270,14 +280,12 @@ var MarkdownPlugin = class {
|
|
|
270
280
|
player.hooks.view.tap(this.name, (view) => {
|
|
271
281
|
view.hooks.resolver.tap(this.name, (resolver) => {
|
|
272
282
|
resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
|
|
273
|
-
if (node
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
);
|
|
283
|
+
if (node && isMarkdownAssetNode(node)) {
|
|
284
|
+
const rawValue = node.value.value ?? "";
|
|
285
|
+
const resolvedContent = resolveDataRefsInString(rawValue, {
|
|
286
|
+
evaluate: options.evaluate,
|
|
287
|
+
model: options.data.model
|
|
288
|
+
});
|
|
281
289
|
const parsed = parseAssetMarkdownContent({
|
|
282
290
|
asset: {
|
|
283
291
|
...node.value,
|
package/dist/index.mjs
CHANGED
|
@@ -232,35 +232,45 @@ function parseAssetMarkdownContent({
|
|
|
232
232
|
mappers,
|
|
233
233
|
parser
|
|
234
234
|
}) {
|
|
235
|
-
const
|
|
236
|
-
const
|
|
237
|
-
if (
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
+
if (mappers.null) {
|
|
245
|
+
return mappers?.null({ originalAsset: asset });
|
|
246
|
+
} else {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return transformer({
|
|
251
|
+
astNode: node,
|
|
252
|
+
asset,
|
|
253
|
+
mappers,
|
|
254
|
+
transformers
|
|
250
255
|
});
|
|
251
|
-
|
|
256
|
+
}).filter((x) => x !== null);
|
|
257
|
+
if (value.length === 1) {
|
|
258
|
+
const [first] = value;
|
|
259
|
+
return parser?.(first, NodeType.Asset) || null;
|
|
252
260
|
}
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
asset,
|
|
257
|
-
mappers,
|
|
258
|
-
transformers
|
|
261
|
+
const collection = mappers.collection({
|
|
262
|
+
originalAsset: asset,
|
|
263
|
+
value
|
|
259
264
|
});
|
|
260
|
-
return parser?.(
|
|
265
|
+
return parser?.(collection, NodeType.Asset) || null;
|
|
261
266
|
}
|
|
262
267
|
|
|
263
268
|
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/markdown/core/src/index.ts
|
|
269
|
+
function isMarkdownAssetNode(node) {
|
|
270
|
+
if (node.type !== NodeType2.Asset)
|
|
271
|
+
return false;
|
|
272
|
+
return node.value.type === "markdown";
|
|
273
|
+
}
|
|
264
274
|
var MarkdownPlugin = class {
|
|
265
275
|
constructor(mappers) {
|
|
266
276
|
this.name = "MarkdownPlugin";
|
|
@@ -270,14 +280,12 @@ var MarkdownPlugin = class {
|
|
|
270
280
|
player.hooks.view.tap(this.name, (view) => {
|
|
271
281
|
view.hooks.resolver.tap(this.name, (resolver) => {
|
|
272
282
|
resolver.hooks.beforeResolve.tap(this.name, (node, options) => {
|
|
273
|
-
if (node
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
);
|
|
283
|
+
if (node && isMarkdownAssetNode(node)) {
|
|
284
|
+
const rawValue = node.value.value ?? "";
|
|
285
|
+
const resolvedContent = resolveDataRefsInString(rawValue, {
|
|
286
|
+
evaluate: options.evaluate,
|
|
287
|
+
model: options.data.model
|
|
288
|
+
});
|
|
281
289
|
const parsed = parseAssetMarkdownContent({
|
|
282
290
|
asset: {
|
|
283
291
|
...node.value,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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\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": "0.
|
|
9
|
+
"version": "0.15.0-next.0",
|
|
10
10
|
"main": "dist/cjs/index.cjs",
|
|
11
11
|
"peerDependencies": {
|
|
12
|
-
"@player-ui/player": "0.
|
|
13
|
-
"@player-ui/types": "0.
|
|
12
|
+
"@player-ui/player": "0.15.0-next.0",
|
|
13
|
+
"@player-ui/types": "0.15.0-next.0"
|
|
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
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
@@ -17,6 +25,10 @@ export type LiteralMapper<T extends object = object> = (
|
|
|
17
25
|
T,
|
|
18
26
|
) => Asset;
|
|
19
27
|
|
|
28
|
+
export type NullMapper<T extends object = object> = (
|
|
29
|
+
args: BaseArgs & T,
|
|
30
|
+
) => Asset;
|
|
31
|
+
|
|
20
32
|
export type CompositeMapper<T extends object = object> = (
|
|
21
33
|
args: {
|
|
22
34
|
/**
|
|
@@ -122,6 +134,10 @@ export interface Mappers {
|
|
|
122
134
|
* list item markdown (e.g. - item)
|
|
123
135
|
*/
|
|
124
136
|
listItem?: CompositeMapper;
|
|
137
|
+
/**
|
|
138
|
+
* Optional mapper for when nothing comes back from the mapping
|
|
139
|
+
*/
|
|
140
|
+
null?: NullMapper;
|
|
125
141
|
}
|
|
126
142
|
|
|
127
143
|
export type Transformer<T = any> = (args: {
|