@blocklet/pages-kit-inner-components 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/chunks/{components-CnPdZJ2Z.js → components-aaduHC9E.js} +5 -5
- package/lib/cjs/chunks/site-state-DlfM55ST.js +1 -0
- package/lib/cjs/components.js +1 -1
- package/lib/cjs/project-html.js +1 -1
- package/lib/cjs/resources.js +1 -1
- package/lib/cjs/site-state.js +1 -1
- package/lib/es/chunks/{components-CcZk17uO.js → components-D4ywfyMi.js} +168 -164
- package/lib/es/chunks/{site-state-Ct2OR_RE.js → site-state-BR3S4pMJ.js} +499 -475
- package/lib/es/components.js +1 -1
- package/lib/es/project-html.js +1 -1
- package/lib/es/resources.js +2 -2
- package/lib/es/site-state.js +2 -2
- package/package.json +6 -6
- package/lib/cjs/chunks/site-state-D9DYye_t.js +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var se=Object.create;var B=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var pe=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ae(t))!le.call(e,s)&&s!==o&&B(e,s,{get:()=>t[s],enumerable:!(n=ce(t,s))||n.enumerable});return e};var P=(e,t,o)=>(o=e!=null?se(ie(e)):{},pe(t||!e||!e.__esModule?B(o,"default",{value:e,enumerable:!0}):o,e));const v=require("@blocklet/quickjs"),ue=require("crypto"),w=require("fs"),j=require("path"),de=require("@blocklet/sdk/lib/config"),me=require("lodash/isNil"),fe=require("@blocklet/pages-kit/builtin/utils"),T=require("@blocklet/pages-kit/types"),L=require("@blocklet/pages-kit/utils/builtin"),N=require("@blocklet/pages-kit/utils/property"),he=require("lodash/isEmpty"),ge=require("lru-cache"),J=require("node-fetch"),Ce=require("p-limit"),S=require("ufo"),we=require("@blocklet/logger"),V=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),et=require("@blocklet/sdk/lib/component"),E=e=>e&&e.__esModule?e:{default:e},W=E(j),h=E(de),ye=E(me),Se=E(he),Ee=E(J),q=E(Ce),xe=E(we);h.default.env.mode;h.default.env.TRANSLATE_ADDITIONAL_PROMPT||process.env.TRANSLATE_ADDITIONAL_PROMPT;h.default.env.PAGE_CONTENT_ADDITIONAL_PROMPT||process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;const _e="image-bin";h.default.env.INIT_TEMPLATE_PATH;const Pe=process.env.DATABASE_URL||W.default.join(h.default.env.dataDir,"db/pages-kit.db"),H=h.default,Me=()=>h.default.env.tenantMode==="multiple",Te=()=>(ye.default(H.env.preferences.multiTenantAllProjectAccessPassports)?[]:H.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],
|
|
1
|
+
"use strict";var se=Object.create;var B=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var pe=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ae(t))!le.call(e,s)&&s!==o&&B(e,s,{get:()=>t[s],enumerable:!(n=ce(t,s))||n.enumerable});return e};var P=(e,t,o)=>(o=e!=null?se(ie(e)):{},pe(t||!e||!e.__esModule?B(o,"default",{value:e,enumerable:!0}):o,e));const v=require("@blocklet/quickjs"),ue=require("crypto"),w=require("fs"),j=require("path"),de=require("@blocklet/sdk/lib/config"),me=require("lodash/isNil"),fe=require("@blocklet/pages-kit/builtin/utils"),T=require("@blocklet/pages-kit/types"),L=require("@blocklet/pages-kit/utils/builtin"),N=require("@blocklet/pages-kit/utils/property"),he=require("lodash/isEmpty"),ge=require("lru-cache"),J=require("node-fetch"),Ce=require("p-limit"),S=require("ufo"),we=require("@blocklet/logger"),V=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),et=require("@blocklet/sdk/lib/component"),E=e=>e&&e.__esModule?e:{default:e},W=E(j),h=E(de),ye=E(me),Se=E(he),Ee=E(J),q=E(Ce),xe=E(we);h.default.env.mode;h.default.env.TRANSLATE_ADDITIONAL_PROMPT||process.env.TRANSLATE_ADDITIONAL_PROMPT;h.default.env.PAGE_CONTENT_ADDITIONAL_PROMPT||process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;const _e="image-bin";h.default.env.INIT_TEMPLATE_PATH;const Pe=process.env.DATABASE_URL||W.default.join(h.default.env.dataDir,"db/pages-kit.db"),H=h.default,Me=()=>h.default.env.tenantMode==="multiple",Te=()=>(ye.default(H.env.preferences.multiTenantAllProjectAccessPassports)?[]:H.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],be=W.default.join(h.default.env.dataDir,"fs-memoize-cache"),Ie=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=xe.default("pages-kit"),Oe=be,Ae=Ie,R=30*24*60*60*1e3,ve=24*60*60*1e3,Q=async(e="")=>{const t=j.join(Oe,e);try{if(!(await w.promises.stat(t)).isDirectory())throw new Error(`${t} is not a directory`)}catch{await w.promises.mkdir(t,{recursive:!0})}return t},K=(e,...t)=>e.keyGenerator?e.keyGenerator(...t):JSON.stringify([e.subdir||"",...t]),Ne=(e,t)=>{const o=ue.createHash("md5").update(t).digest("hex");return j.join(e,`${Ae}-${o}.json`)},Re=async(e="")=>{const t=await Q(e),o=Date.now();try{const n=await w.promises.readdir(t);await Promise.all(n.filter(s=>s.endsWith(".json")).map(async s=>{const r=j.join(t,s);try{const p=await w.promises.readFile(r,"utf-8"),a=JSON.parse(p);a.createdAt&&o-a.createdAt>R&&await w.promises.unlink(r)}catch{try{const a=await w.promises.stat(r);o-a.mtimeMs>R&&await w.promises.unlink(r)}catch{}}}))}catch(n){console.error(`Failed to cleanup cache in ${t}:`,n)}},je=(()=>{const e=new Set;return setInterval(async()=>{await Promise.all(Array.from(e).map(n=>Re(n)))},ve).unref(),n=>{e.add(n)}})();function D(e,t){return t.subdir&&je(t.subdir),v.memoize(async(...n)=>{const s=await Q(t.subdir||""),r=K(t,...n),p=Ne(s,r);try{const a=await w.promises.readFile(p,"utf-8"),{value:m,createdAt:i}=JSON.parse(a);if(i&&Date.now()-i>R)throw await w.promises.unlink(p).catch(()=>{}),new Error("Cache expired");return m}catch{const m=await e(...n),i=JSON.stringify({value:m,createdAt:Date.now()});return w.promises.writeFile(p,i,"utf-8").catch(f=>{console.error("Failed to write fs cache:",f)}),m}},{keyGenerator:(...n)=>K(t,...n),lruOptions:t.lruOptions||{max:100,ttl:R}})}const z=async()=>await import("typescript"),De=async()=>await import("esbuild"),Le=async()=>(await import("postcss")).default,$e=async()=>(await import("tailwindcss")).default,ke=async()=>(await import("autoprefixer")).default,Fe=!1,Ue=async(e,{componentId:t})=>{const o=`@tailwind components;
|
|
2
2
|
@tailwind utilities;
|
|
3
|
-
`,n=`.CustomComponent_${t}`,s=await Le(),r=await
|
|
3
|
+
`,n=`.CustomComponent_${t}`,s=await Le(),r=await $e(),p=await ke();return(await s([r({content:[{raw:e,extension:"tsx"}]}),p({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),m=>{m.walkRules(i=>{i.selectors=i.selectors.map(f=>f.replace(/\.(.+)/g,`${n}.$1,${n} .$1`))})}]).process(o)).css},Be=async(e,{componentId:t})=>{const o=await Ue(e,{componentId:t});return`export const __PagesKit_CSS__ = ${JSON.stringify(o)};
|
|
4
4
|
|
|
5
5
|
${e}
|
|
6
6
|
`},G=D(async(e,t)=>{let o=await z();try{let n=o.transpileModule(e,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.ESNext},transformers:{before:[V.createBuiltinModuleTransformer(o)]}}).outputText;if(t.tailwind&&(n=await Be(n,{componentId:t.componentId})),t.module===T.PreloadComponentScriptModule.ESM)return n;const s=o.transpileModule(n,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.CommonJS,moduleResolution:o.ModuleResolutionKind.Node16}}).outputText;return t.module===T.PreloadComponentScriptModule.CJS?s:X(t.moduleName,s)}catch(n){throw new Error(n)}finally{o=null}},{subdir:"transpileModule"}),qe=async(e,t)=>{let{build:o}=await De(),n=null;try{const r=(await o({entryPoints:["index.tsx"],external:Object.keys(L.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(m){m.onResolve({filter:/.*/},i=>i.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:i.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),m.onLoad({filter:/.*/,namespace:"vfs"},async i=>{if(i.path==="index.tsx")return{contents:`export { ${t} } from './component'`,loader:"tsx"};if(i.path==="component.tsx")return{contents:e,loader:"tsx"};if(V.isRelativeModule(i.path)){const f=i.path.split("/").pop()}return null})}}]})).outputFiles?.[0]?.contents;if(!r)throw new Error("Failed to build server code");const p=Buffer.from(r).toString();return n=await z(),n.transpileModule(p,{compilerOptions:{module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2020}}).outputText}catch(s){throw new Error(s)}finally{o=null,n=null}},He=(e,t)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,"m").test(e)?e:void 0,Z=D(async(e,t)=>{const o=await qe(e,t);return He(o,t)},{subdir:"extractExportValueSchema"}),X=(e,t)=>`// GENERATED FILE. DO NOT EDIT.
|
|
@@ -29,7 +29,7 @@ var ${e} = async function () {
|
|
|
29
29
|
|
|
30
30
|
return exports;
|
|
31
31
|
};
|
|
32
|
-
`,Y=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function Ke(e){return e?.type==="react-component"}const M=new ge.LRUCache({max:600,ttl:1e3*60*60*24*7}),ee=60*60
|
|
32
|
+
`,Y=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function Ke(e){return e?.type==="react-component"}const M=new ge.LRUCache({max:600,ttl:1e3*60*60*24*7}),ee=60*60,$=10;function k(e){g.info("clear preload components cache",{cacheKey:e}),M.delete(e)}function Ge(e){let t=0;for(const o of M.keys())o.includes(e)&&(t++,k(o));g.info(`clear preload components cache by mode ${e}, cleared ${t} entries`)}function Je(e){let t=0;for(const o of M.keys())o.includes(e)&&(t++,k(o));g.info(`clear preload components cache by instanceId ${e}, cleared ${t} entries`)}function te({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function Ve({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:p,config:{defaultLocale:a}}=o;if(!a)return null;const m=q.default(6),i=(await Promise.all(s.map(l=>m(async()=>{try{const u=te({mode:e,instanceId:l.id,componentId:l.componentId,locale:n});if(e!=="draft"&&l.useCache&&M.has(u))return g.info(`get preload component from cache: ${u}`),M.get(u);const d=b({state:o,componentId:l.componentId});if(!d)return null;const x=await oe({req:t,state:o,componentId:d.id,locale:n,defaultLocale:a,properties:l.properties});if(!x)return null;const I={instanceId:l.id,preload:x};if(e!=="draft"&&l.useCache){let _=ee;l.cacheDuration&&(_=l.cacheDuration),g.info(`set preload component to cache(${_}s): ${u}`),M.set(u,I,{ttl:_*1e3})}return I}catch(u){return g.error("get preload component error",{instanceId:l.id,componentId:l.componentId},{error:u}),null}})))).filter(l=>!!l),f=Object.values(i.reduce((l,u)=>({...l,...u.preload.components}),{}));async function y(){const l=q.default(10),u=await Promise.all(f.map(d=>l(async()=>{const x=r===T.PreloadComponentScriptModule.ESM,I=r===T.PreloadComponentScriptModule.UMD_FN,_=r===T.PreloadComponentScriptModule.CJS,O=x?"":N.componentUMDName({componentId:d.component.id}),F=re(d.component);let A={module:r,script:"",moduleName:O};if(F&&d.component.renderer?.type==="react-component"&&x&&d.component.renderer?.script)A.script=d.component.renderer?.script;else if(F&&d.component.renderer?.type==="react-component"&&(_||I)&&d.component.renderer?.cjsScript){const U=d.component.renderer.cjsScript;A.script=_?U:X(O,U)}else A=x?{module:r,script:await G(d.script,{componentId:d.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await G(d.script,{componentId:d.component.id,module:r,moduleName:O,tailwind:e!=="draft"}),moduleName:O};return[d.component.id,{component:d.component,script:A}]})));return Object.fromEntries(u)}const c=await y();return{config:{defaultLocale:a,supportedLocales:p},components:c,instances:i.map(l=>({id:l.instanceId,componentId:l.preload.component.id,locales:{[l.preload.locale]:{props:l.preload.props}}}))}}async function oe({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:p}=t,a=b({state:t,componentId:o});if(!a)return null;const m=p.some(f=>f.locale===n)?n:s;if(!m)return null;const i=await ne({req:e,state:t,componentId:o,locale:m,defaultLocale:s,properties:r});return i?{component:a,...i}:null}const We=20;async function ne({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:p}){if(t>We)throw new RangeError("max component depth exceeded");const a=Qe({state:o,componentId:n,properties:p,locale:s});if(!a)return null;const{props:m,component:i}=a,f={locale:s||r,components:{[a.component.id]:{component:a.component,script:a.script}},props:{...m}};try{const y=Ke(i.renderer)?i.renderer.getServerSideProps:void 0,c=await Ze({...a,req:e,getServerSideProps:y});c?.props&&Object.assign(f.props,c.props)}catch(y){g.error("preload data at server side error",{componentId:n,name:a.component.name},{error:y})}return await Promise.all(Object.entries(m).map(async([y,c])=>{if(c?.type===N.RenderNestedComponent){const C=await ne({req:e,depth:t+1,state:o,componentId:c.componentId,locale:s,defaultLocale:r,properties:c.properties});C&&(Object.assign(f.components,C.components),Object.assign(f.props,{[y]:{type:N.RenderNestedComponent,componentId:c.componentId,props:C.props}}))}})),f}function Qe({state:e,componentId:t,locale:o,properties:n}){const s=b({state:e,componentId:t});if(!s)return null;const r=N.mergeComponent({componentId:t,getComponent:p=>b({state:e,componentId:p}),locale:o,defaultLocale:e.config.defaultLocale,properties:n});return r?{component:s,script:r.script,props:{locale:o,...r.props}}:null}function b({state:e,componentId:t}){return e.components[t]?.data??e.resources.components?.[t]?.component}function ze({state:e,name:t}){const o=t.toLowerCase();return Object.values(e.components).find(n=>n.data.name?.toLowerCase()===o)?.data??(e.resources.components&&Object.values(e.resources.components).find(n=>n.component.name?.toLowerCase()===o))?.component}async function Ze({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await Z(t,"getServerSideProps");if(!r)return null;const a=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",m=new Promise(c=>{setTimeout(()=>{c({})},$*1e3)});let i=await Y();const f={componentMountPoints:h.default.components};return await Promise.race([m,i.callFunction({code:`${r}
|
|
33
33
|
|
|
34
34
|
export async function getServerSidePropsWrapper(props) {
|
|
35
35
|
const { location, fetch, props: componentProps } = props;
|
|
@@ -48,10 +48,10 @@ try {
|
|
|
48
48
|
}
|
|
49
49
|
}`,filename:`${e.name||e.id}.js`,moduleLoader:c=>{if(c==="@blocklet/pages-kit/builtin/utils")return` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
|
|
50
50
|
export { joinURL, withQuery, getQuery, getComponentMountPoint }
|
|
51
|
-
`;if(c==="@blocklet/pages-kit/builtin/dayjs")return v.BuiltinModules.dayjs;if(c in v.BuiltinModules)return v.BuiltinModules[c];if(c in L.BuiltinModules){const C=L.BuiltinModules[c];return Se.default(C)?void 0:C}},global:{console:{log:(...c)=>{g.info(...c)},warn:(...c)=>{g.warn(...c)},error:(...c)=>{g.error(...c)}},getComponentMountPoint:fe.getComponentMountPoint,joinURL:S.joinURL,withQuery:S.withQuery,getQuery:S.getQuery,window:{blocklet:f},blocklet:f},functionName:"getServerSidePropsWrapper",args:[{location:{href:S.joinURL(S.withHttps(n.hostname),n.originalUrl)},fetch:(c,{...C}={})=>{const l=typeof c=="string"&&c.startsWith("/")?S.joinURL(h.default.env.appUrl,c):c;if(typeof l=="string"&&S.parseURL(l).host===S.parseURL(h.default.env.appUrl).host){const u=n.get("cookie");if(u){const d=new J.Headers(C.headers);d.set("cookie",u),C.headers=d}}return Ee.default(l,{...C,timeout
|
|
51
|
+
`;if(c==="@blocklet/pages-kit/builtin/dayjs")return v.BuiltinModules.dayjs;if(c in v.BuiltinModules)return v.BuiltinModules[c];if(c in L.BuiltinModules){const C=L.BuiltinModules[c];return Se.default(C)?void 0:C}},global:{console:{log:(...c)=>{g.info(...c)},warn:(...c)=>{g.warn(...c)},error:(...c)=>{g.error(...c)}},getComponentMountPoint:fe.getComponentMountPoint,joinURL:S.joinURL,withQuery:S.withQuery,getQuery:S.getQuery,window:{blocklet:f},blocklet:f},functionName:"getServerSidePropsWrapper",args:[{location:{href:S.joinURL(S.withHttps(n.hostname),n.originalUrl)},fetch:(c,{...C}={})=>{const l=typeof c=="string"&&c.startsWith("/")?S.joinURL(h.default.env.appUrl,c):c;if(typeof l=="string"&&S.parseURL(l).host===S.parseURL(h.default.env.appUrl).host){const u=n.get("cookie");if(u){const d=new J.Headers(C.headers);d.set("cookie",u),C.headers=d}}return Ee.default(l,{...C,timeout:$*1e3}).then(u=>({ok:u.ok,status:u.status,statusText:u.statusText,headers:Object.fromEntries(u.headers.entries()),json:()=>u.json()}))},props:o}]}).finally(()=>{i=null})])}const Xe=D(async(e,t,o,n)=>{if(!e?.includes(t)&&!n)return null;const s=n??await Z(e,t);if(s)try{let r=await Y();return await r.callFunction({cache:!0,code:`
|
|
52
52
|
${s}
|
|
53
53
|
|
|
54
54
|
export function get${t}SchemaWrapper() {
|
|
55
55
|
return ${t};
|
|
56
56
|
}
|
|
57
|
-
`,filename:`${o}.js`,functionName:`get${t}SchemaWrapper`}).finally(()=>{r=null})}catch(r){return g.error(`获取 ${t} 失败`,{componentId:o,error:r}),null}return null},{subdir:"getExportSchemaValueFromCode"}),re=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=ee;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS
|
|
57
|
+
`,filename:`${o}.js`,functionName:`get${t}SchemaWrapper`}).finally(()=>{r=null})}catch(r){return g.error(`获取 ${t} 失败`,{componentId:o,error:r}),null}return null},{subdir:"getExportSchemaValueFromCode"}),re=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=ee;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=$;exports.IMAGE_BIN_NAME=_e;exports.clearPreloadComponentsCache=k;exports.clearPreloadComponentsCacheByInstanceId=Je;exports.clearPreloadComponentsCacheByMode=Ge;exports.databaseUrl=Pe;exports.getComponentFromState=b;exports.getComponentFromStateByName=ze;exports.getExportSchemaValueFromCode=Xe;exports.getMultiTenantAllProjectAccessPassports=Te;exports.getPreloadComponent=oe;exports.getPreloadComponents=Ve;exports.getPreloadComponentsCacheKey=te;exports.isMultiTenant=Me;exports.logger=g;exports.memoizeWithFs=D;exports.skipTranspileComponent=re;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const u=require("./components-aaduHC9E.js"),G=require("@syncedstore/core"),lt=require("yjs"),ut=require("@blocklet/pages-kit/utils/data-source"),se=require("@blocklet/pages-kit/utils/route"),pt=require("lodash/cloneDeep"),y=require("sequelize");require("sqlite3");const dt=require("@blocklet/sdk/lib/config"),_=require("ufo"),Ve=require("lodash"),ft=require("crypto"),Z=require("fs"),gt=require("p-limit"),p=require("path"),mt=require("worker_threads"),Ue=require("@blocklet/pages-kit/utils/common"),ht=require("@blocklet/pages-kit/utils/page-model"),yt=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),St=require("@reactivedata/reactive"),O=require("fs/promises"),oe=require("glob"),wt=require("lib0/decoding"),It=require("lib0/encoding"),Pt=require("lodash/debounce"),bt=require("lodash/get"),At=require("lodash/isEmpty"),Et=require("lodash/set"),jt=require("lodash/union"),ze=require("lru-cache"),Dt=require("stream/promises"),Ot=require("tar"),Tt=require("wait-on"),K=require("y-protocols/awareness"),fe=require("y-protocols/sync"),Rt=require("yaml"),$e=require("./html-dP5_4zu1.js");require("@blocklet/pages-kit/types/state");const N=t=>t&&t.__esModule?t:{default:t};function le(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const a in t)if(a!=="default"){const s=Object.getOwnPropertyDescriptor(t,a);Object.defineProperty(e,a,s.get?s:{enumerable:!0,get:()=>t[a]})}}return e.default=t,Object.freeze(e)}const q=le(lt),je=N(pt),E=N(dt),Ne=N(ft),V=N(Z),De=N(gt),Me=N(p),ge=le(wt),v=le(It),Oe=N(Pt),Te=N(bt),Re=N(At),Fe=N(Et),Ct=N(jt),kt=N(Tt),H=le(Rt),vt=y.DataTypes.sqlite.DATE.parse;y.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):vt(t,e);const F=new y.Sequelize({dialect:"sqlite",storage:u.databaseUrl,benchmark:process.env.ENABLE_SEQUELIZE_BENCHMARK==="true",retry:{match:[/SQLITE_BUSY/],name:"query",max:10},logging:process.env.ENABLE_SEQUELIZE_LOGGING==="true"?console.log:!1});F.query("PRAGMA journal_mode = WAL;");F.query("PRAGMA synchronous = normal;");F.query("PRAGMA journal_size_limit = 67108864;");F.query("PRAGMA cache_size = 10000;");process.on("SIGINT",async()=>{await F.close(),process.exit(0)});process.on("SIGTERM",async()=>{await F.close(),process.exit(0)});async function Lt(t,e){try{if(t.getDialect()!=="sqlite")return;const[a]=await t.query("SELECT 1");if(!a||a.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(a){if(a.name==="SequelizeConnectionError"||a?.message&&/closed!/.test(a.message))return;console.error("Failed to cleanup SQLite memory",e,a)}}let Se=null;Se&&clearInterval(Se);Se=setInterval(async()=>{u.logger.info("Start cleanupSqliteMemory"),await Lt(F,u.databaseUrl),u.logger.info("End cleanupSqliteMemory")},60*1e3*10);const _t="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",we="page",Ie="trigger-reload-project-resource",Ce=_t,Ut="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",$t="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class ke extends y.Model{}ke.init({id:{type:y.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:y.DataTypes.UUIDV4},projectId:{type:y.DataTypes.UUID,allowNull:!1},componentId:{type:y.DataTypes.STRING,allowNull:!1}},{sequelize:F,tableName:"ProjectComponents",timestamps:!1});const Nt="SLUG_INVALID",W=t=>({error:"slugInvalid",code:Nt,field:"slug",message:t}),Mt={error:"slugRequired",code:"SLUG_REQUIRED",field:"slug",message:()=>"Project slug is required"},Ft={error:"slugAlreadyExists",code:"SLUG_EXISTS",field:"slug",message:t=>`Project slug "${t}" already exists`},qt=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/\\:]/],qe=t=>{if(!t)return"";if(t==="/")return"/";const e=_.withoutTrailingSlash(t);return _.withLeadingSlash(e)||"/"},xt=t=>t.did===$t;class $ extends y.Model{static async getProjectByIdOrSlug(e,a){return e?$.findOne({where:{[y.Op.or]:[{id:e},{slug:e}],...a?.createdBy?{createdBy:a.createdBy}:{}}}):null}static async validateProjectSlug({slug:e,projectId:a}){if(e==null)return null;if(e==="")return Mt;const s=e==="/"?"/":_.withoutTrailingSlash(_.withLeadingSlash(e)),o=qe(s);if(s!=="/"&&s.endsWith("/"))return W(r=>`Project slug "${r}" cannot end with /`);if(/\/{2,}/.test(s))return W(r=>`Project slug "${r}" cannot contain consecutive /`);if(/\s/.test(s))return W(r=>`Project slug "${r}" cannot contain whitespace`);if(qt.some(r=>r.test(s)))return W(r=>`Project slug "${r}" contains invalid characters`);if(E.default.components?.filter(r=>r.mountPoint&&!xt(r)).some(r=>qe(r.mountPoint)===o))return W(r=>`Project slug "${r}" conflicts with existing blocklet`);const l=await $.findOne({where:{slug:s}});return l&&l?.id!==a?Ft:null}}$.init({id:{type:y.DataTypes.UUID,defaultValue:y.DataTypes.UUIDV4,primaryKey:!0},name:{type:y.DataTypes.STRING,allowNull:!1},description:y.DataTypes.TEXT,createdAt:y.DataTypes.DATE,updatedAt:y.DataTypes.DATE,createdBy:{type:y.DataTypes.STRING,allowNull:!1},updatedBy:{type:y.DataTypes.STRING,allowNull:!1},slug:y.DataTypes.STRING,icon:y.DataTypes.STRING,pinnedAt:y.DataTypes.DATE,useAllResources:y.DataTypes.BOOLEAN,npmSecret:y.DataTypes.STRING,relatedBlocklets:{type:y.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:y.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}},meta:{type:y.DataTypes.JSON,allowNull:!0}},{sequelize:F,paranoid:!0,indexes:[{name:"projects_slug_unique",unique:!0,fields:["slug"]},{name:"projects_created_by",fields:["createdBy"]},{name:"projects_pinned_updated_meta_not_null",fields:[{name:"pinnedAt",order:"DESC"},{name:"updatedAt",order:"DESC"}],where:{meta:{[y.Op.ne]:null}}}]});$.hasMany(ke,{foreignKey:"projectId",as:"components"});async function x(t){try{return await V.default.promises.access(t,V.default.constants.F_OK),!0}catch{return!1}}function He(t,e){return new Promise((a,s)=>{const o=V.default.createReadStream(t),n=V.default.createWriteStream(e);o.on("error",s),n.on("error",s),n.on("finish",a),o.pipe(n)})}async function Je(t,e){await V.default.promises.mkdir(e,{recursive:!0});const a=await V.default.promises.readdir(t,{withFileTypes:!0});for(const s of a){const o=Me.default.join(t,s.name),n=Me.default.join(e,s.name);s.isDirectory()?await Je(o,n):await He(o,n)}}async function Bt(t,e){(await V.default.promises.stat(t)).isDirectory()?await Je(t,e):await He(t,e)}class ee extends y.Model{}ee.init({id:{type:y.DataTypes.UUID,primaryKey:!0,defaultValue:y.DataTypes.UUIDV4},projectId:{type:y.DataTypes.UUID,allowNull:!1,comment:"Project ID"},urlPath:{type:y.DataTypes.STRING(512),allowNull:!1,unique:!0,comment:"URL path, e.g. /project-slug/page-slug or /en/project-slug/page-slug"},projectSlug:{type:y.DataTypes.STRING,allowNull:!0,comment:"Project slug"},pageSlug:{type:y.DataTypes.STRING,allowNull:!1,comment:"Page slug"},pageId:{type:y.DataTypes.UUID,allowNull:!1,comment:"Page ID"},routeId:{type:y.DataTypes.UUID,allowNull:!0,comment:"Route ID (for draft mode)"},locale:{type:y.DataTypes.STRING(10),allowNull:!0,comment:"Locale code, e.g. en, zh"},defaultLocale:{type:y.DataTypes.STRING(10),allowNull:!0,comment:"Default locale"},shouldRedirect:{type:y.DataTypes.BOOLEAN,defaultValue:!1,comment:"Whether this URL should redirect"},mainPage:{type:y.DataTypes.BOOLEAN,defaultValue:!1,comment:"Whether this is the main page"},isPublic:{type:y.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0,comment:"Whether the page is public"},publishedAt:{type:y.DataTypes.BIGINT,allowNull:!0,comment:"Published timestamp"},locales:{type:y.DataTypes.JSON,allowNull:!0,comment:"Supported locales array"},createdAt:y.DataTypes.DATE,updatedAt:y.DataTypes.DATE},{sequelize:F,tableName:"PageUrlMappings",timestamps:!0,indexes:[{name:"idx_project_id",fields:["projectId"]},{name:"idx_url_path",unique:!0,fields:["urlPath"]},{name:"idx_page_id",fields:["pageId"]}]});function Gt(t){const{projectId:e,projectSlug:a,state:s}=t,o=a||e,n=Ve.union(E.default.env.languages?.map(c=>c.code)||[],s.supportedLocales?.map(c=>c.locale)||[]),l={},r=(c,g)=>{o&&(l[_.joinURL("/",o,c)]={...g,shouldRedirect:!0,mainPage:!0}),l[_.joinURL("/",e,c)]={...g,shouldRedirect:!0,mainPage:!0};for(const A of n){const D={...g,locale:A};l[_.joinURL("/",A,e,c)]=D,o&&(l[_.joinURL("/",A,o,c)]=D)}};for(const c of s.pageIds||[]){const g=s.pages?.[c];if(!g||!g.isPublic)continue;const A={projectId:e,projectSlug:o,pageSlug:g.slug,pageId:c,defaultLocale:n?.[0],locales:n,publishedAt:s.config?.publishedAt,isPublic:g.isPublic};r(g.slug,A)}return l}async function Vt(t,e,a){const s=t.map(n=>n.urlPath),o=await ee.findAll({where:{urlPath:{[y.Op.in]:s},projectId:{[y.Op.ne]:e}},attributes:["urlPath","projectId","projectSlug","pageSlug"],transaction:a,raw:!0});if(o.length>0){u.logger.warn(`[URL Duplicate Warning] Found ${o.length} URL conflicts for project ${e}:`);for(const n of o){const l=t.find(r=>r.urlPath===n.urlPath);if(l){const r=n.projectSlug?_.joinURL(n.projectSlug,n.pageSlug):n.pageSlug;u.logger.warn(` - URL "${n.urlPath}" conflicts with project ${n.projectId} (${r}). Current project trying to use same URL for page: ${l.pageSlug}`)}}u.logger.warn("[URL Duplicate Warning] These duplicate URLs will be ignored during save. Consider using different project slugs or page slugs to avoid conflicts.")}}async function zt(t){const{projectId:e,transaction:a}=t;try{await ee.destroy({where:{projectId:e},transaction:a});const s=Gt(t),o=Object.entries(s).map(([n,l])=>({projectId:e,urlPath:n,projectSlug:l.projectSlug,pageSlug:l.pageSlug,pageId:l.pageId,routeId:l.routeId,locale:l.locale,defaultLocale:l.defaultLocale,shouldRedirect:l.shouldRedirect,mainPage:l.mainPage,isPublic:l.isPublic,publishedAt:typeof l.publishedAt=="number"?l.publishedAt:void 0,locales:l.locales}));if(o.length>0){await Vt(o,e,a);const n=100,l=[];for(let r=0;r<o.length;r+=n){const c=o.slice(r,r+n);l.push(ee.bulkCreate(c,{transaction:a,ignoreDuplicates:!0}))}await Promise.all(l),u.logger.info(`Regenerated ${o.length} URL mappings for project ${e}`)}return o.length}catch(s){throw u.logger.error(`Failed to regenerate URL mappings for project ${e}:`,s),s}}function ne(t){t.observeDeep(e=>{e.some(a=>a.changes.keys.has("updatedAt")||a.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Ke(){return Z.mkdtempSync(p.join(E.default.env.dataDir,"tmp-"))}function re(t,e,a=[]){return Array.isArray(t)?t.flatMap((s,o)=>re(s,e,[...a,o])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([s,o])=>re(o,e,[...a,s])):e(t)?[a]:[]}function U(t){return t.filter(e=>e!=null)}function Ht(t){return new Promise((e,a)=>{let s;process.env.NODE_ENV==="development"?s=p.join(__dirname,"yaml-worker.js"):s=p.join(__dirname,"api/dist/utils/yaml-worker.js");const o=new mt.Worker(s);o.postMessage({payload:t}),o.on("message",n=>{n.status==="success"?e(n.result):a(new Error(`YAML stringify failed in worker: ${n.message}`)),o.terminate()}),o.on("error",n=>{a(n)}),o.on("exit",n=>{n!==0&&a(new Error(`Worker stopped with exit code ${n}`))})})}function xe(t,e){if(t===e)return!0;if(!t||!e)return t===e;const a=Object.keys(t),s=Object.keys(e);if(a.length!==s.length)return!1;if(a.length<10){for(const l of a){if(!(l in e))return!1;const r=t[l],c=e[l];if(r?.blockletId!==c?.blockletId||r?.page?.id!==c?.page?.id||r?.page?.updatedAt!==c?.page?.updatedAt||r?.component?.id!==c?.component?.id||r?.component?.updatedAt!==c?.component?.updatedAt)return!1}return!0}const o=Ne.default.createHash("md5").update(JSON.stringify(t,Object.keys(t).sort())).digest("hex"),n=Ne.default.createHash("md5").update(JSON.stringify(e,Object.keys(e).sort())).digest("hex");return o===n}function Jt(t){t.pages&&Object.keys(t.pages).forEach(a=>{const s=G.getYjsValue(t.pages[a]);s&&s instanceof q.Map&&ne(s)});const e=G.getYjsValue(t.pages);e&&e instanceof q.Map&&e.observe(a=>{a.changes.keys.forEach((s,o)=>{if(s.action==="add"){const n=G.getYjsValue(t.pages[o]);n&&n instanceof q.Map&&ne(n)}})})}function Kt(t){t.routes&&Object.keys(t.routes).forEach(a=>{const s=G.getYjsValue(t.routes?.[a]);s&&s instanceof q.Map&&ne(s)});const e=G.getYjsValue(t.routes);e&&e instanceof q.Map&&e.observe(a=>{a.changes.keys.forEach((s,o)=>{if(s.action==="add"){const n=G.getYjsValue(t.routes?.[o]);n&&n instanceof q.Map&&ne(n)}})})}function Wt(t,e){for(const a of e||Object.keys(t.routes||{})){let s=a,o=[];if(a.includes("-")){const[n,...l]=a.split("-");s=n,o=l||[]}if(t.routes?.[s]!==void 0){t.routes[s].publishedAt=new Date().toISOString();const n=t.routes[s];if(!n||!n.params||n.params.length===0)continue;if(a.includes("-")&&o.length>0){const l=se.getRouteMetaDataByOptionIds(o,n);l&&(l.publishedAt=new Date().toISOString())}if(!e){const l=se.generateParamCombinations({basePath:n.path,params:n.params,routeId:n.id,paramsOptions:n.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const r of l)r.routeMetaData??={},r.routeMetaData.publishedAt=new Date().toISOString()}}}}function me({page:t,route:e,state:a,routeId:s,routePathInfo:o}){u.logger.info(`Executing datasource data assembly, routeId: ${s}, routePathInfo: ${JSON.stringify(o)}`);const n={...je.default(t),id:s,slug:o?.path??e.path,createdAt:e.createdAt,updatedAt:o?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:o?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(o?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const l of a.supportedLocales){if(e.dataSource){let r=e.id;o&&(r=o.paramOptionIds.join("-"));const c=e.dataSource.pathDataMappings?.[r]?.dataCache?.[l.locale]??e.dataSource.pathDataMappings?.[r]?.dataCache?.[a.config.defaultLocale||"en"];if(!c)continue;ut.setPageDataSource(n,a,l.locale,c)}o&&o.routeMetaData&&(o.routeMetaData.publishedAt=new Date().toISOString())}return n}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const Yt=60*60*1e3,Y=new ze.LRUCache({max:300,ttl:Yt,ttlResolution:10*1e3,allowStale:!0});function Xt(t,e=[]){let a=0;const s=Array.from(Y.keys()),o=t.map(n=>_.withoutTrailingSlash(n));for(const n of s)for(const l of o){if($e.matchCacheKey(n,{currentPath:l})){Y.delete(n),a++,u.logger.info(`[Cache CLEAR] key: ${n}`);break}for(const r of e)if($e.matchCacheKey(n,{currentPath:`/${r}${l}`})){Y.delete(n),a++,u.logger.info(`[Cache CLEAR] key: ${n}`);break}}return u.logger.info(`[Cache CLEAR] cleared ${a} entries for paths:`,o),a}function Qt(){const t=Y.size;return Y.clear(),u.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}const Zt=Ve.debounce(Qt,300);E.default.events.on(E.default.Events.envUpdate,Zt);const{uploadToMediaKit:ea}=require("@blocklet/uploader-server"),ve=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,X=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,Be=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,ta=1e4,aa=3e4,te=0,he=1,sa=0,oa=1,Pe=E.default,z=p.join(process.env.BLOCKLET_DATA_DIR,"site-state"),na=["production","draft"],ra=["production"];function ie(t){return t?.replace(/\//g,"|")||""}function We(){const t=Pe.env.languages?.map(a=>({locale:a.code,name:a.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class C extends q.Doc{constructor(e){super(),this.options=e,Z.existsSync(this.draftYjsFilePath)&&q.applyUpdate(this,Z.readFileSync(this.draftYjsFilePath)),this.syncedStore=St.reactive(G.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new K.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static RELEASE_DELAY=5*60*1e3;static PERIODIC_CHECK_INTERVAL=2*60*60*1e3;static sharedInstances={};static periodicCheckTimer;static async safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const a=p.join(z,e),s=p.join(z,`@del-${e}`);await O.rename(a,s)}catch(a){u.logger.error("Failed to safe delete project state dir:",a)}}static async getProjectIds(){return(await $.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return oe.globSync("*/",{cwd:z,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>C.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let a=C.sharedInstances[e];return a||(a=new C({path:p.join(z,e)}),C.sharedInstances[e]=a,a)}static async getProductionState(e){const a=await $.findByPk(e,{attributes:["productionState"]});if(Re.default(a?.productionState)){const s=p.join(z,e,"production"),o=await Le(s,{includeResources:!0})??We();if(!o?.config?.defaultLocale){o.config??={};const n=Pe.env.languages?.map(l=>({locale:l.code,name:l.name}))||[];o.config.defaultLocale=n[0]?.locale}return o}return a?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((a,s)=>this.closeConn(s)),this.awareness.destroy();const e=p.basename(this.options.path);delete C.sharedInstances[e],super.destroy()}initObserver(){Jt(this.syncedStore),Kt(this.syncedStore)}get draftYjsFilePath(){return p.join(this.options.path,"draft.yjs")}static async getStateByProjectId({projectId:e,mode:a,clone:s=!0}){if(a==="draft"){const o=C.shared(e);return s?JSON.parse(JSON.stringify(o.syncedStore)):o.syncedStore}return C.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const a=p.basename(this.options.path);return C.getProductionState(a)}async setState(e,a){if(e==="production"){const n=p.basename(this.options.path),l=je.default(a);await F.transaction(async r=>{await $.update({productionState:l},{where:{id:n},transaction:r});const c=await $.findByPk(n,{attributes:["slug"],transaction:r}),g=await zt({projectId:n,projectSlug:c?.slug,state:a,transaction:r});u.logger.info(`[SiteState] saved ${g} URL mappings for project ${n}`)}),await this.clearPageCacheForRoutes(void 0,a)}const s=await Ze(a,{exportAssets:!1,includeResources:!0}),o=this.getPublishDir(e);await O.mkdir(p.dirname(o),{recursive:!0}),await O.rm(o,{force:!0,recursive:!0}),await O.rename(s,o)}getPublishDir(e){return p.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:a,removed:s},o)=>{const n=e.concat(a,s);if(o!==null){const c=this.conns.get(o);c&&(e.forEach(g=>{c.add(g)}),s.forEach(g=>{c.delete(g)}))}const l=v.createEncoder();v.writeVarUint(l,he),v.writeVarUint8Array(l,K.encodeAwarenessUpdate(this.awareness,n));const r=v.toUint8Array(l);this.conns.forEach((c,g)=>this.send(g,r))};updateHandler=e=>{const a=v.createEncoder();v.writeVarUint(a,te),fe.writeUpdate(a,e);const s=v.toUint8Array(a);this.conns.forEach((o,n)=>this.send(n,s))};ensureDataStructure=()=>{this.transact(()=>{const{supportedLocales:e,pages:a,pageIds:s,config:o,routes:n,routeIds:l}=this.syncedStore;{const r=new Set(Object.keys(a));let c=0;for(;c<s.length;){const g=s[c];r.has(g)?(r.delete(g),c++):s.splice(c,1)}}{const r=new Set(Object.keys(n));let c=0;for(;c<l.length;){const g=l[c];r.has(g)?(r.delete(g),c++):l.splice(c,1)}}e.splice(0,e.length),e.push(...Pe.env.languages.map(r=>({locale:r.code,name:r.name}))),o.defaultLocale=e[0]?.locale;{let r=0;const c=new Set;for(;r<e.length;){const{locale:g}=e[r];c.has(g)?e.splice(r,1):(r++,c.add(g))}}})};send=(e,a)=>{e.readyState!==sa&&e.readyState!==oa&&this.closeConn(e);try{e.send(a,s=>{s&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const a=this.conns.get(e);this.conns.delete(e),a&&K.removeAwarenessStates(this.awareness,Array.from(a),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=p.basename(this.options.path);this.releaseTimer=setTimeout(()=>{u.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},C.RELEASE_DELAY),u.logger.info(`[SiteState] scheduled release for project ${e} in ${C.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=p.basename(this.options.path);u.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Oe.default(async()=>{await O.mkdir(p.dirname(this.draftYjsFilePath),{recursive:!0}),await O.writeFile(this.draftYjsFilePath,q.encodeStateAsUpdate(this))},ta);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:a})=>{const s=p.basename(this.options.path);await it(s);const o=await this.getState("draft"),n=await this.getState("production");await Ae(o,n,{routes:a,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),setImmediate(()=>{this.transact(()=>{Wt(this.syncedStore,a)})}),await this.setState(e,n)};mergeState=async(e,a)=>{const s=JSON.parse(JSON.stringify(a));e.config.fontFamily??={};const o=s.config?.fontFamily,n=e.config?.fontFamily;e.config.fontFamily.title=o?.title||n?.title,e.config.fontFamily.description=o?.description||n?.description,await new Promise((l,r)=>{this.transact(async()=>{try{const c=await Ae(e,a);l(c)}catch(c){r(c)}})})};clearPageCacheForRoutes=async(e,a)=>{const s=p.basename(this.options.path),n=(await $.findByPk(s))?.slug||s;let l=e;(!l||l.length===0)&&(l=a.pageIds??[]),u.logger.info(`[SiteState] clearing page cache for project ${s}, routes:`,l||[]);const r=a.supportedLocales.map(A=>A.locale),c=[],g=l.filter(A=>a.pageIds?.includes(A));for(const A of g){const w=a.pages[A].slug;n&&n!==s&&(n==="/"?c.push(w):c.push(`${n.startsWith("/")?"":"/"}${n}${w}`)),c.push(`/${s}${w}`)}if(c.length>0)try{const A=Xt(c,r);u.logger.info(`[SiteState] cleared ${A} page cache entries for project ${s}, routes:`,l)}catch{}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",o=>this.messageListener(e,new Uint8Array(o)));let a=!0;const s=setInterval(()=>{if(!a)this.conns.has(e)&&this.closeConn(e),clearInterval(s);else if(this.conns.has(e)){a=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(s)}}},aa);e.on("close",()=>{this.closeConn(e),clearInterval(s)}),e.on("pong",()=>{a=!0});{const o=v.createEncoder();v.writeVarUint(o,te),fe.writeSyncStep1(o,this),this.send(e,v.toUint8Array(o));const n=this.awareness.getStates();if(n.size>0){const l=v.createEncoder();v.writeVarUint(l,he),v.writeVarUint8Array(l,K.encodeAwarenessUpdate(this.awareness,Array.from(n.keys()))),this.send(e,v.toUint8Array(l))}}};messageListener=(e,a)=>{try{const s=v.createEncoder(),o=ge.createDecoder(a),n=ge.readVarUint(o);switch(u.logger.info(`[SiteState] messageListener, messageType: ${n}`),n){case te:v.writeVarUint(s,te),fe.readSyncMessage(o,s,this,null),u.logger.info(`[SiteState] messageListener, encoder length: ${v.length(s)}`),v.length(s)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(s)));break;case he:{K.applyAwarenessUpdate(this.awareness,ge.readVarUint8Array(o),e);break}default:u.logger.warn(`Unsupported messageType ${n}`)}}catch(s){u.logger.error(s)}this.save()};static async pageUrlMap(e,a){if(u.logger.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${a}`),e==="production"){const n=a?{projectId:a}:{},l=await ee.findAll({where:n,raw:!0}),r={};for(const c of l)r[c.urlPath]={projectId:c.projectId,projectSlug:c.projectSlug,pageSlug:c.pageSlug,pageId:c.pageId,routeId:c.routeId,locale:c.locale,defaultLocale:c.defaultLocale,shouldRedirect:c.shouldRedirect,mainPage:c.mainPage,isPublic:c.isPublic,publishedAt:c.publishedAt,locales:c.locales};return u.logger.info(`[SiteState] loaded ${l.length} URL mappings from database`),r}let s=[];a?s=[a]:s=await this.getProjectIds();let o={};if(s?.length){u.logger.info("[SiteState] find project infos from database, projectIds: ",s);const n=30,l=De.default(5);for(let r=0;r<s.length;r+=n){const c=s.slice(r,r+n);u.logger.info(`[SiteState] processing project batch ${r/n+1}, ids: `,c);const g=await $.findAll({where:{id:{[y.Op.in]:c}},attributes:{exclude:["relatedBlocklets"]}});await Promise.all(g?.map(A=>l(async()=>{const D=A.id,w=A.slug||D,h={},d=await C.getStateByProjectId({projectId:A.id,mode:e,clone:!1}),b=Ct.default(E.default.env.languages?.map(j=>j.code)||[],d.supportedLocales?.map(j=>j.locale)||[]),T=(j,P)=>{w&&(h[_.joinURL("/",w,j)]={...P,shouldRedirect:!0,mainPage:!0}),h[_.joinURL("/",D,j)]={...P,shouldRedirect:!0,mainPage:!0};for(const k of b){const S={...P,locale:k};h[_.joinURL("/",k,D,j)]=S,w&&(h[_.joinURL("/",k,w,j)]=S)}};if(e==="draft")for(const j of d.routeIds||[]){const P=d?.routes?.[j];if(!P)continue;if(P.params&&P.params.length>0){const I=se.generateParamCombinations({basePath:P.path,params:P.params,routeId:P.id,paramsOptions:P.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const i of I){const f=i.path,m={projectId:D,projectSlug:w,pageSlug:f,pageId:P.displayTemplateId||"",routeId:j,defaultLocale:b?.[0],locales:b,publishedAt:d.config.publishedAt,isPublic:P.isPublic&&i?.routeMetaData?.isPublic};T(f,m)}}const k=P.path,S={projectId:D,projectSlug:w,pageSlug:k,pageId:P.displayTemplateId||"",routeId:j,defaultLocale:b?.[0],locales:b,publishedAt:d.config.publishedAt,isPublic:P.isPublic};T(k,S)}for(const j of d.pageIds||[]){const P=d.pages[j];if(!P)continue;const k=P.slug,S=A.slug||D,I={projectId:D,projectSlug:S,pageSlug:k,pageId:j,defaultLocale:b?.[0],locales:b,publishedAt:d.config.publishedAt,isPublic:P.isPublic,templateConfig:P.templateConfig};T(k,I)}o={...o,...h}})))}}return u.logger.info("[SiteState] success get pageUrlMap"),o}getDocumentSize(){return q.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[a,s]of Object.entries(C.sharedInstances)){const o=s.getDocumentSize();e.push({projectId:a,sizeInBytes:o,sizeInMB:`${(o/(1024*1024)).toFixed(2)} MB`,activeConnections:s.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),u.logger.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,u.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(C.sharedInstances).length,a=[],s=[];for(const[o,n]of Object.entries(C.sharedInstances))n.conns.size===0?a.push({projectId:o,instance:n}):s.push({projectId:o,connections:n.conns.size});if(u.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${s.length}, without connections: ${a.length}`),a.length>0){u.logger.info(`[SiteState] releasing ${a.length} instances without connections:`,a.map(n=>n.projectId));let o=0;for(const{projectId:n,instance:l}of a)try{u.logger.info(`[SiteState] releasing instance due to periodic check: ${n}`),l.destroy(),o++}catch(r){u.logger.error(`[SiteState] failed to release instance ${n} during periodic check:`,r)}u.logger.info(`[SiteState] periodic check completed: ${o}/${a.length} instances released successfully`)}else e>0?u.logger.debug("[SiteState] periodic check: all instances have active connections"):u.logger.debug("[SiteState] periodic check: no instances exist")}}async function ia(t,e,a){if(!t||!await x(t)||!(await O.lstat(t)).isFile())return null;let o=a[t];return o||(o=(async()=>{try{return(await ea({filePath:t,fileName:e}))?.data?.filename}catch(n){return u.logger.error(`Failed to upload asset ${t}:`,n),null}})(),a[t]=o),o}const Ye=async(t,e)=>{const a=p.basename(t),s=await Ee.call({name:Ce,path:_.joinURL("/uploads",a),responseType:"stream",method:"GET"});if(s.status>=200&&s.status<400){const o=Z.createWriteStream(e);await Dt.pipeline(s.data,o)}else throw new Error(`download asset failed ${s.status}`)},Xe=async(t,e)=>{await Promise.all(t.map(async a=>{try{await Ye(a,p.join(e,p.basename(a)))}catch(s){u.logger.error(`Failed to export assets: ${a}, ${s}`)}}))};function Qe(t){return ve.test(t)?[t]:X.test(t)?(Be.lastIndex=0,Array.from(t.matchAll(Be)).map(a=>a[1]).filter(a=>!!a)):[]}async function ae(t,e,a){const{getFilename:s,exportAssets:o,useWorker:n}=a,l=p.join(e,s(t));await O.mkdir(p.dirname(l),{recursive:!0});const r=n?await Ht(t):H.stringify(t);if(await O.writeFile(l,r),o){const g=re(t,A=>typeof A=="string"&&(ve.test(A)||X.test(A))).map(A=>{const D=Te.default(t,A);return Qe(D)}).flat().filter(Boolean);await Xe(g,p.dirname(l))}}const be=new ze.LRUCache({max:100,ttl:1*60*1e3});async function Ge(t,e,a){const s=re(t,r=>typeof r=="string"&&(ve.test(r)||X.test(r))),o=De.default(2),n=s.map(r=>o(async()=>{try{const c=Te.default(t,r),g=Qe(c);for(const A of g){const D=p.basename(A),w=a.getFilePath(A,r),h=w?`${w}:${D}`:D,d=be.get(h);if(d){X.test(c)||Fe.default(t,r,d);return}const b=await ia(w,D,e);b&&(X.test(c)||Fe.default(t,r,b),be.set(h,b))}}catch(c){u.logger.error(`Failed to process upload for path ${r.join(".")}:`,c.message||c.reason)}})),l=await Promise.allSettled(n);a.onFinish?.(l)}async function Ze(t,{exportAssets:e,pageIds:a="all",componentIds:s="all",rawConfig:o,includeResources:n=!1,routeIds:l="all"}={}){const r=a==="all"?t.pageIds:a,c=yt.getComponentDependencies({state:t,pageIds:r,componentIds:s==="all"?Object.keys(t.components):s});Object.entries(t.components).forEach(([i,f])=>{f.data?.renderer?.type==="component-template"&&c.push(i)});const g=l==="all"?t.routeIds:l,A=i=>({id:i.id,name:i.name,isTemplateSection:i.isTemplateSection??!1,templateDescription:i.templateDescription,component:i.component,config:i.config,visibility:i.visibility,sections:i?.sectionIds?U(i?.sectionIds?.map(f=>{const m=i.sections?.[f];return m&&A(m)})):void 0}),D=(i,f)=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,meta:i.locales?.[f]??{},sections:U(i.sectionIds.map(m=>{const R=i.sections[m];return R&&A(R)})),dataSource:Object.fromEntries(Object.entries(i.dataSource||{}).map(([m,R])=>[m,R?.[f]??{}]))}),w=i=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,path:i.path,handler:i.handler,isPublic:i.isPublic??!0,params:i.params??[],enabledGenerate:i.enabledGenerate??!1,displayTemplateId:i.displayTemplateId,dataSource:i.dataSource}),h=U(g.map(i=>{const f=t.routes[i];return f&&w(f)})),d=U(t.supportedLocales.map(i=>i.locale).flatMap(i=>r.map(f=>{const m=t.pages[f];return m&&{locale:i,slug:m.slug,page:D(m,i)}}))),b=Ke(),T=p.join(b,"pages");await O.mkdir(T,{recursive:!0});const j=p.join(b,"components");await O.mkdir(j,{recursive:!0});const P=p.join(b,"routes");await O.mkdir(P,{recursive:!0});for(const{locale:i,slug:f,page:m}of d)await ae(m,T,{getFilename:()=>`${ie(f)||"index"}.${i}.yml`,exportAssets:e,useWorker:!0});for(const i of h)await ae(i,P,{getFilename:()=>`${ie(i.path)||"index"}.yml`,exportAssets:e});for(const i of c){const f=t.components[i]?.data;f&&await ae(f,j,{getFilename:m=>`${m.name||"unnamed"}.${m.id}.yml`,exportAssets:e})}const k=p.join(b,".blocklet/pages/pages.config.yml");await O.mkdir(p.dirname(k),{recursive:!0});const S={pages:U(r.map(i=>{const f=t.pages[i];return f&&{id:i,slug:f.slug}})),routes:U(g.map(i=>{const f=t.routes[i];return f&&{id:i,path:f.path}})),components:U(c.map(i=>{const f=t.components[i]?.data;return f&&{id:i,name:f.name}})),...n?{resources:{components:U(Object.keys(t.resources?.components||{}).filter(i=>c.includes(i)).map(i=>({id:i,name:t.resources?.components?.[i]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};await O.writeFile(k,H.stringify(S));const I=p.join(b,"config.source.json");if(o&&await O.writeFile(I,JSON.stringify(o)),n){const i=p.join(b,"resources"),f=p.join(i,"components");await O.mkdir(f,{recursive:!0});for(const M of Object.keys(t?.resources?.components??{}).filter(L=>c.includes(L))){const L=t.resources?.components?.[M]?.component;L&&await ae(L,f,{getFilename:B=>`${B.name||"unnamed"}.${B.id}.yml`,exportAssets:e})}const m=p.join(b,"chunks");await O.mkdir(m,{recursive:!0});const R=await ca();for(const M of Object.keys(t?.resources?.components??{}).filter(L=>c.includes(L))){const L=t.resources?.components?.[M]?.component;if(L&&L.renderer?.type==="react-component"){const B=L.renderer?.chunks??[];if(B?.length>0)for(const J of B){const _e=p.join(m,J),de=R?.[J];try{de&&await x(de)&&!await x(_e)&&await O.copyFile(de,_e)}catch(ct){u.logger.error(`copy chunk ${J} error`,ct.message)}}}}}return b}async function Le(t,{importAssets:e,includeResources:a}={}){if(!await x(t))return null;let s,o=!1;try{(await O.lstat(t)).isDirectory()?s=t:/\.(tgz|gz|tar)$/.test(t)&&(o=!0,s=Ke(),await Ot.x({file:t,C:s}));const r=(await oe.glob("**/.blocklet/pages/pages.config.yml",{cwd:s,absolute:!0}))[0],c=r&&p.join(p.dirname(r),"../../pages"),g=r&&p.join(p.dirname(r),"../../components"),A=r&&p.join(p.dirname(r),"../../routes");if(!r)return null;const D=await O.readFile(r,"utf-8"),w=H.parse(D),h=async(S,I,i)=>{let f=p.join(S,`${I}${i?`.${i}`:""}.yml`);if(!await x(f)&&(f=p.join(S,I,`index${i?`.${i}`:""}.yml`),!await x(f))||!(await O.lstat(f)).isFile())return null;const R=await O.readFile(f,"utf-8");return H.parse(R)},d=async(S,I)=>{try{const f=(await oe.glob(`*.${I}.yml`,{cwd:S,absolute:!0}))[0];if(!f)return null;const m=await O.readFile(f,"utf-8");return H.parse(m)}catch(i){u.logger.error("parse component error",i)}return null},b=async(S,I)=>{let i=p.join(S,`${I}.yml`);if(!await x(i)&&(i=p.join(S,I,"index.yml"),!await x(i))||!(await O.lstat(i)).isFile())return null;const m=await O.readFile(i,"utf-8");return H.parse(m)},T=U(await Promise.all(w.pages.map(async({slug:S})=>{const I=U(await Promise.all(w.supportedLocales.map(async({locale:m})=>{const R=c?await h(c,ie(S),m):void 0;if(R)return{locale:m,page:R};const M=c?await h(c,S,m):void 0;return M&&{locale:m,page:M}}))),i=I[0]?.page;if(!i)return null;const f=i.sections.map(ht.unzipSection);return{id:i.id||Ue.nextId(),createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,slug:S,sections:Object.fromEntries(f.map(m=>[m.id,m])),sectionIds:f.map(m=>m.id),locales:Object.fromEntries(I.map(({locale:m,page:R})=>[m,R.meta])),dataSource:i.dataSource?Object.fromEntries([...new Set(I.flatMap(({page:m})=>Object.keys(m.dataSource??{})))].map(m=>[m,Object.fromEntries(I.map(({locale:R,page:M})=>{const L=M.dataSource?.[m];return[R,L||{}]}))])):Object.fromEntries([...new Set(I.flatMap(({page:m})=>m.sections.map(R=>R.id)))].map(m=>[m,Object.fromEntries(I.map(({locale:R,page:M})=>{const L=M.dataSource?.[m];if(L)return[R,L];const B=M.sections.find(J=>J.id===m);return[R,B?.properties||{}]}))]))}}))),j=U(await Promise.all((w?.routes||[]).map(async({path:S})=>{const I=A?await b(A,ie(S)):void 0;return{...I,id:I?.id||Ue.nextId(),createdAt:I?.createdAt??new Date().toISOString(),updatedAt:I?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:I?.path??`/${I?.id}`,params:I?.params,handler:I?.handler??"Pages Kit",isPublic:I?.isPublic??!0,enabledGenerate:I?.enabledGenerate??!1,displayTemplateId:I?.displayTemplateId??void 0,dataSource:I?.dataSource??{}}}))),P=g?U(await Promise.all((w.components||[]).map(async({id:S})=>d(g,S)))):[];if(e){const S=(...I)=>{u.logger.info(`[${o?p.basename(t):p.basename(p.join(t,"../../../../"))}] importAssets:`,...I)};try{S("wait image-bin api ready"),await kt.default({resources:[`${Ee.getComponentWebEndpoint(u.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:f=>f>=200&&f<=500}),S("image-bin api is ready");const I={},i={};S("start to upload assets"),await Promise.allSettled([Ge(P,I,{getFilePath:f=>g&&p.join(g,f),onFinish:f=>{S(`upload ${f.length} component assets`)}}),Ge(T,i,{getFilePath:(f,m)=>{const R=Te.default(T,m.slice(0,1));return c&&p.join(c,p.dirname(R.slug),f)},onFinish:f=>{S(`upload ${f.length} page assets`)}})]),S("upload assets done"),be.clear(),global.gc&&global.gc()}catch(I){S("Error during asset import:",I)}}const k={};if(a){const S=r&&p.join(p.dirname(r),"../../resources/components"),I=U(await Promise.all((w.resources?.components||[]).map(async({id:i})=>d(S,i))));I.length>0&&(k.components=Object.fromEntries(I.map((i,f)=>[i.id,{index:f,component:i}])))}return{supportedLocales:w.supportedLocales,pageIds:T.map(S=>S.id),components:Object.fromEntries(P.map((S,I)=>[S.id,{index:I,data:S}])),pages:Object.fromEntries(T.map(S=>[S.id,S])),config:w.config||{},resources:k,routeIds:j.map(S=>S.id),routes:Object.fromEntries(j.map(S=>[S.id,S])),dataSourceIds:[],dataSources:{}}}finally{o&&s&&await O.rm(s,{force:!0,recursive:!0})}}async function Ae(t,e,{routes:a,mergeMode:s="byUpdateTime",deleteRoutes:o=!1,publishMode:n=void 0}={}){try{n&&u.clearPreloadComponentsCacheByMode(n)}catch(w){u.logger.error("clear preload page cache error",{error:w})}const{pages:l,pageIds:r,routeIds:c,routes:g,supportedLocales:A}=t;if(n==="production"){let w=a??[],h=null;for(const d of c??[]){const b=g?.[d];if(b?.params&&b?.params.length>0&&b?.paramsOptions&&b?.paramsOptions.length>0){const T=se.generateParamCombinations({basePath:b.path,params:b.params,routeId:b.id,paramsOptions:b.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),j=Object.fromEntries(T.map(P=>[`${d}-${P.paramOptionIds.join("-")}`,P]));h={...h||{},...j},a||(w=[...w,...T.map(P=>`${d}-${P.paramOptionIds.join("-")}`)])}else a||w.push(d)}u.logger.info("routeIds to be published: ",w);for(const d of w){let b=d;if(b.includes("-")){const[P]=b.split("-");b=P}const T=g?.[b];if(!T){const P=e.pageIds.indexOf(b);P!==-1&&o&&(e.pageIds.splice(P,1),delete e.pages[b]);for(const k of e.pageIds)k.includes(`${b}-`)&&(e.pageIds.splice(e.pageIds.indexOf(k),1),delete e.pages[k]);u.logger.info("delete main route page",b);continue}if(d.includes("-")&&!h?.[d]){const P=e.pageIds.indexOf(d);P!==-1&&o&&(e.pageIds.splice(P,1),delete e.pages[d]),u.logger.info("delete page",d);continue}if(!T.displayTemplateId){u.logger.info("no display template",d);continue}const j=l[T.displayTemplateId];if(!j){u.logger.info("no template page",d);continue}if(e.pageIds.includes(d)){if(u.logger.info("has need update page",d),s==="replace")e.pages[d]=me({page:j,route:T,state:t,routeId:d,routePathInfo:h?.[d]}),u.logger.info("replace page",d);else if(s==="byUpdateTime"){const P=e.pages[T.id];(!P||T.updatedAt&&T.updatedAt>P.updatedAt)&&(e.pages[d]=me({page:j,route:T,state:t,routeId:d,routePathInfo:h?.[d]}),u.logger.info("replace page by update time",d))}}else e.pageIds.push(d),e.pages[d]=me({page:j,route:T,state:t,routeId:d,routePathInfo:h?.[d]}),u.logger.info("add page",d)}if(o&&!a)for(const d of e.pageIds)w?.includes(d)||(delete e.pages[d],u.logger.info("delete page",d)),e.pageIds=[...e.pageIds].filter(b=>w?.includes(b))}else{for(const w of r){const h=l[w];if(h)if(e.pageIds.includes(h.id)){if(s==="replace")e.pages[h.id]=h;else if(s==="byUpdateTime"){const d=e.pages[h.id];(!d||h.updatedAt&&h.updatedAt>d.updatedAt)&&(e.pages[h.id]=h)}}else e.pageIds.push(h.id),e.pages[h.id]=h}for(const w of c){const h=g[w];if(h)if(e.routeIds.includes(h.id)){if(s==="replace")e.routes[h.id]=h;else if(s==="byUpdateTime"){const d=e.routes[h.id];(!d||h.updatedAt&&h.updatedAt>d.updatedAt)&&(e.routes[h.id]=h)}}else e.routeIds.push(h.id),e.routes[h.id]=h}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...je.default(A)),o)for(const w of Object.keys(e.components))delete e.components[w];let D=JSON.parse(JSON.stringify(t.components));D=Object.fromEntries(await Promise.all(Object.entries(D).map(async([w,h])=>{const d=await et(h?.data);return[w,{...h,data:d}]}))),Object.assign(e.components,D),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Re.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const et=u.memoizeWithFs(async t=>{if(!Re.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:a}=t?.renderer||{};if(a||e&&e.includes("PROPERTIES_SCHEMA"))try{const s=await u.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,a);s&&s.length>0&&t&&(t.properties={},s.forEach((o,n)=>{t?.properties&&(t.properties[o.id]={index:n,data:o})}))}catch(s){u.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:s})}}return t},{subdir:"getPropertiesFromCode"});let ce,Q,ue,pe;const tt=()=>Ee.getResources({types:[{did:Ce,type:we},{did:Ut,type:we}]}),ca=async()=>{const t=tt(),e={};for(const a of t){const o=(await oe.glob("**/.blocklet/pages/pages.config.yml",{cwd:a.path,absolute:!0}))[0],n=o&&p.join(p.dirname(o),"../../chunks");if(n&&await x(n)){const l=await O.readdir(n);for(const r of l)e[r]=p.join(n,r)}}return e};function at(){return ce=(async()=>{const t=tt();Q=(await Promise.all(t.map(async a=>{const s=a.path?await Le(a.path,{importAssets:!1}):void 0;return s?{blockletId:a.did,state:s,blockletTitle:a.title}:void 0}))).filter(a=>!!a),ue=Q.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.pages).map(o=>o?[o?.id,{page:o,blockletId:s.blockletId}]:[]))),{});const e=Q.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.components).map(o=>[o.data.id,{blockletId:s.blockletId,component:o.data}]))),{});pe=Object.fromEntries(await Promise.all(Object.entries(e).map(async([a,s])=>{const o=await et(s.component);return[a,{...s,component:o}]})))})(),ce}function st(t){const e=Oe.default(async()=>{await at().catch(a=>{u.logger.error("load resource states error",{error:a})}),await t?.({states:Q,pages:ue,components:pe})},3e3,{leading:!1,trailing:!0});return e(),E.default.events.on(E.default.Events.componentAdded,e),E.default.events.on(E.default.Events.componentRemoved,e),E.default.events.on(E.default.Events.componentStarted,e),E.default.events.on(E.default.Events.componentStopped,e),E.default.events.on(E.default.Events.componentUpdated,e),E.default.events.on(Ie,e),()=>{E.default.events.off(E.default.Events.componentAdded,e),E.default.events.off(E.default.Events.componentRemoved,e),E.default.events.off(E.default.Events.componentStarted,e),E.default.events.off(E.default.Events.componentStopped,e),E.default.events.off(E.default.Events.componentUpdated,e),E.default.events.off(Ie,e)}}const ot=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),nt=globalThis;nt[ot]?.();nt[ot]=st(async({pages:t,components:e})=>{const a=await C.getProjectIds();u.logger.info(`start update resource states projects(${a.length})`,a);const s=De.default(10);await Promise.race([new Promise(o=>{setTimeout(()=>{o({})},30*1e3)}),Promise.all(a.map(o=>s(async()=>{rt({projectId:o,pages:t,components:e})})))]).catch(o=>{u.logger.error("update resource states failed:",o)})});C.startPeriodicCheck();process.on("beforeExit",()=>{C.stopPeriodicCheck()});process.on("SIGINT",()=>{C.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{C.stopPeriodicCheck(),process.exit(0)});async function rt({projectId:t,pages:e,components:a}){const s=C.sharedInstances[t];if(!s){u.logger.info(`projectId: ${t} not found in sharedInstances`);return}const o=s.syncedStore.resources.pages,n=s.syncedStore.resources.components,l=await $.findByPk(t,{attributes:{exclude:["productionState","relatedBlocklets"]}});let r;if(l?.useAllResources)r=a;else{const D=(await ke.findAll({where:{projectId:t}})).map(w=>w.componentId);r=Object.fromEntries(Object.entries(a||{}).filter(([w])=>D.includes(w)))}const c=!xe(o,e),g=!xe(n,r);c||g?s.transact(()=>{c&&(s.syncedStore.resources.pages=e,u.logger.info(`[${t}] pages resources updated: ${Object.keys(e||{}).length} pages`)),g&&(s.syncedStore.resources.components=r,u.logger.info(`[${t}] components resources updated: ${Object.keys(r||{}).length} components`))}):u.logger.info(`[${t}] resource states unchanged, skipping update`),u.logger.info(`update [${t}] resource states summary:`,{pages:Object.keys(s.syncedStore.resources.pages||{}).length,components:Object.keys(s.syncedStore.resources.components||{}).length,pagesChanged:c,componentsChanged:g})}const ye=new Map;async function it(t){if(!ye.has(t)){const e=Oe.default(async a=>rt({projectId:a,pages:ue,components:pe}),3e3);ye.set(t,e)}return ye.get(t)(t)}async function la(){u.logger.info("trigger reload all project resource"),E.default.events.emit(Ie)}async function ua({ensureLoaded:t=!0}={}){return t&&(ce??=at(),await ce),{states:Q,pages:ue,components:pe}}exports.COMPONENT_DID=Ce;exports.PUBLISH_MODES=ra;exports.Project=$;exports.RESOURCE_TYPE=we;exports.SITE_STATE_PATH=z;exports.STATE_MODES=na;exports.SiteState=C;exports.copyRecursive=Bt;exports.downloadAsset=Ye;exports.downloadAssets=Xe;exports.fromPackage=Le;exports.getDefaultState=We;exports.getResourceStates=ua;exports.initPackResourceStates=st;exports.mergeState=Ae;exports.toPackage=Ze;exports.triggerReloadAllProjectResource=la;exports.updateResourceStatesByProjectId=it;
|
package/lib/cjs/components.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-aaduHC9E.js");require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/builtin");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/sdk/lib/config");require("lodash/isEmpty");require("lru-cache");require("node-fetch");require("p-limit");require("ufo");exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=e.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=e.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS;exports.clearPreloadComponentsCache=e.clearPreloadComponentsCache;exports.clearPreloadComponentsCacheByInstanceId=e.clearPreloadComponentsCacheByInstanceId;exports.clearPreloadComponentsCacheByMode=e.clearPreloadComponentsCacheByMode;exports.getComponentFromState=e.getComponentFromState;exports.getComponentFromStateByName=e.getComponentFromStateByName;exports.getExportSchemaValueFromCode=e.getExportSchemaValueFromCode;exports.getPreloadComponent=e.getPreloadComponent;exports.getPreloadComponents=e.getPreloadComponents;exports.getPreloadComponentsCacheKey=e.getPreloadComponentsCacheKey;exports.skipTranspileComponent=e.skipTranspileComponent;
|
package/lib/cjs/project-html.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-
|
|
1
|
+
"use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-aaduHC9E.js"),T=require("./chunks/html-dP5_4zu1.js"),W=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),A=require("@blocklet/pages-kit/utils/preload"),F=require("@blocklet/sdk/lib/component"),O=require("express"),P=require("fs"),J=require("lodash/get"),z=require("mustache"),j=require("ufo"),y=n=>n&&n.__esModule?n:{default:n},G=y(B),s=y(E),Y=y(C),Q=y(J),V=y(z),X=(n={})=>{const e={data:new Map,timers:new Map,set:(t,d,u=n.ttl||36e5)=>{n.max&&e.data.size>=n.max&&e.delete(e.data.keys().next().value),e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.set(t,setTimeout(()=>e.delete(t),u)),e.data.set(t,d)},get:t=>e.data.get(t),has:t=>e.data.has(t),delete:t=>(e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.delete(t),e.data.delete(t)),clear:()=>{e.data.clear();for(const t of e.timers.values())clearTimeout(t);e.timers.clear()}};return e},q=X({max:1,ttl:1e3*30});D.getWallet();const Z=new U.WalletAuthenticator;new H.WalletHandlers({authenticator:Z,tokenStorage:new G.default({dbPath:Y.default.join(s.default.env.dataDir,"auth.db")})});const ee=new K.BlockletService,te=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await ee.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ne=["/assets/"];function oe({app:n,viteDevServer:e,state:t}){let d;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(f,k,S)=>{const i=f.originalUrl;d=await e.transformIndexHtml(i,o),S()})}else d=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const u=O.Router();u.use((o,f,k)=>{if(o.headers["x-unique-record"]==="dial_http"){v.logger.info("[html] dial http request, return 200 status code"),f.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&u.use(W.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),u.get("/:path(*)?",async(o,f,k)=>{if(ne.some(c=>o.path?.startsWith(c))){k();return}const S="production";let i,b,g=d;if(o.path.startsWith("/pages")){const c=o.params.lang,_=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let m=(c&&w.has(c)?c:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!m||!t.supportedLocales?.find(h=>h.locale===m))&&(m=t.supportedLocales?.[0]?.locale||""),m){const h=[];Object.values(t.pages).forEach(a=>{const L=Object.values(a?.sections??{}).filter(r=>r.component==="custom-component"&&r.config?.componentId).map(r=>({id:r.id,componentId:r.config.componentId,useCache:r.config.useCache,cacheDuration:r.config.cacheDuration,properties:a?.dataSource?.[r.id]?.[m]}));h.push(...L)});const x=new Promise(a=>{setTimeout(()=>{a({})},30*1e3)});try{await Promise.race([x,v.getPreloadComponents({mode:S,req:o,state:t,locale:m,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(a=>{a&&(b=A.injectPreloadComponents(a))})])}catch(a){v.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",a)}}}try{const c=i?.title||s.default.env.appName,_=i?.description||s.default.env.appDescription,w=j.withQuery(j.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:c,description:_});g=V.default.render(d,{ogTitle:c,ogDescription:_,ogImage:se(i?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const p=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let l=i?.backgroundColor;if(l&&R.isMuiColorKey(l)){const c=await te();l=Q.default(c,`settings.theme.light.palette.${l}`,l)}const I=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
|
|
2
2
|
${l?`<meta name="theme-color" content="${l}" /><style>html,body,#app {background-color: ${l};}</style>`:""}
|
|
3
3
|
${p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.title}&display=swap">`:""}
|
|
4
4
|
${p?.description&&p?.description!==p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.description}&display=swap">`:""}
|
package/lib/cjs/resources.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const f=require("./chunks/components-
|
|
1
|
+
"use strict";const f=require("./chunks/components-aaduHC9E.js"),c=require("./chunks/site-state-DlfM55ST.js"),U=require("express"),w=require("fs/promises"),T=require("joi"),M=require("lodash/groupBy"),q=require("lodash/sortBy"),C=require("@blocklet/sdk/lib/middlewares/auth"),L=require("@blocklet/sdk/lib/component"),J=require("path"),h=e=>e&&e.__esModule?e:{default:e},l=h(T),k=h(M),F=h(q),X=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s,{attributes:{exclude:["productionState","relatedBlocklets"]}});if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,i=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(f.isMultiTenant()){const I=n.createdBy===r,g=f.getMultiTenantAllProjectAccessPassports()?.includes?.(i);if(!I&&!g)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(i))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){f.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}},S=(e,t,o)=>f.isMultiTenant()?C.authMiddleware()(e,t,o):C.authMiddleware({roles:["owner","admin","pagesEditor"]})(e,t,o),G=(e,t)=>{const o=L.getResourceExportDir({projectId:e,releaseId:t});return J.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},y=U.Router(),D="@page",b="@component",m=":",R="ALL",A="@project",v=({pageId:e,projectId:t})=>[D,t,e].join(m),K=e=>{const[t,o,s]=e.split(m);if(t===D)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[b,t,e].join(m),W=e=>{const[t,o,s]=e.split(m);if(t===b)return{componentId:s,projectId:o}},Y=e=>[A,e].join(m),$=e=>{const[t,o]=e.split(m);if(t===A)return o},z=e=>{try{return JSON.parse(e)}catch{}return{}};async function B(e){const t=await c.SiteState.getStateByProjectId({projectId:e,mode:"production"}),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const i=t.pages[r];if(i)return{id:v({pageId:r,projectId:e}),name:i.slug}}).filter(Boolean),n=F.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:x({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Y(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:x({componentId:R,projectId:e}),name:"Components",children:n}]}}y.get("/resources",S,async(e,t)=>{const{projectId:o}=z(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await X(e,t,()=>{});const r=await B(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>B(r.id)));t.json({resources:n})});const H=l.default.object({projectId:l.default.string().required().min(1),releaseId:l.default.string().allow(""),resources:l.default.array().items(l.default.string()).required(),locale:l.default.string().allow("")});y.post("/resources",S,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await H.validateAsync(e.body),r="production",i=[],I=[];for(const a of o){if($(a))continue;const{pageId:d,projectId:P}=K(a)||{};if(d)d===R||d&&P&&i.push({pageId:d,projectId:P});else{const{componentId:j,projectId:u}=W(a)||{};j===R||j&&u&&I.push({componentId:j,projectId:u})}}const g=k.default(i,"projectId"),O=k.default(I,"projectId"),N=new Set([...Object.keys(g),...Object.keys(O)]),E=G(s,n);await w.rm(E,{recursive:!0,force:!0}),await w.mkdir(E,{recursive:!0});for(const a of N){const d=await c.SiteState.getStateByProjectId({projectId:a,mode:r}),P=g[a],j=O[a],u=P?.map(p=>p.pageId),_=j?.map(p=>p.componentId);if(u?.length||_?.length){const p=await c.toPackage(d,{exportAssets:!0,pageIds:u,componentIds:_});await c.copyRecursive(p,E),await w.rm(p,{recursive:!0,force:!0})}f.logger.info(`Exported resources for project ${a}`,{pageIds:u,componentIds:_})}t.json({})});y.get("/all-resources",S,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=y;
|
package/lib/cjs/site-state.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-aaduHC9E.js");const e=require("./chunks/site-state-DlfM55ST.js"),u=require("@blocklet/pages-kit/utils/common");require("@blocklet/pages-kit/utils/page-model");require("@blocklet/pages-kit/utils/property");require("@blocklet/pages-kit/utils/route");require("@blocklet/sdk/lib/component");require("@blocklet/sdk/lib/config");require("@reactivedata/reactive");require("@syncedstore/core");require("fs");require("fs/promises");require("glob");require("lib0/decoding");require("lib0/encoding");require("lodash/cloneDeep");require("lodash/debounce");require("lodash/get");require("lodash/isEmpty");require("lodash/set");require("lodash/union");require("lru-cache");require("p-limit");require("path");require("sequelize");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");const t=require("@blocklet/pages-kit/types/state");exports.PUBLISH_MODES=e.PUBLISH_MODES;exports.SITE_STATE_PATH=e.SITE_STATE_PATH;exports.STATE_MODES=e.STATE_MODES;exports.default=e.SiteState;exports.downloadAsset=e.downloadAsset;exports.downloadAssets=e.downloadAssets;exports.fromPackage=e.fromPackage;exports.getDefaultState=e.getDefaultState;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;exports.updateResourceStatesByProjectId=e.updateResourceStatesByProjectId;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
|