index.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /**
  2. * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext
  3. * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension
  4. * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle
  5. *
  6. * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle
  7. * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension
  8. *
  9. * @typedef {import('../index.js').MdxjsEsm} MdxjsEsm
  10. */
  11. // To do: next major: expose functions.
  12. import {ok as assert} from 'devlop'
  13. /**
  14. * Create an extension for `mdast-util-from-markdown` to enable MDX.js ESM in
  15. * markdown.
  16. *
  17. * When using the micromark syntax extension with `addResult`, nodes will have
  18. * a `data.estree` field set to an ESTree [`Program`][program] node.
  19. *
  20. * @returns {FromMarkdownExtension}
  21. * Extension for `mdast-util-from-markdown` to enable MDX.js ESM.
  22. */
  23. export function mdxjsEsmFromMarkdown() {
  24. return {
  25. enter: {mdxjsEsm: enterMdxjsEsm},
  26. exit: {mdxjsEsm: exitMdxjsEsm, mdxjsEsmData: exitMdxjsEsmData}
  27. }
  28. }
  29. /**
  30. * Create an extension for `mdast-util-to-markdown` to enable MDX.js ESM in
  31. * markdown.
  32. *
  33. * @returns {ToMarkdownExtension}
  34. * Extension for `mdast-util-to-markdown` to enable MDX.js ESM.
  35. */
  36. export function mdxjsEsmToMarkdown() {
  37. return {handlers: {mdxjsEsm: handleMdxjsEsm}}
  38. }
  39. /**
  40. * @this {CompileContext}
  41. * @type {FromMarkdownHandle}
  42. */
  43. function enterMdxjsEsm(token) {
  44. this.enter({type: 'mdxjsEsm', value: ''}, token)
  45. this.buffer() // Capture EOLs
  46. }
  47. /**
  48. * @this {CompileContext}
  49. * @type {FromMarkdownHandle}
  50. */
  51. function exitMdxjsEsm(token) {
  52. const value = this.resume()
  53. const node = this.stack[this.stack.length - 1]
  54. assert(node.type === 'mdxjsEsm')
  55. this.exit(token)
  56. const estree = token.estree
  57. node.value = value
  58. if (estree) {
  59. node.data = {estree}
  60. }
  61. }
  62. /**
  63. * @this {CompileContext}
  64. * @type {FromMarkdownHandle}
  65. */
  66. function exitMdxjsEsmData(token) {
  67. this.config.enter.data.call(this, token)
  68. this.config.exit.data.call(this, token)
  69. }
  70. /**
  71. * @type {ToMarkdownHandle}
  72. * @param {MdxjsEsm} node
  73. */
  74. function handleMdxjsEsm(node) {
  75. return node.value || ''
  76. }