Spaces:
Paused
Paused
File size: 2,517 Bytes
3c3f089 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
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) {
//match entrypoint
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;
}
});
//match css file
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,
//specify the place where the content was found
resolveDir: new URL("./", request.responseURL).pathname,
};
//store response in cache
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,
//specify the place where the content was found
resolveDir: new URL("./", request.responseURL).pathname,
};
//store response in cache
await fileCache.setItem(args.path, result);
console.log("end of fetching");
return result;
});
},
};
};
|