@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.
@@ -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(","))||[],Ie=W.default.join(h.default.env.dataDir,"fs-memoize-cache"),Oe=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=xe.default("pages-kit"),be=Ie,Ae=Oe,R=30*24*60*60*1e3,ve=24*60*60*1e3,Q=async(e="")=>{const t=j.join(be,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,ke=async()=>(await import("tailwindcss")).default,Fe=async()=>(await import("autoprefixer")).default,$e=!1,Ue=async(e,{componentId:t})=>{const o=`@tailwind components;
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 ke(),p=await Fe();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)};
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,k=10;function F(e){g.info("clear preload components cache",{cacheKey:e}),M.delete(e)}function Ge(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function Je(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}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=I({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 O={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,O,{ttl:_*1e3})}return O}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,O=r===T.PreloadComponentScriptModule.UMD_FN,_=r===T.PreloadComponentScriptModule.CJS,b=x?"":N.componentUMDName({componentId:d.component.id}),$=re(d.component);let A={module:r,script:"",moduleName:b};if($&&d.component.renderer?.type==="react-component"&&x&&d.component.renderer?.script)A.script=d.component.renderer?.script;else if($&&d.component.renderer?.type==="react-component"&&(_||O)&&d.component.renderer?.cjsScript){const U=d.component.renderer.cjsScript;A.script=_?U:X(b,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:b,tailwind:e!=="draft"}),moduleName:b};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=I({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=I({state:e,componentId:t});if(!s)return null;const r=N.mergeComponent({componentId:t,getComponent:p=>I({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 I({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({})},k*1e3)});let i=await Y();const f={componentMountPoints:h.default.components};return await Promise.race([m,i.callFunction({code:`${r}
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:k*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:`
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=k;exports.IMAGE_BIN_NAME=_e;exports.clearPreloadComponentsCache=F;exports.clearPreloadComponentsCacheByInstanceId=Je;exports.clearPreloadComponentsCacheByMode=Ge;exports.databaseUrl=Pe;exports.getComponentFromState=I;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;
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;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-CnPdZJ2Z.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;
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;
@@ -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-CnPdZJ2Z.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:`
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">`:""}
@@ -1 +1 @@
1
- "use strict";const f=require("./chunks/components-CnPdZJ2Z.js"),c=require("./chunks/site-state-D9DYye_t.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;
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;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-CnPdZJ2Z.js");const e=require("./chunks/site-state-D9DYye_t.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]})});
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]})});