@blocklet/pages-kit-inner-components 0.7.18 → 0.7.20
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.
- package/lib/cjs/chunks/html-xfTPTsl5.js +1 -0
- package/lib/cjs/chunks/site-state-B_SwLwSW.js +1 -0
- package/lib/cjs/project-html.js +1 -1
- package/lib/cjs/resources.js +1 -1
- package/lib/cjs/site-state.js +1 -1
- package/lib/es/chunks/html-DOgzvdOd.js +50 -0
- package/lib/es/chunks/{site-state-wFgYwXCr.js → site-state-NvsHZBJX.js} +155 -154
- package/lib/es/project-html.js +1 -1
- package/lib/es/resources.js +1 -1
- package/lib/es/site-state.js +1 -1
- package/package.json +3 -3
- package/lib/cjs/chunks/html-dP5_4zu1.js +0 -1
- package/lib/cjs/chunks/site-state-DcRV8ldn.js +0 -1
- package/lib/es/chunks/html-CNFwwbdj.js +0 -38
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=Object.create;var a=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var y=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of i(t))!h.call(e,c)&&c!==n&&a(e,c,{get:()=>t[c],enumerable:!(r=u(t,c))||r.enumerable});return e};var f=(e,t,n)=>(n=e!=null?s(l(e)):{},y(t||!e||!e.__esModule?a(n,"default",{value:e,enumerable:!0}):n,e));const d=require("crypto");require("ufo");const g=async()=>await import("cheerio"),o={};function p(e,t){const n=JSON.stringify([e,t]);return d.createHash("md5").update(n).digest("hex")}async function C(e,t){{let n=await g();try{const r=n.load(e);return t.forEach(c=>{r(c.selector.cheerio).replaceWith(c.value)}),r.html()}catch{}finally{n=null}}return T(e,t)}function T(e,t){let n=e;return t.forEach(r=>{const c=typeof r.selector.pattern=="string"?new RegExp(r.selector.pattern,"gis"):r.selector.pattern;n=n.replace(c,r.value)}),n}async function j(e,t){if(!t||t.length===0)return e;const n=p(e,t);return o[n]??=C(e,t).finally(()=>{setTimeout(()=>{delete o[n]},10*1e3)}),o[n]}function m(e){return e.match(/<body[^>]*>(.*?)<\/body>/s)?.[1]||""}function H(e,t){return!t||Object.keys(t).length===0?!0:Object.entries(t).every(([n,r])=>e.includes(`${n}=${r}`))}exports.extractBodyContent=m;exports.injectToHtml=j;exports.matchCacheKey=H;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const u=require("./components-aaduHC9E.js"),G=require("@syncedstore/core"),it=require("yjs"),ct=require("@blocklet/pages-kit/utils/data-source"),ne=require("@blocklet/pages-kit/utils/route"),lt=require("lodash/cloneDeep"),h=require("sequelize");require("sqlite3");const ut=require("@blocklet/sdk/lib/config"),_=require("ufo"),Be=require("lodash");require("crypto");const Z=require("fs"),pt=require("p-limit"),p=require("path"),dt=require("worker_threads"),Ue=require("@blocklet/pages-kit/utils/common"),ft=require("@blocklet/pages-kit/utils/page-model"),gt=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),mt=require("@reactivedata/reactive"),D=require("fs/promises"),re=require("glob"),ht=require("lib0/decoding"),yt=require("lib0/encoding"),St=require("lodash/debounce"),wt=require("lodash/get"),It=require("lodash/isEmpty"),bt=require("lodash/set"),Pt=require("lodash/union"),Ge=require("lru-cache"),jt=require("stream/promises"),Et=require("tar"),At=require("wait-on"),W=require("y-protocols/awareness"),fe=require("y-protocols/sync"),Dt=require("yaml"),$e=require("./html-xfTPTsl5.js");require("@blocklet/pages-kit/types/state");const M=t=>t&&t.__esModule?t:{default:t};function pe(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const a in t)if(a!=="default"){const s=Object.getOwnPropertyDescriptor(t,a);Object.defineProperty(e,a,s.get?s:{enumerable:!0,get:()=>t[a]})}}return e.default=t,Object.freeze(e)}const q=pe(it),Ae=M(lt),E=M(ut),V=M(Z),De=M(pt),Ne=M(p),ge=pe(ht),v=pe(yt),Te=M(St),Re=M(wt),Oe=M(It),Me=M(bt),Tt=M(Pt),Rt=M(At),H=pe(Dt),Ot=h.DataTypes.sqlite.DATE.parse;h.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Ot(t,e);const F=new h.Sequelize({dialect:"sqlite",storage:u.databaseUrl,benchmark:process.env.ENABLE_SEQUELIZE_BENCHMARK==="true",retry:{match:[/SQLITE_BUSY/],name:"query",max:10},logging:process.env.ENABLE_SEQUELIZE_LOGGING==="true"?console.log:!1});F.query("PRAGMA journal_mode = WAL;");F.query("PRAGMA synchronous = normal;");F.query("PRAGMA journal_size_limit = 67108864;");F.query("PRAGMA cache_size = 10000;");process.on("SIGINT",async()=>{await F.close(),process.exit(0)});process.on("SIGTERM",async()=>{await F.close(),process.exit(0)});async function Ct(t,e){try{if(t.getDialect()!=="sqlite")return;const[a]=await t.query("SELECT 1");if(!a||a.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(a){if(a.name==="SequelizeConnectionError"||a?.message&&/closed!/.test(a.message))return;console.error("Failed to cleanup SQLite memory",e,a)}}let Se=null;Se&&clearInterval(Se);Se=setInterval(async()=>{u.logger.info("Start cleanupSqliteMemory"),await Ct(F,u.databaseUrl),u.logger.info("End cleanupSqliteMemory")},60*1e3*10);const kt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",we="page",Ie="trigger-reload-project-resource",Ce=kt,vt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",Lt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class ke extends h.Model{}ke.init({id:{type:h.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:h.DataTypes.UUIDV4},projectId:{type:h.DataTypes.UUID,allowNull:!1},componentId:{type:h.DataTypes.STRING,allowNull:!1}},{sequelize:F,tableName:"ProjectComponents",timestamps:!1});const _t="SLUG_INVALID",Y=t=>({error:"slugInvalid",code:_t,field:"slug",message:t}),Ut={error:"slugRequired",code:"SLUG_REQUIRED",field:"slug",message:()=>"Project slug is required"},$t={error:"slugAlreadyExists",code:"SLUG_EXISTS",field:"slug",message:t=>`Project slug "${t}" already exists`},Nt=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/\\:]/],Fe=t=>{if(!t)return"";if(t==="/")return"/";const e=_.withoutTrailingSlash(t);return _.withLeadingSlash(e)||"/"},Mt=t=>t.did===Lt;class $ extends h.Model{static async getProjectByIdOrSlug(e,a){return e?$.findOne({where:{[h.Op.or]:[{id:e},{slug:e}],...a?.createdBy?{createdBy:a.createdBy}:{}}}):null}static async validateProjectSlug({slug:e,projectId:a}){if(e==null)return null;if(e==="")return Ut;const s=e==="/"?"/":_.withoutTrailingSlash(_.withLeadingSlash(e)),o=Fe(s);if(s!=="/"&&s.endsWith("/"))return Y(r=>`Project slug "${r}" cannot end with /`);if(/\/{2,}/.test(s))return Y(r=>`Project slug "${r}" cannot contain consecutive /`);if(/\s/.test(s))return Y(r=>`Project slug "${r}" cannot contain whitespace`);if(Nt.some(r=>r.test(s)))return Y(r=>`Project slug "${r}" contains invalid characters`);if(E.default.components?.filter(r=>r.mountPoint&&!Mt(r)).some(r=>Fe(r.mountPoint)===o))return Y(r=>`Project slug "${r}" conflicts with existing blocklet`);const c=await $.findOne({where:{slug:s}});return c&&c?.id!==a?$t:null}}$.init({id:{type:h.DataTypes.UUID,defaultValue:h.DataTypes.UUIDV4,primaryKey:!0},name:{type:h.DataTypes.STRING,allowNull:!1},description:h.DataTypes.TEXT,createdAt:h.DataTypes.DATE,updatedAt:h.DataTypes.DATE,createdBy:{type:h.DataTypes.STRING,allowNull:!1},updatedBy:{type:h.DataTypes.STRING,allowNull:!1},slug:h.DataTypes.STRING,icon:h.DataTypes.STRING,pinnedAt:h.DataTypes.DATE,useAllResources:h.DataTypes.BOOLEAN,npmSecret:h.DataTypes.STRING,relatedBlocklets:{type:h.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:h.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}},meta:{type:h.DataTypes.JSON,allowNull:!0}},{sequelize:F,paranoid:!0,indexes:[{name:"projects_slug_unique",unique:!0,fields:["slug"]},{name:"projects_created_by",fields:["createdBy"]},{name:"projects_pinned_updated_meta_not_null",fields:[{name:"pinnedAt",order:"DESC"},{name:"updatedAt",order:"DESC"}],where:{meta:{[h.Op.ne]:null}}}]});$.hasMany(ke,{foreignKey:"projectId",as:"components"});async function x(t){try{return await V.default.promises.access(t,V.default.constants.F_OK),!0}catch{return!1}}function Ve(t,e){return new Promise((a,s)=>{const o=V.default.createReadStream(t),n=V.default.createWriteStream(e);o.on("error",s),n.on("error",s),n.on("finish",a),o.pipe(n)})}async function ze(t,e){await V.default.promises.mkdir(e,{recursive:!0});const a=await V.default.promises.readdir(t,{withFileTypes:!0});for(const s of a){const o=Ne.default.join(t,s.name),n=Ne.default.join(e,s.name);s.isDirectory()?await ze(o,n):await Ve(o,n)}}async function Ft(t,e){(await V.default.promises.stat(t)).isDirectory()?await ze(t,e):await Ve(t,e)}class ee extends h.Model{}ee.init({id:{type:h.DataTypes.UUID,primaryKey:!0,defaultValue:h.DataTypes.UUIDV4},projectId:{type:h.DataTypes.UUID,allowNull:!1,comment:"Project ID"},urlPath:{type:h.DataTypes.STRING(512),allowNull:!1,unique:!0,comment:"URL path, e.g. /project-slug/page-slug or /en/project-slug/page-slug"},projectSlug:{type:h.DataTypes.STRING,allowNull:!0,comment:"Project slug"},pageSlug:{type:h.DataTypes.STRING,allowNull:!1,comment:"Page slug"},pageId:{type:h.DataTypes.UUID,allowNull:!1,comment:"Page ID"},routeId:{type:h.DataTypes.UUID,allowNull:!0,comment:"Route ID (for draft mode)"},locale:{type:h.DataTypes.STRING(10),allowNull:!0,comment:"Locale code, e.g. en, zh"},defaultLocale:{type:h.DataTypes.STRING(10),allowNull:!0,comment:"Default locale"},shouldRedirect:{type:h.DataTypes.BOOLEAN,defaultValue:!1,comment:"Whether this URL should redirect"},mainPage:{type:h.DataTypes.BOOLEAN,defaultValue:!1,comment:"Whether this is the main page"},isPublic:{type:h.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0,comment:"Whether the page is public"},publishedAt:{type:h.DataTypes.BIGINT,allowNull:!0,comment:"Published timestamp"},locales:{type:h.DataTypes.JSON,allowNull:!0,comment:"Supported locales array"},createdAt:h.DataTypes.DATE,updatedAt:h.DataTypes.DATE},{sequelize:F,tableName:"PageUrlMappings",timestamps:!0,indexes:[{name:"idx_project_id",fields:["projectId"]},{name:"idx_url_path",unique:!0,fields:["urlPath"]},{name:"idx_page_id",fields:["pageId"]}]});function qt(t){const{projectId:e,projectSlug:a,state:s}=t,o=a||e,n=Be.union(E.default.env.languages?.map(l=>l.code)||[],s.supportedLocales?.map(l=>l.locale)||[]),c={},r=(l,S)=>{o&&(c[_.joinURL("/",o,l)]={...S,shouldRedirect:!0,mainPage:!0}),c[_.joinURL("/",e,l)]={...S,shouldRedirect:!0,mainPage:!0};for(const j of n){const T={...S,locale:j};c[_.joinURL("/",j,e,l)]=T,o&&(c[_.joinURL("/",j,o,l)]=T)}};for(const l of s.pageIds||[]){const S=s.pages?.[l];if(!S||!S.isPublic)continue;const j={projectId:e,projectSlug:o,pageSlug:S.slug,pageId:l,defaultLocale:n?.[0],locales:n,publishedAt:s.config?.publishedAt,isPublic:S.isPublic};r(S.slug,j)}return c}async function xt(t,e,a){const s=t.map(n=>n.urlPath),o=await ee.findAll({where:{urlPath:{[h.Op.in]:s},projectId:{[h.Op.ne]:e}},attributes:["urlPath","projectId","projectSlug","pageSlug"],transaction:a,raw:!0});if(o.length>0){u.logger.warn(`[URL Duplicate Warning] Found ${o.length} URL conflicts for project ${e}:`);for(const n of o){const c=t.find(r=>r.urlPath===n.urlPath);if(c){const r=n.projectSlug?_.joinURL(n.projectSlug,n.pageSlug):n.pageSlug;u.logger.warn(` - URL "${n.urlPath}" conflicts with project ${n.projectId} (${r}). Current project trying to use same URL for page: ${c.pageSlug}`)}}u.logger.warn("[URL Duplicate Warning] These duplicate URLs will be ignored during save. Consider using different project slugs or page slugs to avoid conflicts.")}}async function Bt(t){const{projectId:e,transaction:a}=t;try{await ee.destroy({where:{projectId:e},transaction:a});const s=qt(t),o=Object.entries(s).map(([n,c])=>({projectId:e,urlPath:n,projectSlug:c.projectSlug,pageSlug:c.pageSlug,pageId:c.pageId,routeId:c.routeId,locale:c.locale,defaultLocale:c.defaultLocale,shouldRedirect:c.shouldRedirect,mainPage:c.mainPage,isPublic:c.isPublic,publishedAt:typeof c.publishedAt=="number"?c.publishedAt:void 0,locales:c.locales}));if(o.length>0){await xt(o,e,a);const n=100,c=[];for(let r=0;r<o.length;r+=n){const l=o.slice(r,r+n);c.push(ee.bulkCreate(l,{transaction:a,ignoreDuplicates:!0}))}await Promise.all(c),u.logger.info(`Regenerated ${o.length} URL mappings for project ${e}`)}return o.length}catch(s){throw u.logger.error(`Failed to regenerate URL mappings for project ${e}:`,s),s}}function ie(t){t.observeDeep(e=>{e.some(a=>a.changes.keys.has("updatedAt")||a.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function He(){return Z.mkdtempSync(p.join(E.default.env.dataDir,"tmp-"))}function ce(t,e,a=[]){return Array.isArray(t)?t.flatMap((s,o)=>ce(s,e,[...a,o])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([s,o])=>ce(o,e,[...a,s])):e(t)?[a]:[]}function U(t){return t.filter(e=>e!=null)}function Gt(t){return new Promise((e,a)=>{let s;process.env.NODE_ENV==="development"?s=p.join(__dirname,"yaml-worker.js"):s=p.join(__dirname,"api/dist/utils/yaml-worker.js");const o=new dt.Worker(s);o.postMessage({payload:t}),o.on("message",n=>{n.status==="success"?e(n.result):a(new Error(`YAML stringify failed in worker: ${n.message}`)),o.terminate()}),o.on("error",n=>{a(n)}),o.on("exit",n=>{n!==0&&a(new Error(`Worker stopped with exit code ${n}`))})})}function Vt(t){t.pages&&Object.keys(t.pages).forEach(a=>{const s=G.getYjsValue(t.pages[a]);s&&s instanceof q.Map&&ie(s)});const e=G.getYjsValue(t.pages);e&&e instanceof q.Map&&e.observe(a=>{a.changes.keys.forEach((s,o)=>{if(s.action==="add"){const n=G.getYjsValue(t.pages[o]);n&&n instanceof q.Map&&ie(n)}})})}function zt(t){t.routes&&Object.keys(t.routes).forEach(a=>{const s=G.getYjsValue(t.routes?.[a]);s&&s instanceof q.Map&&ie(s)});const e=G.getYjsValue(t.routes);e&&e instanceof q.Map&&e.observe(a=>{a.changes.keys.forEach((s,o)=>{if(s.action==="add"){const n=G.getYjsValue(t.routes?.[o]);n&&n instanceof q.Map&&ie(n)}})})}function Ht(t,e){for(const a of e||Object.keys(t.routes||{})){let s=a,o=[];if(a.includes("-")){const[n,...c]=a.split("-");s=n,o=c||[]}if(t.routes?.[s]!==void 0){t.routes[s].publishedAt=new Date().toISOString();const n=t.routes[s];if(!n||!n.params||n.params.length===0)continue;if(a.includes("-")&&o.length>0){const c=ne.getRouteMetaDataByOptionIds(o,n);c&&(c.publishedAt=new Date().toISOString())}if(!e){const c=ne.generateParamCombinations({basePath:n.path,params:n.params,routeId:n.id,paramsOptions:n.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const r of c)r.routeMetaData??={},r.routeMetaData.publishedAt=new Date().toISOString()}}}}function me({page:t,route:e,state:a,routeId:s,routePathInfo:o}){u.logger.info(`Executing datasource data assembly, routeId: ${s}, routePathInfo: ${JSON.stringify(o)}`);const n={...Ae.default(t),id:s,slug:o?.path??e.path,createdAt:e.createdAt,updatedAt:o?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:o?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(o?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const c of a.supportedLocales){if(e.dataSource){let r=e.id;o&&(r=o.paramOptionIds.join("-"));const l=e.dataSource.pathDataMappings?.[r]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[r]?.dataCache?.[a.config.defaultLocale||"en"];if(!l)continue;ct.setPageDataSource(n,a,c.locale,l)}o&&o.routeMetaData&&(o.routeMetaData.publishedAt=new Date().toISOString())}return n}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const Kt=60*60*1e3,J=new Ge.LRUCache({max:300,ttl:Kt,ttlResolution:10*1e3,allowStale:!0});function Wt(t,e=[]){let a=0;const s=Array.from(J.keys()),o=t.map(n=>_.withoutTrailingSlash(n));for(const n of s)for(const c of o){if($e.matchCacheKey(n,{currentPath:c})){J.delete(n),a++,u.logger.info(`[Cache CLEAR] key: ${n}`);break}for(const r of e)if($e.matchCacheKey(n,{currentPath:`/${r}${c}`})){J.delete(n),a++,u.logger.info(`[Cache CLEAR] key: ${n}`);break}}return u.logger.info(`[Cache CLEAR] cleared ${a} entries for paths:`,o),a}function Yt(){const t=J.size;return J.clear(),u.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}const Jt=Be.debounce(Yt,300);E.default.events.on(E.default.Events.envUpdate,Jt);const{uploadToMediaKit:Xt}=require("@blocklet/uploader-server"),ve=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,X=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,qe=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Qt=1e4,Zt=3e4,se=0,he=1,ea=0,ta=1,be=E.default,z=p.join(process.env.BLOCKLET_DATA_DIR,"site-state"),aa=["production","draft"],sa=["production"];function le(t){return t?.replace(/\//g,"|")||""}function Ke(){const t=be.env.languages?.map(a=>({locale:a.code,name:a.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class C extends q.Doc{constructor(e){if(super(),this.options=e,Z.existsSync(this.draftYjsFilePath))try{q.applyUpdate(this,Z.readFileSync(this.draftYjsFilePath))}catch(a){u.logger.error("Failed to apply update from draft.yjs:",a)}this.syncedStore=mt.reactive(G.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new W.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static RELEASE_DELAY=5*60*1e3;static PERIODIC_CHECK_INTERVAL=2*60*60*1e3;static sharedInstances={};static periodicCheckTimer;static async safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const a=p.join(z,e),s=p.join(z,`@del-${e}`);await D.rename(a,s)}catch(a){u.logger.error("Failed to safe delete project state dir:",a)}}static async getProjectIds(){return(await $.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return re.globSync("*/",{cwd:z,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>C.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let a=C.sharedInstances[e];return a||(a=new C({path:p.join(z,e)}),C.sharedInstances[e]=a,a)}static async getProductionState(e){const a=await $.findByPk(e,{attributes:["productionState"]});if(Oe.default(a?.productionState)){const s=p.join(z,e,"production"),o=await Le(s,{includeResources:!0})??Ke();if(!o?.config?.defaultLocale){o.config??={};const n=be.env.languages?.map(c=>({locale:c.code,name:c.name}))||[];o.config.defaultLocale=n[0]?.locale}return o}return a?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((a,s)=>this.closeConn(s)),this.awareness.destroy();const e=p.basename(this.options.path);delete C.sharedInstances[e],super.destroy()}initObserver(){Vt(this.syncedStore),zt(this.syncedStore)}get draftYjsFilePath(){return p.join(this.options.path,"draft.yjs")}static async getStateByProjectId({projectId:e,mode:a,clone:s=!0}){if(a==="draft"){const o=C.shared(e);return s?JSON.parse(JSON.stringify(o.syncedStore)):o.syncedStore}return C.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const a=p.basename(this.options.path);return C.getProductionState(a)}async setState(e,a){if(e!=="production")return;const s=p.basename(this.options.path),o=Ae.default(a);await F.transaction(async n=>{await $.update({productionState:o},{where:{id:s},transaction:n});const c=await $.findByPk(s,{attributes:["slug"],transaction:n}),r=await Bt({projectId:s,projectSlug:c?.slug,state:a,transaction:n});u.logger.info(`[SiteState] saved ${r} URL mappings for project ${s}`)}),await this.clearPageCacheForRoutes(void 0,a),setImmediate(async()=>{const n=await Xe(a,{exportAssets:!1,includeResources:!0}),c=this.getPublishDir(e);await D.mkdir(p.dirname(c),{recursive:!0}),await D.rm(c,{force:!0,recursive:!0}),await D.rename(n,c),u.logger.info(`[SiteState] saved package for project ${s} in ${e} mode`)})}getPublishDir(e){return p.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:a,removed:s},o)=>{const n=e.concat(a,s);if(o!==null){const l=this.conns.get(o);l&&(e.forEach(S=>{l.add(S)}),s.forEach(S=>{l.delete(S)}))}const c=v.createEncoder();v.writeVarUint(c,he),v.writeVarUint8Array(c,W.encodeAwarenessUpdate(this.awareness,n));const r=v.toUint8Array(c);this.conns.forEach((l,S)=>this.send(S,r))};updateHandler=e=>{const a=v.createEncoder();v.writeVarUint(a,se),fe.writeUpdate(a,e);const s=v.toUint8Array(a);this.conns.forEach((o,n)=>this.send(n,s))};ensureDataStructure=()=>{this.transact(()=>{const{supportedLocales:e,pages:a,pageIds:s,config:o,routes:n,routeIds:c}=this.syncedStore;{const r=new Set(Object.keys(a));let l=0;for(;l<s.length;){const S=s[l];r.has(S)?(r.delete(S),l++):s.splice(l,1)}}{const r=new Set(Object.keys(n));let l=0;for(;l<c.length;){const S=c[l];r.has(S)?(r.delete(S),l++):c.splice(l,1)}}e.splice(0,e.length),e.push(...be.env.languages.map(r=>({locale:r.code,name:r.name}))),o.defaultLocale=e[0]?.locale;{let r=0;const l=new Set;for(;r<e.length;){const{locale:S}=e[r];l.has(S)?e.splice(r,1):(r++,l.add(S))}}})};send=(e,a)=>{e.readyState!==ea&&e.readyState!==ta&&this.closeConn(e);try{e.send(a,s=>{s&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const a=this.conns.get(e);this.conns.delete(e),a&&W.removeAwarenessStates(this.awareness,Array.from(a),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=p.basename(this.options.path);this.releaseTimer=setTimeout(()=>{u.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},C.RELEASE_DELAY),u.logger.info(`[SiteState] scheduled release for project ${e} in ${C.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=p.basename(this.options.path);u.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Te.default(async()=>{await D.mkdir(p.dirname(this.draftYjsFilePath),{recursive:!0}),await D.writeFile(this.draftYjsFilePath,q.encodeStateAsUpdate(this))},Qt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:a})=>{const s=p.basename(this.options.path);await nt(s);const o=await this.getState("draft"),n=await this.getState("production");await je(o,n,{routes:a,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),setImmediate(()=>{this.transact(()=>{Ht(this.syncedStore,a)})}),await this.setState(e,n)};mergeState=async(e,a)=>{const s=JSON.parse(JSON.stringify(a));e.config.fontFamily??={};const o=s.config?.fontFamily,n=e.config?.fontFamily;e.config.fontFamily.title=o?.title||n?.title,e.config.fontFamily.description=o?.description||n?.description,await new Promise((c,r)=>{this.transact(async()=>{try{const l=await je(e,a);c(l)}catch(l){r(l)}})})};clearPageCacheForRoutes=async(e,a)=>{const s=p.basename(this.options.path),n=(await $.findByPk(s))?.slug||s;let c=e;(!c||c.length===0)&&(c=a.pageIds??[]),u.logger.info(`[SiteState] clearing page cache for project ${s}, routes:`,c||[]);const r=a.supportedLocales.map(j=>j.locale),l=[],S=c.filter(j=>a.pageIds?.includes(j));for(const j of S){const b=a.pages[j].slug;n&&n!==s&&(n==="/"?l.push(b):l.push(`${n.startsWith("/")?"":"/"}${n}${b}`)),l.push(`/${s}${b}`)}if(l.length>0)try{const j=Wt(l,r);u.logger.info(`[SiteState] cleared ${j} page cache entries for project ${s}, routes:`,c)}catch{}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",o=>this.messageListener(e,new Uint8Array(o)));let a=!0;const s=setInterval(()=>{if(!a)this.conns.has(e)&&this.closeConn(e),clearInterval(s);else if(this.conns.has(e)){a=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(s)}}},Zt);e.on("close",()=>{this.closeConn(e),clearInterval(s)}),e.on("pong",()=>{a=!0});{const o=v.createEncoder();v.writeVarUint(o,se),fe.writeSyncStep1(o,this),this.send(e,v.toUint8Array(o));const n=this.awareness.getStates();if(n.size>0){const c=v.createEncoder();v.writeVarUint(c,he),v.writeVarUint8Array(c,W.encodeAwarenessUpdate(this.awareness,Array.from(n.keys()))),this.send(e,v.toUint8Array(c))}}};messageListener=(e,a)=>{try{const s=v.createEncoder(),o=ge.createDecoder(a),n=ge.readVarUint(o);switch(u.logger.info(`[SiteState] messageListener, messageType: ${n}`),n){case se:v.writeVarUint(s,se),fe.readSyncMessage(o,s,this,null),u.logger.info(`[SiteState] messageListener, encoder length: ${v.length(s)}`),v.length(s)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(s)));break;case he:{W.applyAwarenessUpdate(this.awareness,ge.readVarUint8Array(o),e);break}default:u.logger.warn(`Unsupported messageType ${n}`)}}catch(s){u.logger.error(s)}this.save()};static async pageUrlMap(e,a){if(u.logger.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${a}`),e==="production"){const n=a?{projectId:a}:{},c=await ee.findAll({where:n,raw:!0}),r={};for(const l of c)r[l.urlPath]={projectId:l.projectId,projectSlug:l.projectSlug,pageSlug:l.pageSlug,pageId:l.pageId,routeId:l.routeId,locale:l.locale,defaultLocale:l.defaultLocale,shouldRedirect:l.shouldRedirect,mainPage:l.mainPage,isPublic:l.isPublic,publishedAt:l.publishedAt,locales:l.locales};return u.logger.info(`[SiteState] loaded ${c.length} URL mappings from database`),r}let s=[];a?s=[a]:s=await this.getProjectIds();let o={};if(s?.length){u.logger.info("[SiteState] find project infos from database, projectIds: ",s);const n=30,c=De.default(5);for(let r=0;r<s.length;r+=n){const l=s.slice(r,r+n);u.logger.info(`[SiteState] processing project batch ${r/n+1}, ids: `,l);const S=await $.findAll({where:{id:{[h.Op.in]:l}},attributes:{exclude:["relatedBlocklets"]}});await Promise.all(S?.map(j=>c(async()=>{const T=j.id,b=j.slug||T,m={},d=await C.getStateByProjectId({projectId:j.id,mode:e,clone:!1}),P=Tt.default(E.default.env.languages?.map(A=>A.code)||[],d.supportedLocales?.map(A=>A.locale)||[]),R=(A,I)=>{b&&(m[_.joinURL("/",b,A)]={...I,shouldRedirect:!0,mainPage:!0}),m[_.joinURL("/",T,A)]={...I,shouldRedirect:!0,mainPage:!0};for(const k of P){const y={...I,locale:k};m[_.joinURL("/",k,T,A)]=y,b&&(m[_.joinURL("/",k,b,A)]=y)}};if(e==="draft")for(const A of d.routeIds||[]){const I=d?.routes?.[A];if(!I)continue;if(I.params&&I.params.length>0){const w=ne.generateParamCombinations({basePath:I.path,params:I.params,routeId:I.id,paramsOptions:I.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const i of w){const f=i.path,g={projectId:T,projectSlug:b,pageSlug:f,pageId:I.displayTemplateId||"",routeId:A,defaultLocale:P?.[0],locales:P,publishedAt:d.config.publishedAt,isPublic:I.isPublic&&i?.routeMetaData?.isPublic};R(f,g)}}const k=I.path,y={projectId:T,projectSlug:b,pageSlug:k,pageId:I.displayTemplateId||"",routeId:A,defaultLocale:P?.[0],locales:P,publishedAt:d.config.publishedAt,isPublic:I.isPublic};R(k,y)}for(const A of d.pageIds||[]){const I=d.pages[A];if(!I)continue;const k=I.slug,y=j.slug||T,w={projectId:T,projectSlug:y,pageSlug:k,pageId:A,defaultLocale:P?.[0],locales:P,publishedAt:d.config.publishedAt,isPublic:I.isPublic,templateConfig:I.templateConfig};R(k,w)}o={...o,...m}})))}}return u.logger.info("[SiteState] success get pageUrlMap"),o}getDocumentSize(){return q.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[a,s]of Object.entries(C.sharedInstances)){const o=s.getDocumentSize();e.push({projectId:a,sizeInBytes:o,sizeInMB:`${(o/(1024*1024)).toFixed(2)} MB`,activeConnections:s.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),u.logger.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,u.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(C.sharedInstances).length,a=[],s=[];for(const[o,n]of Object.entries(C.sharedInstances))n.conns.size===0?a.push({projectId:o,instance:n}):s.push({projectId:o,connections:n.conns.size});if(u.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${s.length}, without connections: ${a.length}`),a.length>0){u.logger.info(`[SiteState] releasing ${a.length} instances without connections:`,a.map(n=>n.projectId));let o=0;for(const{projectId:n,instance:c}of a)try{u.logger.info(`[SiteState] releasing instance due to periodic check: ${n}`),c.destroy(),o++}catch(r){u.logger.error(`[SiteState] failed to release instance ${n} during periodic check:`,r)}u.logger.info(`[SiteState] periodic check completed: ${o}/${a.length} instances released successfully`)}else e>0?u.logger.debug("[SiteState] periodic check: all instances have active connections"):u.logger.debug("[SiteState] periodic check: no instances exist")}}async function oa(t,e,a){if(!t||!await x(t)||!(await D.lstat(t)).isFile())return null;let o=a[t];return o||(o=(async()=>{try{return(await Xt({filePath:t,fileName:e}))?.data?.filename}catch(n){return u.logger.error(`Failed to upload asset ${t}:`,n),null}})(),a[t]=o),o}const We=async(t,e)=>{const a=p.basename(t),s=await Ee.call({name:Ce,path:_.joinURL("/uploads",a),responseType:"stream",method:"GET"});if(s.status>=200&&s.status<400){const o=Z.createWriteStream(e);await jt.pipeline(s.data,o)}else throw new Error(`download asset failed ${s.status}`)},Ye=async(t,e)=>{await Promise.all(t.map(async a=>{try{await We(a,p.join(e,p.basename(a)))}catch(s){u.logger.error(`Failed to export assets: ${a}, ${s}`)}}))};function Je(t){return ve.test(t)?[t]:X.test(t)?(qe.lastIndex=0,Array.from(t.matchAll(qe)).map(a=>a[1]).filter(a=>!!a)):[]}async function oe(t,e,a){const{getFilename:s,exportAssets:o,useWorker:n}=a,c=p.join(e,s(t));await D.mkdir(p.dirname(c),{recursive:!0});const r=n?await Gt(t):H.stringify(t);if(await D.writeFile(c,r),o){const S=ce(t,j=>typeof j=="string"&&(ve.test(j)||X.test(j))).map(j=>{const T=Re.default(t,j);return Je(T)}).flat().filter(Boolean);await Ye(S,p.dirname(c))}}const Pe=new Ge.LRUCache({max:100,ttl:1*60*1e3});async function xe(t,e,a){const s=ce(t,r=>typeof r=="string"&&(ve.test(r)||X.test(r))),o=De.default(2),n=s.map(r=>o(async()=>{try{const l=Re.default(t,r),S=Je(l);for(const j of S){const T=p.basename(j),b=a.getFilePath(j,r),m=b?`${b}:${T}`:T,d=Pe.get(m);if(d){X.test(l)||Me.default(t,r,d);return}const P=await oa(b,T,e);P&&(X.test(l)||Me.default(t,r,P),Pe.set(m,P))}}catch(l){u.logger.error(`Failed to process upload for path ${r.join(".")}:`,l.message||l.reason)}})),c=await Promise.allSettled(n);a.onFinish?.(c)}async function Xe(t,{exportAssets:e,pageIds:a="all",componentIds:s="all",rawConfig:o,includeResources:n=!1,routeIds:c="all"}={}){const r=a==="all"?t.pageIds:a,l=gt.getComponentDependencies({state:t,pageIds:r,componentIds:s==="all"?Object.keys(t.components):s});Object.entries(t.components).forEach(([i,f])=>{f.data?.renderer?.type==="component-template"&&l.push(i)});const S=c==="all"?t.routeIds:c,j=i=>({id:i.id,name:i.name,isTemplateSection:i.isTemplateSection??!1,templateDescription:i.templateDescription,component:i.component,config:i.config,visibility:i.visibility,sections:i?.sectionIds?U(i?.sectionIds?.map(f=>{const g=i.sections?.[f];return g&&j(g)})):void 0}),T=(i,f)=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,meta:i.locales?.[f]??{},sections:U(i.sectionIds.map(g=>{const O=i.sections[g];return O&&j(O)})),dataSource:Object.fromEntries(Object.entries(i.dataSource||{}).map(([g,O])=>[g,O?.[f]??{}]))}),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}),m=U(S.map(i=>{const f=t.routes[i];return f&&b(f)})),d=U(t.supportedLocales.map(i=>i.locale).flatMap(i=>r.map(f=>{const g=t.pages[f];return g&&{locale:i,slug:g.slug,page:T(g,i)}}))),P=He(),R=p.join(P,"pages");await D.mkdir(R,{recursive:!0});const A=p.join(P,"components");await D.mkdir(A,{recursive:!0});const I=p.join(P,"routes");await D.mkdir(I,{recursive:!0});for(const{locale:i,slug:f,page:g}of d)await oe(g,R,{getFilename:()=>`${le(f)||"index"}.${i}.yml`,exportAssets:e,useWorker:!0});for(const i of m)await oe(i,I,{getFilename:()=>`${le(i.path)||"index"}.yml`,exportAssets:e});for(const i of l){const f=t.components[i]?.data;f&&await oe(f,A,{getFilename:g=>`${g.name||"unnamed"}.${g.id}.yml`,exportAssets:e})}const k=p.join(P,".blocklet/pages/pages.config.yml");await D.mkdir(p.dirname(k),{recursive:!0});const y={pages:U(r.map(i=>{const f=t.pages[i];return f&&{id:i,slug:f.slug}})),routes:U(S.map(i=>{const f=t.routes[i];return f&&{id:i,path:f.path}})),components:U(l.map(i=>{const f=t.components[i]?.data;return f&&{id:i,name:f.name}})),...n?{resources:{components:U(Object.keys(t.resources?.components||{}).filter(i=>l.includes(i)).map(i=>({id:i,name:t.resources?.components?.[i]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};await D.writeFile(k,H.stringify(y));const w=p.join(P,"config.source.json");if(o&&await D.writeFile(w,JSON.stringify(o)),n){const i=p.join(P,"resources"),f=p.join(i,"components");await D.mkdir(f,{recursive:!0});for(const N of Object.keys(t?.resources?.components??{}).filter(L=>l.includes(L))){const L=t.resources?.components?.[N]?.component;L&&await oe(L,f,{getFilename:B=>`${B.name||"unnamed"}.${B.id}.yml`,exportAssets:e})}const g=p.join(P,"chunks");await D.mkdir(g,{recursive:!0});const O=await na();for(const N of Object.keys(t?.resources?.components??{}).filter(L=>l.includes(L))){const L=t.resources?.components?.[N]?.component;if(L&&L.renderer?.type==="react-component"){const B=L.renderer?.chunks??[];if(B?.length>0)for(const K of B){const _e=p.join(g,K),de=O?.[K];try{de&&await x(de)&&!await x(_e)&&await D.copyFile(de,_e)}catch(rt){u.logger.error(`copy chunk ${K} error`,rt.message)}}}}}return P}async function Le(t,{importAssets:e,includeResources:a}={}){if(!await x(t))return null;let s,o=!1;try{(await D.lstat(t)).isDirectory()?s=t:/\.(tgz|gz|tar)$/.test(t)&&(o=!0,s=He(),await Et.x({file:t,C:s}));const r=(await re.glob("**/.blocklet/pages/pages.config.yml",{cwd:s,absolute:!0}))[0],l=r&&p.join(p.dirname(r),"../../pages"),S=r&&p.join(p.dirname(r),"../../components"),j=r&&p.join(p.dirname(r),"../../routes");if(!r)return null;const T=await D.readFile(r,"utf-8"),b=H.parse(T),m=async(y,w,i)=>{let f=p.join(y,`${w}${i?`.${i}`:""}.yml`);if(!await x(f)&&(f=p.join(y,w,`index${i?`.${i}`:""}.yml`),!await x(f))||!(await D.lstat(f)).isFile())return null;const O=await D.readFile(f,"utf-8");return H.parse(O)},d=async(y,w)=>{try{const f=(await re.glob(`*.${w}.yml`,{cwd:y,absolute:!0}))[0];if(!f)return null;const g=await D.readFile(f,"utf-8");return H.parse(g)}catch(i){u.logger.error("parse component error",i)}return null},P=async(y,w)=>{let i=p.join(y,`${w}.yml`);if(!await x(i)&&(i=p.join(y,w,"index.yml"),!await x(i))||!(await D.lstat(i)).isFile())return null;const g=await D.readFile(i,"utf-8");return H.parse(g)},R=U(await Promise.all(b.pages.map(async({slug:y})=>{const w=U(await Promise.all(b.supportedLocales.map(async({locale:g})=>{const O=l?await m(l,le(y),g):void 0;if(O)return{locale:g,page:O};const N=l?await m(l,y,g):void 0;return N&&{locale:g,page:N}}))),i=w[0]?.page;if(!i)return null;const f=i.sections.map(ft.unzipSection);return{id:i.id||Ue.nextId(),createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,slug:y,sections:Object.fromEntries(f.map(g=>[g.id,g])),sectionIds:f.map(g=>g.id),locales:Object.fromEntries(w.map(({locale:g,page:O})=>[g,O.meta])),dataSource:i.dataSource?Object.fromEntries([...new Set(w.flatMap(({page:g})=>Object.keys(g.dataSource??{})))].map(g=>[g,Object.fromEntries(w.map(({locale:O,page:N})=>{const L=N.dataSource?.[g];return[O,L||{}]}))])):Object.fromEntries([...new Set(w.flatMap(({page:g})=>g.sections.map(O=>O.id)))].map(g=>[g,Object.fromEntries(w.map(({locale:O,page:N})=>{const L=N.dataSource?.[g];if(L)return[O,L];const B=N.sections.find(K=>K.id===g);return[O,B?.properties||{}]}))]))}}))),A=U(await Promise.all((b?.routes||[]).map(async({path:y})=>{const w=j?await P(j,le(y)):void 0;return{...w,id:w?.id||Ue.nextId(),createdAt:w?.createdAt??new Date().toISOString(),updatedAt:w?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:w?.path??`/${w?.id}`,params:w?.params,handler:w?.handler??"Pages Kit",isPublic:w?.isPublic??!0,enabledGenerate:w?.enabledGenerate??!1,displayTemplateId:w?.displayTemplateId??void 0,dataSource:w?.dataSource??{}}}))),I=S?U(await Promise.all((b.components||[]).map(async({id:y})=>d(S,y)))):[];if(e){const y=(...w)=>{u.logger.info(`[${o?p.basename(t):p.basename(p.join(t,"../../../../"))}] importAssets:`,...w)};try{y("wait image-bin api ready"),await Rt.default({resources:[`${Ee.getComponentWebEndpoint(u.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:f=>f>=200&&f<=500}),y("image-bin api is ready");const w={},i={};y("start to upload assets"),await Promise.allSettled([xe(I,w,{getFilePath:f=>S&&p.join(S,f),onFinish:f=>{y(`upload ${f.length} component assets`)}}),xe(R,i,{getFilePath:(f,g)=>{const O=Re.default(R,g.slice(0,1));return l&&p.join(l,p.dirname(O.slug),f)},onFinish:f=>{y(`upload ${f.length} page assets`)}})]),y("upload assets done"),Pe.clear(),global.gc&&global.gc()}catch(w){y("Error during asset import:",w)}}const k={};if(a){const y=r&&p.join(p.dirname(r),"../../resources/components"),w=U(await Promise.all((b.resources?.components||[]).map(async({id:i})=>d(y,i))));w.length>0&&(k.components=Object.fromEntries(w.map((i,f)=>[i.id,{index:f,component:i}])))}return{supportedLocales:b.supportedLocales,pageIds:R.map(y=>y.id),components:Object.fromEntries(I.map((y,w)=>[y.id,{index:w,data:y}])),pages:Object.fromEntries(R.map(y=>[y.id,y])),config:b.config||{},resources:k,routeIds:A.map(y=>y.id),routes:Object.fromEntries(A.map(y=>[y.id,y])),dataSourceIds:[],dataSources:{}}}finally{o&&s&&await D.rm(s,{force:!0,recursive:!0})}}async function je(t,e,{routes:a,mergeMode:s="byUpdateTime",deleteRoutes:o=!1,publishMode:n=void 0}={}){try{n&&u.clearPreloadComponentsCacheByMode(n)}catch(b){u.logger.error("clear preload page cache error",{error:b})}const{pages:c,pageIds:r,routeIds:l,routes:S,supportedLocales:j}=t;if(n==="production"){let b=a??[],m=null;for(const d of l??[]){const P=S?.[d];if(P?.params&&P?.params.length>0&&P?.paramsOptions&&P?.paramsOptions.length>0){const R=ne.generateParamCombinations({basePath:P.path,params:P.params,routeId:P.id,paramsOptions:P.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),A=Object.fromEntries(R.map(I=>[`${d}-${I.paramOptionIds.join("-")}`,I]));m={...m||{},...A},a||(b=[...b,...R.map(I=>`${d}-${I.paramOptionIds.join("-")}`)])}else a||b.push(d)}u.logger.info("routeIds to be published: ",b);for(const d of b){let P=d;if(P.includes("-")){const[I]=P.split("-");P=I}const R=S?.[P];if(!R){const I=e.pageIds.indexOf(P);I!==-1&&o&&(e.pageIds.splice(I,1),delete e.pages[P]);for(const k of e.pageIds)k.includes(`${P}-`)&&(e.pageIds.splice(e.pageIds.indexOf(k),1),delete e.pages[k]);u.logger.info("delete main route page",P);continue}if(d.includes("-")&&!m?.[d]){const I=e.pageIds.indexOf(d);I!==-1&&o&&(e.pageIds.splice(I,1),delete e.pages[d]),u.logger.info("delete page",d);continue}if(!R.displayTemplateId){u.logger.info("no display template",d);continue}const A=c[R.displayTemplateId];if(!A){u.logger.info("no template page",d);continue}if(e.pageIds.includes(d)){if(u.logger.info("has need update page",d),s==="replace")e.pages[d]=me({page:A,route:R,state:t,routeId:d,routePathInfo:m?.[d]}),u.logger.info("replace page",d);else if(s==="byUpdateTime"){const I=e.pages[R.id];(!I||R.updatedAt&&R.updatedAt>I.updatedAt)&&(e.pages[d]=me({page:A,route:R,state:t,routeId:d,routePathInfo:m?.[d]}),u.logger.info("replace page by update time",d))}}else e.pageIds.push(d),e.pages[d]=me({page:A,route:R,state:t,routeId:d,routePathInfo:m?.[d]}),u.logger.info("add page",d)}if(o&&!a)for(const d of e.pageIds)b?.includes(d)||(delete e.pages[d],u.logger.info("delete page",d)),e.pageIds=[...e.pageIds].filter(P=>b?.includes(P))}else{for(const b of r){const m=c[b];if(m)if(e.pageIds.includes(m.id)){if(s==="replace")e.pages[m.id]=m;else if(s==="byUpdateTime"){const d=e.pages[m.id];(!d||m.updatedAt&&m.updatedAt>d.updatedAt)&&(e.pages[m.id]=m)}}else e.pageIds.push(m.id),e.pages[m.id]=m}for(const b of l){const m=S[b];if(m)if(e.routeIds.includes(m.id)){if(s==="replace")e.routes[m.id]=m;else if(s==="byUpdateTime"){const d=e.routes[m.id];(!d||m.updatedAt&&m.updatedAt>d.updatedAt)&&(e.routes[m.id]=m)}}else e.routeIds.push(m.id),e.routes[m.id]=m}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...Ae.default(j)),o)for(const b of Object.keys(e.components))delete e.components[b];let T=JSON.parse(JSON.stringify(t.components));T=Object.fromEntries(await Promise.all(Object.entries(T).map(async([b,m])=>{const d=await Qe(m?.data);return[b,{...m,data:d}]}))),Object.assign(e.components,T),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Oe.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Qe=u.memoizeWithFs(async t=>{if(!Oe.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:a}=t?.renderer||{};if(a||e&&e.includes("PROPERTIES_SCHEMA"))try{const s=await u.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,a);s&&s.length>0&&t&&(t.properties={},s.forEach((o,n)=>{t?.properties&&(t.properties[o.id]={index:n,data:o})}))}catch(s){u.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:s})}}return t},{subdir:"getPropertiesFromCode"});let ue,Q,te,ae;const Ze=()=>Ee.getResources({types:[{did:Ce,type:we},{did:vt,type:we}]}),na=async()=>{const t=Ze(),e={};for(const a of t){const o=(await re.glob("**/.blocklet/pages/pages.config.yml",{cwd:a.path,absolute:!0}))[0],n=o&&p.join(p.dirname(o),"../../chunks");if(n&&await x(n)){const c=await D.readdir(n);for(const r of c)e[r]=p.join(n,r)}}return e};function et(){return ue=(async()=>{const t=Ze();Q=(await Promise.all(t.map(async a=>{const s=a.path?await Le(a.path,{importAssets:!1}):void 0;return s?{blockletId:a.did,state:s,blockletTitle:a.title}:void 0}))).filter(a=>!!a),te=Q.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.pages).map(o=>o?[o?.id,{page:o,blockletId:s.blockletId}]:[]))),{});const e=Q.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.components).map(o=>[o.data.id,{blockletId:s.blockletId,component:o.data}]))),{});ae=Object.fromEntries(await Promise.all(Object.entries(e).map(async([a,s])=>{const o=await Qe(s.component);return[a,{...s,component:o}]}))),u.logger.info(`reloadResourceStates success: ${Object.keys(ae||{}).length} components, ${Object.keys(te||{}).length} pages`)})(),ue}function tt(t){const e=Te.default(async()=>{await et().catch(a=>{u.logger.error("load resource states error",{error:a})}),await t?.({states:Q,pages:te,components:ae})},3e3,{leading:!1,trailing:!0});return E.default.events.on(E.default.Events.componentAdded,e),E.default.events.on(E.default.Events.componentRemoved,e),E.default.events.on(E.default.Events.componentStarted,e),E.default.events.on(E.default.Events.componentStopped,e),E.default.events.on(E.default.Events.componentUpdated,e),E.default.events.on(Ie,e),e(),()=>{E.default.events.off(E.default.Events.componentAdded,e),E.default.events.off(E.default.Events.componentRemoved,e),E.default.events.off(E.default.Events.componentStarted,e),E.default.events.off(E.default.Events.componentStopped,e),E.default.events.off(E.default.Events.componentUpdated,e),E.default.events.off(Ie,e)}}const at=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),st=globalThis;st[at]?.();st[at]=tt(async({pages:t,components:e})=>{const a=await C.getProjectIds();u.logger.info(`start update resource states projects(${a.length})`,a);const s=De.default(10);await Promise.race([new Promise(o=>{setTimeout(()=>{o({})},30*1e3)}),Promise.all(a.map(o=>s(async()=>{ot({projectId:o,pages:t,components:e})})))]).catch(o=>{u.logger.error("update resource states failed:",o)})});C.startPeriodicCheck();process.on("beforeExit",()=>{C.stopPeriodicCheck()});process.on("SIGINT",()=>{C.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{C.stopPeriodicCheck(),process.exit(0)});async function ot({projectId:t,pages:e,components:a}){const s=C.sharedInstances[t];if(!s){u.logger.info(`projectId: ${t} not found in sharedInstances`);return}const o=await $.findByPk(t,{attributes:{exclude:["productionState","relatedBlocklets"]}});let n;if(o?.useAllResources)n=a;else{const r=(await ke.findAll({where:{projectId:t}})).map(l=>l.componentId);n=Object.fromEntries(Object.entries(a||{}).filter(([l])=>r.includes(l)))}s.transact(()=>{s.syncedStore.resources.pages=e,u.logger.info(`[${t}] pages resources updated: ${Object.keys(e||{}).length} pages`),s.syncedStore.resources.components=n,u.logger.info(`[${t}] components resources updated: ${Object.keys(n||{}).length} components`)}),u.logger.info(`update [${t}] resource states summary:`,{pages:Object.keys(s.syncedStore.resources.pages||{}).length,components:Object.keys(s.syncedStore.resources.components||{}).length})}const ye=new Map;async function nt(t){if(!ye.has(t)){const e=Te.default(async a=>ot({projectId:a,pages:te,components:ae}),3e3);ye.set(t,e)}return ye.get(t)(t)}async function ra(){u.logger.info("trigger reload all project resource"),E.default.events.emit(Ie)}async function ia({ensureLoaded:t=!0}={}){return t&&(ue??=et(),await ue),{states:Q,pages:te,components:ae}}exports.COMPONENT_DID=Ce;exports.PUBLISH_MODES=sa;exports.Project=$;exports.RESOURCE_TYPE=we;exports.SITE_STATE_PATH=z;exports.STATE_MODES=aa;exports.SiteState=C;exports.copyRecursive=Ft;exports.downloadAsset=We;exports.downloadAssets=Ye;exports.fromPackage=Le;exports.getDefaultState=Ke;exports.getResourceStates=ia;exports.initPackResourceStates=tt;exports.mergeState=je;exports.toPackage=Xe;exports.triggerReloadAllProjectResource=ra;exports.updateResourceStatesByProjectId=nt;
|
package/lib/cjs/project-html.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-aaduHC9E.js"),T=require("./chunks/html-
|
|
1
|
+
"use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-aaduHC9E.js"),T=require("./chunks/html-xfTPTsl5.js"),W=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),A=require("@blocklet/pages-kit/utils/preload"),F=require("@blocklet/sdk/lib/component"),O=require("express"),P=require("fs"),J=require("lodash/get"),z=require("mustache"),j=require("ufo"),y=n=>n&&n.__esModule?n:{default:n},G=y(B),s=y(E),Y=y(C),Q=y(J),V=y(z),X=(n={})=>{const e={data:new Map,timers:new Map,set:(t,d,u=n.ttl||36e5)=>{n.max&&e.data.size>=n.max&&e.delete(e.data.keys().next().value),e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.set(t,setTimeout(()=>e.delete(t),u)),e.data.set(t,d)},get:t=>e.data.get(t),has:t=>e.data.has(t),delete:t=>(e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.delete(t),e.data.delete(t)),clear:()=>{e.data.clear();for(const t of e.timers.values())clearTimeout(t);e.timers.clear()}};return e},q=X({max:1,ttl:1e3*30});D.getWallet();const Z=new U.WalletAuthenticator;new H.WalletHandlers({authenticator:Z,tokenStorage:new G.default({dbPath:Y.default.join(s.default.env.dataDir,"auth.db")})});const ee=new K.BlockletService,te=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await ee.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ne=["/assets/"];function oe({app:n,viteDevServer:e,state:t}){let d;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(f,k,S)=>{const i=f.originalUrl;d=await e.transformIndexHtml(i,o),S()})}else d=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const u=O.Router();u.use((o,f,k)=>{if(o.headers["x-unique-record"]==="dial_http"){v.logger.info("[html] dial http request, return 200 status code"),f.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&u.use(W.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),u.get("/:path(*)?",async(o,f,k)=>{if(ne.some(c=>o.path?.startsWith(c))){k();return}const S="production";let i,b,g=d;if(o.path.startsWith("/pages")){const c=o.params.lang,_=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let m=(c&&w.has(c)?c:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!m||!t.supportedLocales?.find(h=>h.locale===m))&&(m=t.supportedLocales?.[0]?.locale||""),m){const h=[];Object.values(t.pages).forEach(a=>{const L=Object.values(a?.sections??{}).filter(r=>r.component==="custom-component"&&r.config?.componentId).map(r=>({id:r.id,componentId:r.config.componentId,useCache:r.config.useCache,cacheDuration:r.config.cacheDuration,properties:a?.dataSource?.[r.id]?.[m]}));h.push(...L)});const x=new Promise(a=>{setTimeout(()=>{a({})},30*1e3)});try{await Promise.race([x,v.getPreloadComponents({mode:S,req:o,state:t,locale:m,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(a=>{a&&(b=A.injectPreloadComponents(a))})])}catch(a){v.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",a)}}}try{const c=i?.title||s.default.env.appName,_=i?.description||s.default.env.appDescription,w=j.withQuery(j.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:c,description:_});g=V.default.render(d,{ogTitle:c,ogDescription:_,ogImage:se(i?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const p=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let l=i?.backgroundColor;if(l&&R.isMuiColorKey(l)){const c=await te();l=Q.default(c,`settings.theme.light.palette.${l}`,l)}const I=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
|
|
2
2
|
${l?`<meta name="theme-color" content="${l}" /><style>html,body,#app {background-color: ${l};}</style>`:""}
|
|
3
3
|
${p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.title}&display=swap">`:""}
|
|
4
4
|
${p?.description&&p?.description!==p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.description}&display=swap">`:""}
|
package/lib/cjs/resources.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const f=require("./chunks/components-aaduHC9E.js"),c=require("./chunks/site-state-
|
|
1
|
+
"use strict";const f=require("./chunks/components-aaduHC9E.js"),c=require("./chunks/site-state-B_SwLwSW.js"),U=require("express"),w=require("fs/promises"),T=require("joi"),M=require("lodash/groupBy"),q=require("lodash/sortBy"),C=require("@blocklet/sdk/lib/middlewares/auth"),L=require("@blocklet/sdk/lib/component"),J=require("path"),h=e=>e&&e.__esModule?e:{default:e},l=h(T),k=h(M),F=h(q),X=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s,{attributes:{exclude:["productionState","relatedBlocklets"]}});if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,i=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(f.isMultiTenant()){const I=n.createdBy===r,g=f.getMultiTenantAllProjectAccessPassports()?.includes?.(i);if(!I&&!g)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(i))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){f.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}},S=(e,t,o)=>f.isMultiTenant()?C.authMiddleware()(e,t,o):C.authMiddleware({roles:["owner","admin","pagesEditor"]})(e,t,o),G=(e,t)=>{const o=L.getResourceExportDir({projectId:e,releaseId:t});return J.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},y=U.Router(),D="@page",b="@component",m=":",R="ALL",A="@project",v=({pageId:e,projectId:t})=>[D,t,e].join(m),K=e=>{const[t,o,s]=e.split(m);if(t===D)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[b,t,e].join(m),W=e=>{const[t,o,s]=e.split(m);if(t===b)return{componentId:s,projectId:o}},Y=e=>[A,e].join(m),$=e=>{const[t,o]=e.split(m);if(t===A)return o},z=e=>{try{return JSON.parse(e)}catch{}return{}};async function B(e){const t=await c.SiteState.getStateByProjectId({projectId:e,mode:"production"}),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const i=t.pages[r];if(i)return{id:v({pageId:r,projectId:e}),name:i.slug}}).filter(Boolean),n=F.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:x({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Y(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:x({componentId:R,projectId:e}),name:"Components",children:n}]}}y.get("/resources",S,async(e,t)=>{const{projectId:o}=z(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await X(e,t,()=>{});const r=await B(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>B(r.id)));t.json({resources:n})});const H=l.default.object({projectId:l.default.string().required().min(1),releaseId:l.default.string().allow(""),resources:l.default.array().items(l.default.string()).required(),locale:l.default.string().allow("")});y.post("/resources",S,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await H.validateAsync(e.body),r="production",i=[],I=[];for(const a of o){if($(a))continue;const{pageId:d,projectId:P}=K(a)||{};if(d)d===R||d&&P&&i.push({pageId:d,projectId:P});else{const{componentId:j,projectId:u}=W(a)||{};j===R||j&&u&&I.push({componentId:j,projectId:u})}}const g=k.default(i,"projectId"),O=k.default(I,"projectId"),N=new Set([...Object.keys(g),...Object.keys(O)]),E=G(s,n);await w.rm(E,{recursive:!0,force:!0}),await w.mkdir(E,{recursive:!0});for(const a of N){const d=await c.SiteState.getStateByProjectId({projectId:a,mode:r}),P=g[a],j=O[a],u=P?.map(p=>p.pageId),_=j?.map(p=>p.componentId);if(u?.length||_?.length){const p=await c.toPackage(d,{exportAssets:!0,pageIds:u,componentIds:_});await c.copyRecursive(p,E),await w.rm(p,{recursive:!0,force:!0})}f.logger.info(`Exported resources for project ${a}`,{pageIds:u,componentIds:_})}t.json({})});y.get("/all-resources",S,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=y;
|
package/lib/cjs/site-state.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-aaduHC9E.js");const e=require("./chunks/site-state-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-aaduHC9E.js");const e=require("./chunks/site-state-B_SwLwSW.js"),u=require("@blocklet/pages-kit/utils/common");require("@blocklet/pages-kit/utils/page-model");require("@blocklet/pages-kit/utils/property");require("@blocklet/pages-kit/utils/route");require("@blocklet/sdk/lib/component");require("@blocklet/sdk/lib/config");require("@reactivedata/reactive");require("@syncedstore/core");require("fs");require("fs/promises");require("glob");require("lib0/decoding");require("lib0/encoding");require("lodash/cloneDeep");require("lodash/debounce");require("lodash/get");require("lodash/isEmpty");require("lodash/set");require("lodash/union");require("lru-cache");require("p-limit");require("path");require("sequelize");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");const t=require("@blocklet/pages-kit/types/state");exports.PUBLISH_MODES=e.PUBLISH_MODES;exports.SITE_STATE_PATH=e.SITE_STATE_PATH;exports.STATE_MODES=e.STATE_MODES;exports.default=e.SiteState;exports.downloadAsset=e.downloadAsset;exports.downloadAssets=e.downloadAssets;exports.fromPackage=e.fromPackage;exports.getDefaultState=e.getDefaultState;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;exports.updateResourceStatesByProjectId=e.updateResourceStatesByProjectId;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createHash as a } from "crypto";
|
|
2
|
+
import "ufo";
|
|
3
|
+
const s = async () => await import("cheerio"), o = {};
|
|
4
|
+
function u(t, e) {
|
|
5
|
+
const n = JSON.stringify([t, e]);
|
|
6
|
+
return a("md5").update(n).digest("hex");
|
|
7
|
+
}
|
|
8
|
+
async function i(t, e) {
|
|
9
|
+
{
|
|
10
|
+
let n = await s();
|
|
11
|
+
try {
|
|
12
|
+
const r = n.load(t);
|
|
13
|
+
return e.forEach((c) => {
|
|
14
|
+
r(c.selector.cheerio).replaceWith(c.value);
|
|
15
|
+
}), r.html();
|
|
16
|
+
} catch {
|
|
17
|
+
} finally {
|
|
18
|
+
n = null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return l(t, e);
|
|
22
|
+
}
|
|
23
|
+
function l(t, e) {
|
|
24
|
+
let n = t;
|
|
25
|
+
return e.forEach((r) => {
|
|
26
|
+
const c = typeof r.selector.pattern == "string" ? new RegExp(r.selector.pattern, "gis") : r.selector.pattern;
|
|
27
|
+
n = n.replace(c, r.value);
|
|
28
|
+
}), n;
|
|
29
|
+
}
|
|
30
|
+
async function f(t, e) {
|
|
31
|
+
if (!e || e.length === 0)
|
|
32
|
+
return t;
|
|
33
|
+
const n = u(t, e);
|
|
34
|
+
return o[n] ??= i(t, e).finally(() => {
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
delete o[n];
|
|
37
|
+
}, 10 * 1e3);
|
|
38
|
+
}), o[n];
|
|
39
|
+
}
|
|
40
|
+
function p(t) {
|
|
41
|
+
return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1] || "";
|
|
42
|
+
}
|
|
43
|
+
function g(t, e) {
|
|
44
|
+
return !e || Object.keys(e).length === 0 ? !0 : Object.entries(e).every(([n, r]) => t.includes(`${n}=${r}`));
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
p as e,
|
|
48
|
+
f as i,
|
|
49
|
+
g as m
|
|
50
|
+
};
|
|
@@ -35,7 +35,7 @@ import $t from "wait-on";
|
|
|
35
35
|
import { Awareness as Ut, encodeAwarenessUpdate as Me, removeAwarenessStates as Nt, applyAwarenessUpdate as Mt } from "y-protocols/awareness";
|
|
36
36
|
import { writeUpdate as _t, writeSyncStep1 as Ft, readSyncMessage as xt } from "y-protocols/sync";
|
|
37
37
|
import * as q from "yaml";
|
|
38
|
-
import { m as _e } from "./html-
|
|
38
|
+
import { m as _e } from "./html-DOgzvdOd.js";
|
|
39
39
|
import "@blocklet/pages-kit/types/state";
|
|
40
40
|
const Bt = b.sqlite.DATE.parse;
|
|
41
41
|
b.sqlite.DATE.parse = (t, e) => typeof t == "number" ? new Date(t) : Bt(t, e);
|
|
@@ -173,10 +173,10 @@ class U extends Ee {
|
|
|
173
173
|
return K((n) => `Project slug "${n}" contains invalid characters`);
|
|
174
174
|
if (E.components?.filter((n) => n.mountPoint && !Yt(n)).some((n) => xe(n.mountPoint) === o))
|
|
175
175
|
return K((n) => `Project slug "${n}" conflicts with existing blocklet`);
|
|
176
|
-
const
|
|
176
|
+
const c = await U.findOne({
|
|
177
177
|
where: { slug: a }
|
|
178
178
|
});
|
|
179
|
-
return
|
|
179
|
+
return c && c?.id !== s ? Kt : null;
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
U.init(
|
|
@@ -413,32 +413,32 @@ ee.init(
|
|
|
413
413
|
);
|
|
414
414
|
function Xt(t) {
|
|
415
415
|
const { projectId: e, projectSlug: s, state: a } = t, o = s || e, r = gt(
|
|
416
|
-
E.env.languages?.map((
|
|
417
|
-
a.supportedLocales?.map((
|
|
418
|
-
),
|
|
419
|
-
o && (
|
|
416
|
+
E.env.languages?.map((l) => l.code) || [],
|
|
417
|
+
a.supportedLocales?.map((l) => l.locale) || []
|
|
418
|
+
), c = {}, n = (l, h) => {
|
|
419
|
+
o && (c[x("/", o, l)] = {
|
|
420
420
|
...h,
|
|
421
421
|
shouldRedirect: !0,
|
|
422
422
|
mainPage: !0
|
|
423
|
-
}),
|
|
423
|
+
}), c[x("/", e, l)] = {
|
|
424
424
|
...h,
|
|
425
425
|
shouldRedirect: !0,
|
|
426
426
|
mainPage: !0
|
|
427
427
|
};
|
|
428
428
|
for (const P of r) {
|
|
429
429
|
const O = { ...h, locale: P };
|
|
430
|
-
|
|
430
|
+
c[x("/", P, e, l)] = O, o && (c[x("/", P, o, l)] = O);
|
|
431
431
|
}
|
|
432
432
|
};
|
|
433
|
-
for (const
|
|
434
|
-
const h = a.pages?.[
|
|
433
|
+
for (const l of a.pageIds || []) {
|
|
434
|
+
const h = a.pages?.[l];
|
|
435
435
|
if (!h || !h.isPublic)
|
|
436
436
|
continue;
|
|
437
437
|
const P = {
|
|
438
438
|
projectId: e,
|
|
439
439
|
projectSlug: o,
|
|
440
440
|
pageSlug: h.slug,
|
|
441
|
-
pageId:
|
|
441
|
+
pageId: l,
|
|
442
442
|
defaultLocale: r?.[0],
|
|
443
443
|
locales: r,
|
|
444
444
|
publishedAt: a.config?.publishedAt,
|
|
@@ -446,7 +446,7 @@ function Xt(t) {
|
|
|
446
446
|
};
|
|
447
447
|
n(h.slug, P);
|
|
448
448
|
}
|
|
449
|
-
return
|
|
449
|
+
return c;
|
|
450
450
|
}
|
|
451
451
|
async function Qt(t, e, s) {
|
|
452
452
|
const a = t.map((r) => r.urlPath), o = await ee.findAll({
|
|
@@ -467,11 +467,11 @@ async function Qt(t, e, s) {
|
|
|
467
467
|
`[URL Duplicate Warning] Found ${o.length} URL conflicts for project ${e}:`
|
|
468
468
|
);
|
|
469
469
|
for (const r of o) {
|
|
470
|
-
const
|
|
471
|
-
if (
|
|
470
|
+
const c = t.find((n) => n.urlPath === r.urlPath);
|
|
471
|
+
if (c) {
|
|
472
472
|
const n = r.projectSlug ? x(r.projectSlug, r.pageSlug) : r.pageSlug;
|
|
473
473
|
p.warn(
|
|
474
|
-
` - URL "${r.urlPath}" conflicts with project ${r.projectId} (${n}). Current project trying to use same URL for page: ${
|
|
474
|
+
` - URL "${r.urlPath}" conflicts with project ${r.projectId} (${n}). Current project trying to use same URL for page: ${c.pageSlug}`
|
|
475
475
|
);
|
|
476
476
|
}
|
|
477
477
|
}
|
|
@@ -487,35 +487,35 @@ async function Zt(t) {
|
|
|
487
487
|
where: { projectId: e },
|
|
488
488
|
transaction: s
|
|
489
489
|
});
|
|
490
|
-
const a = Xt(t), o = Object.entries(a).map(([r,
|
|
490
|
+
const a = Xt(t), o = Object.entries(a).map(([r, c]) => ({
|
|
491
491
|
projectId: e,
|
|
492
492
|
urlPath: r,
|
|
493
|
-
projectSlug:
|
|
494
|
-
pageSlug:
|
|
495
|
-
pageId:
|
|
496
|
-
routeId:
|
|
497
|
-
locale:
|
|
498
|
-
defaultLocale:
|
|
499
|
-
shouldRedirect:
|
|
500
|
-
mainPage:
|
|
501
|
-
isPublic:
|
|
502
|
-
publishedAt: typeof
|
|
503
|
-
locales:
|
|
493
|
+
projectSlug: c.projectSlug,
|
|
494
|
+
pageSlug: c.pageSlug,
|
|
495
|
+
pageId: c.pageId,
|
|
496
|
+
routeId: c.routeId,
|
|
497
|
+
locale: c.locale,
|
|
498
|
+
defaultLocale: c.defaultLocale,
|
|
499
|
+
shouldRedirect: c.shouldRedirect,
|
|
500
|
+
mainPage: c.mainPage,
|
|
501
|
+
isPublic: c.isPublic,
|
|
502
|
+
publishedAt: typeof c.publishedAt == "number" ? c.publishedAt : void 0,
|
|
503
|
+
locales: c.locales
|
|
504
504
|
}));
|
|
505
505
|
if (o.length > 0) {
|
|
506
506
|
await Qt(o, e, s);
|
|
507
|
-
const r = 100,
|
|
507
|
+
const r = 100, c = [];
|
|
508
508
|
for (let n = 0; n < o.length; n += r) {
|
|
509
|
-
const
|
|
510
|
-
|
|
511
|
-
ee.bulkCreate(
|
|
509
|
+
const l = o.slice(n, n + r);
|
|
510
|
+
c.push(
|
|
511
|
+
ee.bulkCreate(l, {
|
|
512
512
|
transaction: s,
|
|
513
513
|
ignoreDuplicates: !0
|
|
514
514
|
// 忽略重复数据,避免因脏数据导致整批插入失败
|
|
515
515
|
})
|
|
516
516
|
);
|
|
517
517
|
}
|
|
518
|
-
await Promise.all(
|
|
518
|
+
await Promise.all(c), p.info(`Regenerated ${o.length} URL mappings for project ${e}`);
|
|
519
519
|
}
|
|
520
520
|
return o.length;
|
|
521
521
|
} catch (a) {
|
|
@@ -584,8 +584,8 @@ function as(t, e) {
|
|
|
584
584
|
for (const s of e || Object.keys(t.routes || {})) {
|
|
585
585
|
let a = s, o = [];
|
|
586
586
|
if (s.includes("-")) {
|
|
587
|
-
const [r, ...
|
|
588
|
-
a = r, o =
|
|
587
|
+
const [r, ...c] = s.split("-");
|
|
588
|
+
a = r, o = c || [];
|
|
589
589
|
}
|
|
590
590
|
if (t.routes?.[a] !== void 0) {
|
|
591
591
|
t.routes[a].publishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -593,11 +593,11 @@ function as(t, e) {
|
|
|
593
593
|
if (!r || !r.params || r.params.length === 0)
|
|
594
594
|
continue;
|
|
595
595
|
if (s.includes("-") && o.length > 0) {
|
|
596
|
-
const
|
|
597
|
-
|
|
596
|
+
const c = ft(o, r);
|
|
597
|
+
c && (c.publishedAt = (/* @__PURE__ */ new Date()).toISOString());
|
|
598
598
|
}
|
|
599
599
|
if (!e) {
|
|
600
|
-
const
|
|
600
|
+
const c = Pe({
|
|
601
601
|
basePath: r.path,
|
|
602
602
|
params: r.params,
|
|
603
603
|
routeId: r.id,
|
|
@@ -607,7 +607,7 @@ function as(t, e) {
|
|
|
607
607
|
currentOptionIds: [],
|
|
608
608
|
result: []
|
|
609
609
|
});
|
|
610
|
-
for (const n of
|
|
610
|
+
for (const n of c)
|
|
611
611
|
n.routeMetaData ??= {}, n.routeMetaData.publishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
612
612
|
}
|
|
613
613
|
}
|
|
@@ -632,14 +632,14 @@ function me({
|
|
|
632
632
|
publishedAt: o?.routeMetaData?.publishedAt ?? e.publishedAt,
|
|
633
633
|
isPublic: (o?.routeMetaData?.isPublic ?? e.isPublic) && e.isPublic
|
|
634
634
|
};
|
|
635
|
-
for (const
|
|
635
|
+
for (const c of s.supportedLocales) {
|
|
636
636
|
if (e.dataSource) {
|
|
637
637
|
let n = e.id;
|
|
638
638
|
o && (n = o.paramOptionIds.join("-"));
|
|
639
|
-
const
|
|
640
|
-
if (!
|
|
639
|
+
const l = e.dataSource.pathDataMappings?.[n]?.dataCache?.[c.locale] ?? e.dataSource.pathDataMappings?.[n]?.dataCache?.[s.config.defaultLocale || "en"];
|
|
640
|
+
if (!l)
|
|
641
641
|
continue;
|
|
642
|
-
dt(r, s,
|
|
642
|
+
dt(r, s, c.locale, l);
|
|
643
643
|
}
|
|
644
644
|
o && o.routeMetaData && (o.routeMetaData.publishedAt = (/* @__PURE__ */ new Date()).toISOString());
|
|
645
645
|
}
|
|
@@ -657,13 +657,13 @@ function rs(t, e = []) {
|
|
|
657
657
|
let s = 0;
|
|
658
658
|
const a = Array.from(Y.keys()), o = t.map((r) => je(r));
|
|
659
659
|
for (const r of a)
|
|
660
|
-
for (const
|
|
661
|
-
if (_e(r, { currentPath:
|
|
660
|
+
for (const c of o) {
|
|
661
|
+
if (_e(r, { currentPath: c })) {
|
|
662
662
|
Y.delete(r), s++, p.info(`[Cache CLEAR] key: ${r}`);
|
|
663
663
|
break;
|
|
664
664
|
}
|
|
665
665
|
for (const n of e)
|
|
666
|
-
if (_e(r, { currentPath: `/${n}${
|
|
666
|
+
if (_e(r, { currentPath: `/${n}${c}` })) {
|
|
667
667
|
Y.delete(r), s++, p.info(`[Cache CLEAR] key: ${r}`);
|
|
668
668
|
break;
|
|
669
669
|
}
|
|
@@ -772,7 +772,7 @@ class D extends F.Doc {
|
|
|
772
772
|
const a = A(H, e, "production"), o = await Ze(a, { includeResources: !0 }) ?? fs();
|
|
773
773
|
if (!o?.config?.defaultLocale) {
|
|
774
774
|
o.config ??= {};
|
|
775
|
-
const r = Ie.env.languages?.map((
|
|
775
|
+
const r = Ie.env.languages?.map((c) => ({ locale: c.code, name: c.name })) || [];
|
|
776
776
|
o.config.defaultLocale = r[0]?.locale;
|
|
777
777
|
}
|
|
778
778
|
return o;
|
|
@@ -808,24 +808,25 @@ class D extends F.Doc {
|
|
|
808
808
|
return D.getProductionState(s);
|
|
809
809
|
}
|
|
810
810
|
async setState(e, s) {
|
|
811
|
-
if (e
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
|
|
811
|
+
if (e !== "production")
|
|
812
|
+
return;
|
|
813
|
+
const a = $(this.options.path), o = Ae(s);
|
|
814
|
+
await _.transaction(async (r) => {
|
|
815
|
+
await U.update({ productionState: o }, { where: { id: a }, transaction: r });
|
|
816
|
+
const c = await U.findByPk(a, {
|
|
817
|
+
attributes: ["slug"],
|
|
818
|
+
transaction: r
|
|
819
|
+
}), n = await Zt({
|
|
820
|
+
projectId: a,
|
|
821
|
+
projectSlug: c?.slug,
|
|
822
|
+
state: s,
|
|
823
|
+
transaction: r
|
|
824
|
+
});
|
|
825
|
+
p.info(`[SiteState] saved ${n} URL mappings for project ${a}`);
|
|
826
|
+
}), await this.clearPageCacheForRoutes(void 0, s), setImmediate(async () => {
|
|
827
|
+
const r = await ys(s, { exportAssets: !1, includeResources: !0 }), c = this.getPublishDir(e);
|
|
828
|
+
await B(M(c), { recursive: !0 }), await We(c, { force: !0, recursive: !0 }), await Ue(r, c), p.info(`[SiteState] saved package for project ${a} in ${e} mode`);
|
|
829
|
+
});
|
|
829
830
|
}
|
|
830
831
|
getPublishDir(e) {
|
|
831
832
|
return A(this.options.path, e);
|
|
@@ -838,17 +839,17 @@ class D extends F.Doc {
|
|
|
838
839
|
awarenessChangeHandler = ({ added: e, updated: s, removed: a }, o) => {
|
|
839
840
|
const r = e.concat(s, a);
|
|
840
841
|
if (o !== null) {
|
|
841
|
-
const
|
|
842
|
-
|
|
843
|
-
|
|
842
|
+
const l = this.conns.get(o);
|
|
843
|
+
l && (e.forEach((h) => {
|
|
844
|
+
l.add(h);
|
|
844
845
|
}), a.forEach((h) => {
|
|
845
|
-
|
|
846
|
+
l.delete(h);
|
|
846
847
|
}));
|
|
847
848
|
}
|
|
848
|
-
const
|
|
849
|
-
v.writeVarUint(
|
|
850
|
-
const n = v.toUint8Array(
|
|
851
|
-
this.conns.forEach((
|
|
849
|
+
const c = v.createEncoder();
|
|
850
|
+
v.writeVarUint(c, ge), v.writeVarUint8Array(c, Me(this.awareness, r));
|
|
851
|
+
const n = v.toUint8Array(c);
|
|
852
|
+
this.conns.forEach((l, h) => this.send(h, n));
|
|
852
853
|
};
|
|
853
854
|
updateHandler = (e) => {
|
|
854
855
|
const s = v.createEncoder();
|
|
@@ -858,30 +859,30 @@ class D extends F.Doc {
|
|
|
858
859
|
};
|
|
859
860
|
ensureDataStructure = () => {
|
|
860
861
|
this.transact(() => {
|
|
861
|
-
const { supportedLocales: e, pages: s, pageIds: a, config: o, routes: r, routeIds:
|
|
862
|
+
const { supportedLocales: e, pages: s, pageIds: a, config: o, routes: r, routeIds: c } = this.syncedStore;
|
|
862
863
|
{
|
|
863
864
|
const n = new Set(Object.keys(s));
|
|
864
|
-
let
|
|
865
|
-
for (;
|
|
866
|
-
const h = a[
|
|
867
|
-
n.has(h) ? (n.delete(h),
|
|
865
|
+
let l = 0;
|
|
866
|
+
for (; l < a.length; ) {
|
|
867
|
+
const h = a[l];
|
|
868
|
+
n.has(h) ? (n.delete(h), l++) : a.splice(l, 1);
|
|
868
869
|
}
|
|
869
870
|
}
|
|
870
871
|
{
|
|
871
872
|
const n = new Set(Object.keys(r));
|
|
872
|
-
let
|
|
873
|
-
for (;
|
|
874
|
-
const h = l
|
|
875
|
-
n.has(h) ? (n.delete(h),
|
|
873
|
+
let l = 0;
|
|
874
|
+
for (; l < c.length; ) {
|
|
875
|
+
const h = c[l];
|
|
876
|
+
n.has(h) ? (n.delete(h), l++) : c.splice(l, 1);
|
|
876
877
|
}
|
|
877
878
|
}
|
|
878
879
|
e.splice(0, e.length), e.push(...Ie.env.languages.map((n) => ({ locale: n.code, name: n.name }))), o.defaultLocale = e[0]?.locale;
|
|
879
880
|
{
|
|
880
881
|
let n = 0;
|
|
881
|
-
const
|
|
882
|
+
const l = /* @__PURE__ */ new Set();
|
|
882
883
|
for (; n < e.length; ) {
|
|
883
884
|
const { locale: h } = e[n];
|
|
884
|
-
|
|
885
|
+
l.has(h) ? e.splice(n, 1) : (n++, l.add(h));
|
|
885
886
|
}
|
|
886
887
|
}
|
|
887
888
|
});
|
|
@@ -943,30 +944,30 @@ class D extends F.Doc {
|
|
|
943
944
|
const a = JSON.parse(JSON.stringify(s));
|
|
944
945
|
e.config.fontFamily ??= {};
|
|
945
946
|
const o = a.config?.fontFamily, r = e.config?.fontFamily;
|
|
946
|
-
e.config.fontFamily.title = o?.title || r?.title, e.config.fontFamily.description = o?.description || r?.description, await new Promise((
|
|
947
|
+
e.config.fontFamily.title = o?.title || r?.title, e.config.fontFamily.description = o?.description || r?.description, await new Promise((c, n) => {
|
|
947
948
|
this.transact(async () => {
|
|
948
949
|
try {
|
|
949
|
-
const
|
|
950
|
-
l
|
|
951
|
-
} catch (
|
|
952
|
-
n(
|
|
950
|
+
const l = await Ve(e, s);
|
|
951
|
+
c(l);
|
|
952
|
+
} catch (l) {
|
|
953
|
+
n(l);
|
|
953
954
|
}
|
|
954
955
|
});
|
|
955
956
|
});
|
|
956
957
|
};
|
|
957
958
|
clearPageCacheForRoutes = async (e, s) => {
|
|
958
959
|
const a = $(this.options.path), r = (await U.findByPk(a))?.slug || a;
|
|
959
|
-
let
|
|
960
|
-
(!
|
|
961
|
-
const n = s.supportedLocales.map((P) => P.locale),
|
|
960
|
+
let c = e;
|
|
961
|
+
(!c || c.length === 0) && (c = s.pageIds ?? []), p.info(`[SiteState] clearing page cache for project ${a}, routes:`, c || []);
|
|
962
|
+
const n = s.supportedLocales.map((P) => P.locale), l = [], h = c.filter((P) => s.pageIds?.includes(P));
|
|
962
963
|
for (const P of h) {
|
|
963
964
|
const w = s.pages[P].slug;
|
|
964
|
-
r && r !== a && (r === "/" ?
|
|
965
|
+
r && r !== a && (r === "/" ? l.push(w) : l.push(`${r.startsWith("/") ? "" : "/"}${r}${w}`)), l.push(`/${a}${w}`);
|
|
965
966
|
}
|
|
966
|
-
if (
|
|
967
|
+
if (l.length > 0)
|
|
967
968
|
try {
|
|
968
|
-
const P = rs(
|
|
969
|
-
p.info(`[SiteState] cleared ${P} page cache entries for project ${a}, routes:`,
|
|
969
|
+
const P = rs(l, n);
|
|
970
|
+
p.info(`[SiteState] cleared ${P} page cache entries for project ${a}, routes:`, c);
|
|
970
971
|
} catch {
|
|
971
972
|
}
|
|
972
973
|
};
|
|
@@ -997,8 +998,8 @@ class D extends F.Doc {
|
|
|
997
998
|
v.writeVarUint(o, oe), Ft(o, this), this.send(e, v.toUint8Array(o));
|
|
998
999
|
const r = this.awareness.getStates();
|
|
999
1000
|
if (r.size > 0) {
|
|
1000
|
-
const
|
|
1001
|
-
v.writeVarUint(
|
|
1001
|
+
const c = v.createEncoder();
|
|
1002
|
+
v.writeVarUint(c, ge), v.writeVarUint8Array(c, Me(this.awareness, Array.from(r.keys()))), this.send(e, v.toUint8Array(c));
|
|
1002
1003
|
}
|
|
1003
1004
|
}
|
|
1004
1005
|
};
|
|
@@ -1024,40 +1025,40 @@ class D extends F.Doc {
|
|
|
1024
1025
|
// 这个方法还是需要动态的,因为可能会动态修改 projectSlug、语言之类的
|
|
1025
1026
|
static async pageUrlMap(e, s) {
|
|
1026
1027
|
if (p.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${s}`), e === "production") {
|
|
1027
|
-
const r = s ? { projectId: s } : {},
|
|
1028
|
+
const r = s ? { projectId: s } : {}, c = await ee.findAll({
|
|
1028
1029
|
where: r,
|
|
1029
1030
|
raw: !0
|
|
1030
1031
|
}), n = {};
|
|
1031
|
-
for (const
|
|
1032
|
-
n[
|
|
1033
|
-
projectId:
|
|
1034
|
-
projectSlug:
|
|
1035
|
-
pageSlug:
|
|
1036
|
-
pageId:
|
|
1037
|
-
routeId:
|
|
1038
|
-
locale:
|
|
1039
|
-
defaultLocale:
|
|
1040
|
-
shouldRedirect:
|
|
1041
|
-
mainPage:
|
|
1042
|
-
isPublic:
|
|
1043
|
-
publishedAt:
|
|
1044
|
-
locales:
|
|
1032
|
+
for (const l of c)
|
|
1033
|
+
n[l.urlPath] = {
|
|
1034
|
+
projectId: l.projectId,
|
|
1035
|
+
projectSlug: l.projectSlug,
|
|
1036
|
+
pageSlug: l.pageSlug,
|
|
1037
|
+
pageId: l.pageId,
|
|
1038
|
+
routeId: l.routeId,
|
|
1039
|
+
locale: l.locale,
|
|
1040
|
+
defaultLocale: l.defaultLocale,
|
|
1041
|
+
shouldRedirect: l.shouldRedirect,
|
|
1042
|
+
mainPage: l.mainPage,
|
|
1043
|
+
isPublic: l.isPublic,
|
|
1044
|
+
publishedAt: l.publishedAt,
|
|
1045
|
+
locales: l.locales
|
|
1045
1046
|
};
|
|
1046
|
-
return p.info(`[SiteState] loaded ${
|
|
1047
|
+
return p.info(`[SiteState] loaded ${c.length} URL mappings from database`), n;
|
|
1047
1048
|
}
|
|
1048
1049
|
let a = [];
|
|
1049
1050
|
s ? a = [s] : a = await this.getProjectIds();
|
|
1050
1051
|
let o = {};
|
|
1051
1052
|
if (a?.length) {
|
|
1052
1053
|
p.info("[SiteState] find project infos from database, projectIds: ", a);
|
|
1053
|
-
const r = 30,
|
|
1054
|
+
const r = 30, c = Oe(5);
|
|
1054
1055
|
for (let n = 0; n < a.length; n += r) {
|
|
1055
|
-
const
|
|
1056
|
-
p.info(`[SiteState] processing project batch ${n / r + 1}, ids: `,
|
|
1056
|
+
const l = a.slice(n, n + r);
|
|
1057
|
+
p.info(`[SiteState] processing project batch ${n / r + 1}, ids: `, l);
|
|
1057
1058
|
const h = await U.findAll({
|
|
1058
1059
|
where: {
|
|
1059
1060
|
id: {
|
|
1060
|
-
[Z.in]:
|
|
1061
|
+
[Z.in]: l
|
|
1061
1062
|
}
|
|
1062
1063
|
},
|
|
1063
1064
|
attributes: {
|
|
@@ -1066,7 +1067,7 @@ class D extends F.Doc {
|
|
|
1066
1067
|
});
|
|
1067
1068
|
await Promise.all(
|
|
1068
1069
|
h?.map(
|
|
1069
|
-
(P) =>
|
|
1070
|
+
(P) => c(async () => {
|
|
1070
1071
|
const O = P.id, w = P.slug || O, m = {}, u = await D.getStateByProjectId({ projectId: P.id, mode: e, clone: !1 }), I = vt(
|
|
1071
1072
|
E.env.languages?.map((j) => j.code) || [],
|
|
1072
1073
|
u.supportedLocales?.map((j) => j.locale) || []
|
|
@@ -1196,9 +1197,9 @@ class D extends F.Doc {
|
|
|
1196
1197
|
s.map((r) => r.projectId)
|
|
1197
1198
|
);
|
|
1198
1199
|
let o = 0;
|
|
1199
|
-
for (const { projectId: r, instance:
|
|
1200
|
+
for (const { projectId: r, instance: c } of s)
|
|
1200
1201
|
try {
|
|
1201
|
-
p.info(`[SiteState] releasing instance due to periodic check: ${r}`),
|
|
1202
|
+
p.info(`[SiteState] releasing instance due to periodic check: ${r}`), c.destroy(), o++;
|
|
1202
1203
|
} catch (n) {
|
|
1203
1204
|
p.error(`[SiteState] failed to release instance ${r} during periodic check:`, n);
|
|
1204
1205
|
}
|
|
@@ -1250,10 +1251,10 @@ function Qe(t) {
|
|
|
1250
1251
|
return ve.test(t) ? [t] : X.test(t) ? (Be.lastIndex = 0, Array.from(t.matchAll(Be)).map((s) => s[1]).filter((s) => !!s)) : [];
|
|
1251
1252
|
}
|
|
1252
1253
|
async function re(t, e, s) {
|
|
1253
|
-
const { getFilename: a, exportAssets: o, useWorker: r } = s,
|
|
1254
|
-
await B(M(
|
|
1254
|
+
const { getFilename: a, exportAssets: o, useWorker: r } = s, c = A(e, a(t));
|
|
1255
|
+
await B(M(c), { recursive: !0 });
|
|
1255
1256
|
const n = r ? await es(t) : q.stringify(t);
|
|
1256
|
-
if (await ie(
|
|
1257
|
+
if (await ie(c, n), o) {
|
|
1257
1258
|
const h = le(
|
|
1258
1259
|
t,
|
|
1259
1260
|
(P) => typeof P == "string" && (ve.test(P) || X.test(P))
|
|
@@ -1261,7 +1262,7 @@ async function re(t, e, s) {
|
|
|
1261
1262
|
const O = Ce(t, P);
|
|
1262
1263
|
return Qe(O);
|
|
1263
1264
|
}).flat().filter(Boolean);
|
|
1264
|
-
await hs(h, M(
|
|
1265
|
+
await hs(h, M(c));
|
|
1265
1266
|
}
|
|
1266
1267
|
}
|
|
1267
1268
|
const be = new Je({
|
|
@@ -1276,22 +1277,22 @@ async function Ge(t, e, s) {
|
|
|
1276
1277
|
), o = Oe(2), r = a.map(
|
|
1277
1278
|
(n) => o(async () => {
|
|
1278
1279
|
try {
|
|
1279
|
-
const
|
|
1280
|
+
const l = Ce(t, n), h = Qe(l);
|
|
1280
1281
|
for (const P of h) {
|
|
1281
1282
|
const O = $(P), w = s.getFilePath(P, n), m = w ? `${w}:${O}` : O, u = be.get(m);
|
|
1282
1283
|
if (u) {
|
|
1283
|
-
X.test(
|
|
1284
|
+
X.test(l) || Ne(t, n, u);
|
|
1284
1285
|
return;
|
|
1285
1286
|
}
|
|
1286
1287
|
const I = await ms(w, O, e);
|
|
1287
|
-
I && (X.test(
|
|
1288
|
+
I && (X.test(l) || Ne(t, n, I), be.set(m, I));
|
|
1288
1289
|
}
|
|
1289
|
-
} catch (
|
|
1290
|
-
p.error(`Failed to process upload for path ${n.join(".")}:`,
|
|
1290
|
+
} catch (l) {
|
|
1291
|
+
p.error(`Failed to process upload for path ${n.join(".")}:`, l.message || l.reason);
|
|
1291
1292
|
}
|
|
1292
1293
|
})
|
|
1293
|
-
),
|
|
1294
|
-
s.onFinish?.(
|
|
1294
|
+
), c = await Promise.allSettled(r);
|
|
1295
|
+
s.onFinish?.(c);
|
|
1295
1296
|
}
|
|
1296
1297
|
async function ys(t, {
|
|
1297
1298
|
exportAssets: e,
|
|
@@ -1299,17 +1300,17 @@ async function ys(t, {
|
|
|
1299
1300
|
componentIds: a = "all",
|
|
1300
1301
|
rawConfig: o,
|
|
1301
1302
|
includeResources: r = !1,
|
|
1302
|
-
routeIds:
|
|
1303
|
+
routeIds: c = "all"
|
|
1303
1304
|
} = {}) {
|
|
1304
|
-
const n = s === "all" ? t.pageIds : s,
|
|
1305
|
+
const n = s === "all" ? t.pageIds : s, l = At({
|
|
1305
1306
|
state: t,
|
|
1306
1307
|
pageIds: n,
|
|
1307
1308
|
componentIds: a === "all" ? Object.keys(t.components) : a
|
|
1308
1309
|
});
|
|
1309
1310
|
Object.entries(t.components).forEach(([i, d]) => {
|
|
1310
|
-
d.data?.renderer?.type === "component-template" &&
|
|
1311
|
+
d.data?.renderer?.type === "component-template" && l.push(i);
|
|
1311
1312
|
});
|
|
1312
|
-
const h =
|
|
1313
|
+
const h = c === "all" ? t.routeIds : c, P = (i) => ({
|
|
1313
1314
|
id: i.id,
|
|
1314
1315
|
name: i.name,
|
|
1315
1316
|
isTemplateSection: i.isTemplateSection ?? !1,
|
|
@@ -1391,7 +1392,7 @@ async function ys(t, {
|
|
|
1391
1392
|
getFilename: () => `${pe(i.path) || "index"}.yml`,
|
|
1392
1393
|
exportAssets: e
|
|
1393
1394
|
});
|
|
1394
|
-
for (const i of
|
|
1395
|
+
for (const i of l) {
|
|
1395
1396
|
const d = t.components[i]?.data;
|
|
1396
1397
|
d && await re(d, j, {
|
|
1397
1398
|
getFilename: (f) => `${f.name || "unnamed"}.${f.id}.yml`,
|
|
@@ -1414,7 +1415,7 @@ async function ys(t, {
|
|
|
1414
1415
|
})
|
|
1415
1416
|
),
|
|
1416
1417
|
components: L(
|
|
1417
|
-
|
|
1418
|
+
l.map((i) => {
|
|
1418
1419
|
const d = t.components[i]?.data;
|
|
1419
1420
|
return d && {
|
|
1420
1421
|
id: i,
|
|
@@ -1425,7 +1426,7 @@ async function ys(t, {
|
|
|
1425
1426
|
...r ? {
|
|
1426
1427
|
resources: {
|
|
1427
1428
|
components: L(
|
|
1428
|
-
Object.keys(t.resources?.components || {}).filter((i) =>
|
|
1429
|
+
Object.keys(t.resources?.components || {}).filter((i) => l.includes(i)).map((i) => ({
|
|
1429
1430
|
id: i,
|
|
1430
1431
|
name: t.resources?.components?.[i]?.component?.name
|
|
1431
1432
|
}))
|
|
@@ -1441,7 +1442,7 @@ async function ys(t, {
|
|
|
1441
1442
|
const i = A(I, "resources"), d = A(i, "components");
|
|
1442
1443
|
await B(d, { recursive: !0 });
|
|
1443
1444
|
for (const N of Object.keys(t?.resources?.components ?? {}).filter(
|
|
1444
|
-
(T) =>
|
|
1445
|
+
(T) => l.includes(T)
|
|
1445
1446
|
)) {
|
|
1446
1447
|
const T = t.resources?.components?.[N]?.component;
|
|
1447
1448
|
T && await re(T, d, {
|
|
@@ -1453,7 +1454,7 @@ async function ys(t, {
|
|
|
1453
1454
|
await B(f, { recursive: !0 });
|
|
1454
1455
|
const C = await Ss();
|
|
1455
1456
|
for (const N of Object.keys(t?.resources?.components ?? {}).filter(
|
|
1456
|
-
(T) =>
|
|
1457
|
+
(T) => l.includes(T)
|
|
1457
1458
|
)) {
|
|
1458
1459
|
const T = t.resources?.components?.[N]?.component;
|
|
1459
1460
|
if (T && T.renderer?.type === "react-component") {
|
|
@@ -1478,7 +1479,7 @@ async function Ze(t, { importAssets: e, includeResources: s } = {}) {
|
|
|
1478
1479
|
let a, o = !1;
|
|
1479
1480
|
try {
|
|
1480
1481
|
(await ne(t)).isDirectory() ? a = t : /\.(tgz|gz|tar)$/.test(t) && (o = !0, a = Xe(), await Lt({ file: t, C: a }));
|
|
1481
|
-
const n = (await ye("**/.blocklet/pages/pages.config.yml", { cwd: a, absolute: !0 }))[0],
|
|
1482
|
+
const n = (await ye("**/.blocklet/pages/pages.config.yml", { cwd: a, absolute: !0 }))[0], l = n && A(M(n), "../../pages"), h = n && A(M(n), "../../components"), P = n && A(M(n), "../../routes");
|
|
1482
1483
|
if (!n)
|
|
1483
1484
|
return null;
|
|
1484
1485
|
const O = await ae(n, "utf-8"), w = q.parse(O), m = async (g, y, i) => {
|
|
@@ -1509,10 +1510,10 @@ async function Ze(t, { importAssets: e, includeResources: s } = {}) {
|
|
|
1509
1510
|
const y = L(
|
|
1510
1511
|
await Promise.all(
|
|
1511
1512
|
w.supportedLocales.map(async ({ locale: f }) => {
|
|
1512
|
-
const C =
|
|
1513
|
+
const C = l ? await m(l, pe(g), f) : void 0;
|
|
1513
1514
|
if (C)
|
|
1514
1515
|
return { locale: f, page: C };
|
|
1515
|
-
const N =
|
|
1516
|
+
const N = l ? await m(l, g, f) : void 0;
|
|
1516
1517
|
return N && { locale: f, page: N };
|
|
1517
1518
|
})
|
|
1518
1519
|
)
|
|
@@ -1603,7 +1604,7 @@ async function Ze(t, { importAssets: e, includeResources: s } = {}) {
|
|
|
1603
1604
|
Ge(R, i, {
|
|
1604
1605
|
getFilePath: (d, f) => {
|
|
1605
1606
|
const C = Ce(R, f.slice(0, 1));
|
|
1606
|
-
return
|
|
1607
|
+
return l && A(l, M(C.slug), d);
|
|
1607
1608
|
},
|
|
1608
1609
|
onFinish: (d) => {
|
|
1609
1610
|
g(`upload ${d.length} page assets`);
|
|
@@ -1652,10 +1653,10 @@ async function Ve(t, e, {
|
|
|
1652
1653
|
} catch (w) {
|
|
1653
1654
|
p.error("clear preload page cache error", { error: w });
|
|
1654
1655
|
}
|
|
1655
|
-
const { pages:
|
|
1656
|
+
const { pages: c, pageIds: n, routeIds: l, routes: h, supportedLocales: P } = t;
|
|
1656
1657
|
if (r === "production") {
|
|
1657
1658
|
let w = s ?? [], m = null;
|
|
1658
|
-
for (const u of
|
|
1659
|
+
for (const u of l ?? []) {
|
|
1659
1660
|
const I = h?.[u];
|
|
1660
1661
|
if (I?.params && I?.params.length > 0 && I?.paramsOptions && I?.paramsOptions.length > 0) {
|
|
1661
1662
|
const R = Pe({
|
|
@@ -1696,7 +1697,7 @@ async function Ve(t, e, {
|
|
|
1696
1697
|
p.info("no display template", u);
|
|
1697
1698
|
continue;
|
|
1698
1699
|
}
|
|
1699
|
-
const j =
|
|
1700
|
+
const j = c[R.displayTemplateId];
|
|
1700
1701
|
if (!j) {
|
|
1701
1702
|
p.info("no template page", u);
|
|
1702
1703
|
continue;
|
|
@@ -1734,7 +1735,7 @@ async function Ve(t, e, {
|
|
|
1734
1735
|
w?.includes(u) || (delete e.pages[u], p.info("delete page", u)), e.pageIds = [...e.pageIds].filter((I) => w?.includes(I));
|
|
1735
1736
|
} else {
|
|
1736
1737
|
for (const w of n) {
|
|
1737
|
-
const m =
|
|
1738
|
+
const m = c[w];
|
|
1738
1739
|
if (m)
|
|
1739
1740
|
if (e.pageIds.includes(m.id)) {
|
|
1740
1741
|
if (a === "replace")
|
|
@@ -1746,7 +1747,7 @@ async function Ve(t, e, {
|
|
|
1746
1747
|
} else
|
|
1747
1748
|
e.pageIds.push(m.id), e.pages[m.id] = m;
|
|
1748
1749
|
}
|
|
1749
|
-
for (const w of
|
|
1750
|
+
for (const w of l) {
|
|
1750
1751
|
const m = h[w];
|
|
1751
1752
|
if (m)
|
|
1752
1753
|
if (e.routeIds.includes(m.id)) {
|
|
@@ -1823,8 +1824,8 @@ const tt = () => jt({
|
|
|
1823
1824
|
absolute: !0
|
|
1824
1825
|
}))[0], r = o && A(M(o), "../../chunks");
|
|
1825
1826
|
if (r && await G(r)) {
|
|
1826
|
-
const
|
|
1827
|
-
for (const n of
|
|
1827
|
+
const c = await Dt(r);
|
|
1828
|
+
for (const n of c)
|
|
1828
1829
|
e[n] = A(r, n);
|
|
1829
1830
|
}
|
|
1830
1831
|
}
|
|
@@ -1947,8 +1948,8 @@ async function rt({
|
|
|
1947
1948
|
if (o?.useAllResources)
|
|
1948
1949
|
r = s;
|
|
1949
1950
|
else {
|
|
1950
|
-
const n = (await ke.findAll({ where: { projectId: t } })).map((
|
|
1951
|
-
r = Object.fromEntries(Object.entries(s || {}).filter(([
|
|
1951
|
+
const n = (await ke.findAll({ where: { projectId: t } })).map((l) => l.componentId);
|
|
1952
|
+
r = Object.fromEntries(Object.entries(s || {}).filter(([l]) => n.includes(l)));
|
|
1952
1953
|
}
|
|
1953
1954
|
a.transact(() => {
|
|
1954
1955
|
a.syncedStore.resources.pages = e, p.info(`[${t}] pages resources updated: ${Object.keys(e || {}).length} pages`), a.syncedStore.resources.components = r, p.info(`[${t}] components resources updated: ${Object.keys(r || {}).length} components`);
|
package/lib/es/project-html.js
CHANGED
|
@@ -6,7 +6,7 @@ import { WalletHandlers as D } from "@blocklet/sdk/lib/wallet-handler";
|
|
|
6
6
|
import { BlockletService as K } from "@blocklet/sdk/service/auth";
|
|
7
7
|
import U, { resolve as C } from "path";
|
|
8
8
|
import { l as v, g as W } from "./chunks/components-D4ywfyMi.js";
|
|
9
|
-
import { e as H, i as N } from "./chunks/html-
|
|
9
|
+
import { e as H, i as N } from "./chunks/html-DOgzvdOd.js";
|
|
10
10
|
import { createSnapshotMiddleware as O } from "@arcblock/crawler-middleware";
|
|
11
11
|
import { PreloadComponentScriptModule as R } from "@blocklet/pages-kit/types";
|
|
12
12
|
import { isMuiColorKey as F } from "@blocklet/pages-kit/utils/common";
|
package/lib/es/resources.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as b, a as T, l as x } from "./chunks/components-D4ywfyMi.js";
|
|
2
|
-
import { P as E, C as L, R as M, S as A, t as F, c as J, g as X } from "./chunks/site-state-
|
|
2
|
+
import { P as E, C as L, R as M, S as A, t as F, c as J, g as X } from "./chunks/site-state-NvsHZBJX.js";
|
|
3
3
|
import { Router as G } from "express";
|
|
4
4
|
import { rm as C, mkdir as K } from "fs/promises";
|
|
5
5
|
import u from "joi";
|
package/lib/es/site-state.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./chunks/components-D4ywfyMi.js";
|
|
2
|
-
import { d as b, a as h, b as y, S as L, f as U, h as q, i as v, e as z, g as C, j as F, m as G, t as J, k as K, u as N } from "./chunks/site-state-
|
|
2
|
+
import { d as b, a as h, b as y, S as L, f as U, h as q, i as v, e as z, g as C, j as F, m as G, t as J, k as K, u as N } from "./chunks/site-state-NvsHZBJX.js";
|
|
3
3
|
import { nextId as V } 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.7.
|
|
3
|
+
"version": "0.7.20",
|
|
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.7.
|
|
205
|
-
"@blocklet/pages-kit-block-studio": "^0.7.
|
|
204
|
+
"@blocklet/pages-kit": "^0.7.20",
|
|
205
|
+
"@blocklet/pages-kit-block-studio": "^0.7.20"
|
|
206
206
|
},
|
|
207
207
|
"devDependencies": {
|
|
208
208
|
"@trivago/prettier-plugin-sort-imports": "^5.2.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const s=require("crypto");require("ufo");const c={};function u(t,e){const n=JSON.stringify([t,e]);return s.createHash("md5").update(n).digest("hex")}async function a(t,e){return i(t,e)}function i(t,e){let n=t;return e.forEach(r=>{const o=typeof r.selector.pattern=="string"?new RegExp(r.selector.pattern,"gis"):r.selector.pattern;n=n.replace(o,r.value)}),n}async function y(t,e){if(!e||e.length===0)return t;const n=u(t,e);return c[n]??=a(t,e).finally(()=>{setTimeout(()=>{delete c[n]},10*1e3)}),c[n]}function l(t){return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1]||""}function h(t,e){return!e||Object.keys(e).length===0?!0:Object.entries(e).every(([n,r])=>t.includes(`${n}=${r}`))}exports.extractBodyContent=l;exports.injectToHtml=y;exports.matchCacheKey=h;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const u=require("./components-aaduHC9E.js"),G=require("@syncedstore/core"),it=require("yjs"),ct=require("@blocklet/pages-kit/utils/data-source"),ne=require("@blocklet/pages-kit/utils/route"),lt=require("lodash/cloneDeep"),h=require("sequelize");require("sqlite3");const ut=require("@blocklet/sdk/lib/config"),_=require("ufo"),Be=require("lodash");require("crypto");const Z=require("fs"),pt=require("p-limit"),p=require("path"),dt=require("worker_threads"),Ue=require("@blocklet/pages-kit/utils/common"),ft=require("@blocklet/pages-kit/utils/page-model"),gt=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),mt=require("@reactivedata/reactive"),D=require("fs/promises"),re=require("glob"),ht=require("lib0/decoding"),yt=require("lib0/encoding"),St=require("lodash/debounce"),wt=require("lodash/get"),It=require("lodash/isEmpty"),bt=require("lodash/set"),Pt=require("lodash/union"),Ge=require("lru-cache"),jt=require("stream/promises"),Et=require("tar"),At=require("wait-on"),W=require("y-protocols/awareness"),fe=require("y-protocols/sync"),Dt=require("yaml"),$e=require("./html-dP5_4zu1.js");require("@blocklet/pages-kit/types/state");const M=t=>t&&t.__esModule?t:{default:t};function pe(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const a in t)if(a!=="default"){const s=Object.getOwnPropertyDescriptor(t,a);Object.defineProperty(e,a,s.get?s:{enumerable:!0,get:()=>t[a]})}}return e.default=t,Object.freeze(e)}const q=pe(it),Ae=M(lt),E=M(ut),V=M(Z),De=M(pt),Ne=M(p),ge=pe(ht),L=pe(yt),Te=M(St),Re=M(wt),Oe=M(It),Me=M(bt),Tt=M(Pt),Rt=M(At),H=pe(Dt),Ot=h.DataTypes.sqlite.DATE.parse;h.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Ot(t,e);const F=new h.Sequelize({dialect:"sqlite",storage:u.databaseUrl,benchmark:process.env.ENABLE_SEQUELIZE_BENCHMARK==="true",retry:{match:[/SQLITE_BUSY/],name:"query",max:10},logging:process.env.ENABLE_SEQUELIZE_LOGGING==="true"?console.log:!1});F.query("PRAGMA journal_mode = WAL;");F.query("PRAGMA synchronous = normal;");F.query("PRAGMA journal_size_limit = 67108864;");F.query("PRAGMA cache_size = 10000;");process.on("SIGINT",async()=>{await F.close(),process.exit(0)});process.on("SIGTERM",async()=>{await F.close(),process.exit(0)});async function Ct(t,e){try{if(t.getDialect()!=="sqlite")return;const[a]=await t.query("SELECT 1");if(!a||a.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(a){if(a.name==="SequelizeConnectionError"||a?.message&&/closed!/.test(a.message))return;console.error("Failed to cleanup SQLite memory",e,a)}}let Se=null;Se&&clearInterval(Se);Se=setInterval(async()=>{u.logger.info("Start cleanupSqliteMemory"),await Ct(F,u.databaseUrl),u.logger.info("End cleanupSqliteMemory")},60*1e3*10);const kt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",we="page",Ie="trigger-reload-project-resource",Ce=kt,Lt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",vt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class ke extends h.Model{}ke.init({id:{type:h.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:h.DataTypes.UUIDV4},projectId:{type:h.DataTypes.UUID,allowNull:!1},componentId:{type:h.DataTypes.STRING,allowNull:!1}},{sequelize:F,tableName:"ProjectComponents",timestamps:!1});const _t="SLUG_INVALID",Y=t=>({error:"slugInvalid",code:_t,field:"slug",message:t}),Ut={error:"slugRequired",code:"SLUG_REQUIRED",field:"slug",message:()=>"Project slug is required"},$t={error:"slugAlreadyExists",code:"SLUG_EXISTS",field:"slug",message:t=>`Project slug "${t}" already exists`},Nt=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/\\:]/],Fe=t=>{if(!t)return"";if(t==="/")return"/";const e=_.withoutTrailingSlash(t);return _.withLeadingSlash(e)||"/"},Mt=t=>t.did===vt;class $ extends h.Model{static async getProjectByIdOrSlug(e,a){return e?$.findOne({where:{[h.Op.or]:[{id:e},{slug:e}],...a?.createdBy?{createdBy:a.createdBy}:{}}}):null}static async validateProjectSlug({slug:e,projectId:a}){if(e==null)return null;if(e==="")return Ut;const s=e==="/"?"/":_.withoutTrailingSlash(_.withLeadingSlash(e)),o=Fe(s);if(s!=="/"&&s.endsWith("/"))return Y(r=>`Project slug "${r}" cannot end with /`);if(/\/{2,}/.test(s))return Y(r=>`Project slug "${r}" cannot contain consecutive /`);if(/\s/.test(s))return Y(r=>`Project slug "${r}" cannot contain whitespace`);if(Nt.some(r=>r.test(s)))return Y(r=>`Project slug "${r}" contains invalid characters`);if(E.default.components?.filter(r=>r.mountPoint&&!Mt(r)).some(r=>Fe(r.mountPoint)===o))return Y(r=>`Project slug "${r}" conflicts with existing blocklet`);const l=await $.findOne({where:{slug:s}});return l&&l?.id!==a?$t:null}}$.init({id:{type:h.DataTypes.UUID,defaultValue:h.DataTypes.UUIDV4,primaryKey:!0},name:{type:h.DataTypes.STRING,allowNull:!1},description:h.DataTypes.TEXT,createdAt:h.DataTypes.DATE,updatedAt:h.DataTypes.DATE,createdBy:{type:h.DataTypes.STRING,allowNull:!1},updatedBy:{type:h.DataTypes.STRING,allowNull:!1},slug:h.DataTypes.STRING,icon:h.DataTypes.STRING,pinnedAt:h.DataTypes.DATE,useAllResources:h.DataTypes.BOOLEAN,npmSecret:h.DataTypes.STRING,relatedBlocklets:{type:h.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:h.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return u.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){u.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}},meta:{type:h.DataTypes.JSON,allowNull:!0}},{sequelize:F,paranoid:!0,indexes:[{name:"projects_slug_unique",unique:!0,fields:["slug"]},{name:"projects_created_by",fields:["createdBy"]},{name:"projects_pinned_updated_meta_not_null",fields:[{name:"pinnedAt",order:"DESC"},{name:"updatedAt",order:"DESC"}],where:{meta:{[h.Op.ne]:null}}}]});$.hasMany(ke,{foreignKey:"projectId",as:"components"});async function x(t){try{return await V.default.promises.access(t,V.default.constants.F_OK),!0}catch{return!1}}function Ve(t,e){return new Promise((a,s)=>{const o=V.default.createReadStream(t),n=V.default.createWriteStream(e);o.on("error",s),n.on("error",s),n.on("finish",a),o.pipe(n)})}async function ze(t,e){await V.default.promises.mkdir(e,{recursive:!0});const a=await V.default.promises.readdir(t,{withFileTypes:!0});for(const s of a){const o=Ne.default.join(t,s.name),n=Ne.default.join(e,s.name);s.isDirectory()?await ze(o,n):await Ve(o,n)}}async function Ft(t,e){(await V.default.promises.stat(t)).isDirectory()?await ze(t,e):await Ve(t,e)}class ee extends h.Model{}ee.init({id:{type:h.DataTypes.UUID,primaryKey:!0,defaultValue:h.DataTypes.UUIDV4},projectId:{type:h.DataTypes.UUID,allowNull:!1,comment:"Project ID"},urlPath:{type:h.DataTypes.STRING(512),allowNull:!1,unique:!0,comment:"URL path, e.g. /project-slug/page-slug or /en/project-slug/page-slug"},projectSlug:{type:h.DataTypes.STRING,allowNull:!0,comment:"Project slug"},pageSlug:{type:h.DataTypes.STRING,allowNull:!1,comment:"Page slug"},pageId:{type:h.DataTypes.UUID,allowNull:!1,comment:"Page ID"},routeId:{type:h.DataTypes.UUID,allowNull:!0,comment:"Route ID (for draft mode)"},locale:{type:h.DataTypes.STRING(10),allowNull:!0,comment:"Locale code, e.g. en, zh"},defaultLocale:{type:h.DataTypes.STRING(10),allowNull:!0,comment:"Default locale"},shouldRedirect:{type:h.DataTypes.BOOLEAN,defaultValue:!1,comment:"Whether this URL should redirect"},mainPage:{type:h.DataTypes.BOOLEAN,defaultValue:!1,comment:"Whether this is the main page"},isPublic:{type:h.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0,comment:"Whether the page is public"},publishedAt:{type:h.DataTypes.BIGINT,allowNull:!0,comment:"Published timestamp"},locales:{type:h.DataTypes.JSON,allowNull:!0,comment:"Supported locales array"},createdAt:h.DataTypes.DATE,updatedAt:h.DataTypes.DATE},{sequelize:F,tableName:"PageUrlMappings",timestamps:!0,indexes:[{name:"idx_project_id",fields:["projectId"]},{name:"idx_url_path",unique:!0,fields:["urlPath"]},{name:"idx_page_id",fields:["pageId"]}]});function qt(t){const{projectId:e,projectSlug:a,state:s}=t,o=a||e,n=Be.union(E.default.env.languages?.map(c=>c.code)||[],s.supportedLocales?.map(c=>c.locale)||[]),l={},r=(c,S)=>{o&&(l[_.joinURL("/",o,c)]={...S,shouldRedirect:!0,mainPage:!0}),l[_.joinURL("/",e,c)]={...S,shouldRedirect:!0,mainPage:!0};for(const j of n){const T={...S,locale:j};l[_.joinURL("/",j,e,c)]=T,o&&(l[_.joinURL("/",j,o,c)]=T)}};for(const c of s.pageIds||[]){const S=s.pages?.[c];if(!S||!S.isPublic)continue;const j={projectId:e,projectSlug:o,pageSlug:S.slug,pageId:c,defaultLocale:n?.[0],locales:n,publishedAt:s.config?.publishedAt,isPublic:S.isPublic};r(S.slug,j)}return l}async function xt(t,e,a){const s=t.map(n=>n.urlPath),o=await ee.findAll({where:{urlPath:{[h.Op.in]:s},projectId:{[h.Op.ne]:e}},attributes:["urlPath","projectId","projectSlug","pageSlug"],transaction:a,raw:!0});if(o.length>0){u.logger.warn(`[URL Duplicate Warning] Found ${o.length} URL conflicts for project ${e}:`);for(const n of o){const l=t.find(r=>r.urlPath===n.urlPath);if(l){const r=n.projectSlug?_.joinURL(n.projectSlug,n.pageSlug):n.pageSlug;u.logger.warn(` - URL "${n.urlPath}" conflicts with project ${n.projectId} (${r}). Current project trying to use same URL for page: ${l.pageSlug}`)}}u.logger.warn("[URL Duplicate Warning] These duplicate URLs will be ignored during save. Consider using different project slugs or page slugs to avoid conflicts.")}}async function Bt(t){const{projectId:e,transaction:a}=t;try{await ee.destroy({where:{projectId:e},transaction:a});const s=qt(t),o=Object.entries(s).map(([n,l])=>({projectId:e,urlPath:n,projectSlug:l.projectSlug,pageSlug:l.pageSlug,pageId:l.pageId,routeId:l.routeId,locale:l.locale,defaultLocale:l.defaultLocale,shouldRedirect:l.shouldRedirect,mainPage:l.mainPage,isPublic:l.isPublic,publishedAt:typeof l.publishedAt=="number"?l.publishedAt:void 0,locales:l.locales}));if(o.length>0){await xt(o,e,a);const n=100,l=[];for(let r=0;r<o.length;r+=n){const c=o.slice(r,r+n);l.push(ee.bulkCreate(c,{transaction:a,ignoreDuplicates:!0}))}await Promise.all(l),u.logger.info(`Regenerated ${o.length} URL mappings for project ${e}`)}return o.length}catch(s){throw u.logger.error(`Failed to regenerate URL mappings for project ${e}:`,s),s}}function ie(t){t.observeDeep(e=>{e.some(a=>a.changes.keys.has("updatedAt")||a.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function He(){return Z.mkdtempSync(p.join(E.default.env.dataDir,"tmp-"))}function ce(t,e,a=[]){return Array.isArray(t)?t.flatMap((s,o)=>ce(s,e,[...a,o])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([s,o])=>ce(o,e,[...a,s])):e(t)?[a]:[]}function U(t){return t.filter(e=>e!=null)}function Gt(t){return new Promise((e,a)=>{let s;process.env.NODE_ENV==="development"?s=p.join(__dirname,"yaml-worker.js"):s=p.join(__dirname,"api/dist/utils/yaml-worker.js");const o=new dt.Worker(s);o.postMessage({payload:t}),o.on("message",n=>{n.status==="success"?e(n.result):a(new Error(`YAML stringify failed in worker: ${n.message}`)),o.terminate()}),o.on("error",n=>{a(n)}),o.on("exit",n=>{n!==0&&a(new Error(`Worker stopped with exit code ${n}`))})})}function Vt(t){t.pages&&Object.keys(t.pages).forEach(a=>{const s=G.getYjsValue(t.pages[a]);s&&s instanceof q.Map&&ie(s)});const e=G.getYjsValue(t.pages);e&&e instanceof q.Map&&e.observe(a=>{a.changes.keys.forEach((s,o)=>{if(s.action==="add"){const n=G.getYjsValue(t.pages[o]);n&&n instanceof q.Map&&ie(n)}})})}function zt(t){t.routes&&Object.keys(t.routes).forEach(a=>{const s=G.getYjsValue(t.routes?.[a]);s&&s instanceof q.Map&&ie(s)});const e=G.getYjsValue(t.routes);e&&e instanceof q.Map&&e.observe(a=>{a.changes.keys.forEach((s,o)=>{if(s.action==="add"){const n=G.getYjsValue(t.routes?.[o]);n&&n instanceof q.Map&&ie(n)}})})}function Ht(t,e){for(const a of e||Object.keys(t.routes||{})){let s=a,o=[];if(a.includes("-")){const[n,...l]=a.split("-");s=n,o=l||[]}if(t.routes?.[s]!==void 0){t.routes[s].publishedAt=new Date().toISOString();const n=t.routes[s];if(!n||!n.params||n.params.length===0)continue;if(a.includes("-")&&o.length>0){const l=ne.getRouteMetaDataByOptionIds(o,n);l&&(l.publishedAt=new Date().toISOString())}if(!e){const l=ne.generateParamCombinations({basePath:n.path,params:n.params,routeId:n.id,paramsOptions:n.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const r of l)r.routeMetaData??={},r.routeMetaData.publishedAt=new Date().toISOString()}}}}function me({page:t,route:e,state:a,routeId:s,routePathInfo:o}){u.logger.info(`Executing datasource data assembly, routeId: ${s}, routePathInfo: ${JSON.stringify(o)}`);const n={...Ae.default(t),id:s,slug:o?.path??e.path,createdAt:e.createdAt,updatedAt:o?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:o?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(o?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const l of a.supportedLocales){if(e.dataSource){let r=e.id;o&&(r=o.paramOptionIds.join("-"));const c=e.dataSource.pathDataMappings?.[r]?.dataCache?.[l.locale]??e.dataSource.pathDataMappings?.[r]?.dataCache?.[a.config.defaultLocale||"en"];if(!c)continue;ct.setPageDataSource(n,a,l.locale,c)}o&&o.routeMetaData&&(o.routeMetaData.publishedAt=new Date().toISOString())}return n}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const Kt=60*60*1e3,J=new Ge.LRUCache({max:300,ttl:Kt,ttlResolution:10*1e3,allowStale:!0});function Wt(t,e=[]){let a=0;const s=Array.from(J.keys()),o=t.map(n=>_.withoutTrailingSlash(n));for(const n of s)for(const l of o){if($e.matchCacheKey(n,{currentPath:l})){J.delete(n),a++,u.logger.info(`[Cache CLEAR] key: ${n}`);break}for(const r of e)if($e.matchCacheKey(n,{currentPath:`/${r}${l}`})){J.delete(n),a++,u.logger.info(`[Cache CLEAR] key: ${n}`);break}}return u.logger.info(`[Cache CLEAR] cleared ${a} entries for paths:`,o),a}function Yt(){const t=J.size;return J.clear(),u.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}const Jt=Be.debounce(Yt,300);E.default.events.on(E.default.Events.envUpdate,Jt);const{uploadToMediaKit:Xt}=require("@blocklet/uploader-server"),Le=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,X=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,qe=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Qt=1e4,Zt=3e4,se=0,he=1,ea=0,ta=1,be=E.default,z=p.join(process.env.BLOCKLET_DATA_DIR,"site-state"),aa=["production","draft"],sa=["production"];function le(t){return t?.replace(/\//g,"|")||""}function Ke(){const t=be.env.languages?.map(a=>({locale:a.code,name:a.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class C extends q.Doc{constructor(e){if(super(),this.options=e,Z.existsSync(this.draftYjsFilePath))try{q.applyUpdate(this,Z.readFileSync(this.draftYjsFilePath))}catch(a){u.logger.error("Failed to apply update from draft.yjs:",a)}this.syncedStore=mt.reactive(G.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new W.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static RELEASE_DELAY=5*60*1e3;static PERIODIC_CHECK_INTERVAL=2*60*60*1e3;static sharedInstances={};static periodicCheckTimer;static async safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const a=p.join(z,e),s=p.join(z,`@del-${e}`);await D.rename(a,s)}catch(a){u.logger.error("Failed to safe delete project state dir:",a)}}static async getProjectIds(){return(await $.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return re.globSync("*/",{cwd:z,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>C.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let a=C.sharedInstances[e];return a||(a=new C({path:p.join(z,e)}),C.sharedInstances[e]=a,a)}static async getProductionState(e){const a=await $.findByPk(e,{attributes:["productionState"]});if(Oe.default(a?.productionState)){const s=p.join(z,e,"production"),o=await ve(s,{includeResources:!0})??Ke();if(!o?.config?.defaultLocale){o.config??={};const n=be.env.languages?.map(l=>({locale:l.code,name:l.name}))||[];o.config.defaultLocale=n[0]?.locale}return o}return a?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((a,s)=>this.closeConn(s)),this.awareness.destroy();const e=p.basename(this.options.path);delete C.sharedInstances[e],super.destroy()}initObserver(){Vt(this.syncedStore),zt(this.syncedStore)}get draftYjsFilePath(){return p.join(this.options.path,"draft.yjs")}static async getStateByProjectId({projectId:e,mode:a,clone:s=!0}){if(a==="draft"){const o=C.shared(e);return s?JSON.parse(JSON.stringify(o.syncedStore)):o.syncedStore}return C.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const a=p.basename(this.options.path);return C.getProductionState(a)}async setState(e,a){if(e==="production"){const n=p.basename(this.options.path),l=Ae.default(a);await F.transaction(async r=>{await $.update({productionState:l},{where:{id:n},transaction:r});const c=await $.findByPk(n,{attributes:["slug"],transaction:r}),S=await Bt({projectId:n,projectSlug:c?.slug,state:a,transaction:r});u.logger.info(`[SiteState] saved ${S} URL mappings for project ${n}`)}),await this.clearPageCacheForRoutes(void 0,a)}const s=await Xe(a,{exportAssets:!1,includeResources:!0}),o=this.getPublishDir(e);await D.mkdir(p.dirname(o),{recursive:!0}),await D.rm(o,{force:!0,recursive:!0}),await D.rename(s,o)}getPublishDir(e){return p.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:a,removed:s},o)=>{const n=e.concat(a,s);if(o!==null){const c=this.conns.get(o);c&&(e.forEach(S=>{c.add(S)}),s.forEach(S=>{c.delete(S)}))}const l=L.createEncoder();L.writeVarUint(l,he),L.writeVarUint8Array(l,W.encodeAwarenessUpdate(this.awareness,n));const r=L.toUint8Array(l);this.conns.forEach((c,S)=>this.send(S,r))};updateHandler=e=>{const a=L.createEncoder();L.writeVarUint(a,se),fe.writeUpdate(a,e);const s=L.toUint8Array(a);this.conns.forEach((o,n)=>this.send(n,s))};ensureDataStructure=()=>{this.transact(()=>{const{supportedLocales:e,pages:a,pageIds:s,config:o,routes:n,routeIds:l}=this.syncedStore;{const r=new Set(Object.keys(a));let c=0;for(;c<s.length;){const S=s[c];r.has(S)?(r.delete(S),c++):s.splice(c,1)}}{const r=new Set(Object.keys(n));let c=0;for(;c<l.length;){const S=l[c];r.has(S)?(r.delete(S),c++):l.splice(c,1)}}e.splice(0,e.length),e.push(...be.env.languages.map(r=>({locale:r.code,name:r.name}))),o.defaultLocale=e[0]?.locale;{let r=0;const c=new Set;for(;r<e.length;){const{locale:S}=e[r];c.has(S)?e.splice(r,1):(r++,c.add(S))}}})};send=(e,a)=>{e.readyState!==ea&&e.readyState!==ta&&this.closeConn(e);try{e.send(a,s=>{s&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const a=this.conns.get(e);this.conns.delete(e),a&&W.removeAwarenessStates(this.awareness,Array.from(a),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=p.basename(this.options.path);this.releaseTimer=setTimeout(()=>{u.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},C.RELEASE_DELAY),u.logger.info(`[SiteState] scheduled release for project ${e} in ${C.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=p.basename(this.options.path);u.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Te.default(async()=>{await D.mkdir(p.dirname(this.draftYjsFilePath),{recursive:!0}),await D.writeFile(this.draftYjsFilePath,q.encodeStateAsUpdate(this))},Qt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:a})=>{const s=p.basename(this.options.path);await nt(s);const o=await this.getState("draft"),n=await this.getState("production");await je(o,n,{routes:a,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),setImmediate(()=>{this.transact(()=>{Ht(this.syncedStore,a)})}),await this.setState(e,n)};mergeState=async(e,a)=>{const s=JSON.parse(JSON.stringify(a));e.config.fontFamily??={};const o=s.config?.fontFamily,n=e.config?.fontFamily;e.config.fontFamily.title=o?.title||n?.title,e.config.fontFamily.description=o?.description||n?.description,await new Promise((l,r)=>{this.transact(async()=>{try{const c=await je(e,a);l(c)}catch(c){r(c)}})})};clearPageCacheForRoutes=async(e,a)=>{const s=p.basename(this.options.path),n=(await $.findByPk(s))?.slug||s;let l=e;(!l||l.length===0)&&(l=a.pageIds??[]),u.logger.info(`[SiteState] clearing page cache for project ${s}, routes:`,l||[]);const r=a.supportedLocales.map(j=>j.locale),c=[],S=l.filter(j=>a.pageIds?.includes(j));for(const j of S){const b=a.pages[j].slug;n&&n!==s&&(n==="/"?c.push(b):c.push(`${n.startsWith("/")?"":"/"}${n}${b}`)),c.push(`/${s}${b}`)}if(c.length>0)try{const j=Wt(c,r);u.logger.info(`[SiteState] cleared ${j} page cache entries for project ${s}, routes:`,l)}catch{}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",o=>this.messageListener(e,new Uint8Array(o)));let a=!0;const s=setInterval(()=>{if(!a)this.conns.has(e)&&this.closeConn(e),clearInterval(s);else if(this.conns.has(e)){a=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(s)}}},Zt);e.on("close",()=>{this.closeConn(e),clearInterval(s)}),e.on("pong",()=>{a=!0});{const o=L.createEncoder();L.writeVarUint(o,se),fe.writeSyncStep1(o,this),this.send(e,L.toUint8Array(o));const n=this.awareness.getStates();if(n.size>0){const l=L.createEncoder();L.writeVarUint(l,he),L.writeVarUint8Array(l,W.encodeAwarenessUpdate(this.awareness,Array.from(n.keys()))),this.send(e,L.toUint8Array(l))}}};messageListener=(e,a)=>{try{const s=L.createEncoder(),o=ge.createDecoder(a),n=ge.readVarUint(o);switch(u.logger.info(`[SiteState] messageListener, messageType: ${n}`),n){case se:L.writeVarUint(s,se),fe.readSyncMessage(o,s,this,null),u.logger.info(`[SiteState] messageListener, encoder length: ${L.length(s)}`),L.length(s)>1&&(this.ensureDataStructure(),this.send(e,L.toUint8Array(s)));break;case he:{W.applyAwarenessUpdate(this.awareness,ge.readVarUint8Array(o),e);break}default:u.logger.warn(`Unsupported messageType ${n}`)}}catch(s){u.logger.error(s)}this.save()};static async pageUrlMap(e,a){if(u.logger.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${a}`),e==="production"){const n=a?{projectId:a}:{},l=await ee.findAll({where:n,raw:!0}),r={};for(const c of l)r[c.urlPath]={projectId:c.projectId,projectSlug:c.projectSlug,pageSlug:c.pageSlug,pageId:c.pageId,routeId:c.routeId,locale:c.locale,defaultLocale:c.defaultLocale,shouldRedirect:c.shouldRedirect,mainPage:c.mainPage,isPublic:c.isPublic,publishedAt:c.publishedAt,locales:c.locales};return u.logger.info(`[SiteState] loaded ${l.length} URL mappings from database`),r}let s=[];a?s=[a]:s=await this.getProjectIds();let o={};if(s?.length){u.logger.info("[SiteState] find project infos from database, projectIds: ",s);const n=30,l=De.default(5);for(let r=0;r<s.length;r+=n){const c=s.slice(r,r+n);u.logger.info(`[SiteState] processing project batch ${r/n+1}, ids: `,c);const S=await $.findAll({where:{id:{[h.Op.in]:c}},attributes:{exclude:["relatedBlocklets"]}});await Promise.all(S?.map(j=>l(async()=>{const T=j.id,b=j.slug||T,m={},d=await C.getStateByProjectId({projectId:j.id,mode:e,clone:!1}),P=Tt.default(E.default.env.languages?.map(A=>A.code)||[],d.supportedLocales?.map(A=>A.locale)||[]),R=(A,I)=>{b&&(m[_.joinURL("/",b,A)]={...I,shouldRedirect:!0,mainPage:!0}),m[_.joinURL("/",T,A)]={...I,shouldRedirect:!0,mainPage:!0};for(const k of P){const y={...I,locale:k};m[_.joinURL("/",k,T,A)]=y,b&&(m[_.joinURL("/",k,b,A)]=y)}};if(e==="draft")for(const A of d.routeIds||[]){const I=d?.routes?.[A];if(!I)continue;if(I.params&&I.params.length>0){const w=ne.generateParamCombinations({basePath:I.path,params:I.params,routeId:I.id,paramsOptions:I.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const i of w){const f=i.path,g={projectId:T,projectSlug:b,pageSlug:f,pageId:I.displayTemplateId||"",routeId:A,defaultLocale:P?.[0],locales:P,publishedAt:d.config.publishedAt,isPublic:I.isPublic&&i?.routeMetaData?.isPublic};R(f,g)}}const k=I.path,y={projectId:T,projectSlug:b,pageSlug:k,pageId:I.displayTemplateId||"",routeId:A,defaultLocale:P?.[0],locales:P,publishedAt:d.config.publishedAt,isPublic:I.isPublic};R(k,y)}for(const A of d.pageIds||[]){const I=d.pages[A];if(!I)continue;const k=I.slug,y=j.slug||T,w={projectId:T,projectSlug:y,pageSlug:k,pageId:A,defaultLocale:P?.[0],locales:P,publishedAt:d.config.publishedAt,isPublic:I.isPublic,templateConfig:I.templateConfig};R(k,w)}o={...o,...m}})))}}return u.logger.info("[SiteState] success get pageUrlMap"),o}getDocumentSize(){return q.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[a,s]of Object.entries(C.sharedInstances)){const o=s.getDocumentSize();e.push({projectId:a,sizeInBytes:o,sizeInMB:`${(o/(1024*1024)).toFixed(2)} MB`,activeConnections:s.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),u.logger.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,u.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(C.sharedInstances).length,a=[],s=[];for(const[o,n]of Object.entries(C.sharedInstances))n.conns.size===0?a.push({projectId:o,instance:n}):s.push({projectId:o,connections:n.conns.size});if(u.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${s.length}, without connections: ${a.length}`),a.length>0){u.logger.info(`[SiteState] releasing ${a.length} instances without connections:`,a.map(n=>n.projectId));let o=0;for(const{projectId:n,instance:l}of a)try{u.logger.info(`[SiteState] releasing instance due to periodic check: ${n}`),l.destroy(),o++}catch(r){u.logger.error(`[SiteState] failed to release instance ${n} during periodic check:`,r)}u.logger.info(`[SiteState] periodic check completed: ${o}/${a.length} instances released successfully`)}else e>0?u.logger.debug("[SiteState] periodic check: all instances have active connections"):u.logger.debug("[SiteState] periodic check: no instances exist")}}async function oa(t,e,a){if(!t||!await x(t)||!(await D.lstat(t)).isFile())return null;let o=a[t];return o||(o=(async()=>{try{return(await Xt({filePath:t,fileName:e}))?.data?.filename}catch(n){return u.logger.error(`Failed to upload asset ${t}:`,n),null}})(),a[t]=o),o}const We=async(t,e)=>{const a=p.basename(t),s=await Ee.call({name:Ce,path:_.joinURL("/uploads",a),responseType:"stream",method:"GET"});if(s.status>=200&&s.status<400){const o=Z.createWriteStream(e);await jt.pipeline(s.data,o)}else throw new Error(`download asset failed ${s.status}`)},Ye=async(t,e)=>{await Promise.all(t.map(async a=>{try{await We(a,p.join(e,p.basename(a)))}catch(s){u.logger.error(`Failed to export assets: ${a}, ${s}`)}}))};function Je(t){return Le.test(t)?[t]:X.test(t)?(qe.lastIndex=0,Array.from(t.matchAll(qe)).map(a=>a[1]).filter(a=>!!a)):[]}async function oe(t,e,a){const{getFilename:s,exportAssets:o,useWorker:n}=a,l=p.join(e,s(t));await D.mkdir(p.dirname(l),{recursive:!0});const r=n?await Gt(t):H.stringify(t);if(await D.writeFile(l,r),o){const S=ce(t,j=>typeof j=="string"&&(Le.test(j)||X.test(j))).map(j=>{const T=Re.default(t,j);return Je(T)}).flat().filter(Boolean);await Ye(S,p.dirname(l))}}const Pe=new Ge.LRUCache({max:100,ttl:1*60*1e3});async function xe(t,e,a){const s=ce(t,r=>typeof r=="string"&&(Le.test(r)||X.test(r))),o=De.default(2),n=s.map(r=>o(async()=>{try{const c=Re.default(t,r),S=Je(c);for(const j of S){const T=p.basename(j),b=a.getFilePath(j,r),m=b?`${b}:${T}`:T,d=Pe.get(m);if(d){X.test(c)||Me.default(t,r,d);return}const P=await oa(b,T,e);P&&(X.test(c)||Me.default(t,r,P),Pe.set(m,P))}}catch(c){u.logger.error(`Failed to process upload for path ${r.join(".")}:`,c.message||c.reason)}})),l=await Promise.allSettled(n);a.onFinish?.(l)}async function Xe(t,{exportAssets:e,pageIds:a="all",componentIds:s="all",rawConfig:o,includeResources:n=!1,routeIds:l="all"}={}){const r=a==="all"?t.pageIds:a,c=gt.getComponentDependencies({state:t,pageIds:r,componentIds:s==="all"?Object.keys(t.components):s});Object.entries(t.components).forEach(([i,f])=>{f.data?.renderer?.type==="component-template"&&c.push(i)});const S=l==="all"?t.routeIds:l,j=i=>({id:i.id,name:i.name,isTemplateSection:i.isTemplateSection??!1,templateDescription:i.templateDescription,component:i.component,config:i.config,visibility:i.visibility,sections:i?.sectionIds?U(i?.sectionIds?.map(f=>{const g=i.sections?.[f];return g&&j(g)})):void 0}),T=(i,f)=>({id:i.id,createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,meta:i.locales?.[f]??{},sections:U(i.sectionIds.map(g=>{const O=i.sections[g];return O&&j(O)})),dataSource:Object.fromEntries(Object.entries(i.dataSource||{}).map(([g,O])=>[g,O?.[f]??{}]))}),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}),m=U(S.map(i=>{const f=t.routes[i];return f&&b(f)})),d=U(t.supportedLocales.map(i=>i.locale).flatMap(i=>r.map(f=>{const g=t.pages[f];return g&&{locale:i,slug:g.slug,page:T(g,i)}}))),P=He(),R=p.join(P,"pages");await D.mkdir(R,{recursive:!0});const A=p.join(P,"components");await D.mkdir(A,{recursive:!0});const I=p.join(P,"routes");await D.mkdir(I,{recursive:!0});for(const{locale:i,slug:f,page:g}of d)await oe(g,R,{getFilename:()=>`${le(f)||"index"}.${i}.yml`,exportAssets:e,useWorker:!0});for(const i of m)await oe(i,I,{getFilename:()=>`${le(i.path)||"index"}.yml`,exportAssets:e});for(const i of c){const f=t.components[i]?.data;f&&await oe(f,A,{getFilename:g=>`${g.name||"unnamed"}.${g.id}.yml`,exportAssets:e})}const k=p.join(P,".blocklet/pages/pages.config.yml");await D.mkdir(p.dirname(k),{recursive:!0});const y={pages:U(r.map(i=>{const f=t.pages[i];return f&&{id:i,slug:f.slug}})),routes:U(S.map(i=>{const f=t.routes[i];return f&&{id:i,path:f.path}})),components:U(c.map(i=>{const f=t.components[i]?.data;return f&&{id:i,name:f.name}})),...n?{resources:{components:U(Object.keys(t.resources?.components||{}).filter(i=>c.includes(i)).map(i=>({id:i,name:t.resources?.components?.[i]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};await D.writeFile(k,H.stringify(y));const w=p.join(P,"config.source.json");if(o&&await D.writeFile(w,JSON.stringify(o)),n){const i=p.join(P,"resources"),f=p.join(i,"components");await D.mkdir(f,{recursive:!0});for(const N of Object.keys(t?.resources?.components??{}).filter(v=>c.includes(v))){const v=t.resources?.components?.[N]?.component;v&&await oe(v,f,{getFilename:B=>`${B.name||"unnamed"}.${B.id}.yml`,exportAssets:e})}const g=p.join(P,"chunks");await D.mkdir(g,{recursive:!0});const O=await na();for(const N of Object.keys(t?.resources?.components??{}).filter(v=>c.includes(v))){const v=t.resources?.components?.[N]?.component;if(v&&v.renderer?.type==="react-component"){const B=v.renderer?.chunks??[];if(B?.length>0)for(const K of B){const _e=p.join(g,K),de=O?.[K];try{de&&await x(de)&&!await x(_e)&&await D.copyFile(de,_e)}catch(rt){u.logger.error(`copy chunk ${K} error`,rt.message)}}}}}return P}async function ve(t,{importAssets:e,includeResources:a}={}){if(!await x(t))return null;let s,o=!1;try{(await D.lstat(t)).isDirectory()?s=t:/\.(tgz|gz|tar)$/.test(t)&&(o=!0,s=He(),await Et.x({file:t,C:s}));const r=(await re.glob("**/.blocklet/pages/pages.config.yml",{cwd:s,absolute:!0}))[0],c=r&&p.join(p.dirname(r),"../../pages"),S=r&&p.join(p.dirname(r),"../../components"),j=r&&p.join(p.dirname(r),"../../routes");if(!r)return null;const T=await D.readFile(r,"utf-8"),b=H.parse(T),m=async(y,w,i)=>{let f=p.join(y,`${w}${i?`.${i}`:""}.yml`);if(!await x(f)&&(f=p.join(y,w,`index${i?`.${i}`:""}.yml`),!await x(f))||!(await D.lstat(f)).isFile())return null;const O=await D.readFile(f,"utf-8");return H.parse(O)},d=async(y,w)=>{try{const f=(await re.glob(`*.${w}.yml`,{cwd:y,absolute:!0}))[0];if(!f)return null;const g=await D.readFile(f,"utf-8");return H.parse(g)}catch(i){u.logger.error("parse component error",i)}return null},P=async(y,w)=>{let i=p.join(y,`${w}.yml`);if(!await x(i)&&(i=p.join(y,w,"index.yml"),!await x(i))||!(await D.lstat(i)).isFile())return null;const g=await D.readFile(i,"utf-8");return H.parse(g)},R=U(await Promise.all(b.pages.map(async({slug:y})=>{const w=U(await Promise.all(b.supportedLocales.map(async({locale:g})=>{const O=c?await m(c,le(y),g):void 0;if(O)return{locale:g,page:O};const N=c?await m(c,y,g):void 0;return N&&{locale:g,page:N}}))),i=w[0]?.page;if(!i)return null;const f=i.sections.map(ft.unzipSection);return{id:i.id||Ue.nextId(),createdAt:i.createdAt,updatedAt:i.updatedAt,publishedAt:i.publishedAt,isPublic:i.isPublic??!0,templateConfig:i.templateConfig,slug:y,sections:Object.fromEntries(f.map(g=>[g.id,g])),sectionIds:f.map(g=>g.id),locales:Object.fromEntries(w.map(({locale:g,page:O})=>[g,O.meta])),dataSource:i.dataSource?Object.fromEntries([...new Set(w.flatMap(({page:g})=>Object.keys(g.dataSource??{})))].map(g=>[g,Object.fromEntries(w.map(({locale:O,page:N})=>{const v=N.dataSource?.[g];return[O,v||{}]}))])):Object.fromEntries([...new Set(w.flatMap(({page:g})=>g.sections.map(O=>O.id)))].map(g=>[g,Object.fromEntries(w.map(({locale:O,page:N})=>{const v=N.dataSource?.[g];if(v)return[O,v];const B=N.sections.find(K=>K.id===g);return[O,B?.properties||{}]}))]))}}))),A=U(await Promise.all((b?.routes||[]).map(async({path:y})=>{const w=j?await P(j,le(y)):void 0;return{...w,id:w?.id||Ue.nextId(),createdAt:w?.createdAt??new Date().toISOString(),updatedAt:w?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:w?.path??`/${w?.id}`,params:w?.params,handler:w?.handler??"Pages Kit",isPublic:w?.isPublic??!0,enabledGenerate:w?.enabledGenerate??!1,displayTemplateId:w?.displayTemplateId??void 0,dataSource:w?.dataSource??{}}}))),I=S?U(await Promise.all((b.components||[]).map(async({id:y})=>d(S,y)))):[];if(e){const y=(...w)=>{u.logger.info(`[${o?p.basename(t):p.basename(p.join(t,"../../../../"))}] importAssets:`,...w)};try{y("wait image-bin api ready"),await Rt.default({resources:[`${Ee.getComponentWebEndpoint(u.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:f=>f>=200&&f<=500}),y("image-bin api is ready");const w={},i={};y("start to upload assets"),await Promise.allSettled([xe(I,w,{getFilePath:f=>S&&p.join(S,f),onFinish:f=>{y(`upload ${f.length} component assets`)}}),xe(R,i,{getFilePath:(f,g)=>{const O=Re.default(R,g.slice(0,1));return c&&p.join(c,p.dirname(O.slug),f)},onFinish:f=>{y(`upload ${f.length} page assets`)}})]),y("upload assets done"),Pe.clear(),global.gc&&global.gc()}catch(w){y("Error during asset import:",w)}}const k={};if(a){const y=r&&p.join(p.dirname(r),"../../resources/components"),w=U(await Promise.all((b.resources?.components||[]).map(async({id:i})=>d(y,i))));w.length>0&&(k.components=Object.fromEntries(w.map((i,f)=>[i.id,{index:f,component:i}])))}return{supportedLocales:b.supportedLocales,pageIds:R.map(y=>y.id),components:Object.fromEntries(I.map((y,w)=>[y.id,{index:w,data:y}])),pages:Object.fromEntries(R.map(y=>[y.id,y])),config:b.config||{},resources:k,routeIds:A.map(y=>y.id),routes:Object.fromEntries(A.map(y=>[y.id,y])),dataSourceIds:[],dataSources:{}}}finally{o&&s&&await D.rm(s,{force:!0,recursive:!0})}}async function je(t,e,{routes:a,mergeMode:s="byUpdateTime",deleteRoutes:o=!1,publishMode:n=void 0}={}){try{n&&u.clearPreloadComponentsCacheByMode(n)}catch(b){u.logger.error("clear preload page cache error",{error:b})}const{pages:l,pageIds:r,routeIds:c,routes:S,supportedLocales:j}=t;if(n==="production"){let b=a??[],m=null;for(const d of c??[]){const P=S?.[d];if(P?.params&&P?.params.length>0&&P?.paramsOptions&&P?.paramsOptions.length>0){const R=ne.generateParamCombinations({basePath:P.path,params:P.params,routeId:P.id,paramsOptions:P.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),A=Object.fromEntries(R.map(I=>[`${d}-${I.paramOptionIds.join("-")}`,I]));m={...m||{},...A},a||(b=[...b,...R.map(I=>`${d}-${I.paramOptionIds.join("-")}`)])}else a||b.push(d)}u.logger.info("routeIds to be published: ",b);for(const d of b){let P=d;if(P.includes("-")){const[I]=P.split("-");P=I}const R=S?.[P];if(!R){const I=e.pageIds.indexOf(P);I!==-1&&o&&(e.pageIds.splice(I,1),delete e.pages[P]);for(const k of e.pageIds)k.includes(`${P}-`)&&(e.pageIds.splice(e.pageIds.indexOf(k),1),delete e.pages[k]);u.logger.info("delete main route page",P);continue}if(d.includes("-")&&!m?.[d]){const I=e.pageIds.indexOf(d);I!==-1&&o&&(e.pageIds.splice(I,1),delete e.pages[d]),u.logger.info("delete page",d);continue}if(!R.displayTemplateId){u.logger.info("no display template",d);continue}const A=l[R.displayTemplateId];if(!A){u.logger.info("no template page",d);continue}if(e.pageIds.includes(d)){if(u.logger.info("has need update page",d),s==="replace")e.pages[d]=me({page:A,route:R,state:t,routeId:d,routePathInfo:m?.[d]}),u.logger.info("replace page",d);else if(s==="byUpdateTime"){const I=e.pages[R.id];(!I||R.updatedAt&&R.updatedAt>I.updatedAt)&&(e.pages[d]=me({page:A,route:R,state:t,routeId:d,routePathInfo:m?.[d]}),u.logger.info("replace page by update time",d))}}else e.pageIds.push(d),e.pages[d]=me({page:A,route:R,state:t,routeId:d,routePathInfo:m?.[d]}),u.logger.info("add page",d)}if(o&&!a)for(const d of e.pageIds)b?.includes(d)||(delete e.pages[d],u.logger.info("delete page",d)),e.pageIds=[...e.pageIds].filter(P=>b?.includes(P))}else{for(const b of r){const m=l[b];if(m)if(e.pageIds.includes(m.id)){if(s==="replace")e.pages[m.id]=m;else if(s==="byUpdateTime"){const d=e.pages[m.id];(!d||m.updatedAt&&m.updatedAt>d.updatedAt)&&(e.pages[m.id]=m)}}else e.pageIds.push(m.id),e.pages[m.id]=m}for(const b of c){const m=S[b];if(m)if(e.routeIds.includes(m.id)){if(s==="replace")e.routes[m.id]=m;else if(s==="byUpdateTime"){const d=e.routes[m.id];(!d||m.updatedAt&&m.updatedAt>d.updatedAt)&&(e.routes[m.id]=m)}}else e.routeIds.push(m.id),e.routes[m.id]=m}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...Ae.default(j)),o)for(const b of Object.keys(e.components))delete e.components[b];let T=JSON.parse(JSON.stringify(t.components));T=Object.fromEntries(await Promise.all(Object.entries(T).map(async([b,m])=>{const d=await Qe(m?.data);return[b,{...m,data:d}]}))),Object.assign(e.components,T),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Oe.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Qe=u.memoizeWithFs(async t=>{if(!Oe.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:a}=t?.renderer||{};if(a||e&&e.includes("PROPERTIES_SCHEMA"))try{const s=await u.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,a);s&&s.length>0&&t&&(t.properties={},s.forEach((o,n)=>{t?.properties&&(t.properties[o.id]={index:n,data:o})}))}catch(s){u.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:s})}}return t},{subdir:"getPropertiesFromCode"});let ue,Q,te,ae;const Ze=()=>Ee.getResources({types:[{did:Ce,type:we},{did:Lt,type:we}]}),na=async()=>{const t=Ze(),e={};for(const a of t){const o=(await re.glob("**/.blocklet/pages/pages.config.yml",{cwd:a.path,absolute:!0}))[0],n=o&&p.join(p.dirname(o),"../../chunks");if(n&&await x(n)){const l=await D.readdir(n);for(const r of l)e[r]=p.join(n,r)}}return e};function et(){return ue=(async()=>{const t=Ze();Q=(await Promise.all(t.map(async a=>{const s=a.path?await ve(a.path,{importAssets:!1}):void 0;return s?{blockletId:a.did,state:s,blockletTitle:a.title}:void 0}))).filter(a=>!!a),te=Q.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.pages).map(o=>o?[o?.id,{page:o,blockletId:s.blockletId}]:[]))),{});const e=Q.reduce((a,s)=>Object.assign(a,Object.fromEntries(Object.values(s.state.components).map(o=>[o.data.id,{blockletId:s.blockletId,component:o.data}]))),{});ae=Object.fromEntries(await Promise.all(Object.entries(e).map(async([a,s])=>{const o=await Qe(s.component);return[a,{...s,component:o}]}))),u.logger.info(`reloadResourceStates success: ${Object.keys(ae||{}).length} components, ${Object.keys(te||{}).length} pages`)})(),ue}function tt(t){const e=Te.default(async()=>{await et().catch(a=>{u.logger.error("load resource states error",{error:a})}),await t?.({states:Q,pages:te,components:ae})},3e3,{leading:!1,trailing:!0});return E.default.events.on(E.default.Events.componentAdded,e),E.default.events.on(E.default.Events.componentRemoved,e),E.default.events.on(E.default.Events.componentStarted,e),E.default.events.on(E.default.Events.componentStopped,e),E.default.events.on(E.default.Events.componentUpdated,e),E.default.events.on(Ie,e),e(),()=>{E.default.events.off(E.default.Events.componentAdded,e),E.default.events.off(E.default.Events.componentRemoved,e),E.default.events.off(E.default.Events.componentStarted,e),E.default.events.off(E.default.Events.componentStopped,e),E.default.events.off(E.default.Events.componentUpdated,e),E.default.events.off(Ie,e)}}const at=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),st=globalThis;st[at]?.();st[at]=tt(async({pages:t,components:e})=>{const a=await C.getProjectIds();u.logger.info(`start update resource states projects(${a.length})`,a);const s=De.default(10);await Promise.race([new Promise(o=>{setTimeout(()=>{o({})},30*1e3)}),Promise.all(a.map(o=>s(async()=>{ot({projectId:o,pages:t,components:e})})))]).catch(o=>{u.logger.error("update resource states failed:",o)})});C.startPeriodicCheck();process.on("beforeExit",()=>{C.stopPeriodicCheck()});process.on("SIGINT",()=>{C.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{C.stopPeriodicCheck(),process.exit(0)});async function ot({projectId:t,pages:e,components:a}){const s=C.sharedInstances[t];if(!s){u.logger.info(`projectId: ${t} not found in sharedInstances`);return}const o=await $.findByPk(t,{attributes:{exclude:["productionState","relatedBlocklets"]}});let n;if(o?.useAllResources)n=a;else{const r=(await ke.findAll({where:{projectId:t}})).map(c=>c.componentId);n=Object.fromEntries(Object.entries(a||{}).filter(([c])=>r.includes(c)))}s.transact(()=>{s.syncedStore.resources.pages=e,u.logger.info(`[${t}] pages resources updated: ${Object.keys(e||{}).length} pages`),s.syncedStore.resources.components=n,u.logger.info(`[${t}] components resources updated: ${Object.keys(n||{}).length} components`)}),u.logger.info(`update [${t}] resource states summary:`,{pages:Object.keys(s.syncedStore.resources.pages||{}).length,components:Object.keys(s.syncedStore.resources.components||{}).length})}const ye=new Map;async function nt(t){if(!ye.has(t)){const e=Te.default(async a=>ot({projectId:a,pages:te,components:ae}),3e3);ye.set(t,e)}return ye.get(t)(t)}async function ra(){u.logger.info("trigger reload all project resource"),E.default.events.emit(Ie)}async function ia({ensureLoaded:t=!0}={}){return t&&(ue??=et(),await ue),{states:Q,pages:te,components:ae}}exports.COMPONENT_DID=Ce;exports.PUBLISH_MODES=sa;exports.Project=$;exports.RESOURCE_TYPE=we;exports.SITE_STATE_PATH=z;exports.STATE_MODES=aa;exports.SiteState=C;exports.copyRecursive=Ft;exports.downloadAsset=We;exports.downloadAssets=Ye;exports.fromPackage=ve;exports.getDefaultState=Ke;exports.getResourceStates=ia;exports.initPackResourceStates=tt;exports.mergeState=je;exports.toPackage=Xe;exports.triggerReloadAllProjectResource=ra;exports.updateResourceStatesByProjectId=nt;
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { createHash as s } from "crypto";
|
|
2
|
-
import "ufo";
|
|
3
|
-
const c = {};
|
|
4
|
-
function u(t, e) {
|
|
5
|
-
const n = JSON.stringify([t, e]);
|
|
6
|
-
return s("md5").update(n).digest("hex");
|
|
7
|
-
}
|
|
8
|
-
async function a(t, e) {
|
|
9
|
-
return i(t, e);
|
|
10
|
-
}
|
|
11
|
-
function i(t, e) {
|
|
12
|
-
let n = t;
|
|
13
|
-
return e.forEach((r) => {
|
|
14
|
-
const o = typeof r.selector.pattern == "string" ? new RegExp(r.selector.pattern, "gis") : r.selector.pattern;
|
|
15
|
-
n = n.replace(o, r.value);
|
|
16
|
-
}), n;
|
|
17
|
-
}
|
|
18
|
-
async function f(t, e) {
|
|
19
|
-
if (!e || e.length === 0)
|
|
20
|
-
return t;
|
|
21
|
-
const n = u(t, e);
|
|
22
|
-
return c[n] ??= a(t, e).finally(() => {
|
|
23
|
-
setTimeout(() => {
|
|
24
|
-
delete c[n];
|
|
25
|
-
}, 10 * 1e3);
|
|
26
|
-
}), c[n];
|
|
27
|
-
}
|
|
28
|
-
function h(t) {
|
|
29
|
-
return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1] || "";
|
|
30
|
-
}
|
|
31
|
-
function p(t, e) {
|
|
32
|
-
return !e || Object.keys(e).length === 0 ? !0 : Object.entries(e).every(([n, r]) => t.includes(`${n}=${r}`));
|
|
33
|
-
}
|
|
34
|
-
export {
|
|
35
|
-
h as e,
|
|
36
|
-
f as i,
|
|
37
|
-
p as m
|
|
38
|
-
};
|