@blocklet/pages-kit-inner-components 0.6.101 → 0.6.103

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.
@@ -0,0 +1 @@
1
+ "use strict";const p=require("./components-DsHjikTX.js"),q=require("@syncedstore/core"),Ze=require("yjs"),et=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),tt=require("lodash/cloneDeep"),st=require("@blocklet/sdk/lib/config"),I=require("fs"),m=require("path"),Re=require("@blocklet/pages-kit/utils/common"),at=require("@blocklet/pages-kit/utils/page-model"),nt=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),ot=require("@reactivedata/reactive"),Z=require("glob"),rt=require("lib0/decoding"),it=require("lib0/encoding"),ct=require("lodash/debounce"),lt=require("lodash/get"),ut=require("lodash/isEmpty"),pt=require("lodash/set"),dt=require("lodash/union"),be=require("lru-cache"),ft=require("p-limit"),j=require("sequelize"),gt=require("stream/promises"),mt=require("tar"),U=require("ufo"),ht=require("wait-on"),z=require("y-protocols/awareness"),ue=require("y-protocols/sync"),yt=require("yaml"),ve=require("./html-xfTPTsl5.js");require("sqlite3");require("@blocklet/pages-kit/types/state");const $=t=>t&&t.__esModule?t:{default:t};function ne(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 M=ne(Ze),we=$(tt),w=$(st),pe=ne(rt),v=ne(it),Me=$(ct),Ae=$(lt),Pe=$(ut),ke=$(pt),St=$(dt),$e=$(ft),It=$(ht),B=ne(yt),Et=j.DataTypes.sqlite.DATE.parse;j.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Et(t,e);const N=new j.Sequelize({dialect:"sqlite",storage:p.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});N.query("PRAGMA journal_mode = WAL;");N.query("PRAGMA synchronous = normal;");N.query("PRAGMA journal_size_limit = 67108864;");N.query("PRAGMA cache_size = 10000;");process.on("SIGINT",async()=>{await N.close(),process.exit(0)});process.on("SIGTERM",async()=>{await N.close(),process.exit(0)});async function bt(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 ge=null;ge&&clearInterval(ge);ge=setInterval(async()=>{p.logger.info("Start cleanupSqliteMemory"),await bt(N,p.databaseUrl),p.logger.info("End cleanupSqliteMemory")},60*1e3*10);const wt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",me="page",he="trigger-reload-project-resource",je=wt,At="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",Pt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class Oe extends j.Model{}Oe.init({id:{type:j.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:j.DataTypes.UUIDV4},projectId:{type:j.DataTypes.UUID,allowNull:!1},componentId:{type:j.DataTypes.STRING,allowNull:!1}},{sequelize:N,tableName:"ProjectComponents",timestamps:!1});const jt="SLUG_INVALID",Y=t=>({error:"slugInvalid",code:jt,field:"slug",message:t}),Ot={error:"slugRequired",code:"SLUG_REQUIRED",field:"slug",message:()=>"Project slug is required"},Tt={error:"slugAlreadyExists",code:"SLUG_EXISTS",field:"slug",message:t=>`Project slug "${t}" already exists`},Ct=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/\\:]/],Le=t=>{if(!t)return"";if(t==="/")return"/";const e=U.withoutTrailingSlash(t);return U.withLeadingSlash(e)||"/"},Dt=t=>t.did===Pt;class L extends j.Model{static async getProjectByIdOrSlug(e,s){return e?L.findOne({where:{[j.Op.or]:[{id:e},{slug:e}],...s?.createdBy?{createdBy:s.createdBy}:{}}}):null}static async validateProjectSlug({slug:e,projectId:s}){if(e==null)return null;if(e==="")return Ot;const a=e==="/"?"/":U.withoutTrailingSlash(U.withLeadingSlash(e)),n=Le(a);if(a!=="/"&&a.endsWith("/"))return Y(r=>`Project slug "${r}" cannot end with /`);if(/\/{2,}/.test(a))return Y(r=>`Project slug "${r}" cannot contain consecutive /`);if(/\s/.test(a))return Y(r=>`Project slug "${r}" cannot contain whitespace`);if(Ct.some(r=>r.test(a)))return Y(r=>`Project slug "${r}" contains invalid characters`);if(w.default.components?.filter(r=>r.mountPoint&&!Dt(r)).some(r=>Le(r.mountPoint)===n))return Y(r=>`Project slug "${r}" conflicts with existing blocklet`);const c=await L.findOne({where:{slug:a}});return c&&c?.id!==s?Tt:null}}L.init({id:{type:j.DataTypes.UUID,defaultValue:j.DataTypes.UUIDV4,primaryKey:!0},name:{type:j.DataTypes.STRING,allowNull:!1},description:j.DataTypes.TEXT,createdAt:j.DataTypes.DATE,updatedAt:j.DataTypes.DATE,createdBy:{type:j.DataTypes.STRING,allowNull:!1},updatedBy:{type:j.DataTypes.STRING,allowNull:!1},slug:j.DataTypes.STRING,icon:j.DataTypes.STRING,pinnedAt:j.DataTypes.DATE,useAllResources:j.DataTypes.BOOLEAN,npmSecret:j.DataTypes.STRING,relatedBlocklets:{type:j.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 p.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){p.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:j.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 p.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){p.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}},meta:{type:j.DataTypes.JSON,allowNull:!0}},{sequelize:N,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:{[j.Op.ne]:null}}}]});L.hasMany(Oe,{foreignKey:"projectId",as:"components"});function ee(t){t.observeDeep(e=>{e.some(s=>s.changes.keys.has("updatedAt")||s.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Ne(){return I.mkdtempSync(m.join(w.default.env.dataDir,"tmp-"))}function te(t,e,s=[]){return Array.isArray(t)?t.flatMap((a,n)=>te(a,e,[...s,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([a,n])=>te(n,e,[...s,a])):e(t)?[s]:[]}function k(t){return t.filter(e=>e!=null)}function Rt(t){t.pages&&Object.keys(t.pages).forEach(s=>{const a=q.getYjsValue(t.pages[s]);a&&a instanceof M.Map&&ee(a)});const e=q.getYjsValue(t.pages);e&&e instanceof M.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.pages[n]);o&&o instanceof M.Map&&ee(o)}})})}function vt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=q.getYjsValue(t.routes?.[s]);a&&a instanceof M.Map&&ee(a)});const e=q.getYjsValue(t.routes);e&&e instanceof M.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.routes?.[n]);o&&o instanceof M.Map&&ee(o)}})})}function kt(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 r of c)r.routeMetaData??={},r.routeMetaData.publishedAt=new Date().toISOString()}}}}function de({page:t,route:e,state:s,routeId:a,routePathInfo:n}){p.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...we.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 r=e.id;n&&(r=n.paramOptionIds.join("-"));const l=e.dataSource.pathDataMappings?.[r]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[r]?.dataCache?.[s.config.defaultLocale||"en"];if(!l)continue;et.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 Lt=60*60*1e3,H=new be.LRUCache({max:300,ttl:Lt,ttlResolution:10*1e3,allowStale:!0});function _t(t,e=[]){let s=0;const a=Array.from(H.keys()),n=t.map(o=>U.withoutTrailingSlash(o));for(const o of a)for(const c of n){if(ve.matchCacheKey(o,{currentPath:c})){H.delete(o),s++,p.logger.info(`[Cache CLEAR] key: ${o}`);break}for(const r of e)if(ve.matchCacheKey(o,{currentPath:`/${r}${c}`})){H.delete(o),s++,p.logger.info(`[Cache CLEAR] key: ${o}`);break}}return p.logger.info(`[Cache CLEAR] cleared ${s} entries for paths:`,n),s}function Ut(){const t=H.size;return H.clear(),p.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}w.default.events.on(w.default.Events.envUpdate,Ut);const{uploadToMediaKit:Mt}=require("@blocklet/uploader-server"),Te=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,K=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,_e=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,$t=1e4,Nt=3e4,W=0,fe=1,Ft=0,qt=1,ye=w.default,x=m.join(process.env.BLOCKLET_DATA_DIR,"site-state"),xt=["production","draft"],Bt=["production"];function se(t){return t?.replace(/\//g,"|")||""}function Fe(){const t=ye.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 T extends M.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&M.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=ot.reactive(q.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new z.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:300,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=m.join(x,e),a=m.join(x,`@del-${e}`);I.renameSync(s,a)}catch(s){p.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 Z.globSync("*/",{cwd:x,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>T.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=T.sharedInstances[e];return s||(s=new T({path:m.join(x,e)}),T.sharedInstances[e]=s,s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(Pe.default(s?.productionState)){const a=m.join(x,e,"production"),n=await Ce(a,{includeResources:!0})??Fe();if(!n?.config?.defaultLocale){n.config??={};const o=ye.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=m.basename(this.options.path);delete T.sharedInstances[e],super.destroy()}initObserver(){Rt(this.syncedStore),vt(this.syncedStore)}get draftYjsFilePath(){return m.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=T.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return T.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=m.basename(this.options.path);return T.getProductionState(s)}async setState(e,s){const a=await Ge(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(m.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=m.basename(this.options.path);T.pageUrlMapCache.delete(o);const c=we.default(s);await L.update({productionState:c},{where:{id:o}})}}getPublishDir(e){return m.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=v.createEncoder();v.writeVarUint(c,fe),v.writeVarUint8Array(c,z.encodeAwarenessUpdate(this.awareness,o));const r=v.toUint8Array(c);this.conns.forEach((l,S)=>this.send(S,r))};updateHandler=e=>{const s=v.createEncoder();v.writeVarUint(s,W),ue.writeUpdate(s,e);const a=v.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 r=new Set(Object.keys(s));let l=0;for(;l<a.length;){const S=a[l];r.has(S)?(r.delete(S),l++):a.splice(l,1)}}{const r=new Set(Object.keys(o));let l=0;for(;l<c.length;){const S=c[l];r.has(S)?(r.delete(S),l++):c.splice(l,1)}}e.splice(0,e.length),e.push(...ye.env.languages.map(r=>({locale:r.code,name:r.name}))),n.defaultLocale=e[0]?.locale;{let r=0;const l=new Set;for(;r<e.length;){const{locale:S}=e[r];l.has(S)?e.splice(r,1):(r++,l.add(S))}}};send=(e,s)=>{e.readyState!==Ft&&e.readyState!==qt&&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&&z.removeAwarenessStates(this.awareness,Array.from(s),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=m.basename(this.options.path);this.releaseTimer=setTimeout(()=>{p.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},T.RELEASE_DELAY),p.logger.info(`[SiteState] scheduled release for project ${e} in ${T.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=m.basename(this.options.path);p.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Me.default(()=>{I.mkdirSync(m.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,M.encodeStateAsUpdate(this))},$t);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=m.basename(this.options.path);await Xe(a);const n=await this.getState("draft"),o=await this.getState("production");await Ie(n,o,{routes:s,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),o.config.publishedAt=new Date().getTime(),kt(this.syncedStore,s),await this.setState(e,o),await this.clearPageCacheForRoutes(s,o)};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,r)=>{this.transact(async()=>{try{const l=await Ie(e,s);c(l)}catch(l){r(l)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=m.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;let c=e;(!c||c.length===0)&&(c=s.pageIds??[]),p.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,c||[]);const r=s.supportedLocales.map(C=>C.locale),l=[],S=c.filter(C=>s.pageIds?.includes(C));for(const C of S){const E=s.pages[C].slug;o&&o!==a&&(o==="/"?l.push(E):l.push(`/${o}${E}`)),l.push(`/${a}${E}`)}if(l.length>0)try{const C=_t(l,r);p.logger.info(`[SiteState] cleared ${C} page cache entries for project ${a}, routes:`,c)}catch{}T.pageUrlMapCache.delete(a)};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)}}},Nt);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{s=!0});{const n=v.createEncoder();v.writeVarUint(n,W),ue.writeSyncStep1(n,this),this.send(e,v.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const c=v.createEncoder();v.writeVarUint(c,fe),v.writeVarUint8Array(c,z.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,v.toUint8Array(c))}}};messageListener=(e,s)=>{try{const a=v.createEncoder(),n=pe.createDecoder(s),o=pe.readVarUint(n);switch(o){case W:v.writeVarUint(a,W),ue.readSyncMessage(n,a,this,null),v.length(a)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(a)));break;case fe:{z.applyAwarenessUpdate(this.awareness,pe.readVarUint8Array(n),e);break}default:p.logger.warn(`Unsupported messageType ${o}`)}}catch(a){p.logger.error(a)}this.save()};static async pageUrlMap(e,s){p.logger.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${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 r=T.pageUrlMapCache.get(c);r&&(p.logger.info(`[SiteState] get pageUrlMap from cache, projectId: ${c}`),n={...n,...r},o.delete(c))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[j.Op.in]:a}}}),c=$e.default(10);await Promise.all(o?.map(r=>c(async()=>{const l=r.id,S=r.slug||l,C={},R=e==="production"&&r?.productionState?r.productionState:await T.getStateByProjectId(r.id,e),E=St.default(w.default.env.languages?.map(u=>u.code)||[],R.supportedLocales?.map(u=>u.locale)||[]),h=(u,f)=>{S&&(C[U.joinURL("/",S,u)]={...f,shouldRedirect:!0,mainPage:!0}),C[U.joinURL("/",l,u)]={...f,shouldRedirect:!0,mainPage:!0};for(const A of E){const g={...f,locale:A};C[U.joinURL("/",A,l,u)]=g,S&&(C[U.joinURL("/",A,S,u)]=g)}};if(e==="draft")for(const u of R.routeIds||[]){const f=R?.routes?.[u];if(!f)continue;if(f.params&&f.params.length>0){const d=Q.generateParamCombinations({basePath:f.path,params:f.params,routeId:f.id,paramsOptions:f.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const y of d){const O=y.path,P={projectId:l,projectSlug:S,pageSlug:O,pageId:f.displayTemplateId||"",routeId:u,defaultLocale:E?.[0],locales:E,publishedAt:R.config.publishedAt,isPublic:f.isPublic&&y?.routeMetaData?.isPublic};h(O,P)}}const A=f.path,g={projectId:l,projectSlug:S,pageSlug:A,pageId:f.displayTemplateId||"",routeId:u,defaultLocale:E?.[0],locales:E,publishedAt:R.config.publishedAt,isPublic:f.isPublic};h(A,g)}for(const u of R.pageIds||[]){const f=R.pages[u];if(!f||e==="production"&&!f.isPublic)continue;const A=f.slug,g=r.slug||l,d={projectId:l,projectSlug:g,pageSlug:A,pageId:u,defaultLocale:E?.[0],locales:E,publishedAt:R.config.publishedAt,isPublic:f.isPublic,templateConfig:f.templateConfig};h(A,d)}e==="production"&&(T.pageUrlMapCache.set(l,C),p.logger.info(`[SiteState] set pageUrlMap to cache, projectId: ${l}`)),n={...n,...C}})))}return p.logger.info("[SiteState] success get pageUrlMap"),n}getDocumentSize(){return M.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(T.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),p.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,p.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(T.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(T.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(p.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){p.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{p.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),c.destroy(),n++}catch(r){p.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,r)}p.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?p.logger.debug("[SiteState] periodic check: all instances have active connections"):p.logger.debug("[SiteState] periodic check: no instances exist")}}async function Gt(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 Mt({filePath:t,fileName:e}))?.data?.filename}catch(n){return p.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const qe=async(t,e)=>{const s=m.basename(t),a=await Ee.call({name:je,path:U.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await gt.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},xe=async(t,e)=>{await Promise.all(t.map(async s=>{try{await qe(s,m.join(e,m.basename(s)))}catch(a){p.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function Be(t){return Te.test(t)?[t]:K.test(t)?(_e.lastIndex=0,Array.from(t.matchAll(_e)).map(s=>s[1]).filter(s=>!!s)):[]}async function X(t,e,s){const{getFilename:a,exportAssets:n}=s,o=m.join(e,a(t));if(I.mkdirSync(m.dirname(o),{recursive:!0}),I.writeFileSync(o,B.stringify(t)),n){const r=te(t,l=>typeof l=="string"&&(Te.test(l)||K.test(l))).map(l=>{const S=Ae.default(t,l);return Be(S)}).flat().filter(Boolean);await xe(r,m.dirname(o))}}const Se=new be.LRUCache({max:100,ttl:1*60*1e3});async function Ue(t,e,s){const a=te(t,r=>typeof r=="string"&&(Te.test(r)||K.test(r))),n=$e.default(2),o=a.map(r=>n(async()=>{try{const l=Ae.default(t,r),S=Be(l);for(const C of S){const R=m.basename(C),E=s.getFilePath(C,r),h=E?`${E}:${R}`:R,u=Se.get(h);if(u){K.test(l)||ke.default(t,r,u);return}const f=await Gt(E,R,e);f&&(K.test(l)||ke.default(t,r,f),Se.set(h,f))}}catch(l){p.logger.error(`Failed to process upload for path ${r.join(".")}:`,l.message||l.reason)}})),c=await Promise.allSettled(o);s.onFinish?.(c)}async function Ge(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:c="all"}={}){const r=s==="all"?t.pageIds:s,l=nt.getComponentDependencies({state:t,pageIds:r,componentIds:a==="all"?Object.keys(t.components):a});Object.entries(t.components).forEach(([i,b])=>{b.data?.renderer?.type==="component-template"&&l.push(i)});const S=c==="all"?t.routeIds:c,C=i=>({id:i.id,name:i.name,isTemplateSection:i.isTemplateSection??!1,templateDescription:i.templateDescription,component:i.component,config:i.config,visibility:i.visibility,sections:i?.sectionIds?k(i?.sectionIds?.map(b=>{const D=i.sections?.[b];return D&&C(D)})):void 0}),R=(i,b)=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,meta:i.locales?.[b]??{},sections:k(i.sectionIds.map(D=>{const F=i.sections[D];return F&&C(F)})),dataSource:Object.fromEntries(Object.entries(i.dataSource||{}).map(([D,F])=>[D,F?.[b]??{}]))}),E=i=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,path:i.path,handler:i.handler,isPublic:i.isPublic??!0,params:i.params??[],enabledGenerate:i.enabledGenerate??!1,displayTemplateId:i.displayTemplateId,dataSource:i.dataSource}),h=k(S.map(i=>{const b=t.routes[i];return b&&E(b)})),u=k(t.supportedLocales.map(i=>i.locale).flatMap(i=>r.map(b=>{const D=t.pages[b];return D&&{locale:i,slug:D.slug,page:R(D,i)}}))),f=Ne(),A=m.join(f,"pages");I.mkdirSync(A,{recursive:!0});const g=m.join(f,"components");I.mkdirSync(g,{recursive:!0});const d=m.join(f,"routes");I.mkdirSync(d,{recursive:!0});for(const{locale:i,slug:b,page:D}of u)await X(D,A,{getFilename:()=>`${se(b)||"index"}.${i}.yml`,exportAssets:e});for(const i of h)await X(i,d,{getFilename:()=>`${se(i.path)||"index"}.yml`,exportAssets:e});for(const i of l){const b=t.components[i]?.data;b&&await X(b,g,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const y=m.join(f,".blocklet/pages/pages.config.yml");I.mkdirSync(m.dirname(y),{recursive:!0});const O={pages:k(r.map(i=>{const b=t.pages[i];return b&&{id:i,slug:b.slug}})),routes:k(S.map(i=>{const b=t.routes[i];return b&&{id:i,path:b.path}})),components:k(l.map(i=>{const b=t.components[i]?.data;return b&&{id:i,name:b.name}})),...o?{resources:{components:k(Object.keys(t.resources?.components||{}).filter(i=>l.includes(i)).map(i=>({id:i,name:t.resources?.components?.[i]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};I.writeFileSync(y,B.stringify(O));const P=m.join(f,"config.source.json");if(n&&I.writeFileSync(P,JSON.stringify(n)),o){const i=m.join(f,"resources"),b=m.join(i,"components");I.mkdirSync(b,{recursive:!0});for(const G of Object.keys(t?.resources?.components??{}).filter(_=>l.includes(_))){const _=t.resources?.components?.[G]?.component;_&&await X(_,b,{getFilename:V=>`${V.name||"unnamed"}.${V.id}.yml`,exportAssets:e})}const D=m.join(f,"chunks");I.mkdirSync(D,{recursive:!0});const F=Vt();for(const G of Object.keys(t?.resources?.components??{}).filter(_=>l.includes(_))){const _=t.resources?.components?.[G]?.component;if(_&&_.renderer?.type==="react-component"){const V=_.renderer?.chunks??[];if(V?.length>0)for(const ce of V){const De=m.join(D,ce),le=F?.[ce];try{le&&I.existsSync(le)&&!I.existsSync(De)&&I.copyFileSync(le,De)}catch(Qe){p.logger.error(`copy chunk ${ce} error`,Qe.message)}}}}}return f}async function Ce(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=Ne(),await mt.x({file:t,C:a}));const o=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),c=o&&m.join(m.dirname(o),"../../pages"),r=o&&m.join(m.dirname(o),"../../components"),l=o&&m.join(m.dirname(o),"../../routes");if(!o)return null;const S=B.parse(I.readFileSync(o).toString()),C=(g,d,y)=>{let O=m.join(g,`${d}${y?`.${y}`:""}.yml`);return(!I.existsSync(O)||!I.lstatSync(O).isFile())&&(O=m.join(g,d,`index${y?`.${y}`:""}.yml`),!I.existsSync(O)||!I.lstatSync(O))?null:B.parse(I.readFileSync(O).toString())},R=(g,d)=>{try{const y=Z.globSync(`*.${d}.yml`,{cwd:g,absolute:!0})[0];return y?B.parse(I.readFileSync(y).toString()):null}catch(y){p.logger.error("parse component error",y)}return null},E=(g,d)=>{let y=m.join(g,`${d}.yml`);return(!I.existsSync(y)||!I.lstatSync(y).isFile())&&(y=m.join(g,d,"index.yml"),!I.existsSync(y)||!I.lstatSync(y))?null:B.parse(I.readFileSync(y).toString())},h=k(S.pages.map(({slug:g})=>{const d=k(S.supportedLocales.map(({locale:P})=>{const i=c?C(c,se(g),P):void 0;if(i)return{locale:P,page:i};const b=c?C(c,g,P):void 0;return b&&{locale:P,page:b}})),y=d[0]?.page;if(!y)return null;const O=y.sections.map(at.unzipSection);return{id:y.id||Re.nextId(),createdAt:y.createdAt,updatedAt:y.updatedAt,publishedAt:y.publishedAt,isPublic:y.isPublic??!0,templateConfig:y.templateConfig,slug:g,sections:Object.fromEntries(O.map(P=>[P.id,P])),sectionIds:O.map(P=>P.id),locales:Object.fromEntries(d.map(({locale:P,page:i})=>[P,i.meta])),dataSource:y.dataSource?Object.fromEntries([...new Set(d.flatMap(({page:P})=>Object.keys(P.dataSource??{})))].map(P=>[P,Object.fromEntries(d.map(({locale:i,page:b})=>{const D=b.dataSource?.[P];return[i,D||{}]}))])):Object.fromEntries([...new Set(d.flatMap(({page:P})=>P.sections.map(i=>i.id)))].map(P=>[P,Object.fromEntries(d.map(({locale:i,page:b})=>{const D=b.dataSource?.[P];if(D)return[i,D];const F=b.sections.find(G=>G.id===P);return[i,F?.properties||{}]}))]))}})),u=k(S?.routes?.map(({path:g})=>{const d=l?E(l,se(g)):void 0;return{...d,id:d?.id||Re.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??{}}})??[]),f=r?k(S.components?.map(({id:g})=>R(r,g))??[]):[];if(e){const g=(...d)=>{p.logger.info(`[${n?m.basename(t):m.basename(m.join(t,"../../../../"))}] importAssets:`,...d)};try{g("wait image-bin api ready"),await It.default({resources:[`${Ee.getComponentWebEndpoint(p.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:O=>O>=200&&O<=500}),g("image-bin api is ready");const d={},y={};g("start to upload assets"),await Promise.allSettled([Ue(f,d,{getFilePath:O=>r&&m.join(r,O),onFinish:O=>{g(`upload ${O.length} component assets`)}}),Ue(h,y,{getFilePath:(O,P)=>{const i=Ae.default(h,P.slice(0,1));return c&&m.join(c,m.dirname(i.slug),O)},onFinish:O=>{g(`upload ${O.length} page assets`)}})]),g("upload assets done"),Se.clear(),global.gc&&global.gc()}catch(d){g("Error during asset import:",d)}}const A={};if(s){const g=o&&m.join(m.dirname(o),"../../resources/components"),d=k(S.resources?.components?.map(({id:y})=>R(g,y))??[]);d.length>0&&(A.components=Object.fromEntries(d.map((y,O)=>[y.id,{index:O,component:y}])))}return{supportedLocales:S.supportedLocales,pageIds:h.map(g=>g.id),components:Object.fromEntries(f.map((g,d)=>[g.id,{index:d,data:g}])),pages:Object.fromEntries(h.map(g=>[g.id,g])),config:S.config||{},resources:A,routeIds:u.map(g=>g.id),routes:Object.fromEntries(u.map(g=>[g.id,g])),dataSourceIds:[],dataSources:{}}}finally{n&&a&&I.rmSync(a,{force:!0,recursive:!0})}}async function Ie(t,e,{routes:s,mergeMode:a="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&p.clearPreloadComponentsCacheByMode(o)}catch(E){p.logger.error("clear preload page cache error",{error:E})}const{pages:c,pageIds:r,routeIds:l,routes:S,supportedLocales:C}=t;if(o==="production"){let E=s??[],h=null;for(const u of l??[]){const f=S?.[u];if(f?.params&&f?.params.length>0&&f?.paramsOptions&&f?.paramsOptions.length>0){const A=Q.generateParamCombinations({basePath:f.path,params:f.params,routeId:f.id,paramsOptions:f.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),g=Object.fromEntries(A.map(d=>[`${u}-${d.paramOptionIds.join("-")}`,d]));h={...h||{},...g},s||(E=[...E,...A.map(d=>`${u}-${d.paramOptionIds.join("-")}`)])}else s||E.push(u)}p.logger.info("routeIds to be published: ",E);for(const u of E){let f=u;if(f.includes("-")){const[d]=f.split("-");f=d}const A=S?.[f];if(!A){const d=e.pageIds.indexOf(f);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[f]);for(const y of e.pageIds)y.includes(`${f}-`)&&(e.pageIds.splice(e.pageIds.indexOf(y),1),delete e.pages[y]);p.logger.info("delete main route page",f);continue}if(u.includes("-")&&!h?.[u]){const d=e.pageIds.indexOf(u);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[u]),p.logger.info("delete page",u);continue}if(!A.displayTemplateId){p.logger.info("no display template",u);continue}const g=c[A.displayTemplateId];if(!g){p.logger.info("no template page",u);continue}if(e.pageIds.includes(u)){if(p.logger.info("has need update page",u),a==="replace")e.pages[u]=de({page:g,route:A,state:t,routeId:u,routePathInfo:h?.[u]}),p.logger.info("replace page",u);else if(a==="byUpdateTime"){const d=e.pages[A.id];(!d||A.updatedAt&&A.updatedAt>d.updatedAt)&&(e.pages[u]=de({page:g,route:A,state:t,routeId:u,routePathInfo:h?.[u]}),p.logger.info("replace page by update time",u))}}else e.pageIds.push(u),e.pages[u]=de({page:g,route:A,state:t,routeId:u,routePathInfo:h?.[u]}),p.logger.info("add page",u)}if(n&&!s)for(const u of e.pageIds)E?.includes(u)||(delete e.pages[u],p.logger.info("delete page",u)),e.pageIds=[...e.pageIds].filter(f=>E?.includes(f))}else{for(const E of r){const h=c[E];if(h)if(e.pageIds.includes(h.id)){if(a==="replace")e.pages[h.id]=h;else if(a==="byUpdateTime"){const u=e.pages[h.id];(!u||h.updatedAt&&h.updatedAt>u.updatedAt)&&(e.pages[h.id]=h)}}else e.pageIds.push(h.id),e.pages[h.id]=h}for(const E of l){const h=S[E];if(h)if(e.routeIds.includes(h.id)){if(a==="replace")e.routes[h.id]=h;else if(a==="byUpdateTime"){const u=e.routes[h.id];(!u||h.updatedAt&&h.updatedAt>u.updatedAt)&&(e.routes[h.id]=h)}}else e.routeIds.push(h.id),e.routes[h.id]=h}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...we.default(C)),n)for(const E of Object.keys(e.components))delete e.components[E];let R=JSON.parse(JSON.stringify(t.components));R=Object.fromEntries(await Promise.all(Object.entries(R).map(async([E,h])=>{const u=await Ve(h?.data);return[E,{...h,data:u}]}))),Object.assign(e.components,R),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Pe.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Ve=p.memoizeWithFs(async t=>{if(!Pe.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 p.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){p.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let ae,J,oe,re;const ze=()=>Ee.getResources({types:[{did:je,type:me},{did:At,type:me}]}),Vt=()=>{const t=ze(),e={};return t.forEach(s=>{const a=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&m.join(m.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const c of o)e[c]=m.join(n,c)}}),e};function Ye(){return ae=(async()=>{const t=ze();J=(await Promise.all(t.map(async s=>{const a=s.path?await Ce(s.path,{importAssets:!1}):void 0;return a?{blockletId:s.did,state:a,blockletTitle:s.title}:void 0}))).filter(s=>!!s),oe=J.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=J.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.components).map(n=>[n.data.id,{blockletId:a.blockletId,component:n.data}]))),{});re=Object.fromEntries(await Promise.all(Object.entries(e).map(async([s,a])=>{const n=await Ve(a.component);return[s,{...a,component:n}]})))})(),ae}function He(t){const e=Me.default(async()=>{await Ye().catch(s=>{p.logger.error("load resource states error",{error:s})}),await t?.({states:J,pages:oe,components:re})},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(he,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(he,e)}}const Ke=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Je=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),ie=globalThis;ie[Ke]?.();ie[Ke]=He(async({pages:t,components:e})=>{const s=await T.getProjectIds();p.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=>{We({projectId:a,pages:t,components:e})}))]).catch(a=>{p.logger.error("update resource states failed:",a)})});ie[Je]?.();ie[Je]=()=>{const t=()=>{T.pageUrlMapCache.clear(),p.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)}};T.startPeriodicCheck();process.on("beforeExit",()=>{T.stopPeriodicCheck()});process.on("SIGINT",()=>{T.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{T.stopPeriodicCheck(),process.exit(0)});async function We({projectId:t,pages:e,components:s}){const a=T.sharedInstances[t];if(!a){p.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 Oe.findAll({where:{projectId:t}})).map(l=>l.componentId),r=Object.fromEntries(Object.entries(s||{}).filter(([l])=>c.includes(l)));a.syncedStore.resources.components=r}p.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function Xe(t){return We({projectId:t,pages:oe,components:re})}async function zt(){p.logger.info("trigger reload all project resource"),w.default.events.emit(he)}async function Yt({ensureLoaded:t=!0}={}){return t&&(ae??=Ye(),await ae),{states:J,pages:oe,components:re}}exports.COMPONENT_DID=je;exports.PUBLISH_MODES=Bt;exports.Project=L;exports.RESOURCE_TYPE=me;exports.SITE_STATE_PATH=x;exports.STATE_MODES=xt;exports.SiteState=T;exports.downloadAsset=qe;exports.downloadAssets=xe;exports.fromPackage=Ce;exports.getDefaultState=Fe;exports.getResourceStates=Yt;exports.initPackResourceStates=He;exports.mergeState=Ie;exports.toPackage=Ge;exports.triggerReloadAllProjectResource=zt;exports.updateResourceStatesByProjectId=Xe;
@@ -1 +1 @@
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
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-DsHjikTX.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;
package/lib/cjs/home.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("react/jsx-runtime");require("./chunks/state-BdtFHk36.js");require("@arcblock/ux/lib/Locale/context");require("@arcblock/ux/lib/Result");require("@arcblock/ux/lib/Theme");require("@blocklet/pages-kit/builtin/page/header");require("@blocklet/pages-kit/contexts/color");require("@blocklet/pages-kit/utils/data-source");require("@blocklet/pages-kit/utils/route");require("@blocklet/ui-react/lib/Header");require("@emotion/css");require("@emotion/react");require("@mui/material");require("ahooks");require("isomorphic-dompurify");require("lodash/cloneDeep");require("lodash/isEmpty");require("lodash/isEqual");require("react");require("react-helmet");require("react-router-dom");require("react-use");require("ufo");require("./chunks/index-B4sanPsc.js");const e=require("./chunks/home-Bu90cJ-l.js");require("./chunks/session-BZ3-x8Ef.js");exports.HomeView=e.HomeView;exports.PageHeader=e.PageHeader;exports.PageRoutes=e.PageRoutes;exports.PageView=e.PageView;exports.PageViewByPath=e.PageViewByPath;exports.PageViewWithDataSource=e.PageViewWithDataSource;exports.TranslucentHeader=e.TranslucentHeader;exports.default=e.Home;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("react/jsx-runtime");require("./chunks/state-BdtFHk36.js");require("@arcblock/ux/lib/Locale/context");require("@arcblock/ux/lib/Result");require("@arcblock/ux/lib/Theme");require("@blocklet/pages-kit/builtin/page/header");require("@blocklet/pages-kit/contexts/color");require("@blocklet/pages-kit/utils/data-source");require("@blocklet/pages-kit/utils/route");require("@blocklet/ui-react/lib/Header");require("@emotion/css");require("@emotion/react");require("@mui/material");require("ahooks");require("isomorphic-dompurify");require("lodash/cloneDeep");require("lodash/isEmpty");require("lodash/isEqual");require("react");require("react-helmet");require("react-router-dom");require("react-use");require("ufo");require("./chunks/index-B-Wh6PRT.js");const e=require("./chunks/home-DdN3Z-6B.js");require("./chunks/session-BZ3-x8Ef.js");exports.HomeView=e.HomeView;exports.PageHeader=e.PageHeader;exports.PageRoutes=e.PageRoutes;exports.PageView=e.PageView;exports.PageViewByPath=e.PageViewByPath;exports.PageViewWithDataSource=e.PageViewWithDataSource;exports.TranslucentHeader=e.TranslucentHeader;exports.default=e.Home;
@@ -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-DLLpFRy5.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-DsHjikTX.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:`
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-DLLpFRy5.js"),c=require("./chunks/site-state-uZR_uvZu.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 I=require("./chunks/components-DsHjikTX.js"),c=require("./chunks/site-state-DlLhHuIr.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 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-DLLpFRy5.js");const e=require("./chunks/site-state-uZR_uvZu.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-DsHjikTX.js");const e=require("./chunks/site-state-DlLhHuIr.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]})});
@@ -7,7 +7,7 @@ import ie from "@mui/icons-material/Check";
7
7
  import { Box as n, styled as H, alpha as ne, Stack as ae, Dialog as se, DialogTitle as le, TextField as pe, IconButton as ce, DialogContent as de, Tabs as me, Tab as ue, Grid as O, Card as fe, CardMedia as be, CardContent as ge, Typography as W, DialogActions as xe, Button as N, Skeleton as he } from "@mui/material";
8
8
  import { useReactive as Q } from "ahooks";
9
9
  import { createContext as _, useMemo as P, useEffect as M, useRef as E } from "react";
10
- import { a as ye, R as ve, B as V, c as Ce, T as ke, I as we } from "./chunks/index-B3PuGYfF.js";
10
+ import { a as ye, R as ve, B as V, c as Ce, T as ke, I as we } from "./chunks/index-DENjTU8O.js";
11
11
  import { styled as g } from "@arcblock/ux/lib/Theme";
12
12
  import "@blocklet/pages-kit/builtin/color-picker";
13
13
  import "@blocklet/pages-kit/utils/style";
@@ -228,7 +228,7 @@ function ve(e) {
228
228
  return e?.type === "react-component";
229
229
  }
230
230
  const C = new te({
231
- max: 100,
231
+ max: 600,
232
232
  ttl: 1e3 * 60 * 60 * 24 * 7
233
233
  // default ttl is 7 days
234
234
  }), _e = 60 * 60, F = 10;
@@ -21,7 +21,7 @@ import { Helmet as Se } from "react-helmet";
21
21
  import { useSearchParams as Z, Routes as Ce, Route as S, Navigate as Ie, ScrollRestoration as Te } from "react-router-dom";
22
22
  import { useAsync as ee } from "react-use";
23
23
  import { joinURL as P } from "ufo";
24
- import { u as Re, S as je, i as z, P as Me, a as Oe, R as Ee, B as Le, b as te, g as Ae } from "./index-B3PuGYfF.js";
24
+ import { u as Re, S as je, i as z, P as Me, a as Oe, R as Ee, B as Le, b as te, g as Ae } from "./index-DENjTU8O.js";
25
25
  import Be from "@blocklet/ui-react/lib/Footer";
26
26
  import "webfontloader";
27
27
  import { u as _e, a as Fe } from "./session-Dx5M-1r2.js";
@@ -149,7 +149,7 @@ function Ge({ mode: t }) {
149
149
  }
150
150
  return /* @__PURE__ */ e(Ke, { children: ({ state: o }) => /* @__PURE__ */ e(L, { mode: t, state: o }) });
151
151
  }
152
- const qe = X(() => import("./publish-button-5KAKGqbO.js")), Ke = X(() => import("./draft-data-BOoVhbon.js"));
152
+ const qe = X(() => import("./publish-button-BVcMw8Fh.js")), Ke = X(() => import("./draft-data-BOoVhbon.js"));
153
153
  function Ye({
154
154
  mode: t,
155
155
  children: o