{
  "version": 3,
  "sources": ["../src/index.ts"],
  "sourcesContent": ["/// <reference types=\"node\" />\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport remapping from \"@jridgewell/remapping\";\nimport { type ESTreeMap, SKIP, walk } from \"astray\";\nimport type { Plugin } from \"esbuild\";\nimport type { SourceLocation } from \"estree\";\nimport MagicString from \"magic-string\";\nimport { parse } from \"meriyah\";\n\ntype ESTreeMapExtra<M = ESTreeMap> = {\n  [K in keyof M]: M[K] & {\n    // Added via meriyah \"loc\" option\n    loc: SourceLocation;\n    // Added via meriyah \"ranges\" option\n    start: number;\n    end: number;\n  };\n};\n\ninterface MinifyOptions {\n  taggedOnly?: boolean;\n  keepComments?: boolean;\n}\n\n// Same encode/decode as esbuild\n// https://github.com/evanw/esbuild/blob/4dfd1b6ae07892f1e8f5a6712fc67301e19a1b24/lib/shared/stdio_protocol.ts#L353-L391\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nexport const encodeUTF8 = (text: string): Uint8Array => encoder.encode(text);\nexport const decodeUTF8 = (bytes: Uint8Array): string => decoder.decode(bytes);\n\nexport function stripWhitespace(html: string, keepComments?: boolean): string {\n  let out = html\n    // Reduce whitespace to a single space\n    .replace(/\\s+/gm, \" \")\n    // Remove space between tags\n    .replace(/> </g, \"><\")\n    // Remove space between edge and start/end tags\n    .replace(/^ </g, \"<\")\n    .replace(/> $/g, \">\");\n\n  if (!keepComments) {\n    // Remove comments, repeatedly until none remain\n    let prev: string;\n    do {\n      prev = out;\n      out = out.replace(/(?:<!--[\\s\\S]*?-->)+/g, \"\");\n    } while (out !== prev);\n  }\n\n  return out;\n}\n\nexport function minify(code: string, opts: MinifyOptions = {}): MagicString {\n  const out = new MagicString(code);\n  const ignoreLines: number[] = [];\n  const ast = parse(code, {\n    next: true,\n    loc: true,\n    ranges: true,\n    module: true,\n\n    onComment(type, value, _start, _end, loc) {\n      if (type === \"MultiLine\" && value.trim() === \"! minify-templates-ignore\") {\n        ignoreLines.push(loc.end.line + 1);\n      }\n    },\n  });\n\n  walk<typeof ast, never, ESTreeMapExtra>(ast, {\n    TemplateLiteral(node) {\n      return ignoreLines.includes(node.loc.start.line) ||\n        (opts.taggedOnly && node.path?.parent?.type !== \"TaggedTemplateExpression\")\n        ? SKIP\n        : undefined;\n    },\n    TemplateElement(node) {\n      const { start, end } = node.loc;\n\n      if (start.line !== end.line || start.column !== end.column) {\n        out.overwrite(node.start, node.end, stripWhitespace(node.value.raw, opts.keepComments));\n      }\n    },\n  });\n\n  return out;\n}\n\nexport const minifyTemplates = (opts: MinifyOptions = {}): Plugin => ({\n  name: \"minify-templates\",\n  setup(build) {\n    if (build.initialOptions.write !== false) return;\n\n    build.onEnd((result) => {\n      // eslint-disable-next-line unicorn/no-array-for-each\n      result.outputFiles?.forEach((file, fileIndex, outputFiles) => {\n        if (!/\\.[mc]?js$/.test(file.path)) return;\n\n        const src = decodeUTF8(file.contents);\n        const out = minify(src, opts);\n\n        // eslint-disable-next-line no-param-reassign\n        outputFiles[fileIndex].contents = encodeUTF8(out.toString());\n\n        const matchingMapIndex = outputFiles.findIndex(\n          (outputFile) => outputFile.path === `${file.path}.map`,\n        );\n\n        if (matchingMapIndex !== -1) {\n          const mapFile = outputFiles[matchingMapIndex];\n          const remapped = remapping(\n            [\n              // Our source map from minifying\n              {\n                ...out.generateDecodedMap({\n                  source: file.path,\n                  file: mapFile.path,\n                  hires: true,\n                }),\n                version: 3,\n              },\n              // esbuild generated source map\n              decodeUTF8(mapFile.contents),\n            ],\n            // Don't load other source maps; referenced files are the original source\n            () => null,\n          );\n\n          // eslint-disable-next-line no-param-reassign\n          outputFiles[matchingMapIndex].contents = encodeUTF8(remapped.toString());\n        }\n      });\n    });\n  },\n});\n\nexport const writeFiles = (): Plugin => ({\n  name: \"write-files\",\n  setup(build) {\n    if (build.initialOptions.write !== false) return;\n\n    build.onEnd(async (result) => {\n      if (!result.outputFiles) return;\n\n      await Promise.all(\n        result.outputFiles.map((file) =>\n          mkdir(dirname(file.path), { recursive: true }).then(() =>\n            writeFile(file.path, file.contents, \"utf8\"),\n          ),\n        ),\n      );\n    });\n  },\n});\n"],
  "mappings": "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",
  "names": ["mkdir", "writeFile", "dirname", "remapping", "SKIP", "walk", "MagicString", "parse", "encoder", "decoder", "encodeUTF8", "text", "decodeUTF8", "bytes", "stripWhitespace", "html", "keepComments", "out", "prev", "minify", "code", "opts", "ignoreLines", "ast", "type", "value", "_start", "_end", "loc", "node", "_a", "_b", "start", "end", "minifyTemplates", "build", "result", "file", "fileIndex", "outputFiles", "src", "matchingMapIndex", "outputFile", "mapFile", "remapped", "writeFiles"]
}
