2021-09-27 12:49:36 +00:00
|
|
|
import { dirname, isAbsolute, join, resolve } from 'pathe'
|
2021-08-09 16:18:21 +00:00
|
|
|
import type { Plugin } from 'rollup'
|
2021-07-15 10:18:34 +00:00
|
|
|
|
|
|
|
const PREFIX = '\0virtual:'
|
|
|
|
|
|
|
|
export default function virtual (vfs: Record<string, string>): Plugin {
|
|
|
|
const extensions = ['', '.ts', '.vue', '.mjs', '.cjs', '.js', '.json']
|
|
|
|
const resolveWithExt = (id) => {
|
|
|
|
for (const ext of extensions) {
|
|
|
|
const rId = id + ext
|
|
|
|
if (rId in vfs) {
|
|
|
|
return rId
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
name: 'virtual',
|
|
|
|
|
|
|
|
resolveId (id, importer) {
|
2021-08-09 18:24:52 +00:00
|
|
|
if (process.platform === 'win32' && isAbsolute(id)) {
|
|
|
|
// Add back C: prefix on Windows
|
|
|
|
id = resolve(id)
|
|
|
|
}
|
2021-07-15 10:18:34 +00:00
|
|
|
const resolvedId = resolveWithExt(id)
|
|
|
|
if (resolvedId) { return PREFIX + resolvedId }
|
2021-08-09 18:24:52 +00:00
|
|
|
if (importer && !isAbsolute(id)) {
|
2021-07-15 10:18:34 +00:00
|
|
|
const importerNoPrefix = importer.startsWith(PREFIX) ? importer.slice(PREFIX.length) : importer
|
|
|
|
const importedDir = dirname(importerNoPrefix)
|
|
|
|
const resolved = resolveWithExt(join(importedDir, id))
|
|
|
|
if (resolved) { return PREFIX + resolved }
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
},
|
|
|
|
|
|
|
|
load (id) {
|
|
|
|
if (!id.startsWith(PREFIX)) { return null }
|
|
|
|
const idNoPrefix = id.slice(PREFIX.length)
|
|
|
|
return {
|
|
|
|
code: vfs[idNoPrefix],
|
|
|
|
map: null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|