@blocklet/pages-kit-inner-components 0.6.57 → 0.6.59

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,9 +1,9 @@
1
- "use strict";var oe=Object.create;var U=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var ae=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of re(t))!ce.call(e,s)&&s!==o&&U(e,s,{get:()=>t[s],enumerable:!(n=ne(t,s))||n.enumerable});return e};var _=(e,t,o)=>(o=e!=null?oe(se(e)):{},ae(t||!e||!e.__esModule?U(o,"default",{value:e,enumerable:!0}):o,e));const O=require("@blocklet/quickjs"),ie=require("crypto"),C=require("fs"),N=require("path"),le=require("@blocklet/sdk/lib/config"),pe=require("lodash/isNil"),ue=require("@blocklet/pages-kit/builtin/utils"),T=require("@blocklet/pages-kit/types"),j=require("@blocklet/pages-kit/utils/builtin"),b=require("@blocklet/pages-kit/utils/property"),de=require("lodash/isEmpty"),me=require("lru-cache"),q=require("node-fetch"),y=require("ufo"),fe=require("@blocklet/logger"),K=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),ze=require("@blocklet/sdk/lib/component"),x=e=>e&&e.__esModule?e:{default:e},G=x(N),h=x(le),he=x(pe),ge=x(de),Ce=x(q),we=x(fe);h.default.env.mode;h.default.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY;h.default.env.OPENAI_BASE_URL||process.env.OPENAI_BASE_URL;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 Ee="image-bin";h.default.env.INIT_TEMPLATE_PATH;const ye=process.env.DATABASE_URL||G.default.join(h.default.env.dataDir,"db/pages-kit.db"),$=h.default,Se=()=>h.default.env.tenantMode==="multiple",_e=()=>(he.default($.env.preferences.multiTenantAllProjectAccessPassports)?[]:$.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],Pe=G.default.join(h.default.env.dataDir,"fs-memoize-cache"),xe=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=we.default("pages-kit"),Me=Pe,Te=xe,v=30*24*60*60*1e3,Ie=24*60*60*1e3,J=async(e="")=>{const t=N.join(Me,e);try{if(!(await C.promises.stat(t)).isDirectory())throw new Error(`${t} is not a directory`)}catch{await C.promises.mkdir(t,{recursive:!0})}return t},B=(e,...t)=>e.keyGenerator?e.keyGenerator(...t):JSON.stringify([e.subdir||"",...t]),Ae=(e,t)=>{const o=ie.createHash("md5").update(t).digest("hex");return N.join(e,`${Te}-${o}.json`)},Oe=async(e="")=>{const t=await J(e),o=Date.now();try{const n=await C.promises.readdir(t);await Promise.all(n.filter(s=>s.endsWith(".json")).map(async s=>{const r=N.join(t,s);try{const u=await C.promises.readFile(r,"utf-8"),l=JSON.parse(u);l.createdAt&&o-l.createdAt>v&&await C.promises.unlink(r)}catch{try{const l=await C.promises.stat(r);o-l.mtimeMs>v&&await C.promises.unlink(r)}catch{}}}))}catch(n){console.error(`Failed to cleanup cache in ${t}:`,n)}},be=(()=>{const e=new Set;return setInterval(async()=>{await Promise.all(Array.from(e).map(n=>Oe(n)))},Ie).unref(),n=>{e.add(n)}})();function R(e,t){return t.subdir&&be(t.subdir),O.memoize(async(...n)=>{const s=await J(t.subdir||""),r=B(t,...n),u=Ae(s,r);try{const l=await C.promises.readFile(u,"utf-8"),{value:d,createdAt:p}=JSON.parse(l);if(p&&Date.now()-p>v)throw await C.promises.unlink(u).catch(()=>{}),new Error("Cache expired");return d}catch{const d=await e(...n),p=JSON.stringify({value:d,createdAt:Date.now()});return C.promises.writeFile(u,p,"utf-8").catch(m=>{console.error("Failed to write fs cache:",m)}),d}},{keyGenerator:(...n)=>B(t,...n),lruOptions:t.lruOptions||{max:100,ttl:v}})}const V=async()=>await import("typescript"),ve=async()=>await import("esbuild"),Ne=async()=>(await import("postcss")).default,Re=async()=>(await import("tailwindcss")).default,je=async()=>(await import("autoprefixer")).default,De=!1,Le=async(e,{componentId:t})=>{const o=`@tailwind components;
1
+ "use strict";var oe=Object.create;var $=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var ae=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of re(t))!ce.call(e,s)&&s!==o&&$(e,s,{get:()=>t[s],enumerable:!(n=ne(t,s))||n.enumerable});return e};var x=(e,t,o)=>(o=e!=null?oe(se(e)):{},ae(t||!e||!e.__esModule?$(o,"default",{value:e,enumerable:!0}):o,e));const b=require("@blocklet/quickjs"),ie=require("crypto"),C=require("fs"),N=require("path"),le=require("@blocklet/sdk/lib/config"),pe=require("lodash/isNil"),ue=require("@blocklet/pages-kit/builtin/utils"),T=require("@blocklet/pages-kit/types"),j=require("@blocklet/pages-kit/utils/builtin"),A=require("@blocklet/pages-kit/utils/property"),de=require("lodash/isEmpty"),me=require("lru-cache"),q=require("node-fetch"),S=require("ufo"),fe=require("@blocklet/logger"),K=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),ze=require("@blocklet/sdk/lib/component"),_=e=>e&&e.__esModule?e:{default:e},G=_(N),h=_(le),he=_(pe),ge=_(de),Ce=_(q),we=_(fe);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 ye="image-bin";h.default.env.INIT_TEMPLATE_PATH;const Se=process.env.DATABASE_URL||G.default.join(h.default.env.dataDir,"db/pages-kit.db"),U=h.default,Ee=()=>h.default.env.tenantMode==="multiple",xe=()=>(he.default(U.env.preferences.multiTenantAllProjectAccessPassports)?[]:U.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],Pe=G.default.join(h.default.env.dataDir,"fs-memoize-cache"),_e=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=we.default("pages-kit"),Me=Pe,Te=_e,v=30*24*60*60*1e3,Ie=24*60*60*1e3,J=async(e="")=>{const t=N.join(Me,e);try{if(!(await C.promises.stat(t)).isDirectory())throw new Error(`${t} is not a directory`)}catch{await C.promises.mkdir(t,{recursive:!0})}return t},B=(e,...t)=>e.keyGenerator?e.keyGenerator(...t):JSON.stringify([e.subdir||"",...t]),Oe=(e,t)=>{const o=ie.createHash("md5").update(t).digest("hex");return N.join(e,`${Te}-${o}.json`)},be=async(e="")=>{const t=await J(e),o=Date.now();try{const n=await C.promises.readdir(t);await Promise.all(n.filter(s=>s.endsWith(".json")).map(async s=>{const r=N.join(t,s);try{const u=await C.promises.readFile(r,"utf-8"),l=JSON.parse(u);l.createdAt&&o-l.createdAt>v&&await C.promises.unlink(r)}catch{try{const l=await C.promises.stat(r);o-l.mtimeMs>v&&await C.promises.unlink(r)}catch{}}}))}catch(n){console.error(`Failed to cleanup cache in ${t}:`,n)}},Ae=(()=>{const e=new Set;return setInterval(async()=>{await Promise.all(Array.from(e).map(n=>be(n)))},Ie).unref(),n=>{e.add(n)}})();function R(e,t){return t.subdir&&Ae(t.subdir),b.memoize(async(...n)=>{const s=await J(t.subdir||""),r=B(t,...n),u=Oe(s,r);try{const l=await C.promises.readFile(u,"utf-8"),{value:d,createdAt:p}=JSON.parse(l);if(p&&Date.now()-p>v)throw await C.promises.unlink(u).catch(()=>{}),new Error("Cache expired");return d}catch{const d=await e(...n),p=JSON.stringify({value:d,createdAt:Date.now()});return C.promises.writeFile(u,p,"utf-8").catch(m=>{console.error("Failed to write fs cache:",m)}),d}},{keyGenerator:(...n)=>B(t,...n),lruOptions:t.lruOptions||{max:100,ttl:v}})}const V=async()=>await import("typescript"),ve=async()=>await import("esbuild"),Ne=async()=>(await import("postcss")).default,Re=async()=>(await import("tailwindcss")).default,je=async()=>(await import("autoprefixer")).default,De=!1,Le=async(e,{componentId:t})=>{const o=`@tailwind components;
2
2
  @tailwind utilities;
3
3
  `,n=`.CustomComponent_${t}`,s=await Ne(),r=await Re(),u=await je();return(await s([r({content:[{raw:e,extension:"tsx"}]}),u({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),d=>{d.walkRules(p=>{p.selectors=p.selectors.map(m=>m.replace(/\.(.+)/g,`${n}.$1,${n} .$1`))})}]).process(o)).css},ke=async(e,{componentId:t})=>{const o=await Le(e,{componentId:t});return`export const __PagesKit_CSS__ = ${JSON.stringify(o)};
4
4
 
5
5
  ${e}
6
- `},H=R(async(e,t)=>{let o=await V();try{let n=o.transpileModule(e,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.ESNext},transformers:{before:[K.createBuiltinModuleTransformer(o)]}}).outputText;if(t.tailwind&&(n=await ke(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:Q(t.moduleName,s)}catch(n){throw new Error(n)}finally{o=null}},{subdir:"transpileModule"}),Fe=async(e,t)=>{let{build:o}=await ve(),n=null;try{const r=(await o({entryPoints:["index.tsx"],external:Object.keys(j.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(d){d.onResolve({filter:/.*/},p=>p.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:p.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),d.onLoad({filter:/.*/,namespace:"vfs"},async p=>{if(p.path==="index.tsx")return{contents:`export { ${t} } from './component'`,loader:"tsx"};if(p.path==="component.tsx")return{contents:e,loader:"tsx"};if(K.isRelativeModule(p.path)){const m=p.path.split("/").pop()}return null})}}]})).outputFiles?.[0]?.contents;if(!r)throw new Error("Failed to build server code");const u=Buffer.from(r).toString();return n=await V(),n.transpileModule(u,{compilerOptions:{module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2020}}).outputText}catch(s){throw new Error(s)}finally{o=null,n=null}},Ue=(e,t)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,"m").test(e)?e:void 0,W=R(async(e,t)=>{const o=await Fe(e,t);return Ue(o,t)},{subdir:"extractExportValueSchema"}),Q=(e,t)=>`// GENERATED FILE. DO NOT EDIT.
6
+ `},H=R(async(e,t)=>{let o=await V();try{let n=o.transpileModule(e,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.ESNext},transformers:{before:[K.createBuiltinModuleTransformer(o)]}}).outputText;if(t.tailwind&&(n=await ke(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:Q(t.moduleName,s)}catch(n){throw new Error(n)}finally{o=null}},{subdir:"transpileModule"}),Fe=async(e,t)=>{let{build:o}=await ve(),n=null;try{const r=(await o({entryPoints:["index.tsx"],external:Object.keys(j.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(d){d.onResolve({filter:/.*/},p=>p.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:p.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),d.onLoad({filter:/.*/,namespace:"vfs"},async p=>{if(p.path==="index.tsx")return{contents:`export { ${t} } from './component'`,loader:"tsx"};if(p.path==="component.tsx")return{contents:e,loader:"tsx"};if(K.isRelativeModule(p.path)){const m=p.path.split("/").pop()}return null})}}]})).outputFiles?.[0]?.contents;if(!r)throw new Error("Failed to build server code");const u=Buffer.from(r).toString();return n=await V(),n.transpileModule(u,{compilerOptions:{module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2020}}).outputText}catch(s){throw new Error(s)}finally{o=null,n=null}},$e=(e,t)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,"m").test(e)?e:void 0,W=R(async(e,t)=>{const o=await Fe(e,t);return $e(o,t)},{subdir:"extractExportValueSchema"}),Q=(e,t)=>`// GENERATED FILE. DO NOT EDIT.
7
7
  var ${e} = async function () {
8
8
 
9
9
  const exports = {};
@@ -29,7 +29,7 @@ var ${e} = async function () {
29
29
 
30
30
  return exports;
31
31
  };
32
- `,z=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function $e(e){return e?.type==="react-component"}const P=new me.LRUCache({max:100,ttl:1e3*60*60*24*7}),Z=60*60,D=10;function L(e){g.info("clear preload components cache",{cacheKey:e}),P.delete(e)}function Be(e){for(const t of P.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),L(t))}function He(e){for(const t of P.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),L(t))}function X({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function qe({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:u,config:{defaultLocale:l}}=o;if(!l)return null;const d=(await Promise.all(s.map(async c=>{try{const a=X({mode:e,instanceId:c.id,componentId:c.componentId,locale:n});if(e!=="draft"&&c.useCache&&P.has(a))return g.info(`get preload component from cache: ${a}`),P.get(a);const f=I({state:o,componentId:c.componentId});if(!f)return null;const S=await Y({req:t,state:o,componentId:f.id,locale:n,defaultLocale:l,properties:c.properties});if(!S)return null;const M={instanceId:c.id,preload:S};if(e!=="draft"&&c.useCache){let E=Z;c.cacheDuration&&(E=c.cacheDuration),g.info(`set preload component to cache(${E}s): ${a}`),P.set(a,M,{ttl:E*1e3})}return M}catch(a){return g.error("get preload component error",{instanceId:c.id,componentId:c.componentId},{error:a}),null}}))).filter(c=>!!c),p=Object.values(d.reduce((c,a)=>({...c,...a.preload.components}),{}));async function m(){const c=await Promise.all(p.map(async a=>{const f=r===T.PreloadComponentScriptModule.ESM,S=r===T.PreloadComponentScriptModule.UMD_FN,M=r===T.PreloadComponentScriptModule.CJS,E=f?"":b.componentUMDName({componentId:a.component.id}),k=te(a.component);let A={module:r,script:"",moduleName:E};if(k&&a.component.renderer?.type==="react-component"&&f&&a.component.renderer?.script)A.script=a.component.renderer?.script;else if(k&&a.component.renderer?.type==="react-component"&&(M||S)&&a.component.renderer?.cjsScript){const F=a.component.renderer.cjsScript;A.script=M?F:Q(E,F)}else A=f?{module:r,script:await H(a.script,{componentId:a.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await H(a.script,{componentId:a.component.id,module:r,moduleName:E,tailwind:e!=="draft"}),moduleName:E};return[a.component.id,{component:a.component,script:A}]}));return Object.fromEntries(c)}const w=await m();return{config:{defaultLocale:l,supportedLocales:u},components:w,instances:d.map(c=>({id:c.instanceId,componentId:c.preload.component.id,locales:{[c.preload.locale]:{props:c.preload.props}}}))}}async function Y({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:u}=t,l=I({state:t,componentId:o});if(!l)return null;const d=u.some(m=>m.locale===n)?n:s;if(!d)return null;const p=await ee({req:e,state:t,componentId:o,locale:d,defaultLocale:s,properties:r});return p?{component:l,...p}:null}const Ke=20;async function ee({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:u}){if(t>Ke)throw new RangeError("max component depth exceeded");const l=Ge({state:o,componentId:n,properties:u,locale:s});if(!l)return null;const{props:d,component:p}=l,m={locale:s||r,components:{[l.component.id]:{component:l.component,script:l.script}},props:{...d}};try{const w=$e(p.renderer)?p.renderer.getServerSideProps:void 0,i=await Ve({...l,req:e,getServerSideProps:w});i?.props&&Object.assign(m.props,i.props)}catch(w){g.error("preload data at server side error",{componentId:n,name:l.component.name},{error:w})}return await Promise.all(Object.entries(d).map(async([w,i])=>{if(i?.type===b.RenderNestedComponent){const c=await ee({req:e,depth:t+1,state:o,componentId:i.componentId,locale:s,defaultLocale:r,properties:i.properties});c&&(Object.assign(m.components,c.components),Object.assign(m.props,{[w]:{type:b.RenderNestedComponent,componentId:i.componentId,props:c.props}}))}})),m}function Ge({state:e,componentId:t,locale:o,properties:n}){const s=I({state:e,componentId:t});if(!s)return null;const r=b.mergeComponent({componentId:t,getComponent:u=>I({state:e,componentId:u}),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 Je({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 Ve({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await W(t,"getServerSideProps");if(!r)return null;const l=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",d=new Promise(i=>{setTimeout(()=>{i({})},D*1e3)});let p=await z();const m={componentMountPoints:h.default.components};return await Promise.race([d,p.callFunction({code:`${r}
32
+ `,z=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function Ue(e){return e?.type==="react-component"}const P=new me.LRUCache({max:100,ttl:1e3*60*60*24*7}),Z=60*60,D=10;function L(e){g.info("clear preload components cache",{cacheKey:e}),P.delete(e)}function Be(e){for(const t of P.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),L(t))}function He(e){for(const t of P.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),L(t))}function X({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function qe({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:u,config:{defaultLocale:l}}=o;if(!l)return null;const d=(await Promise.all(s.map(async c=>{try{const a=X({mode:e,instanceId:c.id,componentId:c.componentId,locale:n});if(e!=="draft"&&c.useCache&&P.has(a))return g.info(`get preload component from cache: ${a}`),P.get(a);const f=I({state:o,componentId:c.componentId});if(!f)return null;const E=await Y({req:t,state:o,componentId:f.id,locale:n,defaultLocale:l,properties:c.properties});if(!E)return null;const M={instanceId:c.id,preload:E};if(e!=="draft"&&c.useCache){let y=Z;c.cacheDuration&&(y=c.cacheDuration),g.info(`set preload component to cache(${y}s): ${a}`),P.set(a,M,{ttl:y*1e3})}return M}catch(a){return g.error("get preload component error",{instanceId:c.id,componentId:c.componentId},{error:a}),null}}))).filter(c=>!!c),p=Object.values(d.reduce((c,a)=>({...c,...a.preload.components}),{}));async function m(){const c=await Promise.all(p.map(async a=>{const f=r===T.PreloadComponentScriptModule.ESM,E=r===T.PreloadComponentScriptModule.UMD_FN,M=r===T.PreloadComponentScriptModule.CJS,y=f?"":A.componentUMDName({componentId:a.component.id}),k=te(a.component);let O={module:r,script:"",moduleName:y};if(k&&a.component.renderer?.type==="react-component"&&f&&a.component.renderer?.script)O.script=a.component.renderer?.script;else if(k&&a.component.renderer?.type==="react-component"&&(M||E)&&a.component.renderer?.cjsScript){const F=a.component.renderer.cjsScript;O.script=M?F:Q(y,F)}else O=f?{module:r,script:await H(a.script,{componentId:a.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await H(a.script,{componentId:a.component.id,module:r,moduleName:y,tailwind:e!=="draft"}),moduleName:y};return[a.component.id,{component:a.component,script:O}]}));return Object.fromEntries(c)}const w=await m();return{config:{defaultLocale:l,supportedLocales:u},components:w,instances:d.map(c=>({id:c.instanceId,componentId:c.preload.component.id,locales:{[c.preload.locale]:{props:c.preload.props}}}))}}async function Y({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:u}=t,l=I({state:t,componentId:o});if(!l)return null;const d=u.some(m=>m.locale===n)?n:s;if(!d)return null;const p=await ee({req:e,state:t,componentId:o,locale:d,defaultLocale:s,properties:r});return p?{component:l,...p}:null}const Ke=20;async function ee({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:u}){if(t>Ke)throw new RangeError("max component depth exceeded");const l=Ge({state:o,componentId:n,properties:u,locale:s});if(!l)return null;const{props:d,component:p}=l,m={locale:s||r,components:{[l.component.id]:{component:l.component,script:l.script}},props:{...d}};try{const w=Ue(p.renderer)?p.renderer.getServerSideProps:void 0,i=await Ve({...l,req:e,getServerSideProps:w});i?.props&&Object.assign(m.props,i.props)}catch(w){g.error("preload data at server side error",{componentId:n,name:l.component.name},{error:w})}return await Promise.all(Object.entries(d).map(async([w,i])=>{if(i?.type===A.RenderNestedComponent){const c=await ee({req:e,depth:t+1,state:o,componentId:i.componentId,locale:s,defaultLocale:r,properties:i.properties});c&&(Object.assign(m.components,c.components),Object.assign(m.props,{[w]:{type:A.RenderNestedComponent,componentId:i.componentId,props:c.props}}))}})),m}function Ge({state:e,componentId:t,locale:o,properties:n}){const s=I({state:e,componentId:t});if(!s)return null;const r=A.mergeComponent({componentId:t,getComponent:u=>I({state:e,componentId:u}),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 Je({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 Ve({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await W(t,"getServerSideProps");if(!r)return null;const l=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",d=new Promise(i=>{setTimeout(()=>{i({})},D*1e3)});let p=await z();const m={componentMountPoints:h.default.components};return await Promise.race([d,p.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:i=>{if(i==="@blocklet/pages-kit/builtin/utils")return` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
50
50
  export { joinURL, withQuery, getQuery, getComponentMountPoint }
51
- `;if(i==="@blocklet/pages-kit/builtin/dayjs")return O.BuiltinModules.dayjs;if(i in O.BuiltinModules)return O.BuiltinModules[i];if(i in j.BuiltinModules){const c=j.BuiltinModules[i];return ge.default(c)?void 0:c}},global:{console:{log:(...i)=>{g.info(...i)},warn:(...i)=>{g.warn(...i)},error:(...i)=>{g.error(...i)}},getComponentMountPoint:ue.getComponentMountPoint,joinURL:y.joinURL,withQuery:y.withQuery,getQuery:y.getQuery,window:{blocklet:m},blocklet:m},functionName:"getServerSidePropsWrapper",args:[{location:{href:y.joinURL(y.withHttps(n.hostname),n.originalUrl)},fetch:(i,{...c}={})=>{const a=typeof i=="string"&&i.startsWith("/")?y.joinURL(h.default.env.appUrl,i):i;if(typeof a=="string"&&y.parseURL(a).host===y.parseURL(h.default.env.appUrl).host){const f=n.get("cookie");if(f){const S=new q.Headers(c.headers);S.set("cookie",f),c.headers=S}}return Ce.default(a,{...c,timeout:D*1e3}).then(f=>({ok:f.ok,status:f.status,statusText:f.statusText,headers:Object.fromEntries(f.headers.entries()),json:()=>f.json()}))},props:o}]}).finally(()=>{p=null})])}const We=R(async(e,t,o,n)=>{if(!e?.includes(t)&&!n)return null;const s=n??await W(e,t);if(s)try{let r=await z();return await r.callFunction({cache:!0,code:`
51
+ `;if(i==="@blocklet/pages-kit/builtin/dayjs")return b.BuiltinModules.dayjs;if(i in b.BuiltinModules)return b.BuiltinModules[i];if(i in j.BuiltinModules){const c=j.BuiltinModules[i];return ge.default(c)?void 0:c}},global:{console:{log:(...i)=>{g.info(...i)},warn:(...i)=>{g.warn(...i)},error:(...i)=>{g.error(...i)}},getComponentMountPoint:ue.getComponentMountPoint,joinURL:S.joinURL,withQuery:S.withQuery,getQuery:S.getQuery,window:{blocklet:m},blocklet:m},functionName:"getServerSidePropsWrapper",args:[{location:{href:S.joinURL(S.withHttps(n.hostname),n.originalUrl)},fetch:(i,{...c}={})=>{const a=typeof i=="string"&&i.startsWith("/")?S.joinURL(h.default.env.appUrl,i):i;if(typeof a=="string"&&S.parseURL(a).host===S.parseURL(h.default.env.appUrl).host){const f=n.get("cookie");if(f){const E=new q.Headers(c.headers);E.set("cookie",f),c.headers=E}}return Ce.default(a,{...c,timeout:D*1e3}).then(f=>({ok:f.ok,status:f.status,statusText:f.statusText,headers:Object.fromEntries(f.headers.entries()),json:()=>f.json()}))},props:o}]}).finally(()=>{p=null})])}const We=R(async(e,t,o,n)=>{if(!e?.includes(t)&&!n)return null;const s=n??await W(e,t);if(s)try{let r=await z();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"}),te=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=Z;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=D;exports.IMAGE_BIN_NAME=Ee;exports.clearPreloadComponentsCache=L;exports.clearPreloadComponentsCacheByInstanceId=He;exports.clearPreloadComponentsCacheByMode=Be;exports.databaseUrl=ye;exports.getComponentFromState=I;exports.getComponentFromStateByName=Je;exports.getExportSchemaValueFromCode=We;exports.getMultiTenantAllProjectAccessPassports=_e;exports.getPreloadComponent=Y;exports.getPreloadComponents=qe;exports.getPreloadComponentsCacheKey=X;exports.isMultiTenant=Se;exports.logger=g;exports.memoizeWithFs=R;exports.skipTranspileComponent=te;
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"}),te=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=Z;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=D;exports.IMAGE_BIN_NAME=ye;exports.clearPreloadComponentsCache=L;exports.clearPreloadComponentsCacheByInstanceId=He;exports.clearPreloadComponentsCacheByMode=Be;exports.databaseUrl=Se;exports.getComponentFromState=I;exports.getComponentFromStateByName=Je;exports.getExportSchemaValueFromCode=We;exports.getMultiTenantAllProjectAccessPassports=xe;exports.getPreloadComponent=Y;exports.getPreloadComponents=qe;exports.getPreloadComponentsCacheKey=X;exports.isMultiTenant=Ee;exports.logger=g;exports.memoizeWithFs=R;exports.skipTranspileComponent=te;
@@ -1 +1 @@
1
- "use strict";const f=require("./components-D1oFQM3W.js"),F=require("@syncedstore/core"),Je=require("yjs"),We=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),Qe=require("lodash/cloneDeep"),Xe=require("@blocklet/sdk/lib/config"),I=require("fs"),g=require("path"),Te=require("@blocklet/pages-kit/utils/common"),Ze=require("@blocklet/pages-kit/utils/page-model"),et=require("@blocklet/pages-kit/utils/property"),Ie=require("@blocklet/sdk/lib/component"),tt=require("@reactivedata/reactive"),X=require("glob"),st=require("lib0/decoding"),at=require("lib0/encoding"),nt=require("lodash/debounce"),ot=require("lodash/get"),rt=require("lodash/isEmpty"),it=require("lodash/set"),ct=require("lodash/union"),be=require("lru-cache"),lt=require("p-limit"),C=require("sequelize"),pt=require("stream/promises"),ut=require("tar"),z=require("ufo"),dt=require("wait-on"),G=require("y-protocols/awareness"),le=require("y-protocols/sync"),ft=require("yaml"),De=require("./html-JOhPskS4.js");require("sqlite3");require("@blocklet/pages-kit/types/state");const $=t=>t&&t.__esModule?t:{default:t};function ae(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const a=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,a.get?a:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const U=ae(Je),Le=$(Qe),w=$(Xe),pe=ae(st),k=ae(at),_e=$(nt),Ee=$(ot),we=$(rt),ve=$(it),gt=$(ct),mt=$(lt),ht=$(dt),x=ae(ft),yt=C.DataTypes.sqlite.DATE.parse;C.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):yt(t,e);const M=new C.Sequelize({dialect:"sqlite",storage:f.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});M.query("pragma journal_mode = WAL;");M.query("pragma synchronous = normal;");M.query("pragma journal_size_limit = 33554432;");M.query("pragma cache_size = -2000;");M.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await M.close(),process.exit(0)});process.on("SIGTERM",async()=>{await M.close(),process.exit(0)});async function St(t,e){try{if(t.getDialect()!=="sqlite")return;const[s]=await t.query("SELECT 1");if(!s||s.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(s){if(s.name==="SequelizeConnectionError"||s?.message&&/closed!/.test(s.message))return;console.error("Failed to cleanup SQLite memory",e,s)}}let fe=null;fe&&clearInterval(fe);fe=setInterval(async()=>{f.logger.info("Start cleanupSqliteMemory"),await St(M,f.databaseUrl),f.logger.info("End cleanupSqliteMemory")},60*1e3*10);class Ae extends C.Model{}Ae.init({id:{type:C.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:C.DataTypes.UUIDV4},projectId:{type:C.DataTypes.UUID,allowNull:!1},componentId:{type:C.DataTypes.STRING,allowNull:!1}},{sequelize:M,tableName:"ProjectComponents",timestamps:!1});class L extends C.Model{static async getProjectByIdOrSlug(e){return L.findOne({where:{[C.Op.or]:[{id:e},{slug:e}]}})}}L.init({id:{type:C.DataTypes.UUID,defaultValue:C.DataTypes.UUIDV4,primaryKey:!0},name:{type:C.DataTypes.STRING,allowNull:!1},description:C.DataTypes.TEXT,createdAt:C.DataTypes.DATE,updatedAt:C.DataTypes.DATE,createdBy:{type:C.DataTypes.STRING,allowNull:!1},updatedBy:{type:C.DataTypes.STRING,allowNull:!1},slug:C.DataTypes.STRING,icon:C.DataTypes.STRING,pinnedAt:C.DataTypes.DATE,useAllResources:C.DataTypes.BOOLEAN,npmSecret:C.DataTypes.STRING,relatedBlocklets:{type:C.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 f.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:C.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 f.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}}},{sequelize:M,paranoid:!0});L.hasMany(Ae,{foreignKey:"projectId",as:"components"});const It="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",ge="page",me="trigger-reload-project-resource",Pe=It,bt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM";function Z(t){t.observeDeep(e=>{e.some(s=>s.changes.keys.has("updatedAt")||s.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Ue(){return I.mkdtempSync(g.join(w.default.env.dataDir,"tmp-"))}function ee(t,e,s=[]){return Array.isArray(t)?t.flatMap((a,n)=>ee(a,e,[...s,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([a,n])=>ee(n,e,[...s,a])):e(t)?[s]:[]}function R(t){return t.filter(e=>e!=null)}function Et(t){t.pages&&Object.keys(t.pages).forEach(s=>{const a=F.getYjsValue(t.pages[s]);a&&a instanceof U.Map&&Z(a)});const e=F.getYjsValue(t.pages);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.pages[n]);o&&o instanceof U.Map&&Z(o)}})})}function wt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=F.getYjsValue(t.routes?.[s]);a&&a instanceof U.Map&&Z(a)});const e=F.getYjsValue(t.routes);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.routes?.[n]);o&&o instanceof U.Map&&Z(o)}})})}function At(t,e){for(const s of e||Object.keys(t.routes||{})){let a=s,n=[];if(s.includes("-")){const[o,...c]=s.split("-");a=o,n=c||[]}if(t.routes?.[a]!==void 0){t.routes[a].publishedAt=new Date().toISOString();const o=t.routes[a];if(!o||!o.params||o.params.length===0)continue;if(s.includes("-")&&n.length>0){const c=Q.getRouteMetaDataByOptionIds(n,o);c&&(c.publishedAt=new Date().toISOString())}if(!e){const c=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const p of c)p.routeMetaData??={},p.routeMetaData.publishedAt=new Date().toISOString()}}}}function ue({page:t,route:e,state:s,routeId:a,routePathInfo:n}){f.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...Le.default(t),id:a,slug:n?.path??e.path,createdAt:e.createdAt,updatedAt:n?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:n?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(n?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const c of s.supportedLocales){if(e.dataSource){let p=e.id;n&&(p=n.paramOptionIds.join("-"));const l=e.dataSource.pathDataMappings?.[p]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[p]?.dataCache?.[s.config.defaultLocale||"en"];if(!l)continue;We.setPageDataSource(o,s,c.locale,l)}n&&n.routeMetaData&&(n.routeMetaData.publishedAt=new Date().toISOString())}return o}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const Pt=60*60*1e3,Y=new be.LRUCache({max:100,ttl:Pt,ttlResolution:10*1e3,allowStale:!0});function jt(t,e=[]){let s=0;const a=Array.from(Y.keys());for(const n of a)for(const o of t){if(De.matchCacheKey(n,{currentPath:o})){Y.delete(n),s++,f.logger.info(`[Cache CLEAR] key: ${n}`);break}for(const c of e)if(De.matchCacheKey(n,{currentPath:`/${c}${o}`})){Y.delete(n),s++,f.logger.info(`[Cache CLEAR] key: ${n}`);break}}return f.logger.info(`[Cache CLEAR] cleared ${s} entries for paths:`,t),s}function Ot(){const t=Y.size;return Y.clear(),f.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}w.default.events.on(w.default.Events.envUpdate,Ot);const{uploadToMediaKit:Ct}=require("@blocklet/uploader-server"),je=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,H=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,ke=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Tt=1e4,Dt=3e4,J=0,de=1,vt=0,kt=1,he=w.default,q=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Rt=["production","draft"],Lt=["production"];function te(t){return t?.replace(/\//g,"|")||""}function Me(){const t=he.env.languages?.map(s=>({locale:s.code,name:s.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class O extends U.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&U.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=tt.reactive(F.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new G.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 pageUrlMapCache=new be.LRUCache({max:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(q,e),a=g.join(q,`@del-${e}`);I.renameSync(s,a)}catch(s){f.logger.error("Failed to safe delete project state dir:",s)}}static async getProjectIds(){return(await L.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return X.globSync("*/",{cwd:q,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>O.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=O.sharedInstances[e];return s||(s=new O({path:g.join(q,e)}),O.sharedInstances[e]=s,s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(we.default(s?.productionState)){const a=g.join(q,e,"production"),n=await Oe(a,{includeResources:!0})??Me();if(!n?.config?.defaultLocale){n.config??={};const o=he.env.languages?.map(c=>({locale:c.code,name:c.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return s?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((s,a)=>this.closeConn(a)),this.awareness.destroy();const e=g.basename(this.options.path);delete O.sharedInstances[e],super.destroy()}initObserver(){Et(this.syncedStore),wt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=O.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return O.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return O.getProductionState(s)}async setState(e,s){const a=await qe(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(g.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);O.pageUrlMapCache.delete(o),await L.update({productionState:{...s}},{where:{id:o}})}}getPublishDir(e){return g.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:s,removed:a},n)=>{const o=e.concat(s,a);if(n!==null){const l=this.conns.get(n);l&&(e.forEach(S=>{l.add(S)}),a.forEach(S=>{l.delete(S)}))}const c=k.createEncoder();k.writeVarUint(c,de),k.writeVarUint8Array(c,G.encodeAwarenessUpdate(this.awareness,o));const p=k.toUint8Array(c);this.conns.forEach((l,S)=>this.send(S,p))};updateHandler=e=>{const s=k.createEncoder();k.writeVarUint(s,J),le.writeUpdate(s,e);const a=k.toUint8Array(s);this.conns.forEach((n,o)=>this.send(o,a))};ensureDataStructure=()=>{const{supportedLocales:e,pages:s,pageIds:a,config:n,routes:o,routeIds:c}=this.syncedStore;{const p=new Set(Object.keys(s));let l=0;for(;l<a.length;){const S=a[l];p.has(S)?(p.delete(S),l++):a.splice(l,1)}}{const p=new Set(Object.keys(o));let l=0;for(;l<c.length;){const S=c[l];p.has(S)?(p.delete(S),l++):c.splice(l,1)}}e.splice(0,e.length),e.push(...he.env.languages.map(p=>({locale:p.code,name:p.name}))),n.defaultLocale=e[0]?.locale;{let p=0;const l=new Set;for(;p<e.length;){const{locale:S}=e[p];l.has(S)?e.splice(p,1):(p++,l.add(S))}}};send=(e,s)=>{e.readyState!==vt&&e.readyState!==kt&&this.closeConn(e);try{e.send(s,a=>{a&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const s=this.conns.get(e);this.conns.delete(e),s&&G.removeAwarenessStates(this.awareness,Array.from(s),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=g.basename(this.options.path);this.releaseTimer=setTimeout(()=>{f.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},O.RELEASE_DELAY),f.logger.info(`[SiteState] scheduled release for project ${e} in ${O.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=g.basename(this.options.path);f.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=_e.default(()=>{I.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,U.encodeStateAsUpdate(this))},Tt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=await this.getState("draft"),n=await this.getState("production");await Se(a,n,{routes:s,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),At(this.syncedStore,s),await this.setState(e,n),await this.clearPageCacheForRoutes(s,n)};mergeState=async(e,s)=>{const a=JSON.parse(JSON.stringify(s));e.config.fontFamily??={};const n=a.config?.fontFamily,o=e.config?.fontFamily;e.config.fontFamily.title=n?.title||o?.title,e.config.fontFamily.description=n?.description||o?.description,await new Promise((c,p)=>{this.transact(async()=>{try{const l=await Se(e,s);c(l)}catch(l){p(l)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;let c=e;(!c||c.length===0)&&(c=s.pageIds??[]),f.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,c||[]);const p=s.supportedLocales.map(A=>A.locale),l=[],S=c.filter(A=>s.pageIds?.includes(A));for(const A of S){const E=s.pages[A].slug;o&&o!==a&&(o==="/"?l.push(E):l.push(`/${o}${E}`)),l.push(`/${a}${E}`)}if(f.logger.info(`[SiteState] clearing page cache for project ${a}, pathPatterns:`,l),l.length>0)try{const A=jt(l,p);f.logger.info(`[SiteState] cleared ${A} page cache entries for project ${a}, routes:`,c)}catch{}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",n=>this.messageListener(e,new Uint8Array(n)));let s=!0;const a=setInterval(()=>{if(!s)this.conns.has(e)&&this.closeConn(e),clearInterval(a);else if(this.conns.has(e)){s=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(a)}}},Dt);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{s=!0});{const n=k.createEncoder();k.writeVarUint(n,J),le.writeSyncStep1(n,this),this.send(e,k.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const c=k.createEncoder();k.writeVarUint(c,de),k.writeVarUint8Array(c,G.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,k.toUint8Array(c))}}};messageListener=(e,s)=>{try{const a=k.createEncoder(),n=pe.createDecoder(s),o=pe.readVarUint(n);switch(o){case J:k.writeVarUint(a,J),le.readSyncMessage(n,a,this,null),k.length(a)>1&&(this.ensureDataStructure(),this.send(e,k.toUint8Array(a)));break;case de:{G.applyAwarenessUpdate(this.awareness,pe.readVarUint8Array(n),e);break}default:f.logger.warn(`Unsupported messageType ${o}`)}}catch(a){f.logger.error(a)}this.save()};static async pageUrlMap(e,s){let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(c=>[c,!0])||[]);for(const c of a){const p=O.pageUrlMapCache.get(c);p&&(n={...n,...p},o.delete(c))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[C.Op.in]:a}}});await Promise.all(o?.map(async c=>{const p=c.id,l=c.slug||p,S={},A=e==="production"&&c?.productionState?c.productionState:await O.getStateByProjectId(c.id,e),v=gt.default(w.default.env.languages?.map(u=>u.code)||[],A.supportedLocales?.map(u=>u.locale)||[]),E=(u,i)=>{l&&(S[z.joinURL("/",l,u)]={...i,shouldRedirect:!0,mainPage:!0}),S[z.joinURL("/",p,u)]={...i,shouldRedirect:!0,mainPage:!0};for(const h of v){const T={...i,locale:h};S[z.joinURL("/",h,p,u)]=T,l&&(S[z.joinURL("/",h,l,u)]=T)}};if(e==="draft")for(const u of A.routeIds||[]){const i=A?.routes?.[u];if(!i)continue;if(i.params&&i.params.length>0){const m=Q.generateParamCombinations({basePath:i.path,params:i.params,routeId:i.id,paramsOptions:i.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const d of m){const y=d.path,P={projectId:p,projectSlug:l,pageSlug:y,pageId:i.displayTemplateId||"",routeId:u,defaultLocale:v?.[0],locales:v,publishedAt:A.config.publishedAt,isPublic:i.isPublic&&d?.routeMetaData?.isPublic};E(y,P)}}const h=i.path,T={projectId:p,projectSlug:l,pageSlug:h,pageId:i.displayTemplateId||"",routeId:u,defaultLocale:v?.[0],locales:v,publishedAt:A.config.publishedAt,isPublic:i.isPublic};E(h,T)}for(const u of A.pageIds||[]){const i=A.pages[u];if(!i||e==="production"&&!i.isPublic)continue;const h=i.slug,T=c.slug||p,m={projectId:p,projectSlug:T,pageSlug:h,pageId:u,defaultLocale:v?.[0],locales:v,publishedAt:A.config.publishedAt,isPublic:i.isPublic,templateConfig:i.templateConfig};E(h,m)}e==="production"&&O.pageUrlMapCache.set(p,S),n={...n,...S}}))}return n}getDocumentSize(){return U.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(O.sharedInstances)){const n=a.getDocumentSize();e.push({projectId:s,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:a.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),f.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,f.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(O.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(O.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(f.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){f.logger.info(`[SiteState] releasing ${s.length} instances without connections:`,s.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:c}of s)try{f.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),c.destroy(),n++}catch(p){f.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,p)}f.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?f.logger.debug("[SiteState] periodic check: all instances have active connections"):f.logger.debug("[SiteState] periodic check: no instances exist")}}async function _t(t,e,s){if(!t||!I.existsSync(t)||!I.lstatSync(t).isFile())return null;let a=s[t];return a||(a=(async()=>{try{return(await Ct({filePath:t,fileName:e}))?.data?.filename}catch(n){return f.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const $e=async(t,e)=>{const s=g.basename(t),a=await Ie.call({name:Pe,path:z.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await pt.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},Ne=async(t,e)=>{await Promise.all(t.map(async s=>{try{await $e(s,g.join(e,g.basename(s)))}catch(a){f.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function Fe(t){return je.test(t)?[t]:H.test(t)?(ke.lastIndex=0,Array.from(t.matchAll(ke)).map(s=>s[1]).filter(s=>!!s)):[]}async function W(t,e,s){const{getFilename:a,exportAssets:n}=s,o=g.join(e,a(t));if(I.mkdirSync(g.dirname(o),{recursive:!0}),I.writeFileSync(o,x.stringify(t)),n){const p=ee(t,l=>typeof l=="string"&&(je.test(l)||H.test(l))).map(l=>{const S=Ee.default(t,l);return Fe(S)}).flat().filter(Boolean);await Ne(p,g.dirname(o))}}const ye=new be.LRUCache({max:100,ttl:1*60*1e3});async function Re(t,e,s){const a=ee(t,p=>typeof p=="string"&&(je.test(p)||H.test(p))),n=mt.default(2),o=a.map(p=>n(async()=>{try{const l=Ee.default(t,p),S=Fe(l);for(const A of S){const v=g.basename(A),E=s.getFilePath(A,p),u=E?`${E}:${v}`:v,i=ye.get(u);if(i){H.test(l)||ve.default(t,p,i);return}const h=await _t(E,v,e);h&&(H.test(l)||ve.default(t,p,h),ye.set(u,h))}}catch(l){f.logger.error(`Failed to process upload for path ${p.join(".")}:`,l.message||l.reason)}})),c=await Promise.allSettled(o);s.onFinish?.(c)}async function qe(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:c="all"}={}){const p=s==="all"?t.pageIds:s,l=et.getComponentDependencies({state:t,pageIds:p,componentIds:a==="all"?Object.keys(t.components):a}),S=c==="all"?t.routeIds:c,A=r=>({id:r.id,name:r.name,isTemplateSection:r.isTemplateSection??!1,templateDescription:r.templateDescription,llmConfig:r.llmConfig,component:r.component,config:r.config,visibility:r.visibility,sections:r?.sectionIds?R(r?.sectionIds?.map(b=>{const D=r.sections?.[b];return D&&A(D)})):void 0}),v=(r,b)=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,isPublic:r.isPublic??!0,templateConfig:r.templateConfig,meta:r.locales?.[b]??{},sections:R(r.sectionIds.map(D=>{const N=r.sections[D];return N&&A(N)})),dataSource:Object.fromEntries(Object.entries(r.dataSource||{}).map(([D,N])=>[D,N?.[b]??{}]))}),E=r=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,path:r.path,handler:r.handler,isPublic:r.isPublic??!0,params:r.params??[],enabledGenerate:r.enabledGenerate??!1,displayTemplateId:r.displayTemplateId,dataSource:r.dataSource}),u=R(S.map(r=>{const b=t.routes[r];return b&&E(b)})),i=R(t.supportedLocales.map(r=>r.locale).flatMap(r=>p.map(b=>{const D=t.pages[b];return D&&{locale:r,slug:D.slug,page:v(D,r)}}))),h=Ue(),T=g.join(h,"pages");I.mkdirSync(T,{recursive:!0});const m=g.join(h,"components");I.mkdirSync(m,{recursive:!0});const d=g.join(h,"routes");I.mkdirSync(d,{recursive:!0});for(const{locale:r,slug:b,page:D}of i)await W(D,T,{getFilename:()=>`${te(b)||"index"}.${r}.yml`,exportAssets:e});for(const r of u)await W(r,d,{getFilename:()=>`${te(r.path)||"index"}.yml`,exportAssets:e});for(const r of l){const b=t.components[r]?.data;b&&await W(b,m,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const y=g.join(h,".blocklet/pages/pages.config.yml");I.mkdirSync(g.dirname(y),{recursive:!0});const P={pages:R(p.map(r=>{const b=t.pages[r];return b&&{id:r,slug:b.slug}})),routes:R(S.map(r=>{const b=t.routes[r];return b&&{id:r,path:b.path}})),components:R(l.map(r=>{const b=t.components[r]?.data;return b&&{id:r,name:b.name}})),...o?{resources:{components:R(Object.keys(t.resources?.components||{}).filter(r=>l.includes(r)).map(r=>({id:r,name:t.resources?.components?.[r]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};I.writeFileSync(y,x.stringify(P));const j=g.join(h,"config.source.json");if(n&&I.writeFileSync(j,JSON.stringify(n)),o){const r=g.join(h,"resources"),b=g.join(r,"components");I.mkdirSync(b,{recursive:!0});for(const B of Object.keys(t?.resources?.components??{}).filter(_=>l.includes(_))){const _=t.resources?.components?.[B]?.component;_&&await W(_,b,{getFilename:V=>`${V.name||"unnamed"}.${V.id}.yml`,exportAssets:e})}const D=g.join(h,"chunks");I.mkdirSync(D,{recursive:!0});const N=Ut();for(const B of Object.keys(t?.resources?.components??{}).filter(_=>l.includes(_))){const _=t.resources?.components?.[B]?.component;if(_&&_.renderer?.type==="react-component"){const V=_.renderer?.chunks??[];if(V?.length>0)for(const ie of V){const Ce=g.join(D,ie),ce=N?.[ie];try{ce&&I.existsSync(ce)&&!I.existsSync(Ce)&&I.copyFileSync(ce,Ce)}catch(Ke){f.logger.error(`copy chunk ${ie} error`,Ke.message)}}}}}return h}async function Oe(t,{importAssets:e,includeResources:s}={}){if(!I.existsSync(t))return null;let a,n=!1;try{I.lstatSync(t).isDirectory()?a=t:/\.(tgz|gz|tar)$/.test(t)&&(n=!0,a=Ue(),await ut.x({file:t,C:a}));const o=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),c=o&&g.join(g.dirname(o),"../../pages"),p=o&&g.join(g.dirname(o),"../../components"),l=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const S=x.parse(I.readFileSync(o).toString()),A=(m,d,y)=>{let P=g.join(m,`${d}${y?`.${y}`:""}.yml`);return(!I.existsSync(P)||!I.lstatSync(P).isFile())&&(P=g.join(m,d,`index${y?`.${y}`:""}.yml`),!I.existsSync(P)||!I.lstatSync(P))?null:x.parse(I.readFileSync(P).toString())},v=(m,d)=>{try{const y=X.globSync(`*.${d}.yml`,{cwd:m,absolute:!0})[0];return y?x.parse(I.readFileSync(y).toString()):null}catch(y){f.logger.error("parse component error",y)}return null},E=(m,d)=>{let y=g.join(m,`${d}.yml`);return(!I.existsSync(y)||!I.lstatSync(y).isFile())&&(y=g.join(m,d,"index.yml"),!I.existsSync(y)||!I.lstatSync(y))?null:x.parse(I.readFileSync(y).toString())},u=R(S.pages.map(({slug:m})=>{const d=R(S.supportedLocales.map(({locale:j})=>{const r=c?A(c,te(m),j):void 0;if(r)return{locale:j,page:r};const b=c?A(c,m,j):void 0;return b&&{locale:j,page:b}})),y=d[0]?.page;if(!y)return null;const P=y.sections.map(Ze.unzipSection);return{id:y.id||Te.nextId(),createdAt:y.createdAt,updatedAt:y.updatedAt,publishedAt:y.publishedAt,isPublic:y.isPublic??!0,templateConfig:y.templateConfig,slug:m,sections:Object.fromEntries(P.map(j=>[j.id,j])),sectionIds:P.map(j=>j.id),locales:Object.fromEntries(d.map(({locale:j,page:r})=>[j,r.meta])),dataSource:y.dataSource?Object.fromEntries([...new Set(d.flatMap(({page:j})=>Object.keys(j.dataSource??{})))].map(j=>[j,Object.fromEntries(d.map(({locale:r,page:b})=>{const D=b.dataSource?.[j];return[r,D||{}]}))])):Object.fromEntries([...new Set(d.flatMap(({page:j})=>j.sections.map(r=>r.id)))].map(j=>[j,Object.fromEntries(d.map(({locale:r,page:b})=>{const D=b.dataSource?.[j];if(D)return[r,D];const N=b.sections.find(B=>B.id===j);return[r,N?.properties||{}]}))]))}})),i=R(S?.routes?.map(({path:m})=>{const d=l?E(l,te(m)):void 0;return{...d,id:d?.id||Te.nextId(),createdAt:d?.createdAt??new Date().toISOString(),updatedAt:d?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:d?.path??`/${d?.id}`,params:d?.params,handler:d?.handler??"Pages Kit",isPublic:d?.isPublic??!0,enabledGenerate:d?.enabledGenerate??!1,displayTemplateId:d?.displayTemplateId??void 0,dataSource:d?.dataSource??{}}})??[]),h=p?R(S.components?.map(({id:m})=>v(p,m))??[]):[];if(e){const m=(...d)=>{f.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...d)};try{m("wait image-bin api ready"),await ht.default({resources:[`${Ie.getComponentWebEndpoint(f.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:P=>P>=200&&P<=500}),m("image-bin api is ready");const d={},y={};m("start to upload assets"),await Promise.allSettled([Re(h,d,{getFilePath:P=>p&&g.join(p,P),onFinish:P=>{m(`upload ${P.length} component assets`)}}),Re(u,y,{getFilePath:(P,j)=>{const r=Ee.default(u,j.slice(0,1));return c&&g.join(c,g.dirname(r.slug),P)},onFinish:P=>{m(`upload ${P.length} page assets`)}})]),m("upload assets done"),ye.clear(),global.gc&&global.gc()}catch(d){m("Error during asset import:",d)}}const T={};if(s){const m=o&&g.join(g.dirname(o),"../../resources/components"),d=R(S.resources?.components?.map(({id:y})=>v(m,y))??[]);d.length>0&&(T.components=Object.fromEntries(d.map((y,P)=>[y.id,{index:P,component:y}])))}return{supportedLocales:S.supportedLocales,pageIds:u.map(m=>m.id),components:Object.fromEntries(h.map((m,d)=>[m.id,{index:d,data:m}])),pages:Object.fromEntries(u.map(m=>[m.id,m])),config:S.config||{},resources:T,routeIds:i.map(m=>m.id),routes:Object.fromEntries(i.map(m=>[m.id,m])),dataSourceIds:[],dataSources:{}}}finally{n&&a&&I.rmSync(a,{force:!0,recursive:!0})}}async function Se(t,e,{routes:s,mergeMode:a="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&f.clearPreloadComponentsCacheByMode(o)}catch(E){f.logger.error("clear preload page cache error",{error:E})}const{pages:c,pageIds:p,routeIds:l,routes:S,supportedLocales:A}=t;if(o==="production"){let E=s??[],u=null;for(const i of l??[]){const h=S?.[i];if(h?.params&&h?.params.length>0&&h?.paramsOptions&&h?.paramsOptions.length>0){const T=Q.generateParamCombinations({basePath:h.path,params:h.params,routeId:h.id,paramsOptions:h.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),m=Object.fromEntries(T.map(d=>[`${i}-${d.paramOptionIds.join("-")}`,d]));u={...u||{},...m},s||(E=[...E,...T.map(d=>`${i}-${d.paramOptionIds.join("-")}`)])}else s||E.push(i)}f.logger.info("routeIds to be published: ",E);for(const i of E){let h=i;if(h.includes("-")){const[d]=h.split("-");h=d}const T=S?.[h];if(!T){const d=e.pageIds.indexOf(h);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[h]);for(const y of e.pageIds)y.includes(`${h}-`)&&(e.pageIds.splice(e.pageIds.indexOf(y),1),delete e.pages[y]);f.logger.info("delete main route page",h);continue}if(i.includes("-")&&!u?.[i]){const d=e.pageIds.indexOf(i);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[i]),f.logger.info("delete page",i);continue}if(!T.displayTemplateId){f.logger.info("no display template",i);continue}const m=c[T.displayTemplateId];if(!m){f.logger.info("no template page",i);continue}if(e.pageIds.includes(i)){if(f.logger.info("has need update page",i),a==="replace")e.pages[i]=ue({page:m,route:T,state:t,routeId:i,routePathInfo:u?.[i]}),f.logger.info("replace page",i);else if(a==="byUpdateTime"){const d=e.pages[T.id];(!d||T.updatedAt&&T.updatedAt>d.updatedAt)&&(e.pages[i]=ue({page:m,route:T,state:t,routeId:i,routePathInfo:u?.[i]}),f.logger.info("replace page by update time",i))}}else e.pageIds.push(i),e.pages[i]=ue({page:m,route:T,state:t,routeId:i,routePathInfo:u?.[i]}),f.logger.info("add page",i)}if(n&&!s)for(const i of e.pageIds)E?.includes(i)||(delete e.pages[i],f.logger.info("delete page",i)),e.pageIds=[...e.pageIds].filter(h=>E?.includes(h))}else{for(const E of p){const u=c[E];if(u)if(e.pageIds.includes(u.id)){if(a==="replace")e.pages[u.id]=u;else if(a==="byUpdateTime"){const i=e.pages[u.id];(!i||u.updatedAt&&u.updatedAt>i.updatedAt)&&(e.pages[u.id]=u)}}else e.pageIds.push(u.id),e.pages[u.id]=u}for(const E of l){const u=S[E];if(u)if(e.routeIds.includes(u.id)){if(a==="replace")e.routes[u.id]=u;else if(a==="byUpdateTime"){const i=e.routes[u.id];(!i||u.updatedAt&&u.updatedAt>i.updatedAt)&&(e.routes[u.id]=u)}}else e.routeIds.push(u.id),e.routes[u.id]=u}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...Le.default(A)),n)for(const E of Object.keys(e.components))delete e.components[E];let v=JSON.parse(JSON.stringify(t.components));v=Object.fromEntries(await Promise.all(Object.entries(v).map(async([E,u])=>{const i=await xe(u?.data);return[E,{...u,data:i}]}))),Object.assign(e.components,v),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),we.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const xe=f.memoizeWithFs(async t=>{if(!we.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:s}=t?.renderer||{};if(s||e&&e.includes("PROPERTIES_SCHEMA"))try{const a=await f.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,s);a&&a.length>0&&t&&(t.properties={},a.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(a){f.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let se,K,ne,oe;const Be=()=>Ie.getResources({types:[{did:Pe,type:ge},{did:bt,type:ge}]}),Ut=()=>{const t=Be(),e={};return t.forEach(s=>{const a=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const c of o)e[c]=g.join(n,c)}}),e};function Ve(){return se=(async()=>{const t=Be();K=(await Promise.all(t.map(async s=>{const a=s.path?await Oe(s.path,{importAssets:!1}):void 0;return a?{blockletId:s.did,state:a,blockletTitle:s.title}:void 0}))).filter(s=>!!s),ne=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.pages).map(n=>n?[n?.id,{page:n,blockletId:a.blockletId}]:[]))),{});const e=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.components).map(n=>[n.data.id,{blockletId:a.blockletId,component:n.data}]))),{});oe=Object.fromEntries(await Promise.all(Object.entries(e).map(async([s,a])=>{const n=await xe(a.component);return[s,{...a,component:n}]})))})(),se}function Ge(t){const e=_e.default(async()=>{await Ve().catch(s=>{f.logger.error("load resource states error",{error:s})}),await t?.({states:K,pages:ne,components:oe})},3e3,{leading:!1,trailing:!0});return e(),w.default.events.on(w.default.Events.componentAdded,e),w.default.events.on(w.default.Events.componentRemoved,e),w.default.events.on(w.default.Events.componentStarted,e),w.default.events.on(w.default.Events.componentStopped,e),w.default.events.on(w.default.Events.componentUpdated,e),w.default.events.on(me,e),()=>{w.default.events.off(w.default.Events.componentAdded,e),w.default.events.off(w.default.Events.componentRemoved,e),w.default.events.off(w.default.Events.componentStarted,e),w.default.events.off(w.default.Events.componentStopped,e),w.default.events.off(w.default.Events.componentUpdated,e),w.default.events.off(me,e)}}const ze=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Ye=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),re=globalThis;re[ze]?.();re[ze]=Ge(async({pages:t,components:e})=>{const s=await O.getProjectIds();f.logger.info(`start update resource states projects(${s.length})`,s),await Promise.race([new Promise(a=>{setTimeout(()=>{a({})},30*1e3)}),Promise.all(s.map(async a=>{He({projectId:a,pages:t,components:e})}))]).catch(a=>{f.logger.error("update resource states failed:",a)})});re[Ye]?.();re[Ye]=()=>{const t=()=>{O.pageUrlMapCache.clear(),f.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return w.default.events.on(w.default.Events.envUpdate,t),()=>{w.default.events.off(w.default.Events.envUpdate,t)}};O.startPeriodicCheck();process.on("beforeExit",()=>{O.stopPeriodicCheck()});process.on("SIGINT",()=>{O.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{O.stopPeriodicCheck(),process.exit(0)});async function He({projectId:t,pages:e,components:s}){const a=O.sharedInstances[t];if(!a){f.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(a.syncedStore.resources.pages=e,(await L.findByPk(t))?.useAllResources)a.syncedStore.resources.components=s;else{const c=(await Ae.findAll({where:{projectId:t}})).map(l=>l.componentId),p=Object.fromEntries(Object.entries(s||{}).filter(([l])=>c.includes(l)));a.syncedStore.resources.components=p}f.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function Mt(t){return He({projectId:t,pages:ne,components:oe})}async function $t(){f.logger.info("trigger reload all project resource"),w.default.events.emit(me)}async function Nt({ensureLoaded:t=!0}={}){return t&&(se??=Ve(),await se),{states:K,pages:ne,components:oe}}exports.COMPONENT_DID=Pe;exports.PUBLISH_MODES=Lt;exports.Project=L;exports.RESOURCE_TYPE=ge;exports.SITE_STATE_PATH=q;exports.STATE_MODES=Rt;exports.SiteState=O;exports.downloadAsset=$e;exports.downloadAssets=Ne;exports.fromPackage=Oe;exports.getDefaultState=Me;exports.getResourceStates=Nt;exports.initPackResourceStates=Ge;exports.mergeState=Se;exports.toPackage=qe;exports.triggerReloadAllProjectResource=$t;exports.updateResourceStatesByProjectId=Mt;
1
+ "use strict";const f=require("./components-DLLpFRy5.js"),F=require("@syncedstore/core"),Je=require("yjs"),We=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),Qe=require("lodash/cloneDeep"),Xe=require("@blocklet/sdk/lib/config"),I=require("fs"),g=require("path"),Te=require("@blocklet/pages-kit/utils/common"),Ze=require("@blocklet/pages-kit/utils/page-model"),et=require("@blocklet/pages-kit/utils/property"),Ie=require("@blocklet/sdk/lib/component"),tt=require("@reactivedata/reactive"),X=require("glob"),st=require("lib0/decoding"),at=require("lib0/encoding"),nt=require("lodash/debounce"),ot=require("lodash/get"),rt=require("lodash/isEmpty"),it=require("lodash/set"),ct=require("lodash/union"),be=require("lru-cache"),lt=require("p-limit"),C=require("sequelize"),pt=require("stream/promises"),ut=require("tar"),z=require("ufo"),dt=require("wait-on"),G=require("y-protocols/awareness"),le=require("y-protocols/sync"),ft=require("yaml"),De=require("./html-JOhPskS4.js");require("sqlite3");require("@blocklet/pages-kit/types/state");const $=t=>t&&t.__esModule?t:{default:t};function ae(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const a=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,a.get?a:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const U=ae(Je),Le=$(Qe),w=$(Xe),pe=ae(st),k=ae(at),_e=$(nt),Ee=$(ot),we=$(rt),ve=$(it),gt=$(ct),mt=$(lt),ht=$(dt),x=ae(ft),yt=C.DataTypes.sqlite.DATE.parse;C.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):yt(t,e);const M=new C.Sequelize({dialect:"sqlite",storage:f.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});M.query("pragma journal_mode = WAL;");M.query("pragma synchronous = normal;");M.query("pragma journal_size_limit = 33554432;");M.query("pragma cache_size = -2000;");M.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await M.close(),process.exit(0)});process.on("SIGTERM",async()=>{await M.close(),process.exit(0)});async function St(t,e){try{if(t.getDialect()!=="sqlite")return;const[s]=await t.query("SELECT 1");if(!s||s.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(s){if(s.name==="SequelizeConnectionError"||s?.message&&/closed!/.test(s.message))return;console.error("Failed to cleanup SQLite memory",e,s)}}let fe=null;fe&&clearInterval(fe);fe=setInterval(async()=>{f.logger.info("Start cleanupSqliteMemory"),await St(M,f.databaseUrl),f.logger.info("End cleanupSqliteMemory")},60*1e3*10);class Ae extends C.Model{}Ae.init({id:{type:C.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:C.DataTypes.UUIDV4},projectId:{type:C.DataTypes.UUID,allowNull:!1},componentId:{type:C.DataTypes.STRING,allowNull:!1}},{sequelize:M,tableName:"ProjectComponents",timestamps:!1});class L extends C.Model{static async getProjectByIdOrSlug(e){return L.findOne({where:{[C.Op.or]:[{id:e},{slug:e}]}})}}L.init({id:{type:C.DataTypes.UUID,defaultValue:C.DataTypes.UUIDV4,primaryKey:!0},name:{type:C.DataTypes.STRING,allowNull:!1},description:C.DataTypes.TEXT,createdAt:C.DataTypes.DATE,updatedAt:C.DataTypes.DATE,createdBy:{type:C.DataTypes.STRING,allowNull:!1},updatedBy:{type:C.DataTypes.STRING,allowNull:!1},slug:C.DataTypes.STRING,icon:C.DataTypes.STRING,pinnedAt:C.DataTypes.DATE,useAllResources:C.DataTypes.BOOLEAN,npmSecret:C.DataTypes.STRING,relatedBlocklets:{type:C.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 f.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:C.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 f.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}}},{sequelize:M,paranoid:!0});L.hasMany(Ae,{foreignKey:"projectId",as:"components"});const It="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",ge="page",me="trigger-reload-project-resource",Pe=It,bt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM";function Z(t){t.observeDeep(e=>{e.some(s=>s.changes.keys.has("updatedAt")||s.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Ue(){return I.mkdtempSync(g.join(w.default.env.dataDir,"tmp-"))}function ee(t,e,s=[]){return Array.isArray(t)?t.flatMap((a,n)=>ee(a,e,[...s,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([a,n])=>ee(n,e,[...s,a])):e(t)?[s]:[]}function R(t){return t.filter(e=>e!=null)}function Et(t){t.pages&&Object.keys(t.pages).forEach(s=>{const a=F.getYjsValue(t.pages[s]);a&&a instanceof U.Map&&Z(a)});const e=F.getYjsValue(t.pages);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.pages[n]);o&&o instanceof U.Map&&Z(o)}})})}function wt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=F.getYjsValue(t.routes?.[s]);a&&a instanceof U.Map&&Z(a)});const e=F.getYjsValue(t.routes);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.routes?.[n]);o&&o instanceof U.Map&&Z(o)}})})}function At(t,e){for(const s of e||Object.keys(t.routes||{})){let a=s,n=[];if(s.includes("-")){const[o,...c]=s.split("-");a=o,n=c||[]}if(t.routes?.[a]!==void 0){t.routes[a].publishedAt=new Date().toISOString();const o=t.routes[a];if(!o||!o.params||o.params.length===0)continue;if(s.includes("-")&&n.length>0){const c=Q.getRouteMetaDataByOptionIds(n,o);c&&(c.publishedAt=new Date().toISOString())}if(!e){const c=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const p of c)p.routeMetaData??={},p.routeMetaData.publishedAt=new Date().toISOString()}}}}function ue({page:t,route:e,state:s,routeId:a,routePathInfo:n}){f.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...Le.default(t),id:a,slug:n?.path??e.path,createdAt:e.createdAt,updatedAt:n?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:n?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(n?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const c of s.supportedLocales){if(e.dataSource){let p=e.id;n&&(p=n.paramOptionIds.join("-"));const l=e.dataSource.pathDataMappings?.[p]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[p]?.dataCache?.[s.config.defaultLocale||"en"];if(!l)continue;We.setPageDataSource(o,s,c.locale,l)}n&&n.routeMetaData&&(n.routeMetaData.publishedAt=new Date().toISOString())}return o}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const Pt=60*60*1e3,Y=new be.LRUCache({max:100,ttl:Pt,ttlResolution:10*1e3,allowStale:!0});function jt(t,e=[]){let s=0;const a=Array.from(Y.keys());for(const n of a)for(const o of t){if(De.matchCacheKey(n,{currentPath:o})){Y.delete(n),s++,f.logger.info(`[Cache CLEAR] key: ${n}`);break}for(const c of e)if(De.matchCacheKey(n,{currentPath:`/${c}${o}`})){Y.delete(n),s++,f.logger.info(`[Cache CLEAR] key: ${n}`);break}}return f.logger.info(`[Cache CLEAR] cleared ${s} entries for paths:`,t),s}function Ot(){const t=Y.size;return Y.clear(),f.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}w.default.events.on(w.default.Events.envUpdate,Ot);const{uploadToMediaKit:Ct}=require("@blocklet/uploader-server"),je=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,H=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,ke=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Tt=1e4,Dt=3e4,J=0,de=1,vt=0,kt=1,he=w.default,q=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Rt=["production","draft"],Lt=["production"];function te(t){return t?.replace(/\//g,"|")||""}function Me(){const t=he.env.languages?.map(s=>({locale:s.code,name:s.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class O extends U.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&U.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=tt.reactive(F.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new G.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 pageUrlMapCache=new be.LRUCache({max:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(q,e),a=g.join(q,`@del-${e}`);I.renameSync(s,a)}catch(s){f.logger.error("Failed to safe delete project state dir:",s)}}static async getProjectIds(){return(await L.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return X.globSync("*/",{cwd:q,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>O.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=O.sharedInstances[e];return s||(s=new O({path:g.join(q,e)}),O.sharedInstances[e]=s,s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(we.default(s?.productionState)){const a=g.join(q,e,"production"),n=await Oe(a,{includeResources:!0})??Me();if(!n?.config?.defaultLocale){n.config??={};const o=he.env.languages?.map(c=>({locale:c.code,name:c.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return s?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((s,a)=>this.closeConn(a)),this.awareness.destroy();const e=g.basename(this.options.path);delete O.sharedInstances[e],super.destroy()}initObserver(){Et(this.syncedStore),wt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=O.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return O.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return O.getProductionState(s)}async setState(e,s){const a=await qe(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(g.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);O.pageUrlMapCache.delete(o),await L.update({productionState:{...s}},{where:{id:o}})}}getPublishDir(e){return g.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:s,removed:a},n)=>{const o=e.concat(s,a);if(n!==null){const l=this.conns.get(n);l&&(e.forEach(S=>{l.add(S)}),a.forEach(S=>{l.delete(S)}))}const c=k.createEncoder();k.writeVarUint(c,de),k.writeVarUint8Array(c,G.encodeAwarenessUpdate(this.awareness,o));const p=k.toUint8Array(c);this.conns.forEach((l,S)=>this.send(S,p))};updateHandler=e=>{const s=k.createEncoder();k.writeVarUint(s,J),le.writeUpdate(s,e);const a=k.toUint8Array(s);this.conns.forEach((n,o)=>this.send(o,a))};ensureDataStructure=()=>{const{supportedLocales:e,pages:s,pageIds:a,config:n,routes:o,routeIds:c}=this.syncedStore;{const p=new Set(Object.keys(s));let l=0;for(;l<a.length;){const S=a[l];p.has(S)?(p.delete(S),l++):a.splice(l,1)}}{const p=new Set(Object.keys(o));let l=0;for(;l<c.length;){const S=c[l];p.has(S)?(p.delete(S),l++):c.splice(l,1)}}e.splice(0,e.length),e.push(...he.env.languages.map(p=>({locale:p.code,name:p.name}))),n.defaultLocale=e[0]?.locale;{let p=0;const l=new Set;for(;p<e.length;){const{locale:S}=e[p];l.has(S)?e.splice(p,1):(p++,l.add(S))}}};send=(e,s)=>{e.readyState!==vt&&e.readyState!==kt&&this.closeConn(e);try{e.send(s,a=>{a&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const s=this.conns.get(e);this.conns.delete(e),s&&G.removeAwarenessStates(this.awareness,Array.from(s),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=g.basename(this.options.path);this.releaseTimer=setTimeout(()=>{f.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},O.RELEASE_DELAY),f.logger.info(`[SiteState] scheduled release for project ${e} in ${O.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=g.basename(this.options.path);f.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=_e.default(()=>{I.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,U.encodeStateAsUpdate(this))},Tt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=await this.getState("draft"),n=await this.getState("production");await Se(a,n,{routes:s,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),At(this.syncedStore,s),await this.setState(e,n),await this.clearPageCacheForRoutes(s,n)};mergeState=async(e,s)=>{const a=JSON.parse(JSON.stringify(s));e.config.fontFamily??={};const n=a.config?.fontFamily,o=e.config?.fontFamily;e.config.fontFamily.title=n?.title||o?.title,e.config.fontFamily.description=n?.description||o?.description,await new Promise((c,p)=>{this.transact(async()=>{try{const l=await Se(e,s);c(l)}catch(l){p(l)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;let c=e;(!c||c.length===0)&&(c=s.pageIds??[]),f.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,c||[]);const p=s.supportedLocales.map(A=>A.locale),l=[],S=c.filter(A=>s.pageIds?.includes(A));for(const A of S){const E=s.pages[A].slug;o&&o!==a&&(o==="/"?l.push(E):l.push(`/${o}${E}`)),l.push(`/${a}${E}`)}if(f.logger.info(`[SiteState] clearing page cache for project ${a}, pathPatterns:`,l),l.length>0)try{const A=jt(l,p);f.logger.info(`[SiteState] cleared ${A} page cache entries for project ${a}, routes:`,c)}catch{}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",n=>this.messageListener(e,new Uint8Array(n)));let s=!0;const a=setInterval(()=>{if(!s)this.conns.has(e)&&this.closeConn(e),clearInterval(a);else if(this.conns.has(e)){s=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(a)}}},Dt);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{s=!0});{const n=k.createEncoder();k.writeVarUint(n,J),le.writeSyncStep1(n,this),this.send(e,k.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const c=k.createEncoder();k.writeVarUint(c,de),k.writeVarUint8Array(c,G.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,k.toUint8Array(c))}}};messageListener=(e,s)=>{try{const a=k.createEncoder(),n=pe.createDecoder(s),o=pe.readVarUint(n);switch(o){case J:k.writeVarUint(a,J),le.readSyncMessage(n,a,this,null),k.length(a)>1&&(this.ensureDataStructure(),this.send(e,k.toUint8Array(a)));break;case de:{G.applyAwarenessUpdate(this.awareness,pe.readVarUint8Array(n),e);break}default:f.logger.warn(`Unsupported messageType ${o}`)}}catch(a){f.logger.error(a)}this.save()};static async pageUrlMap(e,s){let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(c=>[c,!0])||[]);for(const c of a){const p=O.pageUrlMapCache.get(c);p&&(n={...n,...p},o.delete(c))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[C.Op.in]:a}}});await Promise.all(o?.map(async c=>{const p=c.id,l=c.slug||p,S={},A=e==="production"&&c?.productionState?c.productionState:await O.getStateByProjectId(c.id,e),v=gt.default(w.default.env.languages?.map(u=>u.code)||[],A.supportedLocales?.map(u=>u.locale)||[]),E=(u,i)=>{l&&(S[z.joinURL("/",l,u)]={...i,shouldRedirect:!0,mainPage:!0}),S[z.joinURL("/",p,u)]={...i,shouldRedirect:!0,mainPage:!0};for(const h of v){const T={...i,locale:h};S[z.joinURL("/",h,p,u)]=T,l&&(S[z.joinURL("/",h,l,u)]=T)}};if(e==="draft")for(const u of A.routeIds||[]){const i=A?.routes?.[u];if(!i)continue;if(i.params&&i.params.length>0){const m=Q.generateParamCombinations({basePath:i.path,params:i.params,routeId:i.id,paramsOptions:i.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const d of m){const y=d.path,P={projectId:p,projectSlug:l,pageSlug:y,pageId:i.displayTemplateId||"",routeId:u,defaultLocale:v?.[0],locales:v,publishedAt:A.config.publishedAt,isPublic:i.isPublic&&d?.routeMetaData?.isPublic};E(y,P)}}const h=i.path,T={projectId:p,projectSlug:l,pageSlug:h,pageId:i.displayTemplateId||"",routeId:u,defaultLocale:v?.[0],locales:v,publishedAt:A.config.publishedAt,isPublic:i.isPublic};E(h,T)}for(const u of A.pageIds||[]){const i=A.pages[u];if(!i||e==="production"&&!i.isPublic)continue;const h=i.slug,T=c.slug||p,m={projectId:p,projectSlug:T,pageSlug:h,pageId:u,defaultLocale:v?.[0],locales:v,publishedAt:A.config.publishedAt,isPublic:i.isPublic,templateConfig:i.templateConfig};E(h,m)}e==="production"&&O.pageUrlMapCache.set(p,S),n={...n,...S}}))}return n}getDocumentSize(){return U.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(O.sharedInstances)){const n=a.getDocumentSize();e.push({projectId:s,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:a.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),f.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,f.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(O.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(O.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(f.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){f.logger.info(`[SiteState] releasing ${s.length} instances without connections:`,s.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:c}of s)try{f.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),c.destroy(),n++}catch(p){f.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,p)}f.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?f.logger.debug("[SiteState] periodic check: all instances have active connections"):f.logger.debug("[SiteState] periodic check: no instances exist")}}async function _t(t,e,s){if(!t||!I.existsSync(t)||!I.lstatSync(t).isFile())return null;let a=s[t];return a||(a=(async()=>{try{return(await Ct({filePath:t,fileName:e}))?.data?.filename}catch(n){return f.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const $e=async(t,e)=>{const s=g.basename(t),a=await Ie.call({name:Pe,path:z.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await pt.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},Ne=async(t,e)=>{await Promise.all(t.map(async s=>{try{await $e(s,g.join(e,g.basename(s)))}catch(a){f.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function Fe(t){return je.test(t)?[t]:H.test(t)?(ke.lastIndex=0,Array.from(t.matchAll(ke)).map(s=>s[1]).filter(s=>!!s)):[]}async function W(t,e,s){const{getFilename:a,exportAssets:n}=s,o=g.join(e,a(t));if(I.mkdirSync(g.dirname(o),{recursive:!0}),I.writeFileSync(o,x.stringify(t)),n){const p=ee(t,l=>typeof l=="string"&&(je.test(l)||H.test(l))).map(l=>{const S=Ee.default(t,l);return Fe(S)}).flat().filter(Boolean);await Ne(p,g.dirname(o))}}const ye=new be.LRUCache({max:100,ttl:1*60*1e3});async function Re(t,e,s){const a=ee(t,p=>typeof p=="string"&&(je.test(p)||H.test(p))),n=mt.default(2),o=a.map(p=>n(async()=>{try{const l=Ee.default(t,p),S=Fe(l);for(const A of S){const v=g.basename(A),E=s.getFilePath(A,p),u=E?`${E}:${v}`:v,i=ye.get(u);if(i){H.test(l)||ve.default(t,p,i);return}const h=await _t(E,v,e);h&&(H.test(l)||ve.default(t,p,h),ye.set(u,h))}}catch(l){f.logger.error(`Failed to process upload for path ${p.join(".")}:`,l.message||l.reason)}})),c=await Promise.allSettled(o);s.onFinish?.(c)}async function qe(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:c="all"}={}){const p=s==="all"?t.pageIds:s,l=et.getComponentDependencies({state:t,pageIds:p,componentIds:a==="all"?Object.keys(t.components):a}),S=c==="all"?t.routeIds:c,A=r=>({id:r.id,name:r.name,isTemplateSection:r.isTemplateSection??!1,templateDescription:r.templateDescription,llmConfig:r.llmConfig,component:r.component,config:r.config,visibility:r.visibility,sections:r?.sectionIds?R(r?.sectionIds?.map(b=>{const D=r.sections?.[b];return D&&A(D)})):void 0}),v=(r,b)=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,isPublic:r.isPublic??!0,templateConfig:r.templateConfig,meta:r.locales?.[b]??{},sections:R(r.sectionIds.map(D=>{const N=r.sections[D];return N&&A(N)})),dataSource:Object.fromEntries(Object.entries(r.dataSource||{}).map(([D,N])=>[D,N?.[b]??{}]))}),E=r=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,path:r.path,handler:r.handler,isPublic:r.isPublic??!0,params:r.params??[],enabledGenerate:r.enabledGenerate??!1,displayTemplateId:r.displayTemplateId,dataSource:r.dataSource}),u=R(S.map(r=>{const b=t.routes[r];return b&&E(b)})),i=R(t.supportedLocales.map(r=>r.locale).flatMap(r=>p.map(b=>{const D=t.pages[b];return D&&{locale:r,slug:D.slug,page:v(D,r)}}))),h=Ue(),T=g.join(h,"pages");I.mkdirSync(T,{recursive:!0});const m=g.join(h,"components");I.mkdirSync(m,{recursive:!0});const d=g.join(h,"routes");I.mkdirSync(d,{recursive:!0});for(const{locale:r,slug:b,page:D}of i)await W(D,T,{getFilename:()=>`${te(b)||"index"}.${r}.yml`,exportAssets:e});for(const r of u)await W(r,d,{getFilename:()=>`${te(r.path)||"index"}.yml`,exportAssets:e});for(const r of l){const b=t.components[r]?.data;b&&await W(b,m,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const y=g.join(h,".blocklet/pages/pages.config.yml");I.mkdirSync(g.dirname(y),{recursive:!0});const P={pages:R(p.map(r=>{const b=t.pages[r];return b&&{id:r,slug:b.slug}})),routes:R(S.map(r=>{const b=t.routes[r];return b&&{id:r,path:b.path}})),components:R(l.map(r=>{const b=t.components[r]?.data;return b&&{id:r,name:b.name}})),...o?{resources:{components:R(Object.keys(t.resources?.components||{}).filter(r=>l.includes(r)).map(r=>({id:r,name:t.resources?.components?.[r]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};I.writeFileSync(y,x.stringify(P));const j=g.join(h,"config.source.json");if(n&&I.writeFileSync(j,JSON.stringify(n)),o){const r=g.join(h,"resources"),b=g.join(r,"components");I.mkdirSync(b,{recursive:!0});for(const B of Object.keys(t?.resources?.components??{}).filter(_=>l.includes(_))){const _=t.resources?.components?.[B]?.component;_&&await W(_,b,{getFilename:V=>`${V.name||"unnamed"}.${V.id}.yml`,exportAssets:e})}const D=g.join(h,"chunks");I.mkdirSync(D,{recursive:!0});const N=Ut();for(const B of Object.keys(t?.resources?.components??{}).filter(_=>l.includes(_))){const _=t.resources?.components?.[B]?.component;if(_&&_.renderer?.type==="react-component"){const V=_.renderer?.chunks??[];if(V?.length>0)for(const ie of V){const Ce=g.join(D,ie),ce=N?.[ie];try{ce&&I.existsSync(ce)&&!I.existsSync(Ce)&&I.copyFileSync(ce,Ce)}catch(Ke){f.logger.error(`copy chunk ${ie} error`,Ke.message)}}}}}return h}async function Oe(t,{importAssets:e,includeResources:s}={}){if(!I.existsSync(t))return null;let a,n=!1;try{I.lstatSync(t).isDirectory()?a=t:/\.(tgz|gz|tar)$/.test(t)&&(n=!0,a=Ue(),await ut.x({file:t,C:a}));const o=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),c=o&&g.join(g.dirname(o),"../../pages"),p=o&&g.join(g.dirname(o),"../../components"),l=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const S=x.parse(I.readFileSync(o).toString()),A=(m,d,y)=>{let P=g.join(m,`${d}${y?`.${y}`:""}.yml`);return(!I.existsSync(P)||!I.lstatSync(P).isFile())&&(P=g.join(m,d,`index${y?`.${y}`:""}.yml`),!I.existsSync(P)||!I.lstatSync(P))?null:x.parse(I.readFileSync(P).toString())},v=(m,d)=>{try{const y=X.globSync(`*.${d}.yml`,{cwd:m,absolute:!0})[0];return y?x.parse(I.readFileSync(y).toString()):null}catch(y){f.logger.error("parse component error",y)}return null},E=(m,d)=>{let y=g.join(m,`${d}.yml`);return(!I.existsSync(y)||!I.lstatSync(y).isFile())&&(y=g.join(m,d,"index.yml"),!I.existsSync(y)||!I.lstatSync(y))?null:x.parse(I.readFileSync(y).toString())},u=R(S.pages.map(({slug:m})=>{const d=R(S.supportedLocales.map(({locale:j})=>{const r=c?A(c,te(m),j):void 0;if(r)return{locale:j,page:r};const b=c?A(c,m,j):void 0;return b&&{locale:j,page:b}})),y=d[0]?.page;if(!y)return null;const P=y.sections.map(Ze.unzipSection);return{id:y.id||Te.nextId(),createdAt:y.createdAt,updatedAt:y.updatedAt,publishedAt:y.publishedAt,isPublic:y.isPublic??!0,templateConfig:y.templateConfig,slug:m,sections:Object.fromEntries(P.map(j=>[j.id,j])),sectionIds:P.map(j=>j.id),locales:Object.fromEntries(d.map(({locale:j,page:r})=>[j,r.meta])),dataSource:y.dataSource?Object.fromEntries([...new Set(d.flatMap(({page:j})=>Object.keys(j.dataSource??{})))].map(j=>[j,Object.fromEntries(d.map(({locale:r,page:b})=>{const D=b.dataSource?.[j];return[r,D||{}]}))])):Object.fromEntries([...new Set(d.flatMap(({page:j})=>j.sections.map(r=>r.id)))].map(j=>[j,Object.fromEntries(d.map(({locale:r,page:b})=>{const D=b.dataSource?.[j];if(D)return[r,D];const N=b.sections.find(B=>B.id===j);return[r,N?.properties||{}]}))]))}})),i=R(S?.routes?.map(({path:m})=>{const d=l?E(l,te(m)):void 0;return{...d,id:d?.id||Te.nextId(),createdAt:d?.createdAt??new Date().toISOString(),updatedAt:d?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:d?.path??`/${d?.id}`,params:d?.params,handler:d?.handler??"Pages Kit",isPublic:d?.isPublic??!0,enabledGenerate:d?.enabledGenerate??!1,displayTemplateId:d?.displayTemplateId??void 0,dataSource:d?.dataSource??{}}})??[]),h=p?R(S.components?.map(({id:m})=>v(p,m))??[]):[];if(e){const m=(...d)=>{f.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...d)};try{m("wait image-bin api ready"),await ht.default({resources:[`${Ie.getComponentWebEndpoint(f.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:P=>P>=200&&P<=500}),m("image-bin api is ready");const d={},y={};m("start to upload assets"),await Promise.allSettled([Re(h,d,{getFilePath:P=>p&&g.join(p,P),onFinish:P=>{m(`upload ${P.length} component assets`)}}),Re(u,y,{getFilePath:(P,j)=>{const r=Ee.default(u,j.slice(0,1));return c&&g.join(c,g.dirname(r.slug),P)},onFinish:P=>{m(`upload ${P.length} page assets`)}})]),m("upload assets done"),ye.clear(),global.gc&&global.gc()}catch(d){m("Error during asset import:",d)}}const T={};if(s){const m=o&&g.join(g.dirname(o),"../../resources/components"),d=R(S.resources?.components?.map(({id:y})=>v(m,y))??[]);d.length>0&&(T.components=Object.fromEntries(d.map((y,P)=>[y.id,{index:P,component:y}])))}return{supportedLocales:S.supportedLocales,pageIds:u.map(m=>m.id),components:Object.fromEntries(h.map((m,d)=>[m.id,{index:d,data:m}])),pages:Object.fromEntries(u.map(m=>[m.id,m])),config:S.config||{},resources:T,routeIds:i.map(m=>m.id),routes:Object.fromEntries(i.map(m=>[m.id,m])),dataSourceIds:[],dataSources:{}}}finally{n&&a&&I.rmSync(a,{force:!0,recursive:!0})}}async function Se(t,e,{routes:s,mergeMode:a="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&f.clearPreloadComponentsCacheByMode(o)}catch(E){f.logger.error("clear preload page cache error",{error:E})}const{pages:c,pageIds:p,routeIds:l,routes:S,supportedLocales:A}=t;if(o==="production"){let E=s??[],u=null;for(const i of l??[]){const h=S?.[i];if(h?.params&&h?.params.length>0&&h?.paramsOptions&&h?.paramsOptions.length>0){const T=Q.generateParamCombinations({basePath:h.path,params:h.params,routeId:h.id,paramsOptions:h.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),m=Object.fromEntries(T.map(d=>[`${i}-${d.paramOptionIds.join("-")}`,d]));u={...u||{},...m},s||(E=[...E,...T.map(d=>`${i}-${d.paramOptionIds.join("-")}`)])}else s||E.push(i)}f.logger.info("routeIds to be published: ",E);for(const i of E){let h=i;if(h.includes("-")){const[d]=h.split("-");h=d}const T=S?.[h];if(!T){const d=e.pageIds.indexOf(h);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[h]);for(const y of e.pageIds)y.includes(`${h}-`)&&(e.pageIds.splice(e.pageIds.indexOf(y),1),delete e.pages[y]);f.logger.info("delete main route page",h);continue}if(i.includes("-")&&!u?.[i]){const d=e.pageIds.indexOf(i);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[i]),f.logger.info("delete page",i);continue}if(!T.displayTemplateId){f.logger.info("no display template",i);continue}const m=c[T.displayTemplateId];if(!m){f.logger.info("no template page",i);continue}if(e.pageIds.includes(i)){if(f.logger.info("has need update page",i),a==="replace")e.pages[i]=ue({page:m,route:T,state:t,routeId:i,routePathInfo:u?.[i]}),f.logger.info("replace page",i);else if(a==="byUpdateTime"){const d=e.pages[T.id];(!d||T.updatedAt&&T.updatedAt>d.updatedAt)&&(e.pages[i]=ue({page:m,route:T,state:t,routeId:i,routePathInfo:u?.[i]}),f.logger.info("replace page by update time",i))}}else e.pageIds.push(i),e.pages[i]=ue({page:m,route:T,state:t,routeId:i,routePathInfo:u?.[i]}),f.logger.info("add page",i)}if(n&&!s)for(const i of e.pageIds)E?.includes(i)||(delete e.pages[i],f.logger.info("delete page",i)),e.pageIds=[...e.pageIds].filter(h=>E?.includes(h))}else{for(const E of p){const u=c[E];if(u)if(e.pageIds.includes(u.id)){if(a==="replace")e.pages[u.id]=u;else if(a==="byUpdateTime"){const i=e.pages[u.id];(!i||u.updatedAt&&u.updatedAt>i.updatedAt)&&(e.pages[u.id]=u)}}else e.pageIds.push(u.id),e.pages[u.id]=u}for(const E of l){const u=S[E];if(u)if(e.routeIds.includes(u.id)){if(a==="replace")e.routes[u.id]=u;else if(a==="byUpdateTime"){const i=e.routes[u.id];(!i||u.updatedAt&&u.updatedAt>i.updatedAt)&&(e.routes[u.id]=u)}}else e.routeIds.push(u.id),e.routes[u.id]=u}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...Le.default(A)),n)for(const E of Object.keys(e.components))delete e.components[E];let v=JSON.parse(JSON.stringify(t.components));v=Object.fromEntries(await Promise.all(Object.entries(v).map(async([E,u])=>{const i=await xe(u?.data);return[E,{...u,data:i}]}))),Object.assign(e.components,v),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),we.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const xe=f.memoizeWithFs(async t=>{if(!we.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:s}=t?.renderer||{};if(s||e&&e.includes("PROPERTIES_SCHEMA"))try{const a=await f.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,s);a&&a.length>0&&t&&(t.properties={},a.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(a){f.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let se,K,ne,oe;const Be=()=>Ie.getResources({types:[{did:Pe,type:ge},{did:bt,type:ge}]}),Ut=()=>{const t=Be(),e={};return t.forEach(s=>{const a=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const c of o)e[c]=g.join(n,c)}}),e};function Ve(){return se=(async()=>{const t=Be();K=(await Promise.all(t.map(async s=>{const a=s.path?await Oe(s.path,{importAssets:!1}):void 0;return a?{blockletId:s.did,state:a,blockletTitle:s.title}:void 0}))).filter(s=>!!s),ne=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.pages).map(n=>n?[n?.id,{page:n,blockletId:a.blockletId}]:[]))),{});const e=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.components).map(n=>[n.data.id,{blockletId:a.blockletId,component:n.data}]))),{});oe=Object.fromEntries(await Promise.all(Object.entries(e).map(async([s,a])=>{const n=await xe(a.component);return[s,{...a,component:n}]})))})(),se}function Ge(t){const e=_e.default(async()=>{await Ve().catch(s=>{f.logger.error("load resource states error",{error:s})}),await t?.({states:K,pages:ne,components:oe})},3e3,{leading:!1,trailing:!0});return e(),w.default.events.on(w.default.Events.componentAdded,e),w.default.events.on(w.default.Events.componentRemoved,e),w.default.events.on(w.default.Events.componentStarted,e),w.default.events.on(w.default.Events.componentStopped,e),w.default.events.on(w.default.Events.componentUpdated,e),w.default.events.on(me,e),()=>{w.default.events.off(w.default.Events.componentAdded,e),w.default.events.off(w.default.Events.componentRemoved,e),w.default.events.off(w.default.Events.componentStarted,e),w.default.events.off(w.default.Events.componentStopped,e),w.default.events.off(w.default.Events.componentUpdated,e),w.default.events.off(me,e)}}const ze=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Ye=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),re=globalThis;re[ze]?.();re[ze]=Ge(async({pages:t,components:e})=>{const s=await O.getProjectIds();f.logger.info(`start update resource states projects(${s.length})`,s),await Promise.race([new Promise(a=>{setTimeout(()=>{a({})},30*1e3)}),Promise.all(s.map(async a=>{He({projectId:a,pages:t,components:e})}))]).catch(a=>{f.logger.error("update resource states failed:",a)})});re[Ye]?.();re[Ye]=()=>{const t=()=>{O.pageUrlMapCache.clear(),f.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return w.default.events.on(w.default.Events.envUpdate,t),()=>{w.default.events.off(w.default.Events.envUpdate,t)}};O.startPeriodicCheck();process.on("beforeExit",()=>{O.stopPeriodicCheck()});process.on("SIGINT",()=>{O.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{O.stopPeriodicCheck(),process.exit(0)});async function He({projectId:t,pages:e,components:s}){const a=O.sharedInstances[t];if(!a){f.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(a.syncedStore.resources.pages=e,(await L.findByPk(t))?.useAllResources)a.syncedStore.resources.components=s;else{const c=(await Ae.findAll({where:{projectId:t}})).map(l=>l.componentId),p=Object.fromEntries(Object.entries(s||{}).filter(([l])=>c.includes(l)));a.syncedStore.resources.components=p}f.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function Mt(t){return He({projectId:t,pages:ne,components:oe})}async function $t(){f.logger.info("trigger reload all project resource"),w.default.events.emit(me)}async function Nt({ensureLoaded:t=!0}={}){return t&&(se??=Ve(),await se),{states:K,pages:ne,components:oe}}exports.COMPONENT_DID=Pe;exports.PUBLISH_MODES=Lt;exports.Project=L;exports.RESOURCE_TYPE=ge;exports.SITE_STATE_PATH=q;exports.STATE_MODES=Rt;exports.SiteState=O;exports.downloadAsset=$e;exports.downloadAssets=Ne;exports.fromPackage=Oe;exports.getDefaultState=Me;exports.getResourceStates=Nt;exports.initPackResourceStates=Ge;exports.mergeState=Se;exports.toPackage=qe;exports.triggerReloadAllProjectResource=$t;exports.updateResourceStatesByProjectId=Mt;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-D1oFQM3W.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("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-DLLpFRy5.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("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,3 +1,3 @@
1
1
  "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("flat"),t=e.flatten({cannotFindPropertyKey:"Cannot find property key: {key}",deleteProjectAlertPrefix:"This will permanently delete the project named",resetProjectAlertPrefix:"This will reset the project named",deleteProjectAlertSuffix:"project",resetProjectAlertSuffix:"project",confirmTip:"Please enter the project name",confirmDelete:"Please enter {name} to confirm deletion",confirmReset:"Please enter {name} to confirm reset",uploadNewIcon:"Upload new icon",requiredKey:"Key cannot be empty, please set a unique key, so that it can be referenced and configured in the component",duplicateKey:"Key already exists, please set a unique key",clickToGenerateNpmLink:"Click to generate link",projects:{project:"Project",myProjects:"My Projects",projectToGetStart:"Create Project",unnamed:"Unnamed Project",noDescription:"No description",lastUpdated:"Last updated",edit:"Edit",delete:"Delete",pin:"Pin",unpin:"Unpin",name:"Name",slug:"Slug",projectSlug:"Please enter your project slug",projectName:"Please enter your project name",newProjectDescriptionPlaceholder:"Please describe your project",description:"Description",chooseTemplate:"Choose Template",chooseTemplateTip:"Choose a template to start, or select Blank Template to create your own",blankTemplate:"Blank Template",welcomeTemplate:"Welcome Template",limitReached:"Expand Project Count",limitReachedTip:"You have reached the limit of <b>{limit}</b> projects. Please delete the unused projects and try again.<br/>You can also launch your own Pages Kit to create more projects.",limitReachedConfirm:"Launch My Pages Kit",topToggle:{sitemap:"Sitemap",data:"Data Source",template:"Templates",page:"Pages"},dataSourceEmpty:'No data sources yet, click "Add" button to create',selectDataSource:"Please select a data source from the list",createDataSourceFirst:"Please create a data source first"},alert:{delete:"Delete"},common:{collapseTopPanel:"Collapse top panel",collapseBottomPanel:"Collapse bottom panel",collapseAll:"Collapse All",expandAll:"Expand All",goToHome:"Go to Home",delete:"Delete",cancel:"Cancel",add:"Add",addMultiple:"Add ({count})",create:"Create",language:"Language",pageNotFound:"Page Not Found",confirmDialogTitle:"Confirm",all:"All",back:"Back Home",retry:"Retry",defaultLanguage:"default",close:"Close",saveSuccess:"Save Success",resourceBlocklet:"Resource Blocklet",select:"Select ",ok:"OK",refreshData:"Refresh Data",clear:"Clear",confirm:"Confirm"},section:{card:{type:"Card Type",title:"Cards",addCard:"Add Card",align:"Card align",textAlign:"Text align"},list:{columns:"Columns",gap:"Gap",align:"Align"}},maker:{sections:{empty:"No Sections",emptySubItems:"No Sub Sections",dropHere:"Drop here",moreItems:"more items"},layoutBlock:{draftPlaceholder:`Use grid to arrange sections layout \r
2
- ( this tip only show in draft mode)`},pageTitle:"Pages Editor",save:"Save",publish:"Publish",publishToProduction:"Publish to production",publishToProductionTip:"Anyone can see production version",publishConfirmContent:"Publish to",publishSelectPagesMessage:"Please select the pages to publish",publishSuccessMessage:"Published",importSuccessMessage:"Imported successfully",preview:"Preview",pagePreview:"Preview",livePreview:"Live Preview",production:"Production",draft:"Draft",previewRouteWithDynamicParams:"Cannot preview a route with dynamic parameters. Please select or configure parameter options in the Site Map first.",configColor:"Config color",configColorMuiTheme:"Theme Color",configColorCustomColor:"Custom Color",configColorMuiThemeInfo:"Use theme color, it will automatically adapt to the theme color and dark mode",configColorMuiThemeWithAlternateColor:" (includes light and dark modes)",configColorLightMode:"Light Mode",configColorDarkMode:"Dark Mode",import:"Import",importDialog:{upload:{title:"Import from file",description:"Import from local file",tip:"Please select the file to import"},resource:{description:"Import from resource"}},error:{dataSourceNotFound:"Please configure the page data source in Site Map first",refreshDataFailed:"Failed to refresh data, please try again later",missingRouteOrProject:"Missing route or project information"},export:"Export",noPreviewAvailable:"No preview available",networkStatus:{online:"Network connected - Your changes will sync to server in real-time",offline:"Network disconnected - Your changes will sync automatically when connection is restored"},routePreview:{loading:"Loading...",generatingPageStructure:"Generating page content structure...",generatingSectionContent:"Generating section content...",routePreview:"Preview",noDisplayTemplate:"This route has no display template",templateNotFound:"Display template not found",noSectionsAvailable:"No sections available",optimizeContent:"Optimize Content",optimizeContentButton:"Use AI to optimize content",sectionRule:"Section Rule",sectionRulePlaceholder:"Enter your section rule or instructions for AI generation",confirmOptimize:"Confirm",cancelOptimize:"Cancel"},pages:{addPage:"Create Page",createResource:"Create Resource",addResource:"Add Resource from Store",pages:"Pages",template:"Templates",sections:"Sections",deleteTitle:"Delete {name} page?",deleteSectionTitle:"Delete {name} section?",empty:"No pages",needPublish:"This page has unpublished changes",notPublic:"This page is not public",expandAllRoutes:"Expand all associated routes",collapseAllRoutes:"Collapse all associated routes",addPageDialog:{title:"Create New Page",templateName:"Template Name",templateNamePlaceholder:"Enter page template name",autoCreateRoute:"Auto create route",create:"Create",cancel:"Cancel"},moreItems:"more items"},components:{components:"Components",addComponent:"Add Component",basicGroup:"Basic",customGroup:"Custom",resourceGroup:"Resource",deleteTitle:"Delete {name} component?",noComponents:"No Components",needAddResource:"Please select resource components in project settings",searchComponent:"Please enter component name to search"},outline:{outline:"Outline"},properties:{addArrayItem:"Add Row",arrayEmpty:"No Row",subProperties:"Sub Properties",addSubProperty:"Add Sub Property",noSubProperties:"No Sub properties",noProperties:"No properties",noParameters:"No configurable parameters",properties:"Properties",setDefaultLocale:"Set default",copyDefault:"Copy over default",copyFull:"Full copy",migrateFromOld:"Full copy from old version",path:"Path",title:"Title",description:"Description",icon:"Icon",iconSize:"Icon size",image:"Image",imageOptimization:"Image Optimization",imageOptimizationFast:"Best for speed",imageOptimizationQuality:"Best for visual quality",imageMode:"Image Mode",hoverStyle:"Hover Style",videoPoster:"Video Poster",imageSize:"Image size",hasImage:"Has Image",fullSizeImage:"Full Size Image",src:"Source",dark:"Dark",reverse:"Reverse",background:"Background",backgroundFullWidth:"Background Full Width",backgroundFullWidthHelper:"The background will cover the entire page",badge:"Badge",buttons:"Buttons",button:"Button",border:{title:"Border",helper:"Set the border style of the layout",custom:"Custom Border",width:"Border Width(px)",style:"Border Style",color:"Border Color",preview:"Border Preview",solid:"Solid",dashed:"Dashed",dotted:"Dotted",double:"Double",groove:"Groove",ridge:"Ridge",inset:"Inset",outset:"Outset",borderHelper:"Set the border style of the layout",frame:{borderFrame:"Border",deviceFrame:"Device",browserFrame:"Browser",shadowFrame:"Shadow",terminalFrame:"Terminal",commonFrame:"Common"}},borderRadius:{title:"Border Radius",helper:"Set the border radius of the layout",custom:"Custom Border Radius",value:"Radius Value(px)",preview:"Radius Preview"},shadow:"Shadow",color:"Color",variant:"Variant",isPageLink:"Is page link?",link:"Link",style:"Style",card:"Card",list:"List",center:"Center",sort:"Order by",asc:"Ascending",desc:"Descending",createdAt:"Create Time",updatedAt:"Update Time",pathCheckRequired:"Path is required",pathCheckStartWithSlash:"Path must start with /",pathCheckEndWithoutSlash:"Path cannot end with /",pathCheckConsecutiveSlash:"Path cannot contain consecutive /",pathCheckWhitespace:"Path cannot contain whitespace",pathCheckInvalid:"Invalid path format",pathCheckAlreadyExist:"Path is already exist",pathCheckHelper:"This field now manages template names. To modify page access paths, please navigate to Site Map settings.",embedUrl:"Embed url",chooseEmbed:"Choose embed",translateFrom:"Translate from",backgroundColor:"Color",backgroundImage:"Image / Video",customColor:"Custom color",customImage:"Custom image / video",boxed:"Nested box mode",bigMode:"Big title mode",paddingY:"Vertical Padding",paddingX:"Horizontal Padding",maxWidth:"Max Width",maxWidthCustomTip:"For example: 1200px, 80%, 50vw",paddingCustomTip:"For example: 10px, 20px, 30px",layoutBlockMaxWidthHelper:"Set the maximum width of the layout, this will make the layout not follow the maximum width setting in the page global style",customValue:"Custom Value",stickyHeader:"Sticky Header",translucent:"Translucent Mode",hideNavMenus:"Hide Navigation Menus",hideFooter:"Hide Footer",size:"Size",height:"Height",autoWidth:"Auto Width",iframeHeight:"Content Height",translucentTextColor:"Translucent Text Color",copyFromOtherLanguage:"Copy from other language",useCache:"Use Cache",cacheDuration:"Cache Duration (seconds)",customComponent:"Custom Component",parameters:"Parameters",buttonTitle:"Button {index} Title",cardTitle:"Card {index} Title",cardDescription:"Card {index} Description",cardButtonTitle:"Card {index} Button {actionIndex} Title",copyLanguageDescription:"All properties will be copied from the selected language to the current language, which will override the existing content in the current language.",isPublic:"Public Access",isTemplate:"Use as template page",isTemplateSection:"Template dynamic card",templateDescription:"Card description, used to generate card content when using AIGNE to generate page content",templateSectionNameRequired:"Name is required for template section to set values when using dynamic templates",templateSectionNameHelper:"Section name is used to identify the section in the template, please use a meaningful and unique name, so that the section can be set content later",templateSectionNameDuplicated:"Section name must be unique among all template sections in the page",propertyNotFound:"Failed to modify parameter, reason: component does not exist `{key}` property",configLLMDescription:"Configure LLM description",llmConfigTitle:"Configure LLM Description",llmConfigLabel:"LLM Configuration Information",llmConfigPlaceholder:"Enter additional configuration information for LLM",llmConfigInstructions:"Configure which properties should be processed by AI and provide detailed descriptions.",llmPropertyDescribe:"Description for AI",loading:"Loading...",componentNotFound:"Component not found",templateName:"Template Name",mobile:"Mobile",desktop:"Desktop",columns:"Columns",gap:"Layout Gap",gapHelper:"Set the gap between components in the layout, if the horizontal gap will overflow the width, it will not be applied",gapUnit:"px",padding:"Padding",paddingHelper:"Set the padding of the layout",alignContent:{title:"Vertical Alignment",helper:"Set the vertical alignment of content in the layout"},justifyContent:{title:"Horizontal Alignment",helper:"Set the horizontal alignment of content in the layout"},visualGridLayout:"Configure Grid Layout",dragResizeInstructions:"Drag and resize cards to set layout, you can set different layouts for desktop and mobile",setAsBackgroundElement:"Set as background element (cannot drag and resize)",setAsNormalElement:"Set as normal element (can drag and resize)"},siteMap:{routes:"Routes",empty:"No Routes",pageProperties:"Route Properties",handler:"Handler",data:"Data Source",noDataSource:"No data source",loading:"Loading",unknownSource:"Unknown Source",question:"Page Rules",questionPlaceholder:"Enter page rules, describe your requirements",pageTemplate:"Page Template",selectPageTemplate:"Select a page template",agent:"Agent",noAgent:"No Agent",noRouteSelected:"No route selected. Please select a route from the list or create a new one.",enableGenerate:"Enable AI Generate",path:"Path",generate:"Generate Page Content",generating:"Generating...",deleteRouteTitle:"Delete Route",deleteRouteConfirm:"Are you sure you want to delete this route? This action cannot be undone.",routeDeleted:"Route deleted successfully",confirmRemoveParamsTitle:"Remove Dynamic Parameters",confirmRemoveParamsDescription:"The following dynamic parameters will be removed from the route:",paramOptionsTitle:"Parameter Options",paramOptionsDescription:"Configure options for dynamic parameters in the route",paramOptionName:"Option name",deleteOption:"Delete option",addChildOption:"Add child option",noParamOptions:"No parameter options yet, click the button below to add",addParamOption:"Add parameter option",errorEmptyValue:"Value cannot be empty",errorContainsSlash:"Value cannot contain slash (/)",errorInvalidChars:"Value contains invalid characters, please use only URL-safe characters"},datasource:{autoSaveSuccess:"Auto save success"}},error:{embedUrl:"Embed url error",notFoundEmbed:"Not Found Embed",noBackground:"No background",notConfig:"Not config",slugAlreadyExists:"Slug already exists",slugRequired:"Slug cannot be empty",invalidJson:"Invalid JSON format"},fabric:{fontFamily:"Font Family (Deprecated)",basicComponent:{titleFontFamily:"Title Font Family",titleFontFamilyHelper:"* Globally modify the paragraph heading font",descFontFamily:"Description Font Family",descFontFamilyHelper:"* Globally modify the paragraph description font"}},ai:{list:{noTemplatesInStudio:"You haven't create any prompt template in AI Studio yet.",createNow:"Create Now",noTemplates:"No template has been provided yet"},output:{errorMessage:"Something wrong with me, please try it later.",words:"Words",characters:"Characters",copied:"Copied!"},generate:"Generate",text:{title:"Text Assistant",description:"Use AI to help with write text",theme:"Content",themeHelper:"Organize the input to make it more suitable for the web page",language:"Language",languageHelper:"Output text language",size:"Size",sizeHelper:"Output text size",original:"Original",improve:"Improve"},status:{install:"Check whether the ai-kit is installed",unavailable:"Check whether the openai key is set properly"}},translate:{translate:"Translate",title:"Translation page",into:"Translate into",ing:"Translating",ingTip:"Translating content to {targetLanguage}. please wait a moment..",confirm:"Confirm",confirmTitle:"Confirm translation information",confirmContent:"Are you sure to translate to {target} and add {target} content after translation?",overlay:"Are you sure to continue the translation and override the {target} content after translation?",success:"Translation success",fail:"Translation failed, please try again",failed:"Translation failed. Please check and try again",localInput:"Local input",abort:"Cancel translation",sameLanguage:"Source language and target language cannot be the same",noTargetLanguage:"Please select target language",noValidTargetLanguage:"Source and target languages cannot be the same. Please select different target languages",noSourceData:"No source data found for translation",failedFor:"Translation failed for",translating:"Translating...",field:"Field",unsavedChanges:"You have unsaved changes. Do you want to save before closing?",templateSyncTip:"You only need to maintain one language version of your page template. We will automatically sync the template configuration while handling translations."},aiRuntime:{aiSettings:"AI Settings",unnamed:"Unnamed",project:"Project",assistant:"Assistant",widget:"Widget",all:"All",form:"Form",result:"Result",submitButton:"Submit Button",submitIcon:"Submit Icon",submitBackground:"Submit Background",placeholder:"Placeholder",loadingIndicator:"Loading Indicator"},basicInfo:"Basic Info",name:"Name",description:"Description",tags:"Tags",previewImage:"Preview Image",properties:"Properties",property:"Property",addObject:"New {object}",key:"Key",label:"Label",type:"Type",defaultValue:"Default Value",renderer:"Renderer",parameters:"Parameters",i18nEditorTitle:"I18N Editor",close:"Close",component:"Component",delete:"Delete",duplicate:"Duplicate",move:{up:"Move up",down:"Move down"},show:"Show",hide:"Hide",showParameter:"Show Parameter Config",hideParameter:"Hide Parameter Config",dragSort:"Drag sort",saved:"Saved",supportMarkdownSyntaxPlaceholder:"support markdown syntax",settings:{appearanceTip:"Appearance settings have been migrated to the Blocklet management page, users with admin access can click the link below to configure",appearanceLink:"Go to Appearance Settings >",tabs:{basic:"Basic",appearance:"Appearance",resources:"Resources",integration:"Integration"},basic:{title:"Basic Information",avatar:"Project Avatar",name:"Project Name",namePlaceholder:"Please enter project name",description:"Project Description",descriptionPlaceholder:"Please describe your project",slug:"Project Slug",slugPlaceholder:"Please enter project slug",slugHelper:"Project slug can only contain letters, numbers, hyphens and underscores",changeAvatar:"Change Avatar"},resources:{all:"Enable all resource components",resourceBlocklet:"Selected resource components",addResource:"Select resource components",needInstallResourceByAdmin:"Please install resource components by admin",noSelectedResources:"No selected any resource components"},integration:{packageSetting:"Package Setting",migrateToComponentStudio:"Migrate Component Settings"}},edit:{modified:"Modified",new:"New",deleted:"Deleted",undo:"Undo",redo:"Redo"},style:{title:"Global Style"}}),a=e.flatten({cannotFindPropertyKey:"无法找到属性键:{key}",deleteProjectAlertPrefix:"这将永久删除名称为",resetProjectAlertPrefix:"这将重置名称为",deleteProjectAlertSuffix:"的项目",resetProjectAlertSuffix:"的项目",confirmTip:"请输入项目名称",confirmDelete:"请输入 {name} 以确认删除",confirmReset:"请输入 {name} 以确认重置",uploadNewIcon:"上传新图标",requiredKey:"键不能为空,请设置一个唯一的键,以便在组件中引用和配置参数",duplicateKey:"键已存在,请设置一个唯一的键",clickToGenerateNpmLink:"点击生成链接",projects:{project:"项目",myProjects:"我的项目",projectToGetStart:"创建项目",unnamed:"未命名项目",noDescription:"暂无描述",lastUpdated:"最后更新",edit:"编辑",delete:"删除",pin:"置顶",unpin:"取消置顶",name:"名称",slug:"路径",projectSlug:"请输入项目路径",projectName:"请输入项目名称",newProjectDescriptionPlaceholder:"请输入项目描述",description:"描述",chooseTemplate:"选择模板",chooseTemplateTip:"选择模板快速开始,或开创您的独特项目 - 点击创建您的专属之旅!",blankTemplate:"空白模板",welcomeTemplate:"欢迎模板",limitReached:"扩展项目数量",limitReachedTip:"你已经达到了项目数量上限 <b>{limit}</b>,请删除未使用的项目并重试。<br/>你也可以部署自己的 Pages Kit 来创建更多项目。",limitReachedConfirm:"部署我的 Pages Kit",topToggle:{sitemap:"站点地图",data:"数据源",template:"模板",page:"页面"},dataSourceEmpty:'暂无数据源,点击"添加"按钮创建',selectDataSource:"请选择左侧的数据源进行操作",createDataSourceFirst:"请先创建一个数据源"},alert:{delete:"删除"},common:{collapseTopPanel:"折叠顶部面板",collapseBottomPanel:"折叠底部面板",collapseAll:"折叠所有",expandAll:"展开所有",goToHome:"返回首页",delete:"删除",cancel:"取消",add:"添加",addMultiple:"添加 ({count})",create:"创建",language:"语言",pageNotFound:"页面未找到",confirmDialogTitle:"确认",all:"全部",back:"返回首页",retry:"重试",defaultLanguage:"默认语言",close:"关闭",saveSuccess:"保存成功",resourceBlocklet:"资源 Blocklet",select:"选择",ok:"确定",refreshData:"刷新数据",clear:"清除",confirm:"确认"},section:{card:{type:"卡片类型",title:"卡片",addCard:"新增卡片",align:"卡片对齐方式",textAlign:"文本对齐方式"},list:{columns:"列数",gap:"间距",align:"对齐方式"}},maker:{sections:{empty:"暂无卡片",emptySubItems:"暂无子卡片",dropHere:"拖拽到这里",moreItems:"更多项"},layoutBlock:{draftPlaceholder:`使用网格布局对卡片进行排版 \r
3
- (此提示仅在草稿模式下显示)`},pageTitle:"页面编辑器",save:"保存",publish:"发布",publishToProduction:"发布到正式版",publishToProductionTip:"任何人都可以看到正式版",publishConfirmContent:"发布到",publishSelectPagesMessage:"请选择要发布的页面",publishSuccessMessage:"发布成功",importSuccessMessage:"导入成功",preview:"预览",pagePreview:"页面预览",livePreview:"实时预览",production:"正式版",draft:"草稿",previewRouteWithDynamicParams:"无法预览含动态参数的路由。请先在站点地图中选择或配置参数选项。",configColor:"设置颜色",configColorMuiTheme:"主题色",configColorCustomColor:"自定义颜色",configColorMuiThemeInfo:"使用主题色会自动适应主题配色及亮暗模式",configColorMuiThemeWithAlternateColor:" (包含亮/暗两种模式)",configColorLightMode:"亮色模式",configColorDarkMode:"暗黑模式",import:"导入",importDialog:{upload:{title:"从文件导入",description:"从本地文件导入",tip:"请选择要导入的文件"},resource:{description:"从资源导入"}},error:{dataSourceNotFound:"未找到数据源配置,请先在站点地图中配置页面数据源",refreshDataFailed:"数据刷新失败,请稍后重试",missingRouteOrProject:"缺少路由或项目信息"},export:"导出",noPreviewAvailable:"无可用预览",networkStatus:{online:"网络连接正常 - 您的修改将实时同步到服务器",offline:"网络连接中断 - 您的修改将在网络恢复后自动同步"},routePreview:{loading:"加载中...",generatingPageStructure:"正在生成页面内容结构...",generatingSectionContent:"正在生成卡片内容...",routePreview:"路由预览",noDisplayTemplate:"该路由没有显示模板",templateNotFound:"未找到显示模板",noSectionsAvailable:"没有可用内容",optimizeContent:"内容优化",optimizeContentButton:"使用 AI 优化内容",sectionRule:"卡片规则",sectionRulePlaceholder:"输入卡片规则",confirmOptimize:"确认",cancelOptimize:"取消"},pages:{addPage:"创建页面",createResource:"创建资源",addResource:"从商店添加资源",pages:"页面",template:"模板",sections:"卡片",deleteTitle:"删除 {name} 页面?",deleteSectionTitle:"删除 {name} 卡片?",empty:"暂无页面",needPublish:"此页面有可发布的新修改",notPublic:"此页面未公开",expandAllRoutes:"展开所有关联路由",collapseAllRoutes:"折叠所有关联路由",addPageDialog:{title:"创建新页面",templateName:"模板名称",templateNamePlaceholder:"输入页面模板名称",autoCreateRoute:"自动创建路由",create:"创建",cancel:"取消"},moreItems:"更多项"},components:{components:"组件",addComponent:"添加组件",basicGroup:"基础组件",customGroup:"自定义组件",resourceGroup:"资源组件",deleteTitle:"删除 {name} 组件?",noComponents:"暂无组件",needAddResource:"请在项目设置中选择资源组件",searchComponent:"请输入组件名称进行搜索"},outline:{outline:"概览"},properties:{addArrayItem:"添加一行",arrayEmpty:"暂无行",subProperties:"子属性",addSubProperty:"添加子属性",noSubProperties:"暂无子属性",noProperties:"暂无属性",noParameters:"暂无可配置参数",properties:"属性",setDefaultLocale:"设为默认语言",copyDefault:"设为默认值",copyFull:"复制全部",migrateFromOld:"从老版本复制默认值",path:"路径",title:"标题",description:"描述",icon:"图标",iconSize:"图标大小",image:"图片",imageOptimization:"图片优化",imageOptimizationFast:"速度优先",imageOptimizationQuality:"质量优先",imageMode:"图片模式",hoverStyle:"鼠标悬停样式",videoPoster:"视频封面",imageSize:"图片大小",hasImage:"包含图片",fullSizeImage:"大图模式",src:"源地址",dark:"暗黑",reverse:"反转",background:"背景",backgroundFullWidth:"背景全宽",backgroundFullWidthHelper:"背景将覆盖整个页面",badge:"标签",buttons:"按钮",button:"按钮",border:{title:"边框",helper:"设置布局的边框样式",custom:"自定义边框",width:"边框宽度 (px)",style:"边框样式",color:"边框颜色",preview:"边框预览",solid:"实线",dashed:"虚线",dotted:"点线",double:"双线",groove:"凹槽",ridge:"凸槽",inset:"内嵌",outset:"外凸",borderHelper:"设置布局的边框样式",frame:{borderFrame:"边框",deviceFrame:"设备",browserFrame:"浏览器",shadowFrame:"阴影",terminalFrame:"终端",commonFrame:"通用"}},borderRadius:{title:"边框圆角",helper:"设置布局的边框圆角",custom:"自定义边框圆角",value:"圆角大小 (px)",preview:"圆角预览"},shadow:"阴影",color:"颜色",variant:"样式",isPageLink:"是否内部链接?",link:"链接",style:"样式",card:"卡片",list:"列表",center:"居中",sort:"排序",asc:"升序",desc:"降序",createdAt:"创建时间",updatedAt:"更新时间",pathCheckRequired:"请输入路径",pathCheckStartWithSlash:"路径开头必须是 /",pathCheckEndWithoutSlash:"路径结尾不能是 /",pathCheckConsecutiveSlash:"路径中不能包含连续的 /",pathCheckWhitespace:"路径中不能包含空白字符",pathCheckInvalid:"非法的路径",pathCheckAlreadyExist:"路径已存在",pathCheckHelper:'此处用于设置模板名称,如需修改页面访问路径,请前往"站点地图"进行设置',embedUrl:"部件地址",chooseEmbed:"选择部件",translateFrom:"翻译来自",backgroundColor:"颜色",backgroundImage:"图片 / 视频",customColor:"自定义颜色",customImage:"自定义图片 / 视频",boxed:"嵌套盒子模式",bigMode:"大标题模式",paddingY:"上下内边距",paddingX:"左右内边距",maxWidth:"最大宽度",maxWidthCustomTip:"例如: 1200px, 80%, 50vw",paddingCustomTip:"例如: 10px, 20px, 30px",layoutBlockMaxWidthHelper:"设置布局的最大宽度,这将会布局将不会遵循页面公共样式中的最大宽度设置",customValue:"自定义值",stickyHeader:"固定导航栏",translucent:"沉浸式",hideNavMenus:"隐藏导航菜单",hideFooter:"隐藏页脚",size:"大小",height:"高度",autoWidth:"宽度自适应",iframeHeight:"定义内容高度",translucentTextColor:"沉浸式文本颜色",copyFromOtherLanguage:"从其他语言复制",useCache:"使用缓存",cacheDuration:"缓存时间 (秒)",customComponent:"自定义组件",parameters:"参数",buttonTitle:"第 {index} 个按钮的标题",cardTitle:"第 {index} 个卡片标题",cardDescription:"第 {index} 个卡片描述",cardButtonTitle:"第 {index} 个卡片中第 {actionIndex} 个按钮标题",copyLanguageDescription:"将从选择的语言复制所有属性到当前语言,这将覆盖当前语言的已有内容。",isPublic:"是否公开",isTemplate:"作为模版页面使用",isTemplateSection:"模板动态卡片",templateDescription:"卡片描述,使用 AIGNE 生成页面内容时,会根据卡片描述生成卡片内容",templateSectionNameRequired:"模板卡片需要设置名称,以便在使用动态模板时为卡片设置对应的值",templateSectionNameHelper:"卡片名称用于标识模板中的卡片,请使用有意义且唯一的名称,以便后续为卡片设置内容",templateSectionNameDuplicated:"模板卡片名称在页面中必须唯一,当前名称已被其他模板卡片使用",propertyNotFound:"修改参数失败,原因:组件不存在 `{key}` 属性",configLLMDescription:"配置 LLM 描述",llmConfigTitle:"配置 LLM 描述",llmConfigLabel:"LLM 配置信息",llmConfigPlaceholder:"输入用于LLM的额外配置信息",llmConfigInstructions:"配置需要AI处理的属性并提供详细描述",llmPropertyDescribe:"AI提示描述",loading:"加载中...",componentNotFound:"未找到组件",templateName:"模板名称",mobile:"移动端",desktop:"桌面端",columns:"列数",gap:"布局间距",gapHelper:"设置布局中组件之间的间距,如果横向的间隔会让宽度溢出,则不会应用横向间距",padding:"内边距",paddingHelper:"设置布局的内边距",alignContent:{title:"垂直内容对齐",helper:"设置布局中垂直内容的对齐方式"},justifyContent:{title:"水平内容对齐",helper:"设置布局中水平内容的对齐方式"},visualGridLayout:"配置网格布局",dragResizeInstructions:"通过调整卡片位置和大小调整布局,可以分别设置桌面端和移动端两种布局",setAsBackgroundElement:"设置为背景卡片(无法拖拽排序、无法设置大小)",setAsNormalElement:"设置为普通卡片(可拖拽排序、可设置大小)"},siteMap:{routes:"路由列表",pageProperties:"路由属性",handler:"处理器",parameters:"参数",parametersHelper:"来自 URL、请求头等参数",data:"数据源",dataPlaceholder:"请输入页面数据",pageTemplate:"页面模板",selectPageTemplate:"选择页面模板",empty:"暂无路由",noDataSource:"无数据源",loading:"加载中...",unknownSource:"未知数据源",question:"页面规则",questionPlaceholder:"输入页面规则,描述您的要求",agent:"Agent",noAgent:"无 Agent",noRouteSelected:"未选择路由,请从左侧列表选择一个路由或创建新路由。",enableGenerate:"启用 AI 生成",path:"路径",generate:"生成页面内容",generating:"生成中...",deleteRouteTitle:"删除路由",deleteRouteConfirm:"你确定要删除此路由吗?此操作无法撤销。",routeDeleted:"路由删除成功",confirmRemoveParamsTitle:"删除动态参数",confirmRemoveParamsDescription:"以下动态参数将从路由中删除:",paramOptionsTitle:"参数可选值",paramOptionsDescription:"配置路由中动态参数的可选值",paramOptionName:"选项名称",deleteOption:"删除选项",addChildOption:"添加子选项",noParamOptions:"暂无参数可选值,点击下方按钮添加",addParamOption:"添加参数可选值",errorEmptyValue:"值不能为空",errorContainsSlash:"值不能包含斜杠 (/)",errorInvalidChars:"值包含无效字符,请仅使用URL安全字符",templates:{default:"默认模板",blog:"博客模板",landing:"落地页模板",form:"表单模板"}},datasource:{autoSaveSuccess:"自动保存成功"}},error:{embedUrl:"Embed 地址有误",notFoundEmbed:"未找到组件",noBackground:"无背景",notConfig:"未设置",slugAlreadyExists:"路径已存在",slugRequired:"路径不能为空",invalidJson:"JSON格式无效"},fabric:{fontFamily:"全局字体(已废弃)",basicComponent:{titleFontFamily:"段落标题字体",titleFontFamilyHelper:"* 全局修改段落标题字体",descFontFamily:"段落描述字体",descFontFamilyHelper:"* 全局修改段落描述字体"}},ai:{list:{noTemplatesInStudio:"目前您还没有在 AI Studio 里创建任何模版",createNow:"现在创建",noTemplates:"还没有任何模版"},output:{errorMessage:"出错了,请稍后再试",words:"字",characters:"字符",copied:"已复制!"},generate:"生成",text:{title:"文案助手",description:"使用 AI 帮助编写文案",theme:"内容",themeHelper:"整理内容,使描述更加合适网页",language:"语言",languageHelper:"输出文本语言",size:"大小",sizeHelper:"输出内容大小",original:"原文",improve:"改良"},status:{install:"请先检查 ai-kit 是否安装",unavailable:"请先检查 openai key 是否正常设置"}},translate:{title:"翻译页面",translate:"翻译",into:"翻译成",ing:"翻译中",ingTip:"将内容翻译为 {targetLanguage}。请稍等...",confirm:"翻译",confirmTitle:"确认翻译信息",confirmContent:"你确认翻译成 {target},并且翻译后新增 {target} 内容吗?",overlay:"确认继续翻译,并且翻译后覆盖 {target} 内容吗?",success:"翻译成功",fail:"翻译失败,请重试",failed:"翻译失败,请检查后重试",localInput:"本地输入",abort:"取消翻译成功",sameLanguage:"源语言和目标语言不能相同",noTargetLanguage:"请选择目标语言",noValidTargetLanguage:"源语言和目标语言不能相同,请选择不同的目标语言",noSourceData:"未找到用于翻译的源数据",failedFor:"翻译失败语言:",translating:"翻译中...",field:"字段",unsavedChanges:"你有未保存的更改。是否在关闭前保存?",templateSyncTip:"您只需维护一种语言版本的页面模板,我们会在处理翻译的同时,自动同步页面模板的配置。"},aiRuntime:{aiSettings:"AI 设置",unnamed:"未命名",project:"项目",assistant:"助手",widget:"部件",all:"全部",form:"仅表单",result:"仅输出",submitButton:"提交按钮",submitIcon:"提交按钮图标",submitBackground:"提交按钮背景色",placeholder:"占位提示",loadingIndicator:"加载提示"},basicInfo:"基础信息",name:"名称",description:"描述",tags:"标签",previewImage:"预览图片",properties:"属性",property:"属性",addObject:"添加{object}",key:"键",label:"标签",type:"类型",defaultValue:"默认值",renderer:"渲染方式",parameters:"参数",i18nEditorTitle:"国际化编辑",close:"关闭",component:"组件",delete:"删除",duplicate:"复制",move:{up:"上移",down:"下移"},show:"显示",hide:"隐藏",showParameter:"显示参数配置",hideParameter:"隐藏参数配置",dragSort:"拖拽排序",saved:"保存成功",supportMarkdownSyntaxPlaceholder:"支持输入 markdown",settings:{appearanceTip:"外观设置已迁移至 Blocklet 管理页面,持有管理员通行证的用户,可点击下方链接配置",appearanceLink:"前往外观设置 >",tabs:{basic:"基础设置",appearance:"外观设置",resources:"资源组件",integration:"集成设置"},basic:{title:"基础信息",avatar:"项目头像",name:"项目名称",namePlaceholder:"请输入项目名称",description:"项目描述",descriptionPlaceholder:"请输入项目描述",slug:"项目路径",slugPlaceholder:"请输入项目路径",slugHelper:"项目路径只能包含字母、数字、中划线和下划线",changeAvatar:"更换头像"},resources:{all:"启用所有资源组件",resourceBlocklet:"已选择的资源组件",addResource:"选择资源组件",needInstallResourceByAdmin:"请联系管理员安装资源组件",noSelectedResources:"未选择任何资源组件"},integration:{packageSetting:"包设置",migrateToComponentStudio:"迁移组件设置"}},edit:{modified:"已修改",new:"新增",deleted:"已删除",undo:"撤销",redo:"重做"},style:{title:"公共样式"}}),o={en:t,zh:a};exports.translations=o;
2
+ ( this tip only show in draft mode)`},pageTitle:"Pages Editor",save:"Save",publish:"Publish",publishToProduction:"Publish to production",publishToProductionTip:"Anyone can see production version",publishConfirmContent:"Publish to",publishSelectPagesMessage:"Please select the pages to publish",publishSuccessMessage:"Published",importSuccessMessage:"Imported successfully",preview:"Preview",pagePreview:"Preview",livePreview:"Live Preview",production:"Production",draft:"Draft",previewRouteWithDynamicParams:"Cannot preview a route with dynamic parameters. Please select or configure parameter options in the Site Map first.",configColor:"Config color",configColorMuiTheme:"Theme Color",configColorCustomColor:"Custom Color",configColorMuiThemeInfo:"Use theme color, it will automatically adapt to the theme color and dark mode",configColorMuiThemeWithAlternateColor:" (includes light and dark modes)",configColorLightMode:"Light Mode",configColorDarkMode:"Dark Mode",import:"Import",importDialog:{upload:{title:"Import from file",description:"Import from local file",tip:"Please select the file to import"},resource:{description:"Import from resource"}},error:{dataSourceNotFound:"Please configure the page data source in Site Map first",refreshDataFailed:"Failed to refresh data, please try again later",missingRouteOrProject:"Missing route or project information"},export:"Export",noPreviewAvailable:"No preview available",networkStatus:{online:"Network connected - Your changes will sync to server in real-time",offline:"Network disconnected - Your changes will sync automatically when connection is restored"},routePreview:{loading:"Loading...",generatingPageStructure:"Generating page content structure...",generatingSectionContent:"Generating section content...",routePreview:"Preview",noDisplayTemplate:"This route has no display template",templateNotFound:"Display template not found",noSectionsAvailable:"No sections available",optimizeContent:"Optimize Content",optimizeContentButton:"Use AI to optimize content",sectionRule:"Section Rule",sectionRulePlaceholder:"Enter your section rule or instructions for AI generation",confirmOptimize:"Confirm",cancelOptimize:"Cancel"},pages:{addPage:"Create Page",createResource:"Create Resource",addResource:"Add Resource from Store",pages:"Pages",template:"Templates",sections:"Sections",deleteTitle:"Delete {name} page?",deleteSectionTitle:"Delete {name} section?",empty:"No pages",needPublish:"This page has unpublished changes",notPublic:"This page is not public",expandAllRoutes:"Expand all associated routes",collapseAllRoutes:"Collapse all associated routes",addPageDialog:{title:"Create New Page",templateName:"Template Name",templateNamePlaceholder:"Enter page template name",autoCreateRoute:"Auto create route",create:"Create",cancel:"Cancel"},moreItems:"more items"},components:{components:"Components",addComponent:"Add Component",basicGroup:"Basic",customGroup:"Custom",resourceGroup:"Resource",deleteTitle:"Delete {name} component?",noComponents:"No Components",needAddResource:"Please select resource components in project settings",searchComponent:"Please enter component name to search"},outline:{outline:"Outline"},properties:{addArrayItem:"Add Row",arrayEmpty:"No Row",subProperties:"Sub Properties",addSubProperty:"Add Sub Property",noSubProperties:"No Sub properties",noProperties:"No properties",noParameters:"No configurable parameters",properties:"Properties",setDefaultLocale:"Set default",copyDefault:"Copy over default",copyFull:"Full copy",migrateFromOld:"Full copy from old version",path:"Path",title:"Title",description:"Description",icon:"Icon",iconSize:"Icon size",image:"Image",imageOptimization:"Image Optimization",imageOptimizationFast:"Best for speed",imageOptimizationQuality:"Best for visual quality",imageMode:"Image Mode",hoverStyle:"Hover Style",videoPoster:"Video Poster",imageSize:"Image size",hasImage:"Has Image",fullSizeImage:"Full Size Image",src:"Source",dark:"Dark",reverse:"Reverse",background:"Background",backgroundFullWidth:"Background Full Width",backgroundFullWidthHelper:"The background will cover the entire page",badge:"Badge",buttons:"Buttons",button:"Button",border:{title:"Border",helper:"Set the border style of the layout",custom:"Custom Border",width:"Border Width(px)",style:"Border Style",color:"Border Color",preview:"Border Preview",solid:"Solid",dashed:"Dashed",dotted:"Dotted",double:"Double",groove:"Groove",ridge:"Ridge",inset:"Inset",outset:"Outset",borderHelper:"Set the border style of the layout",frame:{borderFrame:"Border",deviceFrame:"Device",browserFrame:"Browser",shadowFrame:"Shadow",terminalFrame:"Terminal",commonFrame:"Common"}},borderRadius:{title:"Border Radius",helper:"Set the border radius of the layout",custom:"Custom Border Radius",value:"Radius Value(px)",preview:"Radius Preview"},shadow:"Shadow",color:"Color",variant:"Variant",isPageLink:"Is page link?",link:"Link",style:"Style",card:"Card",list:"List",center:"Center",sort:"Order by",asc:"Ascending",desc:"Descending",createdAt:"Create Time",updatedAt:"Update Time",pathCheckRequired:"Path is required",pathCheckStartWithSlash:"Path must start with /",pathCheckEndWithoutSlash:"Path cannot end with /",pathCheckConsecutiveSlash:"Path cannot contain consecutive /",pathCheckWhitespace:"Path cannot contain whitespace",pathCheckInvalid:"Invalid path format",pathCheckAlreadyExist:"Path is already exist",pathCheckHelper:"This field now manages template names. To modify page access paths, please navigate to Site Map settings.",embedUrl:"Embed url",chooseEmbed:"Choose embed",translateFrom:"Translate from",backgroundColor:"Color",backgroundImage:"Image / Video",customColor:"Custom color",customImage:"Custom image / video",boxed:"Nested box mode",bigMode:"Big title mode",paddingY:"Vertical Padding",paddingX:"Horizontal Padding",maxWidth:"Max Width",maxWidthCustomTip:"For example: 1200px, 80%, 50vw",paddingCustomTip:"For example: 10px, 20px, 30px",layoutBlockMaxWidthHelper:"Set the maximum width of the layout, this will make the layout not follow the maximum width setting in the page global style",customValue:"Custom Value",stickyHeader:"Sticky Header",translucent:"Translucent Mode",hideNavMenus:"Hide Navigation Menus",hideFooter:"Hide Footer",size:"Size",height:"Height",autoWidth:"Auto Width",iframeHeight:"Content Height",translucentTextColor:"Translucent Text Color",copyFromOtherLanguage:"Copy from other language",useCache:"Use Cache",cacheDuration:"Cache Duration (seconds)",customComponent:"Custom Component",parameters:"Parameters",buttonTitle:"Button {index} Title",cardTitle:"Card {index} Title",cardDescription:"Card {index} Description",cardButtonTitle:"Card {index} Button {actionIndex} Title",copyLanguageDescription:"All properties will be copied from the selected language to the current language, which will override the existing content in the current language.",isPublic:"Public Access",isTemplate:"Use as template page",isTemplateSection:"Template dynamic card",templateDescription:"Card description, used to generate card content when using AIGNE to generate page content",templateSectionNameRequired:"Name is required for template section to set values when using dynamic templates",templateSectionNameHelper:"Section name is used to identify the section in the template, please use a meaningful and unique name, so that the section can be set content later",templateSectionNameDuplicated:"Section name must be unique among all template sections in the page",propertyNotFound:"Failed to modify parameter, reason: component does not exist `{key}` property",configLLMDescription:"Configure LLM description",llmConfigTitle:"Configure LLM Description",llmConfigLabel:"LLM Configuration Information",llmConfigPlaceholder:"Enter additional configuration information for LLM",llmConfigInstructions:"Configure which properties should be processed by AI and provide detailed descriptions.",llmPropertyDescribe:"Description for AI",loading:"Loading...",componentNotFound:"Component not found",templateName:"Template Name",mobile:"Mobile",desktop:"Desktop",columns:"Columns",gap:"Layout Gap",gapHelper:"Set the gap between components in the layout, if the horizontal gap will overflow the width, it will not be applied",gapUnit:"px",padding:"Padding",paddingHelper:"Set the padding of the layout",alignContent:{title:"Vertical Alignment",helper:"Set the vertical alignment of content in the layout"},justifyContent:{title:"Horizontal Alignment",helper:"Set the horizontal alignment of content in the layout"},visualGridLayout:"Configure Grid Layout",dragResizeInstructions:"Drag and resize cards to set layout, you can set different layouts for desktop and mobile",setAsBackgroundElement:"Set as background element (cannot drag and resize)",setAsNormalElement:"Set as normal element (can drag and resize)"},siteMap:{routes:"Routes",empty:"No Routes",pageProperties:"Route Properties",handler:"Handler",data:"Data Source",noDataSource:"No data source",loading:"Loading",unknownSource:"Unknown Source",question:"Page Rules",questionPlaceholder:"Enter page rules, describe your requirements",pageTemplate:"Page Template",selectPageTemplate:"Select a page template",agent:"Agent",noAgent:"No Agent",noRouteSelected:"No route selected. Please select a route from the list or create a new one.",enableGenerate:"Enable AI Generate",path:"Path",generate:"Generate Page Content",generating:"Generating...",deleteRouteTitle:"Delete Route",deleteRouteConfirm:"Are you sure you want to delete this route? This action cannot be undone.",routeDeleted:"Route deleted successfully",confirmRemoveParamsTitle:"Remove Dynamic Parameters",confirmRemoveParamsDescription:"The following dynamic parameters will be removed from the route:",paramOptionsTitle:"Parameter Options",paramOptionsDescription:"Configure options for dynamic parameters in the route",paramOptionName:"Option name",deleteOption:"Delete option",addChildOption:"Add child option",noParamOptions:"No parameter options yet, click the button below to add",addParamOption:"Add parameter option",errorEmptyValue:"Value cannot be empty",errorContainsSlash:"Value cannot contain slash (/)",errorInvalidChars:"Value contains invalid characters, please use only URL-safe characters"},datasource:{autoSaveSuccess:"Auto save success"}},error:{embedUrl:"Embed url error",notFoundEmbed:"Not Found Embed",noBackground:"No background",notConfig:"Not config",slugAlreadyExists:"Slug already exists",slugRequired:"Slug cannot be empty",invalidJson:"Invalid JSON format"},fabric:{fontFamily:"Font Family (Deprecated)",basicComponent:{titleFontFamily:"Title Font Family",titleFontFamilyHelper:"* Globally modify the paragraph heading font",descFontFamily:"Description Font Family",descFontFamilyHelper:"* Globally modify the paragraph description font"}},ai:{list:{noTemplatesInStudio:"You haven't create any prompt template in AI Studio yet.",createNow:"Create Now",noTemplates:"No template has been provided yet"},output:{errorMessage:"Something wrong with me, please try it later.",words:"Words",characters:"Characters",copied:"Copied!"},generate:"Generate",text:{title:"Text Assistant",description:"Use AI to help with write text",theme:"Content",themeHelper:"Organize the input to make it more suitable for the web page",language:"Language",languageHelper:"Output text language",size:"Size",sizeHelper:"Output text size",original:"Original",improve:"Improve"},status:{install:"Check whether the AIGNE Hub is initialized",unavailable:"Check whether the AIGNE Hub is set properly"}},translate:{translate:"Translate",title:"Translation page",into:"Translate into",ing:"Translating",ingTip:"Translating content to {targetLanguage}. please wait a moment..",confirm:"Confirm",confirmTitle:"Confirm translation information",confirmContent:"Are you sure to translate to {target} and add {target} content after translation?",overlay:"Are you sure to continue the translation and override the {target} content after translation?",success:"Translation success",fail:"Translation failed, please try again",failed:"Translation failed. Please check and try again",localInput:"Local input",abort:"Cancel translation",sameLanguage:"Source language and target language cannot be the same",noTargetLanguage:"Please select target language",noValidTargetLanguage:"Source and target languages cannot be the same. Please select different target languages",noSourceData:"No source data found for translation",failedFor:"Translation failed for",translating:"Translating...",field:"Field",fields:"Fields",unsupportedFieldType:"Unsupported field type",expandAll:"Expand all groups",collapseAll:"Collapse all groups",unsavedChanges:"You have unsaved changes. Do you want to save before closing?",templateSyncTip:"You only need to maintain one language version of your page template. We will automatically sync the template configuration while handling translations.",updateMode:"Translation Update Mode",batchMode:"Batch",realtimeMode:"Real-time",batchModeDescription:"Update all translations at once after completion (better performance)",realtimeModeDescription:"Show each translation result immediately as it arrives (live preview)"},aiRuntime:{aiSettings:"AI Settings",unnamed:"Unnamed",project:"Project",assistant:"Assistant",widget:"Widget",all:"All",form:"Form",result:"Result",submitButton:"Submit Button",submitIcon:"Submit Icon",submitBackground:"Submit Background",placeholder:"Placeholder",loadingIndicator:"Loading Indicator"},basicInfo:"Basic Info",name:"Name",description:"Description",tags:"Tags",previewImage:"Preview Image",properties:"Properties",property:"Property",addObject:"New {object}",key:"Key",label:"Label",type:"Type",defaultValue:"Default Value",renderer:"Renderer",parameters:"Parameters",i18nEditorTitle:"I18N Editor",close:"Close",component:"Component",delete:"Delete",duplicate:"Duplicate",move:{up:"Move up",down:"Move down"},show:"Show",hide:"Hide",showParameter:"Show Parameter Config",hideParameter:"Hide Parameter Config",dragSort:"Drag sort",saved:"Saved",supportMarkdownSyntaxPlaceholder:"support markdown syntax",settings:{appearanceTip:"Appearance settings have been migrated to the Blocklet management page, users with admin access can click the link below to configure",appearanceLink:"Go to Appearance Settings >",tabs:{basic:"Basic",appearance:"Appearance",resources:"Resources",integration:"Integration"},basic:{title:"Basic Information",avatar:"Project Avatar",name:"Project Name",namePlaceholder:"Please enter project name",description:"Project Description",descriptionPlaceholder:"Please describe your project",slug:"Project Slug",slugPlaceholder:"Please enter project slug",slugHelper:"Project slug can only contain letters, numbers, hyphens and underscores",changeAvatar:"Change Avatar"},resources:{all:"Enable all resource components",resourceBlocklet:"Selected resource components",addResource:"Select resource components",needInstallResourceByAdmin:"Please install resource components by admin",noSelectedResources:"No selected any resource components"},integration:{packageSetting:"Package Setting",migrateToComponentStudio:"Migrate Component Settings"}},edit:{modified:"Modified",new:"New",deleted:"Deleted",undo:"Undo",redo:"Redo"},style:{title:"Global Style"}}),a=e.flatten({cannotFindPropertyKey:"无法找到属性键:{key}",deleteProjectAlertPrefix:"这将永久删除名称为",resetProjectAlertPrefix:"这将重置名称为",deleteProjectAlertSuffix:"的项目",resetProjectAlertSuffix:"的项目",confirmTip:"请输入项目名称",confirmDelete:"请输入 {name} 以确认删除",confirmReset:"请输入 {name} 以确认重置",uploadNewIcon:"上传新图标",requiredKey:"键不能为空,请设置一个唯一的键,以便在组件中引用和配置参数",duplicateKey:"键已存在,请设置一个唯一的键",clickToGenerateNpmLink:"点击生成链接",projects:{project:"项目",myProjects:"我的项目",projectToGetStart:"创建项目",unnamed:"未命名项目",noDescription:"暂无描述",lastUpdated:"最后更新",edit:"编辑",delete:"删除",pin:"置顶",unpin:"取消置顶",name:"名称",slug:"路径",projectSlug:"请输入项目路径",projectName:"请输入项目名称",newProjectDescriptionPlaceholder:"请输入项目描述",description:"描述",chooseTemplate:"选择模板",chooseTemplateTip:"选择模板快速开始,或开创您的独特项目 - 点击创建您的专属之旅!",blankTemplate:"空白模板",welcomeTemplate:"欢迎模板",limitReached:"扩展项目数量",limitReachedTip:"你已经达到了项目数量上限 <b>{limit}</b>,请删除未使用的项目并重试。<br/>你也可以部署自己的 Pages Kit 来创建更多项目。",limitReachedConfirm:"部署我的 Pages Kit",topToggle:{sitemap:"站点地图",data:"数据源",template:"模板",page:"页面"},dataSourceEmpty:'暂无数据源,点击"添加"按钮创建',selectDataSource:"请选择左侧的数据源进行操作",createDataSourceFirst:"请先创建一个数据源"},alert:{delete:"删除"},common:{collapseTopPanel:"折叠顶部面板",collapseBottomPanel:"折叠底部面板",collapseAll:"折叠所有",expandAll:"展开所有",goToHome:"返回首页",delete:"删除",cancel:"取消",add:"添加",addMultiple:"添加 ({count})",create:"创建",language:"语言",pageNotFound:"页面未找到",confirmDialogTitle:"确认",all:"全部",back:"返回首页",retry:"重试",defaultLanguage:"默认语言",close:"关闭",saveSuccess:"保存成功",resourceBlocklet:"资源 Blocklet",select:"选择",ok:"确定",refreshData:"刷新数据",clear:"清除",confirm:"确认"},section:{card:{type:"卡片类型",title:"卡片",addCard:"新增卡片",align:"卡片对齐方式",textAlign:"文本对齐方式"},list:{columns:"列数",gap:"间距",align:"对齐方式"}},maker:{sections:{empty:"暂无卡片",emptySubItems:"暂无子卡片",dropHere:"拖拽到这里",moreItems:"更多项"},layoutBlock:{draftPlaceholder:`使用网格布局对卡片进行排版 \r
3
+ (此提示仅在草稿模式下显示)`},pageTitle:"页面编辑器",save:"保存",publish:"发布",publishToProduction:"发布到正式版",publishToProductionTip:"任何人都可以看到正式版",publishConfirmContent:"发布到",publishSelectPagesMessage:"请选择要发布的页面",publishSuccessMessage:"发布成功",importSuccessMessage:"导入成功",preview:"预览",pagePreview:"页面预览",livePreview:"实时预览",production:"正式版",draft:"草稿",previewRouteWithDynamicParams:"无法预览含动态参数的路由。请先在站点地图中选择或配置参数选项。",configColor:"设置颜色",configColorMuiTheme:"主题色",configColorCustomColor:"自定义颜色",configColorMuiThemeInfo:"使用主题色会自动适应主题配色及亮暗模式",configColorMuiThemeWithAlternateColor:" (包含亮/暗两种模式)",configColorLightMode:"亮色模式",configColorDarkMode:"暗黑模式",import:"导入",importDialog:{upload:{title:"从文件导入",description:"从本地文件导入",tip:"请选择要导入的文件"},resource:{description:"从资源导入"}},error:{dataSourceNotFound:"未找到数据源配置,请先在站点地图中配置页面数据源",refreshDataFailed:"数据刷新失败,请稍后重试",missingRouteOrProject:"缺少路由或项目信息"},export:"导出",noPreviewAvailable:"无可用预览",networkStatus:{online:"网络连接正常 - 您的修改将实时同步到服务器",offline:"网络连接中断 - 您的修改将在网络恢复后自动同步"},routePreview:{loading:"加载中...",generatingPageStructure:"正在生成页面内容结构...",generatingSectionContent:"正在生成卡片内容...",routePreview:"路由预览",noDisplayTemplate:"该路由没有显示模板",templateNotFound:"未找到显示模板",noSectionsAvailable:"没有可用内容",optimizeContent:"内容优化",optimizeContentButton:"使用 AI 优化内容",sectionRule:"卡片规则",sectionRulePlaceholder:"输入卡片规则",confirmOptimize:"确认",cancelOptimize:"取消"},pages:{addPage:"创建页面",createResource:"创建资源",addResource:"从商店添加资源",pages:"页面",template:"模板",sections:"卡片",deleteTitle:"删除 {name} 页面?",deleteSectionTitle:"删除 {name} 卡片?",empty:"暂无页面",needPublish:"此页面有可发布的新修改",notPublic:"此页面未公开",expandAllRoutes:"展开所有关联路由",collapseAllRoutes:"折叠所有关联路由",addPageDialog:{title:"创建新页面",templateName:"模板名称",templateNamePlaceholder:"输入页面模板名称",autoCreateRoute:"自动创建路由",create:"创建",cancel:"取消"},moreItems:"更多项"},components:{components:"组件",addComponent:"添加组件",basicGroup:"基础组件",customGroup:"自定义组件",resourceGroup:"资源组件",deleteTitle:"删除 {name} 组件?",noComponents:"暂无组件",needAddResource:"请在项目设置中选择资源组件",searchComponent:"请输入组件名称进行搜索"},outline:{outline:"概览"},properties:{addArrayItem:"添加一行",arrayEmpty:"暂无行",subProperties:"子属性",addSubProperty:"添加子属性",noSubProperties:"暂无子属性",noProperties:"暂无属性",noParameters:"暂无可配置参数",properties:"属性",setDefaultLocale:"设为默认语言",copyDefault:"设为默认值",copyFull:"复制全部",migrateFromOld:"从老版本复制默认值",path:"路径",title:"标题",description:"描述",icon:"图标",iconSize:"图标大小",image:"图片",imageOptimization:"图片优化",imageOptimizationFast:"速度优先",imageOptimizationQuality:"质量优先",imageMode:"图片模式",hoverStyle:"鼠标悬停样式",videoPoster:"视频封面",imageSize:"图片大小",hasImage:"包含图片",fullSizeImage:"大图模式",src:"源地址",dark:"暗黑",reverse:"反转",background:"背景",backgroundFullWidth:"背景全宽",backgroundFullWidthHelper:"背景将覆盖整个页面",badge:"标签",buttons:"按钮",button:"按钮",border:{title:"边框",helper:"设置布局的边框样式",custom:"自定义边框",width:"边框宽度 (px)",style:"边框样式",color:"边框颜色",preview:"边框预览",solid:"实线",dashed:"虚线",dotted:"点线",double:"双线",groove:"凹槽",ridge:"凸槽",inset:"内嵌",outset:"外凸",borderHelper:"设置布局的边框样式",frame:{borderFrame:"边框",deviceFrame:"设备",browserFrame:"浏览器",shadowFrame:"阴影",terminalFrame:"终端",commonFrame:"通用"}},borderRadius:{title:"边框圆角",helper:"设置布局的边框圆角",custom:"自定义边框圆角",value:"圆角大小 (px)",preview:"圆角预览"},shadow:"阴影",color:"颜色",variant:"样式",isPageLink:"是否内部链接?",link:"链接",style:"样式",card:"卡片",list:"列表",center:"居中",sort:"排序",asc:"升序",desc:"降序",createdAt:"创建时间",updatedAt:"更新时间",pathCheckRequired:"请输入路径",pathCheckStartWithSlash:"路径开头必须是 /",pathCheckEndWithoutSlash:"路径结尾不能是 /",pathCheckConsecutiveSlash:"路径中不能包含连续的 /",pathCheckWhitespace:"路径中不能包含空白字符",pathCheckInvalid:"非法的路径",pathCheckAlreadyExist:"路径已存在",pathCheckHelper:'此处用于设置模板名称,如需修改页面访问路径,请前往"站点地图"进行设置',embedUrl:"部件地址",chooseEmbed:"选择部件",translateFrom:"翻译来自",backgroundColor:"颜色",backgroundImage:"图片 / 视频",customColor:"自定义颜色",customImage:"自定义图片 / 视频",boxed:"嵌套盒子模式",bigMode:"大标题模式",paddingY:"上下内边距",paddingX:"左右内边距",maxWidth:"最大宽度",maxWidthCustomTip:"例如: 1200px, 80%, 50vw",paddingCustomTip:"例如: 10px, 20px, 30px",layoutBlockMaxWidthHelper:"设置布局的最大宽度,这将会布局将不会遵循页面公共样式中的最大宽度设置",customValue:"自定义值",stickyHeader:"固定导航栏",translucent:"沉浸式",hideNavMenus:"隐藏导航菜单",hideFooter:"隐藏页脚",size:"大小",height:"高度",autoWidth:"宽度自适应",iframeHeight:"定义内容高度",translucentTextColor:"沉浸式文本颜色",copyFromOtherLanguage:"从其他语言复制",useCache:"使用缓存",cacheDuration:"缓存时间 (秒)",customComponent:"自定义组件",parameters:"参数",buttonTitle:"第 {index} 个按钮的标题",cardTitle:"第 {index} 个卡片标题",cardDescription:"第 {index} 个卡片描述",cardButtonTitle:"第 {index} 个卡片中第 {actionIndex} 个按钮标题",copyLanguageDescription:"将从选择的语言复制所有属性到当前语言,这将覆盖当前语言的已有内容。",isPublic:"是否公开",isTemplate:"作为模版页面使用",isTemplateSection:"模板动态卡片",templateDescription:"卡片描述,使用 AIGNE 生成页面内容时,会根据卡片描述生成卡片内容",templateSectionNameRequired:"模板卡片需要设置名称,以便在使用动态模板时为卡片设置对应的值",templateSectionNameHelper:"卡片名称用于标识模板中的卡片,请使用有意义且唯一的名称,以便后续为卡片设置内容",templateSectionNameDuplicated:"模板卡片名称在页面中必须唯一,当前名称已被其他模板卡片使用",propertyNotFound:"修改参数失败,原因:组件不存在 `{key}` 属性",configLLMDescription:"配置 LLM 描述",llmConfigTitle:"配置 LLM 描述",llmConfigLabel:"LLM 配置信息",llmConfigPlaceholder:"输入用于LLM的额外配置信息",llmConfigInstructions:"配置需要AI处理的属性并提供详细描述",llmPropertyDescribe:"AI提示描述",loading:"加载中...",componentNotFound:"未找到组件",templateName:"模板名称",mobile:"移动端",desktop:"桌面端",columns:"列数",gap:"布局间距",gapHelper:"设置布局中组件之间的间距,如果横向的间隔会让宽度溢出,则不会应用横向间距",padding:"内边距",paddingHelper:"设置布局的内边距",alignContent:{title:"垂直内容对齐",helper:"设置布局中垂直内容的对齐方式"},justifyContent:{title:"水平内容对齐",helper:"设置布局中水平内容的对齐方式"},visualGridLayout:"配置网格布局",dragResizeInstructions:"通过调整卡片位置和大小调整布局,可以分别设置桌面端和移动端两种布局",setAsBackgroundElement:"设置为背景卡片(无法拖拽排序、无法设置大小)",setAsNormalElement:"设置为普通卡片(可拖拽排序、可设置大小)"},siteMap:{routes:"路由列表",pageProperties:"路由属性",handler:"处理器",parameters:"参数",parametersHelper:"来自 URL、请求头等参数",data:"数据源",dataPlaceholder:"请输入页面数据",pageTemplate:"页面模板",selectPageTemplate:"选择页面模板",empty:"暂无路由",noDataSource:"无数据源",loading:"加载中...",unknownSource:"未知数据源",question:"页面规则",questionPlaceholder:"输入页面规则,描述您的要求",agent:"Agent",noAgent:"无 Agent",noRouteSelected:"未选择路由,请从左侧列表选择一个路由或创建新路由。",enableGenerate:"启用 AI 生成",path:"路径",generate:"生成页面内容",generating:"生成中...",deleteRouteTitle:"删除路由",deleteRouteConfirm:"你确定要删除此路由吗?此操作无法撤销。",routeDeleted:"路由删除成功",confirmRemoveParamsTitle:"删除动态参数",confirmRemoveParamsDescription:"以下动态参数将从路由中删除:",paramOptionsTitle:"参数可选值",paramOptionsDescription:"配置路由中动态参数的可选值",paramOptionName:"选项名称",deleteOption:"删除选项",addChildOption:"添加子选项",noParamOptions:"暂无参数可选值,点击下方按钮添加",addParamOption:"添加参数可选值",errorEmptyValue:"值不能为空",errorContainsSlash:"值不能包含斜杠 (/)",errorInvalidChars:"值包含无效字符,请仅使用URL安全字符",templates:{default:"默认模板",blog:"博客模板",landing:"落地页模板",form:"表单模板"}},datasource:{autoSaveSuccess:"自动保存成功"}},error:{embedUrl:"Embed 地址有误",notFoundEmbed:"未找到组件",noBackground:"无背景",notConfig:"未设置",slugAlreadyExists:"路径已存在",slugRequired:"路径不能为空",invalidJson:"JSON格式无效"},fabric:{fontFamily:"全局字体(已废弃)",basicComponent:{titleFontFamily:"段落标题字体",titleFontFamilyHelper:"* 全局修改段落标题字体",descFontFamily:"段落描述字体",descFontFamilyHelper:"* 全局修改段落描述字体"}},ai:{list:{noTemplatesInStudio:"目前您还没有在 AI Studio 里创建任何模版",createNow:"现在创建",noTemplates:"还没有任何模版"},output:{errorMessage:"出错了,请稍后再试",words:"字",characters:"字符",copied:"已复制!"},generate:"生成",text:{title:"文案助手",description:"使用 AI 帮助编写文案",theme:"内容",themeHelper:"整理内容,使描述更加合适网页",language:"语言",languageHelper:"输出文本语言",size:"大小",sizeHelper:"输出内容大小",original:"原文",improve:"改良"},status:{install:"请先检查 AIGNE Hub 是否已经配置",unavailable:"请先检查 AIGNE Hub 是否正常设置"}},translate:{title:"翻译页面",translate:"翻译",into:"翻译成",ing:"翻译中",ingTip:"将内容翻译为 {targetLanguage}。请稍等...",confirm:"翻译",confirmTitle:"确认翻译信息",confirmContent:"你确认翻译成 {target},并且翻译后新增 {target} 内容吗?",overlay:"确认继续翻译,并且翻译后覆盖 {target} 内容吗?",success:"翻译成功",fail:"翻译失败,请重试",failed:"翻译失败,请检查后重试",localInput:"本地输入",abort:"取消翻译成功",sameLanguage:"源语言和目标语言不能相同",noTargetLanguage:"请选择目标语言",noValidTargetLanguage:"源语言和目标语言不能相同,请选择不同的目标语言",noSourceData:"未找到用于翻译的源数据",failedFor:"翻译失败语言:",translating:"翻译中...",field:"字段",fields:"字段",unsupportedFieldType:"不支持的字段类型",expandAll:"展开所有分组",collapseAll:"折叠所有分组",unsavedChanges:"你有未保存的更改。是否在关闭前保存?",templateSyncTip:"您只需维护一种语言版本的页面模板,我们会在处理翻译的同时,自动同步页面模板的配置。",updateMode:"翻译更新模式",batchMode:"批量更新",realtimeMode:"实时更新",batchModeDescription:"翻译完成后一次性更新所有内容(性能更佳)",realtimeModeDescription:"每个翻译结果立即显示(实时预览)"},aiRuntime:{aiSettings:"AI 设置",unnamed:"未命名",project:"项目",assistant:"助手",widget:"部件",all:"全部",form:"仅表单",result:"仅输出",submitButton:"提交按钮",submitIcon:"提交按钮图标",submitBackground:"提交按钮背景色",placeholder:"占位提示",loadingIndicator:"加载提示"},basicInfo:"基础信息",name:"名称",description:"描述",tags:"标签",previewImage:"预览图片",properties:"属性",property:"属性",addObject:"添加{object}",key:"键",label:"标签",type:"类型",defaultValue:"默认值",renderer:"渲染方式",parameters:"参数",i18nEditorTitle:"国际化编辑",close:"关闭",component:"组件",delete:"删除",duplicate:"复制",move:{up:"上移",down:"下移"},show:"显示",hide:"隐藏",showParameter:"显示参数配置",hideParameter:"隐藏参数配置",dragSort:"拖拽排序",saved:"保存成功",supportMarkdownSyntaxPlaceholder:"支持输入 markdown",settings:{appearanceTip:"外观设置已迁移至 Blocklet 管理页面,持有管理员通行证的用户,可点击下方链接配置",appearanceLink:"前往外观设置 >",tabs:{basic:"基础设置",appearance:"外观设置",resources:"资源组件",integration:"集成设置"},basic:{title:"基础信息",avatar:"项目头像",name:"项目名称",namePlaceholder:"请输入项目名称",description:"项目描述",descriptionPlaceholder:"请输入项目描述",slug:"项目路径",slugPlaceholder:"请输入项目路径",slugHelper:"项目路径只能包含字母、数字、中划线和下划线",changeAvatar:"更换头像"},resources:{all:"启用所有资源组件",resourceBlocklet:"已选择的资源组件",addResource:"选择资源组件",needInstallResourceByAdmin:"请联系管理员安装资源组件",noSelectedResources:"未选择任何资源组件"},integration:{packageSetting:"包设置",migrateToComponentStudio:"迁移组件设置"}},edit:{modified:"已修改",new:"新增",deleted:"已删除",undo:"撤销",redo:"重做"},style:{title:"公共样式"}}),o={en:t,zh:a};exports.translations=o;
@@ -1,4 +1,4 @@
1
- "use strict";const W=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),B=require("@blocklet/sdk/lib/service/auth"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),C=require("path"),S=require("./chunks/components-D1oFQM3W.js"),I=require("./chunks/html-JOhPskS4.js"),K=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),T=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"),A=require("ufo"),l=n=>n&&n.__esModule?n:{default:n},G=l(W),s=l(E),Y=l(B),Q=l(D),V=l(U),X=l(H),Z=l(C),ee=l(J),te=l(z),ne=(n={})=>{const e={data:new Map,timers:new Map,set:(t,u,p=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),p)),e.data.set(t,u)},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=ne({max:1,ttl:1e3*30});Q.default();const oe=new V.default;new X.default({authenticator:oe,tokenStorage:new G.default({dbPath:Z.default.join(s.default.env.dataDir,"auth.db")})});const se=new Y.default,ae=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await se.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ce=["/assets/"];function le({app:n,viteDevServer:e,state:t}){let u;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(g,k,b)=>{const d=g.originalUrl;u=await e.transformIndexHtml(d,o),b()})}else u=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const p=O.Router();p.use((o,g,k)=>{if(o.headers["x-unique-record"]==="dial_http"){S.logger.info("[html] dial http request, return 200 status code"),g.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&p.use(K.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),p.get("/:path(*)?",async(o,g,k)=>{if(ce.some(a=>o.path?.startsWith(a))){k();return}const b="production";let d,v,_=u;if(o.path.startsWith("/pages")){const a=o.params.lang,y=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let f=(a&&w.has(a)?a:void 0)||(w.has(y)?y:void 0)||[...w][0];if((!f||!t.supportedLocales?.find(h=>h.locale===f))&&(f=t.supportedLocales?.[0]?.locale||""),f){const h=[];Object.values(t.pages).forEach(c=>{const L=Object.values(c?.sections??{}).filter(i=>i.component==="custom-component"&&i.config?.componentId).map(i=>({id:i.id,componentId:i.config.componentId,useCache:i.config.useCache,cacheDuration:i.config.cacheDuration,properties:c?.dataSource?.[i.id]?.[f]}));h.push(...L)});const x=new Promise(c=>{setTimeout(()=>{c({})},30*1e3)});try{await Promise.race([x,S.getPreloadComponents({mode:b,req:o,state:t,locale:f,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(c=>{c&&(v=T.injectPreloadComponents(c))})])}catch(c){S.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",c)}}}try{const a=d?.title||s.default.env.appName,y=d?.description||s.default.env.appDescription,w=A.withQuery(A.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:a,description:y});_=te.default.render(u,{ogTitle:a,ogDescription:y,ogImage:re(d?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const m=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let r=d?.backgroundColor;if(r&&R.isMuiColorKey(r)){const a=await ae();r=ee.default(a,`settings.theme.light.palette.${r}`,r)}const j=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
1
+ "use strict";const W=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),B=require("@blocklet/sdk/lib/service/auth"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),C=require("path"),S=require("./chunks/components-DLLpFRy5.js"),I=require("./chunks/html-JOhPskS4.js"),K=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),T=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"),A=require("ufo"),l=n=>n&&n.__esModule?n:{default:n},G=l(W),s=l(E),Y=l(B),Q=l(D),V=l(U),X=l(H),Z=l(C),ee=l(J),te=l(z),ne=(n={})=>{const e={data:new Map,timers:new Map,set:(t,u,p=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),p)),e.data.set(t,u)},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=ne({max:1,ttl:1e3*30});Q.default();const oe=new V.default;new X.default({authenticator:oe,tokenStorage:new G.default({dbPath:Z.default.join(s.default.env.dataDir,"auth.db")})});const se=new Y.default,ae=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await se.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ce=["/assets/"];function le({app:n,viteDevServer:e,state:t}){let u;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(g,k,b)=>{const d=g.originalUrl;u=await e.transformIndexHtml(d,o),b()})}else u=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const p=O.Router();p.use((o,g,k)=>{if(o.headers["x-unique-record"]==="dial_http"){S.logger.info("[html] dial http request, return 200 status code"),g.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&p.use(K.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),p.get("/:path(*)?",async(o,g,k)=>{if(ce.some(a=>o.path?.startsWith(a))){k();return}const b="production";let d,v,_=u;if(o.path.startsWith("/pages")){const a=o.params.lang,y=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let f=(a&&w.has(a)?a:void 0)||(w.has(y)?y:void 0)||[...w][0];if((!f||!t.supportedLocales?.find(h=>h.locale===f))&&(f=t.supportedLocales?.[0]?.locale||""),f){const h=[];Object.values(t.pages).forEach(c=>{const L=Object.values(c?.sections??{}).filter(i=>i.component==="custom-component"&&i.config?.componentId).map(i=>({id:i.id,componentId:i.config.componentId,useCache:i.config.useCache,cacheDuration:i.config.cacheDuration,properties:c?.dataSource?.[i.id]?.[f]}));h.push(...L)});const x=new Promise(c=>{setTimeout(()=>{c({})},30*1e3)});try{await Promise.race([x,S.getPreloadComponents({mode:b,req:o,state:t,locale:f,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(c=>{c&&(v=T.injectPreloadComponents(c))})])}catch(c){S.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",c)}}}try{const a=d?.title||s.default.env.appName,y=d?.description||s.default.env.appDescription,w=A.withQuery(A.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:a,description:y});_=te.default.render(u,{ogTitle:a,ogDescription:y,ogImage:re(d?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const m=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let r=d?.backgroundColor;if(r&&R.isMuiColorKey(r)){const a=await ae();r=ee.default(a,`settings.theme.light.palette.${r}`,r)}const j=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
2
2
  ${r?`<meta name="theme-color" content="${r}" /><style>html,body,#app {background-color: ${r};}</style>`:""}
3
3
  ${m?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${m.title}&display=swap">`:""}
4
4
  ${m?.description&&m?.description!==m?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${m.description}&display=swap">`:""}
@@ -1 +1 @@
1
- "use strict";const g=require("./chunks/components-D1oFQM3W.js"),c=require("./chunks/site-state-CD14QPqL.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),G=require("@blocklet/sdk/lib/middlewares/auth"),K=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(L),f=m(J),C=m(X),Y=m(W),D=m(B),k=m(G),$=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(g.isMultiTenant()){const P=n.createdBy===r,y=g.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!P&&!y)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(a))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){g.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}};function b(e,t){return new Promise((o,s)=>{const n=u.default.createReadStream(e),r=u.default.createWriteStream(t);n.on("error",s),r.on("error",s),r.on("finish",o),n.pipe(r)})}async function N(e,t){await u.default.promises.mkdir(t,{recursive:!0});const o=await u.default.promises.readdir(e,{withFileTypes:!0});for(const s of o){const n=D.default.join(e,s.name),r=D.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>g.isMultiTenant()?k.default()(e,t,o):k.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=K.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=F.Router(),T="@page",U="@component",j=":",R="ALL",q="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===U)return{componentId:s,projectId:o}},Z=e=>[q,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===q)return o},te=e=>{try{return JSON.parse(e)}catch{}return{}};async function A(e){const t=await c.SiteState.getStateByProjectId(e,"production"),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const a=t.pages[r];if(a)return{id:v({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=Y.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:Z(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}]}}w.get("/resources",h,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await $(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const oe=f.default.object({projectId:f.default.string().required().min(1),releaseId:f.default.string().allow(""),resources:f.default.array().items(f.default.string()).required(),locale:f.default.string().allow("")});w.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:_}=Q(i)||{};if(d)d===R||d&&_&&a.push({pageId:d,projectId:_});else{const{componentId:I,projectId:p}=V(i)||{};I===R||I&&p&&P.push({componentId:I,projectId:p})}}const y=C.default(a,"projectId"),O=C.default(P,"projectId"),M=new Set([...Object.keys(y),...Object.keys(O)]),E=H(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of M){const d=await c.SiteState.getStateByProjectId(i,r),_=y[i],I=O[i],p=_?.map(l=>l.pageId),S=I?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await z(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}g.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});w.get("/all-resources",h,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=w;
1
+ "use strict";const g=require("./chunks/components-DLLpFRy5.js"),c=require("./chunks/site-state-BfeN81ZD.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),G=require("@blocklet/sdk/lib/middlewares/auth"),K=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(L),f=m(J),C=m(X),Y=m(W),D=m(B),k=m(G),$=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(g.isMultiTenant()){const P=n.createdBy===r,y=g.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!P&&!y)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(a))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){g.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}};function b(e,t){return new Promise((o,s)=>{const n=u.default.createReadStream(e),r=u.default.createWriteStream(t);n.on("error",s),r.on("error",s),r.on("finish",o),n.pipe(r)})}async function N(e,t){await u.default.promises.mkdir(t,{recursive:!0});const o=await u.default.promises.readdir(e,{withFileTypes:!0});for(const s of o){const n=D.default.join(e,s.name),r=D.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>g.isMultiTenant()?k.default()(e,t,o):k.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=K.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=F.Router(),T="@page",U="@component",j=":",R="ALL",q="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===U)return{componentId:s,projectId:o}},Z=e=>[q,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===q)return o},te=e=>{try{return JSON.parse(e)}catch{}return{}};async function A(e){const t=await c.SiteState.getStateByProjectId(e,"production"),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const a=t.pages[r];if(a)return{id:v({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=Y.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:Z(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}]}}w.get("/resources",h,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await $(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const oe=f.default.object({projectId:f.default.string().required().min(1),releaseId:f.default.string().allow(""),resources:f.default.array().items(f.default.string()).required(),locale:f.default.string().allow("")});w.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:_}=Q(i)||{};if(d)d===R||d&&_&&a.push({pageId:d,projectId:_});else{const{componentId:I,projectId:p}=V(i)||{};I===R||I&&p&&P.push({componentId:I,projectId:p})}}const y=C.default(a,"projectId"),O=C.default(P,"projectId"),M=new Set([...Object.keys(y),...Object.keys(O)]),E=H(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of M){const d=await c.SiteState.getStateByProjectId(i,r),_=y[i],I=O[i],p=_?.map(l=>l.pageId),S=I?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await z(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}g.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});w.get("/all-resources",h,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=w;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-D1oFQM3W.js");const e=require("./chunks/site-state-CD14QPqL.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("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-DLLpFRy5.js");const e=require("./chunks/site-state-BfeN81ZD.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("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,29 +1,27 @@
1
- import { memoize as Q, BuiltinModules as I } from "@blocklet/quickjs";
1
+ import { memoize as Q, BuiltinModules as v } from "@blocklet/quickjs";
2
2
  import { createHash as z } from "crypto";
3
3
  import { promises as g } from "fs";
4
- import U, { join as b } from "path";
4
+ import U, { join as O } from "path";
5
5
  import h from "@blocklet/sdk/lib/config";
6
6
  import Z from "lodash/isNil";
7
7
  import { getComponentMountPoint as X } from "@blocklet/pages-kit/builtin/utils";
8
8
  import { PreloadComponentScriptModule as P } from "@blocklet/pages-kit/types";
9
- import { BuiltinModules as M } from "@blocklet/pages-kit/utils/builtin";
10
- import { componentUMDName as Y, RenderNestedComponent as j, mergeComponent as q } from "@blocklet/pages-kit/utils/property";
9
+ import { BuiltinModules as I } from "@blocklet/pages-kit/utils/builtin";
10
+ import { componentUMDName as Y, RenderNestedComponent as D, mergeComponent as q } from "@blocklet/pages-kit/utils/property";
11
11
  import ee from "lodash/isEmpty";
12
12
  import { LRUCache as te } from "lru-cache";
13
13
  import oe, { Headers as ne } from "node-fetch";
14
- import { joinURL as A, getQuery as re, withQuery as se, parseURL as D, withHttps as ce } from "ufo";
14
+ import { joinURL as _, getQuery as re, withQuery as se, parseURL as R, withHttps as ce } from "ufo";
15
15
  import ae from "@blocklet/logger";
16
16
  import { isRelativeModule as ie, createBuiltinModuleTransformer as pe } from "@blocklet/pages-kit/utils/typescript/builtin-module-transformer";
17
17
  import "@blocklet/sdk/lib/component";
18
18
  h.env.mode;
19
- h.env.OPENAI_API_KEY || process.env.OPENAI_API_KEY;
20
- h.env.OPENAI_BASE_URL || process.env.OPENAI_BASE_URL;
21
19
  h.env.TRANSLATE_ADDITIONAL_PROMPT || process.env.TRANSLATE_ADDITIONAL_PROMPT;
22
20
  h.env.PAGE_CONTENT_ADDITIONAL_PROMPT || process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;
23
21
  const qe = "image-bin";
24
22
  h.env.INIT_TEMPLATE_PATH;
25
- const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"), L = h, tt = () => h.env.tenantMode === "multiple", ot = () => (Z(L.env.preferences.multiTenantAllProjectAccessPassports) ? [] : L.env.preferences.multiTenantAllProjectAccessPassports?.split(",")) || [], le = U.join(h.env.dataDir, "fs-memoize-cache"), ue = h.env.FS_MEMOIZE_CACHE_VERSION || "v1.0.0", w = ae("pages-kit"), de = le, me = ue, _ = 30 * 24 * 60 * 60 * 1e3, fe = 24 * 60 * 60 * 1e3, B = async (e = "") => {
26
- const t = b(de, e);
23
+ const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"), $ = h, tt = () => h.env.tenantMode === "multiple", ot = () => (Z($.env.preferences.multiTenantAllProjectAccessPassports) ? [] : $.env.preferences.multiTenantAllProjectAccessPassports?.split(",")) || [], le = U.join(h.env.dataDir, "fs-memoize-cache"), ue = h.env.FS_MEMOIZE_CACHE_VERSION || "v1.0.0", w = ae("pages-kit"), de = le, me = ue, M = 30 * 24 * 60 * 60 * 1e3, fe = 24 * 60 * 60 * 1e3, H = async (e = "") => {
24
+ const t = O(de, e);
27
25
  try {
28
26
  if (!(await g.stat(t)).isDirectory())
29
27
  throw new Error(`${t} is not a directory`);
@@ -31,23 +29,23 @@ const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"),
31
29
  await g.mkdir(t, { recursive: !0 });
32
30
  }
33
31
  return t;
34
- }, $ = (e, ...t) => e.keyGenerator ? e.keyGenerator(...t) : JSON.stringify([e.subdir || "", ...t]), he = (e, t) => {
32
+ }, k = (e, ...t) => e.keyGenerator ? e.keyGenerator(...t) : JSON.stringify([e.subdir || "", ...t]), he = (e, t) => {
35
33
  const o = z("md5").update(t).digest("hex");
36
- return b(e, `${me}-${o}.json`);
34
+ return O(e, `${me}-${o}.json`);
37
35
  }, we = async (e = "") => {
38
- const t = await B(e), o = Date.now();
36
+ const t = await H(e), o = Date.now();
39
37
  try {
40
38
  const n = await g.readdir(t);
41
39
  await Promise.all(
42
40
  n.filter((c) => c.endsWith(".json")).map(async (c) => {
43
- const r = b(t, c);
41
+ const r = O(t, c);
44
42
  try {
45
43
  const u = await g.readFile(r, "utf-8"), p = JSON.parse(u);
46
- p.createdAt && o - p.createdAt > _ && await g.unlink(r);
44
+ p.createdAt && o - p.createdAt > M && await g.unlink(r);
47
45
  } catch {
48
46
  try {
49
47
  const p = await g.stat(r);
50
- o - p.mtimeMs > _ && await g.unlink(r);
48
+ o - p.mtimeMs > M && await g.unlink(r);
51
49
  } catch {
52
50
  }
53
51
  }
@@ -64,13 +62,13 @@ const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"),
64
62
  e.add(n);
65
63
  };
66
64
  })();
67
- function O(e, t) {
65
+ function A(e, t) {
68
66
  return t.subdir && ge(t.subdir), Q(
69
67
  async (...n) => {
70
- const c = await B(t.subdir || ""), r = $(t, ...n), u = he(c, r);
68
+ const c = await H(t.subdir || ""), r = k(t, ...n), u = he(c, r);
71
69
  try {
72
70
  const p = await g.readFile(u, "utf-8"), { value: d, createdAt: l } = JSON.parse(p);
73
- if (l && Date.now() - l > _)
71
+ if (l && Date.now() - l > M)
74
72
  throw await g.unlink(u).catch(() => {
75
73
  }), new Error("Cache expired");
76
74
  return d;
@@ -82,18 +80,18 @@ function O(e, t) {
82
80
  }
83
81
  },
84
82
  {
85
- keyGenerator: (...n) => $(t, ...n),
83
+ keyGenerator: (...n) => k(t, ...n),
86
84
  lruOptions: t.lruOptions || {
87
85
  max: 100,
88
- ttl: _
86
+ ttl: M
89
87
  }
90
88
  }
91
89
  );
92
90
  }
93
- const H = async () => await import("typescript"), ye = async () => await import("esbuild"), Ee = async () => (await import("postcss")).default, Se = async () => (await import("tailwindcss")).default, xe = async () => (await import("autoprefixer")).default, Ce = !1, Pe = async (e, { componentId: t }) => {
91
+ const B = async () => await import("typescript"), ye = async () => await import("esbuild"), xe = async () => (await import("postcss")).default, Se = async () => (await import("tailwindcss")).default, Ce = async () => (await import("autoprefixer")).default, Ee = !1, Pe = async (e, { componentId: t }) => {
94
92
  const o = `@tailwind components;
95
93
  @tailwind utilities;
96
- `, n = `.CustomComponent_${t}`, c = await Ee(), r = await Se(), u = await xe();
94
+ `, n = `.CustomComponent_${t}`, c = await xe(), r = await Se(), u = await Ce();
97
95
  return (await c([
98
96
  r({ content: [{ raw: e, extension: "tsx" }] }),
99
97
  u({
@@ -114,9 +112,9 @@ const H = async () => await import("typescript"), ye = async () => await import(
114
112
 
115
113
  ${e}
116
114
  `;
117
- }, k = O(
115
+ }, L = A(
118
116
  async (e, t) => {
119
- let o = await H();
117
+ let o = await B();
120
118
  try {
121
119
  let n = o.transpileModule(e, {
122
120
  compilerOptions: {
@@ -137,7 +135,7 @@ ${e}
137
135
  moduleResolution: o.ModuleResolutionKind.Node16
138
136
  }
139
137
  }).outputText;
140
- return t.module === P.CJS ? c : J(t.moduleName, c);
138
+ return t.module === P.CJS ? c : K(t.moduleName, c);
141
139
  } catch (n) {
142
140
  throw new Error(n);
143
141
  } finally {
@@ -147,12 +145,12 @@ ${e}
147
145
  {
148
146
  subdir: "transpileModule"
149
147
  }
150
- ), _e = async (e, t) => {
148
+ ), Me = async (e, t) => {
151
149
  let { build: o } = await ye(), n = null;
152
150
  try {
153
151
  const r = (await o({
154
152
  entryPoints: ["index.tsx"],
155
- external: Object.keys(M),
153
+ external: Object.keys(I),
156
154
  format: "esm",
157
155
  target: "esnext",
158
156
  bundle: !0,
@@ -177,7 +175,7 @@ ${e}
177
175
  })).outputFiles?.[0]?.contents;
178
176
  if (!r) throw new Error("Failed to build server code");
179
177
  const u = Buffer.from(r).toString();
180
- return n = await H(), n.transpileModule(u, {
178
+ return n = await B(), n.transpileModule(u, {
181
179
  compilerOptions: { module: n.ModuleKind.ESNext, target: n.ScriptTarget.ES2020 }
182
180
  }).outputText;
183
181
  } catch (c) {
@@ -185,18 +183,18 @@ ${e}
185
183
  } finally {
186
184
  o = null, n = null;
187
185
  }
188
- }, ve = (e, t) => new RegExp(
186
+ }, be = (e, t) => new RegExp(
189
187
  `export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,
190
188
  "m"
191
- ).test(e) ? e : void 0, K = O(
189
+ ).test(e) ? e : void 0, J = A(
192
190
  async (e, t) => {
193
- const o = await _e(e, t);
194
- return ve(o, t);
191
+ const o = await Me(e, t);
192
+ return be(o, t);
195
193
  },
196
194
  {
197
195
  subdir: "extractExportValueSchema"
198
196
  }
199
- ), J = (e, t) => `// GENERATED FILE. DO NOT EDIT.
197
+ ), K = (e, t) => `// GENERATED FILE. DO NOT EDIT.
200
198
  var ${e} = async function () {
201
199
 
202
200
  const exports = {};
@@ -226,26 +224,26 @@ var ${e} = async function () {
226
224
  const { Sandbox: e } = await import("@blocklet/quickjs");
227
225
  return e;
228
226
  };
229
- function Ie(e) {
227
+ function ve(e) {
230
228
  return e?.type === "react-component";
231
229
  }
232
- const x = new te({
230
+ const C = new te({
233
231
  max: 100,
234
232
  ttl: 1e3 * 60 * 60 * 24 * 7
235
233
  // default ttl is 7 days
236
- }), Ae = 60 * 60, F = 10;
234
+ }), _e = 60 * 60, F = 10;
237
235
  function V(e) {
238
- w.info("clear preload components cache", { cacheKey: e }), x.delete(e);
236
+ w.info("clear preload components cache", { cacheKey: e }), C.delete(e);
239
237
  }
240
238
  function nt(e) {
241
- for (const t of x.keys())
239
+ for (const t of C.keys())
242
240
  t.includes(e) && (w.info("clear preload components cache", { cacheKey: t }), V(t));
243
241
  }
244
242
  function rt(e) {
245
- for (const t of x.keys())
243
+ for (const t of C.keys())
246
244
  t.includes(e) && (w.info("clear preload components cache", { cacheKey: t }), V(t));
247
245
  }
248
- function Me({
246
+ function Ie({
249
247
  mode: e,
250
248
  instanceId: t,
251
249
  componentId: o,
@@ -269,17 +267,17 @@ async function st({
269
267
  const d = (await Promise.all(
270
268
  c.map(async (s) => {
271
269
  try {
272
- const a = Me({
270
+ const a = Ie({
273
271
  mode: e,
274
272
  instanceId: s.id,
275
273
  componentId: s.componentId,
276
274
  locale: n
277
275
  });
278
- if (e !== "draft" && s.useCache && x.has(a))
279
- return w.info(`get preload component from cache: ${a}`), x.get(a);
280
- const f = v({ state: o, componentId: s.componentId });
276
+ if (e !== "draft" && s.useCache && C.has(a))
277
+ return w.info(`get preload component from cache: ${a}`), C.get(a);
278
+ const f = b({ state: o, componentId: s.componentId });
281
279
  if (!f) return null;
282
- const S = await be({
280
+ const S = await Oe({
283
281
  req: t,
284
282
  state: o,
285
283
  componentId: f.id,
@@ -288,14 +286,14 @@ async function st({
288
286
  properties: s.properties
289
287
  });
290
288
  if (!S) return null;
291
- const C = { instanceId: s.id, preload: S };
289
+ const E = { instanceId: s.id, preload: S };
292
290
  if (e !== "draft" && s.useCache) {
293
- let E = Ae;
294
- s.cacheDuration && (E = s.cacheDuration), w.info(`set preload component to cache(${E}s): ${a}`), x.set(a, C, {
295
- ttl: E * 1e3
291
+ let x = _e;
292
+ s.cacheDuration && (x = s.cacheDuration), w.info(`set preload component to cache(${x}s): ${a}`), C.set(a, E, {
293
+ ttl: x * 1e3
296
294
  });
297
295
  }
298
- return C;
296
+ return E;
299
297
  } catch (a) {
300
298
  return w.error(
301
299
  "get preload component error",
@@ -310,22 +308,22 @@ async function st({
310
308
  async function m() {
311
309
  const s = await Promise.all(
312
310
  l.map(async (a) => {
313
- const f = r === P.ESM, S = r === P.UMD_FN, C = r === P.CJS, E = f ? "" : Y({ componentId: a.component.id }), N = je(a.component);
311
+ const f = r === P.ESM, S = r === P.UMD_FN, E = r === P.CJS, x = f ? "" : Y({ componentId: a.component.id }), N = De(a.component);
314
312
  let T = {
315
313
  module: r,
316
314
  script: "",
317
- moduleName: E
315
+ moduleName: x
318
316
  };
319
317
  if (N && a.component.renderer?.type === "react-component" && f && a.component.renderer?.script)
320
318
  T.script = a.component.renderer?.script;
321
- else if (N && a.component.renderer?.type === "react-component" && (C || S) && a.component.renderer?.cjsScript) {
322
- const R = a.component.renderer.cjsScript;
323
- T.script = C ? R : J(E, R);
319
+ else if (N && a.component.renderer?.type === "react-component" && (E || S) && a.component.renderer?.cjsScript) {
320
+ const j = a.component.renderer.cjsScript;
321
+ T.script = E ? j : K(x, j);
324
322
  } else
325
323
  T = f ? {
326
324
  // ESM
327
325
  module: r,
328
- script: await k(a.script, {
326
+ script: await L(a.script, {
329
327
  componentId: a.component.id,
330
328
  module: r,
331
329
  tailwind: e !== "draft"
@@ -333,13 +331,13 @@ async function st({
333
331
  } : {
334
332
  // CJS OR UMD
335
333
  module: r,
336
- script: await k(a.script, {
334
+ script: await L(a.script, {
337
335
  componentId: a.component.id,
338
336
  module: r,
339
- moduleName: E,
337
+ moduleName: x,
340
338
  tailwind: e !== "draft"
341
339
  }),
342
- moduleName: E
340
+ moduleName: x
343
341
  };
344
342
  return [a.component.id, { component: a.component, script: T }];
345
343
  })
@@ -357,7 +355,7 @@ async function st({
357
355
  }))
358
356
  };
359
357
  }
360
- async function be({
358
+ async function Oe({
361
359
  req: e,
362
360
  state: t,
363
361
  componentId: o,
@@ -365,7 +363,7 @@ async function be({
365
363
  defaultLocale: c,
366
364
  properties: r
367
365
  }) {
368
- const { supportedLocales: u } = t, p = v({ state: t, componentId: o });
366
+ const { supportedLocales: u } = t, p = b({ state: t, componentId: o });
369
367
  if (!p) return null;
370
368
  const d = u.some((m) => m.locale === n) ? n : c;
371
369
  if (!d) return null;
@@ -375,7 +373,7 @@ async function be({
375
373
  ...l
376
374
  } : null;
377
375
  }
378
- const Oe = 20;
376
+ const Ae = 20;
379
377
  async function W({
380
378
  req: e,
381
379
  depth: t = 0,
@@ -385,7 +383,7 @@ async function W({
385
383
  defaultLocale: r,
386
384
  properties: u
387
385
  }) {
388
- if (t > Oe) throw new RangeError("max component depth exceeded");
386
+ if (t > Ae) throw new RangeError("max component depth exceeded");
389
387
  const p = Ne({ state: o, componentId: n, properties: u, locale: c });
390
388
  if (!p) return null;
391
389
  const { props: d, component: l } = p, m = {
@@ -394,14 +392,14 @@ async function W({
394
392
  props: { ...d }
395
393
  };
396
394
  try {
397
- const y = Ie(l.renderer) ? l.renderer.getServerSideProps : void 0, i = await Re({ ...p, req: e, getServerSideProps: y });
395
+ const y = ve(l.renderer) ? l.renderer.getServerSideProps : void 0, i = await je({ ...p, req: e, getServerSideProps: y });
398
396
  i?.props && Object.assign(m.props, i.props);
399
397
  } catch (y) {
400
398
  w.error("preload data at server side error", { componentId: n, name: p.component.name }, { error: y });
401
399
  }
402
400
  return await Promise.all(
403
401
  Object.entries(d).map(async ([y, i]) => {
404
- if (i?.type === j) {
402
+ if (i?.type === D) {
405
403
  const s = await W({
406
404
  req: e,
407
405
  depth: t + 1,
@@ -413,7 +411,7 @@ async function W({
413
411
  });
414
412
  s && (Object.assign(m.components, s.components), Object.assign(m.props, {
415
413
  [y]: {
416
- type: j,
414
+ type: D,
417
415
  componentId: i.componentId,
418
416
  props: s.props
419
417
  }
@@ -428,25 +426,25 @@ function Ne({
428
426
  locale: o,
429
427
  properties: n
430
428
  }) {
431
- const c = v({ state: e, componentId: t });
429
+ const c = b({ state: e, componentId: t });
432
430
  if (!c) return null;
433
431
  const r = q({
434
432
  componentId: t,
435
- getComponent: (u) => v({ state: e, componentId: u }),
433
+ getComponent: (u) => b({ state: e, componentId: u }),
436
434
  locale: o,
437
435
  defaultLocale: e.config.defaultLocale,
438
436
  properties: n
439
437
  });
440
438
  return r ? { component: c, script: r.script, props: { locale: o, ...r.props } } : null;
441
439
  }
442
- function v({ state: e, componentId: t }) {
440
+ function b({ state: e, componentId: t }) {
443
441
  return e.components[t]?.data ?? e.resources.components?.[t]?.component;
444
442
  }
445
443
  function ct({ state: e, name: t }) {
446
444
  const o = t.toLowerCase();
447
445
  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;
448
446
  }
449
- async function Re({
447
+ async function je({
450
448
  component: e,
451
449
  script: t,
452
450
  props: o,
@@ -455,7 +453,7 @@ async function Re({
455
453
  }) {
456
454
  if (!c && !t?.includes("getServerSideProps"))
457
455
  return null;
458
- const r = c ?? await K(t, "getServerSideProps");
456
+ const r = c ?? await J(t, "getServerSideProps");
459
457
  if (!r) return null;
460
458
  const p = (r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/) || r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1] || "getServerSideProps", d = new Promise((i) => {
461
459
  setTimeout(() => {
@@ -494,11 +492,11 @@ try {
494
492
  export { joinURL, withQuery, getQuery, getComponentMountPoint }
495
493
  `;
496
494
  if (i === "@blocklet/pages-kit/builtin/dayjs")
497
- return I.dayjs;
498
- if (i in I)
499
- return I[i];
500
- if (i in M) {
501
- const s = M[i];
495
+ return v.dayjs;
496
+ if (i in v)
497
+ return v[i];
498
+ if (i in I) {
499
+ const s = I[i];
502
500
  return ee(s) ? void 0 : s;
503
501
  }
504
502
  },
@@ -517,7 +515,7 @@ try {
517
515
  }
518
516
  },
519
517
  getComponentMountPoint: X,
520
- joinURL: A,
518
+ joinURL: _,
521
519
  withQuery: se,
522
520
  getQuery: re,
523
521
  window: {
@@ -530,10 +528,10 @@ try {
530
528
  {
531
529
  // NOTE: IMPORTANT! place location and fetch (has side effect) at the args not global
532
530
  // because the global is shared between all runtime and just init once
533
- location: { href: A(ce(n.hostname), n.originalUrl) },
531
+ location: { href: _(ce(n.hostname), n.originalUrl) },
534
532
  fetch: (i, { ...s } = {}) => {
535
- const a = typeof i == "string" && i.startsWith("/") ? A(h.env.appUrl, i) : i;
536
- if (typeof a == "string" && D(a).host === D(h.env.appUrl).host) {
533
+ const a = typeof i == "string" && i.startsWith("/") ? _(h.env.appUrl, i) : i;
534
+ if (typeof a == "string" && R(a).host === R(h.env.appUrl).host) {
537
535
  const f = n.get("cookie");
538
536
  if (f) {
539
537
  const S = new ne(s.headers);
@@ -559,11 +557,11 @@ try {
559
557
  })
560
558
  ]);
561
559
  }
562
- const at = O(
560
+ const at = A(
563
561
  async (e, t, o, n) => {
564
562
  if (!e?.includes(t) && !n)
565
563
  return null;
566
- const c = n ?? await K(e, t);
564
+ const c = n ?? await J(e, t);
567
565
  if (c)
568
566
  try {
569
567
  let r = await G();
@@ -589,9 +587,9 @@ const at = O(
589
587
  {
590
588
  subdir: "getExportSchemaValueFromCode"
591
589
  }
592
- ), je = (e) => !!(e.renderer?.type === "react-component" && e.version && e.version >= 2);
590
+ ), De = (e) => !!(e.renderer?.type === "react-component" && e.version && e.version >= 2);
593
591
  export {
594
- Ae as C,
592
+ _e as C,
595
593
  F as G,
596
594
  qe as I,
597
595
  ot as a,
@@ -601,12 +599,12 @@ export {
601
599
  V as e,
602
600
  rt as f,
603
601
  st as g,
604
- Me as h,
602
+ Ie as h,
605
603
  tt as i,
606
- be as j,
607
- v as k,
604
+ Oe as j,
605
+ b as k,
608
606
  w as l,
609
- O as m,
607
+ A as m,
610
608
  ct as n,
611
- je as s
609
+ De as s
612
610
  };
@@ -1,4 +1,4 @@
1
- import { d as $e, l as f, I as Qe, c as Xe, m as Ze, b as et } from "./components-6zI6vrkL.js";
1
+ import { d as $e, l as f, I as Qe, c as Xe, m as Ze, b as et } from "./components-DLwSTd_N.js";
2
2
  import { getYjsValue as V, syncedStore as tt } from "@syncedstore/core";
3
3
  import * as N from "yjs";
4
4
  import { setPageDataSource as st } from "@blocklet/pages-kit/utils/data-source";
@@ -1,4 +1,4 @@
1
- import { C as S, G as _, e as c, f as E, c as d, k as P, n as N, b as O, j as g, g as I, h as T, s as h } from "./chunks/components-6zI6vrkL.js";
1
+ import { C as S, G as _, e as c, f as E, c as d, k as P, n as N, b as O, j as g, g as I, h as T, s as h } from "./chunks/components-DLwSTd_N.js";
2
2
  import "@blocklet/pages-kit/builtin/utils";
3
3
  import "@blocklet/pages-kit/types";
4
4
  import "@blocklet/pages-kit/utils/builtin";
package/lib/es/locales.js CHANGED
@@ -447,8 +447,8 @@ const t = e({
447
447
  improve: "Improve"
448
448
  },
449
449
  status: {
450
- install: "Check whether the ai-kit is installed",
451
- unavailable: "Check whether the openai key is set properly"
450
+ install: "Check whether the AIGNE Hub is initialized",
451
+ unavailable: "Check whether the AIGNE Hub is set properly"
452
452
  }
453
453
  },
454
454
  translate: {
@@ -473,8 +473,17 @@ const t = e({
473
473
  failedFor: "Translation failed for",
474
474
  translating: "Translating...",
475
475
  field: "Field",
476
+ fields: "Fields",
477
+ unsupportedFieldType: "Unsupported field type",
478
+ expandAll: "Expand all groups",
479
+ collapseAll: "Collapse all groups",
476
480
  unsavedChanges: "You have unsaved changes. Do you want to save before closing?",
477
- templateSyncTip: "You only need to maintain one language version of your page template. We will automatically sync the template configuration while handling translations."
481
+ templateSyncTip: "You only need to maintain one language version of your page template. We will automatically sync the template configuration while handling translations.",
482
+ updateMode: "Translation Update Mode",
483
+ batchMode: "Batch",
484
+ realtimeMode: "Real-time",
485
+ batchModeDescription: "Update all translations at once after completion (better performance)",
486
+ realtimeModeDescription: "Show each translation result immediately as it arrives (live preview)"
478
487
  },
479
488
  aiRuntime: {
480
489
  aiSettings: "AI Settings",
@@ -1020,8 +1029,8 @@ const t = e({
1020
1029
  improve: "改良"
1021
1030
  },
1022
1031
  status: {
1023
- install: "请先检查 ai-kit 是否安装",
1024
- unavailable: "请先检查 openai key 是否正常设置"
1032
+ install: "请先检查 AIGNE Hub 是否已经配置",
1033
+ unavailable: "请先检查 AIGNE Hub 是否正常设置"
1025
1034
  }
1026
1035
  },
1027
1036
  translate: {
@@ -1046,8 +1055,17 @@ const t = e({
1046
1055
  failedFor: "翻译失败语言:",
1047
1056
  translating: "翻译中...",
1048
1057
  field: "字段",
1058
+ fields: "字段",
1059
+ unsupportedFieldType: "不支持的字段类型",
1060
+ expandAll: "展开所有分组",
1061
+ collapseAll: "折叠所有分组",
1049
1062
  unsavedChanges: "你有未保存的更改。是否在关闭前保存?",
1050
- templateSyncTip: "您只需维护一种语言版本的页面模板,我们会在处理翻译的同时,自动同步页面模板的配置。"
1063
+ templateSyncTip: "您只需维护一种语言版本的页面模板,我们会在处理翻译的同时,自动同步页面模板的配置。",
1064
+ updateMode: "翻译更新模式",
1065
+ batchMode: "批量更新",
1066
+ realtimeMode: "实时更新",
1067
+ batchModeDescription: "翻译完成后一次性更新所有内容(性能更佳)",
1068
+ realtimeModeDescription: "每个翻译结果立即显示(实时预览)"
1051
1069
  },
1052
1070
  aiRuntime: {
1053
1071
  aiSettings: "AI 设置",
@@ -5,7 +5,7 @@ import B from "@blocklet/sdk/lib/wallet";
5
5
  import D from "@blocklet/sdk/lib/wallet-authenticator";
6
6
  import K from "@blocklet/sdk/lib/wallet-handler";
7
7
  import U, { resolve as C } from "path";
8
- import { l as v, g as W } from "./chunks/components-6zI6vrkL.js";
8
+ import { l as v, g as W } from "./chunks/components-DLwSTd_N.js";
9
9
  import { e as H, i as N } from "./chunks/html-DfzaaIYa.js";
10
10
  import { createSnapshotMiddleware as O } from "@arcblock/crawler-middleware";
11
11
  import { PreloadComponentScriptModule as R } from "@blocklet/pages-kit/types";
@@ -1,5 +1,5 @@
1
- import { i as A, a as M, l as b } from "./chunks/components-6zI6vrkL.js";
2
- import { P as w, C as J, R as X, S as x, t as W, g as G } from "./chunks/site-state-Dta8F9zq.js";
1
+ import { i as A, a as M, l as b } from "./chunks/components-DLwSTd_N.js";
2
+ import { P as w, C as J, R as X, S as x, t as W, g as G } from "./chunks/site-state-CVKixevr.js";
3
3
  import { Router as K } from "express";
4
4
  import a from "fs";
5
5
  import m from "joi";
@@ -1,5 +1,5 @@
1
- import "./chunks/components-6zI6vrkL.js";
2
- import { c as O, a as b, b as h, S as y, e as L, f as U, h as q, d as v, g as z, i as C, m as F, t as G, j as J, u as K } from "./chunks/site-state-Dta8F9zq.js";
1
+ import "./chunks/components-DLwSTd_N.js";
2
+ import { c as O, a as b, b as h, S as y, e as L, f as U, h as q, d as v, g as z, i as C, m as F, t as G, j as J, u as K } from "./chunks/site-state-CVKixevr.js";
3
3
  import { nextId as Q } from "@blocklet/pages-kit/utils/common";
4
4
  import "@blocklet/pages-kit/utils/page-model";
5
5
  import "@blocklet/pages-kit/utils/property";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/pages-kit-inner-components",
3
- "version": "0.6.57",
3
+ "version": "0.6.59",
4
4
  "description": "Pages Kit inner components library",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -69,21 +69,21 @@
69
69
  "url": "git+https://github.com/blocklet/pages-kit.git"
70
70
  },
71
71
  "dependencies": {
72
- "@arcblock/did-connect-react": "^3.1.21",
72
+ "@arcblock/did-connect-react": "^3.1.25",
73
73
  "@arcblock/did-connect-storage-nedb": "^1.8.0",
74
- "@arcblock/react-hooks": "^3.1.21",
75
- "@arcblock/ux": "^3.1.21",
74
+ "@arcblock/react-hooks": "^3.1.25",
75
+ "@arcblock/ux": "^3.1.25",
76
76
  "@blocklet/aigne-hub": "^0.3.15",
77
- "@blocklet/aigne-sdk": "^0.5.8",
78
- "@blocklet/code-editor": "^0.5.6",
77
+ "@blocklet/aigne-sdk": "^0.5.10",
78
+ "@blocklet/code-editor": "^0.5.10",
79
79
  "@blocklet/embed": "^0.2.5",
80
80
  "@blocklet/js-sdk": "^1.16.48",
81
81
  "@blocklet/logger": "1.16.48",
82
- "@blocklet/quickjs": "^0.5.6",
82
+ "@blocklet/quickjs": "^0.5.10",
83
83
  "@blocklet/sdk": "^1.16.48",
84
- "@blocklet/studio-ui": "^0.5.6",
84
+ "@blocklet/studio-ui": "^0.5.10",
85
85
  "@blocklet/tracker": "^1.16.48",
86
- "@blocklet/ui-react": "^3.1.21",
86
+ "@blocklet/ui-react": "^3.1.25",
87
87
  "@blocklet/uploader": "^0.2.7",
88
88
  "@blocklet/uploader-server": "^0.2.7",
89
89
  "@dnd-kit/core": "^6.3.1",
@@ -100,7 +100,6 @@
100
100
  "@iconify/react": "^5.0.2",
101
101
  "@lottiefiles/lottie-player": "^2.0.4",
102
102
  "@microsoft/fetch-event-source": "^2.0.1",
103
- "@monaco-editor/react": "^4.6.0",
104
103
  "@mui/base": "^5.0.0-beta.40",
105
104
  "@mui/icons-material": "^7.1.2",
106
105
  "@mui/lab": "^7.0.0-beta.14",
@@ -108,9 +107,9 @@
108
107
  "@mui/styles": "^5.16.14",
109
108
  "@mui/utils": "^7.1.1",
110
109
  "@mui/x-date-pickers": "^8.6.0",
111
- "@ocap/client": "^1.21.3",
112
- "@ocap/mcrypto": "^1.21.3",
113
- "@ocap/wallet": "^1.21.3",
110
+ "@ocap/client": "^1.22.3",
111
+ "@ocap/mcrypto": "^1.22.3",
112
+ "@ocap/wallet": "^1.22.3",
114
113
  "@reactivedata/reactive": "^0.2.2",
115
114
  "@syncedstore/core": "^0.6.0",
116
115
  "@syncedstore/react": "^0.6.0",
@@ -152,8 +151,6 @@
152
151
  "lodash": "^4.17.21",
153
152
  "lru-cache": "^10.4.3",
154
153
  "material-ui-popup-state": "^5.1.2",
155
- "monaco-editor": "^0.50.0",
156
- "monaco-vim": "^0.4.1",
157
154
  "multer": "^1.4.5-lts.1",
158
155
  "mustache": "^4.2.0",
159
156
  "nanoid": "^3.3.7",
@@ -204,8 +201,8 @@
204
201
  "yaml": "^2.5.0",
205
202
  "yjs": "^13.6.18",
206
203
  "zustand": "^4.5.5",
207
- "@blocklet/pages-kit": "^0.6.57",
208
- "@blocklet/pages-kit-block-studio": "^0.6.57"
204
+ "@blocklet/pages-kit": "^0.6.59",
205
+ "@blocklet/pages-kit-block-studio": "^0.6.59"
209
206
  },
210
207
  "devDependencies": {
211
208
  "@trivago/prettier-plugin-sort-imports": "^5.2.1",