|
import * as esbuild from "esbuild-wasm"; |
|
import axios from "axios"; |
|
import localForage from "localforage"; |
|
|
|
const fileCache = localForage.createInstance({ |
|
name: "fileCache", |
|
}); |
|
|
|
export const unpkgFetchPlugin = ( |
|
inputCode: string | undefined, |
|
entryPoint: string |
|
): esbuild.Plugin => { |
|
return { |
|
name: "unpkg-fetch-plugin", |
|
setup(build: esbuild.PluginBuild) { |
|
|
|
if (entryPoint === "index.ts") { |
|
build.onLoad({ filter: /(^index\.ts$)/ }, () => { |
|
return { |
|
loader: "tsx", |
|
contents: inputCode, |
|
}; |
|
}); |
|
} else { |
|
build.onLoad({ filter: /(^index\.js$)/ }, () => { |
|
return { |
|
loader: "jsx", |
|
contents: inputCode, |
|
}; |
|
}); |
|
} |
|
|
|
build.onLoad({ filter: /.*/ }, async (args: esbuild.OnLoadArgs) => { |
|
const cacheResult = await fileCache.getItem<esbuild.OnLoadResult>( |
|
args.path |
|
); |
|
if (cacheResult) { |
|
return cacheResult; |
|
} |
|
}); |
|
|
|
|
|
build.onLoad({ filter: /.css$/ }, async (args: esbuild.OnLoadArgs) => { |
|
const { data, request } = await axios.get(args.path); |
|
|
|
const escapedData = data |
|
.replace(/\n/g, "") |
|
.replace(/"/g, '\\"') |
|
.replace(/'/g, "\\'"); |
|
|
|
const contents = `const style = document.createElement("style"); |
|
style.innerText = '${escapedData}'; |
|
document.head.appendChild(style);`; |
|
|
|
const result: esbuild.OnLoadResult = { |
|
loader: "jsx", |
|
contents, |
|
|
|
resolveDir: new URL("./", request.responseURL).pathname, |
|
}; |
|
|
|
await fileCache.setItem(args.path, result); |
|
return result; |
|
}); |
|
|
|
|
|
|
|
build.onLoad({ filter: /.*/ }, async (args: esbuild.OnLoadArgs) => { |
|
console.log(`...fetching ${args.path}`); |
|
const { data, request } = await axios.get(args.path); |
|
|
|
const result: esbuild.OnLoadResult = { |
|
loader: "jsx", |
|
contents: data, |
|
|
|
resolveDir: new URL("./", request.responseURL).pathname, |
|
}; |
|
|
|
await fileCache.setItem(args.path, result); |
|
console.log("end of fetching"); |
|
return result; |
|
}); |
|
}, |
|
}; |
|
}; |
|
|