@blocklet/pages-kit-inner-components 0.7.1 → 0.7.2

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.
@@ -29,7 +29,7 @@ var ${e} = async function () {
29
29
 
30
30
  return exports;
31
31
  };
32
- `,Y=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function Ke(e){return e?.type==="react-component"}const M=new ge.LRUCache({max:600,ttl:1e3*60*60*24*7}),ee=60*60,k=10;function F(e){g.info("clear preload components cache",{cacheKey:e}),M.delete(e)}function Ge(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function Je(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function te({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function Ve({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:p,config:{defaultLocale:a}}=o;if(!a)return null;const m=q.default(10),i=(await Promise.all(s.map(l=>m(async()=>{try{const u=te({mode:e,instanceId:l.id,componentId:l.componentId,locale:n});if(e!=="draft"&&l.useCache&&M.has(u))return g.info(`get preload component from cache: ${u}`),M.get(u);const d=I({state:o,componentId:l.componentId});if(!d)return null;const x=await oe({req:t,state:o,componentId:d.id,locale:n,defaultLocale:a,properties:l.properties});if(!x)return null;const O={instanceId:l.id,preload:x};if(e!=="draft"&&l.useCache){let _=ee;l.cacheDuration&&(_=l.cacheDuration),g.info(`set preload component to cache(${_}s): ${u}`),M.set(u,O,{ttl:_*1e3})}return O}catch(u){return g.error("get preload component error",{instanceId:l.id,componentId:l.componentId},{error:u}),null}})))).filter(l=>!!l),f=Object.values(i.reduce((l,u)=>({...l,...u.preload.components}),{}));async function y(){const l=q.default(10),u=await Promise.all(f.map(d=>l(async()=>{const x=r===T.PreloadComponentScriptModule.ESM,O=r===T.PreloadComponentScriptModule.UMD_FN,_=r===T.PreloadComponentScriptModule.CJS,b=x?"":N.componentUMDName({componentId:d.component.id}),$=re(d.component);let A={module:r,script:"",moduleName:b};if($&&d.component.renderer?.type==="react-component"&&x&&d.component.renderer?.script)A.script=d.component.renderer?.script;else if($&&d.component.renderer?.type==="react-component"&&(_||O)&&d.component.renderer?.cjsScript){const U=d.component.renderer.cjsScript;A.script=_?U:X(b,U)}else A=x?{module:r,script:await G(d.script,{componentId:d.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await G(d.script,{componentId:d.component.id,module:r,moduleName:b,tailwind:e!=="draft"}),moduleName:b};return[d.component.id,{component:d.component,script:A}]})));return Object.fromEntries(u)}const c=await y();return{config:{defaultLocale:a,supportedLocales:p},components:c,instances:i.map(l=>({id:l.instanceId,componentId:l.preload.component.id,locales:{[l.preload.locale]:{props:l.preload.props}}}))}}async function oe({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:p}=t,a=I({state:t,componentId:o});if(!a)return null;const m=p.some(f=>f.locale===n)?n:s;if(!m)return null;const i=await ne({req:e,state:t,componentId:o,locale:m,defaultLocale:s,properties:r});return i?{component:a,...i}:null}const We=20;async function ne({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:p}){if(t>We)throw new RangeError("max component depth exceeded");const a=Qe({state:o,componentId:n,properties:p,locale:s});if(!a)return null;const{props:m,component:i}=a,f={locale:s||r,components:{[a.component.id]:{component:a.component,script:a.script}},props:{...m}};try{const y=Ke(i.renderer)?i.renderer.getServerSideProps:void 0,c=await Ze({...a,req:e,getServerSideProps:y});c?.props&&Object.assign(f.props,c.props)}catch(y){g.error("preload data at server side error",{componentId:n,name:a.component.name},{error:y})}return await Promise.all(Object.entries(m).map(async([y,c])=>{if(c?.type===N.RenderNestedComponent){const C=await ne({req:e,depth:t+1,state:o,componentId:c.componentId,locale:s,defaultLocale:r,properties:c.properties});C&&(Object.assign(f.components,C.components),Object.assign(f.props,{[y]:{type:N.RenderNestedComponent,componentId:c.componentId,props:C.props}}))}})),f}function Qe({state:e,componentId:t,locale:o,properties:n}){const s=I({state:e,componentId:t});if(!s)return null;const r=N.mergeComponent({componentId:t,getComponent:p=>I({state:e,componentId:p}),locale:o,defaultLocale:e.config.defaultLocale,properties:n});return r?{component:s,script:r.script,props:{locale:o,...r.props}}:null}function I({state:e,componentId:t}){return e.components[t]?.data??e.resources.components?.[t]?.component}function ze({state:e,name:t}){const o=t.toLowerCase();return Object.values(e.components).find(n=>n.data.name?.toLowerCase()===o)?.data??(e.resources.components&&Object.values(e.resources.components).find(n=>n.component.name?.toLowerCase()===o))?.component}async function Ze({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await Z(t,"getServerSideProps");if(!r)return null;const a=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",m=new Promise(c=>{setTimeout(()=>{c({})},k*1e3)});let i=await Y();const f={componentMountPoints:h.default.components};return await Promise.race([m,i.callFunction({code:`${r}
32
+ `,Y=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function Ke(e){return e?.type==="react-component"}const M=new ge.LRUCache({max:600,ttl:1e3*60*60*24*7}),ee=60*60,k=10;function F(e){g.info("clear preload components cache",{cacheKey:e}),M.delete(e)}function Ge(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function Je(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function te({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function Ve({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:p,config:{defaultLocale:a}}=o;if(!a)return null;const m=q.default(6),i=(await Promise.all(s.map(l=>m(async()=>{try{const u=te({mode:e,instanceId:l.id,componentId:l.componentId,locale:n});if(e!=="draft"&&l.useCache&&M.has(u))return g.info(`get preload component from cache: ${u}`),M.get(u);const d=I({state:o,componentId:l.componentId});if(!d)return null;const x=await oe({req:t,state:o,componentId:d.id,locale:n,defaultLocale:a,properties:l.properties});if(!x)return null;const O={instanceId:l.id,preload:x};if(e!=="draft"&&l.useCache){let _=ee;l.cacheDuration&&(_=l.cacheDuration),g.info(`set preload component to cache(${_}s): ${u}`),M.set(u,O,{ttl:_*1e3})}return O}catch(u){return g.error("get preload component error",{instanceId:l.id,componentId:l.componentId},{error:u}),null}})))).filter(l=>!!l),f=Object.values(i.reduce((l,u)=>({...l,...u.preload.components}),{}));async function y(){const l=q.default(10),u=await Promise.all(f.map(d=>l(async()=>{const x=r===T.PreloadComponentScriptModule.ESM,O=r===T.PreloadComponentScriptModule.UMD_FN,_=r===T.PreloadComponentScriptModule.CJS,b=x?"":N.componentUMDName({componentId:d.component.id}),$=re(d.component);let A={module:r,script:"",moduleName:b};if($&&d.component.renderer?.type==="react-component"&&x&&d.component.renderer?.script)A.script=d.component.renderer?.script;else if($&&d.component.renderer?.type==="react-component"&&(_||O)&&d.component.renderer?.cjsScript){const U=d.component.renderer.cjsScript;A.script=_?U:X(b,U)}else A=x?{module:r,script:await G(d.script,{componentId:d.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await G(d.script,{componentId:d.component.id,module:r,moduleName:b,tailwind:e!=="draft"}),moduleName:b};return[d.component.id,{component:d.component,script:A}]})));return Object.fromEntries(u)}const c=await y();return{config:{defaultLocale:a,supportedLocales:p},components:c,instances:i.map(l=>({id:l.instanceId,componentId:l.preload.component.id,locales:{[l.preload.locale]:{props:l.preload.props}}}))}}async function oe({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:p}=t,a=I({state:t,componentId:o});if(!a)return null;const m=p.some(f=>f.locale===n)?n:s;if(!m)return null;const i=await ne({req:e,state:t,componentId:o,locale:m,defaultLocale:s,properties:r});return i?{component:a,...i}:null}const We=20;async function ne({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:p}){if(t>We)throw new RangeError("max component depth exceeded");const a=Qe({state:o,componentId:n,properties:p,locale:s});if(!a)return null;const{props:m,component:i}=a,f={locale:s||r,components:{[a.component.id]:{component:a.component,script:a.script}},props:{...m}};try{const y=Ke(i.renderer)?i.renderer.getServerSideProps:void 0,c=await Ze({...a,req:e,getServerSideProps:y});c?.props&&Object.assign(f.props,c.props)}catch(y){g.error("preload data at server side error",{componentId:n,name:a.component.name},{error:y})}return await Promise.all(Object.entries(m).map(async([y,c])=>{if(c?.type===N.RenderNestedComponent){const C=await ne({req:e,depth:t+1,state:o,componentId:c.componentId,locale:s,defaultLocale:r,properties:c.properties});C&&(Object.assign(f.components,C.components),Object.assign(f.props,{[y]:{type:N.RenderNestedComponent,componentId:c.componentId,props:C.props}}))}})),f}function Qe({state:e,componentId:t,locale:o,properties:n}){const s=I({state:e,componentId:t});if(!s)return null;const r=N.mergeComponent({componentId:t,getComponent:p=>I({state:e,componentId:p}),locale:o,defaultLocale:e.config.defaultLocale,properties:n});return r?{component:s,script:r.script,props:{locale:o,...r.props}}:null}function I({state:e,componentId:t}){return e.components[t]?.data??e.resources.components?.[t]?.component}function ze({state:e,name:t}){const o=t.toLowerCase();return Object.values(e.components).find(n=>n.data.name?.toLowerCase()===o)?.data??(e.resources.components&&Object.values(e.resources.components).find(n=>n.component.name?.toLowerCase()===o))?.component}async function Ze({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await Z(t,"getServerSideProps");if(!r)return null;const a=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",m=new Promise(c=>{setTimeout(()=>{c({})},k*1e3)});let i=await Y();const f={componentMountPoints:h.default.components};return await Promise.race([m,i.callFunction({code:`${r}
33
33
 
