UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

1 lines • 4.29 kB
{"version":3,"file":"imageDataPlugin.js","names":[],"sources":["esm/vite/plugins/imageDataPlugin.js"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, relative, resolve, sep } from \"node:path\";\nimport { prefixRegex } from \"rolldown/filter\";\nimport { normalizePath } from \"vite\";\nimport { processImageMeta } from \"../../image/getImageData\";\nconst IMAGEDATA_SUFFIX = \"?imagedata\";\nconst VIRTUAL_PREFIX = \"\\0imagedata:\";\nconst IMAGEDATA_SUFFIX_RE = /\\?imagedata$/;\nfunction imageDataPlugin() {\n let publicDir;\n let root;\n function getSrcPath(filePath) {\n return filePath.startsWith(publicDir) ? \"/\" + normalizePath(relative(publicDir, filePath)) : \"/\" + normalizePath(relative(root, filePath));\n }\n function isPathWithinBounds(filePath, allowedDir) {\n const resolved = resolve(filePath);\n const allowed = resolve(allowedDir);\n return resolved.startsWith(allowed + sep) || resolved === allowed;\n }\n function createImageDataExport(src, width = 0, height = 0, blurDataURL = \"\") {\n return `export default ${JSON.stringify({ src, width, height, blurDataURL })}`;\n }\n return {\n name: \"one:imagedata\",\n enforce: \"pre\",\n configResolved(resolvedConfig) {\n publicDir = resolvedConfig.publicDir;\n root = resolvedConfig.root;\n },\n resolveId: {\n filter: { id: IMAGEDATA_SUFFIX_RE },\n async handler(id, importer) {\n const cleanId = id.slice(0, -IMAGEDATA_SUFFIX.length);\n let filePath;\n let allowedDir;\n if (cleanId.startsWith(\"/\")) {\n filePath = resolve(publicDir, cleanId.slice(1));\n allowedDir = publicDir;\n } else if (importer) {\n filePath = resolve(dirname(importer.replace(VIRTUAL_PREFIX, \"\")), cleanId);\n allowedDir = root;\n } else {\n filePath = resolve(root, cleanId);\n allowedDir = root;\n }\n if (!isPathWithinBounds(filePath, allowedDir)) {\n console.warn(`[one] ?imagedata: Path traversal blocked: ${cleanId}`);\n return null;\n }\n if (!existsSync(filePath)) {\n console.warn(`[one] ?imagedata: File not found: ${filePath}`);\n return null;\n }\n return VIRTUAL_PREFIX + filePath;\n }\n },\n load: {\n filter: { id: prefixRegex(VIRTUAL_PREFIX) },\n async handler(id) {\n const filePath = id.slice(VIRTUAL_PREFIX.length);\n const src = getSrcPath(filePath);\n this.addWatchFile(filePath);\n const meta = await processImageMeta(filePath);\n if (!meta) {\n return createImageDataExport(src);\n }\n return createImageDataExport(src, meta.width, meta.height, meta.blurDataURL);\n }\n }\n };\n}\nexport {\n imageDataPlugin\n};\n//# sourceMappingURL=imageDataPlugin.js.map\n"],"mappings":";;;;;;;AAKA,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,SAAS,kBAAkB;CACzB,IAAI;CACJ,IAAI;CACJ,SAAS,WAAW,UAAU;EAC5B,OAAO,SAAS,WAAW,SAAS,IAAI,MAAM,cAAc,SAAS,WAAW,QAAQ,CAAC,IAAI,MAAM,cAAc,SAAS,MAAM,QAAQ,CAAC;CAC3I;CACA,SAAS,mBAAmB,UAAU,YAAY;EAChD,MAAM,WAAW,QAAQ,QAAQ;EACjC,MAAM,UAAU,QAAQ,UAAU;EAClC,OAAO,SAAS,WAAW,UAAU,GAAG,KAAK,aAAa;CAC5D;CACA,SAAS,sBAAsB,KAAK,QAAQ,GAAG,SAAS,GAAG,cAAc,IAAI;EAC3E,OAAO,kBAAkB,KAAK,UAAU;GAAE;GAAK;GAAO;GAAQ;EAAY,CAAC;CAC7E;CACA,OAAO;EACL,MAAM;EACN,SAAS;EACT,eAAe,gBAAgB;GAC7B,YAAY,eAAe;GAC3B,OAAO,eAAe;EACxB;EACA,WAAW;GACT,QAAQ,EAAE,IAAI,oBAAoB;GAClC,MAAM,QAAQ,IAAI,UAAU;IAC1B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,iBAAiB,MAAM;IACpD,IAAI;IACJ,IAAI;IACJ,IAAI,QAAQ,WAAW,GAAG,GAAG;KAC3B,WAAW,QAAQ,WAAW,QAAQ,MAAM,CAAC,CAAC;KAC9C,aAAa;IACf,OAAO,IAAI,UAAU;KACnB,WAAW,QAAQ,QAAQ,SAAS,QAAQ,gBAAgB,EAAE,CAAC,GAAG,OAAO;KACzE,aAAa;IACf,OAAO;KACL,WAAW,QAAQ,MAAM,OAAO;KAChC,aAAa;IACf;IACA,IAAI,CAAC,mBAAmB,UAAU,UAAU,GAAG;KAC7C,QAAQ,KAAK,6CAA6C,SAAS;KACnE,OAAO;IACT;IACA,IAAI,CAAC,WAAW,QAAQ,GAAG;KACzB,QAAQ,KAAK,qCAAqC,UAAU;KAC5D,OAAO;IACT;IACA,OAAO,iBAAiB;GAC1B;EACF;EACA,MAAM;GACJ,QAAQ,EAAE,IAAI,YAAY,cAAc,EAAE;GAC1C,MAAM,QAAQ,IAAI;IAChB,MAAM,WAAW,GAAG,MAAM,eAAe,MAAM;IAC/C,MAAM,MAAM,WAAW,QAAQ;IAC/B,KAAK,aAAa,QAAQ;IAC1B,MAAM,OAAO,MAAM,iBAAiB,QAAQ;IAC5C,IAAI,CAAC,MAAM;KACT,OAAO,sBAAsB,GAAG;IAClC;IACA,OAAO,sBAAsB,KAAK,KAAK,OAAO,KAAK,QAAQ,KAAK,WAAW;GAC7E;EACF;CACF;AACF"}