@blocklet/pages-kit-inner-components 0.6.92 → 0.6.94

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 f=require("./components-DLLpFRy5.js"),q=require("@syncedstore/core"),Qe=require("yjs"),Ze=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),et=require("lodash/cloneDeep"),tt=require("@blocklet/sdk/lib/config"),I=require("fs"),g=require("path"),Re=require("@blocklet/pages-kit/utils/common"),st=require("@blocklet/pages-kit/utils/page-model"),at=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),nt=require("@reactivedata/reactive"),Z=require("glob"),ot=require("lib0/decoding"),rt=require("lib0/encoding"),it=require("lodash/debounce"),ct=require("lodash/get"),lt=require("lodash/isEmpty"),ut=require("lodash/set"),pt=require("lodash/union"),be=require("lru-cache"),dt=require("p-limit"),j=require("sequelize"),ft=require("stream/promises"),gt=require("tar"),F=require("ufo"),mt=require("wait-on"),z=require("y-protocols/awareness"),ue=require("y-protocols/sync"),ht=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 U=ne(Qe),we=$(et),w=$(tt),pe=ne(ot),v=ne(rt),Me=$(it),Pe=$(ct),Ae=$(lt),ke=$(ut),yt=$(pt),St=$(dt),It=$(mt),B=ne(ht),Et=j.DataTypes.sqlite.DATE.parse;j.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Et(t,e);const M=new j.Sequelize({dialect:"sqlite",storage:f.databaseUrl,benchmark:process.env.ENABLE_SEQUELIZE_BENCHMARK==="true",retry:{match:[/SQLITE_BUSY/],name:"query",max:10},logging:process.env.ENABLE_SEQUELIZE_LOGGING==="true"?console.log:!1});M.query("pragma journal_mode = WAL;");M.query("pragma synchronous = normal;");M.query("pragma journal_size_limit = 33554432;");M.query("pragma cache_size = -2000;");M.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await M.close(),process.exit(0)});process.on("SIGTERM",async()=>{await M.close(),process.exit(0)});async function 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()=>{f.logger.info("Start cleanupSqliteMemory"),await bt(M,f.databaseUrl),f.logger.info("End cleanupSqliteMemory")},60*1e3*10);const wt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",me="page",he="trigger-reload-project-resource",je=wt,Pt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",At="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:M,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=F.withoutTrailingSlash(t);return F.withLeadingSlash(e)||"/"},Dt=t=>t.did===At;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}:{}},paranoid:!1}):null}static async validateProjectSlug({slug:e,projectId:s}){if(e==null)return null;if(e==="")return Ot;const a=Le(e);if(e!=="/"&&e.endsWith("/"))return Y(r=>`Project slug "${r}" cannot end with /`);if(/\/{2,}/.test(e))return Y(r=>`Project slug "${r}" cannot contain consecutive /`);if(/\s/.test(e))return Y(r=>`Project slug "${r}" cannot contain whitespace`);if(Ct.some(r=>r.test(e)))return Y(r=>`Project slug "${r}" contains invalid characters`);if(w.default.components?.filter(r=>r.mountPoint&&!Dt(r)).some(r=>Le(r.mountPoint)===a))return Y(r=>`Project slug "${r}" conflicts with existing blocklet`);const o=await L.findOne({where:{slug:`${e}`}});return o&&o?.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 f.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type: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 f.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}},meta:{type:j.DataTypes.JSON,allowNull:!0}},{sequelize:M,paranoid:!0});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 $e(){return I.mkdtempSync(g.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 U.Map&&ee(a)});const e=q.getYjsValue(t.pages);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.pages[n]);o&&o instanceof U.Map&&ee(o)}})})}function vt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=q.getYjsValue(t.routes?.[s]);a&&a instanceof U.Map&&ee(a)});const e=q.getYjsValue(t.routes);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.routes?.[n]);o&&o instanceof U.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,...r]=s.split("-");a=o,n=r||[]}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 r=Q.getRouteMetaDataByOptionIds(n,o);r&&(r.publishedAt=new Date().toISOString())}if(!e){const r=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const l of r)l.routeMetaData??={},l.routeMetaData.publishedAt=new Date().toISOString()}}}}function de({page:t,route:e,state:s,routeId:a,routePathInfo:n}){f.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...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 r of s.supportedLocales){if(e.dataSource){let l=e.id;n&&(l=n.paramOptionIds.join("-"));const u=e.dataSource.pathDataMappings?.[l]?.dataCache?.[r.locale]??e.dataSource.pathDataMappings?.[l]?.dataCache?.[s.config.defaultLocale||"en"];if(!u)continue;Ze.setPageDataSource(o,s,r.locale,u)}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:100,ttl:Lt,ttlResolution:10*1e3,allowStale:!0});function _t(t,e=[]){let s=0;const a=Array.from(H.keys()),n=t.map(o=>F.withoutTrailingSlash(o));for(const o of a)for(const r of n){if(ve.matchCacheKey(o,{currentPath:r})){H.delete(o),s++,f.logger.info(`[Cache CLEAR] key: ${o}`);break}for(const l of e)if(ve.matchCacheKey(o,{currentPath:`/${l}${r}`})){H.delete(o),s++,f.logger.info(`[Cache CLEAR] key: ${o}`);break}}return f.logger.info(`[Cache CLEAR] cleared ${s} entries for paths:`,n),s}function Ut(){const t=H.size;return H.clear(),f.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=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),xt=["production","draft"],Bt=["production"];function se(t){return t?.replace(/\//g,"|")||""}function Ne(){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 A extends U.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&U.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=nt.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:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(x,e),a=g.join(x,`@del-${e}`);I.renameSync(s,a)}catch(s){f.logger.error("Failed to safe delete project state dir:",s)}}static async getProjectIds(){return(await L.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return Z.globSync("*/",{cwd:x,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>A.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=A.sharedInstances[e];return s||(s=new A({path:g.join(x,e)}),A.sharedInstances[e]=s,s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(Ae.default(s?.productionState)){const a=g.join(x,e,"production"),n=await Ce(a,{includeResources:!0})??Ne();if(!n?.config?.defaultLocale){n.config??={};const o=ye.env.languages?.map(r=>({locale:r.code,name:r.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return s?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((s,a)=>this.closeConn(a)),this.awareness.destroy();const e=g.basename(this.options.path);delete A.sharedInstances[e],super.destroy()}initObserver(){Rt(this.syncedStore),vt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=A.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return A.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return A.getProductionState(s)}async setState(e,s){const a=await Be(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(g.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);A.pageUrlMapCache.delete(o);const r=we.default(s);await L.update({productionState:r},{where:{id:o}})}}getPublishDir(e){return g.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:s,removed:a},n)=>{const o=e.concat(s,a);if(n!==null){const u=this.conns.get(n);u&&(e.forEach(S=>{u.add(S)}),a.forEach(S=>{u.delete(S)}))}const r=v.createEncoder();v.writeVarUint(r,fe),v.writeVarUint8Array(r,z.encodeAwarenessUpdate(this.awareness,o));const l=v.toUint8Array(r);this.conns.forEach((u,S)=>this.send(S,l))};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:r}=this.syncedStore;{const l=new Set(Object.keys(s));let u=0;for(;u<a.length;){const S=a[u];l.has(S)?(l.delete(S),u++):a.splice(u,1)}}{const l=new Set(Object.keys(o));let u=0;for(;u<r.length;){const S=r[u];l.has(S)?(l.delete(S),u++):r.splice(u,1)}}e.splice(0,e.length),e.push(...ye.env.languages.map(l=>({locale:l.code,name:l.name}))),n.defaultLocale=e[0]?.locale;{let l=0;const u=new Set;for(;l<e.length;){const{locale:S}=e[l];u.has(S)?e.splice(l,1):(l++,u.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=g.basename(this.options.path);this.releaseTimer=setTimeout(()=>{f.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},A.RELEASE_DELAY),f.logger.info(`[SiteState] scheduled release for project ${e} in ${A.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=g.basename(this.options.path);f.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Me.default(()=>{I.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,U.encodeStateAsUpdate(this))},$t);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=g.basename(this.options.path);await We(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((r,l)=>{this.transact(async()=>{try{const u=await Ie(e,s);r(u)}catch(u){l(u)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;let r=e;(!r||r.length===0)&&(r=s.pageIds??[]),f.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,r||[]);const l=s.supportedLocales.map(P=>P.locale),u=[],S=r.filter(P=>s.pageIds?.includes(P));for(const P of S){const b=s.pages[P].slug;o&&o!==a&&(o==="/"?u.push(b):u.push(`/${o}${b}`)),u.push(`/${a}${b}`)}if(u.length>0)try{const P=_t(u,l);f.logger.info(`[SiteState] cleared ${P} page cache entries for project ${a}, routes:`,r)}catch{}A.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 r=v.createEncoder();v.writeVarUint(r,fe),v.writeVarUint8Array(r,z.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,v.toUint8Array(r))}}};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:f.logger.warn(`Unsupported messageType ${o}`)}}catch(a){f.logger.error(a)}this.save()};static async pageUrlMap(e,s){let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(r=>[r,!0])||[]);for(const r of a){const l=A.pageUrlMapCache.get(r);l&&(n={...n,...l},o.delete(r))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[j.Op.in]:a}}});await Promise.all(o?.map(async r=>{const l=r.id,u=r.slug||l,S={},P=e==="production"&&r?.productionState?r.productionState:await A.getStateByProjectId(r.id,e),R=yt.default(w.default.env.languages?.map(p=>p.code)||[],P.supportedLocales?.map(p=>p.locale)||[]),b=(p,c)=>{u&&(S[F.joinURL("/",u,p)]={...c,shouldRedirect:!0,mainPage:!0}),S[F.joinURL("/",l,p)]={...c,shouldRedirect:!0,mainPage:!0};for(const h of R){const C={...c,locale:h};S[F.joinURL("/",h,l,p)]=C,u&&(S[F.joinURL("/",h,u,p)]=C)}};if(e==="draft")for(const p of P.routeIds||[]){const c=P?.routes?.[p];if(!c)continue;if(c.params&&c.params.length>0){const m=Q.generateParamCombinations({basePath:c.path,params:c.params,routeId:c.id,paramsOptions:c.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const d of m){const y=d.path,O={projectId:l,projectSlug:u,pageSlug:y,pageId:c.displayTemplateId||"",routeId:p,defaultLocale:R?.[0],locales:R,publishedAt:P.config.publishedAt,isPublic:c.isPublic&&d?.routeMetaData?.isPublic};b(y,O)}}const h=c.path,C={projectId:l,projectSlug:u,pageSlug:h,pageId:c.displayTemplateId||"",routeId:p,defaultLocale:R?.[0],locales:R,publishedAt:P.config.publishedAt,isPublic:c.isPublic};b(h,C)}for(const p of P.pageIds||[]){const c=P.pages[p];if(!c||e==="production"&&!c.isPublic)continue;const h=c.slug,C=r.slug||l,m={projectId:l,projectSlug:C,pageSlug:h,pageId:p,defaultLocale:R?.[0],locales:R,publishedAt:P.config.publishedAt,isPublic:c.isPublic,templateConfig:c.templateConfig};b(h,m)}e==="production"&&A.pageUrlMapCache.set(l,S),n={...n,...S}}))}return n}getDocumentSize(){return U.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(A.sharedInstances)){const n=a.getDocumentSize();e.push({projectId:s,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:a.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),f.logger.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,f.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(A.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(A.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(f.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){f.logger.info(`[SiteState] releasing ${s.length} instances without connections:`,s.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:r}of s)try{f.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),r.destroy(),n++}catch(l){f.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,l)}f.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?f.logger.debug("[SiteState] periodic check: all instances have active connections"):f.logger.debug("[SiteState] periodic check: no instances exist")}}async function 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 f.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const Fe=async(t,e)=>{const s=g.basename(t),a=await Ee.call({name:je,path:F.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await ft.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},qe=async(t,e)=>{await Promise.all(t.map(async s=>{try{await Fe(s,g.join(e,g.basename(s)))}catch(a){f.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function xe(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=g.join(e,a(t));if(I.mkdirSync(g.dirname(o),{recursive:!0}),I.writeFileSync(o,B.stringify(t)),n){const l=te(t,u=>typeof u=="string"&&(Te.test(u)||K.test(u))).map(u=>{const S=Pe.default(t,u);return xe(S)}).flat().filter(Boolean);await qe(l,g.dirname(o))}}const Se=new be.LRUCache({max:100,ttl:1*60*1e3});async function Ue(t,e,s){const a=te(t,l=>typeof l=="string"&&(Te.test(l)||K.test(l))),n=St.default(2),o=a.map(l=>n(async()=>{try{const u=Pe.default(t,l),S=xe(u);for(const P of S){const R=g.basename(P),b=s.getFilePath(P,l),p=b?`${b}:${R}`:R,c=Se.get(p);if(c){K.test(u)||ke.default(t,l,c);return}const h=await Gt(b,R,e);h&&(K.test(u)||ke.default(t,l,h),Se.set(p,h))}}catch(u){f.logger.error(`Failed to process upload for path ${l.join(".")}:`,u.message||u.reason)}})),r=await Promise.allSettled(o);s.onFinish?.(r)}async function Be(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:r="all"}={}){const l=s==="all"?t.pageIds:s,u=at.getComponentDependencies({state:t,pageIds:l,componentIds:a==="all"?Object.keys(t.components):a});Object.entries(t.components).forEach(([i,E])=>{E.data?.renderer?.type==="component-template"&&u.push(i)});const S=r==="all"?t.routeIds:r,P=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(E=>{const D=i.sections?.[E];return D&&P(D)})):void 0}),R=(i,E)=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,meta:i.locales?.[E]??{},sections:k(i.sectionIds.map(D=>{const N=i.sections[D];return N&&P(N)})),dataSource:Object.fromEntries(Object.entries(i.dataSource||{}).map(([D,N])=>[D,N?.[E]??{}]))}),b=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}),p=k(S.map(i=>{const E=t.routes[i];return E&&b(E)})),c=k(t.supportedLocales.map(i=>i.locale).flatMap(i=>l.map(E=>{const D=t.pages[E];return D&&{locale:i,slug:D.slug,page:R(D,i)}}))),h=$e(),C=g.join(h,"pages");I.mkdirSync(C,{recursive:!0});const m=g.join(h,"components");I.mkdirSync(m,{recursive:!0});const d=g.join(h,"routes");I.mkdirSync(d,{recursive:!0});for(const{locale:i,slug:E,page:D}of c)await X(D,C,{getFilename:()=>`${se(E)||"index"}.${i}.yml`,exportAssets:e});for(const i of p)await X(i,d,{getFilename:()=>`${se(i.path)||"index"}.yml`,exportAssets:e});for(const i of u){const E=t.components[i]?.data;E&&await X(E,m,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const y=g.join(h,".blocklet/pages/pages.config.yml");I.mkdirSync(g.dirname(y),{recursive:!0});const O={pages:k(l.map(i=>{const E=t.pages[i];return E&&{id:i,slug:E.slug}})),routes:k(S.map(i=>{const E=t.routes[i];return E&&{id:i,path:E.path}})),components:k(u.map(i=>{const E=t.components[i]?.data;return E&&{id:i,name:E.name}})),...o?{resources:{components:k(Object.keys(t.resources?.components||{}).filter(i=>u.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 T=g.join(h,"config.source.json");if(n&&I.writeFileSync(T,JSON.stringify(n)),o){const i=g.join(h,"resources"),E=g.join(i,"components");I.mkdirSync(E,{recursive:!0});for(const G of Object.keys(t?.resources?.components??{}).filter(_=>u.includes(_))){const _=t.resources?.components?.[G]?.component;_&&await X(_,E,{getFilename:V=>`${V.name||"unnamed"}.${V.id}.yml`,exportAssets:e})}const D=g.join(h,"chunks");I.mkdirSync(D,{recursive:!0});const N=Vt();for(const G of Object.keys(t?.resources?.components??{}).filter(_=>u.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=g.join(D,ce),le=N?.[ce];try{le&&I.existsSync(le)&&!I.existsSync(De)&&I.copyFileSync(le,De)}catch(Xe){f.logger.error(`copy chunk ${ce} error`,Xe.message)}}}}}return h}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=$e(),await gt.x({file:t,C:a}));const o=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),r=o&&g.join(g.dirname(o),"../../pages"),l=o&&g.join(g.dirname(o),"../../components"),u=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const S=B.parse(I.readFileSync(o).toString()),P=(m,d,y)=>{let O=g.join(m,`${d}${y?`.${y}`:""}.yml`);return(!I.existsSync(O)||!I.lstatSync(O).isFile())&&(O=g.join(m,d,`index${y?`.${y}`:""}.yml`),!I.existsSync(O)||!I.lstatSync(O))?null:B.parse(I.readFileSync(O).toString())},R=(m,d)=>{try{const y=Z.globSync(`*.${d}.yml`,{cwd:m,absolute:!0})[0];return y?B.parse(I.readFileSync(y).toString()):null}catch(y){f.logger.error("parse component error",y)}return null},b=(m,d)=>{let y=g.join(m,`${d}.yml`);return(!I.existsSync(y)||!I.lstatSync(y).isFile())&&(y=g.join(m,d,"index.yml"),!I.existsSync(y)||!I.lstatSync(y))?null:B.parse(I.readFileSync(y).toString())},p=k(S.pages.map(({slug:m})=>{const d=k(S.supportedLocales.map(({locale:T})=>{const i=r?P(r,se(m),T):void 0;if(i)return{locale:T,page:i};const E=r?P(r,m,T):void 0;return E&&{locale:T,page:E}})),y=d[0]?.page;if(!y)return null;const O=y.sections.map(st.unzipSection);return{id:y.id||Re.nextId(),createdAt:y.createdAt,updatedAt:y.updatedAt,publishedAt:y.publishedAt,isPublic:y.isPublic??!0,templateConfig:y.templateConfig,slug:m,sections:Object.fromEntries(O.map(T=>[T.id,T])),sectionIds:O.map(T=>T.id),locales:Object.fromEntries(d.map(({locale:T,page:i})=>[T,i.meta])),dataSource:y.dataSource?Object.fromEntries([...new Set(d.flatMap(({page:T})=>Object.keys(T.dataSource??{})))].map(T=>[T,Object.fromEntries(d.map(({locale:i,page:E})=>{const D=E.dataSource?.[T];return[i,D||{}]}))])):Object.fromEntries([...new Set(d.flatMap(({page:T})=>T.sections.map(i=>i.id)))].map(T=>[T,Object.fromEntries(d.map(({locale:i,page:E})=>{const D=E.dataSource?.[T];if(D)return[i,D];const N=E.sections.find(G=>G.id===T);return[i,N?.properties||{}]}))]))}})),c=k(S?.routes?.map(({path:m})=>{const d=u?b(u,se(m)):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??{}}})??[]),h=l?k(S.components?.map(({id:m})=>R(l,m))??[]):[];if(e){const m=(...d)=>{f.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...d)};try{m("wait image-bin api ready"),await It.default({resources:[`${Ee.getComponentWebEndpoint(f.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:O=>O>=200&&O<=500}),m("image-bin api is ready");const d={},y={};m("start to upload assets"),await Promise.allSettled([Ue(h,d,{getFilePath:O=>l&&g.join(l,O),onFinish:O=>{m(`upload ${O.length} component assets`)}}),Ue(p,y,{getFilePath:(O,T)=>{const i=Pe.default(p,T.slice(0,1));return r&&g.join(r,g.dirname(i.slug),O)},onFinish:O=>{m(`upload ${O.length} page assets`)}})]),m("upload assets done"),Se.clear(),global.gc&&global.gc()}catch(d){m("Error during asset import:",d)}}const C={};if(s){const m=o&&g.join(g.dirname(o),"../../resources/components"),d=k(S.resources?.components?.map(({id:y})=>R(m,y))??[]);d.length>0&&(C.components=Object.fromEntries(d.map((y,O)=>[y.id,{index:O,component:y}])))}return{supportedLocales:S.supportedLocales,pageIds:p.map(m=>m.id),components:Object.fromEntries(h.map((m,d)=>[m.id,{index:d,data:m}])),pages:Object.fromEntries(p.map(m=>[m.id,m])),config:S.config||{},resources:C,routeIds:c.map(m=>m.id),routes:Object.fromEntries(c.map(m=>[m.id,m])),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&&f.clearPreloadComponentsCacheByMode(o)}catch(b){f.logger.error("clear preload page cache error",{error:b})}const{pages:r,pageIds:l,routeIds:u,routes:S,supportedLocales:P}=t;if(o==="production"){let b=s??[],p=null;for(const c of u??[]){const h=S?.[c];if(h?.params&&h?.params.length>0&&h?.paramsOptions&&h?.paramsOptions.length>0){const C=Q.generateParamCombinations({basePath:h.path,params:h.params,routeId:h.id,paramsOptions:h.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),m=Object.fromEntries(C.map(d=>[`${c}-${d.paramOptionIds.join("-")}`,d]));p={...p||{},...m},s||(b=[...b,...C.map(d=>`${c}-${d.paramOptionIds.join("-")}`)])}else s||b.push(c)}f.logger.info("routeIds to be published: ",b);for(const c of b){let h=c;if(h.includes("-")){const[d]=h.split("-");h=d}const C=S?.[h];if(!C){const d=e.pageIds.indexOf(h);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[h]);for(const y of e.pageIds)y.includes(`${h}-`)&&(e.pageIds.splice(e.pageIds.indexOf(y),1),delete e.pages[y]);f.logger.info("delete main route page",h);continue}if(c.includes("-")&&!p?.[c]){const d=e.pageIds.indexOf(c);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[c]),f.logger.info("delete page",c);continue}if(!C.displayTemplateId){f.logger.info("no display template",c);continue}const m=r[C.displayTemplateId];if(!m){f.logger.info("no template page",c);continue}if(e.pageIds.includes(c)){if(f.logger.info("has need update page",c),a==="replace")e.pages[c]=de({page:m,route:C,state:t,routeId:c,routePathInfo:p?.[c]}),f.logger.info("replace page",c);else if(a==="byUpdateTime"){const d=e.pages[C.id];(!d||C.updatedAt&&C.updatedAt>d.updatedAt)&&(e.pages[c]=de({page:m,route:C,state:t,routeId:c,routePathInfo:p?.[c]}),f.logger.info("replace page by update time",c))}}else e.pageIds.push(c),e.pages[c]=de({page:m,route:C,state:t,routeId:c,routePathInfo:p?.[c]}),f.logger.info("add page",c)}if(n&&!s)for(const c of e.pageIds)b?.includes(c)||(delete e.pages[c],f.logger.info("delete page",c)),e.pageIds=[...e.pageIds].filter(h=>b?.includes(h))}else{for(const b of l){const p=r[b];if(p)if(e.pageIds.includes(p.id)){if(a==="replace")e.pages[p.id]=p;else if(a==="byUpdateTime"){const c=e.pages[p.id];(!c||p.updatedAt&&p.updatedAt>c.updatedAt)&&(e.pages[p.id]=p)}}else e.pageIds.push(p.id),e.pages[p.id]=p}for(const b of u){const p=S[b];if(p)if(e.routeIds.includes(p.id)){if(a==="replace")e.routes[p.id]=p;else if(a==="byUpdateTime"){const c=e.routes[p.id];(!c||p.updatedAt&&p.updatedAt>c.updatedAt)&&(e.routes[p.id]=p)}}else e.routeIds.push(p.id),e.routes[p.id]=p}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...we.default(P)),n)for(const b of Object.keys(e.components))delete e.components[b];let R=JSON.parse(JSON.stringify(t.components));R=Object.fromEntries(await Promise.all(Object.entries(R).map(async([b,p])=>{const c=await Ge(p?.data);return[b,{...p,data:c}]}))),Object.assign(e.components,R),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Ae.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Ge=f.memoizeWithFs(async t=>{if(!Ae.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:s}=t?.renderer||{};if(s||e&&e.includes("PROPERTIES_SCHEMA"))try{const a=await f.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,s);a&&a.length>0&&t&&(t.properties={},a.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(a){f.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let ae,J,oe,re;const Ve=()=>Ee.getResources({types:[{did:je,type:me},{did:Pt,type:me}]}),Vt=()=>{const t=Ve(),e={};return t.forEach(s=>{const a=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const r of o)e[r]=g.join(n,r)}}),e};function ze(){return ae=(async()=>{const t=Ve();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 Ge(a.component);return[s,{...a,component:n}]})))})(),ae}function Ye(t){const e=Me.default(async()=>{await ze().catch(s=>{f.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 He=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Ke=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),ie=globalThis;ie[He]?.();ie[He]=Ye(async({pages:t,components:e})=>{const s=await A.getProjectIds();f.logger.info(`start update resource states projects(${s.length})`,s),await Promise.race([new Promise(a=>{setTimeout(()=>{a({})},30*1e3)}),Promise.all(s.map(async a=>{Je({projectId:a,pages:t,components:e})}))]).catch(a=>{f.logger.error("update resource states failed:",a)})});ie[Ke]?.();ie[Ke]=()=>{const t=()=>{A.pageUrlMapCache.clear(),f.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return w.default.events.on(w.default.Events.envUpdate,t),()=>{w.default.events.off(w.default.Events.envUpdate,t)}};A.startPeriodicCheck();process.on("beforeExit",()=>{A.stopPeriodicCheck()});process.on("SIGINT",()=>{A.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{A.stopPeriodicCheck(),process.exit(0)});async function Je({projectId:t,pages:e,components:s}){const a=A.sharedInstances[t];if(!a){f.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(a.syncedStore.resources.pages=e,(await L.findByPk(t))?.useAllResources)a.syncedStore.resources.components=s;else{const r=(await Oe.findAll({where:{projectId:t}})).map(u=>u.componentId),l=Object.fromEntries(Object.entries(s||{}).filter(([u])=>r.includes(u)));a.syncedStore.resources.components=l}f.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function We(t){return Je({projectId:t,pages:oe,components:re})}async function zt(){f.logger.info("trigger reload all project resource"),w.default.events.emit(he)}async function Yt({ensureLoaded:t=!0}={}){return t&&(ae??=ze(),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=A;exports.downloadAsset=Fe;exports.downloadAssets=qe;exports.fromPackage=Ce;exports.getDefaultState=Ne;exports.getResourceStates=Yt;exports.initPackResourceStates=Ye;exports.mergeState=Ie;exports.toPackage=Be;exports.triggerReloadAllProjectResource=zt;exports.updateResourceStatesByProjectId=We;
@@ -1 +1 @@
1
- "use strict";const g=require("./chunks/components-DLLpFRy5.js"),c=require("./chunks/site-state-C4FmDvzQ.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),G=require("@blocklet/sdk/lib/middlewares/auth"),K=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(L),f=m(J),C=m(X),Y=m(W),D=m(B),k=m(G),$=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(g.isMultiTenant()){const P=n.createdBy===r,y=g.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!P&&!y)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(a))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){g.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}};function b(e,t){return new Promise((o,s)=>{const n=u.default.createReadStream(e),r=u.default.createWriteStream(t);n.on("error",s),r.on("error",s),r.on("finish",o),n.pipe(r)})}async function N(e,t){await u.default.promises.mkdir(t,{recursive:!0});const o=await u.default.promises.readdir(e,{withFileTypes:!0});for(const s of o){const n=D.default.join(e,s.name),r=D.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>g.isMultiTenant()?k.default()(e,t,o):k.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=K.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=F.Router(),T="@page",U="@component",j=":",R="ALL",q="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===U)return{componentId:s,projectId:o}},Z=e=>[q,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===q)return o},te=e=>{try{return JSON.parse(e)}catch{}return{}};async function A(e){const t=await c.SiteState.getStateByProjectId(e,"production"),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const a=t.pages[r];if(a)return{id:v({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=Y.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:x({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Z(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:x({componentId:R,projectId:e}),name:"Components",children:n}]}}w.get("/resources",h,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await $(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const oe=f.default.object({projectId:f.default.string().required().min(1),releaseId:f.default.string().allow(""),resources:f.default.array().items(f.default.string()).required(),locale:f.default.string().allow("")});w.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:_}=Q(i)||{};if(d)d===R||d&&_&&a.push({pageId:d,projectId:_});else{const{componentId:I,projectId:p}=V(i)||{};I===R||I&&p&&P.push({componentId:I,projectId:p})}}const y=C.default(a,"projectId"),O=C.default(P,"projectId"),M=new Set([...Object.keys(y),...Object.keys(O)]),E=H(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of M){const d=await c.SiteState.getStateByProjectId(i,r),_=y[i],I=O[i],p=_?.map(l=>l.pageId),S=I?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await z(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}g.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});w.get("/all-resources",h,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=w;
1
+ "use strict";const g=require("./chunks/components-DLLpFRy5.js"),c=require("./chunks/site-state-CaWZo_HF.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),G=require("@blocklet/sdk/lib/middlewares/auth"),K=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(L),f=m(J),C=m(X),Y=m(W),D=m(B),k=m(G),$=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(g.isMultiTenant()){const P=n.createdBy===r,y=g.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!P&&!y)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(a))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){g.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}};function b(e,t){return new Promise((o,s)=>{const n=u.default.createReadStream(e),r=u.default.createWriteStream(t);n.on("error",s),r.on("error",s),r.on("finish",o),n.pipe(r)})}async function N(e,t){await u.default.promises.mkdir(t,{recursive:!0});const o=await u.default.promises.readdir(e,{withFileTypes:!0});for(const s of o){const n=D.default.join(e,s.name),r=D.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>g.isMultiTenant()?k.default()(e,t,o):k.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=K.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=F.Router(),T="@page",U="@component",j=":",R="ALL",q="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===U)return{componentId:s,projectId:o}},Z=e=>[q,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===q)return o},te=e=>{try{return JSON.parse(e)}catch{}return{}};async function A(e){const t=await c.SiteState.getStateByProjectId(e,"production"),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const a=t.pages[r];if(a)return{id:v({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=Y.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:x({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Z(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:x({componentId:R,projectId:e}),name:"Components",children:n}]}}w.get("/resources",h,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await $(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const oe=f.default.object({projectId:f.default.string().required().min(1),releaseId:f.default.string().allow(""),resources:f.default.array().items(f.default.string()).required(),locale:f.default.string().allow("")});w.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:_}=Q(i)||{};if(d)d===R||d&&_&&a.push({pageId:d,projectId:_});else{const{componentId:I,projectId:p}=V(i)||{};I===R||I&&p&&P.push({componentId:I,projectId:p})}}const y=C.default(a,"projectId"),O=C.default(P,"projectId"),M=new Set([...Object.keys(y),...Object.keys(O)]),E=H(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of M){const d=await c.SiteState.getStateByProjectId(i,r),_=y[i],I=O[i],p=_?.map(l=>l.pageId),S=I?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await z(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}g.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});w.get("/all-resources",h,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=w;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-DLLpFRy5.js");const e=require("./chunks/site-state-C4FmDvzQ.js"),u=require("@blocklet/pages-kit/utils/common");require("@blocklet/pages-kit/utils/page-model");require("@blocklet/pages-kit/utils/property");require("@blocklet/pages-kit/utils/route");require("@blocklet/sdk/lib/component");require("@blocklet/sdk/lib/config");require("@reactivedata/reactive");require("@syncedstore/core");require("fs");require("glob");require("lib0/decoding");require("lib0/encoding");require("lodash/cloneDeep");require("lodash/debounce");require("lodash/get");require("lodash/isEmpty");require("lodash/set");require("lodash/union");require("lru-cache");require("p-limit");require("path");require("sequelize");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");const t=require("@blocklet/pages-kit/types/state");exports.PUBLISH_MODES=e.PUBLISH_MODES;exports.SITE_STATE_PATH=e.SITE_STATE_PATH;exports.STATE_MODES=e.STATE_MODES;exports.default=e.SiteState;exports.downloadAsset=e.downloadAsset;exports.downloadAssets=e.downloadAssets;exports.fromPackage=e.fromPackage;exports.getDefaultState=e.getDefaultState;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;exports.updateResourceStatesByProjectId=e.updateResourceStatesByProjectId;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-DLLpFRy5.js");const e=require("./chunks/site-state-CaWZo_HF.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]})});
@@ -22,7 +22,7 @@ import je from "lodash/set";
22
22
  import yt from "lodash/union";
