From d6d62c7df005c42369497b6a91966ba24862e558 Mon Sep 17 00:00:00 2001 From: Rizky Date: Mon, 29 Apr 2024 20:42:30 +0700 Subject: [PATCH] wip fix code --- app/srv/api/nova-load.ts | 2 +- app/srv/api/prod-zip.ts | 2 +- app/srv/api/prod.ts | 4 +- app/srv/core/main.js | 4 + app/srv/ws/sync/actions.ts | 2 +- app/srv/ws/sync/actions/code_action.ts | 70 +-- app/srv/ws/sync/actions/code_load.ts | 3 - app/srv/ws/sync/actions/site_load.ts | 7 +- app/srv/ws/sync/code/code.ts | 37 ++ app/srv/ws/sync/code/parts/init/frontend.ts | 10 + app/srv/ws/sync/code/parts/init/server.ts | 88 +++ app/srv/ws/sync/code/parts/init/typings.ts | 5 + app/srv/ws/sync/code/parts/internal.ts | 25 + app/srv/ws/sync/code/templates/index_tsx | 2 + app/srv/ws/sync/code/templates/server_ts | 7 + app/srv/ws/sync/code/templates/tsconfig_json | 26 + .../sync/code/templates/typings/global_d_ts | 68 +++ app/srv/ws/sync/code/utlis/ensure-lib.ts | 15 + app/srv/ws/sync/code/utlis/ensure.ts | 14 + app/srv/ws/sync/editor/code/build-code.ts | 508 ++++++++---------- app/srv/ws/sync/editor/code/prep-code.ts | 19 - app/srv/ws/sync/editor/code/server-main.ts | 16 +- app/srv/ws/sync/editor/code/util-code.ts | 9 +- app/web/src/nova/ed/logic/ed-global.ts | 2 +- app/web/src/nova/vi/load/load-snapshot.tsx | 4 +- app/web/src/nova/vi/render/script/local.tsx | 4 +- bun.lockb | Bin 292672 -> 292608 bytes package.json | 5 +- pkgs/core/package.json | 1 - 29 files changed, 596 insertions(+), 363 deletions(-) create mode 100644 app/srv/ws/sync/code/code.ts create mode 100644 app/srv/ws/sync/code/parts/init/frontend.ts create mode 100644 app/srv/ws/sync/code/parts/init/server.ts create mode 100644 app/srv/ws/sync/code/parts/init/typings.ts create mode 100644 app/srv/ws/sync/code/parts/internal.ts create mode 100644 app/srv/ws/sync/code/templates/index_tsx create mode 100644 app/srv/ws/sync/code/templates/server_ts create mode 100644 app/srv/ws/sync/code/templates/tsconfig_json create mode 100644 app/srv/ws/sync/code/templates/typings/global_d_ts create mode 100644 app/srv/ws/sync/code/utlis/ensure-lib.ts create mode 100644 app/srv/ws/sync/code/utlis/ensure.ts delete mode 100644 app/srv/ws/sync/editor/code/prep-code.ts diff --git a/app/srv/api/nova-load.ts b/app/srv/api/nova-load.ts index d56ae88b..1ce9d7b8 100644 --- a/app/srv/api/nova-load.ts +++ b/app/srv/api/nova-load.ts @@ -1,5 +1,5 @@ import { apiContext } from "../../../pkgs/core/server/api/api-ctx"; -import { code } from "../ws/sync/editor/code/util-code"; +import { code } from "../ws/sync/code/code"; export const _ = { url: "/nova-load/:mode/:id_site/**", diff --git a/app/srv/api/prod-zip.ts b/app/srv/api/prod-zip.ts index d32b7740..0c2b0aa7 100644 --- a/app/srv/api/prod-zip.ts +++ b/app/srv/api/prod-zip.ts @@ -1,11 +1,11 @@ import { apiContext } from "service-srv"; -import { code } from "../ws/sync/editor/code/util-code"; import fs from "fs"; import path from "path"; import { gzipAsync } from "../ws/sync/entity/zlib"; import { validate } from "uuid"; import { dir } from "dir"; import { existsAsync, readAsync } from "fs-jetpack"; +import { code } from "../ws/sync/code/code"; export const _ = { url: "/prod-zip/:site_id", diff --git a/app/srv/api/prod.ts b/app/srv/api/prod.ts index a896896f..2a6d4604 100644 --- a/app/srv/api/prod.ts +++ b/app/srv/api/prod.ts @@ -2,8 +2,8 @@ import { dir } from "dir"; import { apiContext } from "service-srv"; import { validate } from "uuid"; import { prodIndex } from "../util/prod-index"; -import { code } from "../ws/sync/editor/code/util-code"; import { gzipAsync } from "../ws/sync/entity/zlib"; +import { code } from "../ws/sync/code/code"; export const _ = { url: "/prod/:site_id/**", @@ -20,6 +20,8 @@ export const _ = { if (!validate(site_id)) return new Response("site not found", { status: 403 }); + code; + if (pathname.startsWith("_prasi")) { const action = pathname.split("/")[1]; diff --git a/app/srv/core/main.js b/app/srv/core/main.js index b8e05bab..e6b154be 100644 --- a/app/srv/core/main.js +++ b/app/srv/core/main.js @@ -95,7 +95,11 @@ Error generating stack: `+o.message+` ${uy(e,t.mode)} ${Kg(e,t.mode)} ${dy(e,t.mode)} +<<<<<<< HEAD `,(t?.hover||t?.active)&&fy({item:e,hover:t?.hover,active:t?.active}),Gg(e,t.mode)])}catch(n){console.log(n)}return cx([])};var hy=A(Z()),Eo=(e,t,n,r,i)=>{let o=t.item,l;o.component?.style&&(l={style:o.component.style,className:Ef(o.component.style,{mode:e.mode})});let s={className:Ef(o,{mode:e.mode}),inherit:l},c={},a=t.item.childs,u;return t.item.type==="text"?(u=null,s.dangerouslySetInnerHTML={__html:t.item.html||""}):u=Array.isArray(a)&&a?.map(d=>{if(!d)return null;let{id:f}=d,p=n?e.layout?.meta[f]:e.meta[f];return p?(0,hy.jsx)(qt,{meta:p,is_layout:n,passprop:{...r},depth:i+1},f):null}),s.children=u,t.item.adv?.html?(delete s.children,s.dangerouslySetInnerHTML={__html:t.item.adv?.html}):t.item.adv?.js&&!t.item.adv.js.includes("children")&&(delete s.children,delete s.dangerouslySetInnerHTML),{props:s,text_props:c}};var My=A(ge());var Ay=A(Rf());var Jr={NORMAL:0,WILDCARD:1,PLACEHOLDER:2};function Us(e={}){let t={options:e,rootNode:by(),staticRoutesMap:{}},n=r=>e.strictTrailingSlash?r:r.replace(/\/$/,"")||"/";if(e.routes)for(let r in e.routes)Ey(t,n(r),e.routes[r]);return{ctx:t,lookup:r=>i2(t,n(r)),insert:(r,i)=>Ey(t,n(r),i),remove:r=>o2(t,n(r))}}function i2(e,t){let n=e.staticRoutesMap[t];if(n)return n.data;let r=t.split("/"),i={},o=!1,l=null,s=e.rootNode,c=null;for(let a=0;a{},db:null,api:null,init_local_effect:{}},page:{history:{id:"",show:!1},root_id:"root",cur:a2,doc:null,list:{},building:!1,meta:{},entry:[],tree:[],render:()=>{}},comp:{doc:null,item:null,loaded:{},list:{},group:{}},code:{},global_prop:[],ui:{comp_editable:localStorage.getItem("prasi-comp-editable")==="yes",zoom:localStorage.zoom||"100%",side:{prop:!0},layout:{left:parseInt(localStorage.getItem("prasi-layout-left")||"250"),right:parseInt(localStorage.getItem("prasi-layout-right")||"250")},prevent_indent_hook:!1,syncing:!1,tree:{item_loading:[],search:"",search_ref:null,search_mode:{Name:!0,JS:!1,HTML:!1,CSS:!1},rename_id:"",open:{}},popup:{file:{enabled:!1,open:!1,picker:{value:"",on_pick:!1,multi:!1},path:"/",expanded:JSON.parse(localStorage.getItem("panel-file-expanded")||"{}"),entry:{},selected:new Set,action:null,file_renaming:"",file_ctx_menu_event:null,tree:[],tree_renaming:"",tree_ctx_path:"",tree_ctx_menu_event:null,preview:!0,upload:{started:!1,progress:{}}},code:{init:!1,open:!1,name:"site",log:"",loading:!1,startup_status:"init",error:!1,show_log:!1,list:{}},page:{open:null,form:null},script:{open:!1,mode:"js",lastMode:"js",type:"item",prop_kind:"",prop_name:"",on_close:()=>{},typings:{status:"ok",err_msg:""},wb_render:()=>{}},site:null,site_form:null,comp:{preview_id:"",open:null,import:!1},comp_group:null,api:{open:!1}}}};var Bs=e=>({isMobile:e.mode==="mobile",isDesktop:e.mode==="desktop",isEditor:location.pathname.startsWith("/ed/")});var ur=A(ge());var at=window;var u2=pf("prasi-cache","prasi-cache-store"),Co={timeout:null,store:u2},$s=(e,t)=>{let n=[...Ry(t,"navigate(",")"),...Ry(t,"href = ",";")],r=e.page.cur.id;e.page.navs[r]||(e.page.navs[r]=new Set);for(let i of n)e.page.navs[r].add(i);clearTimeout(Co.timeout),Co.timeout=setTimeout(()=>{e.on_nav_loaded&&e.on_nav_loaded({urls:Array.from(e.page.navs[r])})},100)},Ry=(e,t,n)=>{let r=0,i=0,o=[];for(;;){let l=e.indexOf(t,r);if(i=r,l>=0){let s=e[l+t.length];if(s==='"'||s==="'"||s==="`"){let c=e.indexOf(`${s}${n}`,l+t.length+1),a=e.substring(l+t.length+1,c);r=c+2+n.length,o.push(a)}}if(i===r)break}return o};var ar=A(ge());var Ty=A(Sf()),sr=A(ge());var Cf=A(Z()),Ny=(e,t,n,r)=>i=>{let[o,l]=(0,sr.useState)({}),s=i.internal_key;n.item.script||(n.item.script={});let c=n.item.script;s&&(n.item.script_keyed||(n.item.script_keyed={}),n.item.script_keyed[s]||(n.item.script_keyed[s]={}),c=n.item.script_keyed[s]),c.passprop||(c.passprop={});let a={};if(c.passprop){let f=!1;for(let[p,g]of Object.entries(i))["children","key"].includes(p)||(f=!0,a[p]=g,c.passprop[p]={end:0,start:0,value:g})}let u={...r,...a};if(!Array.isArray(i.children)&&(0,sr.isValidElement)(i.children)&&typeof i.children=="object"){let f=(0,Ty.default)(i.children,"props.meta.item.component.props.child.content.childs");if(Array.isArray(f)){let p=!0;for(let g of f)!(0,sr.isValidElement)(g)&&typeof g=="object"||(p=!1);if(p)return f.map(g=>{let _=e.meta[g.id];if(_||(e.meta[g.id]={item:g},_=e.meta[g.id]),_){if(Object.keys(_.item).length<=3&&_.mitem){let x={..._.item},h=_.mitem.toJSON();_.item={...h,...x}}return(0,Cf.jsx)(qt,{is_layout:t,meta:_,passprop:u,parent_key:i.internal_key},g.id)}return null})}}if(!Array.isArray(i.children)&&!(0,sr.isValidElement)(i.children)&&typeof i.children=="object"){let f=i.children.id;if(f){let p=e.meta[f];if(!p){e.meta[f]={item:i.children},p=e.meta[f];let g=p.item.component?.id;g&&e.comp.load(g).then(_=>{if(_){for(let[h,m]of Object.entries(_)){let y=p.item;y[h]||(y[h]=m)}let x=p.item.component?.props;for(let[h,m]of Object.entries(_.component?.props||{}))x[h]||(x[h]=m);l({})}})}return(0,Cf.jsx)(qt,{is_layout:t,meta:p,passprop:u,parent_key:i.internal_key})}}return Tf(i,u,s?{parent_key:s}:void 0)},Tf=(e,t,n)=>{let r={};if(Array.isArray(e)?r.children=e:r=e,Array.isArray(r.children)){let i=[];for(let o of r.children)i.push(Cy(o,r,t,n));return i}return Cy(r.children,r,t,n)},Cy=(e,t,n,r)=>{if((0,sr.isValidElement)(e)){let i={...t};return delete i.children,{...e,props:{...e.props,...r,passprop:{...n,...i}}}}return e};var ti={},Iy=(e,t,n)=>r=>{let i=["localhost","prasi.avolut.com"].includes(location.hostname)&&location.pathname.startsWith("/ed/"),o=n.item.id,{children:l,parent_key:s}=r,c=e.script?.init_local_effect,a=t?e.layout?.meta:e.meta,u=(0,ar.useRef)(ti[o]?ti[o]:r.value),[d,f]=(0,ar.useState)({}),p=u.current;return p.render=()=>{window.prasiContext?.render?window.prasiContext?.render():f({})},Hs(e,n,n.script?.scope,s),r.hook&&r.hook(p),(0,ar.useEffect)(()=>{if(n.parent?.instance_id&&a){let _=a[n.parent?.instance_id];if(_&&_.instances){for(let[x,h]of Object.entries(_.instances[n.parent.instance_id]))if(h===n.item.id){o=x;break}}}return!c[o]&&(typeof c=="object"&&(c[o]=!0),(async()=>r.effect&&(await r.effect(p),i&&(ti[o]=p)))()),()=>{}},[...r.deps||[],location.pathname]),(0,ar.useEffect)(()=>{i&&ti[o]===null&&(async()=>r.effect&&(await r.effect(p),i&&(ti[o]=p)))()},[ti[o]]),Tf(l,{...n.script?.scope,[r.name]:p})};var Nf=A(Z()),Oy=(e,t,n,r,i,o)=>{let l=Eo(e,t,n,r,i);e.visit&&e.visit(t,l),t.script?t.script.scope=r:t.script={scope:r,result:null,Local:Iy(e,n,t),PassProp:Ny(e,n,t,r)};let s=t.script,c=window.exports,a={useEffect:ur.useEffect,children:l.props.children,props:l.props,Local:s?.Local,db:e.site.db,api:e.site.api,PassProp:s?.PassProp,ErrorBox:Nt,newElement:()=>{},render:f=>{let p=f;if((0,ur.isValidElement)(f)&&f.props.children){let g=x=>{let h=!1,m=[];if((0,ur.isValidElement)(x)){if(x.type===t.script?.PassProp)return{should_replace:!0,el:{...x,props:{...x.props,internal_key:x.key}}};if(Array.isArray(x.props?.children))for(let y of x.props?.children)if(Array.isArray(y)){let v=[],S=!1;for(let R of y){let k=g(R);k.should_replace?(v.push(k.el),S=!0):v.push(R)}S?(h=!0,m.push(v)):m.push(y)}else typeof y=="object"?y.type===t.script?.PassProp&&(h=!0,m.push({...y,props:{...y.props,internal_key:y.props.key}})):m.push(y)}return{should_replace:h,el:{...x,props:{...x.props,children:m}}}},_=g(f);_.should_replace&&(p=_.el)}s&&(s.result=(0,Nf.jsx)(ur.Suspense,{children:p}))},params,...Bs(e),...c,...r,_meta:e.meta,_item:t.item,_syncm:typeof syncronize<"u"?syncronize:void 0};if(typeof r=="object"){for(let[f,p]of Object.entries(r))if(typeof p=="object"&&p&&p._jsx){let g=p;a[f]=(0,Nf.jsx)(c2,{fn:g.fn,passprop:{...r},meta:t})}}!at.isEditor&&t.item.adv?.js&&$s(e,t.item.adv.js);let u=t.item.adv?.jsBuilt||"",d=Of(u,If)||"";try{new Function(...Object.keys(a),"___js",`// ${t.item.name}: ${t.item.id} +======= + `,(t?.hover||t?.active)&&fy({item:e,hover:t?.hover,active:t?.active}),Gg(e,t.mode)])}catch(n){console.log(n)}return cx([])};var hy=A(Z()),Eo=(e,t,n,r,i)=>{let o=t.item,l;o.component?.style&&(l={style:o.component.style,className:Ef(o.component.style,{mode:e.mode})});let s={className:Ef(o,{mode:e.mode}),inherit:l},c={},a=t.item.childs,u;return t.item.type==="text"?(u=null,s.dangerouslySetInnerHTML={__html:t.item.html||""}):u=Array.isArray(a)&&a?.map(d=>{if(!d)return null;let{id:f}=d,p=n?e.layout?.meta[f]:e.meta[f];return p?(0,hy.jsx)(qt,{meta:p,is_layout:n,passprop:{...r},depth:i+1},f):null}),s.children=u,t.item.adv?.html?(delete s.children,s.dangerouslySetInnerHTML={__html:t.item.adv?.html}):t.item.adv?.js&&!t.item.adv.js.includes("children")&&(delete s.children,delete s.dangerouslySetInnerHTML),{props:s,text_props:c}};var My=A(ge());var Ay=A(Rf());var Jr={NORMAL:0,WILDCARD:1,PLACEHOLDER:2};function Us(e={}){let t={options:e,rootNode:by(),staticRoutesMap:{}},n=r=>e.strictTrailingSlash?r:r.replace(/\/$/,"")||"/";if(e.routes)for(let r in e.routes)Ey(t,n(r),e.routes[r]);return{ctx:t,lookup:r=>i2(t,n(r)),insert:(r,i)=>Ey(t,n(r),i),remove:r=>o2(t,n(r))}}function i2(e,t){let n=e.staticRoutesMap[t];if(n)return n.data;let r=t.split("/"),i={},o=!1,l=null,s=e.rootNode,c=null;for(let a=0;a{},db:null,api:null,init_local_effect:{}},page:{history:{id:"",show:!1},root_id:"root",cur:a2,doc:null,list:{},building:!1,meta:{},entry:[],tree:[],render:()=>{}},comp:{doc:null,item:null,loaded:{},list:{},group:{}},code:{},global_prop:[],ui:{comp_editable:localStorage.getItem("prasi-comp-editable")==="yes",zoom:localStorage.zoom||"100%",side:{prop:!0},layout:{left:parseInt(localStorage.getItem("prasi-layout-left")||"250"),right:parseInt(localStorage.getItem("prasi-layout-right")||"250")},prevent_indent_hook:!1,syncing:!1,tree:{item_loading:[],search:"",search_ref:null,search_mode:{Name:!0,JS:!1,HTML:!1,CSS:!1},rename_id:"",open:{}},popup:{file:{enabled:!1,open:!1,picker:{value:"",on_pick:!1,multi:!1},path:"/",expanded:JSON.parse(localStorage.getItem("panel-file-expanded")||"{}"),entry:{},selected:new Set,action:null,file_renaming:"",file_ctx_menu_event:null,tree:[],tree_renaming:"",tree_ctx_path:"",tree_ctx_menu_event:null,preview:!0,upload:{started:!1,progress:{}}},code:{init:!1,open:!1,name:"site",log:"",loading:!1,startup_status:"init",error:!1,show_log:!1,list:{}},page:{open:null,form:null},script:{open:!1,mode:"js",lastMode:"js",type:"item",prop_kind:"",prop_name:"",on_close:()=>{},typings:{status:"ok",err_msg:""},wb_render:()=>{}},site:null,site_form:null,comp:{preview_id:"",open:null,import:!1},comp_group:null,api:{open:!1}}}};var Bs=e=>({isMobile:e.mode==="mobile",isDesktop:e.mode==="desktop",isEditor:location.pathname.startsWith("/ed/")});var ur=A(ge());var at=window;var u2=pf("prasi-cache","prasi-cache-store"),Co={timeout:null,store:u2},$s=(e,t)=>{let n=[...Ry(t,"navigate(",")"),...Ry(t,"href = ",";")],r=e.page.cur.id;e.page.navs[r]||(e.page.navs[r]=new Set);for(let i of n)e.page.navs[r].add(i);clearTimeout(Co.timeout),Co.timeout=setTimeout(()=>{e.on_nav_loaded&&e.on_nav_loaded({urls:Array.from(e.page.navs[r])})},100)},Ry=(e,t,n)=>{let r=0,i=0,o=[];for(;;){let l=e.indexOf(t,r);if(i=r,l>=0){let s=e[l+t.length];if(s==='"'||s==="'"||s==="`"){let c=e.indexOf(`${s}${n}`,l+t.length+1),a=e.substring(l+t.length+1,c);r=c+2+n.length,o.push(a)}}if(i===r)break}return o};var ar=A(ge());var Ty=A(Sf()),sr=A(ge());var Cf=A(Z()),Ny=(e,t,n,r)=>i=>{let[o,l]=(0,sr.useState)({}),s=i.internal_key;n.item.script||(n.item.script={});let c=n.item.script;s&&(n.item.script_keyed||(n.item.script_keyed={}),n.item.script_keyed[s]||(n.item.script_keyed[s]={}),c=n.item.script_keyed[s]),c.passprop||(c.passprop={});let a={};if(c.passprop){let f=!1;for(let[p,g]of Object.entries(i))["children","key"].includes(p)||(f=!0,a[p]=g,c.passprop[p]={end:0,start:0,value:g})}let u={...r,...a};if(!Array.isArray(i.children)&&(0,sr.isValidElement)(i.children)&&typeof i.children=="object"){let f=(0,Ty.default)(i.children,"props.meta.item.component.props.child.content.childs");if(Array.isArray(f)){let p=!0;for(let g of f)!(0,sr.isValidElement)(g)&&typeof g=="object"||(p=!1);if(p)return f.map(g=>{let _=e.meta[g.id];if(_||(e.meta[g.id]={item:g},_=e.meta[g.id]),_){if(Object.keys(_.item).length<=3&&_.mitem){let x={..._.item},h=_.mitem.toJSON();_.item={...h,...x}}return(0,Cf.jsx)(qt,{is_layout:t,meta:_,passprop:u,parent_key:i.internal_key},g.id)}return null})}}if(!Array.isArray(i.children)&&!(0,sr.isValidElement)(i.children)&&typeof i.children=="object"){let f=i.children.id;if(f){let p=e.meta[f];if(!p){e.meta[f]={item:i.children},p=e.meta[f];let g=p.item.component?.id;g&&e.comp.load(g).then(_=>{if(_){for(let[h,m]of Object.entries(_)){let y=p.item;y[h]||(y[h]=m)}let x=p.item.component?.props;for(let[h,m]of Object.entries(_.component?.props||{}))x[h]||(x[h]=m);l({})}})}return(0,Cf.jsx)(qt,{is_layout:t,meta:p,passprop:u,parent_key:i.internal_key})}}return Tf(i,u,s?{parent_key:s}:void 0)},Tf=(e,t,n)=>{let r={};if(Array.isArray(e)?r.children=e:r=e,Array.isArray(r.children)){let i=[];for(let o of r.children)i.push(Cy(o,r,t,n));return i}return Cy(r.children,r,t,n)},Cy=(e,t,n,r)=>{if((0,sr.isValidElement)(e)){let i={...t};return delete i.children,{...e,props:{...e.props,...r,passprop:{...n,...i}}}}return e};var ti={},Iy=(e,t,n)=>r=>{let i=["localhost","prasi.avolut.com"].includes(location.hostname)&&location.pathname.startsWith("/ed/"),o=n.item.id,{children:l,parent_key:s}=r,c=e.script?.init_local_effect,a=t?e.layout?.meta:e.meta,u=(0,ar.useRef)(ti[o]?ti[o]:r.value),[d,f]=(0,ar.useState)({}),p=u.current;return p.render=()=>{window.prasiContext.render?window.prasiContext.render():f({})},Hs(e,n,n.script?.scope,s),r.hook&&r.hook(p),(0,ar.useEffect)(()=>{if(n.parent?.instance_id&&a){let _=a[n.parent?.instance_id];if(_&&_.instances){for(let[x,h]of Object.entries(_.instances[n.parent.instance_id]))if(h===n.item.id){o=x;break}}}return!c[o]&&(typeof c=="object"&&(c[o]=!0),(async()=>r.effect&&(await r.effect(p),i&&(ti[o]=p)))()),()=>{}},[...r.deps||[],location.pathname]),(0,ar.useEffect)(()=>{i&&ti[o]===null&&(async()=>r.effect&&(await r.effect(p),i&&(ti[o]=p)))()},[ti[o]]),Tf(l,{...n.script?.scope,[r.name]:p})};var Nf=A(Z()),Oy=(e,t,n,r,i,o)=>{let l=Eo(e,t,n,r,i);e.visit&&e.visit(t,l),t.script?t.script.scope=r:t.script={scope:r,result:null,Local:Iy(e,n,t),PassProp:Ny(e,n,t,r)};let s=t.script,c=window.exports,a={useEffect:ur.useEffect,children:l.props.children,props:l.props,Local:s?.Local,db:e.site.db,api:e.site.api,PassProp:s?.PassProp,ErrorBox:Nt,newElement:()=>{},render:f=>{let p=f;if((0,ur.isValidElement)(f)&&f.props.children){let g=x=>{let h=!1,m=[];if((0,ur.isValidElement)(x)){if(x.type===t.script?.PassProp)return{should_replace:!0,el:{...x,props:{...x.props,internal_key:x.key}}};if(Array.isArray(x.props?.children))for(let y of x.props?.children)if(Array.isArray(y)){let v=[],S=!1;for(let R of y){let k=g(R);k.should_replace?(v.push(k.el),S=!0):v.push(R)}S?(h=!0,m.push(v)):m.push(y)}else typeof y=="object"?y.type===t.script?.PassProp&&(h=!0,m.push({...y,props:{...y.props,internal_key:y.props.key}})):m.push(y)}return{should_replace:h,el:{...x,props:{...x.props,children:m}}}},_=g(f);_.should_replace&&(p=_.el)}s&&(s.result=(0,Nf.jsx)(ur.Suspense,{children:p}))},params,...Bs(e),...c,...r,_meta:e.meta,_item:t.item,_syncm:typeof syncronize<"u"?syncronize:void 0};if(typeof r=="object"){for(let[f,p]of Object.entries(r))if(typeof p=="object"&&p&&p._jsx){let g=p;a[f]=(0,Nf.jsx)(c2,{fn:g.fn,passprop:{...r},meta:t})}}!at.isEditor&&t.item.adv?.js&&$s(e,t.item.adv.js);let u=t.item.adv?.jsBuilt||"",d=Of(u,If)||"";try{new Function(...Object.keys(a),"___js",`// ${t.item.name}: ${t.item.id} +>>>>>>> 4c06cb6b (wip fix code) try { ${d} } catch(e) { diff --git a/app/srv/ws/sync/actions.ts b/app/srv/ws/sync/actions.ts index edfba7c6..65345877 100644 --- a/app/srv/ws/sync/actions.ts +++ b/app/srv/ws/sync/actions.ts @@ -119,7 +119,7 @@ export const SyncActions = { | { type: "startup-check" } | { type: "startup-run" } | { type: "startup-stop" } - | { type: "push-typings"; body: Uint8Array; hash: number } + // | { type: "push-typings"; body: Uint8Array; hash: number } | { type: "check-typings"; hash: number } )) | { type: "flush-page-cache"; page_id: string } diff --git a/app/srv/ws/sync/actions/code_action.ts b/app/srv/ws/sync/actions/code_action.ts index 9fa49173..1760c13e 100644 --- a/app/srv/ws/sync/actions/code_action.ts +++ b/app/srv/ws/sync/actions/code_action.ts @@ -1,7 +1,6 @@ import { Subprocess, spawn } from "bun"; import { waitUntil } from "web-utils"; import { SAction } from "../actions"; -import { code, codeGlobalTypings } from "../editor/code/util-code"; import { docs } from "../entity/docs"; import { snapshot } from "../entity/snapshot"; import { SyncConnection } from "../type"; @@ -9,6 +8,7 @@ import { dirAsync } from "fs-jetpack"; import path from "path"; import { gunzipAsync } from "../entity/zlib"; import { prismaExtendType } from "../../../../web/src/utils/script/prisma-extend"; +import { code } from "../code/code"; const decoder = new TextDecoder(); const code_startup = { @@ -84,41 +84,41 @@ export const code_action: SAction["code"]["action"] = async function ( } catch (e) {} return { type: "check-typings", hash: false }; } - case "push-typings": { - const dir = code.path(arg.site_id, "site", "src", "typings"); - await dirAsync(dir); - await dirAsync(path.join(dir, "runtime")); - Bun.write(Bun.file(path.join(dir, "hash")), arg.hash.toString()); - const res = JSON.parse(decoder.decode(await gunzipAsync(arg.body))); - await Bun.write(Bun.file(path.join(dir, "api.d.ts")), res.api); - await Bun.write( - Bun.file(path.join(dir, "prisma.d.ts")), - res.prisma["prisma.d.ts"] - ); - await Bun.write( - Bun.file(path.join(dir, "runtime/index.d.ts")), - res.prisma["runtime/index.d.ts"] - ); - await Bun.write( - Bun.file(path.join(dir, "runtime/library.d.ts")), - res.prisma["runtime/library.d.ts"] - ); - await Bun.write( - Bun.file(path.join(dir, "global.d.ts")), - codeGlobalTypings.replace( - `declare global {`, - `declare global { - const db: prisma.PrismaClient & ${prismaExtendType}; - ` - ) - ); + // case "push-typings": { + // const dir = code.path(arg.site_id, "site", "src", "typings"); + // await dirAsync(dir); + // await dirAsync(path.join(dir, "runtime")); + // Bun.write(Bun.file(path.join(dir, "hash")), arg.hash.toString()); + // const res = JSON.parse(decoder.decode(await gunzipAsync(arg.body))); + // await Bun.write(Bun.file(path.join(dir, "api.d.ts")), res.api); + // await Bun.write( + // Bun.file(path.join(dir, "prisma.d.ts")), + // res.prisma["prisma.d.ts"] + // ); + // await Bun.write( + // Bun.file(path.join(dir, "runtime/index.d.ts")), + // res.prisma["runtime/index.d.ts"] + // ); + // await Bun.write( + // Bun.file(path.join(dir, "runtime/library.d.ts")), + // res.prisma["runtime/library.d.ts"] + // ); + // await Bun.write( + // Bun.file(path.join(dir, "global.d.ts")), + // codeGlobalTypings.replace( + // `declare global {`, + // `declare global { + // const db: prisma.PrismaClient & ${prismaExtendType}; + // ` + // ) + // ); - Bun.spawn({ - cmd: ["chmod", "-R", "777", "."], - cwd: code.path(arg.site_id, "site", "src"), - }); + // Bun.spawn({ + // cmd: ["chmod", "-R", "777", "."], + // cwd: code.path(arg.site_id, "site", "src"), + // }); - break; - } + // break; + // } } }; diff --git a/app/srv/ws/sync/actions/code_load.ts b/app/srv/ws/sync/actions/code_load.ts index 3699aa0e..b1eeb03e 100644 --- a/app/srv/ws/sync/actions/code_load.ts +++ b/app/srv/ws/sync/actions/code_load.ts @@ -1,5 +1,4 @@ import { SAction } from "../actions"; -import { prepCodeSnapshot } from "../editor/code/prep-code"; import { SyncConnection } from "../type"; export const code_load: SAction["code"]["load"] = async function ( @@ -7,7 +6,5 @@ export const code_load: SAction["code"]["load"] = async function ( site_id, type ) { - const snap = await prepCodeSnapshot(site_id, "site"); - return { id: site_id }; }; diff --git a/app/srv/ws/sync/actions/site_load.ts b/app/srv/ws/sync/actions/site_load.ts index 9e920510..39e557a6 100644 --- a/app/srv/ws/sync/actions/site_load.ts +++ b/app/srv/ws/sync/actions/site_load.ts @@ -2,7 +2,7 @@ import { validate } from "uuid"; import { ESite } from "../../../../web/src/nova/ed/logic/ed-global"; import { SAction } from "../actions"; import { SyncConnection } from "../type"; -import { prepCodeSnapshot } from "../editor/code/prep-code"; +import { code } from "../code/code"; export const site_load: SAction["site"]["load"] = async function ( this: SyncConnection, @@ -13,6 +13,8 @@ export const site_load: SAction["site"]["load"] = async function ( if (site) { if (this.conf) this.conf.site_id = site.id; + code.init(site.id, "init site_load"); + const config = typeof site.config === "object" && site.config ? { api_url: (site.config as any).api_url || "" } @@ -43,8 +45,6 @@ export const site_load: SAction["site"]["load"] = async function ( } } - const code = await prepCodeSnapshot(site.id, "site"); - return { id: site.id, name: site.name, @@ -58,7 +58,6 @@ export const site_load: SAction["site"]["load"] = async function ( meta: undefined, entry: [], }, - code_ts: code.ts, }; } } diff --git a/app/srv/ws/sync/code/code.ts b/app/srv/ws/sync/code/code.ts new file mode 100644 index 00000000..7a7fca75 --- /dev/null +++ b/app/srv/ws/sync/code/code.ts @@ -0,0 +1,37 @@ +import { dir } from "dir"; +import { initFrontEnd } from "./parts/init/frontend"; +import { initServer } from "./parts/init/server"; +import { initTypings } from "./parts/init/typings"; +import { codeInternal } from "./parts/internal"; +import { ensureLib } from "./utlis/ensure-lib"; +import { ensure } from "./utlis/ensure"; + +export const code = { + internal: codeInternal, + async init(id_site: string, note: string) { + const { frontend, server, typings } = this.internal; + if (!frontend[id_site] || !server[id_site] || !typings[id_site]) { + const root = `/code/${id_site}/site/src`; + + if (!frontend[id_site]) await initFrontEnd(root, id_site); + if (!server[id_site]) await initServer(root, id_site); + if (!typings[id_site]) await initTypings(root, id_site); + + await ensureLib(root, id_site); + await ensure(`${root}/index.tsx`, ``); + } + }, + path( + id_site: string, + mode: "site" | "server", + type: "src" | "build" | "build_cache", + path?: string + ) { + let file_path = ""; + if (path) { + file_path = path[0] === "/" ? path : `/${path}`; + } + + return dir.data(`/code/${id_site}/${mode}/${type}${file_path}`); + }, +}; diff --git a/app/srv/ws/sync/code/parts/init/frontend.ts b/app/srv/ws/sync/code/parts/init/frontend.ts new file mode 100644 index 00000000..e87d2bad --- /dev/null +++ b/app/srv/ws/sync/code/parts/init/frontend.ts @@ -0,0 +1,10 @@ +import { code } from "../../code"; + +export const initFrontEnd = async (root: string, id_site: string) => { + const existing = code.internal.frontend[id_site]; + if (existing) { + await existing.dispose(); + } + + code.internal.frontend[id_site] = true as any; +}; diff --git a/app/srv/ws/sync/code/parts/init/server.ts b/app/srv/ws/sync/code/parts/init/server.ts new file mode 100644 index 00000000..a8fb6dfc --- /dev/null +++ b/app/srv/ws/sync/code/parts/init/server.ts @@ -0,0 +1,88 @@ +import { context } from "esbuild"; +import { code } from "../../code"; +import { ensure } from "../../utlis/ensure"; +import { dir } from "dir"; +import { dirAsync, removeAsync, existsAsync, writeAsync } from "fs-jetpack"; + +export const initServer = async (root: string, id_site: string) => { + const existing = code.internal.server[id_site]; + if (existing) { + await existing.dispose(); + } + + const build_path = code.path(id_site, "server", "build"); + await removeAsync(build_path); + await dirAsync(build_path); + + const build_file = `${build_path}/index.js`; + if (!(await existsAsync(build_file))) { + await writeAsync(build_file, ""); + } + + code.internal.server[id_site] = await context({ + absWorkingDir: dir.data(root), + entryPoints: ["server.ts"], + bundle: true, + outfile: build_file, + platform: "node", + treeShaking: true, + format: "cjs", + logLevel: "silent", + banner: { + js: `\ + const _fs = require('node:fs/promises'); + const console = + typeof global.server_hook === "function" + ? { ...global.console } + : global.console; + + let db = new Proxy({}, { + get(_, key) { + const runtime = global.server_runtime["${id_site}"]; + if (runtime && runtime.db) { + return runtime.db[key]; + } + } + }); + let api = {}; + if (typeof global.server_hook === "function") { + const log = global.console.log; + console.log = function (...arg) { + const out = "${code.path(id_site, "site", "src", "server.log")}"; + _fs.appendFile(out, arg.map((e)=>{ + const ancestors = []; + if (typeof e === 'object') return JSON.stringify(e, function (key, val) { + if (val) { + if (typeof val === 'function') { + return '[function]'; + } + if (typeof val === 'object') { + while (ancestors.length > 0 && ancestors.at(-1) !== this) { + ancestors.pop(); + } + if (ancestors.includes(val)) { + return "[circular]"; + } + ancestors.push(val); + + if (val.constructor && + !['Object', 'Array'].includes(val.constructor.name)) { + if (val.constructor.name === 'Error') { + return '[Error] ' + val.message; + } + return '[Class] ' + val.constructor.name; + } + } + } + return val; + }, 2); + return e; + }).join(" ") + "\\n"); + }.bind(console); + } else { + db = global.db; + api = global.api; + }`, + }, + }); +}; diff --git a/app/srv/ws/sync/code/parts/init/typings.ts b/app/srv/ws/sync/code/parts/init/typings.ts new file mode 100644 index 00000000..8e9f4658 --- /dev/null +++ b/app/srv/ws/sync/code/parts/init/typings.ts @@ -0,0 +1,5 @@ +import { code } from "../../code"; + +export const initTypings = async (root_dir: string, id_site: string) => { + code.internal.typings[id_site] = true as any; +}; diff --git a/app/srv/ws/sync/code/parts/internal.ts b/app/srv/ws/sync/code/parts/internal.ts new file mode 100644 index 00000000..3cecbaf2 --- /dev/null +++ b/app/srv/ws/sync/code/parts/internal.ts @@ -0,0 +1,25 @@ +import { Subprocess } from "bun"; +import type { BuildContext } from "esbuild"; + +const g = global as unknown as { + prasi_code: any; +}; +type SITE_ID = string; + +export const codeInternal = { + get server() { + if (!g.prasi_code) g.prasi_code = {}; + if (!g.prasi_code.server) g.prasi_code.server = {}; + return g.prasi_code.server as Record; + }, + get frontend() { + if (!g.prasi_code) g.prasi_code = {}; + if (!g.prasi_code.frontend) g.prasi_code.frontend = {}; + return g.prasi_code.frontend as Record; + }, + get typings() { + if (!g.prasi_code) g.prasi_code = {}; + if (!g.prasi_code.typings) g.prasi_code.typings = {}; + return g.prasi_code.typings as Record; + }, +}; diff --git a/app/srv/ws/sync/code/templates/index_tsx b/app/srv/ws/sync/code/templates/index_tsx new file mode 100644 index 00000000..3c425e48 --- /dev/null +++ b/app/srv/ws/sync/code/templates/index_tsx @@ -0,0 +1,2 @@ +export * from "@/data"; +export * from "@/exports"; \ No newline at end of file diff --git a/app/srv/ws/sync/code/templates/server_ts b/app/srv/ws/sync/code/templates/server_ts new file mode 100644 index 00000000..82676817 --- /dev/null +++ b/app/srv/ws/sync/code/templates/server_ts @@ -0,0 +1,7 @@ +import type {} from "./typings/global"; + +export const server: PrasiServer = { + async http({ req, handle, mode, url, index, server }) { + return await handle(req); + } +}; \ No newline at end of file diff --git a/app/srv/ws/sync/code/templates/tsconfig_json b/app/srv/ws/sync/code/templates/tsconfig_json new file mode 100644 index 00000000..21a4c9cc --- /dev/null +++ b/app/srv/ws/sync/code/templates/tsconfig_json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./lib/*"], + "app/*": ["./app/*"], + "server/*": ["./server/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "declaration": true, + "outFile": "types.d.ts", + "emitDeclarationOnly": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "typeRoots": ["./node_modules/@types", "./lib/types"] + } +} diff --git a/app/srv/ws/sync/code/templates/typings/global_d_ts b/app/srv/ws/sync/code/templates/typings/global_d_ts new file mode 100644 index 00000000..8f5eb0af --- /dev/null +++ b/app/srv/ws/sync/code/templates/typings/global_d_ts @@ -0,0 +1,68 @@ +//@ts-ignore +import type * as SRVAPI from "gen/srv/api/srv"; +import { Server, WebSocketHandler } from "bun"; +import prisma from "./prisma"; + +declare global { + type Api = typeof SRVAPI; + type ApiName = keyof Api; + const api: { [k in ApiName]: Awaited["_"]["api"] } & { + _raw: any; + }; + const db: prisma.PrismaClient & { + _batch: { + update: ( + batch: { + table: string; + data: any; + where: any; + }[] + ) => Promise; + }; + _schema: { + tables: () => Promise; + columns: (table: string) => Promise< + Record< + string, + { + is_pk: boolean; + type: string; + optional: boolean; + db_type: string; + default?: any; + } + > + >; + rels: (table: string) => Promise< + Record< + string, + { + type: "has-many" | "has-one"; + to: { + table: string; + fields: string[]; + }; + from: { + table: string; + fields: string[]; + }; + } + > + >; + }; + }; + + type PrasiServer = { + ws?: WebSocketHandler<{ url: string }>; + http: (arg: { + url: { raw: URL; pathname: string }; + req: Request; + server: Server; + mode: "dev" | "prod"; + handle: (req: Request) => Promise; + index: { head: string[]; body: string[]; render: () => string }; + prasi: { page_id?: string; params?: Record }; + }) => Promise; + init: (arg: { port?: number }) => Promise; + }; +} diff --git a/app/srv/ws/sync/code/utlis/ensure-lib.ts b/app/srv/ws/sync/code/utlis/ensure-lib.ts new file mode 100644 index 00000000..015cb95b --- /dev/null +++ b/app/srv/ws/sync/code/utlis/ensure-lib.ts @@ -0,0 +1,15 @@ +import { $ } from "bun"; +import { dir } from "dir"; +import { exists, dirAsync } from "fs-jetpack"; + +export const ensureLib = async (src_dir: string, id_site: string) => { + if (!exists(dir.data(src_dir))) { + await dirAsync(dir.data(src_dir)); + } + + if (!exists(dir.data(`${src_dir}/lib`))) { + console.log(`${src_dir}/lib not found.`); + const _ = $.cwd(dir.data(src_dir)); + await _`git clone https://github.com/avolut/prasi-lib lib`; + } +}; diff --git a/app/srv/ws/sync/code/utlis/ensure.ts b/app/srv/ws/sync/code/utlis/ensure.ts new file mode 100644 index 00000000..e4e88054 --- /dev/null +++ b/app/srv/ws/sync/code/utlis/ensure.ts @@ -0,0 +1,14 @@ +import { exists, dirAsync } from "fs-jetpack"; +import { dirname } from "path"; +import { dir } from "dir"; + +export const ensure = async (path: string, content: string) => { + const _path = dir.data(path); + const _dir = dirname(_path); + if (!exists(_dir)) { + await dirAsync(_dir); + } + if (!exists(_path)) { + await Bun.write(_path, content); + } +}; diff --git a/app/srv/ws/sync/editor/code/build-code.ts b/app/srv/ws/sync/editor/code/build-code.ts index c68fc49c..36eb5c99 100644 --- a/app/srv/ws/sync/editor/code/build-code.ts +++ b/app/srv/ws/sync/editor/code/build-code.ts @@ -1,22 +1,7 @@ -import globalExternals from "@fal-works/esbuild-plugin-global-externals"; -import { style } from "@hyrious/esbuild-plugin-style"; -import { context } from "esbuild"; -import { - dirAsync, - existsAsync, - removeAsync, - writeAsync, - moveAsync, -} from "fs-jetpack"; -import { server } from "./server-main"; -import { code } from "./util-code"; -import { user } from "../../entity/user"; -import { conns } from "../../entity/conn"; -import { SyncType } from "../../type"; -import { Packr } from "msgpackr"; import { ServerWebSocket } from "bun"; +import { Packr } from "msgpackr"; import { WSData } from "../../../../../../pkgs/core/server/create"; -import { g } from "utils/global"; +import { code } from "../../code/code"; const packr = new Packr({ structuredClone: true }); @@ -25,267 +10,240 @@ const sendWS = (ws: ServerWebSocket, msg: any) => { }; export const codeBuild = async (id_site: any) => { - const src_path = code.path(id_site, "site", "src"); - if (!(await existsAsync(src_path))) return; - if (!code.esbuild[id_site]) { - code.esbuild[id_site] = { site: null, server: null, site_ts: Date.now() }; - } + return; + // const src_path = code.path(id_site, "site", "src"); + // if (!(await existsAsync(src_path))) return; + // if (!code.esbuild[id_site]) { + // code.esbuild[id_site] = { site: null, server: null, site_ts: Date.now() }; + // } - if (!code.esbuild[id_site].server) { - const server_main = code.path(id_site, "site", "src", "server.ts"); - if (!(await existsAsync(server_main))) { - await writeAsync( - server_main, - `\ -import type {} from "./typings/global"; + // if (!code.esbuild[id_site].server) { + // const server_main = code.path(id_site, "site", "src", "server.ts"); + // if (!(await existsAsync(server_main))) { + // await writeAsync( + // server_main, + // `\ + // import type {} from "./typings/global"; -export const server: PrasiServer = { - async http({ req, handle, mode, url, index, server }) { - return await handle(req); - } + // export const server: PrasiServer = { + // async http({ req, handle, mode, url, index, server }) { + // return await handle(req); + // } + // }; + // ` + // ); + // const bun_types = Bun.spawn({ + // cmd: ["npm", "i", "-D", "@types/bun"], + // cwd: code.path(id_site, "site", "src"), + // }); + // await bun_types.exited; + // } + + // const build_path = code.path(id_site, "server", "build"); + // await removeAsync(build_path); + // await dirAsync(build_path); + + // const build_file = `${build_path}/index.js`; + // if (!(await existsAsync(build_file))) { + // await writeAsync(build_file, ""); + // } + + // code.esbuild[id_site].server = await context({ + // absWorkingDir: src_path, + // entryPoints: ["server.ts"], + // bundle: true, + // outfile: build_file, + // platform: "node", + // treeShaking: true, + // format: "cjs", + // logLevel: "silent", + // banner: { + // js: `\ + // const _fs = require('node:fs/promises'); + // const console = + // typeof global.server_hook === "function" + // ? { ...global.console } + // : global.console; + + // let db = new Proxy({}, { + // get(_, key) { + // const runtime = global.server_runtime["${id_site}"]; + // if (runtime && runtime.db) { + // return runtime.db[key]; + // } + // } + // }); + // let api = {}; + // if (typeof global.server_hook === "function") { + // const log = global.console.log; + // console.log = function (...arg) { + // const out = "${code.path(id_site, "site", "src", "server.log")}"; + // _fs.appendFile(out, arg.map((e)=>{ + // const ancestors = []; + // if (typeof e === 'object') return JSON.stringify(e, function (key, val) { + // if (val) { + // if (typeof val === 'function') { + // return '[function]'; + // } + // if (typeof val === 'object') { + // while (ancestors.length > 0 && ancestors.at(-1) !== this) { + // ancestors.pop(); + // } + // if (ancestors.includes(val)) { + // return "[circular]"; + // } + // ancestors.push(val); + + // if (val.constructor && + // !['Object', 'Array'].includes(val.constructor.name)) { + // if (val.constructor.name === 'Error') { + // return '[Error] ' + val.message; + // } + // return '[Class] ' + val.constructor.name; + // } + // } + // } + // return val; + // }, 2); + // return e; + // }).join(" ") + "\\n"); + // }.bind(console); + // } else { + // db = global.db; + // api = global.api; + // }`, + // }, + // plugins: [ + // style(), + // globalExternals({ + // react: { + // varName: "window.React", + // type: "cjs", + // }, + // "react-dom": { + // varName: "window.ReactDOM", + // type: "cjs", + // }, + // }), + // { + // name: "prasi", + // setup(setup) { + // const reinit = () => { + // setup.onEnd((res) => { + // if (res.errors.length > 0) { + // Bun.write( + // Bun.file(code.path(id_site, "site", "src", "server.log")), + // JSON.stringify(res.errors, null, 2) + // ); + // } + // server.init(id_site); + // }); + // }; + // reinit(); + // }, + // }, + // ], + // }); + + // const esbuild = code.esbuild[id_site].server; + // esbuild?.watch(); + // } + + // if (!code.esbuild[id_site].site) { + // const build_path = code.path(id_site, "site", "build_cache"); + // await removeAsync(build_path); + // await dirAsync(build_path); + // const build_file = `${build_path}/index.js`; + // await writeAsync(build_file, ""); + + // const index_path = code.path(id_site, "site", "src", "index.tsx"); + // if (!(await existsAsync(index_path))) { + // await writeAsync(index_path, 'export const hello = "world"'); + // } + // console.log("running "); + + // code.esbuild[id_site].site = await context({ + // absWorkingDir: src_path, + // entryPoints: ["index.tsx"], + // bundle: true, + // outdir: build_path, + // minify: true, + // treeShaking: true, + // format: "esm", + // splitting: true, + // logLevel: "silent", + // sourcemap: true, + // plugins: [ + // style(), + // globalExternals({ + // react: { + // varName: "window.React", + // type: "cjs", + // }, + // "react-dom": { + // varName: "window.ReactDOM", + // type: "cjs", + // }, + // }), + // { + // name: "prasi", + // setup(setup) { + // setup.onEnd(async (res) => { + // if (res.errors.length > 0) { + // await codeError( + // id_site, + // res.errors.map((e) => e.text).join("\n\n"), + // "site" + // ); + // } else { + // codeBuildType(id_site); + // await removeAsync(code.path(id_site, "site", "build")); + // await moveAsync( + // code.path(id_site, "site", "build_cache"), + // code.path(id_site, "site", "build") + // ); + // await removeAsync( + // code.path(id_site, "site", "src", "index.log") + // ); + + // code.esbuild[id_site].site_ts = Date.now(); + // const client_ids = new Set(); + // user.active.findAll({ site_id: id_site }).forEach((e) => { + // client_ids.add(e.client_id); + // }); + + // client_ids.forEach((client_id) => { + // const ws = conns.get(client_id)?.ws; + // if (ws) { + // sendWS(ws, { + // type: SyncType.Event, + // event: "code_changes", + // data: { ts: code.esbuild[id_site].site_ts }, + // }); + // } + // }); + // } + // }); + // }, + // }, + // ], + // }); + // const esbuild = code.esbuild[id_site].site; + // esbuild?.watch(); + // } + // for (const _mode of ["site", "server"]) { + // const mode = _mode as "site" | "server"; + + // const esbuild = code.esbuild[id_site][mode]; + // if (esbuild) { + // try { + // await esbuild.rebuild(); + // } catch (e: any) { + // await codeError(id_site, e.message, mode); + // } + // } + // } }; -` - ); - const bun_types = Bun.spawn({ - cmd: ["npm", "i", "-D", "@types/bun"], - cwd: code.path(id_site, "site", "src"), - }); - await bun_types.exited; - } - - const build_path = code.path(id_site, "server", "build"); - await removeAsync(build_path); - await dirAsync(build_path); - - const build_file = `${build_path}/index.js`; - if (!(await existsAsync(build_file))) { - await writeAsync(build_file, ""); - } - - code.esbuild[id_site].server = await context({ - absWorkingDir: src_path, - entryPoints: ["server.ts"], - bundle: true, - outfile: build_file, - platform: "node", - treeShaking: true, - format: "cjs", - logLevel: "silent", - banner: { - js: `\ -const _fs = require('node:fs/promises'); -const console = -typeof global.server_hook === "function" - ? { ...global.console } - : global.console; - -let db = new Proxy({}, { - get(_, key) { - const runtime = global.server_runtime["${id_site}"]; - if (runtime && runtime.db) { - return runtime.db[key]; - } - } -}); -let api = {}; -if (typeof global.server_hook === "function") { - const log = global.console.log; - console.log = function (...arg) { - const out = "${code.path(id_site, "site", "src", "server.log")}"; - _fs.appendFile(out, arg.map((e)=>{ - const ancestors = []; - if (typeof e === 'object') return JSON.stringify(e, function (key, val) { - if (val) { - if (typeof val === 'function') { - return '[function]'; - } - if (typeof val === 'object') { - while (ancestors.length > 0 && ancestors.at(-1) !== this) { - ancestors.pop(); - } - if (ancestors.includes(val)) { - return "[circular]"; - } - ancestors.push(val); - - if (val.constructor && - !['Object', 'Array'].includes(val.constructor.name)) { - if (val.constructor.name === 'Error') { - return '[Error] ' + val.message; - } - return '[Class] ' + val.constructor.name; - } - } - } - return val; - }, 2); - return e; - }).join(" ") + "\\n"); - }.bind(console); -} else { - db = global.db; - api = global.api; -}`, - }, - plugins: [ - style(), - globalExternals({ - react: { - varName: "window.React", - type: "cjs", - }, - "react-dom": { - varName: "window.ReactDOM", - type: "cjs", - }, - }), - { - name: "prasi", - setup(setup) { - const reinit = () => { - setup.onEnd((res) => { - if (res.errors.length > 0) { - Bun.write( - Bun.file(code.path(id_site, "site", "src", "server.log")), - JSON.stringify(res.errors, null, 2) - ); - } - server.init(id_site); - }); - }; - reinit(); - }, - }, - ], - }); - - const esbuild = code.esbuild[id_site].server; - esbuild?.watch(); - } - - if (!code.esbuild[id_site].site) { - const build_path = code.path(id_site, "site", "build_cache"); - await removeAsync(build_path); - await dirAsync(build_path); - const build_file = `${build_path}/index.js`; - await writeAsync(build_file, ""); - - const index_path = code.path(id_site, "site", "src", "index.tsx"); - if (!(await existsAsync(index_path))) { - await writeAsync(index_path, 'export const hello = "world"'); - } - - code.esbuild[id_site].site = await context({ - absWorkingDir: src_path, - entryPoints: ["index.tsx"], - bundle: true, - outdir: build_path, - minify: true, - treeShaking: true, - format: "esm", - splitting: true, - logLevel: "silent", - sourcemap: true, - plugins: [ - style(), - globalExternals({ - react: { - varName: "window.React", - type: "cjs", - }, - "react-dom": { - varName: "window.ReactDOM", - type: "cjs", - }, - }), - { - name: "prasi", - setup(setup) { - setup.onEnd(async (res) => { - if (res.errors.length > 0) { - await codeError( - id_site, - res.errors.map((e) => e.text).join("\n\n"), - "site" - ); - } else { - await removeAsync(code.path(id_site, "site", "build")); - await moveAsync( - code.path(id_site, "site", "build_cache"), - code.path(id_site, "site", "build") - ); - await removeAsync( - code.path(id_site, "site", "src", "index.log") - ); - - code.esbuild[id_site].site_ts = Date.now(); - const client_ids = new Set(); - user.active.findAll({ site_id: id_site }).forEach((e) => { - client_ids.add(e.client_id); - }); - - client_ids.forEach((client_id) => { - const ws = conns.get(client_id)?.ws; - if (ws) { - sendWS(ws, { - type: SyncType.Event, - event: "code_changes", - data: { ts: code.esbuild[id_site].site_ts }, - }); - } - }); - } - }); - }, - }, - ], - }); - const esbuild = code.esbuild[id_site].site; - esbuild?.watch(); - } - for (const _mode of ["site", "server"]) { - const mode = _mode as "site" | "server"; - - const esbuild = code.esbuild[id_site][mode]; - if (esbuild) { - try { - await esbuild.rebuild(); - } catch (e: any) { - await codeError(id_site, e.message, mode); - } - } - - // const build_file = code.path(id_site, mode, "build", "index.js"); - // const out = Bun.file(build_file); - // const src = (await out.text()).replace( - // "//# sourceMappingURL=index.js.map", - // `//# sourceMappingURL=/nova-load/code/${id_site}/${mode}/index.js.map` - // ); - // // await Bun.write(out, src); - } -}; - -// const codeApplyChanges = (path: string, doc: DCode) => { -// const map = doc.getMap("map"); - -// const files = map.get("files"); - -// const dirs = readDirectoryRecursively(path); -// doc.transact(() => { -// files?.forEach((v, k) => { -// if (!dirs[k]) { -// files?.delete(k); -// } -// }); -// for (const [k, v] of Object.entries(dirs)) { -// if (files) { -// files.set(k, v); -// } -// } -// }); - -// return doc; -// }; const codeError = async ( id_site: string, diff --git a/app/srv/ws/sync/editor/code/prep-code.ts b/app/srv/ws/sync/editor/code/prep-code.ts deleted file mode 100644 index b5fde610..00000000 --- a/app/srv/ws/sync/editor/code/prep-code.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { g } from "utils/global"; -import { codeBuild } from "./build-code"; -import { CodeMode, code, codeGlobalTypings } from "./util-code"; - -export const prepCodeSnapshot = async (id_site: string, mode: CodeMode) => { - await code - .prep(id_site, mode) - .new_file("index.tsx", "export const sample = 'hello_world'") - .new_file( - "package.json", - JSON.stringify({ name: `${mode}-${id_site}`, dependencies: {} }, null, 2) - ) - .new_file("typings/global.d.ts", codeGlobalTypings) - .await(); - - await codeBuild(id_site); - - return { ts: code.esbuild[id_site].site_ts }; -}; diff --git a/app/srv/ws/sync/editor/code/server-main.ts b/app/srv/ws/sync/editor/code/server-main.ts index 5a113719..9993541a 100644 --- a/app/srv/ws/sync/editor/code/server-main.ts +++ b/app/srv/ws/sync/editor/code/server-main.ts @@ -1,13 +1,12 @@ -import type { Server, WebSocketHandler, ServerWebSocket } from "bun"; +import type { Server, WebSocketHandler } from "bun"; import { existsAsync } from "fs-jetpack"; import _fs from "node:fs/promises"; import { g } from "utils/global"; import { waitUntil } from "web-utils"; -import { code } from "./util-code"; import { WSData } from "../../../../../../pkgs/core/server/create"; -import { codeBuild } from "./build-code"; import { prodIndex } from "../../../../util/prod-index"; +import { code } from "../../code/code"; import "./server-runtime"; const serverMain = () => ({ @@ -61,10 +60,9 @@ const serverMain = () => ({ site_id: string, arg: Parameters>[0] ) { - if (!code.esbuild[site_id]) { - await codeBuild(site_id); + if (arg.url.pathname.endsWith("main.js")) { + code.init(site_id, "init http"); } - if (typeof this.handler[site_id] === "undefined") { if ( await existsAsync(code.path(site_id, "server", "build", "index.js")) @@ -130,13 +128,11 @@ type PrasiServer = { index: { head: string[]; body: string[]; render: () => string }; prasi: { page_id?: string; params?: Record }; }) => Promise; - init?: () => Promise; + init?: (arg: { port?: number }) => Promise; }; const glb = global as unknown as { _server: ReturnType; }; -if (!glb._server) { - glb._server = serverMain(); -} +glb._server = serverMain(); export const server = glb._server; diff --git a/app/srv/ws/sync/editor/code/util-code.ts b/app/srv/ws/sync/editor/code/util-code.ts index 2b46cbfc..16d6ca77 100644 --- a/app/srv/ws/sync/editor/code/util-code.ts +++ b/app/srv/ws/sync/editor/code/util-code.ts @@ -3,6 +3,7 @@ import { dir } from "dir"; import { BuildContext } from "esbuild"; import { dirAsync, exists, existsAsync, writeAsync } from "fs-jetpack"; import { dirname } from "path"; +import { prismaExtendType } from "../../../../../web/src/utils/script/prisma-extend"; export type CodeBuild = { server: BuildContext | null; @@ -11,13 +12,13 @@ export type CodeBuild = { }; export type CodeMode = keyof CodeBuild; -export const code = { +const code = { path( id_site: string, mode: CodeMode, type: "src" | "build" | "build_cache", path?: string - ) { + ) { let file_path = ""; if (path) { file_path = path[0] === "/" ? path : `/${path}`; @@ -69,6 +70,8 @@ declare global { type Api = typeof SRVAPI; type ApiName = keyof Api; const api: { [k in ApiName]: Awaited["_"]["api"] } & { _raw: any }; + const db: prisma.PrismaClient & ${prismaExtendType}; + type PrasiServer = { ws?: WebSocketHandler<{ url: string }>; @@ -81,7 +84,7 @@ declare global { index: { head: string[]; body: string[]; render: () => string }; prasi: { page_id?: string; params?: Record }; }) => Promise; - init: () => Promise; + init: (arg: { port?: number }) => Promise; }; } `; diff --git a/app/web/src/nova/ed/logic/ed-global.ts b/app/web/src/nova/ed/logic/ed-global.ts index 01986015..8e84c23c 100644 --- a/app/web/src/nova/ed/logic/ed-global.ts +++ b/app/web/src/nova/ed/logic/ed-global.ts @@ -24,7 +24,6 @@ export const EmptySite = { meta: undefined as void | Record, entry: [] as string[], }, - code_ts: 0, }; export type ESite = typeof EmptySite; @@ -150,6 +149,7 @@ export const EDGlobal = { sync: null as null | Awaited>, sync_assigned: false, site: deepClone(EmptySite), + site_tstamp: Date.now(), site_exports: {} as Record, site_dts: "", script: { diff --git a/app/web/src/nova/vi/load/load-snapshot.tsx b/app/web/src/nova/vi/load/load-snapshot.tsx index 3a29ffb2..be9fad1e 100644 --- a/app/web/src/nova/vi/load/load-snapshot.tsx +++ b/app/web/src/nova/vi/load/load-snapshot.tsx @@ -62,9 +62,9 @@ export const applyEnv = async (p: PG) => { w.api = apiProxy(p.site.config.api_url); } - const url = `/prod/${p.site.id}/_prasi/code/index.js?ts=${p.site.code_ts}`; + const url = `/prod/${p.site.id}/_prasi/code/index.js?ts=${p.site_tstamp}`; const fn = new Function("callback", `import("${url}").then(callback)`); - + try { await new Promise((resolve) => { fn((exports: any) => { diff --git a/app/web/src/nova/vi/render/script/local.tsx b/app/web/src/nova/vi/render/script/local.tsx index 202b8119..c8732293 100644 --- a/app/web/src/nova/vi/render/script/local.tsx +++ b/app/web/src/nova/vi/render/script/local.tsx @@ -41,8 +41,8 @@ export const createViLocal = ( const [_, set] = useState({}); const local = ref.current; local.render = () => { - if ((window as any).prasiContext?.render) { - (window as any).prasiContext?.render(); + if ((window as any).prasiContext.render) { + (window as any).prasiContext.render(); } else { set({}); } diff --git a/bun.lockb b/bun.lockb index ab8b61cb6f2c9627b52ed08d6b51ce49da18b910..349487204789ae8ae290627debef2859d12b9986 100755 GIT binary patch delta 18783 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 delta 18609 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 diff --git a/package.json b/package.json index 58ce780d..55a7eaf6 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "module": "src/index.ts", "type": "module", "scripts": { - "dev": "bun run ./pkgs/core/index.ts dev", + "dev": "bun run --hot ./pkgs/core/index.ts dev", "clean": "rm -rf data/lmdb && rm -rf app/static && rm -rf app/web/.parcel-cache", "build": "bun run --silent ./pkgs/core/build.ts", "build-site": "bun run --silent ./pkgs/core/build-site.ts", @@ -19,9 +19,6 @@ "app/*", "pkgs/*" ], - "peerDependencies": { - "typescript": "^5.0.0" - }, "dependencies": { "brotli-wasm": "^2.0.1", "fdir": "^6.1.0", diff --git a/pkgs/core/package.json b/pkgs/core/package.json index 0a2835be..f8741137 100644 --- a/pkgs/core/package.json +++ b/pkgs/core/package.json @@ -17,7 +17,6 @@ "pino-pretty": "^10.2.3", "radash": "^11.0.0", "radix3": "^1.1.0", - "typescript": "^5.2.2", "unzipper": "^0.10.14" } } \ No newline at end of file