markdown-flow-ui 0.2.35 → 0.2.36-dev.1

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.
Files changed (98) hide show
  1. package/README.md +12 -0
  2. package/dist/_virtual/index.es8.js +2 -2
  3. package/dist/_virtual/index.es9.js +2 -2
  4. package/dist/_virtual/index8.cjs +1 -1
  5. package/dist/_virtual/index9.cjs +1 -1
  6. package/dist/_virtual/variable-name.cjs +2 -0
  7. package/dist/_virtual/variable-name.cjs.map +1 -0
  8. package/dist/_virtual/variable-name.es.js +5 -0
  9. package/dist/_virtual/variable-name.es.js.map +1 -0
  10. package/dist/components/ContentRender/plugins/CustomVariable.cjs +1 -1
  11. package/dist/components/ContentRender/plugins/CustomVariable.cjs.map +1 -1
  12. package/dist/components/ContentRender/plugins/CustomVariable.es.js +52 -51
  13. package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
  14. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
  15. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
  16. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +71 -70
  17. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
  18. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
  19. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
  20. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +16 -16
  21. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
  22. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
  23. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -1
  24. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +1 -1
  25. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
  26. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -1
  27. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +23 -23
  28. package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
  29. package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -1
  30. package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +15 -15
  31. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
  32. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -1
  33. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +13 -13
  34. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
  35. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -1
  36. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +8 -8
  37. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
  38. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +1 -1
  39. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +13 -13
  40. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
  41. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -1
  42. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +1 -1
  43. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
  44. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -1
  45. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +1 -1
  46. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
  47. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -1
  48. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +1 -1
  49. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
  50. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -1
  51. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +11 -11
  52. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
  53. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -1
  54. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +1 -1
  55. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
  56. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
  57. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +104 -103
  58. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
  59. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.test.d.ts +1 -0
  60. package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
  61. package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
  62. package/dist/components/MarkdownFlowEditor/utils.d.ts +2 -3
  63. package/dist/components/MarkdownFlowEditor/utils.es.js +43 -50
  64. package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
  65. package/dist/components/MarkdownFlowEditor/utils.variables.test.d.ts +1 -0
  66. package/dist/lib/interaction-defaults.cjs +1 -1
  67. package/dist/lib/interaction-defaults.cjs.map +1 -1
  68. package/dist/lib/interaction-defaults.es.js +49 -49
  69. package/dist/lib/interaction-defaults.es.js.map +1 -1
  70. package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
  71. package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  72. package/dist/node_modules/classnames/index.cjs +1 -1
  73. package/dist/node_modules/classnames/index.es.js +1 -1
  74. package/dist/node_modules/cose-base/cose-base.cjs +1 -1
  75. package/dist/node_modules/cose-base/cose-base.cjs.map +1 -1
  76. package/dist/node_modules/cose-base/cose-base.es.js +1 -1
  77. package/dist/node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.cjs +1 -1
  78. package/dist/node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.cjs.map +1 -1
  79. package/dist/node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.es.js +1 -1
  80. package/dist/node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.cjs +1 -1
  81. package/dist/node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.cjs.map +1 -1
  82. package/dist/node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.es.js +1 -1
  83. package/dist/node_modules/layout-base/layout-base.cjs +1 -1
  84. package/dist/node_modules/layout-base/layout-base.cjs.map +1 -1
  85. package/dist/node_modules/layout-base/layout-base.es.js +1 -1
  86. package/dist/node_modules/remark-flow/dist/index.cjs +1 -1
  87. package/dist/node_modules/remark-flow/dist/index.cjs.map +1 -1
  88. package/dist/node_modules/remark-flow/dist/index.es.js +41 -24
  89. package/dist/node_modules/remark-flow/dist/index.es.js.map +1 -1
  90. package/dist/node_modules/remark-flow/dist/interaction-parser.cjs +1 -1
  91. package/dist/node_modules/remark-flow/dist/interaction-parser.cjs.map +1 -1
  92. package/dist/node_modules/remark-flow/dist/interaction-parser.es.js +44 -45
  93. package/dist/node_modules/remark-flow/dist/interaction-parser.es.js.map +1 -1
  94. package/dist/node_modules/remark-flow/dist/variable-name.cjs +2 -0
  95. package/dist/node_modules/remark-flow/dist/variable-name.cjs.map +1 -0
  96. package/dist/node_modules/remark-flow/dist/variable-name.es.js +31 -0
  97. package/dist/node_modules/remark-flow/dist/variable-name.es.js.map +1 -0
  98. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nconst VARIABLE_NAME_SOURCE = \"[\\\\p{L}\\\\p{N}_]+\";\nconst VARIABLE_NAME_REGEXP = new RegExp(`^${VARIABLE_NAME_SOURCE}$`, \"u\");\nconst VARIABLE_EXPRESSION_PATTERN = `\\\\{\\\\{(${VARIABLE_NAME_SOURCE})\\\\}\\\\}`;\nconst FIXED_OUTPUT_MARKER = \"===\";\n\nconst createVariableExpressionRegexp = () =>\n new RegExp(VARIABLE_EXPRESSION_PATTERN, \"gu\");\n\nconst isValidVariableName = (name: string) =>\n typeof name === \"string\" && VARIABLE_NAME_REGEXP.test(name);\n\nconst extractVariableNames = (content: string) => {\n if (!content) {\n return [];\n }\n const matches: string[] = [];\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n matches.push(match[1]);\n }\n\n return matches;\n};\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n extractVariableNames,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["VARIABLE_NAME_SOURCE","VARIABLE_NAME_REGEXP","VARIABLE_EXPRESSION_PATTERN","FIXED_OUTPUT_MARKER","createVariableExpressionRegexp","isValidVariableName","name","extractVariableNames","content","matches","regexp","match","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n isValidVariableName,\n normalizeVariableName,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n extractVariableNames,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","createVariableExpressionRegexp","createVariableExpressionRegex","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import { CompletionContext, CompletionResult } from '@codemirror/autocomplete';
2
2
  import { SelectedOption } from './types.js';
3
+ import { extractVariableNames, isValidVariableName, normalizeVariableName } from 'remark-flow';
3
4
  declare const createVariableExpressionRegexp: () => RegExp;
