This commit is contained in:
Rizky 2024-03-02 16:06:02 +07:00
parent caf5cdd7c3
commit 4122f50d5f
9 changed files with 49 additions and 132 deletions

9
app/srv/api/parse-js.ts Normal file
View File

@ -0,0 +1,9 @@
import { apiContext } from "service-srv";
export const _ = {
url: "/parse-js",
async api() {
const { req, res } = apiContext(this);
return "This is parse-js.ts";
}
}

File diff suppressed because one or more lines are too long

View File

@ -61,7 +61,7 @@ export const code_edit: SAction["code"]["edit"] = async function (
});
}
let adv = mitem.get("adv");
const jscript = parseJs(adv?.get("js")) || false;
const jscript = parseJs(src) || false;
doc?.transact(() => {
if (!adv) {
@ -106,7 +106,10 @@ export const code_edit: SAction["code"]["edit"] = async function (
},
});
}
return jscript
} catch (e: any) {
console.log('e', e)
return e.message.toString();
}
} else {

View File

@ -124,7 +124,8 @@ export const apiProxy = (api_url: string) => {
console.error(`API Not Found: ${actionName.toString()}`);
}
} else {
reject("Failed to load API: " + base_url);
reject("Failed to load API [Proxy]: " + base_url);
}
} catch (e) {
reject(e);

View File

@ -9,14 +9,13 @@ import { jscript } from "../../../../../utils/script/jscript";
import { jsMount } from "../../../../../utils/script/mount";
import { monacoTypings } from "../../../../../utils/script/typings";
import { Loading } from "../../../../../utils/ui/loading";
import { getActiveMeta, getMetaById } from "../../../logic/active/get-meta";
import { getActiveMeta } from "../../../logic/active/get-meta";
import { EDGlobal, IMeta, active } from "../../../logic/ed-global";
import { edMonacoDefaultVal } from "./default-val";
import { declareScope } from "./scope/scope";
// @ts-ignore
import { FNCompDef } from "../../../../../utils/types/meta-fn";
import { addScope } from "./scope/add-scope";
const scriptEdit = {
timeout: null as any,
@ -100,6 +99,7 @@ export const EdScriptMonaco: FC<{}> = () => {
if (p.ui.popup.script.mode === "js") {
const w = window as any;
const types: any = {};
const values: any = {};
for (const prop_name of p.global_prop) {
if (prop_name === "_types") continue;
types[prop_name] = "any";
@ -139,38 +139,6 @@ export const EdScriptMonaco: FC<{}> = () => {
break;
case "prop-instance":
{
let parent_meta = null;
const parent_id = meta.parent?.id;
if (parent_id) {
if (active.comp_id) {
parent_meta =
p.comp.list[active.comp_id].meta[parent_id];
} else {
parent_meta = p.page.meta[parent_id];
}
}
if (parent_meta) {
const scope = declareScope(p, parent_meta, monaco);
for (const [k, v] of Object.entries(scope.exports)) {
addScope(p, monaco, `file:///${k}`, v);
}
addScope(
p,
monaco,
`file:///prop-global.d.ts`,
`\
${Object.entries(scope.vars).map(([var_name, var_from]) => {
return `import {${var_name} as ___${var_name}} from "./${var_from}"`;
})}
declare global {
${Object.entries(scope.vars).map(([var_name]) => {
return `const ${var_name} = ___${var_name}`;
})}
}
`
);
}
const nmodel = monaco.editor.createModel(
val,
"typescript",
@ -204,38 +172,15 @@ declare global {
break;
case "item":
{
const { exports, imports } = declareScope(p, meta, monaco);
const im = imports[active.item_id];
const im_src = [];
types._raw = declareScope(p, meta, monaco);
if (im) {
for (const [var_name, item] of Object.entries(im)) {
im_src.push(
`import { ${var_name} } from "./${item.id}_${var_name}_${item.type}";`
);
}
}
for (const [k, v] of Object.entries(exports)) {
addScope(p, monaco, `file:///${k}`, v);
}
let active_src =
im_src.length > 0
? `${im_src.join("\n")}\n${IMPORT_SEPARATOR}\n${val}`
: val;
const model = monaco.editor.createModel(
active_src,
val,
"typescript",
monaco.Uri.parse("file:///active.tsx")
);
editor.setModel(model);
editor.trigger("fold", "editor.foldAllMarkerRegions", {});
if (active_src) {
const end_hide = active_src
.split(IMPORT_SEPARATOR)[0]
.split("\n").length;
const range = new monaco.Range(1, 1, end_hide, 1);
(editor as any).setHiddenAreas([range]);
}
if (component.id && meta.jsx_prop?.name) {
const prop_name = meta.jsx_prop.name;
@ -271,7 +216,7 @@ declare global {
monaco,
{
types,
values: {},
values,
}
);
await jsMount(editor, monaco, p);

View File

@ -1,13 +1,11 @@
import type { OnMount } from "@monaco-editor/react";
import { IContent } from "../../../../../../utils/types/general";
import { IMeta, PG, active } from "../../../../logic/ed-global";
import { extractExport } from "./extract-export";
type Monaco = Parameters<OnMount>[1];
export type MonacoEditor = Parameters<OnMount>[0];
export const declareScope = (p: PG, meta: IMeta, monaco: Monaco) => {
const vars: Record<string, string> = {};
const metas = active.comp_id
? p.comp.list[active.comp_id]?.meta
: p.page.meta;
@ -18,19 +16,6 @@ export const declareScope = (p: PG, meta: IMeta, monaco: Monaco) => {
const paths: IMeta[][] = [];
map_childs(monaco, p, metas, entry, paths);
const exports = {} as Record<string, string>;
const extract_exports = {} as Record<
string,
ReturnType<typeof extractExport>
>;
const imports = {} as Record<
string,
Record<
string,
{ id: string; type: "prop" | "passprop" | "local" | "scope" }
>
>;
const cur_path = [] as IMeta[];
for (const path of paths) {
if (path.includes(meta)) {
@ -46,57 +31,29 @@ export const declareScope = (p: PG, meta: IMeta, monaco: Monaco) => {
}
}
let prev_m = null as null | IMeta;
const vars: Record<string, { mode: "local"; val: string }> = {};
for (const m of cur_path) {
if (!exports[m.item.id]) {
extract_exports[m.item.id] = extractExport(p, m);
for (const [k, v] of Object.entries(extract_exports[m.item.id])) {
let src = "";
if (v.type !== "local") {
src = `export const ${k} = ${v.val};`;
} else {
src = `\
const ${k}__local = ${v.val};
export const ${k}: typeof ${k}__local & { render: ()=>void } = ${k}__local as any;`;
if (m !== meta) {
const script = m.item.script;
if (script) {
if (script.local) {
vars[script.local.name] = { mode: "local", val: script.local.value };
}
if (src) {
vars[k] = `${m.item.id}_${k}_${v.type}`;
}
exports[`${m.item.id}_${k}_${v.type}.tsx`] = src;
}
}
if (
m.item.id === active.item_id &&
m.item.component?.id === active.comp_id &&
active.comp_id
) {
for (const [k, v] of Object.entries(extract_exports[m.item.id])) {
if (!imports[m.item.id]) imports[m.item.id] = {};
if (v.type === "prop") {
imports[m.item.id][k] = v;
}
}
}
if (prev_m && extract_exports[prev_m.item.id]) {
imports[m.item.id] = {};
if (imports[prev_m.item.id]) {
for (const [k, v] of Object.entries(imports[prev_m.item.id])) {
imports[m.item.id][k] = v;
const raw_types: string[] = [];
for (const [k, v] of Object.entries(vars)) {
if (v.mode === "local") {
raw_types.push(`\
const \$\$_${k} = ${v.val};
const ${k} = null as unknown as (typeof \$\$_${k} & { render: ()=> void });
`);
}
}
for (const [k, v] of Object.entries(extract_exports[prev_m.item.id])) {
imports[m.item.id][k] = { id: v.id, type: v.type };
}
}
prev_m = m;
}
return { exports, imports, vars };
return raw_types.join("\n");
};
const map_childs = (

View File

@ -51,7 +51,7 @@ export const EdScriptWorkbench = () => {
)}
>
<div className={cx("flex items-stretch")}>
<div className="border-r px-2 flex items-center">
{/* <div className="border-r px-2 flex items-center">
<div
className={cx(
scriptNav.canBack
@ -102,7 +102,7 @@ export const EdScriptWorkbench = () => {
>
<ChevronRight />
</div>
</div>
</div> */}
{p.ui.popup.script.type === "prop-master" && <CompTitleMaster />}
{p.ui.popup.script.type === "prop-instance" && (
<CompTitleInstance />

View File

@ -50,7 +50,7 @@ export const viLoadLegacy = async (vi: {
try {
await loadApiProxyDef(api_url, true);
} catch (e) {
console.warn("Failed to load API:", api_url);
console.warn("Failed to load API [Legacy]:", api_url);
}
}
} catch (e) {}

View File

@ -44,8 +44,10 @@ export const viLoadSnapshot = async (p: PG) => {
if (!p.script.db) p.script.db = dbProxy(api_url);
if (!p.script.api) p.script.api = apiProxy(api_url);
}
} catch (e) {
console.warn("Failed to load API:", api_url);
} catch (e: any) {
if (e && !e.message.toLowerCase().includes("invalid url")) {
console.warn("Failed to load API [Snapshot]:", api_url);
}
}
if (p.site.code.snapshot) {