39 lines
1.0 KiB
JavaScript
39 lines
1.0 KiB
JavaScript
import { promises as fsp } from 'fs';
|
|
|
|
const prefix = 'json:';
|
|
|
|
const reservedKeys = ['public'];
|
|
|
|
export default function jsonPlugin() {
|
|
return {
|
|
name: 'json-plugin',
|
|
async resolveId(id, importer) {
|
|
if (!id.startsWith(prefix)) return;
|
|
const realId = id.slice(prefix.length);
|
|
const resolveResult = await this.resolve(realId, importer);
|
|
|
|
if (!resolveResult) {
|
|
throw Error(`Cannot find ${realId}`);
|
|
}
|
|
// Add an additional .js to the end so it ends up with .js at the end in the _virtual folder.
|
|
return prefix + resolveResult.id;
|
|
},
|
|
async load(id) {
|
|
if (!id.startsWith(prefix)) return;
|
|
const realId = id.slice(prefix.length);
|
|
const source = await fsp.readFile(realId, 'utf8');
|
|
|
|
let code = '';
|
|
for (const [key, value] of Object.entries(JSON.parse(source))) {
|
|
if (reservedKeys.includes(key)) {
|
|
continue;
|
|
}
|
|
code += `
|
|
export const ${key} = ${JSON.stringify(value)};
|
|
`;
|
|
}
|
|
return code;
|
|
},
|
|
};
|
|
}
|