4
- declare const isValidVariableName: (name: string) => boolean;
5
- declare const extractVariableNames: (content: string) => string[];
6
5
  declare const parseContentInfo: (type: SelectedOption, dataset: {
7
6
  title?: string;
8
7
  url?: string;
@@ -39,4 +38,4 @@ declare const getImageContentToInsert: ({ resourceUrl, resourceTitle, scalePerce
39
38
  scalePercent?: number;
40
39
  }) => string;
41
40
  declare const getVideoContentToInsert: (resourceUrl: string, resourceTitle: string) => string;
42
- export { createSlashCommands, parseContentInfo, getEmbedUrl, getImageContentToInsert, getVideoContentToInsert, isValidVariableName, extractVariableNames, createVariableExpressionRegexp, wrapWithFixedOutput, unwrapFixedOutput, };
41
+ export { createSlashCommands, parseContentInfo, getEmbedUrl, getImageContentToInsert, getVideoContentToInsert, isValidVariableName, normalizeVariableName, extractVariableNames, createVariableExpressionRegexp, wrapWithFixedOutput, unwrapFixedOutput, };
@@ -1,27 +1,20 @@
1
- import { SelectedOption as p } from "./types.es.js";
2
- import { getVideoEmbedUrl as g } from "./utils/video.es.js";
3
- const d = "[\\p{L}\\p{N}_]+", f = new RegExp(`^${d}$`, "u"), E = `\\{\\{(${d})\\}\\}`, s = "===", h = () => new RegExp(E, "gu"), A = (t) => typeof t == "string" && f.test(t), I = (t) => {
4
- if (!t)
5
- return [];
6
- const e = [], o = h();
7
- let r;
8
- for (; (r = o.exec(t)) !== null; )
9
- e.push(r[1]);
10
- return e;
11
- }, S = (t, e) => {
1
+ import { SelectedOption as m } from "./types.es.js";
2
+ import { getVideoEmbedUrl as b } from "./utils/video.es.js";
3
+ import { d as u } from "../../_virtual/index.es.js";
4
+ const c = "===", E = () => u.createVariableExpressionRegex("gu"), z = (t, e) => {
12
5
  switch (t) {
13
- case p.Image:
6
+ case m.Image:
14
7
  return {
15
8
  resourceUrl: e.url,
16
9
  resourceTitle: e.title,
17
10
  scalePercent: e.scalePercent
18
11
  };
19
- case p.Video:
12
+ case m.Video:
20
13
  return {
21
14
  resourceUrl: e.url,
22
15
  resourceTitle: e.title
23
16
  };
24
- case p.Variable:
17
+ case m.Variable:
25
18
  return {
26
19
  variableName: e.title
27
20
  };
@@ -32,18 +25,18 @@ const d = "[\\p{L}\\p{N}_]+", f = new RegExp(`^${d}$`, "u"), E = `\\{\\{(${d})\\
32
25
  };
33
26
  }
34
27
  };
35
- function T(t, e) {
28
+ function U(t, e) {
36
29
  return (o) => {
37
- const r = o.matchBefore(/\/(\w*)$/);
38
- if (!r) return null;
39
- const l = (n, a, i, c, u) => {
40
- n.dispatch({
41
- changes: { from: i, to: c, insert: "" }
42
- }), t(u);
30
+ const a = o.matchBefore(/\/(\w*)$/);
31
+ if (!a) return null;
32
+ const s = (r, n, i, l, d) => {
33
+ r.dispatch({
34
+ changes: { from: i, to: l, insert: "" }
35
+ }), t(d);
43
36
  };
44
37
  return {
45
- from: r.from,
46
- to: r.to,
38
+ from: a.from,
39
+ to: a.to,
47
40
  options: [
48
41
  // {
49
42
  // label: labels?.divider ?? "Divider",
@@ -59,20 +52,20 @@ function T(t, e) {
59
52
  // },
60
53
  {
61
54
  label: e?.variable ?? "Variable",
62
- apply: (n, a, i, c) => {
63
- l(n, a, i, c, p.Variable);
55
+ apply: (r, n, i, l) => {
56
+ s(r, n, i, l, m.Variable);
64
57
  }
65
58
  },
66
59
  {
67
60
  label: e?.image ?? "Image",
68
- apply: (n, a, i, c) => {
69
- l(n, a, i, c, p.Image);
61
+ apply: (r, n, i, l) => {
62
+ s(r, n, i, l, m.Image);
70
63
  }
71
64
  },
72
65
  {
73
66
  label: e?.video ?? "Video",
74
- apply: (n, a, i, c) => {
75
- l(n, a, i, c, p.Video);
67
+ apply: (r, n, i, l) => {
68
+ s(r, n, i, l, m.Video);
76
69
  }
77
70
  }
78
71
  ],
@@ -80,37 +73,37 @@ function T(t, e) {
80
73
  };
81
74
  };
82
75
  }
83
- const w = (t) => g(t), m = (t) => t.replace(/&/g, "&amp;").replace(/"/g, "&quot;"), b = (t) => t.replace(/([\[\]\\])/g, "\\$1"), R = (t) => Math.max(1, Math.min(1e3, Math.round(t))), $ = (t) => {
76
+ const g = (t) => b(t), p = (t) => t.replace(/&/g, "&amp;").replace(/"/g, "&quot;"), f = (t) => t.replace(/([\[\]\\])/g, "\\$1"), w = (t) => Math.max(1, Math.min(1e3, Math.round(t))), $ = (t) => {
84
77
  const e = t.trim();
85
78
  return e ? new RegExp(
86
- `^${s}\\s*[\\s\\S]*?\\s*${s}$`
87
- ).test(e) ? e : `${s} ${e} ${s}` : `${s}${s}`;
88
- }, U = (t) => {
79
+ `^${c}\\s*[\\s\\S]*?\\s*${c}$`
80
+ ).test(e) ? e : `${c} ${e} ${c}` : `${c}${c}`;
81
+ }, v = (t) => {
89
82
  const e = t.trim(), o = new RegExp(
90
- `^${s}\\s*([\\s\\S]*?)\\s*${s}$`
83
+ `^${c}\\s*([\\s\\S]*?)\\s*${c}$`
91
84
  );
92
85
  return (e.match(o)?.[1] ?? e).trim();
93
- }, _ = ({
86
+ }, I = ({
94
87
  resourceUrl: t,
95
88
  resourceTitle: e,
96
89
  scalePercent: o
97
90
  }) => {
98
- const r = typeof o == "number" ? R(o) : void 0, l = m(t), n = e ? m(e) : void 0, a = e ? b(e) : "", i = typeof r == "number" && r !== 100 ? ` width="${r}%"` : "", c = n ? ` alt="${n}" title="${n}"` : "", u = !r || r === 100 ? `![${a}](${t})` : `<img src="${l}"${c}${i} />`;
99
- return $(u);
100
- }, M = (t, e) => {
101
- const o = w(t), r = e ? m(e) : "", l = m(t), n = m(o), a = `<iframe data-tag="video" data-title="${r}" data-url="${l}" class="w-full aspect-video rounded-lg border-0" src="${n}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;
102
- return $(a);
103
- };
91
+ const a = typeof o == "number" ? w(o) : void 0, s = p(t), r = e ? p(e) : void 0, n = e ? f(e) : "", i = typeof a == "number" && a !== 100 ? ` width="${a}%"` : "", l = r ? ` alt="${r}" title="${r}"` : "", d = !a || a === 100 ? `![${n}](${t})` : `<img src="${s}"${l}${i} />`;
92
+ return $(d);
93
+ }, T = (t, e) => {
94
+ const o = g(t), a = e ? p(e) : "", s = p(t), r = p(o), n = `<iframe data-tag="video" data-title="${a}" data-url="${s}" class="w-full aspect-video rounded-lg border-0" src="${r}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;
95
+ return $(n);
96
+ }, y = u.extractVariableNames, M = u.normalizeVariableName;
104
97
  export {
105
- T as createSlashCommands,
106
- h as createVariableExpressionRegexp,
107
- I as extractVariableNames,
108
- w as getEmbedUrl,
109
- _ as getImageContentToInsert,
110
- M as getVideoContentToInsert,
111
- A as isValidVariableName,
112
- S as parseContentInfo,
113
- U as unwrapFixedOutput,
98
+ U as createSlashCommands,
99
+ E as createVariableExpressionRegexp,
100
+ y as extractVariableNames,
101
+ g as getEmbedUrl,
102
+ I as getImageContentToInsert,
103
+ T as getVideoContentToInsert,
104
+ M as normalizeVariableName,
105
+ z as parseContentInfo,
106
+ v as unwrapFixedOutput,
114
107
  $ as wrapWithFixedOutput
115
108
  };
116
109
  //# sourceMappingURL=utils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.es.js","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nconst VARIABLE_NAME_SOURCE = \"[\\\\p{L}\\\\p{N}_]+\";\nconst VARIABLE_NAME_REGEXP = new RegExp(`^${VARIABLE_NAME_SOURCE}$`, \"u\");\nconst VARIABLE_EXPRESSION_PATTERN = `\\\\{\\\\{(${VARIABLE_NAME_SOURCE})\\\\}\\\\}`;\nconst FIXED_OUTPUT_MARKER = \"===\";\n\nconst createVariableExpressionRegexp = () =>\n new RegExp(VARIABLE_EXPRESSION_PATTERN, \"gu\");\n\nconst isValidVariableName = (name: string) =>\n typeof name === \"string\" && VARIABLE_NAME_REGEXP.test(name);\n\nconst extractVariableNames = (content: string) => {\n if (!content) {\n return [];\n }\n const matches: string[] = [];\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n matches.push(match[1]);\n }\n\n return matches;\n};\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n extractVariableNames,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["VARIABLE_NAME_SOURCE","VARIABLE_NAME_REGEXP","VARIABLE_EXPRESSION_PATTERN","FIXED_OUTPUT_MARKER","createVariableExpressionRegexp","isValidVariableName","name","extractVariableNames","content","matches","regexp","match","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
1
+ {"version":3,"file":"utils.es.js","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n isValidVariableName,\n normalizeVariableName,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n extractVariableNames,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","createVariableExpressionRegexp","createVariableExpressionRegex","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../_virtual/index.cjs"),b=p.distExports.createInteractionParser(),I=/<custom-variable\b/i,T=new RegExp(`\\?\\[(?:%\\{\\{([^}]+)\\}\\})?(${p.distExports.INTERACTION_CONTENT_SOURCE})\\]`),g=/^[\[{]/,v=/^[\s,,\n]+/,E=t=>{if(!t)return null;const n=t.match(T),s=n?.[1]?.trim(),e=n?.[2]?.trim();if(!e)return null;const r=e.includes("||"),l=r?"||":"|",u=e.split(l).map(a=>a.trim()).filter(Boolean);if(!u.length)return null;const i=[],o=[];let c;return u.forEach(a=>{if(a.startsWith("...")){const f=a.replace(/^\.\.\./,"").trim();f&&(c=f);return}i.push(a),o.push(a)}),{variableName:s,buttonTexts:i.length?i:void 0,buttonValues:o.length?o:void 0,placeholder:c,isMultiSelect:r}},V=t=>{if(!t)return null;try{return b.parseToRemarkFormat(t)}catch(n){console.warn("Failed to parse interaction block",n)}return E(t)},h=(t,n)=>{if(!t)return null;const s=t.trim(),e=n.buttonValues||[],r=n.buttonTexts||[],l=e.indexOf(s);if(l>-1)return{value:e[l],display:r[l]};const u=r.indexOf(s);return u>-1?{value:e[u]||r[u],display:r[u]}:null},S=t=>t.split(/[,,\n]/).map(n=>n.trim()).filter(Boolean),d=t=>t.replace(v,""),R=t=>{const n=t.buttonValues||[],s=t.buttonTexts||[],e=[],r=new Set;return n.forEach((l,u)=>{const i=`${l??""}`.trim(),o=`${s[u]??""}`.trim();[i,o].forEach(c=>{if(!c)return;const a=`${c}::${i||c}`;r.has(a)||(r.add(a),e.push({token:c,value:i||c}))})}),e.sort((l,u)=>u.token.length-l.token.length)},A=(t,n)=>{const s=d(t),e=R(n);for(const r of e){if(!s.startsWith(r.token))continue;const l=s[r.token.length];if(!(l&&!/[\s,,\n]/.test(l)))return r}return null},N=(t,n)=>{const s=S(t);if(!s.length)return{};const e=[],r=[];return s.forEach(l=>{const u=h(l,n);if(u){e.push(u.value);return}if(n.placeholder){r.push(l);return}e.push(l)}),{selectedValues:e.length?e:void 0,inputText:r.length?r.join(", "):void 0}},O=(t,n)=>{const s=[];let e=t.trim();for(;e;){const l=A(e,n);if(!l)break;s.push(l.value);const u=d(e);e=d(u.slice(l.token.length))}if(s.length>0)return{selectedValues:s,inputText:n.placeholder&&e.trim()?e.trim():void 0};const r=N(t,n);return r.selectedValues?.length?r:n.placeholder?{inputText:t.trim()}:r},D=t=>{if(!t||Array.isArray(t))return null;const n=Array.isArray(t.selectedValues)?t.selectedValues.map(r=>`${r??""}`.trim()).filter(Boolean):void 0,s=`${t.buttonText??""}`.trim(),e=typeof t.inputText=="string"?t.inputText:void 0;return!n?.length&&!s&&!e?null:{buttonText:s||void 0,inputText:e,selectedValues:n?.length?n:void 0}},C=t=>{if(!t||!g.test(t.trim()))return null;try{const n=JSON.parse(t);return D(n)}catch{return null}},P=t=>!!(t&&(I.test(t)||T.test(t))),m=(t,n,s,e)=>e?.resolveDefaultValues?.({content:t,rawValue:n,interactionInfo:s})??null,x=(t,n,s)=>{const e=n?.toString().trim();if(!e)return{};const r=C(e);if(r)return r;const l=m(t,e,null,s);if(l)return l;if(!P(t))return{buttonText:e,inputText:e};const u=V(t),i=m(t,e,u,s);if(i)return i;if(!u)return{buttonText:e,inputText:e};if(u.isMultiSelect)return O(e,u);const o=h(e,u);return o?{buttonText:o.value||o.display||e}:u.placeholder?{inputText:e}:{buttonText:e,inputText:e}},_=(t,n,s)=>{const e=x(t,n,s);return e.selectedValues?e.selectedValues:n?n.split(",").map(r=>r.trim()).filter(Boolean):void 0};exports.getInteractionDefaultSelectedValues=_;exports.getInteractionDefaultValues=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("../_virtual/index.cjs"),b=d.distExports.createInteractionParser(),I=/<custom-variable\b/i,T=new RegExp(`\\?\\[(?:%${d.distExports.createVariableExpressionRegex().source})?(${d.distExports.INTERACTION_CONTENT_SOURCE})\\]`),g=/^[\[{]/,v=/^[\s,,\n]+/,E=t=>{if(!t)return null;const n=t.match(T),s=n?.[1]?d.distExports.normalizeVariableName(n[1])??void 0:void 0,e=n?.[2]?.trim();if(!e)return null;const r=e.includes("||"),l=r?"||":"|",i=e.split(l).map(a=>a.trim()).filter(Boolean);if(!i.length)return null;const u=[],o=[];let c;return i.forEach(a=>{if(a.startsWith("...")){const p=a.replace(/^\.\.\./,"").trim();p&&(c=p);return}u.push(a),o.push(a)}),{variableName:s,buttonTexts:u.length?u:void 0,buttonValues:o.length?o:void 0,placeholder:c,isMultiSelect:r}},V=t=>{if(!t)return null;try{return b.parseToRemarkFormat(t)}catch(n){console.warn("Failed to parse interaction block",n)}return E(t)},h=(t,n)=>{if(!t)return null;const s=t.trim(),e=n.buttonValues||[],r=n.buttonTexts||[],l=e.indexOf(s);if(l>-1)return{value:e[l],display:r[l]};const i=r.indexOf(s);return i>-1?{value:e[i]||r[i],display:r[i]}:null},R=t=>t.split(/[,,\n]/).map(n=>n.trim()).filter(Boolean),f=t=>t.replace(v,""),S=t=>{const n=t.buttonValues||[],s=t.buttonTexts||[],e=[],r=new Set;return n.forEach((l,i)=>{const u=`${l??""}`.trim(),o=`${s[i]??""}`.trim();[u,o].forEach(c=>{if(!c)return;const a=`${c}::${u||c}`;r.has(a)||(r.add(a),e.push({token:c,value:u||c}))})}),e.sort((l,i)=>i.token.length-l.token.length)},N=(t,n)=>{const s=f(t),e=S(n);for(const r of e){if(!s.startsWith(r.token))continue;const l=s[r.token.length];if(!(l&&!/[\s,,\n]/.test(l)))return r}return null},A=(t,n)=>{const s=R(t);if(!s.length)return{};const e=[],r=[];return s.forEach(l=>{const i=h(l,n);if(i){e.push(i.value);return}if(n.placeholder){r.push(l);return}e.push(l)}),{selectedValues:e.length?e:void 0,inputText:r.length?r.join(", "):void 0}},O=(t,n)=>{const s=[];let e=t.trim();for(;e;){const l=N(e,n);if(!l)break;s.push(l.value);const i=f(e);e=f(i.slice(l.token.length))}if(s.length>0)return{selectedValues:s,inputText:n.placeholder&&e.trim()?e.trim():void 0};const r=A(t,n);return r.selectedValues?.length?r:n.placeholder?{inputText:t.trim()}:r},D=t=>{if(!t||Array.isArray(t))return null;const n=Array.isArray(t.selectedValues)?t.selectedValues.map(r=>`${r??""}`.trim()).filter(Boolean):void 0,s=`${t.buttonText??""}`.trim(),e=typeof t.inputText=="string"?t.inputText:void 0;return!n?.length&&!s&&!e?null:{buttonText:s||void 0,inputText:e,selectedValues:n?.length?n:void 0}},C=t=>{if(!t||!g.test(t.trim()))return null;try{const n=JSON.parse(t);return D(n)}catch{return null}},P=t=>!!(t&&(I.test(t)||T.test(t))),m=(t,n,s,e)=>e?.resolveDefaultValues?.({content:t,rawValue:n,interactionInfo:s})??null,x=(t,n,s)=>{const e=n?.toString().trim();if(!e)return{};const r=C(e);if(r)return r;const l=m(t,e,null,s);if(l)return l;if(!P(t))return{buttonText:e,inputText:e};const i=V(t),u=m(t,e,i,s);if(u)return u;if(!i)return{buttonText:e,inputText:e};if(i.isMultiSelect)return O(e,i);const o=h(e,i);return o?{buttonText:o.value||o.display||e}:i.placeholder?{inputText:e}:{buttonText:e,inputText:e}},_=(t,n,s)=>{const e=x(t,n,s);return e.selectedValues?e.selectedValues:n?n.split(",").map(r=>r.trim()).filter(Boolean):void 0};exports.getInteractionDefaultSelectedValues=_;exports.getInteractionDefaultValues=x;
2
2
  //# sourceMappingURL=interaction-defaults.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"interaction-defaults.cjs","sources":["../../src/lib/interaction-defaults.ts"],"sourcesContent":["import {\n createInteractionParser,\n INTERACTION_CONTENT_SOURCE,\n} from \"remark-flow\";\n\nexport interface InteractionParseResult {\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n variableName?: string;\n isMultiSelect?: boolean;\n}\n\nexport interface InteractionDefaultValues {\n buttonText?: string;\n inputText?: string;\n selectedValues?: string[];\n}\n\nexport interface InteractionDefaultResolverParams {\n content?: string | null;\n rawValue?: string | null;\n interactionInfo?: InteractionParseResult | null;\n}\n\nexport type InteractionDefaultResolver = (\n params: InteractionDefaultResolverParams\n) => InteractionDefaultValues | null | undefined;\n\nexport interface InteractionDefaultValueOptions {\n resolveDefaultValues?: InteractionDefaultResolver;\n}\n\ninterface StructuredInteractionPayload {\n buttonText?: unknown;\n inputText?: unknown;\n selectedValues?: unknown;\n}\n\nconst interactionParser = createInteractionParser();\nconst INTERACTION_TAG_PATTERN = /<custom-variable\\b/i;\n// Same definition of where an interaction ends as the parser uses, so an option carrying a\n// `\\]` is read whole instead of being cut at its first bracket. A variable assignment is optional.\nconst INTERACTION_SHORTCODE_PATTERN = new RegExp(\n `\\\\?\\\\[(?:%\\\\{\\\\{([^}]+)\\\\}\\\\})?(${INTERACTION_CONTENT_SOURCE})\\\\]`\n);\nconst JSON_LIKE_VALUE_PATTERN = /^[\\[{]/;\nconst INTERACTION_VALUE_SEPARATOR_PATTERN = /^[\\s,,\\n]+/;\n\ninterface InteractionOptionCandidate {\n token: string;\n value: string;\n}\n\nconst parseInteractionShortcode = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n const matched = content.match(INTERACTION_SHORTCODE_PATTERN);\n const variableName = matched?.[1]?.trim();\n const interactionBody = matched?.[2]?.trim();\n\n if (!interactionBody) {\n return null;\n }\n\n const isMultiSelect = interactionBody.includes(\"||\");\n const separator = isMultiSelect ? \"||\" : \"|\";\n const rawOptions = interactionBody\n .split(separator)\n .map((item) => item.trim())\n .filter(Boolean);\n\n if (!rawOptions.length) {\n return null;\n }\n\n const buttonTexts: string[] = [];\n const buttonValues: string[] = [];\n let placeholder: string | undefined;\n\n rawOptions.forEach((option) => {\n if (option.startsWith(\"...\")) {\n const normalizedPlaceholder = option.replace(/^\\.\\.\\./, \"\").trim();\n if (normalizedPlaceholder) {\n placeholder = normalizedPlaceholder;\n }\n return;\n }\n\n buttonTexts.push(option);\n buttonValues.push(option);\n });\n\n return {\n variableName,\n buttonTexts: buttonTexts.length ? buttonTexts : undefined,\n buttonValues: buttonValues.length ? buttonValues : undefined,\n placeholder,\n isMultiSelect,\n };\n};\n\nconst parseInteractionBlock = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n try {\n return interactionParser.parseToRemarkFormat(\n content\n ) as InteractionParseResult;\n } catch (error) {\n console.warn(\"Failed to parse interaction block\", error);\n }\n\n return parseInteractionShortcode(content);\n};\n\nconst normalizeButtonValue = (\n token: string,\n info: InteractionParseResult\n): { value: string; display?: string } | null => {\n if (!token) {\n return null;\n }\n\n const cleaned = token.trim();\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const valueIndex = buttonValues.indexOf(cleaned);\n\n if (valueIndex > -1) {\n return {\n value: buttonValues[valueIndex],\n display: buttonTexts[valueIndex],\n };\n }\n\n const textIndex = buttonTexts.indexOf(cleaned);\n\n if (textIndex > -1) {\n return {\n value: buttonValues[textIndex] || buttonTexts[textIndex],\n display: buttonTexts[textIndex],\n };\n }\n\n return null;\n};\n\nconst splitPresetValues = (raw: string) => {\n return raw\n .split(/[,,\\n]/)\n .map((item) => item.trim())\n .filter(Boolean);\n};\n\nconst trimLeadingInteractionSeparators = (raw: string) =>\n raw.replace(INTERACTION_VALUE_SEPARATOR_PATTERN, \"\");\n\nconst buildInteractionOptionCandidates = (\n info: InteractionParseResult\n): InteractionOptionCandidate[] => {\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const candidates: InteractionOptionCandidate[] = [];\n const seenCandidates = new Set<string>();\n\n buttonValues.forEach((buttonValue, index) => {\n const normalizedValue = `${buttonValue ?? \"\"}`.trim();\n const normalizedText = `${buttonTexts[index] ?? \"\"}`.trim();\n\n [normalizedValue, normalizedText].forEach((token) => {\n if (!token) {\n return;\n }\n\n const candidateKey = `${token}::${normalizedValue || token}`;\n if (seenCandidates.has(candidateKey)) {\n return;\n }\n\n seenCandidates.add(candidateKey);\n candidates.push({\n token,\n value: normalizedValue || token,\n });\n });\n });\n\n return candidates.sort(\n (left, right) => right.token.length - left.token.length\n );\n};\n\nconst matchInteractionOptionPrefix = (\n raw: string,\n info: InteractionParseResult\n): InteractionOptionCandidate | null => {\n const normalizedRaw = trimLeadingInteractionSeparators(raw);\n const candidates = buildInteractionOptionCandidates(info);\n\n for (const candidate of candidates) {\n if (!normalizedRaw.startsWith(candidate.token)) {\n continue;\n }\n\n const trailingChar = normalizedRaw[candidate.token.length];\n if (trailingChar && !/[\\s,,\\n]/.test(trailingChar)) {\n continue;\n }\n\n return candidate;\n }\n\n return null;\n};\n\nconst resolveMultiSelectFallbackDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const tokens = splitPresetValues(raw);\n\n if (!tokens.length) {\n return {};\n }\n\n const selectedValues: string[] = [];\n const customInputs: string[] = [];\n\n tokens.forEach((token) => {\n const mapped = normalizeButtonValue(token, info);\n\n if (mapped) {\n selectedValues.push(mapped.value);\n return;\n }\n\n if (info.placeholder) {\n customInputs.push(token);\n return;\n }\n\n selectedValues.push(token);\n });\n\n return {\n selectedValues: selectedValues.length ? selectedValues : undefined,\n inputText: customInputs.length ? customInputs.join(\", \") : undefined,\n };\n};\n\nconst resolveMultiSelectInteractionDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const selectedValues: string[] = [];\n let remainingRaw = raw.trim();\n\n // Prefer option-aware prefix matching before delimiter splitting so\n // option labels that contain commas can still round-trip correctly.\n while (remainingRaw) {\n const matchedCandidate = matchInteractionOptionPrefix(remainingRaw, info);\n\n if (!matchedCandidate) {\n break;\n }\n\n selectedValues.push(matchedCandidate.value);\n const normalizedRemainingRaw =\n trimLeadingInteractionSeparators(remainingRaw);\n remainingRaw = trimLeadingInteractionSeparators(\n normalizedRemainingRaw.slice(matchedCandidate.token.length)\n );\n }\n\n if (selectedValues.length > 0) {\n return {\n selectedValues,\n inputText:\n info.placeholder && remainingRaw.trim()\n ? remainingRaw.trim()\n : undefined,\n };\n }\n\n const fallbackDefaults = resolveMultiSelectFallbackDefaults(raw, info);\n\n if (fallbackDefaults.selectedValues?.length) {\n return fallbackDefaults;\n }\n\n if (info.placeholder) {\n return {\n inputText: raw.trim(),\n };\n }\n\n return fallbackDefaults;\n};\n\nconst normalizeStructuredInteractionDefaults = (\n payload?: StructuredInteractionPayload | null\n): InteractionDefaultValues | null => {\n if (!payload || Array.isArray(payload)) {\n return null;\n }\n\n const selectedValues = Array.isArray(payload.selectedValues)\n ? payload.selectedValues\n .map((item) => `${item ?? \"\"}`.trim())\n .filter(Boolean)\n : undefined;\n const buttonText = `${payload.buttonText ?? \"\"}`.trim();\n const inputText =\n typeof payload.inputText === \"string\" ? payload.inputText : undefined;\n\n if (!selectedValues?.length && !buttonText && !inputText) {\n return null;\n }\n\n return {\n buttonText: buttonText || undefined,\n inputText,\n selectedValues: selectedValues?.length ? selectedValues : undefined,\n };\n};\n\nconst parseStructuredInteractionDefaults = (rawValue?: string | null) => {\n if (!rawValue) {\n return null;\n }\n\n if (!JSON_LIKE_VALUE_PATTERN.test(rawValue.trim())) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(rawValue) as StructuredInteractionPayload;\n return normalizeStructuredInteractionDefaults(parsed);\n } catch {\n return null;\n }\n};\n\nconst hasPotentialInteractionBlock = (content?: string | null) =>\n Boolean(\n content &&\n (INTERACTION_TAG_PATTERN.test(content) ||\n INTERACTION_SHORTCODE_PATTERN.test(content))\n );\n\nconst resolveCustomInteractionDefaults = (\n content?: string | null,\n rawValue?: string | null,\n interactionInfo?: InteractionParseResult | null,\n options?: InteractionDefaultValueOptions\n) => {\n return (\n options?.resolveDefaultValues?.({\n content,\n rawValue,\n interactionInfo,\n }) ?? null\n );\n};\n\nexport const getInteractionDefaultValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n): InteractionDefaultValues => {\n const normalized = rawValue?.toString().trim();\n\n if (!normalized) {\n return {};\n }\n\n const structuredDefaults = parseStructuredInteractionDefaults(normalized);\n\n if (structuredDefaults) {\n return structuredDefaults;\n }\n\n const customDefaults = resolveCustomInteractionDefaults(\n content,\n normalized,\n null,\n options\n );\n\n if (customDefaults) {\n return customDefaults;\n }\n\n if (!hasPotentialInteractionBlock(content)) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n const interactionInfo = parseInteractionBlock(content);\n const customDefaultsWithInteraction = resolveCustomInteractionDefaults(\n content,\n normalized,\n interactionInfo,\n options\n );\n\n if (customDefaultsWithInteraction) {\n return customDefaultsWithInteraction;\n }\n\n if (!interactionInfo) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n if (interactionInfo.isMultiSelect) {\n return resolveMultiSelectInteractionDefaults(normalized, interactionInfo);\n }\n\n const mapped = normalizeButtonValue(normalized, interactionInfo);\n\n if (mapped) {\n return {\n buttonText: mapped.value || mapped.display || normalized,\n };\n }\n\n if (interactionInfo.placeholder) {\n return {\n inputText: normalized,\n };\n }\n\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n};\n\nexport const getInteractionDefaultSelectedValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n) => {\n const defaults = getInteractionDefaultValues(content, rawValue, options);\n\n if (defaults.selectedValues) {\n return defaults.selectedValues;\n }\n\n return rawValue\n ? rawValue\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n : undefined;\n};\n"],"names":["interactionParser","createInteractionParser","INTERACTION_TAG_PATTERN","INTERACTION_SHORTCODE_PATTERN","INTERACTION_CONTENT_SOURCE","JSON_LIKE_VALUE_PATTERN","INTERACTION_VALUE_SEPARATOR_PATTERN","parseInteractionShortcode","content","matched","variableName","interactionBody","isMultiSelect","separator","rawOptions","item","buttonTexts","buttonValues","placeholder","option","normalizedPlaceholder","parseInteractionBlock","error","normalizeButtonValue","token","info","cleaned","valueIndex","textIndex","splitPresetValues","raw","trimLeadingInteractionSeparators","buildInteractionOptionCandidates","candidates","seenCandidates","buttonValue","index","normalizedValue","normalizedText","candidateKey","left","right","matchInteractionOptionPrefix","normalizedRaw","candidate","trailingChar","resolveMultiSelectFallbackDefaults","tokens","selectedValues","customInputs","mapped","resolveMultiSelectInteractionDefaults","remainingRaw","matchedCandidate","normalizedRemainingRaw","fallbackDefaults","normalizeStructuredInteractionDefaults","payload","buttonText","inputText","parseStructuredInteractionDefaults","rawValue","parsed","hasPotentialInteractionBlock","resolveCustomInteractionDefaults","interactionInfo","options","getInteractionDefaultValues","normalized","structuredDefaults","customDefaults","customDefaultsWithInteraction","getInteractionDefaultSelectedValues","defaults","value"],"mappings":"yHAuCMA,EAAoBC,EAAAA,YAAAA,wBAAA,EACpBC,EAA0B,sBAG1BC,EAAgC,IAAI,OACxC,mCAAmCC,EAAAA,YAAAA,0BAA0B,MAC/D,EACMC,EAA0B,SAC1BC,EAAsC,aAOtCC,EACJC,GACkC,CAClC,GAAI,CAACA,EACH,OAAO,KAGT,MAAMC,EAAUD,EAAQ,MAAML,CAA6B,EACrDO,EAAeD,IAAU,CAAC,GAAG,KAAA,EAC7BE,EAAkBF,IAAU,CAAC,GAAG,KAAA,EAEtC,GAAI,CAACE,EACH,OAAO,KAGT,MAAMC,EAAgBD,EAAgB,SAAS,IAAI,EAC7CE,EAAYD,EAAgB,KAAO,IACnCE,EAAaH,EAChB,MAAME,CAAS,EACf,IAAKE,GAASA,EAAK,KAAA,CAAM,EACzB,OAAO,OAAO,EAEjB,GAAI,CAACD,EAAW,OACd,OAAO,KAGT,MAAME,EAAwB,CAAA,EACxBC,EAAyB,CAAA,EAC/B,IAAIC,EAEJ,OAAAJ,EAAW,QAASK,GAAW,CAC7B,GAAIA,EAAO,WAAW,KAAK,EAAG,CAC5B,MAAMC,EAAwBD,EAAO,QAAQ,UAAW,EAAE,EAAE,KAAA,EACxDC,IACFF,EAAcE,GAEhB,MACF,CAEAJ,EAAY,KAAKG,CAAM,EACvBF,EAAa,KAAKE,CAAM,CAC1B,CAAC,EAEM,CACL,aAAAT,EACA,YAAaM,EAAY,OAASA,EAAc,OAChD,aAAcC,EAAa,OAASA,EAAe,OACnD,YAAAC,EACA,cAAAN,CAAA,CAEJ,EAEMS,EACJb,GACkC,CAClC,GAAI,CAACA,EACH,OAAO,KAGT,GAAI,CACF,OAAOR,EAAkB,oBACvBQ,CAAA,CAEJ,OAASc,EAAO,CACd,QAAQ,KAAK,oCAAqCA,CAAK,CACzD,CAEA,OAAOf,EAA0BC,CAAO,CAC1C,EAEMe,EAAuB,CAC3BC,EACAC,IAC+C,CAC/C,GAAI,CAACD,EACH,OAAO,KAGT,MAAME,EAAUF,EAAM,KAAA,EAChBP,EAAeQ,EAAK,cAAgB,CAAA,EACpCT,EAAcS,EAAK,aAAe,CAAA,EAClCE,EAAaV,EAAa,QAAQS,CAAO,EAE/C,GAAIC,EAAa,GACf,MAAO,CACL,MAAOV,EAAaU,CAAU,EAC9B,QAASX,EAAYW,CAAU,CAAA,EAInC,MAAMC,EAAYZ,EAAY,QAAQU,CAAO,EAE7C,OAAIE,EAAY,GACP,CACL,MAAOX,EAAaW,CAAS,GAAKZ,EAAYY,CAAS,EACvD,QAASZ,EAAYY,CAAS,CAAA,EAI3B,IACT,EAEMC,EAAqBC,GAClBA,EACJ,MAAM,QAAQ,EACd,IAAKf,GAASA,EAAK,KAAA,CAAM,EACzB,OAAO,OAAO,EAGbgB,EAAoCD,GACxCA,EAAI,QAAQxB,EAAqC,EAAE,EAE/C0B,EACJP,GACiC,CACjC,MAAMR,EAAeQ,EAAK,cAAgB,CAAA,EACpCT,EAAcS,EAAK,aAAe,CAAA,EAClCQ,EAA2C,CAAA,EAC3CC,MAAqB,IAE3B,OAAAjB,EAAa,QAAQ,CAACkB,EAAaC,IAAU,CAC3C,MAAMC,EAAkB,GAAGF,GAAe,EAAE,GAAG,KAAA,EACzCG,EAAiB,GAAGtB,EAAYoB,CAAK,GAAK,EAAE,GAAG,KAAA,EAErD,CAACC,EAAiBC,CAAc,EAAE,QAASd,GAAU,CACnD,GAAI,CAACA,EACH,OAGF,MAAMe,EAAe,GAAGf,CAAK,KAAKa,GAAmBb,CAAK,GACtDU,EAAe,IAAIK,CAAY,IAInCL,EAAe,IAAIK,CAAY,EAC/BN,EAAW,KAAK,CACd,MAAAT,EACA,MAAOa,GAAmBb,CAAA,CAC3B,EACH,CAAC,CACH,CAAC,EAEMS,EAAW,KAChB,CAACO,EAAMC,IAAUA,EAAM,MAAM,OAASD,EAAK,MAAM,MAAA,CAErD,EAEME,EAA+B,CACnCZ,EACAL,IACsC,CACtC,MAAMkB,EAAgBZ,EAAiCD,CAAG,EACpDG,EAAaD,EAAiCP,CAAI,EAExD,UAAWmB,KAAaX,EAAY,CAClC,GAAI,CAACU,EAAc,WAAWC,EAAU,KAAK,EAC3C,SAGF,MAAMC,EAAeF,EAAcC,EAAU,MAAM,MAAM,EACzD,GAAI,EAAAC,GAAgB,CAAC,WAAW,KAAKA,CAAY,GAIjD,OAAOD,CACT,CAEA,OAAO,IACT,EAEME,EAAqC,CACzChB,EACAL,IAC6B,CAC7B,MAAMsB,EAASlB,EAAkBC,CAAG,EAEpC,GAAI,CAACiB,EAAO,OACV,MAAO,CAAA,EAGT,MAAMC,EAA2B,CAAA,EAC3BC,EAAyB,CAAA,EAE/B,OAAAF,EAAO,QAASvB,GAAU,CACxB,MAAM0B,EAAS3B,EAAqBC,EAAOC,CAAI,EAE/C,GAAIyB,EAAQ,CACVF,EAAe,KAAKE,EAAO,KAAK,EAChC,MACF,CAEA,GAAIzB,EAAK,YAAa,CACpBwB,EAAa,KAAKzB,CAAK,EACvB,MACF,CAEAwB,EAAe,KAAKxB,CAAK,CAC3B,CAAC,EAEM,CACL,eAAgBwB,EAAe,OAASA,EAAiB,OACzD,UAAWC,EAAa,OAASA,EAAa,KAAK,IAAI,EAAI,MAAA,CAE/D,EAEME,EAAwC,CAC5CrB,EACAL,IAC6B,CAC7B,MAAMuB,EAA2B,CAAA,EACjC,IAAII,EAAetB,EAAI,KAAA,EAIvB,KAAOsB,GAAc,CACnB,MAAMC,EAAmBX,EAA6BU,EAAc3B,CAAI,EAExE,GAAI,CAAC4B,EACH,MAGFL,EAAe,KAAKK,EAAiB,KAAK,EAC1C,MAAMC,EACJvB,EAAiCqB,CAAY,EAC/CA,EAAerB,EACbuB,EAAuB,MAAMD,EAAiB,MAAM,MAAM,CAAA,CAE9D,CAEA,GAAIL,EAAe,OAAS,EAC1B,MAAO,CACL,eAAAA,EACA,UACEvB,EAAK,aAAe2B,EAAa,OAC7BA,EAAa,OACb,MAAA,EAIV,MAAMG,EAAmBT,EAAmChB,EAAKL,CAAI,EAErE,OAAI8B,EAAiB,gBAAgB,OAC5BA,EAGL9B,EAAK,YACA,CACL,UAAWK,EAAI,KAAA,CAAK,EAIjByB,CACT,EAEMC,EACJC,GACoC,CACpC,GAAI,CAACA,GAAW,MAAM,QAAQA,CAAO,EACnC,OAAO,KAGT,MAAMT,EAAiB,MAAM,QAAQS,EAAQ,cAAc,EACvDA,EAAQ,eACL,IAAK1C,GAAS,GAAGA,GAAQ,EAAE,GAAG,KAAA,CAAM,EACpC,OAAO,OAAO,EACjB,OACE2C,EAAa,GAAGD,EAAQ,YAAc,EAAE,GAAG,KAAA,EAC3CE,EACJ,OAAOF,EAAQ,WAAc,SAAWA,EAAQ,UAAY,OAE9D,MAAI,CAACT,GAAgB,QAAU,CAACU,GAAc,CAACC,EACtC,KAGF,CACL,WAAYD,GAAc,OAC1B,UAAAC,EACA,eAAgBX,GAAgB,OAASA,EAAiB,MAAA,CAE9D,EAEMY,EAAsCC,GAA6B,CAKvE,GAJI,CAACA,GAID,CAACxD,EAAwB,KAAKwD,EAAS,KAAA,CAAM,EAC/C,OAAO,KAGT,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,CAAQ,EAClC,OAAOL,EAAuCM,CAAM,CACtD,MAAQ,CACN,OAAO,IACT,CACF,EAEMC,EAAgCvD,GACpC,GACEA,IACGN,EAAwB,KAAKM,CAAO,GACnCL,EAA8B,KAAKK,CAAO,IAG5CwD,EAAmC,CACvCxD,EACAqD,EACAI,EACAC,IAGEA,GAAS,uBAAuB,CAC9B,QAAA1D,EACA,SAAAqD,EACA,gBAAAI,CAAA,CACD,GAAK,KAIGE,EAA8B,CACzC3D,EACAqD,EACAK,IAC6B,CAC7B,MAAME,EAAaP,GAAU,SAAA,EAAW,KAAA,EAExC,GAAI,CAACO,EACH,MAAO,CAAA,EAGT,MAAMC,EAAqBT,EAAmCQ,CAAU,EAExE,GAAIC,EACF,OAAOA,EAGT,MAAMC,EAAiBN,EACrBxD,EACA4D,EACA,KACAF,CAAA,EAGF,GAAII,EACF,OAAOA,EAGT,GAAI,CAACP,EAA6BvD,CAAO,EACvC,MAAO,CACL,WAAY4D,EACZ,UAAWA,CAAA,EAIf,MAAMH,EAAkB5C,EAAsBb,CAAO,EAC/C+D,EAAgCP,EACpCxD,EACA4D,EACAH,EACAC,CAAA,EAGF,GAAIK,EACF,OAAOA,EAGT,GAAI,CAACN,EACH,MAAO,CACL,WAAYG,EACZ,UAAWA,CAAA,EAIf,GAAIH,EAAgB,cAClB,OAAOd,EAAsCiB,EAAYH,CAAe,EAG1E,MAAMf,EAAS3B,EAAqB6C,EAAYH,CAAe,EAE/D,OAAIf,EACK,CACL,WAAYA,EAAO,OAASA,EAAO,SAAWkB,CAAA,EAI9CH,EAAgB,YACX,CACL,UAAWG,CAAA,EAIR,CACL,WAAYA,EACZ,UAAWA,CAAA,CAEf,EAEaI,EAAsC,CACjDhE,EACAqD,EACAK,IACG,CACH,MAAMO,EAAWN,EAA4B3D,EAASqD,EAAUK,CAAO,EAEvE,OAAIO,EAAS,eACJA,EAAS,eAGXZ,EACHA,EACG,MAAM,GAAG,EACT,IAAKa,GAAUA,EAAM,KAAA,CAAM,EAC3B,OAAO,OAAO,EACjB,MACN"}
