{"version":3,"sources":["jsdelivr-header.js","/npm/@stefanprobst/remark-mdx-next-images@1.2.0/src/index.js"],"names":[],"mappings":"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","file":"/npm/@stefanprobst/remark-mdx-next-images@1.2.0/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@stefanprobst/remark-mdx-next-images@1.2.0/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * @typedef {object} Options\n * @property {string} [assetPrefix]\n * @property {(data: import('vfile').Data) => Array<{ key: string; filePath: string }>} [images]\n * @property {string} [name='Image']\n * @property {string} [publicDirectory]\n */\n\nimport { isAbsoluteUrl } from '@stefanprobst/is-absolute-url'\nimport assert from 'node:assert'\nimport crypto from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport sharp from 'sharp'\nimport { visit } from 'unist-util-visit'\n\n/** @type {import('unified').Plugin<[Options?], import('mdast').Root>} */\nconst withNextImages = function withNextImages(options) {\n  const { assetPrefix = '', images, name = 'Image', publicDirectory = '/' } = options || {}\n\n  return async function transformer(tree, vfile) {\n    assert(vfile.path != null, 'Please provide a path to the input MDX file.')\n    const _filePath = isAbsoluteUrl(vfile.path) ? fileURLToPath(vfile.path) : vfile.path\n    const _directory = path.dirname(_filePath)\n    const directory = path.isAbsolute(_directory) ? _directory : path.join(vfile.cwd, _directory)\n    const additionalFilePaths = images != null ? images(vfile.data) : []\n    assert(vfile.data.images == null, 'VFile data already has a `image` field.')\n    vfile.data.images = {}\n\n    async function generate(url) {\n      const src = path.normalize(url)\n      const srcFilePath = path.isAbsolute(src) ? src : path.join(directory, src)\n      const extension = path.extname(srcFilePath).toLowerCase()\n\n      const buffer = await fs.readFile(srcFilePath)\n      const hash = crypto.createHash('md4')\n      hash.update(buffer)\n\n      const outputFilePath = path.join(\n        publicDirectory,\n        path.basename(srcFilePath).slice(0, -extension.length + 1) +\n          hash.digest('hex').slice(0, 8) +\n          extension,\n      )\n\n      const publicPath = path.join(assetPrefix, outputFilePath)\n      const destinationFilePath = path.join(process.cwd(), 'public', outputFilePath)\n\n      if (!(await fileExists(destinationFilePath))) {\n        await fs.mkdir(path.dirname(destinationFilePath), { recursive: true })\n        await fs.copyFile(srcFilePath, destinationFilePath)\n      }\n\n      const image = sharp(buffer)\n      const { width, height, format } = await image.metadata()\n      const blurDataUrl = format !== 'svg' ? await generateBlurDataUrl(image) : undefined\n\n      return { src: publicPath, width, height, blurDataURL: blurDataUrl }\n    }\n\n    const promises = []\n\n    for (const { key, filePath } of additionalFilePaths) {\n      if (filePath != null && !isAbsoluteUrl(filePath)) {\n        vfile.data.images[key] = await generate(filePath)\n      }\n    }\n\n    visit(tree, 'image', (node, index, parent) => {\n      assert(index != null)\n      assert(parent != null)\n\n      if (isAbsoluteUrl(node.url)) return\n\n      async function replaceNode() {\n        const { src, width, height, blurDataURL } = await generate(node.url)\n\n        parent.children.splice(\n          index,\n          1,\n          // @ts-expect-error TODO: figure out typings, use import('mdast-util-mdx')\n          createMdxJsxTextElement({\n            name,\n            attributes: [\n              createMdxJsxAttribute({\n                name: 'src',\n                value: createMdxJsxAttributeValueExpression(\n                  createObjectExpression([\n                    createProperty(createIdentifier('src'), createLiteral(src)),\n                    createProperty(createIdentifier('width'), createLiteral(width)),\n                    createProperty(createIdentifier('height'), createLiteral(height)),\n                  ]),\n                ),\n              }),\n              createMdxJsxAttribute({ name: 'alt', value: node.alt }),\n              createMdxJsxAttribute({ name: 'title', value: node.title }),\n              createMdxJsxAttribute({ name: 'blurDataURL', value: blurDataURL }),\n            ].filter(Boolean),\n          }),\n        )\n      }\n\n      promises.push(replaceNode())\n    })\n\n    await Promise.all(promises)\n  }\n}\n\nexport default withNextImages\n\nfunction createMdxJsxTextElement({ name, attributes = [], children = [] }) {\n  return {\n    type: 'mdxJsxTextElement',\n    name,\n    children,\n    attributes,\n  }\n}\n\nfunction createMdxJsxAttribute({ name, value }) {\n  if (value == null) return undefined\n\n  return {\n    type: 'mdxJsxAttribute',\n    name,\n    value,\n  }\n}\n\nfunction createMdxJsxAttributeValueExpression(expression) {\n  return {\n    type: 'mdxJsxAttributeValueExpression',\n    // value: expression.raw,\n    data: {\n      estree: {\n        type: 'Program',\n        sourceType: 'module',\n        comments: [],\n        body: [\n          {\n            type: 'ExpressionStatement',\n            expression,\n          },\n        ],\n      },\n    },\n  }\n}\n\nfunction createLiteral(value) {\n  return {\n    type: 'Literal',\n    value,\n    // raw: String(value),\n  }\n}\n\nfunction createObjectExpression(properties) {\n  return {\n    type: 'ObjectExpression',\n    properties,\n  }\n}\n\nfunction createProperty(key, value) {\n  return {\n    type: 'Property',\n    method: false,\n    shorthand: false,\n    computed: false,\n    key,\n    value,\n    kind: 'init',\n  }\n}\n\nfunction createIdentifier(name) {\n  return {\n    type: 'Identifier',\n    name,\n  }\n}\n\nfunction generateBlurDataUrl(image) {\n  const BLUR_IMG_SIZE = 8\n  // const BLUR_QUALITY = 70\n\n  return image\n    .resize(BLUR_IMG_SIZE)\n    .toBuffer({ resolveWithObject: true })\n    .then(({ data, info }) => {\n      return `data:image/${info.format};base64,${data.toString('base64')}`\n    })\n}\n\nasync function fileExists(filePath) {\n  try {\n    await fs.stat(filePath)\n    return true\n  } catch {\n    return false\n  }\n}\n"]}