import { FC, Fragment } from "react";
import type {} from "react-dom/next";
import { mST } from "./session";
import { md5 } from "./md5";
Object.assign(window, {});
const orig = location.origin.includes("localhost") ? "." : location.origin;
let importmapped = false;
export const initShims = async (assets: { [key: string]: string }) => {
if (importmapped) return;
importmapped = true;
await import("es-module-shims");
location.origin.includes("localhost")
? importShim.addImportMap({
"imports": {
"@emotion/react": orig + "/" + assets["emotion.mjs"],
"framer-motion": "./framer-motion",
"react": orig + "/" + assets["react.mjs"],
"react-dom": orig + "/" + assets["react.mjs"],
"react-dom/client": orig + "/" + assets["react.mjs"],
"react-dom/server": orig + "/" + assets["react.mjs"],
"react/jsx-runtime": orig + "/" + assets["react.mjs"],
},
})
: importShim.addImportMap({
"imports": {
// ...imap,
"framer-motion": location.origin + "/" + assets["framer-motion.mjs"],
"@emotion/react": location.origin + "/" + assets["emotion.mjs"],
"react": location.origin + "/" + assets["react.mjs"],
"react-dom": location.origin + "/" + assets["react.mjs"],
"react-dom/client": location.origin + "/" + assets["react.mjs"],
"react-dom/server": location.origin + "/" + assets["react.mjs"],
"react/jsx-runtime": location.origin + "/" + assets["react.mjs"],
// "preact": "https://ga.jspm.io/npm:preact@10.8.2/dist/preact.module.js",
// "preact-render-to-string": "https://ga.jspm.io/npm:preact-render-to-string@5.2.0/dist/index.mjs",
// "preact/compat": "https://ga.jspm.io/npm:preact@10.8.2/compat/dist/compat.module.js",
// "preact/jsx-runtime": "https://ga.jspm.io/npm:preact@10.8.2/jsx-runtime/dist/jsxRuntime.module.js"
},
});
};
let App: FC = () => ;
const apps: { [key: string]: FC } = {};
// {[md5(starter.transpiled)]: await appFactory(starter.transpiled)};
export const AutoUpdateApp: FC<{ hash: number; starter: FC }> = (
{ hash, starter },
) => {
const result = md5(mST().transpiled);
if (!apps[result]) {
apps[result] = starter;
}
App = apps[result];
return ;
};
export async function appFactory(transpiled: string): Promise {
const result = md5(transpiled);
// return lazy(>import(`/live/${codeSpace}/js#${result}`));
// if (globalThis.transpiled === transpiled) return globalThis.App;
// globalThis.transpiled = transpiled;
// hash.update(transpiled);
// const resultU8Arr = await hash.digest();
//new TextDecoder().decode(resultU8Arr);
// if (globalThis.App && globalThis.App === apps[result]) {
// globalThis.setCh && globalThis.setCh(globalThis.App);
// return;
// }
if (!apps[result]) {
apps[result] = (await importShim(createJsBlob(transpiled)))
.default as unknown as FC;
}
App = apps[result];
return apps[result];
}
export function createJsBlob(code: string) {
const file = new File([code], "index.mjs", {
type: "application/javascript",
});
const blobUrl = URL.createObjectURL(file);
return blobUrl;
// const actualUrl = new URL(blobUrl,'//live/');
// return actualUrl;
}