1
+ {"version":3,"file":"interaction-defaults.cjs","sources":["../../src/lib/interaction-defaults.ts"],"sourcesContent":["import {\n createInteractionParser,\n createVariableExpressionRegex,\n normalizeVariableName,\n INTERACTION_CONTENT_SOURCE,\n} from \"remark-flow\";\n\nexport interface InteractionParseResult {\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n variableName?: string;\n isMultiSelect?: boolean;\n}\n\nexport interface InteractionDefaultValues {\n buttonText?: string;\n inputText?: string;\n selectedValues?: string[];\n}\n\nexport interface InteractionDefaultResolverParams {\n content?: string | null;\n rawValue?: string | null;\n interactionInfo?: InteractionParseResult | null;\n}\n\nexport type InteractionDefaultResolver = (\n params: InteractionDefaultResolverParams\n) => InteractionDefaultValues | null | undefined;\n\nexport interface InteractionDefaultValueOptions {\n resolveDefaultValues?: InteractionDefaultResolver;\n}\n\ninterface StructuredInteractionPayload {\n buttonText?: unknown;\n inputText?: unknown;\n selectedValues?: unknown;\n}\n\nconst interactionParser = createInteractionParser();\nconst INTERACTION_TAG_PATTERN = /<custom-variable\\b/i;\n// Same definition of where an interaction ends as the parser uses, so an option carrying a\n// `\\]` is read whole instead of being cut at its first bracket. A variable assignment is optional.\nconst INTERACTION_SHORTCODE_PATTERN = new RegExp(\n `\\\\?\\\\[(?:%${createVariableExpressionRegex().source})?(${INTERACTION_CONTENT_SOURCE})\\\\]`\n);\nconst JSON_LIKE_VALUE_PATTERN = /^[\\[{]/;\nconst INTERACTION_VALUE_SEPARATOR_PATTERN = /^[\\s,,\\n]+/;\n\ninterface InteractionOptionCandidate {\n token: string;\n value: string;\n}\n\nconst parseInteractionShortcode = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n const matched = content.match(INTERACTION_SHORTCODE_PATTERN);\n const variableName = matched?.[1]\n ? (normalizeVariableName(matched[1]) ?? undefined)\n : undefined;\n const interactionBody = matched?.[2]?.trim();\n\n if (!interactionBody) {\n return null;\n }\n\n const isMultiSelect = interactionBody.includes(\"||\");\n const separator = isMultiSelect ? \"||\" : \"|\";\n const rawOptions = interactionBody\n .split(separator)\n .map((item) => item.trim())\n .filter(Boolean);\n\n if (!rawOptions.length) {\n return null;\n }\n\n const buttonTexts: string[] = [];\n const buttonValues: string[] = [];\n let placeholder: string | undefined;\n\n rawOptions.forEach((option) => {\n if (option.startsWith(\"...\")) {\n const normalizedPlaceholder = option.replace(/^\\.\\.\\./, \"\").trim();\n if (normalizedPlaceholder) {\n placeholder = normalizedPlaceholder;\n }\n return;\n }\n\n buttonTexts.push(option);\n buttonValues.push(option);\n });\n\n return {\n variableName,\n buttonTexts: buttonTexts.length ? buttonTexts : undefined,\n buttonValues: buttonValues.length ? buttonValues : undefined,\n placeholder,\n isMultiSelect,\n };\n};\n\nconst parseInteractionBlock = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n try {\n return interactionParser.parseToRemarkFormat(\n content\n ) as InteractionParseResult;\n } catch (error) {\n console.warn(\"Failed to parse interaction block\", error);\n }\n\n return parseInteractionShortcode(content);\n};\n\nconst normalizeButtonValue = (\n token: string,\n info: InteractionParseResult\n): { value: string; display?: string } | null => {\n if (!token) {\n return null;\n }\n\n const cleaned = token.trim();\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const valueIndex = buttonValues.indexOf(cleaned);\n\n if (valueIndex > -1) {\n return {\n value: buttonValues[valueIndex],\n display: buttonTexts[valueIndex],\n };\n }\n\n const textIndex = buttonTexts.indexOf(cleaned);\n\n if (textIndex > -1) {\n return {\n value: buttonValues[textIndex] || buttonTexts[textIndex],\n display: buttonTexts[textIndex],\n };\n }\n\n return null;\n};\n\nconst splitPresetValues = (raw: string) => {\n return raw\n .split(/[,,\\n]/)\n .map((item) => item.trim())\n .filter(Boolean);\n};\n\nconst trimLeadingInteractionSeparators = (raw: string) =>\n raw.replace(INTERACTION_VALUE_SEPARATOR_PATTERN, \"\");\n\nconst buildInteractionOptionCandidates = (\n info: InteractionParseResult\n): InteractionOptionCandidate[] => {\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const candidates: InteractionOptionCandidate[] = [];\n const seenCandidates = new Set<string>();\n\n buttonValues.forEach((buttonValue, index) => {\n const normalizedValue = `${buttonValue ?? \"\"}`.trim();\n const normalizedText = `${buttonTexts[index] ?? \"\"}`.trim();\n\n [normalizedValue, normalizedText].forEach((token) => {\n if (!token) {\n return;\n }\n\n const candidateKey = `${token}::${normalizedValue || token}`;\n if (seenCandidates.has(candidateKey)) {\n return;\n }\n\n seenCandidates.add(candidateKey);\n candidates.push({\n token,\n value: normalizedValue || token,\n });\n });\n });\n\n return candidates.sort(\n (left, right) => right.token.length - left.token.length\n );\n};\n\nconst matchInteractionOptionPrefix = (\n raw: string,\n info: InteractionParseResult\n): InteractionOptionCandidate | null => {\n const normalizedRaw = trimLeadingInteractionSeparators(raw);\n const candidates = buildInteractionOptionCandidates(info);\n\n for (const candidate of candidates) {\n if (!normalizedRaw.startsWith(candidate.token)) {\n continue;\n }\n\n const trailingChar = normalizedRaw[candidate.token.length];\n if (trailingChar && !/[\\s,,\\n]/.test(trailingChar)) {\n continue;\n }\n\n return candidate;\n }\n\n return null;\n};\n\nconst resolveMultiSelectFallbackDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const tokens = splitPresetValues(raw);\n\n if (!tokens.length) {\n return {};\n }\n\n const selectedValues: string[] = [];\n const customInputs: string[] = [];\n\n tokens.forEach((token) => {\n const mapped = normalizeButtonValue(token, info);\n\n if (mapped) {\n selectedValues.push(mapped.value);\n return;\n }\n\n if (info.placeholder) {\n customInputs.push(token);\n return;\n }\n\n selectedValues.push(token);\n });\n\n return {\n selectedValues: selectedValues.length ? selectedValues : undefined,\n inputText: customInputs.length ? customInputs.join(\", \") : undefined,\n };\n};\n\nconst resolveMultiSelectInteractionDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const selectedValues: string[] = [];\n let remainingRaw = raw.trim();\n\n // Prefer option-aware prefix matching before delimiter splitting so\n // option labels that contain commas can still round-trip correctly.\n while (remainingRaw) {\n const matchedCandidate = matchInteractionOptionPrefix(remainingRaw, info);\n\n if (!matchedCandidate) {\n break;\n }\n\n selectedValues.push(matchedCandidate.value);\n const normalizedRemainingRaw =\n trimLeadingInteractionSeparators(remainingRaw);\n remainingRaw = trimLeadingInteractionSeparators(\n normalizedRemainingRaw.slice(matchedCandidate.token.length)\n );\n }\n\n if (selectedValues.length > 0) {\n return {\n selectedValues,\n inputText:\n info.placeholder && remainingRaw.trim()\n ? remainingRaw.trim()\n : undefined,\n };\n }\n\n const fallbackDefaults = resolveMultiSelectFallbackDefaults(raw, info);\n\n if (fallbackDefaults.selectedValues?.length) {\n return fallbackDefaults;\n }\n\n if (info.placeholder) {\n return {\n inputText: raw.trim(),\n };\n }\n\n return fallbackDefaults;\n};\n\nconst normalizeStructuredInteractionDefaults = (\n payload?: StructuredInteractionPayload | null\n): InteractionDefaultValues | null => {\n if (!payload || Array.isArray(payload)) {\n return null;\n }\n\n const selectedValues = Array.isArray(payload.selectedValues)\n ? payload.selectedValues\n .map((item) => `${item ?? \"\"}`.trim())\n .filter(Boolean)\n : undefined;\n const buttonText = `${payload.buttonText ?? \"\"}`.trim();\n const inputText =\n typeof payload.inputText === \"string\" ? payload.inputText : undefined;\n\n if (!selectedValues?.length && !buttonText && !inputText) {\n return null;\n }\n\n return {\n buttonText: buttonText || undefined,\n inputText,\n selectedValues: selectedValues?.length ? selectedValues : undefined,\n };\n};\n\nconst parseStructuredInteractionDefaults = (rawValue?: string | null) => {\n if (!rawValue) {\n return null;\n }\n\n if (!JSON_LIKE_VALUE_PATTERN.test(rawValue.trim())) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(rawValue) as StructuredInteractionPayload;\n return normalizeStructuredInteractionDefaults(parsed);\n } catch {\n return null;\n }\n};\n\nconst hasPotentialInteractionBlock = (content?: string | null) =>\n Boolean(\n content &&\n (INTERACTION_TAG_PATTERN.test(content) ||\n INTERACTION_SHORTCODE_PATTERN.test(content))\n );\n\nconst resolveCustomInteractionDefaults = (\n content?: string | null,\n rawValue?: string | null,\n interactionInfo?: InteractionParseResult | null,\n options?: InteractionDefaultValueOptions\n) => {\n return (\n options?.resolveDefaultValues?.({\n content,\n rawValue,\n interactionInfo,\n }) ?? null\n );\n};\n\nexport const getInteractionDefaultValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n): InteractionDefaultValues => {\n const normalized = rawValue?.toString().trim();\n\n if (!normalized) {\n return {};\n }\n\n const structuredDefaults = parseStructuredInteractionDefaults(normalized);\n\n if (structuredDefaults) {\n return structuredDefaults;\n }\n\n const customDefaults = resolveCustomInteractionDefaults(\n content,\n normalized,\n null,\n options\n );\n\n if (customDefaults) {\n return customDefaults;\n }\n\n if (!hasPotentialInteractionBlock(content)) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n const interactionInfo = parseInteractionBlock(content);\n const customDefaultsWithInteraction = resolveCustomInteractionDefaults(\n content,\n normalized,\n interactionInfo,\n options\n );\n\n if (customDefaultsWithInteraction) {\n return customDefaultsWithInteraction;\n }\n\n if (!interactionInfo) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n if (interactionInfo.isMultiSelect) {\n return resolveMultiSelectInteractionDefaults(normalized, interactionInfo);\n }\n\n const mapped = normalizeButtonValue(normalized, interactionInfo);\n\n if (mapped) {\n return {\n buttonText: mapped.value || mapped.display || normalized,\n };\n }\n\n if (interactionInfo.placeholder) {\n return {\n inputText: normalized,\n };\n }\n\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n};\n\nexport const getInteractionDefaultSelectedValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n) => {\n const defaults = getInteractionDefaultValues(content, rawValue, options);\n\n if (defaults.selectedValues) {\n return defaults.selectedValues;\n }\n\n return rawValue\n ? rawValue\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n : undefined;\n};\n"],"names":["interactionParser","createInteractionParser","INTERACTION_TAG_PATTERN","INTERACTION_SHORTCODE_PATTERN","createVariableExpressionRegex","INTERACTION_CONTENT_SOURCE","JSON_LIKE_VALUE_PATTERN","INTERACTION_VALUE_SEPARATOR_PATTERN","parseInteractionShortcode","content","matched","variableName","normalizeVariableName","interactionBody","isMultiSelect","separator","rawOptions","item","buttonTexts","buttonValues","placeholder","option","normalizedPlaceholder","parseInteractionBlock","error","normalizeButtonValue","token","info","cleaned","valueIndex","textIndex","splitPresetValues","raw","trimLeadingInteractionSeparators","buildInteractionOptionCandidates","candidates","seenCandidates","buttonValue","index","normalizedValue","normalizedText","candidateKey","left","right","matchInteractionOptionPrefix","normalizedRaw","candidate","trailingChar","resolveMultiSelectFallbackDefaults","tokens","selectedValues","customInputs","mapped","resolveMultiSelectInteractionDefaults","remainingRaw","matchedCandidate","normalizedRemainingRaw","fallbackDefaults","normalizeStructuredInteractionDefaults","payload","buttonText","inputText","parseStructuredInteractionDefaults","rawValue","parsed","hasPotentialInteractionBlock","resolveCustomInteractionDefaults","interactionInfo","options","getInteractionDefaultValues","normalized","structuredDefaults","customDefaults","customDefaultsWithInteraction","getInteractionDefaultSelectedValues","defaults","value"],"mappings":"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"}
@@ -1,27 +1,27 @@
1
- import { d as p } from "../_virtual/index.es.js";
2
- const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp(
3
- `\\?\\[(?:%\\{\\{([^}]+)\\}\\})?(${p.INTERACTION_CONTENT_SOURCE})\\]`
4
- ), I = /^[\[{]/, g = /^[\s,,\n]+/, v = (t) => {
1
+ import { d } from "../_virtual/index.es.js";
2
+ const x = d.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp(
3
+ `\\?\\[(?:%${d.createVariableExpressionRegex().source})?(${d.INTERACTION_CONTENT_SOURCE})\\]`
4
+ ), I = /^[\[{]/, v = /^[\s,,\n]+/, g = (t) => {
5
5
  if (!t)
6
6
  return null;
7
- const n = t.match(T), s = n?.[1]?.trim(), e = n?.[2]?.trim();
7
+ const n = t.match(T), s = n?.[1] ? d.normalizeVariableName(n[1]) ?? void 0 : void 0, e = n?.[2]?.trim();
8
8
  if (!e)
9
9
  return null;
10
- const r = e.includes("||"), l = r ? "||" : "|", u = e.split(l).map((a) => a.trim()).filter(Boolean);
11
- if (!u.length)
10
+ const r = e.includes("||"), l = r ? "||" : "|", o = e.split(l).map((a) => a.trim()).filter(Boolean);
11
+ if (!o.length)
12
12
  return null;
13
- const o = [], i = [];
13
+ const u = [], i = [];
14
14
  let c;
15
- return u.forEach((a) => {
15
+ return o.forEach((a) => {
16
16
  if (a.startsWith("...")) {
17
- const f = a.replace(/^\.\.\./, "").trim();
18
- f && (c = f);
17
+ const m = a.replace(/^\.\.\./, "").trim();
18
+ m && (c = m);
19
19
  return;
20
20
  }
21
- o.push(a), i.push(a);
21
+ u.push(a), i.push(a);
22
22
  }), {
23
23
  variableName: s,
24
- buttonTexts: o.length ? o : void 0,
24
+ buttonTexts: u.length ? u : void 0,
25
25
  buttonValues: i.length ? i : void 0,
26
26
  placeholder: c,
27
27
  isMultiSelect: r
@@ -36,7 +36,7 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
36
36
  } catch (n) {
37
37
  console.warn("Failed to parse interaction block", n);
38
38
  }
39
- return v(t);
39
+ return g(t);
40
40
  }, h = (t, n) => {
41
41
  if (!t)
42
42
  return null;
@@ -46,29 +46,29 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
46
46
  value: e[l],
47
47
  display: r[l]
48
48
  };
49
- const u = r.indexOf(s);
50
- return u > -1 ? {
51
- value: e[u] || r[u],
52
- display: r[u]
49
+ const o = r.indexOf(s);
50
+ return o > -1 ? {
51
+ value: e[o] || r[o],
52
+ display: r[o]
53
53
  } : null;
54
- }, V = (t) => t.split(/[,,\n]/).map((n) => n.trim()).filter(Boolean), d = (t) => t.replace(g, ""), R = (t) => {
54
+ }, V = (t) => t.split(/[,,\n]/).map((n) => n.trim()).filter(Boolean), f = (t) => t.replace(v, ""), R = (t) => {
55
55
  const n = t.buttonValues || [], s = t.buttonTexts || [], e = [], r = /* @__PURE__ */ new Set();
56
- return n.forEach((l, u) => {
57
- const o = `${l ?? ""}`.trim(), i = `${s[u] ?? ""}`.trim();
58
- [o, i].forEach((c) => {
56
+ return n.forEach((l, o) => {
57
+ const u = `${l ?? ""}`.trim(), i = `${s[o] ?? ""}`.trim();
58
+ [u, i].forEach((c) => {
59
59
  if (!c)
60
60
  return;
61
- const a = `${c}::${o || c}`;
61
+ const a = `${c}::${u || c}`;
62
62
  r.has(a) || (r.add(a), e.push({
63
63
  token: c,
64
- value: o || c
64
+ value: u || c
65
65
  }));
66
66
  });
67
67
  }), e.sort(
68
- (l, u) => u.token.length - l.token.length
68
+ (l, o) => o.token.length - l.token.length
69
69
  );
70
- }, A = (t, n) => {
71
- const s = d(t), e = R(n);
70
+ }, N = (t, n) => {
71
+ const s = f(t), e = R(n);
72
72
  for (const r of e) {
73
73
  if (!s.startsWith(r.token))
74
74
  continue;
@@ -77,15 +77,15 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
77
77
  return r;
78
78
  }
79
79
  return null;
80
- }, N = (t, n) => {
80
+ }, A = (t, n) => {
81
81
  const s = V(t);
82
82
  if (!s.length)
83
83
  return {};
84
84
  const e = [], r = [];
85
85
  return s.forEach((l) => {
86
- const u = h(l, n);
87
- if (u) {
88
- e.push(u.value);
86
+ const o = h(l, n);
87
+ if (o) {
88
+ e.push(o.value);
89
89
  return;
90
90
  }
91
91
  if (n.placeholder) {
@@ -101,13 +101,13 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
101
101
  const s = [];
102
102
  let e = t.trim();
103
103
  for (; e; ) {
104
- const l = A(e, n);
104
+ const l = N(e, n);
105
105
  if (!l)
106
106
  break;
107
107
  s.push(l.value);
108
- const u = d(e);
109
- e = d(
110
- u.slice(l.token.length)
108
+ const o = f(e);
109
+ e = f(
110
+ o.slice(l.token.length)
111
111
  );
112
112
  }
113
113
  if (s.length > 0)
@@ -115,7 +115,7 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
115
115
  selectedValues: s,
116
116
  inputText: n.placeholder && e.trim() ? e.trim() : void 0
117
117
  };
118
- const r = N(t, n);
118
+ const r = A(t, n);
119
119
  return r.selectedValues?.length ? r : n.placeholder ? {
120
120
  inputText: t.trim()
121
121
  } : r;
@@ -137,7 +137,7 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
137
137
  } catch {
138
138
  return null;
139
139
  }
140
- }, C = (t) => !!(t && (b.test(t) || T.test(t))), m = (t, n, s, e) => e?.resolveDefaultValues?.({
140
+ }, C = (t) => !!(t && (b.test(t) || T.test(t))), p = (t, n, s, e) => e?.resolveDefaultValues?.({
141
141
  content: t,
142
142
  rawValue: n,
143
143
  interactionInfo: s
@@ -148,7 +148,7 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
148
148
  const r = D(e);
149
149
  if (r)
150
150
  return r;
151
- const l = m(
151
+ const l = p(
152
152
  t,
153
153
  e,
154
154
  null,
@@ -161,36 +161,36 @@ const x = p.createInteractionParser(), b = /<custom-variable\b/i, T = new RegExp
161
161
  buttonText: e,
162
162
  inputText: e
163
163
  };
164
- const u = E(t), o = m(
164
+ const o = E(t), u = p(
165
165
  t,
166
166
  e,
167
- u,
167
+ o,
168
168
  s
169
169
  );
170
- if (o)
171
- return o;
172
- if (!u)
170
+ if (u)
171
+ return u;
172
+ if (!o)
173
173
  return {
174
174
  buttonText: e,
175
175
  inputText: e
176
176
  };
177
- if (u.isMultiSelect)
178
- return O(e, u);
179
- const i = h(e, u);
177
+ if (o.isMultiSelect)
178
+ return O(e, o);
179
+ const i = h(e, o);
180
180
  return i ? {
181
181
  buttonText: i.value || i.display || e
182
- } : u.placeholder ? {
182
+ } : o.placeholder ? {
183
183
  inputText: e
184
184
  } : {
185
185
  buttonText: e,
186
186
  inputText: e
187
187
  };
188
- }, B = (t, n, s) => {
188
+ }, z = (t, n, s) => {
189
189
  const e = _(t, n, s);
190
190
  return e.selectedValues ? e.selectedValues : n ? n.split(",").map((r) => r.trim()).filter(Boolean) : void 0;
191
191
  };
192
192
  export {
193
- B as getInteractionDefaultSelectedValues,
193
+ z as getInteractionDefaultSelectedValues,
194
194
  _ as getInteractionDefaultValues
195
195
  };
196
196
  //# sourceMappingURL=interaction-defaults.es.js.map