|
"use strict"; |
|
|
|
let path = require("path"); |
|
|
|
let PREFIX = "diskless:"; |
|
|
|
// `referenceDir` is used for relative imports from diskless modules |
|
// `resolver` is the Rollup plugin responsible for resolving relative imports |
|
// `modules` maps file names to source code |
|
module.exports = (referenceDir, resolver, modules = new Map(), prefix = PREFIX) => ({ |
|
name: "diskless", |
|
resolveId(importee, importer) { |
|
if(importer && importer.startsWith(prefix) && /^\.?\.\//.test(importee)) { |
|
let virtual = path.resolve(referenceDir, importer); |
|
return resolver.resolveId(importee, virtual); |
|
} |
|
return isVirtual(importee, prefix, "resolving") ? importee : null; |
|
}, |
|
load(id) { |
|
if(!isVirtual(id, prefix, "loading")) { |
|
return null; |
|
} |
|
|
|
let filename = id.substr(prefix.length); |
|
let source = modules.get(filename); |
|
if(source === undefined) { |
|
throw new Error(`missing diskless module: ${filename}`); |
|
} |
|
return source; |
|
}, |
|
register(filename, source) { |
|
modules.set(filename, source); |
|
}, |
|
deregister(filename) { |
|
return modules.delete(filename); |
|
} |
|
}); |
|
|
|
function isVirtual(moduleID, prefix, message) { |
|
let virtual = moduleID.startsWith(prefix); |
|
console.log(`[DISKLESS] ${message} ${virtual ? "diskless" : "regular"} ` + |
|
`module \`${moduleID}\``); |
|
return virtual; |
|
} |