23
23
  import { LRUCache as Ae } from "lru-cache";
24
24
  import St from "p-limit";
25
- import { DataTypes as j, Sequelize as It, Model as xe, Op as Be } from "sequelize";
25
+ import { DataTypes as R, Sequelize as It, Model as xe, Op as Be } from "sequelize";
26
26
  import { pipeline as Et } from "stream/promises";
27
27
  import { x as bt } from "tar";
28
28
  import { withoutTrailingSlash as Ge, withLeadingSlash as wt, joinURL as Y } from "ufo";
@@ -33,8 +33,8 @@ import * as G from "yaml";
33
33
  import { m as Te } from "./html-DOgzvdOd.js";
34
34
  import "sqlite3";
35
35
  import "@blocklet/pages-kit/types/state";
36
- const Dt = j.sqlite.DATE.parse;
37
- j.sqlite.DATE.parse = (t, e) => typeof t == "number" ? new Date(t) : Dt(t, e);
36
+ const Dt = R.sqlite.DATE.parse;
37
+ R.sqlite.DATE.parse = (t, e) => typeof t == "number" ? new Date(t) : Dt(t, e);
38
38
  const _ = new It({
39
39
  dialect: "sqlite",
40
40
  storage: Ne,
@@ -89,17 +89,17 @@ class Pe extends xe {
89
89
  Pe.init(
90
90
  {
91
91
  id: {
92
- type: j.UUID,
92
+ type: R.UUID,
93
93
  allowNull: !1,
94
94
  primaryKey: !0,
95
- defaultValue: j.UUIDV4
95
+ defaultValue: R.UUIDV4
96
96
  },
97
97
  projectId: {
98
- type: j.UUID,
98
+ type: R.UUID,
99
99
  allowNull: !1
100
100
  },
101
101
  componentId: {
102
- type: j.STRING,
102
+ type: R.STRING,
103
103
  allowNull: !1
104
104
  }
105
105
  },
@@ -179,32 +179,32 @@ class U extends xe {
179
179
  U.init(
180
180
  {
181
181
  id: {
182
- type: j.UUID,
183
- defaultValue: j.UUIDV4,
182
+ type: R.UUID,
183
+ defaultValue: R.UUIDV4,
184
184
  primaryKey: !0
185
185
  },
186
186
  name: {
187
- type: j.STRING,
187
+ type: R.STRING,
188
188
  allowNull: !1
189
189
  },
190
- description: j.TEXT,
191
- createdAt: j.DATE,
192
- updatedAt: j.DATE,
190
+ description: R.TEXT,
191
+ createdAt: R.DATE,
192
+ updatedAt: R.DATE,
193
193
  createdBy: {
194
- type: j.STRING,
194
+ type: R.STRING,
195
195
  allowNull: !1
196
196
  },
197
197
  updatedBy: {
198
- type: j.STRING,
198
+ type: R.STRING,
199
199
  allowNull: !1
200
200
  },
201
- slug: j.STRING,
202
- icon: j.STRING,
203
- pinnedAt: j.DATE,
204
- useAllResources: j.BOOLEAN,
205
- npmSecret: j.STRING,
201
+ slug: R.STRING,
202
+ icon: R.STRING,
203
+ pinnedAt: R.DATE,
204
+ useAllResources: R.BOOLEAN,
205
+ npmSecret: R.STRING,
206
206
  relatedBlocklets: {
207
- type: j.JSON,
207
+ type: R.JSON,
208
208
  allowNull: !1,
209
209
  defaultValue: {},
210
210
  get() {
@@ -226,7 +226,7 @@ U.init(
226
226
  }
227
227
  },
228
228
  productionState: {
229
- type: j.JSON,
229
+ type: R.JSON,
230
230
  allowNull: !1,
231
231
  defaultValue: {},
232
232
  get() {
@@ -246,6 +246,10 @@ U.init(
246
246
  f.error("Failed to set productionState", { error: e, value: t }), this.setDataValue("productionState", "{}");
247
247
  }
248
248
  }
249
+ },
250
+ meta: {
251
+ type: R.JSON,
252
+ allowNull: !0
249
253
  }
250
254
  },
251
255
  { sequelize: _, paranoid: !0 }
@@ -740,7 +744,7 @@ class O extends N.Doc {
740
744
  });
741
745
  await Promise.all(
742
746
  r?.map(async (n) => {
743
- const l = n.id, p = n.slug || l, y = {}, w = e === "production" && n?.productionState ? n.productionState : await O.getStateByProjectId(n.id, e), R = yt(
747
+ const l = n.id, p = n.slug || l, y = {}, w = e === "production" && n?.productionState ? n.productionState : await O.getStateByProjectId(n.id, e), j = yt(
744
748
  E.env.languages?.map((u) => u.code) || [],
745
749
  w.supportedLocales?.map((u) => u.locale) || []
746
750
  ), I = (u, c) => {
@@ -753,7 +757,7 @@ class O extends N.Doc {
753
757
  shouldRedirect: !0,
754
758
  mainPage: !0
755
759
  };
756
- for (const g of R) {
760
+ for (const g of j) {
757
761
  const C = { ...c, locale: g };
758
762
  y[Y("/", g, l, u)] = C, p && (y[Y("/", g, p, u)] = C);
759
763
  }
@@ -781,8 +785,8 @@ class O extends N.Doc {
781
785
  pageId: c.displayTemplateId || "",
782
786
  routeId: u,
783
787
  // default locale
784
- defaultLocale: R?.[0],
785
- locales: R,
788
+ defaultLocale: j?.[0],
789
+ locales: j,
786
790
  publishedAt: w.config.publishedAt,
787
791
  isPublic: c.isPublic && d?.routeMetaData?.isPublic
788
792
  };
@@ -796,8 +800,8 @@ class O extends N.Doc {
796
800
  pageId: c.displayTemplateId || "",
797
801
  routeId: u,
798
802
  // default locale
799
- defaultLocale: R?.[0],
800
- locales: R,
803
+ defaultLocale: j?.[0],
804
+ locales: j,
801
805
  publishedAt: w.config.publishedAt,
802
806
  isPublic: c.isPublic
803
807
  };
@@ -813,8 +817,8 @@ class O extends N.Doc {
813
817
  pageSlug: g,
814
818
  pageId: u,
815
819
  // default locale
816
- defaultLocale: R?.[0],
817
- locales: R,
820
+ defaultLocale: j?.[0],
821
+ locales: j,
818
822
  publishedAt: w.config.publishedAt,
819
823
  isPublic: c.isPublic,
820
824
  templateConfig: c.templateConfig
@@ -948,12 +952,12 @@ async function $e(t, e, s) {
948
952
  try {
949
953
  const p = be(t, l), y = Ke(p);
950
954
  for (const w of y) {
951
- const R = k(w), I = s.getFilePath(w, l), u = I ? `${I}:${R}` : R, c = Se.get(u);
955
+ const j = k(w), I = s.getFilePath(w, l), u = I ? `${I}:${j}` : j, c = Se.get(u);
952
956
  if (c) {
953
957
  X.test(p) || je(t, l, c);
954
958
  return;
955
959
  }
956
- const g = await Qt(I, R, e);
960
+ const g = await Qt(I, j, e);
957
961
  g && (X.test(p) || je(t, l, g), Se.set(u, g));
958
962
  }
959
963
  } catch (p) {
@@ -997,7 +1001,7 @@ async function ts(t, {
997
1001
  ) : void 0
998
1002
  /** @deprecated 已经废弃,数据在 page.dataSource 中管理 */
999
1003
  // properties: section.locales?.[locale] ?? {},
1000
- }), R = (i, S) => ({
1004
+ }), j = (i, S) => ({
1001
1005
  id: i.id,
1002
1006
  createdAt: i.createdAt,
1003
1007
  updatedAt: i.updatedAt,
@@ -1039,7 +1043,7 @@ async function ts(t, {
1039
1043
  return v && {
1040
1044
  locale: i,
1041
1045
  slug: v.slug,
1042
- page: R(v, i)
1046
+ page: j(v, i)
1043
1047
  };
1044
1048
  })
1045
1049
  )
@@ -1153,7 +1157,7 @@ async function qe(t, { importAssets: e, includeResources: s } = {}) {
1153
1157
  const y = G.parse(J(r).toString()), w = (m, d, h) => {
1154
1158
  let A = b(m, `${d}${h ? `.${h}` : ""}.yml`);
1155
1159
  return (!M(A) || !B(A).isFile()) && (A = b(m, d, `index${h ? `.${h}` : ""}.yml`), !M(A) || !B(A)) ? null : G.parse(J(A).toString());
1156
- }, R = (m, d) => {
1160
+ }, j = (m, d) => {
1157
1161
  try {
1158
1162
  const h = se(`*.${d}.yml`, { cwd: m, absolute: !0 })[0];
1159
1163
  return h ? G.parse(J(h).toString()) : null;
@@ -1235,7 +1239,7 @@ async function qe(t, { importAssets: e, includeResources: s } = {}) {
1235
1239
  dataSource: d?.dataSource ?? {}
1236
1240
  };
1237
1241
  }) ?? []
1238
- ), g = l ? T(y.components?.map(({ id: m }) => R(l, m)) ?? []) : [];
1242
+ ), g = l ? T(y.components?.map(({ id: m }) => j(l, m)) ?? []) : [];
1239
1243
  if (e) {
1240
1244
  const m = (...d) => {
1241
1245
  f.info(`[${a ? k(t) : k(b(t, "../../../../"))}] importAssets:`, ...d);
@@ -1270,7 +1274,7 @@ async function qe(t, { importAssets: e, includeResources: s } = {}) {
1270
1274
  const C = {};
1271
1275
  if (s) {
1272
1276
  const m = r && b(L(r), "../../resources/components"), d = T(
1273
- y.resources?.components?.map(({ id: h }) => R(m, h)) ?? []
1277
+ y.resources?.components?.map(({ id: h }) => j(m, h)) ?? []
1274
1278
  );
1275
1279
  d.length > 0 && (C.components = Object.fromEntries(
1276
1280
  d.map((h, A) => [h.id, { index: A, component: h }])
@@ -1414,10 +1418,10 @@ async function Me(t, e, {
1414
1418
  if (e.supportedLocales.splice(0, e.supportedLocales.length), e.supportedLocales.push(...Ee(w)), a)
1415
1419
  for (const I of Object.keys(e.components))
1416
1420
  delete e.components[I];
1417
- let R = JSON.parse(JSON.stringify(t.components));
1418
- R = Object.fromEntries(
1421
+ let j = JSON.parse(JSON.stringify(t.components));
1422
+ j = Object.fromEntries(
1419
1423
  await Promise.all(
1420
- Object.entries(R).map(async ([I, u]) => {
1424
+ Object.entries(j).map(async ([I, u]) => {
1421
1425
  const c = await He(u?.data);
1422
1426
  return [
1423
1427
  I,
@@ -1428,7 +1432,7 @@ async function Me(t, e, {
1428
1432
  ];
1429
1433
  })
1430
1434
  )
1431
- ), Object.assign(e.components, R), Object.assign(e.config, JSON.parse(JSON.stringify(t.config))), we(t.resources.components) || (e.resources.components = JSON.parse(JSON.stringify(t.resources.components || {})));
1435
+ ), Object.assign(e.components, j), Object.assign(e.config, JSON.parse(JSON.stringify(t.config))), we(t.resources.components) || (e.resources.components = JSON.parse(JSON.stringify(t.resources.components || {})));
1432
1436
  }
1433
1437
  const He = st(
1434
1438
  async (t) => {
@@ -1,5 +1,5 @@
1
1
  import { i as A, a as M, l as b } from "./chunks/components-DLwSTd_N.js";
2
- import { P as w, C as J, R as X, S as x, t as W, g as G } from "./chunks/site-state-CRFBIuin.js";
2
+ import { P as w, C as J, R as X, S as x, t as W, g as G } from "./chunks/site-state-tBjPpz08.js";
3
3
  import { Router as K } from "express";
4
4
  import a from "fs";
5
5
  import m from "joi";
@@ -1,5 +1,5 @@
1
1
  import "./chunks/components-DLwSTd_N.js";
2
- import { c as O, a as b, b as h, S as y, e as L, f as U, h as q, d as v, g as z, i as C, m as F, t as G, j as J, u as K } from "./chunks/site-state-CRFBIuin.js";
2
+ import { c as O, a as b, b as h, S as y, e as L, f as U, h as q, d as v, g as z, i as C, m as F, t as G, j as J, u as K } from "./chunks/site-state-tBjPpz08.js";
3
3
  import { nextId as Q } from "@blocklet/pages-kit/utils/common";
4
4
  import "@blocklet/pages-kit/utils/page-model";
5
5
  import "@blocklet/pages-kit/utils/property";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/pages-kit-inner-components",
3
- "version": "0.6.92",
3
+ "version": "0.6.94",
4
4
  "description": "Pages Kit inner components library",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -201,8 +201,8 @@
201
201
  "yaml": "^2.5.0",
202
202
  "yjs": "^13.6.18",
203
203
  "zustand": "^4.5.5",
204
- "@blocklet/pages-kit": "^0.6.92",
205
- "@blocklet/pages-kit-block-studio": "^0.6.92"
204
+ "@blocklet/pages-kit": "^0.6.94",
205
+ "@blocklet/pages-kit-block-studio": "^0.6.94"
206
206
  },
207
207
  "devDependencies": {
208
208
  "@trivago/prettier-plugin-sort-imports": "^5.2.1",
@@ -1 +0,0 @@
1
- "use strict";const f=require("./components-DLLpFRy5.js"),q=require("@syncedstore/core"),Qe=require("yjs"),Ze=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),et=require("lodash/cloneDeep"),tt=require("@blocklet/sdk/lib/config"),I=require("fs"),g=require("path"),Re=require("@blocklet/pages-kit/utils/common"),st=require("@blocklet/pages-kit/utils/page-model"),at=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),nt=require("@reactivedata/reactive"),Z=require("glob"),ot=require("lib0/decoding"),rt=require("lib0/encoding"),it=require("lodash/debounce"),ct=require("lodash/get"),lt=require("lodash/isEmpty"),ut=require("lodash/set"),pt=require("lodash/union"),be=require("lru-cache"),dt=require("p-limit"),T=require("sequelize"),ft=require("stream/promises"),gt=require("tar"),F=require("ufo"),mt=require("wait-on"),z=require("y-protocols/awareness"),ue=require("y-protocols/sync"),ht=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 U=ne(Qe),we=$(et),w=$(tt),pe=ne(ot),v=ne(rt),Me=$(it),Pe=$(ct),Ae=$(lt),ke=$(ut),yt=$(pt),St=$(dt),It=$(mt),B=ne(ht),Et=T.DataTypes.sqlite.DATE.parse;T.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Et(t,e);const M=new T.Sequelize({dialect:"sqlite",storage:f.databaseUrl,benchmark:process.env.ENABLE_SEQUELIZE_BENCHMARK==="true",retry:{match:[/SQLITE_BUSY/],name:"query",max:10},logging:process.env.ENABLE_SEQUELIZE_LOGGING==="true"?console.log:!1});M.query("pragma journal_mode = WAL;");M.query("pragma synchronous = normal;");M.query("pragma journal_size_limit = 33554432;");M.query("pragma cache_size = -2000;");M.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await M.close(),process.exit(0)});process.on("SIGTERM",async()=>{await M.close(),process.exit(0)});async function 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()=>{f.logger.info("Start cleanupSqliteMemory"),await bt(M,f.databaseUrl),f.logger.info("End cleanupSqliteMemory")},60*1e3*10);const wt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",me="page",he="trigger-reload-project-resource",je=wt,Pt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",At="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class Oe extends T.Model{}Oe.init({id:{type:T.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:T.DataTypes.UUIDV4},projectId:{type:T.DataTypes.UUID,allowNull:!1},componentId:{type:T.DataTypes.STRING,allowNull:!1}},{sequelize:M,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=F.withoutTrailingSlash(t);return F.withLeadingSlash(e)||"/"},Dt=t=>t.did===At;class L extends T.Model{static async getProjectByIdOrSlug(e,s){return e?L.findOne({where:{[T.Op.or]:[{id:e},{slug:e}],...s?.createdBy?{createdBy:s.createdBy}:{}},paranoid:!1}):null}static async validateProjectSlug({slug:e,projectId:s}){if(e==null)return null;if(e==="")return Ot;const a=Le(e);if(e!=="/"&&e.endsWith("/"))return Y(r=>`Project slug "${r}" cannot end with /`);if(/\/{2,}/.test(e))return Y(r=>`Project slug "${r}" cannot contain consecutive /`);if(/\s/.test(e))return Y(r=>`Project slug "${r}" cannot contain whitespace`);if(Ct.some(r=>r.test(e)))return Y(r=>`Project slug "${r}" contains invalid characters`);if(w.default.components?.filter(r=>r.mountPoint&&!Dt(r)).some(r=>Le(r.mountPoint)===a))return Y(r=>`Project slug "${r}" conflicts with existing blocklet`);const o=await L.findOne({where:{slug:`${e}`}});return o&&o?.id!==s?Tt:null}}L.init({id:{type:T.DataTypes.UUID,defaultValue:T.DataTypes.UUIDV4,primaryKey:!0},name:{type:T.DataTypes.STRING,allowNull:!1},description:T.DataTypes.TEXT,createdAt:T.DataTypes.DATE,updatedAt:T.DataTypes.DATE,createdBy:{type:T.DataTypes.STRING,allowNull:!1},updatedBy:{type:T.DataTypes.STRING,allowNull:!1},slug:T.DataTypes.STRING,icon:T.DataTypes.STRING,pinnedAt:T.DataTypes.DATE,useAllResources:T.DataTypes.BOOLEAN,npmSecret:T.DataTypes.STRING,relatedBlocklets:{type:T.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return f.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:T.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return f.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){f.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}}},{sequelize:M,paranoid:!0});L.hasMany(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 $e(){return I.mkdtempSync(g.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 U.Map&&ee(a)});const e=q.getYjsValue(t.pages);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.pages[n]);o&&o instanceof U.Map&&ee(o)}})})}function vt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=q.getYjsValue(t.routes?.[s]);a&&a instanceof U.Map&&ee(a)});const e=q.getYjsValue(t.routes);e&&e instanceof U.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.routes?.[n]);o&&o instanceof U.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,...r]=s.split("-");a=o,n=r||[]}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 r=Q.getRouteMetaDataByOptionIds(n,o);r&&(r.publishedAt=new Date().toISOString())}if(!e){const r=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const l of r)l.routeMetaData??={},l.routeMetaData.publishedAt=new Date().toISOString()}}}}function de({page:t,route:e,state:s,routeId:a,routePathInfo:n}){f.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...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 r of s.supportedLocales){if(e.dataSource){let l=e.id;n&&(l=n.paramOptionIds.join("-"));const u=e.dataSource.pathDataMappings?.[l]?.dataCache?.[r.locale]??e.dataSource.pathDataMappings?.[l]?.dataCache?.[s.config.defaultLocale||"en"];if(!u)continue;Ze.setPageDataSource(o,s,r.locale,u)}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:100,ttl:Lt,ttlResolution:10*1e3,allowStale:!0});function _t(t,e=[]){let s=0;const a=Array.from(H.keys()),n=t.map(o=>F.withoutTrailingSlash(o));for(const o of a)for(const r of n){if(ve.matchCacheKey(o,{currentPath:r})){H.delete(o),s++,f.logger.info(`[Cache CLEAR] key: ${o}`);break}for(const l of e)if(ve.matchCacheKey(o,{currentPath:`/${l}${r}`})){H.delete(o),s++,f.logger.info(`[Cache CLEAR] key: ${o}`);break}}return f.logger.info(`[Cache CLEAR] cleared ${s} entries for paths:`,n),s}function Ut(){const t=H.size;return H.clear(),f.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=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),xt=["production","draft"],Bt=["production"];function se(t){return t?.replace(/\//g,"|")||""}function Ne(){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 A extends U.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&U.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=nt.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:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(x,e),a=g.join(x,`@del-${e}`);I.renameSync(s,a)}catch(s){f.logger.error("Failed to safe delete project state dir:",s)}}static async getProjectIds(){return(await L.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return Z.globSync("*/",{cwd:x,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>A.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=A.sharedInstances[e];return s||(s=new A({path:g.join(x,e)}),A.sharedInstances[e]=s,s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(Ae.default(s?.productionState)){const a=g.join(x,e,"production"),n=await Ce(a,{includeResources:!0})??Ne();if(!n?.config?.defaultLocale){n.config??={};const o=ye.env.languages?.map(r=>({locale:r.code,name:r.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return s?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((s,a)=>this.closeConn(a)),this.awareness.destroy();const e=g.basename(this.options.path);delete A.sharedInstances[e],super.destroy()}initObserver(){Rt(this.syncedStore),vt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=A.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return A.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return A.getProductionState(s)}async setState(e,s){const a=await Be(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(g.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);A.pageUrlMapCache.delete(o);const r=we.default(s);await L.update({productionState:r},{where:{id:o}})}}getPublishDir(e){return g.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:s,removed:a},n)=>{const o=e.concat(s,a);if(n!==null){const u=this.conns.get(n);u&&(e.forEach(S=>{u.add(S)}),a.forEach(S=>{u.delete(S)}))}const r=v.createEncoder();v.writeVarUint(r,fe),v.writeVarUint8Array(r,z.encodeAwarenessUpdate(this.awareness,o));const l=v.toUint8Array(r);this.conns.forEach((u,S)=>this.send(S,l))};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:r}=this.syncedStore;{const l=new Set(Object.keys(s));let u=0;for(;u<a.length;){const S=a[u];l.has(S)?(l.delete(S),u++):a.splice(u,1)}}{const l=new Set(Object.keys(o));let u=0;for(;u<r.length;){const S=r[u];l.has(S)?(l.delete(S),u++):r.splice(u,1)}}e.splice(0,e.length),e.push(...ye.env.languages.map(l=>({locale:l.code,name:l.name}))),n.defaultLocale=e[0]?.locale;{let l=0;const u=new Set;for(;l<e.length;){const{locale:S}=e[l];u.has(S)?e.splice(l,1):(l++,u.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=g.basename(this.options.path);this.releaseTimer=setTimeout(()=>{f.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},A.RELEASE_DELAY),f.logger.info(`[SiteState] scheduled release for project ${e} in ${A.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=g.basename(this.options.path);f.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Me.default(()=>{I.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,U.encodeStateAsUpdate(this))},$t);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=g.basename(this.options.path);await We(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((r,l)=>{this.transact(async()=>{try{const u=await Ie(e,s);r(u)}catch(u){l(u)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;let r=e;(!r||r.length===0)&&(r=s.pageIds??[]),f.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,r||[]);const l=s.supportedLocales.map(P=>P.locale),u=[],S=r.filter(P=>s.pageIds?.includes(P));for(const P of S){const b=s.pages[P].slug;o&&o!==a&&(o==="/"?u.push(b):u.push(`/${o}${b}`)),u.push(`/${a}${b}`)}if(u.length>0)try{const P=_t(u,l);f.logger.info(`[SiteState] cleared ${P} page cache entries for project ${a}, routes:`,r)}catch{}A.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 r=v.createEncoder();v.writeVarUint(r,fe),v.writeVarUint8Array(r,z.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,v.toUint8Array(r))}}};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:f.logger.warn(`Unsupported messageType ${o}`)}}catch(a){f.logger.error(a)}this.save()};static async pageUrlMap(e,s){let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(r=>[r,!0])||[]);for(const r of a){const l=A.pageUrlMapCache.get(r);l&&(n={...n,...l},o.delete(r))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[T.Op.in]:a}}});await Promise.all(o?.map(async r=>{const l=r.id,u=r.slug||l,S={},P=e==="production"&&r?.productionState?r.productionState:await A.getStateByProjectId(r.id,e),R=yt.default(w.default.env.languages?.map(p=>p.code)||[],P.supportedLocales?.map(p=>p.locale)||[]),b=(p,c)=>{u&&(S[F.joinURL("/",u,p)]={...c,shouldRedirect:!0,mainPage:!0}),S[F.joinURL("/",l,p)]={...c,shouldRedirect:!0,mainPage:!0};for(const h of R){const C={...c,locale:h};S[F.joinURL("/",h,l,p)]=C,u&&(S[F.joinURL("/",h,u,p)]=C)}};if(e==="draft")for(const p of P.routeIds||[]){const c=P?.routes?.[p];if(!c)continue;if(c.params&&c.params.length>0){const m=Q.generateParamCombinations({basePath:c.path,params:c.params,routeId:c.id,paramsOptions:c.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const d of m){const y=d.path,j={projectId:l,projectSlug:u,pageSlug:y,pageId:c.displayTemplateId||"",routeId:p,defaultLocale:R?.[0],locales:R,publishedAt:P.config.publishedAt,isPublic:c.isPublic&&d?.routeMetaData?.isPublic};b(y,j)}}const h=c.path,C={projectId:l,projectSlug:u,pageSlug:h,pageId:c.displayTemplateId||"",routeId:p,defaultLocale:R?.[0],locales:R,publishedAt:P.config.publishedAt,isPublic:c.isPublic};b(h,C)}for(const p of P.pageIds||[]){const c=P.pages[p];if(!c||e==="production"&&!c.isPublic)continue;const h=c.slug,C=r.slug||l,m={projectId:l,projectSlug:C,pageSlug:h,pageId:p,defaultLocale:R?.[0],locales:R,publishedAt:P.config.publishedAt,isPublic:c.isPublic,templateConfig:c.templateConfig};b(h,m)}e==="production"&&A.pageUrlMapCache.set(l,S),n={...n,...S}}))}return n}getDocumentSize(){return U.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(A.sharedInstances)){const n=a.getDocumentSize();e.push({projectId:s,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:a.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),f.logger.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,f.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(A.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(A.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(f.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){f.logger.info(`[SiteState] releasing ${s.length} instances without connections:`,s.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:r}of s)try{f.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),r.destroy(),n++}catch(l){f.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,l)}f.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?f.logger.debug("[SiteState] periodic check: all instances have active connections"):f.logger.debug("[SiteState] periodic check: no instances exist")}}async function 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 f.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const Fe=async(t,e)=>{const s=g.basename(t),a=await Ee.call({name:je,path:F.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await ft.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},qe=async(t,e)=>{await Promise.all(t.map(async s=>{try{await Fe(s,g.join(e,g.basename(s)))}catch(a){f.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function xe(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=g.join(e,a(t));if(I.mkdirSync(g.dirname(o),{recursive:!0}),I.writeFileSync(o,B.stringify(t)),n){const l=te(t,u=>typeof u=="string"&&(Te.test(u)||K.test(u))).map(u=>{const S=Pe.default(t,u);return xe(S)}).flat().filter(Boolean);await qe(l,g.dirname(o))}}const Se=new be.LRUCache({max:100,ttl:1*60*1e3});async function Ue(t,e,s){const a=te(t,l=>typeof l=="string"&&(Te.test(l)||K.test(l))),n=St.default(2),o=a.map(l=>n(async()=>{try{const u=Pe.default(t,l),S=xe(u);for(const P of S){const R=g.basename(P),b=s.getFilePath(P,l),p=b?`${b}:${R}`:R,c=Se.get(p);if(c){K.test(u)||ke.default(t,l,c);return}const h=await Gt(b,R,e);h&&(K.test(u)||ke.default(t,l,h),Se.set(p,h))}}catch(u){f.logger.error(`Failed to process upload for path ${l.join(".")}:`,u.message||u.reason)}})),r=await Promise.allSettled(o);s.onFinish?.(r)}async function Be(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:r="all"}={}){const l=s==="all"?t.pageIds:s,u=at.getComponentDependencies({state:t,pageIds:l,componentIds:a==="all"?Object.keys(t.components):a});Object.entries(t.components).forEach(([i,E])=>{E.data?.renderer?.type==="component-template"&&u.push(i)});const S=r==="all"?t.routeIds:r,P=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(E=>{const D=i.sections?.[E];return D&&P(D)})):void 0}),R=(i,E)=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,meta:i.locales?.[E]??{},sections:k(i.sectionIds.map(D=>{const N=i.sections[D];return N&&P(N)})),dataSource:Object.fromEntries(Object.entries(i.dataSource||{}).map(([D,N])=>[D,N?.[E]??{}]))}),b=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}),p=k(S.map(i=>{const E=t.routes[i];return E&&b(E)})),c=k(t.supportedLocales.map(i=>i.locale).flatMap(i=>l.map(E=>{const D=t.pages[E];return D&&{locale:i,slug:D.slug,page:R(D,i)}}))),h=$e(),C=g.join(h,"pages");I.mkdirSync(C,{recursive:!0});const m=g.join(h,"components");I.mkdirSync(m,{recursive:!0});const d=g.join(h,"routes");I.mkdirSync(d,{recursive:!0});for(const{locale:i,slug:E,page:D}of c)await X(D,C,{getFilename:()=>`${se(E)||"index"}.${i}.yml`,exportAssets:e});for(const i of p)await X(i,d,{getFilename:()=>`${se(i.path)||"index"}.yml`,exportAssets:e});for(const i of u){const E=t.components[i]?.data;E&&await X(E,m,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const y=g.join(h,".blocklet/pages/pages.config.yml");I.mkdirSync(g.dirname(y),{recursive:!0});const j={pages:k(l.map(i=>{const E=t.pages[i];return E&&{id:i,slug:E.slug}})),routes:k(S.map(i=>{const E=t.routes[i];return E&&{id:i,path:E.path}})),components:k(u.map(i=>{const E=t.components[i]?.data;return E&&{id:i,name:E.name}})),...o?{resources:{components:k(Object.keys(t.resources?.components||{}).filter(i=>u.includes(i)).map(i=>({id:i,name:t.resources?.components?.[i]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};I.writeFileSync(y,B.stringify(j));const O=g.join(h,"config.source.json");if(n&&I.writeFileSync(O,JSON.stringify(n)),o){const i=g.join(h,"resources"),E=g.join(i,"components");I.mkdirSync(E,{recursive:!0});for(const G of Object.keys(t?.resources?.components??{}).filter(_=>u.includes(_))){const _=t.resources?.components?.[G]?.component;_&&await X(_,E,{getFilename:V=>`${V.name||"unnamed"}.${V.id}.yml`,exportAssets:e})}const D=g.join(h,"chunks");I.mkdirSync(D,{recursive:!0});const N=Vt();for(const G of Object.keys(t?.resources?.components??{}).filter(_=>u.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=g.join(D,ce),le=N?.[ce];try{le&&I.existsSync(le)&&!I.existsSync(De)&&I.copyFileSync(le,De)}catch(Xe){f.logger.error(`copy chunk ${ce} error`,Xe.message)}}}}}return h}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=$e(),await gt.x({file:t,C:a}));const o=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),r=o&&g.join(g.dirname(o),"../../pages"),l=o&&g.join(g.dirname(o),"../../components"),u=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const S=B.parse(I.readFileSync(o).toString()),P=(m,d,y)=>{let j=g.join(m,`${d}${y?`.${y}`:""}.yml`);return(!I.existsSync(j)||!I.lstatSync(j).isFile())&&(j=g.join(m,d,`index${y?`.${y}`:""}.yml`),!I.existsSync(j)||!I.lstatSync(j))?null:B.parse(I.readFileSync(j).toString())},R=(m,d)=>{try{const y=Z.globSync(`*.${d}.yml`,{cwd:m,absolute:!0})[0];return y?B.parse(I.readFileSync(y).toString()):null}catch(y){f.logger.error("parse component error",y)}return null},b=(m,d)=>{let y=g.join(m,`${d}.yml`);return(!I.existsSync(y)||!I.lstatSync(y).isFile())&&(y=g.join(m,d,"index.yml"),!I.existsSync(y)||!I.lstatSync(y))?null:B.parse(I.readFileSync(y).toString())},p=k(S.pages.map(({slug:m})=>{const d=k(S.supportedLocales.map(({locale:O})=>{const i=r?P(r,se(m),O):void 0;if(i)return{locale:O,page:i};const E=r?P(r,m,O):void 0;return E&&{locale:O,page:E}})),y=d[0]?.page;if(!y)return null;const j=y.sections.map(st.unzipSection);return{id:y.id||Re.nextId(),createdAt:y.createdAt,updatedAt:y.updatedAt,publishedAt:y.publishedAt,isPublic:y.isPublic??!0,templateConfig:y.templateConfig,slug:m,sections:Object.fromEntries(j.map(O=>[O.id,O])),sectionIds:j.map(O=>O.id),locales:Object.fromEntries(d.map(({locale:O,page:i})=>[O,i.meta])),dataSource:y.dataSource?Object.fromEntries([...new Set(d.flatMap(({page:O})=>Object.keys(O.dataSource??{})))].map(O=>[O,Object.fromEntries(d.map(({locale:i,page:E})=>{const D=E.dataSource?.[O];return[i,D||{}]}))])):Object.fromEntries([...new Set(d.flatMap(({page:O})=>O.sections.map(i=>i.id)))].map(O=>[O,Object.fromEntries(d.map(({locale:i,page:E})=>{const D=E.dataSource?.[O];if(D)return[i,D];const N=E.sections.find(G=>G.id===O);return[i,N?.properties||{}]}))]))}})),c=k(S?.routes?.map(({path:m})=>{const d=u?b(u,se(m)):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??{}}})??[]),h=l?k(S.components?.map(({id:m})=>R(l,m))??[]):[];if(e){const m=(...d)=>{f.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...d)};try{m("wait image-bin api ready"),await It.default({resources:[`${Ee.getComponentWebEndpoint(f.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:j=>j>=200&&j<=500}),m("image-bin api is ready");const d={},y={};m("start to upload assets"),await Promise.allSettled([Ue(h,d,{getFilePath:j=>l&&g.join(l,j),onFinish:j=>{m(`upload ${j.length} component assets`)}}),Ue(p,y,{getFilePath:(j,O)=>{const i=Pe.default(p,O.slice(0,1));return r&&g.join(r,g.dirname(i.slug),j)},onFinish:j=>{m(`upload ${j.length} page assets`)}})]),m("upload assets done"),Se.clear(),global.gc&&global.gc()}catch(d){m("Error during asset import:",d)}}const C={};if(s){const m=o&&g.join(g.dirname(o),"../../resources/components"),d=k(S.resources?.components?.map(({id:y})=>R(m,y))??[]);d.length>0&&(C.components=Object.fromEntries(d.map((y,j)=>[y.id,{index:j,component:y}])))}return{supportedLocales:S.supportedLocales,pageIds:p.map(m=>m.id),components:Object.fromEntries(h.map((m,d)=>[m.id,{index:d,data:m}])),pages:Object.fromEntries(p.map(m=>[m.id,m])),config:S.config||{},resources:C,routeIds:c.map(m=>m.id),routes:Object.fromEntries(c.map(m=>[m.id,m])),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&&f.clearPreloadComponentsCacheByMode(o)}catch(b){f.logger.error("clear preload page cache error",{error:b})}const{pages:r,pageIds:l,routeIds:u,routes:S,supportedLocales:P}=t;if(o==="production"){let b=s??[],p=null;for(const c of u??[]){const h=S?.[c];if(h?.params&&h?.params.length>0&&h?.paramsOptions&&h?.paramsOptions.length>0){const C=Q.generateParamCombinations({basePath:h.path,params:h.params,routeId:h.id,paramsOptions:h.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),m=Object.fromEntries(C.map(d=>[`${c}-${d.paramOptionIds.join("-")}`,d]));p={...p||{},...m},s||(b=[...b,...C.map(d=>`${c}-${d.paramOptionIds.join("-")}`)])}else s||b.push(c)}f.logger.info("routeIds to be published: ",b);for(const c of b){let h=c;if(h.includes("-")){const[d]=h.split("-");h=d}const C=S?.[h];if(!C){const d=e.pageIds.indexOf(h);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[h]);for(const y of e.pageIds)y.includes(`${h}-`)&&(e.pageIds.splice(e.pageIds.indexOf(y),1),delete e.pages[y]);f.logger.info("delete main route page",h);continue}if(c.includes("-")&&!p?.[c]){const d=e.pageIds.indexOf(c);d!==-1&&n&&(e.pageIds.splice(d,1),delete e.pages[c]),f.logger.info("delete page",c);continue}if(!C.displayTemplateId){f.logger.info("no display template",c);continue}const m=r[C.displayTemplateId];if(!m){f.logger.info("no template page",c);continue}if(e.pageIds.includes(c)){if(f.logger.info("has need update page",c),a==="replace")e.pages[c]=de({page:m,route:C,state:t,routeId:c,routePathInfo:p?.[c]}),f.logger.info("replace page",c);else if(a==="byUpdateTime"){const d=e.pages[C.id];(!d||C.updatedAt&&C.updatedAt>d.updatedAt)&&(e.pages[c]=de({page:m,route:C,state:t,routeId:c,routePathInfo:p?.[c]}),f.logger.info("replace page by update time",c))}}else e.pageIds.push(c),e.pages[c]=de({page:m,route:C,state:t,routeId:c,routePathInfo:p?.[c]}),f.logger.info("add page",c)}if(n&&!s)for(const c of e.pageIds)b?.includes(c)||(delete e.pages[c],f.logger.info("delete page",c)),e.pageIds=[...e.pageIds].filter(h=>b?.includes(h))}else{for(const b of l){const p=r[b];if(p)if(e.pageIds.includes(p.id)){if(a==="replace")e.pages[p.id]=p;else if(a==="byUpdateTime"){const c=e.pages[p.id];(!c||p.updatedAt&&p.updatedAt>c.updatedAt)&&(e.pages[p.id]=p)}}else e.pageIds.push(p.id),e.pages[p.id]=p}for(const b of u){const p=S[b];if(p)if(e.routeIds.includes(p.id)){if(a==="replace")e.routes[p.id]=p;else if(a==="byUpdateTime"){const c=e.routes[p.id];(!c||p.updatedAt&&p.updatedAt>c.updatedAt)&&(e.routes[p.id]=p)}}else e.routeIds.push(p.id),e.routes[p.id]=p}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...we.default(P)),n)for(const b of Object.keys(e.components))delete e.components[b];let R=JSON.parse(JSON.stringify(t.components));R=Object.fromEntries(await Promise.all(Object.entries(R).map(async([b,p])=>{const c=await Ge(p?.data);return[b,{...p,data:c}]}))),Object.assign(e.components,R),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Ae.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Ge=f.memoizeWithFs(async t=>{if(!Ae.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:s}=t?.renderer||{};if(s||e&&e.includes("PROPERTIES_SCHEMA"))try{const a=await f.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,s);a&&a.length>0&&t&&(t.properties={},a.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(a){f.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let ae,J,oe,re;const Ve=()=>Ee.getResources({types:[{did:je,type:me},{did:Pt,type:me}]}),Vt=()=>{const t=Ve(),e={};return t.forEach(s=>{const a=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const r of o)e[r]=g.join(n,r)}}),e};function ze(){return ae=(async()=>{const t=Ve();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 Ge(a.component);return[s,{...a,component:n}]})))})(),ae}function Ye(t){const e=Me.default(async()=>{await ze().catch(s=>{f.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 He=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Ke=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),ie=globalThis;ie[He]?.();ie[He]=Ye(async({pages:t,components:e})=>{const s=await A.getProjectIds();f.logger.info(`start update resource states projects(${s.length})`,s),await Promise.race([new Promise(a=>{setTimeout(()=>{a({})},30*1e3)}),Promise.all(s.map(async a=>{Je({projectId:a,pages:t,components:e})}))]).catch(a=>{f.logger.error("update resource states failed:",a)})});ie[Ke]?.();ie[Ke]=()=>{const t=()=>{A.pageUrlMapCache.clear(),f.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return w.default.events.on(w.default.Events.envUpdate,t),()=>{w.default.events.off(w.default.Events.envUpdate,t)}};A.startPeriodicCheck();process.on("beforeExit",()=>{A.stopPeriodicCheck()});process.on("SIGINT",()=>{A.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{A.stopPeriodicCheck(),process.exit(0)});async function Je({projectId:t,pages:e,components:s}){const a=A.sharedInstances[t];if(!a){f.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(a.syncedStore.resources.pages=e,(await L.findByPk(t))?.useAllResources)a.syncedStore.resources.components=s;else{const r=(await Oe.findAll({where:{projectId:t}})).map(u=>u.componentId),l=Object.fromEntries(Object.entries(s||{}).filter(([u])=>r.includes(u)));a.syncedStore.resources.components=l}f.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function We(t){return Je({projectId:t,pages:oe,components:re})}async function zt(){f.logger.info("trigger reload all project resource"),w.default.events.emit(he)}async function Yt({ensureLoaded:t=!0}={}){return t&&(ae??=ze(),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=A;exports.downloadAsset=Fe;exports.downloadAssets=qe;exports.fromPackage=Ce;exports.getDefaultState=Ne;exports.getResourceStates=Yt;exports.initPackResourceStates=Ye;exports.mergeState=Ie;exports.toPackage=Be;exports.triggerReloadAllProjectResource=zt;exports.updateResourceStatesByProjectId=We;