open-codetree / store /features /compilerSlice.ts
matt HOFFNER
init
3c3f089
import { createSlice } from "@reduxjs/toolkit";
import { RootState } from "../store";
import * as esbuild from "esbuild-wasm";
import { unpkgFetchPlugin, unpkgPathPlugin } from "../../esbuild/plugins";
import { CompilerOutput, CompilerStatus } from "../../_types/compilerTypes";
type InitialStateType = {
isInitializing: boolean;
esbuildStatus: CompilerStatus;
isCompiling: boolean;
output: CompilerOutput;
};
const initialState = {
isInitializing: false,
esbuildStatus: { isReady: false, error: "" },
isCompiling: false,
output: { code: "", error: "" },
};
export const compilerSlice = createSlice({
name: "compiler",
initialState: initialState,
reducers: {
init_esbuild: (state: InitialStateType) => {
state.isInitializing = true;
},
init_esbuild_success: (state: InitialStateType) => {
state.esbuildStatus.isReady = true;
state.esbuildStatus.error = "";
state.isInitializing = false;
},
init_esbuild_failure: (state: InitialStateType, { payload }) => {
state.esbuildStatus.isReady = false;
state.esbuildStatus.error = payload;
state.isInitializing = false;
},
compiled: (state: InitialStateType) => {
state.isCompiling = true;
},
compiled_success: (state: InitialStateType, { payload }) => {
state.output.code = payload;
state.output.error = "";
state.isCompiling = false;
},
compiled_failure: (state: InitialStateType, { payload }) => {
state.output.code = "";
state.output.error = payload;
state.isCompiling = false;
},
},
});
export const {
compiled,
compiled_success,
compiled_failure,
init_esbuild,
init_esbuild_success,
init_esbuild_failure,
} = compilerSlice.actions;
export const compiler_state = (state: RootState) => state.compiler;
export default compilerSlice.reducer;
// Asynchronous thunk action
export function initEsbuild() {
return async (dispatch: any) => {
dispatch(init_esbuild());
await esbuild
.initialize({
worker: true,
wasmURL: "https://unpkg.com/[email protected]/esbuild.wasm",
})
.then(() => {
dispatch(init_esbuild_success());
})
.catch((error) => dispatch(init_esbuild_failure(error.message)));
};
}
export function getCompileCode(rawCode: string, entryPoint: string) {
return async (dispatch: any) => {
dispatch(compiled());
try {
const result = await esbuild.build({
entryPoints: [`${entryPoint}`],
bundle: true,
write: false,
minify: true,
outdir: "/",
plugins: [unpkgPathPlugin(), unpkgFetchPlugin(rawCode, entryPoint)],
metafile: true,
allowOverwrite: true,
});
dispatch(compiled_success(result.outputFiles[0].text));
} catch (error) {
// @ts-ignore
dispatch(compiled_failure(error.message));
}
};
}