34
34
  export async function getServerSidePropsWrapper(props) {
35
35
  const { location, fetch, props: componentProps } = props;
@@ -0,0 +1 @@
1
+ "use strict";const s=require("crypto");require("ufo");const c={};function u(t,e){const n=JSON.stringify([t,e]);return s.createHash("md5").update(n).digest("hex")}async function a(t,e){return i(t,e)}function i(t,e){let n=t;return e.forEach(r=>{const o=typeof r.selector.pattern=="string"?new RegExp(r.selector.pattern,"gis"):r.selector.pattern;n=n.replace(o,r.value)}),n}async function y(t,e){if(!e||e.length===0)return t;const n=u(t,e);return c[n]??=a(t,e).finally(()=>{setTimeout(()=>{delete c[n]},10*1e3)}),c[n]}function l(t){return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1]||""}function h(t,e){return!e||Object.keys(e).length===0?!0:Object.entries(e).every(([n,r])=>t.includes(`${n}=${r}`))}exports.extractBodyContent=l;exports.injectToHtml=y;exports.matchCacheKey=h;
@@ -0,0 +1 @@
1
+ "use strict";const u=require("./components-CnPdZJ2Z.js"),G=require("@syncedstore/core"),rt=require("yjs"),it=require("@blocklet/pages-kit/utils/data-source"),se=require("@blocklet/pages-kit/utils/route"),ct=require("lodash/cloneDeep"),lt=require("@blocklet/sdk/lib/config"),ee=require("fs"),f=require("path"),Me=require("@blocklet/pages-kit/utils/common"),ut=require("@blocklet/pages-kit/utils/page-model"),dt=require("@blocklet/pages-kit/utils/property"),je=require("@blocklet/sdk/lib/component"),pt=require("@reactivedata/reactive"),C=require("fs/promises"),ne=require("glob"),ft=require("lib0/decoding"),gt=require("lib0/encoding"),mt=require("lodash/debounce"),ht=require("lodash/get"),yt=require("lodash/isEmpty"),St=require("lodash/set"),wt=require("lodash/union"),Ce=require("lru-cache"),It=require("p-limit"),A=require("sequelize"),bt=require("stream/promises"),Et=require("tar"),N=require("ufo"),Pt=require("wait-on"),H=require("y-protocols/awareness"),ge=require("y-protocols/sync"),At=require("yaml"),$e=require("./html-dP5_4zu1.js");require("sqlite3");require("@blocklet/pages-kit/types/state");const $=t=>t&&t.__esModule?t:{default:t};function le(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const a in t)if(a!=="default"){const s=Object.getOwnPropertyDescriptor(t,a);Object.defineProperty(e,a,s.get?s:{enumerable:!0,get:()=>t[a]})}}return e.default=t,Object.freeze(e)}const F=le(rt),W=$(ct),E=$(lt),V=$(ee),Ne=$(f),me=le(ft),k=le(gt),Oe=$(mt),De=$(ht),Te=$(yt),Fe=$(St),jt=$(wt),Re=$(It),Ct=$(Pt),K=le(At),Ot=A.DataTypes.sqlite.DATE.parse;A.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Ot(t,e);const B=new A.Sequelize({dialect:"sqlite",storage:u.databaseUrl,benchmark:process.env.ENABLE_SEQUELIZE_BENCHMARK==="true",retry:{match:[/SQLITE_BUSY/],name:"query",max:10},logging:process.env.ENABLE_SEQUELIZE_LOGGING==="true"?console.log:!1});B.query("PRAGMA journal_mode = WAL;");B.query("PRAGMA synchronous = normal;");B.query("PRAGMA journal_size_limit = 67108864;");B.query("PRAGMA cache_size = 10000;");process.on("SIGINT",async()=>{await B.close(),process.exit(0)});process.on("SIGTERM",async()=>{await B.close(),process.exit(0)});async function Dt(t,e){try{if(t.getDialect()!=="sqlite")return;const[a]=await t.query("SELECT 1");if(!a||a.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(a){if(a.name==="SequelizeConnectionError"||a?.message&&/closed!/.test(a.message))return;console.error("Failed to cleanup SQLite memory",e,a)}}let we=null;we&&clearInterval(we);we=setInterval(async()=>{u.logger.info("Start cleanupSqliteMemory"),await Dt(B,u.databaseUrl),u.logger.info("End cleanupSqliteMemory")},60*1e3*10);const Tt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",Ie="page",be="trigger-reload-project-resource",ve=Tt,Rt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",vt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class ke extends A.Model{}ke.init({id:{type:A.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:A.DataTypes.UUIDV4},projectId:{type:A.DataTypes.UUID,allowNull:!1},componentId:{type:A.DataTypes.STRING,allowNull:!1}},{sequelize:B,tableName:"ProjectComponents",timestamps:!1});const kt="SLUG_INVALID",J=t=>({error:"slugInvalid",code:kt,field:"slug",message:t}),_t={error:"slugRequired",code:"SLUG_REQUIRED",field:"slug",message:()=>"Project slug is required"},Lt={error:"slugAlreadyExists",code:"SLUG_EXISTS",field:"slug",message:t=>`Project slug "${t}" already exists`},Ut=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/\\:]/],qe=t=>{if(!t)return"";if(t==="/")return"/";const e=N.withoutTrailingSlash(t);return N.withLeadingSlash(e)||"/"},Mt=t=>t.did===vt;class U extends A.Model{static async getProjectByIdOrSlug(e,a){return e?U.findOne({where:{[A.Op.or]:[{id:e},{slug:e}],...a?.createdBy?{createdBy:a.createdBy}:{}}}):null}static async validateProjectSlug({slug:e,projectId:a}){if(e==null)return null;if(e==="")return _t;const s=e==="/"?"/":N.withoutTrailingSlash(N.withLeadingSlash(e)),n=qe(s);if(s!=="/"&&s.endsWith("/"))return J(i=>`Project slug "${i}" cannot end with /`);if(/\/{2,}/.test(s))return J(i=>`Project slug "${i}" cannot contain consecutive /`);if(/\s/.test(s))return J(i=>`Project slug "${i}" cannot contain whitespace`);if(Ut.some(i=>i.test(s)))return J(i=>`Project slug "${i}" contains invalid characters`);if(E.default.components?.filter(i=>i.mountPoint&&!Mt(i)).some(i=>qe(i.mountPoint)===n))return J(i=>`Project slug "${i}" conflicts with existing blocklet`);const l=await U.findOne({where:{slug:s}});return l&&l?.id!==a?Lt:null}}U.init({id:{type:A.DataTypes.UUID,defaultValue:A.DataTypes.UUIDV4,primaryKey:!0},name:{type:A.DataTypes.STRING,allowNull:!1},description:A.DataTypes.TEXT,createdAt:A.DataTypes.DATE,updatedAt:A.DataTypes.DATE,createdBy:{type:A.DataTypes.STRING,allowNull:!1},updatedBy:{type:A.DataTypes.STRING,allowNull:!1},slug:A.DataTypes.STRING,icon:A.DataTypes.STRING,pinnedAt:A.DataTypes.DATE,useAllResources:A.DataTypes.BOOLEAN,npmSecret:A.DataTypes.STRING,relatedBlocklets:{type:A.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:A.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}},meta:{type:A.DataTypes.JSON,allowNull:!0}},{sequelize:B,paranoid:!0,indexes:[{name:"projects_slug_unique",unique:!0,fields:["slug"]},{name:"projects_created_by",fields:["createdBy"]},{name:"projects_pinned_updated_meta_not_null",fields:[{name:"pinnedAt",order:"DESC"},{name:"updatedAt",order:"DESC"}],where:{meta:{[A.Op.ne]:null}}}]});U.hasMany(ke,{foreignKey:"projectId",as:"components"});async function q(t){try{return await V.default.promises.access(t,V.default.constants.F_OK),!0}catch{return!1}}function Ge(t,e){return new Promise((a,s)=>{const n=V.default.createReadStream(t),o=V.default.createWriteStream(e);n.on("error",s),o.on("error",s),o.on("finish",a),n.pipe(o)})}async function Ve(t,e){await V.default.promises.mkdir(e,{recursive:!0});const a=await V.default.promises.readdir(t,{withFileTypes:!0});for(const s of a){const n=Ne.default.join(t,s.name),o=Ne.default.join(e,s.name);s.isDirectory()?await Ve(n,o):await Ge(n,o)}}async function $t(t,e){(await V.default.promises.stat(t)).isDirectory()?await Ve(t,e):await Ge(t,e)}function oe(t){t.observeDeep(e=>{e.some(a=>a.changes.keys.has("updatedAt")||a.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function ze(){return ee.mkdtempSync(f.join(E.default.env.dataDir,"tmp-"))}function re(t,e,a=[]){return Array.isArray(t)?t.flatMap((s,n)=>re(s,e,[...a,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([s,n])=>re(n,e,[...a,s])):e(t)?[a]:[]}function L(t){return t.filter(e=>e!=null)}function Nt(t){t.pages&&Object.keys(t.pages).forEach(a=>{const s=G.getYjsValue(t.pages[a]);s&&s instanceof F.Map&&oe(s)});const e=G.getYjsValue(t.pages);e&&e instanceof F.Map&&e.observe(a=>{a.changes.keys.forEach((s,n)=>{if(s.action==="add"){const o=G.getYjsValue(t.pages[n]);o&&o instanceof F.Map&&oe(o)}})})}function Ft(t){t.routes&&Object.keys(t.routes).forEach(a=>{const s=G.getYjsValue(t.routes?.[a]);s&&s instanceof F.Map&&oe(s)});const e=G.getYjsValue(t.routes);e&&e instanceof F.Map&&e.observe(a=>{a.changes.keys.forEach((s,n)=>{if(s.action==="add"){const o=G.getYjsValue(t.routes?.[n]);o&&o instanceof F.Map&&oe(o)}})})}function qt(t,e){for(const a of e||Object.keys(t.routes||{})){let s=a,n=[];if(a.includes("-")){const[o,...l]=a.split("-");s=o,n=l||[]}if(t.routes?.[s]!==void 0){t.routes[s].publishedAt=new Date().toISOString();const o=t.routes[s];if(!o||!o.params||o.params.length===0)continue;if(a.includes("-")&&n.length>0){const l=se.getRouteMetaDataByOptionIds(n,o);l&&(l.publishedAt=new Date().toISOString())}if(!e){const l=se.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const i of l)i.routeMetaData??={},i.routeMetaData.publishedAt=new Date().toISOString()}}}}function he({page:t,route:e,state:a,routeId:s,routePathInfo:n}){u.logger.info(`Executing datasource data assembly, routeId: ${s}, routePathInfo: ${JSON.stringify(n)}`);const o={...W.default(t),id:s,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 l of a.supportedLocales){if(e.dataSource){let i=e.id;n&&(i=n.paramOptionIds.join("-"));const c=e.dataSource.pathDataMappings?.[i]?.dataCache?.[l.locale]??e.dataSource.pathDataMappings?.[i]?.dataCache?.[a.config.defaultLocale||"en"];if(!c)continue;it.setPageDataSource(o,a,l.locale,c)}n&&n.routeMetaData&&(n.routeMetaData.publishedAt=new Date().toISOString())}return o}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const Bt=60*60*1e3,X=new Ce.LRUCache({max:300,ttl:Bt,ttlResolution:10*1e3,allowStale:!0});function xt(t,e=[]){let a=0;const s=Array.from(X.keys()),n=t.map(o=>N.withoutTrailingSlash(o));for(const o of s)for(const l of n){if($e.matchCacheKey(o,{currentPath:l})){X.delete(o),a++,u.logger.info(`[Cache CLEAR] key: ${o}`);break}for(const i of e)if($e.matchCacheKey(o,{currentPath:`/${i}${l}`})){X.delete(o),a++,u.logger.info(`[Cache CLEAR] key: ${o}`);break}}return u.logger.info(`[Cache CLEAR] cleared ${a} entries for paths:`,n),a}function Gt(){const t=X.size;return X.clear(),u.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}E.default.events.on(E.default.Events.envUpdate,Gt);const{uploadToMediaKit:Vt}=require("@blocklet/uploader-server"),_e=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,Q=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,Be=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,zt=1e4,Kt=3e4,te=0,ye=1,Yt=0,Ht=1,Ee=E.default,z=f.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Jt=["production","draft"],Wt=["production"];function ie(t){return t?.replace(/\//g,"|")||""}function Ke(){const t=Ee.env.languages?.map(a=>({locale:a.code,name:a.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class j extends F.Doc{constructor(e){super(),this.options=e,ee.existsSync(this.draftYjsFilePath)&&F.applyUpdate(this,ee.readFileSync(this.draftYjsFilePath)),this.syncedStore=pt.reactive(G.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new H.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 Ce.LRUCache({max:300,ttl:1e3*60*60*24});static periodicCheckTimer;static async safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const a=f.join(z,e),s=f.join(z,`@del-${e}`);await C.rename(a,s)}catch(a){u.logger.error("Failed to safe delete project state dir:",a)}}static async getProjectIds(){return(await U.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return ne.globSync("*/",{cwd:z,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>j.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let a=j.sharedInstances[e];return a||(a=new j({path:f.join(z,e)}),j.sharedInstances[e]=a,a)}static async getProductionState(e){const a=await U.findByPk(e,{attributes:["productionState"]});if(Te.default(a?.productionState)){const s=f.join(z,e,"production"),n=await Le(s,{includeResources:!0})??Ke();if(!n?.config?.defaultLocale){n.config??={};const o=Ee.env.languages?.map(l=>({locale:l.code,name:l.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return a?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((a,s)=>this.closeConn(s)),this.awareness.destroy();const e=f.basename(this.options.path);delete j.sharedInstances[e],super.destroy()}initObserver(){Nt(this.syncedStore),Ft(this.syncedStore)}get draftYjsFilePath(){return f.join(this.options.path,"draft.yjs")}static async getStateByProjectId({projectId:e,mode:a,clone:s=!0}){if(a==="draft"){const n=j.shared(e);return s?W.default(n.syncedStore):n.syncedStore}return j.getProductionState(e)}async getState(e){if(e==="draft")return W.default(this.syncedStore);const a=f.basename(this.options.path);return j.getProductionState(a)}async setState(e,a){const s=await We(a,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(await C.mkdir(f.dirname(n),{recursive:!0}),await C.rm(n,{force:!0,recursive:!0}),await C.rename(s,n),e==="production"){const o=f.basename(this.options.path);j.pageUrlMapCache.delete(o);const l=W.default(a);await U.update({productionState:l},{where:{id:o}})}}getPublishDir(e){return f.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:a,removed:s},n)=>{const o=e.concat(a,s);if(n!==null){const c=this.conns.get(n);c&&(e.forEach(b=>{c.add(b)}),s.forEach(b=>{c.delete(b)}))}const l=k.createEncoder();k.writeVarUint(l,ye),k.writeVarUint8Array(l,H.encodeAwarenessUpdate(this.awareness,o));const i=k.toUint8Array(l);this.conns.forEach((c,b)=>this.send(b,i))};updateHandler=e=>{const a=k.createEncoder();k.writeVarUint(a,te),ge.writeUpdate(a,e);const s=k.toUint8Array(a);this.conns.forEach((n,o)=>this.send(o,s))};ensureDataStructure=()=>{this.transact(()=>{const{supportedLocales:e,pages:a,pageIds:s,config:n,routes:o,routeIds:l}=this.syncedStore;{const i=new Set(Object.keys(a));let c=0;for(;c<s.length;){const b=s[c];i.has(b)?(i.delete(b),c++):s.splice(c,1)}}{const i=new Set(Object.keys(o));let c=0;for(;c<l.length;){const b=l[c];i.has(b)?(i.delete(b),c++):l.splice(c,1)}}e.splice(0,e.length),e.push(...Ee.env.languages.map(i=>({locale:i.code,name:i.name}))),n.defaultLocale=e[0]?.locale;{let i=0;const c=new Set;for(;i<e.length;){const{locale:b}=e[i];c.has(b)?e.splice(i,1):(i++,c.add(b))}}})};send=(e,a)=>{e.readyState!==Yt&&e.readyState!==Ht&&this.closeConn(e);try{e.send(a,s=>{s&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const a=this.conns.get(e);this.conns.delete(e),a&&H.removeAwarenessStates(this.awareness,Array.from(a),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=f.basename(this.options.path);this.releaseTimer=setTimeout(()=>{u.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},j.RELEASE_DELAY),u.logger.info(`[SiteState] scheduled release for project ${e} in ${j.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=f.basename(this.options.path);u.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Oe.default(async()=>{await C.mkdir(f.dirname(this.draftYjsFilePath),{recursive:!0}),await C.writeFile(this.draftYjsFilePath,F.encodeStateAsUpdate(this))},zt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:a})=>{const s=f.basename(this.options.path);await nt(s);const n=await this.getState("draft"),o=await this.getState("production");await Ae(n,o,{routes:a,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),o.config.publishedAt=new Date().getTime(),qt(this.syncedStore,a),await this.setState(e,o),await this.clearPageCacheForRoutes(a,o)};mergeState=async(e,a)=>{const s=JSON.parse(JSON.stringify(a));e.config.fontFamily??={};const n=s.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((l,i)=>{this.transact(async()=>{try{const c=await Ae(e,a);l(c)}catch(c){i(c)}})})};clearPageCacheForRoutes=async(e,a)=>{const s=f.basename(this.options.path),o=(await U.findByPk(s))?.slug||s;let l=e;(!l||l.length===0)&&(l=a.pageIds??[]),u.logger.info(`[SiteState] clearing page cache for project ${s}, routes:`,l||[]);const i=a.supportedLocales.map(O=>O.locale),c=[],b=l.filter(O=>a.pageIds?.includes(O));for(const O of b){const w=a.pages[O].slug;o&&o!==s&&(o==="/"?c.push(w):c.push(`/${o}${w}`)),c.push(`/${s}${w}`)}if(c.length>0)try{const O=xt(c,i);u.logger.info(`[SiteState] cleared ${O} page cache entries for project ${s}, routes:`,l)}catch{}j.pageUrlMapCache.delete(s)};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 a=!0;const s=setInterval(()=>{if(!a)this.conns.has(e)&&this.closeConn(e),clearInterval(s);else if(this.conns.has(e)){a=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(s)}}},Kt);e.on("close",()=>{this.closeConn(e),clearInterval(s)}),e.on("pong",()=>{a=!0});{const n=k.createEncoder();k.writeVarUint(n,te),ge.writeSyncStep1(n,this),this.send(e,k.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const l=k.createEncoder();k.writeVarUint(l,ye),k.writeVarUint8Array(l,H.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,k.toUint8Array(l))}}};messageListener=(e,a)=>{try{const s=k.createEncoder(),n=me.createDecoder(a),o=me.readVarUint(n);switch(o){case te:k.writeVarUint(s,te),ge.readSyncMessage(n,s,this,null),k.length(s)>1&&(this.ensureDataStructure(),this.send(e,k.toUint8Array(s)));break;case ye:{H.applyAwarenessUpdate(this.awareness,me.readVarUint8Array(n),e);break}default:u.logger.warn(`Unsupported messageType ${o}`)}}catch(s){u.logger.error(s)}this.save()};static async pageUrlMap(e,a){u.logger.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${a}`);let s=[];a?s=[a]:s=await this.getProjectIds();let n={};if(e==="production"&&s?.length){const o=new Map(s?.map(l=>[l,!0])||[]);for(const l of s){const i=j.pageUrlMapCache.get(l);i&&(Object.assign(n,i),o.delete(l))}s=Array.from(o.keys())}if(s?.length){u.logger.info("[SiteState] find project infos from database, projectIds: ",s);const o=30,l=Re.default(5);for(let i=0;i<s.length;i+=o){const c=s.slice(i,i+o);u.logger.info(`[SiteState] processing project batch ${i/o+1}, ids: `,c);const b=await U.findAll({where:{id:{[A.Op.in]:c}},attributes:{exclude:["relatedBlocklets"]}});await Promise.all(b?.map(O=>l(async()=>{const R=O.id,w=O.slug||R,g={},d=e==="production"&&O?.productionState?O.productionState:await j.getStateByProjectId({projectId:O.id,mode:e,clone:!1}),I=jt.default(E.default.env.languages?.map(P=>P.code)||[],d.supportedLocales?.map(P=>P.locale)||[]),D=(P,y)=>{w&&(g[N.joinURL("/",w,P)]={...y,shouldRedirect:!0,mainPage:!0}),g[N.joinURL("/",R,P)]={...y,shouldRedirect:!0,mainPage:!0};for(const v of I){const h={...y,locale:v};g[N.joinURL("/",v,R,P)]=h,w&&(g[N.joinURL("/",v,w,P)]=h)}};if(e==="draft")for(const P of d.routeIds||[]){const y=d?.routes?.[P];if(!y)continue;if(y.params&&y.params.length>0){const S=se.generateParamCombinations({basePath:y.path,params:y.params,routeId:y.id,paramsOptions:y.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const r of S){const p=r.path,m={projectId:R,projectSlug:w,pageSlug:p,pageId:y.displayTemplateId||"",routeId:P,defaultLocale:I?.[0],locales:I,publishedAt:d.config.publishedAt,isPublic:y.isPublic&&r?.routeMetaData?.isPublic};D(p,m)}}const v=y.path,h={projectId:R,projectSlug:w,pageSlug:v,pageId:y.displayTemplateId||"",routeId:P,defaultLocale:I?.[0],locales:I,publishedAt:d.config.publishedAt,isPublic:y.isPublic};D(v,h)}for(const P of d.pageIds||[]){const y=d.pages[P];if(!y||e==="production"&&!y.isPublic)continue;const v=y.slug,h=O.slug||R,S={projectId:R,projectSlug:h,pageSlug:v,pageId:P,defaultLocale:I?.[0],locales:I,publishedAt:d.config.publishedAt,isPublic:y.isPublic,templateConfig:y.templateConfig};D(v,S)}e==="production"&&j.pageUrlMapCache.set(R,g),n={...n,...g}})))}}return u.logger.info("[SiteState] success get pageUrlMap"),n}getDocumentSize(){return F.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[a,s]of Object.entries(j.sharedInstances)){const n=s.getDocumentSize();e.push({projectId:a,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:s.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),u.logger.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,u.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(j.sharedInstances).length,a=[],s=[];for(const[n,o]of Object.entries(j.sharedInstances))o.conns.size===0?a.push({projectId:n,instance:o}):s.push({projectId:n,connections:o.conns.size});if(u.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${s.length}, without connections: ${a.length}`),a.length>0){u.logger.info(`[SiteState] releasing ${a.length} instances without connections:`,a.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:l}of a)try{u.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),l.destroy(),n++}catch(i){u.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,i)}u.logger.info(`[SiteState] periodic check completed: ${n}/${a.length} instances released successfully`)}else e>0?u.logger.debug("[SiteState] periodic check: all instances have active connections"):u.logger.debug("[SiteState] periodic check: no instances exist")}}async function Xt(t,e,a){if(!t||!await q(t)||!(await C.lstat(t)).isFile())return null;let n=a[t];return n||(n=(async()=>{try{return(await Vt({filePath:t,fileName:e}))?.data?.filename}catch(o){return u.logger.error(`Failed to upload asset ${t}:`,o),null}})(),a[t]=n),n}const Ye=async(t,e)=>{const a=f.basename(t),s=await je.call({name:ve,path:N.joinURL("/uploads",a),responseType:"stream",method:"GET"});if(s.status>=200&&s.status<400){const n=ee.createWriteStream(e);await bt.pipeline(s.data,n)}else throw new Error(`download asset failed ${s.status}`)},He=async(t,e)=>{await Promise.all(t.map(async a=>{try{await Ye(a,f.join(e,f.basename(a)))}catch(s){u.logger.error(`Failed to export assets: ${a}, ${s}`)}}))};function Je(t){return _e.test(t)?[t]:Q.test(t)?(Be.lastIndex=0,Array.from(t.matchAll(Be)).map(a=>a[1]).filter(a=>!!a)):[]}async function ae(t,e,a){const{getFilename:s,exportAssets:n}=a,o=f.join(e,s(t));if(await C.mkdir(f.dirname(o),{recursive:!0}),await C.writeFile(o,K.stringify(t)),n){const i=re(t,c=>typeof c=="string"&&(_e.test(c)||Q.test(c))).map(c=>{const b=De.default(t,c);return Je(b)}).flat().filter(Boolean);await He(i,f.dirname(o))}}const Pe=new Ce.LRUCache({max:100,ttl:1*60*1e3});async function xe(t,e,a){const s=re(t,i=>typeof i=="string"&&(_e.test(i)||Q.test(i))),n=Re.default(2),o=s.map(i=>n(async()=>{try{const c=De.default(t,i),b=Je(c);for(const O of b){const R=f.basename(O),w=a.getFilePath(O,i),g=w?`${w}:${R}`:R,d=Pe.get(g);if(d){Q.test(c)||Fe.default(t,i,d);return}const I=await Xt(w,R,e);I&&(Q.test(c)||Fe.default(t,i,I),Pe.set(g,I))}}catch(c){u.logger.error(`Failed to process upload for path ${i.join(".")}:`,c.message||c.reason)}})),l=await Promise.allSettled(o);a.onFinish?.(l)}async function We(t,{exportAssets:e,pageIds:a="all",componentIds:s="all",rawConfig:n,includeResources:o=!1,routeIds:l="all"}={}){const i=a==="all"?t.pageIds:a,c=dt.getComponentDependencies({state:t,pageIds:i,componentIds:s==="all"?Object.keys(t.components):s});Object.entries(t.components).forEach(([r,p])=>{p.data?.renderer?.type==="component-template"&&c.push(r)});const b=l==="all"?t.routeIds:l,O=r=>({id:r.id,name:r.name,isTemplateSection:r.isTemplateSection??!1,templateDescription:r.templateDescription,component:r.component,config:r.config,visibility:r.visibility,sections:r?.sectionIds?L(r?.sectionIds?.map(p=>{const m=r.sections?.[p];return m&&O(m)})):void 0}),R=(r,p)=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,isPublic:r.isPublic??!0,templateConfig:r.templateConfig,meta:r.locales?.[p]??{},sections:L(r.sectionIds.map(m=>{const T=r.sections[m];return T&&O(T)})),dataSource:Object.fromEntries(Object.entries(r.dataSource||{}).map(([m,T])=>[m,T?.[p]??{}]))}),w=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}),g=L(b.map(r=>{const p=t.routes[r];return p&&w(p)})),d=L(t.supportedLocales.map(r=>r.locale).flatMap(r=>i.map(p=>{const m=t.pages[p];return m&&{locale:r,slug:m.slug,page:R(m,r)}}))),I=ze(),D=f.join(I,"pages");await C.mkdir(D,{recursive:!0});const P=f.join(I,"components");await C.mkdir(P,{recursive:!0});const y=f.join(I,"routes");await C.mkdir(y,{recursive:!0});for(const{locale:r,slug:p,page:m}of d)await ae(m,D,{getFilename:()=>`${ie(p)||"index"}.${r}.yml`,exportAssets:e});for(const r of g)await ae(r,y,{getFilename:()=>`${ie(r.path)||"index"}.yml`,exportAssets:e});for(const r of c){const p=t.components[r]?.data;p&&await ae(p,P,{getFilename:m=>`${m.name||"unnamed"}.${m.id}.yml`,exportAssets:e})}const v=f.join(I,".blocklet/pages/pages.config.yml");await C.mkdir(f.dirname(v),{recursive:!0});const h={pages:L(i.map(r=>{const p=t.pages[r];return p&&{id:r,slug:p.slug}})),routes:L(b.map(r=>{const p=t.routes[r];return p&&{id:r,path:p.path}})),components:L(c.map(r=>{const p=t.components[r]?.data;return p&&{id:r,name:p.name}})),...o?{resources:{components:L(Object.keys(t.resources?.components||{}).filter(r=>c.includes(r)).map(r=>({id:r,name:t.resources?.components?.[r]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};await C.writeFile(v,K.stringify(h));const S=f.join(I,"config.source.json");if(n&&await C.writeFile(S,JSON.stringify(n)),o){const r=f.join(I,"resources"),p=f.join(r,"components");await C.mkdir(p,{recursive:!0});for(const M of Object.keys(t?.resources?.components??{}).filter(_=>c.includes(_))){const _=t.resources?.components?.[M]?.component;_&&await ae(_,p,{getFilename:x=>`${x.name||"unnamed"}.${x.id}.yml`,exportAssets:e})}const m=f.join(I,"chunks");await C.mkdir(m,{recursive:!0});const T=await Qt();for(const M of Object.keys(t?.resources?.components??{}).filter(_=>c.includes(_))){const _=t.resources?.components?.[M]?.component;if(_&&_.renderer?.type==="react-component"){const x=_.renderer?.chunks??[];if(x?.length>0)for(const Y of x){const Ue=f.join(m,Y),fe=T?.[Y];try{fe&&await q(fe)&&!await q(Ue)&&await C.copyFile(fe,Ue)}catch(ot){u.logger.error(`copy chunk ${Y} error`,ot.message)}}}}}return I}async function Le(t,{importAssets:e,includeResources:a}={}){if(!await q(t))return null;let s,n=!1;try{(await C.lstat(t)).isDirectory()?s=t:/\.(tgz|gz|tar)$/.test(t)&&(n=!0,s=ze(),await Et.x({file:t,C:s}));const i=(await ne.glob("**/.blocklet/pages/pages.config.yml",{cwd:s,absolute:!0}))[0],c=i&&f.join(f.dirname(i),"../../pages"),b=i&&f.join(f.dirname(i),"../../components"),O=i&&f.join(f.dirname(i),"../../routes");if(!i)return null;const R=await C.readFile(i,"utf-8"),w=K.parse(R),g=async(h,S,r)=>{let p=f.join(h,`${S}${r?`.${r}`:""}.yml`);if(!await q(p)&&(p=f.join(h,S,`index${r?`.${r}`:""}.yml`),!await q(p))||!(await C.lstat(p)).isFile())return null;const T=await C.readFile(p,"utf-8");return K.parse(T)},d=async(h,S)=>{try{const p=(await ne.glob(`*.${S}.yml`,{cwd:h,absolute:!0}))[0];if(!p)return null;const m=await C.readFile(p,"utf-8");return K.parse(m)}catch(r){u.logger.error("parse component error",r)}return null},I=async(h,S)=>{let r=f.join(h,`${S}.yml`);if(!await q(r)&&(r=f.join(h,S,"index.yml"),!await q(r))||!(await C.lstat(r)).isFile())return null;const m=await C.readFile(r,"utf-8");return K.parse(m)},D=L(await Promise.all(w.pages.map(async({slug:h})=>{const S=L(await Promise.all(w.supportedLocales.map(async({locale:m})=>{const T=c?await g(c,ie(h),m):void 0;if(T)return{locale:m,page:T};const M=c?await g(c,h,m):void 0;return M&&{locale:m,page:M}}))),r=S[0]?.page;if(!r)return null;const p=r.sections.map(ut.unzipSection);return{id:r.id||Me.nextId(),createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,isPublic:r.isPublic??!0,templateConfig:r.templateConfig,slug:h,sections:Object.fromEntries(p.map(m=>[m.id,m])),sectionIds:p.map(m=>m.id),locales:Object.fromEntries(S.map(({locale:m,page:T})=>[m,T.meta])),dataSource:r.dataSource?Object.fromEntries([...new Set(S.flatMap(({page:m})=>Object.keys(m.dataSource??{})))].map(m=>[m,Object.fromEntries(S.map(({locale:T,page:M})=>{const _=M.dataSource?.[m];return[T,_||{}]}))])):Object.fromEntries([...new Set(S.flatMap(({page:m})=>m.sections.map(T=>T.id)))].map(m=>[m,Object.fromEntries(S.map(({locale:T,page:M})=>{const _=M.dataSource?.[m];if(_)return[T,_];const x=M.sections.find(Y=>Y.id===m);return[T,x?.properties||{}]}))]))}}))),P=L(await Promise.all((w?.routes||[]).map(async({path:h})=>{const S=O?await I(O,ie(h)):void 0;return{...S,id:S?.id||Me.nextId(),createdAt:S?.createdAt??new Date().toISOString(),updatedAt:S?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:S?.path??`/${S?.id}`,params:S?.params,handler:S?.handler??"Pages Kit",isPublic:S?.isPublic??!0,enabledGenerate:S?.enabledGenerate??!1,displayTemplateId:S?.displayTemplateId??void 0,dataSource:S?.dataSource??{}}}))),y=b?L(await Promise.all((w.components||[]).map(async({id:h})=>d(b,h)))):[];if(e){const h=(...S)=>{u.logger.info(`[${n?f.basename(t):f.basename(f.join(t,"../../../../"))}] importAssets:`,...S)};try{h("wait image-bin api ready"),await Ct.default({resources:[`${je.getComponentWebEndpoint(u.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:p=>p>=200&&p<=500}),h("image-bin api is ready");const S={},r={};h("start to upload assets"),await Promise.allSettled([xe(y,S,{getFilePath:p=>b&&f.join(b,p),onFinish:p=>{h(`upload ${p.length} component assets`)}}),xe(D,r,{getFilePath:(p,m)=>{const T=De.default(D,m.slice(0,1));return c&&f.join(c,f.dirname(T.slug),p)},onFinish:p=>{h(`upload ${p.length} page assets`)}})]),h("upload assets done"),Pe.clear(),global.gc&&global.gc()}catch(S){h("Error during asset import:",S)}}const v={};if(a){const h=i&&f.join(f.dirname(i),"../../resources/components"),S=L(await Promise.all((w.resources?.components||[]).map(async({id:r})=>d(h,r))));S.length>0&&(v.components=Object.fromEntries(S.map((r,p)=>[r.id,{index:p,component:r}])))}return{supportedLocales:w.supportedLocales,pageIds:D.map(h=>h.id),components:Object.fromEntries(y.map((h,S)=>[h.id,{index:S,data:h}])),pages:Object.fromEntries(D.map(h=>[h.id,h])),config:w.config||{},resources:v,routeIds:P.map(h=>h.id),routes:Object.fromEntries(P.map(h=>[h.id,h])),dataSourceIds:[],dataSources:{}}}finally{n&&s&&await C.rm(s,{force:!0,recursive:!0})}}async function Ae(t,e,{routes:a,mergeMode:s="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&u.clearPreloadComponentsCacheByMode(o)}catch(w){u.logger.error("clear preload page cache error",{error:w})}const{pages:l,pageIds:i,routeIds:c,routes:b,supportedLocales:O}=t;if(o==="production"){let w=a??[],g=null;for(const d of c??[]){const I=b?.[d];if(I?.params&&I?.params.length>0&&I?.paramsOptions&&I?.paramsOptions.length>0){const D=se.generateParamCombinations({basePath:I.path,params:I.params,routeId:I.id,paramsOptions:I.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),P=Object.fromEntries(D.map(y=>[`${d}-${y.paramOptionIds.join("-")}`,y]));g={...g||{},...P},a||(w=[...w,...D.map(y=>`${d}-${y.paramOptionIds.join("-")}`)])}else a||w.push(d)}u.logger.info("routeIds to be published: ",w);for(const d of w){let I=d;if(I.includes("-")){const[y]=I.split("-");I=y}const D=b?.[I];if(!D){const y=e.pageIds.indexOf(I);y!==-1&&n&&(e.pageIds.splice(y,1),delete e.pages[I]);for(const v of e.pageIds)v.includes(`${I}-`)&&(e.pageIds.splice(e.pageIds.indexOf(v),1),delete e.pages[v]);u.logger.info("delete main route page",I);continue}if(d.includes("-")&&!g?.[d]){const y=e.pageIds.indexOf(d);y!==-1&&n&&(e.pageIds.splice(y,1),delete e.pages[d]),u.logger.info("delete page",d);continue}if(!D.displayTemplateId){u.logger.info("no display template",d);continue}const P=l[D.displayTemplateId];if(!P){u.logger.info("no template page",d);continue}if(e.pageIds.includes(d)){if(u.logger.info("has need update page",d),s==="replace")e.pages[d]=he({page:P,route:D,state:t,routeId:d,routePathInfo:g?.[d]}),u.logger.info("replace page",d);else if(s==="byUpdateTime"){const y=e.pages[D.id];(!y||D.updatedAt&&D.updatedAt>y.updatedAt)&&(e.pages[d]=he({page:P,route:D,state:t,routeId:d,routePathInfo:g?.[d]}),u.logger.info("replace page by update time",d))}}else e.pageIds.push(d),e.pages[d]=he({page:P,route:D,state:t,routeId:d,routePathInfo:g?.[d]}),u.logger.info("add page",d)}if(n&&!a)for(const d of e.pageIds)w?.includes(d)||(delete e.pages[d],u.logger.info("delete page",d)),e.pageIds=[...e.pageIds].filter(I=>w?.includes(I))}else{for(const w of i){const g=l[w];if(g)if(e.pageIds.includes(g.id)){if(s==="replace")e.pages[g.id]=g;else if(s==="byUpdateTime"){const d=e.pages[g.id];(!d||g.updatedAt&&g.updatedAt>d.updatedAt)&&(e.pages[g.id]=g)}}else e.pageIds.push(g.id),e.pages[g.id]=g}for(const w of c){const g=b[w];if(g)if(e.routeIds.includes(g.id)){if(s==="replace")e.routes[g.id]=g;else if(s==="byUpdateTime"){const d=e.routes[g.id];(!d||g.updatedAt&&g.updatedAt>d.updatedAt)&&(e.routes[g.id]=g)}}else e.routeIds.push(g.id),e.routes[g.id]=g}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...W.default(O)),n)for(const w of Object.keys(e.components))delete e.components[w];let R=JSON.parse(JSON.stringify(t.components));R=Object.fromEntries(await Promise.all(Object.entries(R).map(async([w,g])=>{const d=await Xe(g?.data);return[w,{...g,data:d}]}))),Object.assign(e.components,R),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Te.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Xe=u.memoizeWithFs(async t=>{if(!Te.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:a}=t?.renderer||{};if(a||e&&e.includes("PROPERTIES_SCHEMA"))try{const s=await u.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,a);s&&s.length>0&&t&&(t.properties={},s.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(s){u.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:s})}}return t},{subdir:"getPropertiesFromCode"});let ce,Z,ue,de;const Qe=()=>je.getResources({types:[{did:ve,type:Ie},{did:Rt,type:Ie}]}),Qt=async()=>{const t=Qe(),e={};for(const a of t){const n=(await ne.glob("**/.blocklet/pages/pages.config.yml",{cwd:a.path,absolute:!0}))[0],o=n&&f.join(f.dirname(n),"../../chunks");if(o&&await q(o)){const l=await C.readdir(o);for(const i of l)e[i]=f.join(o,i)}}return e};function Ze(){return ce=(async()=>{const t=Qe();Z=(await Promise.all(t.map(async a=>{const s=a.path?await Le(a.path,{importAssets:!1}):void 0;return s?{blockletId:a.did,state:s,blockletTitle:a.title}:void 0}))).filter(a=>!!a),ue=Z.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.pages).map(n=>n?[n?.id,{page:n,blockletId:s.blockletId}]:[]))),{});const e=Z.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.components).map(n=>[n.data.id,{blockletId:s.blockletId,component:n.data}]))),{});de=Object.fromEntries(await Promise.all(Object.entries(e).map(async([a,s])=>{const n=await Xe(s.component);return[a,{...s,component:n}]})))})(),ce}function et(t){const e=Oe.default(async()=>{await Ze().catch(a=>{u.logger.error("load resource states error",{error:a})}),await t?.({states:Z,pages:ue,components:de})},3e3,{leading:!1,trailing:!0});return e(),E.default.events.on(E.default.Events.componentAdded,e),E.default.events.on(E.default.Events.componentRemoved,e),E.default.events.on(E.default.Events.componentStarted,e),E.default.events.on(E.default.Events.componentStopped,e),E.default.events.on(E.default.Events.componentUpdated,e),E.default.events.on(be,e),()=>{E.default.events.off(E.default.Events.componentAdded,e),E.default.events.off(E.default.Events.componentRemoved,e),E.default.events.off(E.default.Events.componentStarted,e),E.default.events.off(E.default.Events.componentStopped,e),E.default.events.off(E.default.Events.componentUpdated,e),E.default.events.off(be,e)}}const tt=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),at=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),pe=globalThis;pe[tt]?.();pe[tt]=et(async({pages:t,components:e})=>{const a=await j.getProjectIds();u.logger.info(`start update resource states projects(${a.length})`,a);const s=Re.default(10);await Promise.race([new Promise(n=>{setTimeout(()=>{n({})},30*1e3)}),Promise.all(a.map(n=>s(async()=>{st({projectId:n,pages:t,components:e})})))]).catch(n=>{u.logger.error("update resource states failed:",n)})});pe[at]?.();pe[at]=()=>{const t=()=>{j.pageUrlMapCache.clear(),u.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return E.default.events.on(E.default.Events.envUpdate,t),()=>{E.default.events.off(E.default.Events.envUpdate,t)}};j.startPeriodicCheck();process.on("beforeExit",()=>{j.stopPeriodicCheck()});process.on("SIGINT",()=>{j.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{j.stopPeriodicCheck(),process.exit(0)});async function st({projectId:t,pages:e,components:a}){const s=j.sharedInstances[t];if(!s){u.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(s.syncedStore.resources.pages=e,(await U.findByPk(t))?.useAllResources)s.syncedStore.resources.components=a;else{const l=(await ke.findAll({where:{projectId:t}})).map(c=>c.componentId),i=Object.fromEntries(Object.entries(a||{}).filter(([c])=>l.includes(c)));s.syncedStore.resources.components=i}u.logger.info(`update [${t}] resource states:`,{pages:Object.keys(s.syncedStore.resources.pages||{}).length,components:Object.keys(s.syncedStore.resources.components||{}).length})}const Se=new Map;async function nt(t){if(!Se.has(t)){const e=Oe.default(async a=>st({projectId:a,pages:ue,components:de}),3e3);Se.set(t,e)}return Se.get(t)(t)}async function Zt(){u.logger.info("trigger reload all project resource"),E.default.events.emit(be)}async function ea({ensureLoaded:t=!0}={}){return t&&(ce??=Ze(),await ce),{states:Z,pages:ue,components:de}}exports.COMPONENT_DID=ve;exports.PUBLISH_MODES=Wt;exports.Project=U;exports.RESOURCE_TYPE=Ie;exports.SITE_STATE_PATH=z;exports.STATE_MODES=Jt;exports.SiteState=j;exports.copyRecursive=$t;exports.downloadAsset=Ye;exports.downloadAssets=He;exports.fromPackage=Le;exports.getDefaultState=Ke;exports.getResourceStates=ea;exports.initPackResourceStates=et;exports.mergeState=Ae;exports.toPackage=We;exports.triggerReloadAllProjectResource=Zt;exports.updateResourceStatesByProjectId=nt;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-BmFOXvb0.js");require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/builtin");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/sdk/lib/config");require("lodash/isEmpty");require("lru-cache");require("node-fetch");require("p-limit");require("ufo");exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=e.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=e.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS;exports.clearPreloadComponentsCache=e.clearPreloadComponentsCache;exports.clearPreloadComponentsCacheByInstanceId=e.clearPreloadComponentsCacheByInstanceId;exports.clearPreloadComponentsCacheByMode=e.clearPreloadComponentsCacheByMode;exports.getComponentFromState=e.getComponentFromState;exports.getComponentFromStateByName=e.getComponentFromStateByName;exports.getExportSchemaValueFromCode=e.getExportSchemaValueFromCode;exports.getPreloadComponent=e.getPreloadComponent;exports.getPreloadComponents=e.getPreloadComponents;exports.getPreloadComponentsCacheKey=e.getPreloadComponentsCacheKey;exports.skipTranspileComponent=e.skipTranspileComponent;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-CnPdZJ2Z.js");require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/builtin");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/sdk/lib/config");require("lodash/isEmpty");require("lru-cache");require("node-fetch");require("p-limit");require("ufo");exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=e.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=e.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS;exports.clearPreloadComponentsCache=e.clearPreloadComponentsCache;exports.clearPreloadComponentsCacheByInstanceId=e.clearPreloadComponentsCacheByInstanceId;exports.clearPreloadComponentsCacheByMode=e.clearPreloadComponentsCacheByMode;exports.getComponentFromState=e.getComponentFromState;exports.getComponentFromStateByName=e.getComponentFromStateByName;exports.getExportSchemaValueFromCode=e.getExportSchemaValueFromCode;exports.getPreloadComponent=e.getPreloadComponent;exports.getPreloadComponents=e.getPreloadComponents;exports.getPreloadComponentsCacheKey=e.getPreloadComponentsCacheKey;exports.skipTranspileComponent=e.skipTranspileComponent;
@@ -1,4 +1,4 @@
1
- "use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-BmFOXvb0.js"),T=require("./chunks/html-xfTPTsl5.js"),W=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),A=require("@blocklet/pages-kit/utils/preload"),F=require("@blocklet/sdk/lib/component"),O=require("express"),P=require("fs"),J=require("lodash/get"),z=require("mustache"),j=require("ufo"),y=n=>n&&n.__esModule?n:{default:n},G=y(B),s=y(E),Y=y(C),Q=y(J),V=y(z),X=(n={})=>{const e={data:new Map,timers:new Map,set:(t,d,u=n.ttl||36e5)=>{n.max&&e.data.size>=n.max&&e.delete(e.data.keys().next().value),e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.set(t,setTimeout(()=>e.delete(t),u)),e.data.set(t,d)},get:t=>e.data.get(t),has:t=>e.data.has(t),delete:t=>(e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.delete(t),e.data.delete(t)),clear:()=>{e.data.clear();for(const t of e.timers.values())clearTimeout(t);e.timers.clear()}};return e},q=X({max:1,ttl:1e3*30});D.getWallet();const Z=new U.WalletAuthenticator;new H.WalletHandlers({authenticator:Z,tokenStorage:new G.default({dbPath:Y.default.join(s.default.env.dataDir,"auth.db")})});const ee=new K.BlockletService,te=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await ee.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ne=["/assets/"];function oe({app:n,viteDevServer:e,state:t}){let d;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(f,k,S)=>{const i=f.originalUrl;d=await e.transformIndexHtml(i,o),S()})}else d=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const u=O.Router();u.use((o,f,k)=>{if(o.headers["x-unique-record"]==="dial_http"){v.logger.info("[html] dial http request, return 200 status code"),f.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&u.use(W.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),u.get("/:path(*)?",async(o,f,k)=>{if(ne.some(c=>o.path?.startsWith(c))){k();return}const S="production";let i,b,g=d;if(o.path.startsWith("/pages")){const c=o.params.lang,_=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let m=(c&&w.has(c)?c:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!m||!t.supportedLocales?.find(h=>h.locale===m))&&(m=t.supportedLocales?.[0]?.locale||""),m){const h=[];Object.values(t.pages).forEach(a=>{const L=Object.values(a?.sections??{}).filter(r=>r.component==="custom-component"&&r.config?.componentId).map(r=>({id:r.id,componentId:r.config.componentId,useCache:r.config.useCache,cacheDuration:r.config.cacheDuration,properties:a?.dataSource?.[r.id]?.[m]}));h.push(...L)});const x=new Promise(a=>{setTimeout(()=>{a({})},30*1e3)});try{await Promise.race([x,v.getPreloadComponents({mode:S,req:o,state:t,locale:m,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(a=>{a&&(b=A.injectPreloadComponents(a))})])}catch(a){v.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",a)}}}try{const c=i?.title||s.default.env.appName,_=i?.description||s.default.env.appDescription,w=j.withQuery(j.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:c,description:_});g=V.default.render(d,{ogTitle:c,ogDescription:_,ogImage:se(i?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const p=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let l=i?.backgroundColor;if(l&&R.isMuiColorKey(l)){const c=await te();l=Q.default(c,`settings.theme.light.palette.${l}`,l)}const I=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
1
+ "use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-CnPdZJ2Z.js"),T=require("./chunks/html-dP5_4zu1.js"),W=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),A=require("@blocklet/pages-kit/utils/preload"),F=require("@blocklet/sdk/lib/component"),O=require("express"),P=require("fs"),J=require("lodash/get"),z=require("mustache"),j=require("ufo"),y=n=>n&&n.__esModule?n:{default:n},G=y(B),s=y(E),Y=y(C),Q=y(J),V=y(z),X=(n={})=>{const e={data:new Map,timers:new Map,set:(t,d,u=n.ttl||36e5)=>{n.max&&e.data.size>=n.max&&e.delete(e.data.keys().next().value),e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.set(t,setTimeout(()=>e.delete(t),u)),e.data.set(t,d)},get:t=>e.data.get(t),has:t=>e.data.has(t),delete:t=>(e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.delete(t),e.data.delete(t)),clear:()=>{e.data.clear();for(const t of e.timers.values())clearTimeout(t);e.timers.clear()}};return e},q=X({max:1,ttl:1e3*30});D.getWallet();const Z=new U.WalletAuthenticator;new H.WalletHandlers({authenticator:Z,tokenStorage:new G.default({dbPath:Y.default.join(s.default.env.dataDir,"auth.db")})});const ee=new K.BlockletService,te=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await ee.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ne=["/assets/"];function oe({app:n,viteDevServer:e,state:t}){let d;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(f,k,S)=>{const i=f.originalUrl;d=await e.transformIndexHtml(i,o),S()})}else d=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const u=O.Router();u.use((o,f,k)=>{if(o.headers["x-unique-record"]==="dial_http"){v.logger.info("[html] dial http request, return 200 status code"),f.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&u.use(W.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),u.get("/:path(*)?",async(o,f,k)=>{if(ne.some(c=>o.path?.startsWith(c))){k();return}const S="production";let i,b,g=d;if(o.path.startsWith("/pages")){const c=o.params.lang,_=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let m=(c&&w.has(c)?c:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!m||!t.supportedLocales?.find(h=>h.locale===m))&&(m=t.supportedLocales?.[0]?.locale||""),m){const h=[];Object.values(t.pages).forEach(a=>{const L=Object.values(a?.sections??{}).filter(r=>r.component==="custom-component"&&r.config?.componentId).map(r=>({id:r.id,componentId:r.config.componentId,useCache:r.config.useCache,cacheDuration:r.config.cacheDuration,properties:a?.dataSource?.[r.id]?.[m]}));h.push(...L)});const x=new Promise(a=>{setTimeout(()=>{a({})},30*1e3)});try{await Promise.race([x,v.getPreloadComponents({mode:S,req:o,state:t,locale:m,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(a=>{a&&(b=A.injectPreloadComponents(a))})])}catch(a){v.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",a)}}}try{const c=i?.title||s.default.env.appName,_=i?.description||s.default.env.appDescription,w=j.withQuery(j.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:c,description:_});g=V.default.render(d,{ogTitle:c,ogDescription:_,ogImage:se(i?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const p=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let l=i?.backgroundColor;if(l&&R.isMuiColorKey(l)){const c=await te();l=Q.default(c,`settings.theme.light.palette.${l}`,l)}const I=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
2
2
  ${l?`<meta name="theme-color" content="${l}" /><style>html,body,#app {background-color: ${l};}</style>`:""}
3
3
  ${p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.title}&display=swap">`:""}
4
4
  ${p?.description&&p?.description!==p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.description}&display=swap">`:""}
@@ -1 +1 @@
1
- "use strict";const I=require("./chunks/components-BmFOXvb0.js"),c=require("./chunks/site-state-BQySNTiP.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),C=require("@blocklet/sdk/lib/middlewares/auth"),G=require("@blocklet/sdk/lib/component"),g=e=>e&&e.__esModule?e:{default:e},u=g(L),f=g(J),D=g(X),K=g(W),k=g(B),Y=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(I.isMultiTenant()){const P=n.createdBy===r,y=I.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){I.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=k.default.join(e,s.name),r=k.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function $(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>I.isMultiTenant()?C.authMiddleware()(e,t,o):C.authMiddleware({roles:["owner","admin","pagesEditor"]})(e,t,o),z=(e,t)=>{const o=G.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},_=F.Router(),T="@page",U="@component",m=":",R="ALL",M="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(m),H=e=>{const[t,o,s]=e.split(m);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(m),Q=e=>{const[t,o,s]=e.split(m);if(t===U)return{componentId:s,projectId:o}},V=e=>[M,e].join(m),Z=e=>{const[t,o]=e.split(m);if(t===M)return o},ee=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=K.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:V(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}]}}_.get("/resources",h,async(e,t)=>{const{projectId:o}=ee(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await Y(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 te=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("")});_.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await te.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(Z(i))continue;const{pageId:d,projectId:w}=H(i)||{};if(d)d===R||d&&w&&a.push({pageId:d,projectId:w});else{const{componentId:j,projectId:p}=Q(i)||{};j===R||j&&p&&P.push({componentId:j,projectId:p})}}const y=D.default(a,"projectId"),O=D.default(P,"projectId"),q=new Set([...Object.keys(y),...Object.keys(O)]),E=z(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of q){const d=await c.SiteState.getStateByProjectId(i,r),w=y[i],j=O[i],p=w?.map(l=>l.pageId),S=j?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await $(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}I.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});_.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=_;
1
+ "use strict";const f=require("./chunks/components-CnPdZJ2Z.js"),c=require("./chunks/site-state-DCRNxkS5.js"),U=require("express"),w=require("fs/promises"),T=require("joi"),M=require("lodash/groupBy"),q=require("lodash/sortBy"),C=require("@blocklet/sdk/lib/middlewares/auth"),L=require("@blocklet/sdk/lib/component"),J=require("path"),h=e=>e&&e.__esModule?e:{default:e},l=h(T),k=h(M),F=h(q),X=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,i=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(f.isMultiTenant()){const I=n.createdBy===r,g=f.getMultiTenantAllProjectAccessPassports()?.includes?.(i);if(!I&&!g)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(i))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){f.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}},O=(e,t,o)=>f.isMultiTenant()?C.authMiddleware()(e,t,o):C.authMiddleware({roles:["owner","admin","pagesEditor"]})(e,t,o),G=(e,t)=>{const o=L.getResourceExportDir({projectId:e,releaseId:t});return J.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},y=U.Router(),A="@page",B="@component",m=":",R="ALL",b="@project",v=({pageId:e,projectId:t})=>[A,t,e].join(m),K=e=>{const[t,o,s]=e.split(m);if(t===A)return{pageId:s,projectId:o}},D=({componentId:e,projectId:t})=>[B,t,e].join(m),W=e=>{const[t,o,s]=e.split(m);if(t===B)return{componentId:s,projectId:o}},Y=e=>[b,e].join(m),$=e=>{const[t,o]=e.split(m);if(t===b)return o},z=e=>{try{return JSON.parse(e)}catch{}return{}};async function x(e){const t=await c.SiteState.getStateByProjectId({projectId:e,mode:"production"}),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const i=t.pages[r];if(i)return{id:v({pageId:r,projectId:e}),name:i.slug}}).filter(Boolean),n=F.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:D({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Y(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:D({componentId:R,projectId:e}),name:"Components",children:n}]}}y.get("/resources",O,async(e,t)=>{const{projectId:o}=z(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await X(e,t,()=>{});const r=await x(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>x(r.id)));t.json({resources:n})});const H=l.default.object({projectId:l.default.string().required().min(1),releaseId:l.default.string().allow(""),resources:l.default.array().items(l.default.string()).required(),locale:l.default.string().allow("")});y.post("/resources",O,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await H.validateAsync(e.body),r="production",i=[],I=[];for(const a of o){if($(a))continue;const{pageId:d,projectId:P}=K(a)||{};if(d)d===R||d&&P&&i.push({pageId:d,projectId:P});else{const{componentId:j,projectId:u}=W(a)||{};j===R||j&&u&&I.push({componentId:j,projectId:u})}}const g=k.default(i,"projectId"),S=k.default(I,"projectId"),N=new Set([...Object.keys(g),...Object.keys(S)]),E=G(s,n);await w.rm(E,{recursive:!0,force:!0}),await w.mkdir(E,{recursive:!0});for(const a of N){const d=await c.SiteState.getStateByProjectId({projectId:a,mode:r}),P=g[a],j=S[a],u=P?.map(p=>p.pageId),_=j?.map(p=>p.componentId);if(u?.length||_?.length){const p=await c.toPackage(d,{exportAssets:!0,pageIds:u,componentIds:_});await c.copyRecursive(p,E),await w.rm(p,{recursive:!0,force:!0})}f.logger.info(`Exported resources for project ${a}`,{pageIds:u,componentIds:_})}t.json({})});y.get("/all-resources",O,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=y;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-BmFOXvb0.js");const e=require("./chunks/site-state-BQySNTiP.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-CnPdZJ2Z.js");const e=require("./chunks/site-state-DCRNxkS5.js"),u=require("@blocklet/pages-kit/utils/common");require("@blocklet/pages-kit/utils/page-model");require("@blocklet/pages-kit/utils/property");require("@blocklet/pages-kit/utils/route");require("@blocklet/sdk/lib/component");require("@blocklet/sdk/lib/config");require("@reactivedata/reactive");require("@syncedstore/core");require("fs");require("fs/promises");require("glob");require("lib0/decoding");require("lib0/encoding");require("lodash/cloneDeep");require("lodash/debounce");require("lodash/get");require("lodash/isEmpty");require("lodash/set");require("lodash/union");require("lru-cache");require("p-limit");require("path");require("sequelize");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");const t=require("@blocklet/pages-kit/types/state");exports.PUBLISH_MODES=e.PUBLISH_MODES;exports.SITE_STATE_PATH=e.SITE_STATE_PATH;exports.STATE_MODES=e.STATE_MODES;exports.default=e.SiteState;exports.downloadAsset=e.downloadAsset;exports.downloadAssets=e.downloadAssets;exports.fromPackage=e.fromPackage;exports.getDefaultState=e.getDefaultState;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;exports.updateResourceStatesByProjectId=e.updateResourceStatesByProjectId;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
@@ -265,7 +265,7 @@ async function pe({
265
265
  config: { defaultLocale: a }
266
266
  } = o;
267
267
  if (!a) return null;
268
- const m = $(10), i = (await Promise.all(
268
+ const m = $(6), i = (await Promise.all(
269
269
  s.map(
270
270
  (p) => m(async () => {
271
271
  try {
@@ -0,0 +1,38 @@
1
+ import { createHash as s } from "crypto";
2
+ import "ufo";
3
+ const c = {};
4
+ function u(t, e) {
5
+ const n = JSON.stringify([t, e]);
6
+ return s("md5").update(n).digest("hex");
7
+ }
8
+ async function a(t, e) {
9
+ return i(t, e);
10
+ }
11
+ function i(t, e) {
12
+ let n = t;
13
+ return e.forEach((r) => {
14
+ const o = typeof r.selector.pattern == "string" ? new RegExp(r.selector.pattern, "gis") : r.selector.pattern;
15
+ n = n.replace(o, r.value);
16
+ }), n;
17
+ }
18
+ async function f(t, e) {
19
+ if (!e || e.length === 0)
20
+ return t;
21
+ const n = u(t, e);
22
+ return c[n] ??= a(t, e).finally(() => {
23
+ setTimeout(() => {
24
+ delete c[n];
25
+ }, 10 * 1e3);
26
+ }), c[n];
27
+ }
28
+ function h(t) {
29
+ return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1] || "";
30
+ }
31
+ function p(t, e) {
32
+ return !e || Object.keys(e).length === 0 ? !0 : Object.entries(e).every(([n, r]) => t.includes(`${n}=${r}`));
33
+ }
34
+ export {
35
+ h as e,
36
+ f as i,
37
+ p as m
38
+ };