@blocklet/pages-kit-inner-components 0.6.8 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,57 @@
1
+ "use strict";var oe=Object.create;var U=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var ae=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of re(t))!ce.call(e,s)&&s!==o&&U(e,s,{get:()=>t[s],enumerable:!(n=ne(t,s))||n.enumerable});return e};var _=(e,t,o)=>(o=e!=null?oe(se(e)):{},ae(t||!e||!e.__esModule?U(o,"default",{value:e,enumerable:!0}):o,e));const ie=require("@blocklet/pages-kit/builtin/utils"),T=require("@blocklet/pages-kit/types"),b=require("@blocklet/pages-kit/utils/property"),O=require("@blocklet/quickjs"),j=require("@blocklet/pages-kit/utils/builtin"),le=require("@blocklet/sdk/lib/config"),pe=require("lru-cache"),q=require("node-fetch"),y=require("ufo"),ue=require("lodash/isEmpty"),de=require("crypto"),C=require("fs"),N=require("path"),me=require("lodash/isNil"),fe=require("@blocklet/logger"),K=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),ze=require("@blocklet/sdk/lib/component"),x=e=>e&&e.__esModule?e:{default:e},h=x(le),he=x(q),ge=x(ue),G=x(N),Ce=x(me),we=x(fe);h.default.env.mode;h.default.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY;h.default.env.OPENAI_BASE_URL||process.env.OPENAI_BASE_URL;h.default.env.TRANSLATE_ADDITIONAL_PROMPT||process.env.TRANSLATE_ADDITIONAL_PROMPT;h.default.env.PAGE_CONTENT_ADDITIONAL_PROMPT||process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;const Ee="image-bin";h.default.env.INIT_TEMPLATE_PATH;const ye=process.env.DATABASE_URL||G.default.join(h.default.env.dataDir,"db/pages-kit.db"),$=h.default,Se=()=>h.default.env.tenantMode==="multiple",_e=()=>(Ce.default($.env.preferences.multiTenantAllProjectAccessPassports)?[]:$.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],Pe=G.default.join(h.default.env.dataDir,"fs-memoize-cache"),xe=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=we.default("pages-kit"),Me=Pe,Te=xe,v=30*24*60*60*1e3,Ie=24*60*60*1e3,J=async(e="")=>{const t=N.join(Me,e);try{if(!(await C.promises.stat(t)).isDirectory())throw new Error(`${t} is not a directory`)}catch{await C.promises.mkdir(t,{recursive:!0})}return t},B=(e,...t)=>e.keyGenerator?e.keyGenerator(...t):JSON.stringify([e.subdir||"",...t]),Ae=(e,t)=>{const o=de.createHash("md5").update(t).digest("hex");return N.join(e,`${Te}-${o}.json`)},Oe=async(e="")=>{const t=await J(e),o=Date.now();try{const n=await C.promises.readdir(t);await Promise.all(n.filter(s=>s.endsWith(".json")).map(async s=>{const r=N.join(t,s);try{const u=await C.promises.readFile(r,"utf-8"),l=JSON.parse(u);l.createdAt&&o-l.createdAt>v&&await C.promises.unlink(r)}catch{try{const l=await C.promises.stat(r);o-l.mtimeMs>v&&await C.promises.unlink(r)}catch{}}}))}catch(n){console.error(`Failed to cleanup cache in ${t}:`,n)}},be=(()=>{const e=new Set;return setInterval(async()=>{await Promise.all(Array.from(e).map(n=>Oe(n)))},Ie).unref(),n=>{e.add(n)}})();function R(e,t){return t.subdir&&be(t.subdir),O.memoize(async(...n)=>{const s=await J(t.subdir||""),r=B(t,...n),u=Ae(s,r);try{const l=await C.promises.readFile(u,"utf-8"),{value:d,createdAt:p}=JSON.parse(l);if(p&&Date.now()-p>v)throw await C.promises.unlink(u).catch(()=>{}),new Error("Cache expired");return d}catch{const d=await e(...n),p=JSON.stringify({value:d,createdAt:Date.now()});return C.promises.writeFile(u,p,"utf-8").catch(m=>{console.error("Failed to write fs cache:",m)}),d}},{keyGenerator:(...n)=>B(t,...n),lruOptions:t.lruOptions||{max:100,ttl:v}})}const V=async()=>await import("typescript"),ve=async()=>await import("esbuild"),Ne=async()=>(await import("postcss")).default,Re=async()=>(await import("tailwindcss")).default,je=async()=>(await import("autoprefixer")).default,De=!1,Le=async(e,{componentId:t})=>{const o=`@tailwind components;
2
+ @tailwind utilities;
3
+ `,n=`.CustomComponent_${t}`,s=await Ne(),r=await Re(),u=await je();return(await s([r({content:[{raw:e,extension:"tsx"}]}),u({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),d=>{d.walkRules(p=>{p.selectors=p.selectors.map(m=>m.replace(/\.(.+)/g,`${n}.$1,${n} .$1`))})}]).process(o)).css},ke=async(e,{componentId:t})=>{const o=await Le(e,{componentId:t});return`export const __PagesKit_CSS__ = ${JSON.stringify(o)};
4
+
5
+ ${e}
6
+ `},H=R(async(e,t)=>{let o=await V();try{let n=o.transpileModule(e,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.ESNext},transformers:{before:[K.createBuiltinModuleTransformer(o)]}}).outputText;if(t.tailwind&&(n=await ke(n,{componentId:t.componentId})),t.module===T.PreloadComponentScriptModule.ESM)return n;const s=o.transpileModule(n,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.CommonJS,moduleResolution:o.ModuleResolutionKind.Node16}}).outputText;return t.module===T.PreloadComponentScriptModule.CJS?s:Q(t.moduleName,s)}catch(n){throw new Error(n)}finally{o=null}},{subdir:"transpileModule"}),Fe=async(e,t)=>{let{build:o}=await ve(),n=null;try{const r=(await o({entryPoints:["index.tsx"],external:Object.keys(j.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(d){d.onResolve({filter:/.*/},p=>p.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:p.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),d.onLoad({filter:/.*/,namespace:"vfs"},async p=>{if(p.path==="index.tsx")return{contents:`export { ${t} } from './component'`,loader:"tsx"};if(p.path==="component.tsx")return{contents:e,loader:"tsx"};if(K.isRelativeModule(p.path)){const m=p.path.split("/").pop()}return null})}}]})).outputFiles?.[0]?.contents;if(!r)throw new Error("Failed to build server code");const u=Buffer.from(r).toString();return n=await V(),n.transpileModule(u,{compilerOptions:{module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2020}}).outputText}catch(s){throw new Error(s)}finally{o=null,n=null}},Ue=(e,t)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,"m").test(e)?e:void 0,W=R(async(e,t)=>{const o=await Fe(e,t);return Ue(o,t)},{subdir:"extractExportValueSchema"}),Q=(e,t)=>`// GENERATED FILE. DO NOT EDIT.
7
+ var ${e} = async function () {
8
+
9
+ const exports = {};
10
+ let moduleExports = null;
11
+
12
+ // add commonjs module compatibility layer
13
+ const module = { exports: moduleExports };
14
+
15
+ // execute component code
16
+ ${t}
17
+
18
+ // handle possible module.exports
19
+ if (module.exports && module.exports !== moduleExports) {
20
+ // if module.exports is used, use it first
21
+ return typeof module.exports === 'object' ? module.exports : { default: module.exports };
22
+ }
23
+
24
+ // ensure a default export
25
+ if (!('default' in exports) && Object.keys(exports).length === 0) {
26
+ // module has no exports, return null to indicate invalid
27
+ return null;
28
+ }
29
+
30
+ return exports;
31
+ };
32
+ `,z=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function $e(e){return e?.type==="react-component"}const P=new pe.LRUCache({max:100,ttl:1e3*60*60*24}),Z=60*60,D=10;function L(e){g.info("clear preload components cache",{cacheKey:e}),P.delete(e)}function Be(e){for(const t of P.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),L(t))}function He(e){for(const t of P.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),L(t))}function X({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function qe({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:u,config:{defaultLocale:l}}=o;if(!l)return null;const d=(await Promise.all(s.map(async c=>{try{const a=X({mode:e,instanceId:c.id,componentId:c.componentId,locale:n});if(e!=="draft"&&c.useCache&&P.has(a))return g.info(`get preload component from cache: ${a}`),P.get(a);const f=I({state:o,componentId:c.componentId});if(!f)return null;const S=await Y({req:t,state:o,componentId:f.id,locale:n,defaultLocale:l,properties:c.properties});if(!S)return null;const M={instanceId:c.id,preload:S};if(e!=="draft"&&c.useCache){let E=Z;c.cacheDuration&&(E=c.cacheDuration),g.info(`set preload component to cache(${E}s): ${a}`),P.set(a,M,{ttl:E*1e3})}return M}catch(a){return g.error("get preload component error",{instanceId:c.id,componentId:c.componentId},{error:a}),null}}))).filter(c=>!!c),p=Object.values(d.reduce((c,a)=>({...c,...a.preload.components}),{}));async function m(){const c=await Promise.all(p.map(async a=>{const f=r===T.PreloadComponentScriptModule.ESM,S=r===T.PreloadComponentScriptModule.UMD_FN,M=r===T.PreloadComponentScriptModule.CJS,E=f?"":b.componentUMDName({componentId:a.component.id}),k=te(a.component);let A={module:r,script:"",moduleName:E};if(k&&a.component.renderer?.type==="react-component"&&f&&a.component.renderer?.script)A.script=a.component.renderer?.script;else if(k&&a.component.renderer?.type==="react-component"&&(M||S)&&a.component.renderer?.cjsScript){const F=a.component.renderer.cjsScript;A.script=M?F:Q(E,F)}else A=f?{module:r,script:await H(a.script,{componentId:a.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await H(a.script,{componentId:a.component.id,module:r,moduleName:E,tailwind:e!=="draft"}),moduleName:E};return[a.component.id,{component:a.component,script:A}]}));return Object.fromEntries(c)}const w=await m();return{config:{defaultLocale:l,supportedLocales:u},components:w,instances:d.map(c=>({id:c.instanceId,componentId:c.preload.component.id,locales:{[c.preload.locale]:{props:c.preload.props}}}))}}async function Y({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:u}=t,l=I({state:t,componentId:o});if(!l)return null;const d=u.some(m=>m.locale===n)?n:s;if(!d)return null;const p=await ee({req:e,state:t,componentId:o,locale:d,defaultLocale:s,properties:r});return p?{component:l,...p}:null}const Ke=20;async function ee({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:u}){if(t>Ke)throw new RangeError("max component depth exceeded");const l=Ge({state:o,componentId:n,properties:u,locale:s});if(!l)return null;const{props:d,component:p}=l,m={locale:s||r,components:{[l.component.id]:{component:l.component,script:l.script}},props:{...d}};try{const w=$e(p.renderer)?p.renderer.getServerSideProps:void 0,i=await Ve({...l,req:e,getServerSideProps:w});i?.props&&Object.assign(m.props,i.props)}catch(w){g.error("preload data at server side error",{componentId:n,name:l.component.name},{error:w})}return await Promise.all(Object.entries(d).map(async([w,i])=>{if(i?.type===b.RenderNestedComponent){const c=await ee({req:e,depth:t+1,state:o,componentId:i.componentId,locale:s,defaultLocale:r,properties:i.properties});c&&(Object.assign(m.components,c.components),Object.assign(m.props,{[w]:{type:b.RenderNestedComponent,componentId:i.componentId,props:c.props}}))}})),m}function Ge({state:e,componentId:t,locale:o,properties:n}){const s=I({state:e,componentId:t});if(!s)return null;const r=b.mergeComponent({componentId:t,getComponent:u=>I({state:e,componentId:u}),locale:o,defaultLocale:e.config.defaultLocale,properties:n});return r?{component:s,script:r.script,props:{locale:o,...r.props}}:null}function I({state:e,componentId:t}){return e.components[t]?.data??e.resources.components?.[t]?.component}function Je({state:e,name:t}){const o=t.toLowerCase();return Object.values(e.components).find(n=>n.data.name?.toLowerCase()===o)?.data??(e.resources.components&&Object.values(e.resources.components).find(n=>n.component.name?.toLowerCase()===o))?.component}async function Ve({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await W(t,"getServerSideProps");if(!r)return null;const l=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",d=new Promise(i=>{setTimeout(()=>{i({})},D*1e3)});let p=await z();const m={componentMountPoints:h.default.components};return await Promise.race([d,p.callFunction({code:`${r}
33
+
34
+ export async function getServerSidePropsWrapper(props) {
35
+ const { location, fetch, props: componentProps } = props;
36
+ // 使用局部变量而不是全局变量
37
+ const originalLocation = typeof window !== 'undefined' ? window.location : undefined;
38
+ const originalFetch = globalThis.fetch;
39
+
40
+ try {
41
+ globalThis.location = location;
42
+ globalThis.fetch = fetch;
43
+ return await ${l}(componentProps);
44
+ } finally {
45
+ // 清理全局状态
46
+ if (originalLocation) globalThis.location = originalLocation;
47
+ if (originalFetch) globalThis.fetch = originalFetch;
48
+ }
49
+ }`,filename:`${e.name||e.id}.js`,moduleLoader:i=>{if(i==="@blocklet/pages-kit/builtin/utils")return` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
50
+ export { joinURL, withQuery, getQuery, getComponentMountPoint }
51
+ `;if(i==="@blocklet/pages-kit/builtin/dayjs")return O.BuiltinModules.dayjs;if(i in O.BuiltinModules)return O.BuiltinModules[i];if(i in j.BuiltinModules){const c=j.BuiltinModules[i];return ge.default(c)?void 0:c}},global:{console:{log:(...i)=>{g.info(...i)},warn:(...i)=>{g.warn(...i)},error:(...i)=>{g.error(...i)}},getComponentMountPoint:ie.getComponentMountPoint,joinURL:y.joinURL,withQuery:y.withQuery,getQuery:y.getQuery,window:{blocklet:m},blocklet:m},functionName:"getServerSidePropsWrapper",args:[{location:{href:y.joinURL(y.withHttps(n.hostname),n.originalUrl)},fetch:(i,{...c}={})=>{const a=typeof i=="string"&&i.startsWith("/")?y.joinURL(h.default.env.appUrl,i):i;if(typeof a=="string"&&y.parseURL(a).host===y.parseURL(h.default.env.appUrl).host){const f=n.get("cookie");if(f){const S=new q.Headers(c.headers);S.set("cookie",f),c.headers=S}}return he.default(a,{...c,timeout:D*1e3}).then(f=>({ok:f.ok,status:f.status,statusText:f.statusText,headers:Object.fromEntries(f.headers.entries()),json:()=>f.json()}))},props:o}]}).finally(()=>{p=null})])}const We=R(async(e,t,o,n)=>{if(!e?.includes(t)&&!n)return null;const s=n??await W(e,t);if(s)try{let r=await z();return await r.callFunction({cache:!0,code:`
52
+ ${s}
53
+
54
+ export function get${t}SchemaWrapper() {
55
+ return ${t};
56
+ }
57
+ `,filename:`${o}.js`,functionName:`get${t}SchemaWrapper`}).finally(()=>{r=null})}catch(r){return g.error(`获取 ${t} 失败`,{componentId:o,error:r}),null}return null},{subdir:"getExportSchemaValueFromCode"}),te=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=Z;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=D;exports.IMAGE_BIN_NAME=Ee;exports.clearPreloadComponentsCache=L;exports.clearPreloadComponentsCacheByInstanceId=He;exports.clearPreloadComponentsCacheByMode=Be;exports.databaseUrl=ye;exports.getComponentFromState=I;exports.getComponentFromStateByName=Je;exports.getExportSchemaValueFromCode=We;exports.getMultiTenantAllProjectAccessPassports=_e;exports.getPreloadComponent=Y;exports.getPreloadComponents=qe;exports.getPreloadComponentsCacheKey=X;exports.isMultiTenant=Se;exports.logger=g;exports.memoizeWithFs=R;exports.skipTranspileComponent=te;
@@ -1 +1 @@
1
- "use strict";const d=require("./components--WuwSB_H.js"),F=require("@syncedstore/core"),Je=require("yjs"),Ke=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),He=require("lodash"),We=require("@blocklet/sdk/lib/config"),I=require("fs"),g=require("path"),Te=require("@blocklet/pages-kit/utils/common"),Qe=require("@blocklet/pages-kit/utils/page-model"),Xe=require("@blocklet/pages-kit/utils/property"),Ie=require("@blocklet/sdk/lib/component"),Ze=require("@reactivedata/reactive"),X=require("glob"),et=require("lib0/decoding"),tt=require("lib0/encoding"),st=require("lodash/cloneDeep"),at=require("lodash/debounce"),nt=require("lodash/get"),ot=require("lodash/isEmpty"),rt=require("lodash/set"),it=require("lodash/union"),be=require("lru-cache"),ct=require("p-limit"),C=require("sequelize"),lt=require("stream/promises"),pt=require("tar"),Y=require("ufo"),ut=require("wait-on"),z=require("y-protocols/awareness"),le=require("y-protocols/sync"),dt=require("yaml");require("sqlite3");require("@blocklet/pages-kit/types/state");const M=t=>t&&t.__esModule?t:{default:t};function ae(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const a=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,a.get?a:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const $=ae(Je),E=M(We),pe=ae(et),v=ae(tt),ft=M(st),Re=M(at),Ee=M(nt),we=M(ot),De=M(rt),gt=M(it),mt=M(ct),ht=M(ut),x=ae(dt),yt=C.DataTypes.sqlite.DATE.parse;C.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):yt(t,e);const U=new C.Sequelize({dialect:"sqlite",storage:d.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});U.query("pragma journal_mode = WAL;");U.query("pragma synchronous = normal;");U.query("pragma journal_size_limit = 33554432;");U.query("pragma cache_size = -2000;");U.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await U.close(),process.exit(0)});process.on("SIGTERM",async()=>{await U.close(),process.exit(0)});async function St(t,e){try{if(t.getDialect()!=="sqlite")return;const[s]=await t.query("SELECT 1");if(!s||s.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(s){if(s.name==="SequelizeConnectionError"||s?.message&&/closed!/.test(s.message))return;console.error("Failed to cleanup SQLite memory",e,s)}}let fe=null;fe&&clearInterval(fe);fe=setInterval(async()=>{d.logger.info("Start cleanupSqliteMemory"),await St(U,d.databaseUrl),d.logger.info("End cleanupSqliteMemory")},60*1e3*10);class Ae extends C.Model{}Ae.init({id:{type:C.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:C.DataTypes.UUIDV4},projectId:{type:C.DataTypes.UUID,allowNull:!1},componentId:{type:C.DataTypes.STRING,allowNull:!1}},{sequelize:U,tableName:"ProjectComponents",timestamps:!1});class L extends C.Model{static async getProjectByIdOrSlug(e){return L.findOne({where:{[C.Op.or]:[{id:e},{slug:e}]}})}}L.init({id:{type:C.DataTypes.UUID,defaultValue:C.DataTypes.UUIDV4,primaryKey:!0},name:{type:C.DataTypes.STRING,allowNull:!1},description:C.DataTypes.TEXT,createdAt:C.DataTypes.DATE,updatedAt:C.DataTypes.DATE,createdBy:{type:C.DataTypes.STRING,allowNull:!1},updatedBy:{type:C.DataTypes.STRING,allowNull:!1},slug:C.DataTypes.STRING,icon:C.DataTypes.STRING,pinnedAt:C.DataTypes.DATE,useAllResources:C.DataTypes.BOOLEAN,npmSecret:C.DataTypes.STRING,relatedBlocklets:{type:C.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return d.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){d.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:C.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return d.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){d.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}}},{sequelize:U,paranoid:!0});L.hasMany(Ae,{foreignKey:"projectId",as:"components"});const It="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",ge="page",me="trigger-reload-project-resource",Pe=It,bt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM";function Z(t){t.observeDeep(e=>{e.some(s=>s.changes.keys.has("updatedAt")||s.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Le(){return I.mkdtempSync(g.join(E.default.env.dataDir,"tmp-"))}function ee(t,e,s=[]){return Array.isArray(t)?t.flatMap((a,n)=>ee(a,e,[...s,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([a,n])=>ee(n,e,[...s,a])):e(t)?[s]:[]}function R(t){return t.filter(e=>e!=null)}function Et(t){t.pages&&Object.keys(t.pages).forEach(s=>{const a=F.getYjsValue(t.pages[s]);a&&a instanceof $.Map&&Z(a)});const e=F.getYjsValue(t.pages);e&&e instanceof $.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.pages[n]);o&&o instanceof $.Map&&Z(o)}})})}function wt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=F.getYjsValue(t.routes?.[s]);a&&a instanceof $.Map&&Z(a)});const e=F.getYjsValue(t.routes);e&&e instanceof $.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.routes?.[n]);o&&o instanceof $.Map&&Z(o)}})})}function At(t,e){for(const s of e||Object.keys(t.routes||{})){let a=s,n=[];if(s.includes("-")){const[o,...i]=s.split("-");a=o,n=i||[]}if(t.routes?.[a]!==void 0){t.routes[a].publishedAt=new Date().toISOString();const o=t.routes[a];if(!o||!o.params||o.params.length===0)continue;if(s.includes("-")&&n.length>0){const i=Q.getRouteMetaDataByOptionIds(n,o);i&&(i.publishedAt=new Date().toISOString())}if(!e){const i=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const c of i)c.routeMetaData??={},c.routeMetaData.publishedAt=new Date().toISOString()}}}}function ue({page:t,route:e,state:s,routeId:a,routePathInfo:n}){d.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...He.cloneDeep(t),id:a,slug:n?.path??e.path,createdAt:e.createdAt,updatedAt:n?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:n?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(n?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const i of s.supportedLocales){if(e.dataSource){let c=e.id;n&&(c=n.paramOptionIds.join("-"));const p=e.dataSource.pathDataMappings?.[c]?.dataCache?.[i.locale]??e.dataSource.pathDataMappings?.[c]?.dataCache?.[s.config.defaultLocale||"en"];if(!p)continue;Ke.setPageDataSource(o,s,i.locale,p)}n&&n.routeMetaData&&(n.routeMetaData.publishedAt=new Date().toISOString())}return o}const Pt=30*60*1e3,B=new be.LRUCache({max:100,ttl:Pt});function Ot(t,e=[]){let s=0;const a=Array.from(B.keys()),n=[];for(const o of t){n.push(`page-html:prod:${o}:lang-path=none`);for(const i of e)n.push(`page-html:prod:/${i}${o}:lang-path=${i}`)}for(const o of a){const i=o.split(":lang-path=")[0]||"";for(const c of n){const m=(c.split(":lang-path=")[0]||"").replace(/\/:[^/]+/g,"");if(i.startsWith(m)){B.delete(o),s++,d.logger.info(`[Cache CLEAR] key: ${o}`);break}}}return d.logger.info(`[Cache CLEAR] cleared ${s} entries for patterns:`,n),s}function Ct({projectId:t,projectSlug:e,supportedLocales:s=[]}){let a=0;const n=Array.from(B.keys()),o=[];o.push(`page-html:prod:/${t}`),e&&e!==t&&o.push(`page-html:prod:/${e}`);for(const i of s)o.push(`page-html:prod:/${i}/${t}`),e&&e!==t&&(e!=="/"?o.push(`page-html:prod:/${i}/${e}`):o.push(`page-html:prod:/${i}`));for(const i of n)for(const c of o)if(i.startsWith(c)){B.delete(i),a++,d.logger.info(`[Cache CLEAR PROJECT] key: ${i}`);break}return d.logger.info(`[Cache CLEAR PROJECT] cleared ${a} entries for project ${t}${e?` (slug: ${e})`:""}`),a}function jt(){const t=B.size;return B.clear(),d.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}E.default.events.on(E.default.Events.envUpdate,jt);const{uploadToMediaKit:Tt}=require("@blocklet/uploader-server"),Oe=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,J=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,ke=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Dt=1e4,kt=3e4,H=0,de=1,vt=0,Rt=1,he=E.default,q=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Lt=["production","draft"],_t=["production"];function te(t){return t?.replace(/\//g,"|")||""}function _e(){const t=he.env.languages?.map(s=>({locale:s.code,name:s.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class O extends $.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&$.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=Ze.reactive(F.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new z.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static RELEASE_DELAY=5*60*1e3;static PERIODIC_CHECK_INTERVAL=2*60*60*1e3;static sharedInstances={};static pageUrlMapCache=new be.LRUCache({max:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(q,e),a=g.join(q,`@del-${e}`);I.renameSync(s,a)}catch(s){d.logger.error("Failed to safe delete project state dir:",s)}}static async getProjectIds(){return(await L.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return X.globSync("*/",{cwd:q,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>O.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=O.sharedInstances[e];return s||(s=new O({path:g.join(q,e)}),O.sharedInstances[e]=s,ze({projectId:e,pages:ne,components:oe}),s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(we.default(s?.productionState)){const a=g.join(q,e,"production"),n=await Ce(a,{includeResources:!0})??_e();if(!n?.config?.defaultLocale){n.config??={};const o=he.env.languages?.map(i=>({locale:i.code,name:i.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return s?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((s,a)=>this.closeConn(a)),this.awareness.destroy();const e=g.basename(this.options.path);delete O.sharedInstances[e],super.destroy()}initObserver(){Et(this.syncedStore),wt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=O.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return O.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return O.getProductionState(s)}async setState(e,s){const a=await Ne(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(g.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);O.pageUrlMapCache.delete(o),await L.update({productionState:{...s}},{where:{id:o}})}}getPublishDir(e){return g.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:s,removed:a},n)=>{const o=e.concat(s,a);if(n!==null){const p=this.conns.get(n);p&&(e.forEach(m=>{p.add(m)}),a.forEach(m=>{p.delete(m)}))}const i=v.createEncoder();v.writeVarUint(i,de),v.writeVarUint8Array(i,z.encodeAwarenessUpdate(this.awareness,o));const c=v.toUint8Array(i);this.conns.forEach((p,m)=>this.send(m,c))};updateHandler=e=>{const s=v.createEncoder();v.writeVarUint(s,H),le.writeUpdate(s,e);const a=v.toUint8Array(s);this.conns.forEach((n,o)=>this.send(o,a))};ensureDataStructure=()=>{const{supportedLocales:e,pages:s,pageIds:a,config:n,routes:o,routeIds:i}=this.syncedStore;{const c=new Set(Object.keys(s));let p=0;for(;p<a.length;){const m=a[p];c.has(m)?(c.delete(m),p++):a.splice(p,1)}}{const c=new Set(Object.keys(o));let p=0;for(;p<i.length;){const m=i[p];c.has(m)?(c.delete(m),p++):i.splice(p,1)}}e.splice(0,e.length),e.push(...he.env.languages.map(c=>({locale:c.code,name:c.name}))),n.defaultLocale=e[0]?.locale;{let c=0;const p=new Set;for(;c<e.length;){const{locale:m}=e[c];p.has(m)?e.splice(c,1):(c++,p.add(m))}}};send=(e,s)=>{e.readyState!==vt&&e.readyState!==Rt&&this.closeConn(e);try{e.send(s,a=>{a&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const s=this.conns.get(e);this.conns.delete(e),s&&z.removeAwarenessStates(this.awareness,Array.from(s),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=g.basename(this.options.path);this.releaseTimer=setTimeout(()=>{d.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},O.RELEASE_DELAY),d.logger.info(`[SiteState] scheduled release for project ${e} in ${O.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=g.basename(this.options.path);d.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Re.default(()=>{I.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,$.encodeStateAsUpdate(this))},Dt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=await this.getState("draft"),n=await this.getState("production");await Se(a,n,{routes:s,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),At(this.syncedStore,s),await this.setState(e,n),await this.clearPageCacheForRoutes(s,n)};mergeState=async(e,s)=>{const a=JSON.parse(JSON.stringify(s));e.config.fontFamily??={};const n=a.config?.fontFamily,o=e.config?.fontFamily;e.config.fontFamily.title=n?.title||o?.title,e.config.fontFamily.description=n?.description||o?.description,await new Promise((i,c)=>{this.transact(async()=>{try{const p=await Se(e,s);i(p)}catch(p){c(p)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;if(d.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,e||[]),!e||e.length===0){Ct({projectId:a,projectSlug:o,supportedLocales:s.supportedLocales.map(m=>m.locale)});return}const i=s.supportedLocales.map(m=>m.locale),c=[],p=e.filter(m=>s.pages[m]);for(const m of p){const T=s.pages[m].slug;o&&o!==a&&(o==="/"?c.push(T):c.push(`/${o}${T}`)),c.push(`/${a}${T}`)}if(d.logger.info(`[SiteState] clearing page cache for project ${a}, pathPatterns:`,c),c.length>0){const m=Ot(c,i);d.logger.info(`[SiteState] cleared ${m} page cache entries for project ${a}, routes:`,e)}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",n=>this.messageListener(e,new Uint8Array(n)));let s=!0;const a=setInterval(()=>{if(!s)this.conns.has(e)&&this.closeConn(e),clearInterval(a);else if(this.conns.has(e)){s=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(a)}}},kt);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{s=!0});{const n=v.createEncoder();v.writeVarUint(n,H),le.writeSyncStep1(n,this),this.send(e,v.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const i=v.createEncoder();v.writeVarUint(i,de),v.writeVarUint8Array(i,z.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,v.toUint8Array(i))}}};messageListener=(e,s)=>{try{const a=v.createEncoder(),n=pe.createDecoder(s),o=pe.readVarUint(n);switch(o){case H:v.writeVarUint(a,H),le.readSyncMessage(n,a,this,null),v.length(a)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(a)));break;case de:{z.applyAwarenessUpdate(this.awareness,pe.readVarUint8Array(n),e);break}default:d.logger.warn(`Unsupported messageType ${o}`)}}catch(a){d.logger.error(a)}this.save()};static async pageUrlMap(e,s){let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(i=>[i,!0])||[]);for(const i of a){const c=O.pageUrlMapCache.get(i);c&&(n={...n,...c},o.delete(i))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[C.Op.in]:a}}});await Promise.all(o?.map(async i=>{const c=i.id,p=i.slug||c,m={},k=e==="production"&&i?.productionState?i.productionState:await O.getStateByProjectId(i.id,e),T=gt.default(E.default.env.languages?.map(u=>u.code)||[],k.supportedLocales?.map(u=>u.locale)||[]),w=(u,l)=>{p&&(m[Y.joinURL("/",p,u)]={...l,shouldRedirect:!0,mainPage:!0}),m[Y.joinURL("/",c,u)]={...l,shouldRedirect:!0,mainPage:!0};for(const y of T){const j={...l,locale:y};m[Y.joinURL("/",y,c,u)]=j,p&&(m[Y.joinURL("/",y,p,u)]=j)}};if(e==="draft")for(const u of k.routeIds||[]){const l=k?.routes?.[u];if(!l)continue;if(l.params&&l.params.length>0){const h=Q.generateParamCombinations({basePath:l.path,params:l.params,routeId:l.id,paramsOptions:l.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const f of h){const S=f.path,A={projectId:c,projectSlug:p,pageSlug:S,pageId:l.displayTemplateId||"",routeId:u,defaultLocale:T?.[0],locales:T,publishedAt:k.config.publishedAt,isPublic:l.isPublic&&f?.routeMetaData?.isPublic};w(S,A)}}const y=l.path,j={projectId:c,projectSlug:p,pageSlug:y,pageId:l.displayTemplateId||"",routeId:u,defaultLocale:T?.[0],locales:T,publishedAt:k.config.publishedAt,isPublic:l.isPublic};w(y,j)}for(const u of k.pageIds){const l=k.pages[u];if(!l||e==="production"&&!l.isPublic)continue;const y=l.slug,j=i.slug||c,h={projectId:c,projectSlug:j,pageSlug:y,pageId:u,defaultLocale:T?.[0],locales:T,publishedAt:k.config.publishedAt,isPublic:l.isPublic,templateConfig:l.templateConfig};w(y,h)}e==="production"&&O.pageUrlMapCache.set(c,m),n={...n,...m}}))}return n}getDocumentSize(){return $.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(O.sharedInstances)){const n=a.getDocumentSize();e.push({projectId:s,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:a.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),d.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,d.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(O.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(O.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(d.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){d.logger.info(`[SiteState] releasing ${s.length} instances without connections:`,s.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:i}of s)try{d.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),i.destroy(),n++}catch(c){d.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,c)}d.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?d.logger.debug("[SiteState] periodic check: all instances have active connections"):d.logger.debug("[SiteState] periodic check: no instances exist")}}async function $t(t,e,s){if(!t||!I.existsSync(t)||!I.lstatSync(t).isFile())return null;let a=s[t];return a||(a=(async()=>{try{return(await Tt({filePath:t,fileName:e}))?.data?.filename}catch(n){return d.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const $e=async(t,e)=>{const s=g.basename(t),a=await Ie.call({name:Pe,path:Y.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await lt.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},Ue=async(t,e)=>{await Promise.all(t.map(async s=>{try{await $e(s,g.join(e,g.basename(s)))}catch(a){d.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function Me(t){return Oe.test(t)?[t]:J.test(t)?(ke.lastIndex=0,Array.from(t.matchAll(ke)).map(s=>s[1]).filter(s=>!!s)):[]}async function W(t,e,s){const{getFilename:a,exportAssets:n}=s,o=g.join(e,a(t));if(I.mkdirSync(g.dirname(o),{recursive:!0}),I.writeFileSync(o,x.stringify(t)),n){const c=ee(t,p=>typeof p=="string"&&(Oe.test(p)||J.test(p))).map(p=>{const m=Ee.default(t,p);return Me(m)}).flat().filter(Boolean);await Ue(c,g.dirname(o))}}const ye=new be.LRUCache({max:100,ttl:1*60*1e3});async function ve(t,e,s){const a=ee(t,c=>typeof c=="string"&&(Oe.test(c)||J.test(c))),n=mt.default(2),o=a.map(c=>n(async()=>{try{const p=Ee.default(t,c),m=Me(p);for(const k of m){const T=g.basename(k),w=s.getFilePath(k,c),u=w?`${w}:${T}`:T,l=ye.get(u);if(l){J.test(p)||De.default(t,c,l);return}const y=await $t(w,T,e);y&&(J.test(p)||De.default(t,c,y),ye.set(u,y))}}catch(p){d.logger.error(`Failed to process upload for path ${c.join(".")}:`,p.message||p.reason)}})),i=await Promise.allSettled(o);s.onFinish?.(i)}async function Ne(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:i="all"}={}){const c=s==="all"?t.pageIds:s,p=Xe.getComponentDependencies({state:t,pageIds:c,componentIds:a==="all"?Object.keys(t.components):a}),m=i==="all"?t.routeIds:i,k=r=>({id:r.id,name:r.name,isTemplateSection:r.isTemplateSection??!1,templateDescription:r.templateDescription,llmConfig:r.llmConfig,component:r.component,config:r.config,visibility:r.visibility,sections:r?.sectionIds?R(r?.sectionIds?.map(b=>{const D=r.sections?.[b];return D&&k(D)})):void 0}),T=(r,b)=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,isPublic:r.isPublic??!0,templateConfig:r.templateConfig,meta:r.locales?.[b]??{},sections:R(r.sectionIds.map(D=>{const N=r.sections[D];return N&&k(N)})),dataSource:Object.fromEntries(Object.entries(r.dataSource||{}).map(([D,N])=>[D,N?.[b]??{}]))}),w=r=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,path:r.path,handler:r.handler,isPublic:r.isPublic??!0,params:r.params??[],enabledGenerate:r.enabledGenerate??!1,displayTemplateId:r.displayTemplateId,dataSource:r.dataSource}),u=R(m.map(r=>{const b=t.routes[r];return b&&w(b)})),l=R(t.supportedLocales.map(r=>r.locale).flatMap(r=>c.map(b=>{const D=t.pages[b];return D&&{locale:r,slug:D.slug,page:T(D,r)}}))),y=Le(),j=g.join(y,"pages");I.mkdirSync(j,{recursive:!0});const h=g.join(y,"components");I.mkdirSync(h,{recursive:!0});const f=g.join(y,"routes");I.mkdirSync(f,{recursive:!0});for(const{locale:r,slug:b,page:D}of l)await W(D,j,{getFilename:()=>`${te(b)||"index"}.${r}.yml`,exportAssets:e});for(const r of u)await W(r,f,{getFilename:()=>`${te(r.path)||"index"}.yml`,exportAssets:e});for(const r of p){const b=t.components[r]?.data;b&&await W(b,h,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const S=g.join(y,".blocklet/pages/pages.config.yml");I.mkdirSync(g.dirname(S),{recursive:!0});const A={pages:R(c.map(r=>{const b=t.pages[r];return b&&{id:r,slug:b.slug}})),routes:R(m.map(r=>{const b=t.routes[r];return b&&{id:r,path:b.path}})),components:R(p.map(r=>{const b=t.components[r]?.data;return b&&{id:r,name:b.name}})),...o?{resources:{components:R(Object.keys(t.resources?.components||{}).filter(r=>p.includes(r)).map(r=>({id:r,name:t.resources?.components?.[r]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};I.writeFileSync(S,x.stringify(A));const P=g.join(y,"config.source.json");if(n&&I.writeFileSync(P,JSON.stringify(n)),o){const r=g.join(y,"resources"),b=g.join(r,"components");I.mkdirSync(b,{recursive:!0});for(const V of Object.keys(t?.resources?.components??{}).filter(_=>p.includes(_))){const _=t.resources?.components?.[V]?.component;_&&await W(_,b,{getFilename:G=>`${G.name||"unnamed"}.${G.id}.yml`,exportAssets:e})}const D=g.join(y,"chunks");I.mkdirSync(D,{recursive:!0});const N=Ut();for(const V of Object.keys(t?.resources?.components??{}).filter(_=>p.includes(_))){const _=t.resources?.components?.[V]?.component;if(_&&_.renderer?.type==="react-component"){const G=_.renderer?.chunks??[];if(G?.length>0)for(const ie of G){const je=g.join(D,ie),ce=N?.[ie];try{ce&&I.existsSync(ce)&&!I.existsSync(je)&&I.copyFileSync(ce,je)}catch(Ye){d.logger.error(`copy chunk ${ie} error`,Ye.message)}}}}}return y}async function Ce(t,{importAssets:e,includeResources:s}={}){if(!I.existsSync(t))return null;let a,n=!1;try{I.lstatSync(t).isDirectory()?a=t:/\.(tgz|gz|tar)$/.test(t)&&(n=!0,a=Le(),await pt.x({file:t,C:a}));const o=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),i=o&&g.join(g.dirname(o),"../../pages"),c=o&&g.join(g.dirname(o),"../../components"),p=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const m=x.parse(I.readFileSync(o).toString()),k=(h,f,S)=>{let A=g.join(h,`${f}${S?`.${S}`:""}.yml`);return(!I.existsSync(A)||!I.lstatSync(A).isFile())&&(A=g.join(h,f,`index${S?`.${S}`:""}.yml`),!I.existsSync(A)||!I.lstatSync(A))?null:x.parse(I.readFileSync(A).toString())},T=(h,f)=>{try{const S=X.globSync(`*.${f}.yml`,{cwd:h,absolute:!0})[0];return S?x.parse(I.readFileSync(S).toString()):null}catch(S){d.logger.error("parse component error",S)}return null},w=(h,f)=>{let S=g.join(h,`${f}.yml`);return(!I.existsSync(S)||!I.lstatSync(S).isFile())&&(S=g.join(h,f,"index.yml"),!I.existsSync(S)||!I.lstatSync(S))?null:x.parse(I.readFileSync(S).toString())},u=R(m.pages.map(({slug:h})=>{const f=R(m.supportedLocales.map(({locale:P})=>{const r=i?k(i,te(h),P):void 0;if(r)return{locale:P,page:r};const b=i?k(i,h,P):void 0;return b&&{locale:P,page:b}})),S=f[0]?.page;if(!S)return null;const A=S.sections.map(Qe.unzipSection);return{id:S.id||Te.nextId(),createdAt:S.createdAt,updatedAt:S.updatedAt,publishedAt:S.publishedAt,isPublic:S.isPublic??!0,templateConfig:S.templateConfig,slug:h,sections:Object.fromEntries(A.map(P=>[P.id,P])),sectionIds:A.map(P=>P.id),locales:Object.fromEntries(f.map(({locale:P,page:r})=>[P,r.meta])),dataSource:S.dataSource?Object.fromEntries([...new Set(f.flatMap(({page:P})=>Object.keys(P.dataSource??{})))].map(P=>[P,Object.fromEntries(f.map(({locale:r,page:b})=>{const D=b.dataSource?.[P];return[r,D||{}]}))])):Object.fromEntries([...new Set(f.flatMap(({page:P})=>P.sections.map(r=>r.id)))].map(P=>[P,Object.fromEntries(f.map(({locale:r,page:b})=>{const D=b.dataSource?.[P];if(D)return[r,D];const N=b.sections.find(V=>V.id===P);return[r,N?.properties||{}]}))]))}})),l=R(m?.routes?.map(({path:h})=>{const f=p?w(p,te(h)):void 0;return{...f,id:f?.id||Te.nextId(),createdAt:f?.createdAt??new Date().toISOString(),updatedAt:f?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:f?.path??`/${f?.id}`,params:f?.params,handler:f?.handler??"Pages Kit",isPublic:f?.isPublic??!0,enabledGenerate:f?.enabledGenerate??!1,displayTemplateId:f?.displayTemplateId??void 0,dataSource:f?.dataSource??{}}})??[]),y=c?R(m.components?.map(({id:h})=>T(c,h))??[]):[];if(e){const h=(...f)=>{d.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...f)};try{h("wait image-bin api ready"),await ht.default({resources:[`${Ie.getComponentWebEndpoint(d.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:A=>A>=200&&A<=500}),h("image-bin api is ready");const f={},S={};h("start to upload assets"),await Promise.allSettled([ve(y,f,{getFilePath:A=>c&&g.join(c,A),onFinish:A=>{h(`upload ${A.length} component assets`)}}),ve(u,S,{getFilePath:(A,P)=>{const r=Ee.default(u,P.slice(0,1));return i&&g.join(i,g.dirname(r.slug),A)},onFinish:A=>{h(`upload ${A.length} page assets`)}})]),h("upload assets done"),ye.clear(),global.gc&&global.gc()}catch(f){h("Error during asset import:",f)}}const j={};if(s){const h=o&&g.join(g.dirname(o),"../../resources/components"),f=R(m.resources?.components?.map(({id:S})=>T(h,S))??[]);f.length>0&&(j.components=Object.fromEntries(f.map((S,A)=>[S.id,{index:A,component:S}])))}return{supportedLocales:m.supportedLocales,pageIds:u.map(h=>h.id),components:Object.fromEntries(y.map((h,f)=>[h.id,{index:f,data:h}])),pages:Object.fromEntries(u.map(h=>[h.id,h])),config:m.config||{},resources:j,routeIds:l.map(h=>h.id),routes:Object.fromEntries(l.map(h=>[h.id,h])),dataSourceIds:[],dataSources:{}}}finally{n&&a&&I.rmSync(a,{force:!0,recursive:!0})}}async function Se(t,e,{routes:s,mergeMode:a="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&d.clearPreloadComponentsCacheByMode(o)}catch(w){d.logger.error("clear preload page cache error",{error:w})}const{pages:i,pageIds:c,routeIds:p,routes:m,supportedLocales:k}=t;if(o==="production"){let w=s??[],u=null;for(const l of p??[]){const y=m?.[l];if(y?.params&&y?.params.length>0&&y?.paramsOptions&&y?.paramsOptions.length>0){const j=Q.generateParamCombinations({basePath:y.path,params:y.params,routeId:y.id,paramsOptions:y.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),h=Object.fromEntries(j.map(f=>[`${l}-${f.paramOptionIds.join("-")}`,f]));u={...u||{},...h},s||(w=[...w,...j.map(f=>`${l}-${f.paramOptionIds.join("-")}`)])}else s||w.push(l)}d.logger.info("routeIds to be published: ",w);for(const l of w){let y=l;if(y.includes("-")){const[f]=y.split("-");y=f}const j=m?.[y];if(!j){const f=e.pageIds.indexOf(y);f!==-1&&n&&(e.pageIds.splice(f,1),delete e.pages[y]);for(const S of e.pageIds)S.includes(`${y}-`)&&(e.pageIds.splice(e.pageIds.indexOf(S),1),delete e.pages[S]);d.logger.info("delete main route page",y);continue}if(l.includes("-")&&!u?.[l]){const f=e.pageIds.indexOf(l);f!==-1&&n&&(e.pageIds.splice(f,1),delete e.pages[l]),d.logger.info("delete page",l);continue}if(!j.displayTemplateId){d.logger.info("no display template",l);continue}const h=i[j.displayTemplateId];if(!h){d.logger.info("no template page",l);continue}if(e.pageIds.includes(l)){if(d.logger.info("has need update page",l),a==="replace")e.pages[l]=ue({page:h,route:j,state:t,routeId:l,routePathInfo:u?.[l]}),d.logger.info("replace page",l);else if(a==="byUpdateTime"){const f=e.pages[j.id];(!f||j.updatedAt&&j.updatedAt>f.updatedAt)&&(e.pages[l]=ue({page:h,route:j,state:t,routeId:l,routePathInfo:u?.[l]}),d.logger.info("replace page by update time",l))}}else e.pageIds.push(l),e.pages[l]=ue({page:h,route:j,state:t,routeId:l,routePathInfo:u?.[l]}),d.logger.info("add page",l)}if(n&&!s)for(const l of e.pageIds)w?.includes(l)||(delete e.pages[l],d.logger.info("delete page",l)),e.pageIds=[...e.pageIds].filter(y=>w?.includes(y))}else{for(const w of c){const u=i[w];if(u)if(e.pageIds.includes(u.id)){if(a==="replace")e.pages[u.id]=u;else if(a==="byUpdateTime"){const l=e.pages[u.id];(!l||u.updatedAt&&u.updatedAt>l.updatedAt)&&(e.pages[u.id]=u)}}else e.pageIds.push(u.id),e.pages[u.id]=u}for(const w of p){const u=m[w];if(u)if(e.routeIds.includes(u.id)){if(a==="replace")e.routes[u.id]=u;else if(a==="byUpdateTime"){const l=e.routes[u.id];(!l||u.updatedAt&&u.updatedAt>l.updatedAt)&&(e.routes[u.id]=u)}}else e.routeIds.push(u.id),e.routes[u.id]=u}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...ft.default(k)),n)for(const w of Object.keys(e.components))delete e.components[w];let T=JSON.parse(JSON.stringify(t.components));T=Object.fromEntries(await Promise.all(Object.entries(T).map(async([w,u])=>{const l=await Fe(u?.data);return[w,{...u,data:l}]}))),Object.assign(e.components,T),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),we.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Fe=d.memoizeWithFs(async t=>{if(!we.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:s}=t?.renderer||{};if(s||e&&e.includes("PROPERTIES_SCHEMA"))try{const a=await d.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,s);a&&a.length>0&&t&&(t.properties={},a.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(a){d.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let se,K,ne,oe;const qe=()=>Ie.getResources({types:[{did:Pe,type:ge},{did:bt,type:ge}]}),Ut=()=>{const t=qe(),e={};return t.forEach(s=>{const a=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const i of o)e[i]=g.join(n,i)}}),e};function xe(){return se=(async()=>{const t=qe();K=(await Promise.all(t.map(async s=>{const a=s.path?await Ce(s.path,{importAssets:!1}):void 0;return a?{blockletId:s.did,state:a,blockletTitle:s.title}:void 0}))).filter(s=>!!s),ne=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.pages).map(n=>n?[n?.id,{page:n,blockletId:a.blockletId}]:[]))),{});const e=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.components).map(n=>[n.data.id,{blockletId:a.blockletId,component:n.data}]))),{});oe=Object.fromEntries(await Promise.all(Object.entries(e).map(async([s,a])=>{const n=await Fe(a.component);return[s,{...a,component:n}]})))})(),se}function Be(t){const e=Re.default(async()=>{await xe().catch(s=>{d.logger.error("load resource states error",{error:s})}),await t?.({states:K,pages:ne,components:oe})},3e3,{leading:!1,trailing:!0});return e(),E.default.events.on(E.default.Events.componentAdded,e),E.default.events.on(E.default.Events.componentRemoved,e),E.default.events.on(E.default.Events.componentStarted,e),E.default.events.on(E.default.Events.componentStopped,e),E.default.events.on(E.default.Events.componentUpdated,e),E.default.events.on(me,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(me,e)}}const Ve=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Ge=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),re=globalThis;re[Ve]?.();re[Ve]=Be(async({pages:t,components:e})=>{const s=await O.getProjectIds();d.logger.info(`start update resource states projects(${s.length})`,s),await Promise.race([new Promise(a=>{setTimeout(()=>{a({})},30*1e3)}),Promise.all(s.map(async a=>{ze({projectId:a,pages:t,components:e})}))]).catch(a=>{d.logger.error("update resource states failed:",a)})});re[Ge]?.();re[Ge]=()=>{const t=()=>{O.pageUrlMapCache.clear(),d.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return E.default.events.on(E.default.Events.envUpdate,t),()=>{E.default.events.off(E.default.Events.envUpdate,t)}};O.startPeriodicCheck();process.on("beforeExit",()=>{O.stopPeriodicCheck()});process.on("SIGINT",()=>{O.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{O.stopPeriodicCheck(),process.exit(0)});async function ze({projectId:t,pages:e,components:s}){const a=O.sharedInstances[t];if(!a){d.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(a.syncedStore.resources.pages=e,(await L.findByPk(t))?.useAllResources)a.syncedStore.resources.components=s;else{const i=(await Ae.findAll({where:{projectId:t}})).map(p=>p.componentId),c=Object.fromEntries(Object.entries(s||{}).filter(([p])=>i.includes(p)));a.syncedStore.resources.components=c}d.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function Mt(){d.logger.info("trigger reload all project resource"),E.default.events.emit(me)}async function Nt({ensureLoaded:t=!0}={}){return t&&(se??=xe(),await se),{states:K,pages:ne,components:oe}}exports.COMPONENT_DID=Pe;exports.PUBLISH_MODES=_t;exports.Project=L;exports.RESOURCE_TYPE=ge;exports.SITE_STATE_PATH=q;exports.STATE_MODES=Lt;exports.SiteState=O;exports.downloadAsset=$e;exports.downloadAssets=Ue;exports.fromPackage=Ce;exports.getDefaultState=_e;exports.getResourceStates=Nt;exports.initPackResourceStates=Be;exports.mergeState=Se;exports.toPackage=Ne;exports.triggerReloadAllProjectResource=Mt;
1
+ "use strict";const d=require("./components-CacZMc0_.js"),F=require("@syncedstore/core"),Je=require("yjs"),Ke=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),He=require("lodash"),We=require("@blocklet/sdk/lib/config"),I=require("fs"),g=require("path"),Te=require("@blocklet/pages-kit/utils/common"),Qe=require("@blocklet/pages-kit/utils/page-model"),Xe=require("@blocklet/pages-kit/utils/property"),Ie=require("@blocklet/sdk/lib/component"),Ze=require("@reactivedata/reactive"),X=require("glob"),et=require("lib0/decoding"),tt=require("lib0/encoding"),st=require("lodash/cloneDeep"),at=require("lodash/debounce"),nt=require("lodash/get"),ot=require("lodash/isEmpty"),rt=require("lodash/set"),it=require("lodash/union"),be=require("lru-cache"),ct=require("p-limit"),C=require("sequelize"),lt=require("stream/promises"),pt=require("tar"),Y=require("ufo"),ut=require("wait-on"),z=require("y-protocols/awareness"),le=require("y-protocols/sync"),dt=require("yaml");require("sqlite3");require("@blocklet/pages-kit/types/state");const M=t=>t&&t.__esModule?t:{default:t};function ae(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const a=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,a.get?a:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const $=ae(Je),E=M(We),pe=ae(et),v=ae(tt),ft=M(st),Re=M(at),Ee=M(nt),we=M(ot),De=M(rt),gt=M(it),mt=M(ct),ht=M(ut),x=ae(dt),yt=C.DataTypes.sqlite.DATE.parse;C.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):yt(t,e);const U=new C.Sequelize({dialect:"sqlite",storage:d.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});U.query("pragma journal_mode = WAL;");U.query("pragma synchronous = normal;");U.query("pragma journal_size_limit = 33554432;");U.query("pragma cache_size = -2000;");U.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await U.close(),process.exit(0)});process.on("SIGTERM",async()=>{await U.close(),process.exit(0)});async function St(t,e){try{if(t.getDialect()!=="sqlite")return;const[s]=await t.query("SELECT 1");if(!s||s.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(s){if(s.name==="SequelizeConnectionError"||s?.message&&/closed!/.test(s.message))return;console.error("Failed to cleanup SQLite memory",e,s)}}let fe=null;fe&&clearInterval(fe);fe=setInterval(async()=>{d.logger.info("Start cleanupSqliteMemory"),await St(U,d.databaseUrl),d.logger.info("End cleanupSqliteMemory")},60*1e3*10);class Ae extends C.Model{}Ae.init({id:{type:C.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:C.DataTypes.UUIDV4},projectId:{type:C.DataTypes.UUID,allowNull:!1},componentId:{type:C.DataTypes.STRING,allowNull:!1}},{sequelize:U,tableName:"ProjectComponents",timestamps:!1});class L extends C.Model{static async getProjectByIdOrSlug(e){return L.findOne({where:{[C.Op.or]:[{id:e},{slug:e}]}})}}L.init({id:{type:C.DataTypes.UUID,defaultValue:C.DataTypes.UUIDV4,primaryKey:!0},name:{type:C.DataTypes.STRING,allowNull:!1},description:C.DataTypes.TEXT,createdAt:C.DataTypes.DATE,updatedAt:C.DataTypes.DATE,createdBy:{type:C.DataTypes.STRING,allowNull:!1},updatedBy:{type:C.DataTypes.STRING,allowNull:!1},slug:C.DataTypes.STRING,icon:C.DataTypes.STRING,pinnedAt:C.DataTypes.DATE,useAllResources:C.DataTypes.BOOLEAN,npmSecret:C.DataTypes.STRING,relatedBlocklets:{type:C.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return d.logger.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){d.logger.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:C.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return d.logger.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){d.logger.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}}},{sequelize:U,paranoid:!0});L.hasMany(Ae,{foreignKey:"projectId",as:"components"});const It="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",ge="page",me="trigger-reload-project-resource",Pe=It,bt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM";function Z(t){t.observeDeep(e=>{e.some(s=>s.changes.keys.has("updatedAt")||s.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Le(){return I.mkdtempSync(g.join(E.default.env.dataDir,"tmp-"))}function ee(t,e,s=[]){return Array.isArray(t)?t.flatMap((a,n)=>ee(a,e,[...s,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([a,n])=>ee(n,e,[...s,a])):e(t)?[s]:[]}function R(t){return t.filter(e=>e!=null)}function Et(t){t.pages&&Object.keys(t.pages).forEach(s=>{const a=F.getYjsValue(t.pages[s]);a&&a instanceof $.Map&&Z(a)});const e=F.getYjsValue(t.pages);e&&e instanceof $.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.pages[n]);o&&o instanceof $.Map&&Z(o)}})})}function wt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=F.getYjsValue(t.routes?.[s]);a&&a instanceof $.Map&&Z(a)});const e=F.getYjsValue(t.routes);e&&e instanceof $.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=F.getYjsValue(t.routes?.[n]);o&&o instanceof $.Map&&Z(o)}})})}function At(t,e){for(const s of e||Object.keys(t.routes||{})){let a=s,n=[];if(s.includes("-")){const[o,...i]=s.split("-");a=o,n=i||[]}if(t.routes?.[a]!==void 0){t.routes[a].publishedAt=new Date().toISOString();const o=t.routes[a];if(!o||!o.params||o.params.length===0)continue;if(s.includes("-")&&n.length>0){const i=Q.getRouteMetaDataByOptionIds(n,o);i&&(i.publishedAt=new Date().toISOString())}if(!e){const i=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const c of i)c.routeMetaData??={},c.routeMetaData.publishedAt=new Date().toISOString()}}}}function ue({page:t,route:e,state:s,routeId:a,routePathInfo:n}){d.logger.info(`Executing datasource data assembly, routeId: ${a}, routePathInfo: ${JSON.stringify(n)}`);const o={...He.cloneDeep(t),id:a,slug:n?.path??e.path,createdAt:e.createdAt,updatedAt:n?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:n?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(n?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const i of s.supportedLocales){if(e.dataSource){let c=e.id;n&&(c=n.paramOptionIds.join("-"));const p=e.dataSource.pathDataMappings?.[c]?.dataCache?.[i.locale]??e.dataSource.pathDataMappings?.[c]?.dataCache?.[s.config.defaultLocale||"en"];if(!p)continue;Ke.setPageDataSource(o,s,i.locale,p)}n&&n.routeMetaData&&(n.routeMetaData.publishedAt=new Date().toISOString())}return o}const Pt=30*60*1e3,B=new be.LRUCache({max:100,ttl:Pt});function Ot(t,e=[]){let s=0;const a=Array.from(B.keys()),n=[];for(const o of t){n.push(`page-html:prod:${o}:lang-path=none`);for(const i of e)n.push(`page-html:prod:/${i}${o}:lang-path=${i}`)}for(const o of a){const i=o.split(":lang-path=")[0]||"";for(const c of n){const m=(c.split(":lang-path=")[0]||"").replace(/\/:[^/]+/g,"");if(i.startsWith(m)){B.delete(o),s++,d.logger.info(`[Cache CLEAR] key: ${o}`);break}}}return d.logger.info(`[Cache CLEAR] cleared ${s} entries for patterns:`,n),s}function Ct({projectId:t,projectSlug:e,supportedLocales:s=[]}){let a=0;const n=Array.from(B.keys()),o=[];o.push(`page-html:prod:/${t}`),e&&e!==t&&o.push(`page-html:prod:/${e}`);for(const i of s)o.push(`page-html:prod:/${i}/${t}`),e&&e!==t&&(e!=="/"?o.push(`page-html:prod:/${i}/${e}`):o.push(`page-html:prod:/${i}`));for(const i of n)for(const c of o)if(i.startsWith(c)){B.delete(i),a++,d.logger.info(`[Cache CLEAR PROJECT] key: ${i}`);break}return d.logger.info(`[Cache CLEAR PROJECT] cleared ${a} entries for project ${t}${e?` (slug: ${e})`:""}`),a}function jt(){const t=B.size;return B.clear(),d.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}E.default.events.on(E.default.Events.envUpdate,jt);const{uploadToMediaKit:Tt}=require("@blocklet/uploader-server"),Oe=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,J=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,ke=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Dt=1e4,kt=3e4,H=0,de=1,vt=0,Rt=1,he=E.default,q=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Lt=["production","draft"],_t=["production"];function te(t){return t?.replace(/\//g,"|")||""}function _e(){const t=he.env.languages?.map(s=>({locale:s.code,name:s.name}))||[],e=t[0]?.locale||"en";return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class O extends $.Doc{constructor(e){super(),this.options=e,I.existsSync(this.draftYjsFilePath)&&$.applyUpdate(this,I.readFileSync(this.draftYjsFilePath)),this.syncedStore=Ze.reactive(F.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new z.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static RELEASE_DELAY=5*60*1e3;static PERIODIC_CHECK_INTERVAL=2*60*60*1e3;static sharedInstances={};static pageUrlMapCache=new be.LRUCache({max:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(q,e),a=g.join(q,`@del-${e}`);I.renameSync(s,a)}catch(s){d.logger.error("Failed to safe delete project state dir:",s)}}static async getProjectIds(){return(await L.findAll({attributes:["id"],raw:!0}))?.map(e=>e.id)}static get projectIds(){return X.globSync("*/",{cwd:q,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>O.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=O.sharedInstances[e];return s||(s=new O({path:g.join(q,e)}),O.sharedInstances[e]=s,ze({projectId:e,pages:ne,components:oe}),s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(we.default(s?.productionState)){const a=g.join(q,e,"production"),n=await Ce(a,{includeResources:!0})??_e();if(!n?.config?.defaultLocale){n.config??={};const o=he.env.languages?.map(i=>({locale:i.code,name:i.name}))||[];n.config.defaultLocale=o[0]?.locale}return n}return s?.productionState}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((s,a)=>this.closeConn(a)),this.awareness.destroy();const e=g.basename(this.options.path);delete O.sharedInstances[e],super.destroy()}initObserver(){Et(this.syncedStore),wt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=O.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return O.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return O.getProductionState(s)}async setState(e,s){const a=await Ne(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(I.mkdirSync(g.dirname(n),{recursive:!0}),I.rmSync(n,{force:!0,recursive:!0}),I.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);O.pageUrlMapCache.delete(o),await L.update({productionState:{...s}},{where:{id:o}})}}getPublishDir(e){return g.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:s,removed:a},n)=>{const o=e.concat(s,a);if(n!==null){const p=this.conns.get(n);p&&(e.forEach(m=>{p.add(m)}),a.forEach(m=>{p.delete(m)}))}const i=v.createEncoder();v.writeVarUint(i,de),v.writeVarUint8Array(i,z.encodeAwarenessUpdate(this.awareness,o));const c=v.toUint8Array(i);this.conns.forEach((p,m)=>this.send(m,c))};updateHandler=e=>{const s=v.createEncoder();v.writeVarUint(s,H),le.writeUpdate(s,e);const a=v.toUint8Array(s);this.conns.forEach((n,o)=>this.send(o,a))};ensureDataStructure=()=>{const{supportedLocales:e,pages:s,pageIds:a,config:n,routes:o,routeIds:i}=this.syncedStore;{const c=new Set(Object.keys(s));let p=0;for(;p<a.length;){const m=a[p];c.has(m)?(c.delete(m),p++):a.splice(p,1)}}{const c=new Set(Object.keys(o));let p=0;for(;p<i.length;){const m=i[p];c.has(m)?(c.delete(m),p++):i.splice(p,1)}}e.splice(0,e.length),e.push(...he.env.languages.map(c=>({locale:c.code,name:c.name}))),n.defaultLocale=e[0]?.locale;{let c=0;const p=new Set;for(;c<e.length;){const{locale:m}=e[c];p.has(m)?e.splice(c,1):(c++,p.add(m))}}};send=(e,s)=>{e.readyState!==vt&&e.readyState!==Rt&&this.closeConn(e);try{e.send(s,a=>{a&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const s=this.conns.get(e);this.conns.delete(e),s&&z.removeAwarenessStates(this.awareness,Array.from(s),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=g.basename(this.options.path);this.releaseTimer=setTimeout(()=>{d.logger.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},O.RELEASE_DELAY),d.logger.info(`[SiteState] scheduled release for project ${e} in ${O.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=g.basename(this.options.path);d.logger.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Re.default(()=>{I.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),I.writeFileSync(this.draftYjsFilePath,$.encodeStateAsUpdate(this))},Dt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=await this.getState("draft"),n=await this.getState("production");await Se(a,n,{routes:s,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),n.config.publishedAt=new Date().getTime(),At(this.syncedStore,s),await this.setState(e,n),await this.clearPageCacheForRoutes(s,n)};mergeState=async(e,s)=>{const a=JSON.parse(JSON.stringify(s));e.config.fontFamily??={};const n=a.config?.fontFamily,o=e.config?.fontFamily;e.config.fontFamily.title=n?.title||o?.title,e.config.fontFamily.description=n?.description||o?.description,await new Promise((i,c)=>{this.transact(async()=>{try{const p=await Se(e,s);i(p)}catch(p){c(p)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;if(d.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,e||[]),!e||e.length===0){Ct({projectId:a,projectSlug:o,supportedLocales:s.supportedLocales.map(m=>m.locale)});return}const i=s.supportedLocales.map(m=>m.locale),c=[],p=e.filter(m=>s.pages[m]);for(const m of p){const T=s.pages[m].slug;o&&o!==a&&(o==="/"?c.push(T):c.push(`/${o}${T}`)),c.push(`/${a}${T}`)}if(d.logger.info(`[SiteState] clearing page cache for project ${a}, pathPatterns:`,c),c.length>0){const m=Ot(c,i);d.logger.info(`[SiteState] cleared ${m} page cache entries for project ${a}, routes:`,e)}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",n=>this.messageListener(e,new Uint8Array(n)));let s=!0;const a=setInterval(()=>{if(!s)this.conns.has(e)&&this.closeConn(e),clearInterval(a);else if(this.conns.has(e)){s=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(a)}}},kt);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{s=!0});{const n=v.createEncoder();v.writeVarUint(n,H),le.writeSyncStep1(n,this),this.send(e,v.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const i=v.createEncoder();v.writeVarUint(i,de),v.writeVarUint8Array(i,z.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,v.toUint8Array(i))}}};messageListener=(e,s)=>{try{const a=v.createEncoder(),n=pe.createDecoder(s),o=pe.readVarUint(n);switch(o){case H:v.writeVarUint(a,H),le.readSyncMessage(n,a,this,null),v.length(a)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(a)));break;case de:{z.applyAwarenessUpdate(this.awareness,pe.readVarUint8Array(n),e);break}default:d.logger.warn(`Unsupported messageType ${o}`)}}catch(a){d.logger.error(a)}this.save()};static async pageUrlMap(e,s){let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(i=>[i,!0])||[]);for(const i of a){const c=O.pageUrlMapCache.get(i);c&&(n={...n,...c},o.delete(i))}a=Array.from(o.keys())}if(a?.length){const o=await L.findAll({where:{id:{[C.Op.in]:a}}});await Promise.all(o?.map(async i=>{const c=i.id,p=i.slug||c,m={},k=e==="production"&&i?.productionState?i.productionState:await O.getStateByProjectId(i.id,e),T=gt.default(E.default.env.languages?.map(u=>u.code)||[],k.supportedLocales?.map(u=>u.locale)||[]),w=(u,l)=>{p&&(m[Y.joinURL("/",p,u)]={...l,shouldRedirect:!0,mainPage:!0}),m[Y.joinURL("/",c,u)]={...l,shouldRedirect:!0,mainPage:!0};for(const y of T){const j={...l,locale:y};m[Y.joinURL("/",y,c,u)]=j,p&&(m[Y.joinURL("/",y,p,u)]=j)}};if(e==="draft")for(const u of k.routeIds||[]){const l=k?.routes?.[u];if(!l)continue;if(l.params&&l.params.length>0){const h=Q.generateParamCombinations({basePath:l.path,params:l.params,routeId:l.id,paramsOptions:l.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const f of h){const S=f.path,A={projectId:c,projectSlug:p,pageSlug:S,pageId:l.displayTemplateId||"",routeId:u,defaultLocale:T?.[0],locales:T,publishedAt:k.config.publishedAt,isPublic:l.isPublic&&f?.routeMetaData?.isPublic};w(S,A)}}const y=l.path,j={projectId:c,projectSlug:p,pageSlug:y,pageId:l.displayTemplateId||"",routeId:u,defaultLocale:T?.[0],locales:T,publishedAt:k.config.publishedAt,isPublic:l.isPublic};w(y,j)}for(const u of k.pageIds){const l=k.pages[u];if(!l||e==="production"&&!l.isPublic)continue;const y=l.slug,j=i.slug||c,h={projectId:c,projectSlug:j,pageSlug:y,pageId:u,defaultLocale:T?.[0],locales:T,publishedAt:k.config.publishedAt,isPublic:l.isPublic,templateConfig:l.templateConfig};w(y,h)}e==="production"&&O.pageUrlMapCache.set(c,m),n={...n,...m}}))}return n}getDocumentSize(){return $.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(O.sharedInstances)){const n=a.getDocumentSize();e.push({projectId:s,sizeInBytes:n,sizeInMB:`${(n/(1024*1024)).toFixed(2)} MB`,activeConnections:a.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),d.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,d.logger.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(O.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(O.sharedInstances))o.conns.size===0?s.push({projectId:n,instance:o}):a.push({projectId:n,connections:o.conns.size});if(d.logger.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${a.length}, without connections: ${s.length}`),s.length>0){d.logger.info(`[SiteState] releasing ${s.length} instances without connections:`,s.map(o=>o.projectId));let n=0;for(const{projectId:o,instance:i}of s)try{d.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),i.destroy(),n++}catch(c){d.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,c)}d.logger.info(`[SiteState] periodic check completed: ${n}/${s.length} instances released successfully`)}else e>0?d.logger.debug("[SiteState] periodic check: all instances have active connections"):d.logger.debug("[SiteState] periodic check: no instances exist")}}async function $t(t,e,s){if(!t||!I.existsSync(t)||!I.lstatSync(t).isFile())return null;let a=s[t];return a||(a=(async()=>{try{return(await Tt({filePath:t,fileName:e}))?.data?.filename}catch(n){return d.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const $e=async(t,e)=>{const s=g.basename(t),a=await Ie.call({name:Pe,path:Y.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=I.createWriteStream(e);await lt.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},Ue=async(t,e)=>{await Promise.all(t.map(async s=>{try{await $e(s,g.join(e,g.basename(s)))}catch(a){d.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function Me(t){return Oe.test(t)?[t]:J.test(t)?(ke.lastIndex=0,Array.from(t.matchAll(ke)).map(s=>s[1]).filter(s=>!!s)):[]}async function W(t,e,s){const{getFilename:a,exportAssets:n}=s,o=g.join(e,a(t));if(I.mkdirSync(g.dirname(o),{recursive:!0}),I.writeFileSync(o,x.stringify(t)),n){const c=ee(t,p=>typeof p=="string"&&(Oe.test(p)||J.test(p))).map(p=>{const m=Ee.default(t,p);return Me(m)}).flat().filter(Boolean);await Ue(c,g.dirname(o))}}const ye=new be.LRUCache({max:100,ttl:1*60*1e3});async function ve(t,e,s){const a=ee(t,c=>typeof c=="string"&&(Oe.test(c)||J.test(c))),n=mt.default(2),o=a.map(c=>n(async()=>{try{const p=Ee.default(t,c),m=Me(p);for(const k of m){const T=g.basename(k),w=s.getFilePath(k,c),u=w?`${w}:${T}`:T,l=ye.get(u);if(l){J.test(p)||De.default(t,c,l);return}const y=await $t(w,T,e);y&&(J.test(p)||De.default(t,c,y),ye.set(u,y))}}catch(p){d.logger.error(`Failed to process upload for path ${c.join(".")}:`,p.message||p.reason)}})),i=await Promise.allSettled(o);s.onFinish?.(i)}async function Ne(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:i="all"}={}){const c=s==="all"?t.pageIds:s,p=Xe.getComponentDependencies({state:t,pageIds:c,componentIds:a==="all"?Object.keys(t.components):a}),m=i==="all"?t.routeIds:i,k=r=>({id:r.id,name:r.name,isTemplateSection:r.isTemplateSection??!1,templateDescription:r.templateDescription,llmConfig:r.llmConfig,component:r.component,config:r.config,visibility:r.visibility,sections:r?.sectionIds?R(r?.sectionIds?.map(b=>{const D=r.sections?.[b];return D&&k(D)})):void 0}),T=(r,b)=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,isPublic:r.isPublic??!0,templateConfig:r.templateConfig,meta:r.locales?.[b]??{},sections:R(r.sectionIds.map(D=>{const N=r.sections[D];return N&&k(N)})),dataSource:Object.fromEntries(Object.entries(r.dataSource||{}).map(([D,N])=>[D,N?.[b]??{}]))}),w=r=>({id:r.id,createdAt:r.createdAt,updatedAt:r.updatedAt,publishedAt:r.publishedAt,path:r.path,handler:r.handler,isPublic:r.isPublic??!0,params:r.params??[],enabledGenerate:r.enabledGenerate??!1,displayTemplateId:r.displayTemplateId,dataSource:r.dataSource}),u=R(m.map(r=>{const b=t.routes[r];return b&&w(b)})),l=R(t.supportedLocales.map(r=>r.locale).flatMap(r=>c.map(b=>{const D=t.pages[b];return D&&{locale:r,slug:D.slug,page:T(D,r)}}))),y=Le(),j=g.join(y,"pages");I.mkdirSync(j,{recursive:!0});const h=g.join(y,"components");I.mkdirSync(h,{recursive:!0});const f=g.join(y,"routes");I.mkdirSync(f,{recursive:!0});for(const{locale:r,slug:b,page:D}of l)await W(D,j,{getFilename:()=>`${te(b)||"index"}.${r}.yml`,exportAssets:e});for(const r of u)await W(r,f,{getFilename:()=>`${te(r.path)||"index"}.yml`,exportAssets:e});for(const r of p){const b=t.components[r]?.data;b&&await W(b,h,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const S=g.join(y,".blocklet/pages/pages.config.yml");I.mkdirSync(g.dirname(S),{recursive:!0});const A={pages:R(c.map(r=>{const b=t.pages[r];return b&&{id:r,slug:b.slug}})),routes:R(m.map(r=>{const b=t.routes[r];return b&&{id:r,path:b.path}})),components:R(p.map(r=>{const b=t.components[r]?.data;return b&&{id:r,name:b.name}})),...o?{resources:{components:R(Object.keys(t.resources?.components||{}).filter(r=>p.includes(r)).map(r=>({id:r,name:t.resources?.components?.[r]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};I.writeFileSync(S,x.stringify(A));const P=g.join(y,"config.source.json");if(n&&I.writeFileSync(P,JSON.stringify(n)),o){const r=g.join(y,"resources"),b=g.join(r,"components");I.mkdirSync(b,{recursive:!0});for(const V of Object.keys(t?.resources?.components??{}).filter(_=>p.includes(_))){const _=t.resources?.components?.[V]?.component;_&&await W(_,b,{getFilename:G=>`${G.name||"unnamed"}.${G.id}.yml`,exportAssets:e})}const D=g.join(y,"chunks");I.mkdirSync(D,{recursive:!0});const N=Ut();for(const V of Object.keys(t?.resources?.components??{}).filter(_=>p.includes(_))){const _=t.resources?.components?.[V]?.component;if(_&&_.renderer?.type==="react-component"){const G=_.renderer?.chunks??[];if(G?.length>0)for(const ie of G){const je=g.join(D,ie),ce=N?.[ie];try{ce&&I.existsSync(ce)&&!I.existsSync(je)&&I.copyFileSync(ce,je)}catch(Ye){d.logger.error(`copy chunk ${ie} error`,Ye.message)}}}}}return y}async function Ce(t,{importAssets:e,includeResources:s}={}){if(!I.existsSync(t))return null;let a,n=!1;try{I.lstatSync(t).isDirectory()?a=t:/\.(tgz|gz|tar)$/.test(t)&&(n=!0,a=Le(),await pt.x({file:t,C:a}));const o=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),i=o&&g.join(g.dirname(o),"../../pages"),c=o&&g.join(g.dirname(o),"../../components"),p=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const m=x.parse(I.readFileSync(o).toString()),k=(h,f,S)=>{let A=g.join(h,`${f}${S?`.${S}`:""}.yml`);return(!I.existsSync(A)||!I.lstatSync(A).isFile())&&(A=g.join(h,f,`index${S?`.${S}`:""}.yml`),!I.existsSync(A)||!I.lstatSync(A))?null:x.parse(I.readFileSync(A).toString())},T=(h,f)=>{try{const S=X.globSync(`*.${f}.yml`,{cwd:h,absolute:!0})[0];return S?x.parse(I.readFileSync(S).toString()):null}catch(S){d.logger.error("parse component error",S)}return null},w=(h,f)=>{let S=g.join(h,`${f}.yml`);return(!I.existsSync(S)||!I.lstatSync(S).isFile())&&(S=g.join(h,f,"index.yml"),!I.existsSync(S)||!I.lstatSync(S))?null:x.parse(I.readFileSync(S).toString())},u=R(m.pages.map(({slug:h})=>{const f=R(m.supportedLocales.map(({locale:P})=>{const r=i?k(i,te(h),P):void 0;if(r)return{locale:P,page:r};const b=i?k(i,h,P):void 0;return b&&{locale:P,page:b}})),S=f[0]?.page;if(!S)return null;const A=S.sections.map(Qe.unzipSection);return{id:S.id||Te.nextId(),createdAt:S.createdAt,updatedAt:S.updatedAt,publishedAt:S.publishedAt,isPublic:S.isPublic??!0,templateConfig:S.templateConfig,slug:h,sections:Object.fromEntries(A.map(P=>[P.id,P])),sectionIds:A.map(P=>P.id),locales:Object.fromEntries(f.map(({locale:P,page:r})=>[P,r.meta])),dataSource:S.dataSource?Object.fromEntries([...new Set(f.flatMap(({page:P})=>Object.keys(P.dataSource??{})))].map(P=>[P,Object.fromEntries(f.map(({locale:r,page:b})=>{const D=b.dataSource?.[P];return[r,D||{}]}))])):Object.fromEntries([...new Set(f.flatMap(({page:P})=>P.sections.map(r=>r.id)))].map(P=>[P,Object.fromEntries(f.map(({locale:r,page:b})=>{const D=b.dataSource?.[P];if(D)return[r,D];const N=b.sections.find(V=>V.id===P);return[r,N?.properties||{}]}))]))}})),l=R(m?.routes?.map(({path:h})=>{const f=p?w(p,te(h)):void 0;return{...f,id:f?.id||Te.nextId(),createdAt:f?.createdAt??new Date().toISOString(),updatedAt:f?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:f?.path??`/${f?.id}`,params:f?.params,handler:f?.handler??"Pages Kit",isPublic:f?.isPublic??!0,enabledGenerate:f?.enabledGenerate??!1,displayTemplateId:f?.displayTemplateId??void 0,dataSource:f?.dataSource??{}}})??[]),y=c?R(m.components?.map(({id:h})=>T(c,h))??[]):[];if(e){const h=(...f)=>{d.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...f)};try{h("wait image-bin api ready"),await ht.default({resources:[`${Ie.getComponentWebEndpoint(d.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:A=>A>=200&&A<=500}),h("image-bin api is ready");const f={},S={};h("start to upload assets"),await Promise.allSettled([ve(y,f,{getFilePath:A=>c&&g.join(c,A),onFinish:A=>{h(`upload ${A.length} component assets`)}}),ve(u,S,{getFilePath:(A,P)=>{const r=Ee.default(u,P.slice(0,1));return i&&g.join(i,g.dirname(r.slug),A)},onFinish:A=>{h(`upload ${A.length} page assets`)}})]),h("upload assets done"),ye.clear(),global.gc&&global.gc()}catch(f){h("Error during asset import:",f)}}const j={};if(s){const h=o&&g.join(g.dirname(o),"../../resources/components"),f=R(m.resources?.components?.map(({id:S})=>T(h,S))??[]);f.length>0&&(j.components=Object.fromEntries(f.map((S,A)=>[S.id,{index:A,component:S}])))}return{supportedLocales:m.supportedLocales,pageIds:u.map(h=>h.id),components:Object.fromEntries(y.map((h,f)=>[h.id,{index:f,data:h}])),pages:Object.fromEntries(u.map(h=>[h.id,h])),config:m.config||{},resources:j,routeIds:l.map(h=>h.id),routes:Object.fromEntries(l.map(h=>[h.id,h])),dataSourceIds:[],dataSources:{}}}finally{n&&a&&I.rmSync(a,{force:!0,recursive:!0})}}async function Se(t,e,{routes:s,mergeMode:a="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&d.clearPreloadComponentsCacheByMode(o)}catch(w){d.logger.error("clear preload page cache error",{error:w})}const{pages:i,pageIds:c,routeIds:p,routes:m,supportedLocales:k}=t;if(o==="production"){let w=s??[],u=null;for(const l of p??[]){const y=m?.[l];if(y?.params&&y?.params.length>0&&y?.paramsOptions&&y?.paramsOptions.length>0){const j=Q.generateParamCombinations({basePath:y.path,params:y.params,routeId:y.id,paramsOptions:y.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),h=Object.fromEntries(j.map(f=>[`${l}-${f.paramOptionIds.join("-")}`,f]));u={...u||{},...h},s||(w=[...w,...j.map(f=>`${l}-${f.paramOptionIds.join("-")}`)])}else s||w.push(l)}d.logger.info("routeIds to be published: ",w);for(const l of w){let y=l;if(y.includes("-")){const[f]=y.split("-");y=f}const j=m?.[y];if(!j){const f=e.pageIds.indexOf(y);f!==-1&&n&&(e.pageIds.splice(f,1),delete e.pages[y]);for(const S of e.pageIds)S.includes(`${y}-`)&&(e.pageIds.splice(e.pageIds.indexOf(S),1),delete e.pages[S]);d.logger.info("delete main route page",y);continue}if(l.includes("-")&&!u?.[l]){const f=e.pageIds.indexOf(l);f!==-1&&n&&(e.pageIds.splice(f,1),delete e.pages[l]),d.logger.info("delete page",l);continue}if(!j.displayTemplateId){d.logger.info("no display template",l);continue}const h=i[j.displayTemplateId];if(!h){d.logger.info("no template page",l);continue}if(e.pageIds.includes(l)){if(d.logger.info("has need update page",l),a==="replace")e.pages[l]=ue({page:h,route:j,state:t,routeId:l,routePathInfo:u?.[l]}),d.logger.info("replace page",l);else if(a==="byUpdateTime"){const f=e.pages[j.id];(!f||j.updatedAt&&j.updatedAt>f.updatedAt)&&(e.pages[l]=ue({page:h,route:j,state:t,routeId:l,routePathInfo:u?.[l]}),d.logger.info("replace page by update time",l))}}else e.pageIds.push(l),e.pages[l]=ue({page:h,route:j,state:t,routeId:l,routePathInfo:u?.[l]}),d.logger.info("add page",l)}if(n&&!s)for(const l of e.pageIds)w?.includes(l)||(delete e.pages[l],d.logger.info("delete page",l)),e.pageIds=[...e.pageIds].filter(y=>w?.includes(y))}else{for(const w of c){const u=i[w];if(u)if(e.pageIds.includes(u.id)){if(a==="replace")e.pages[u.id]=u;else if(a==="byUpdateTime"){const l=e.pages[u.id];(!l||u.updatedAt&&u.updatedAt>l.updatedAt)&&(e.pages[u.id]=u)}}else e.pageIds.push(u.id),e.pages[u.id]=u}for(const w of p){const u=m[w];if(u)if(e.routeIds.includes(u.id)){if(a==="replace")e.routes[u.id]=u;else if(a==="byUpdateTime"){const l=e.routes[u.id];(!l||u.updatedAt&&u.updatedAt>l.updatedAt)&&(e.routes[u.id]=u)}}else e.routeIds.push(u.id),e.routes[u.id]=u}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...ft.default(k)),n)for(const w of Object.keys(e.components))delete e.components[w];let T=JSON.parse(JSON.stringify(t.components));T=Object.fromEntries(await Promise.all(Object.entries(T).map(async([w,u])=>{const l=await Fe(u?.data);return[w,{...u,data:l}]}))),Object.assign(e.components,T),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),we.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const Fe=d.memoizeWithFs(async t=>{if(!we.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:s}=t?.renderer||{};if(s||e&&e.includes("PROPERTIES_SCHEMA"))try{const a=await d.getExportSchemaValueFromCode(e??"","PROPERTIES_SCHEMA",t.id,s);a&&a.length>0&&t&&(t.properties={},a.forEach((n,o)=>{t?.properties&&(t.properties[n.id]={index:o,data:n})}))}catch(a){d.logger.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:a})}}return t},{subdir:"getPropertiesFromCode"});let se,K,ne,oe;const qe=()=>Ie.getResources({types:[{did:Pe,type:ge},{did:bt,type:ge}]}),Ut=()=>{const t=qe(),e={};return t.forEach(s=>{const a=X.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&I.existsSync(n)){const o=I.readdirSync(n);for(const i of o)e[i]=g.join(n,i)}}),e};function xe(){return se=(async()=>{const t=qe();K=(await Promise.all(t.map(async s=>{const a=s.path?await Ce(s.path,{importAssets:!1}):void 0;return a?{blockletId:s.did,state:a,blockletTitle:s.title}:void 0}))).filter(s=>!!s),ne=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.pages).map(n=>n?[n?.id,{page:n,blockletId:a.blockletId}]:[]))),{});const e=K.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.components).map(n=>[n.data.id,{blockletId:a.blockletId,component:n.data}]))),{});oe=Object.fromEntries(await Promise.all(Object.entries(e).map(async([s,a])=>{const n=await Fe(a.component);return[s,{...a,component:n}]})))})(),se}function Be(t){const e=Re.default(async()=>{await xe().catch(s=>{d.logger.error("load resource states error",{error:s})}),await t?.({states:K,pages:ne,components:oe})},3e3,{leading:!1,trailing:!0});return e(),E.default.events.on(E.default.Events.componentAdded,e),E.default.events.on(E.default.Events.componentRemoved,e),E.default.events.on(E.default.Events.componentStarted,e),E.default.events.on(E.default.Events.componentStopped,e),E.default.events.on(E.default.Events.componentUpdated,e),E.default.events.on(me,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(me,e)}}const Ve=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),Ge=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),re=globalThis;re[Ve]?.();re[Ve]=Be(async({pages:t,components:e})=>{const s=await O.getProjectIds();d.logger.info(`start update resource states projects(${s.length})`,s),await Promise.race([new Promise(a=>{setTimeout(()=>{a({})},30*1e3)}),Promise.all(s.map(async a=>{ze({projectId:a,pages:t,components:e})}))]).catch(a=>{d.logger.error("update resource states failed:",a)})});re[Ge]?.();re[Ge]=()=>{const t=()=>{O.pageUrlMapCache.clear(),d.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return E.default.events.on(E.default.Events.envUpdate,t),()=>{E.default.events.off(E.default.Events.envUpdate,t)}};O.startPeriodicCheck();process.on("beforeExit",()=>{O.stopPeriodicCheck()});process.on("SIGINT",()=>{O.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{O.stopPeriodicCheck(),process.exit(0)});async function ze({projectId:t,pages:e,components:s}){const a=O.sharedInstances[t];if(!a){d.logger.info(`projectId: ${t} not found in sharedInstances`);return}if(a.syncedStore.resources.pages=e,(await L.findByPk(t))?.useAllResources)a.syncedStore.resources.components=s;else{const i=(await Ae.findAll({where:{projectId:t}})).map(p=>p.componentId),c=Object.fromEntries(Object.entries(s||{}).filter(([p])=>i.includes(p)));a.syncedStore.resources.components=c}d.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}async function Mt(){d.logger.info("trigger reload all project resource"),E.default.events.emit(me)}async function Nt({ensureLoaded:t=!0}={}){return t&&(se??=xe(),await se),{states:K,pages:ne,components:oe}}exports.COMPONENT_DID=Pe;exports.PUBLISH_MODES=_t;exports.Project=L;exports.RESOURCE_TYPE=ge;exports.SITE_STATE_PATH=q;exports.STATE_MODES=Lt;exports.SiteState=O;exports.downloadAsset=$e;exports.downloadAssets=Ue;exports.fromPackage=Ce;exports.getDefaultState=_e;exports.getResourceStates=Nt;exports.initPackResourceStates=Be;exports.mergeState=Se;exports.toPackage=Ne;exports.triggerReloadAllProjectResource=Mt;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/pages-kit/utils/builtin");require("@blocklet/sdk/lib/config");require("lru-cache");require("node-fetch");require("ufo");require("lodash/isEmpty");const e=require("./chunks/components--WuwSB_H.js");exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=e.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=e.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS;exports.clearPreloadComponentsCache=e.clearPreloadComponentsCache;exports.clearPreloadComponentsCacheByMode=e.clearPreloadComponentsCacheByMode;exports.getComponentFromState=e.getComponentFromState;exports.getComponentFromStateByName=e.getComponentFromStateByName;exports.getExportSchemaValueFromCode=e.getExportSchemaValueFromCode;exports.getPreloadComponent=e.getPreloadComponent;exports.getPreloadComponents=e.getPreloadComponents;exports.getPreloadComponentsCacheKey=e.getPreloadComponentsCacheKey;exports.skipTranspileComponent=e.skipTranspileComponent;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/pages-kit/utils/builtin");require("@blocklet/sdk/lib/config");require("lru-cache");require("node-fetch");require("ufo");require("lodash/isEmpty");const e=require("./chunks/components-CacZMc0_.js");exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=e.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=e.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS;exports.clearPreloadComponentsCache=e.clearPreloadComponentsCache;exports.clearPreloadComponentsCacheByInstanceId=e.clearPreloadComponentsCacheByInstanceId;exports.clearPreloadComponentsCacheByMode=e.clearPreloadComponentsCacheByMode;exports.getComponentFromState=e.getComponentFromState;exports.getComponentFromStateByName=e.getComponentFromStateByName;exports.getExportSchemaValueFromCode=e.getExportSchemaValueFromCode;exports.getPreloadComponent=e.getPreloadComponent;exports.getPreloadComponents=e.getPreloadComponents;exports.getPreloadComponentsCacheKey=e.getPreloadComponentsCacheKey;exports.skipTranspileComponent=e.skipTranspileComponent;
@@ -1,4 +1,4 @@
1
- "use strict";var B=Object.create;var A=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var N=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of L(e))!U.call(t,c)&&c!==n&&A(t,c,{get:()=>e[c],enumerable:!(o=K(e,c))||o.enumerable});return t};var R=(t,e,n)=>(n=t!=null?B(D(t)):{},N(e||!t||!t.__esModule?A(n,"default",{value:t,enumerable:!0}):n,t));const O=require("@arcblock/did-auth-storage-nedb"),x=require("@blocklet/sdk/lib/config"),F=require("@blocklet/sdk/lib/service/auth"),J=require("@blocklet/sdk/lib/wallet"),z=require("@blocklet/sdk/lib/wallet-authenticator"),G=require("@blocklet/sdk/lib/wallet-handler"),I=require("path"),b=require("./chunks/components--WuwSB_H.js"),Y=require("crypto"),Q=require("@arcblock/crawler-middleware"),V=require("@blocklet/pages-kit/types"),X=require("@blocklet/pages-kit/utils/common"),E=require("@blocklet/pages-kit/utils/preload"),Z=require("@blocklet/sdk/lib/component"),ee=require("express"),P=require("fs"),te=require("lodash/get"),ne=require("mustache"),T=require("ufo"),i=t=>t&&t.__esModule?t:{default:t},oe=i(O),a=i(x),ce=i(F),se=i(J),ae=i(z),re=i(G),le=i(I),ie=i(te),ue=i(ne),de=(t={})=>{const e={data:new Map,timers:new Map,set:(n,o,c=t.ttl||36e5)=>{t.max&&e.data.size>=t.max&&e.delete(e.data.keys().next().value),e.timers.has(n)&&clearTimeout(e.timers.get(n)),e.timers.set(n,setTimeout(()=>e.delete(n),c)),e.data.set(n,o)},get:n=>e.data.get(n),has:n=>e.data.has(n),delete:n=>(e.timers.has(n)&&clearTimeout(e.timers.get(n)),e.timers.delete(n),e.data.delete(n)),clear:()=>{e.data.clear();for(const n of e.timers.values())clearTimeout(n);e.timers.clear()}};return e},q=de({max:1,ttl:1e3*30});se.default();const pe=new ae.default;new re.default({authenticator:pe,tokenStorage:new oe.default({dbPath:le.default.join(a.default.env.dataDir,"auth.db")})});const fe=new ce.default,he=async()=>{try{const t=q.get("blockletInfo");if(t)return t;const{blocklet:e}=await fe.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},me=async()=>await import("cheerio"),C={};function ge(t,e){const n=JSON.stringify([t,e]);return Y.createHash("md5").update(n).digest("hex")}async function ye(t,e){{let n=await me();try{const o=n.load(t);return e.forEach(c=>{o(c.selector.cheerio).replaceWith(c.value)}),o.html()}catch{}finally{n=null}}return _e(t,e)}function _e(t,e){let n=t;return e.forEach(o=>{const c=typeof o.selector.pattern=="string"?new RegExp(o.selector.pattern,"gis"):o.selector.pattern;n=n.replace(c,o.value)}),n}async function we(t,e){if(!e||e.length===0)return t;const n=ge(t,e);return C[n]??=ye(t,e).finally(()=>{setTimeout(()=>{delete C[n]},10*1e3)}),C[n]}function Se(t){return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1]||""}const ve=["/assets/"];function be({app:t,viteDevServer:e,state:n}){let o;if(e){const s=P.readFileSync(I.resolve(process.cwd(),"./index.html"),"utf-8");t.use(async(g,S,k)=>{const p=g.originalUrl;o=await e.transformIndexHtml(p,s),k()})}else o=P.readFileSync(I.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const c=ee.Router();c.use((s,g,S)=>{if(s.headers["x-unique-record"]==="dial_http"){b.logger.info("[html] dial http request, return 200 status code"),g.status(200).send("ok");return}S()}),a.default.env.preferences.snapkitEnabled&&a.default.env.preferences.snapkitEndpoint&&a.default.env.SNAP_KIT_ACCESS_KEY&&c.use(Q.createSnapshotMiddleware({endpoint:a.default.env.preferences.snapkitEndpoint,accessKey:a.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:a.default.env.preferences.snapkitCacheSize||100})),c.get("/:path(*)?",async(s,g,S)=>{if(ve.some(r=>s.path?.startsWith(r))){S();return}const k="production";let p,v,y=o;if(s.path.startsWith("/pages")){const r=s.params.lang,_=s.cookies.nf_lang,w=new Set([...a.default.env.languages.map(m=>m.code)]);let h=(r&&w.has(r)?r:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!h||!n.supportedLocales?.find(m=>m.locale===h))&&(h=n.supportedLocales?.[0]?.locale||""),h){const m=[];Object.values(n.pages).forEach(l=>{const H=Object.values(l?.sections??{}).filter(d=>d.component==="custom-component"&&d.config?.componentId).map(d=>({id:d.id,componentId:d.config.componentId,useCache:d.config.useCache,cacheDuration:d.config.cacheDuration,properties:l?.dataSource?.[d.id]?.[h]}));m.push(...H)});const W=new Promise(l=>{setTimeout(()=>{l({})},30*1e3)});try{await Promise.race([W,b.getPreloadComponents({mode:k,req:s,state:n,locale:h,instances:m,module:V.PreloadComponentScriptModule.UMD_FN}).then(l=>{l&&(v=E.injectPreloadComponents(l))})])}catch(l){b.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",l)}}}try{const r=p?.title||a.default.env.appName,_=p?.description||a.default.env.appDescription,w=T.withQuery(T.joinURL(a.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:r,description:_});y=ue.default.render(o,{ogTitle:r,ogDescription:_,ogImage:ke(p?.image)||w,pagesPublishedAt:n?.config.publishedAt||new Date().getTime()})}catch{}const f=n?.config.fontFamily,M=s.query.mode==="draft"||s.url.includes("preview")||s.path?.startsWith("/admin");let u=p?.backgroundColor;if(u&&X.isMuiColorKey(u)){const r=await he();u=ie.default(r,`settings.theme.light.palette.${u}`,u)}const j=x.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
1
+ "use strict";var B=Object.create;var A=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var N=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of L(e))!U.call(t,c)&&c!==n&&A(t,c,{get:()=>e[c],enumerable:!(o=K(e,c))||o.enumerable});return t};var R=(t,e,n)=>(n=t!=null?B(D(t)):{},N(e||!t||!t.__esModule?A(n,"default",{value:t,enumerable:!0}):n,t));const O=require("@arcblock/did-auth-storage-nedb"),x=require("@blocklet/sdk/lib/config"),F=require("@blocklet/sdk/lib/service/auth"),J=require("@blocklet/sdk/lib/wallet"),z=require("@blocklet/sdk/lib/wallet-authenticator"),G=require("@blocklet/sdk/lib/wallet-handler"),I=require("path"),b=require("./chunks/components-CacZMc0_.js"),Y=require("crypto"),Q=require("@arcblock/crawler-middleware"),V=require("@blocklet/pages-kit/types"),X=require("@blocklet/pages-kit/utils/common"),E=require("@blocklet/pages-kit/utils/preload"),Z=require("@blocklet/sdk/lib/component"),ee=require("express"),P=require("fs"),te=require("lodash/get"),ne=require("mustache"),T=require("ufo"),i=t=>t&&t.__esModule?t:{default:t},oe=i(O),a=i(x),ce=i(F),se=i(J),ae=i(z),re=i(G),le=i(I),ie=i(te),ue=i(ne),de=(t={})=>{const e={data:new Map,timers:new Map,set:(n,o,c=t.ttl||36e5)=>{t.max&&e.data.size>=t.max&&e.delete(e.data.keys().next().value),e.timers.has(n)&&clearTimeout(e.timers.get(n)),e.timers.set(n,setTimeout(()=>e.delete(n),c)),e.data.set(n,o)},get:n=>e.data.get(n),has:n=>e.data.has(n),delete:n=>(e.timers.has(n)&&clearTimeout(e.timers.get(n)),e.timers.delete(n),e.data.delete(n)),clear:()=>{e.data.clear();for(const n of e.timers.values())clearTimeout(n);e.timers.clear()}};return e},q=de({max:1,ttl:1e3*30});se.default();const pe=new ae.default;new re.default({authenticator:pe,tokenStorage:new oe.default({dbPath:le.default.join(a.default.env.dataDir,"auth.db")})});const fe=new ce.default,he=async()=>{try{const t=q.get("blockletInfo");if(t)return t;const{blocklet:e}=await fe.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},me=async()=>await import("cheerio"),C={};function ge(t,e){const n=JSON.stringify([t,e]);return Y.createHash("md5").update(n).digest("hex")}async function ye(t,e){{let n=await me();try{const o=n.load(t);return e.forEach(c=>{o(c.selector.cheerio).replaceWith(c.value)}),o.html()}catch{}finally{n=null}}return _e(t,e)}function _e(t,e){let n=t;return e.forEach(o=>{const c=typeof o.selector.pattern=="string"?new RegExp(o.selector.pattern,"gis"):o.selector.pattern;n=n.replace(c,o.value)}),n}async function we(t,e){if(!e||e.length===0)return t;const n=ge(t,e);return C[n]??=ye(t,e).finally(()=>{setTimeout(()=>{delete C[n]},10*1e3)}),C[n]}function Se(t){return t.match(/<body[^>]*>(.*?)<\/body>/s)?.[1]||""}const ve=["/assets/"];function be({app:t,viteDevServer:e,state:n}){let o;if(e){const s=P.readFileSync(I.resolve(process.cwd(),"./index.html"),"utf-8");t.use(async(g,S,k)=>{const p=g.originalUrl;o=await e.transformIndexHtml(p,s),k()})}else o=P.readFileSync(I.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const c=ee.Router();c.use((s,g,S)=>{if(s.headers["x-unique-record"]==="dial_http"){b.logger.info("[html] dial http request, return 200 status code"),g.status(200).send("ok");return}S()}),a.default.env.preferences.snapkitEnabled&&a.default.env.preferences.snapkitEndpoint&&a.default.env.SNAP_KIT_ACCESS_KEY&&c.use(Q.createSnapshotMiddleware({endpoint:a.default.env.preferences.snapkitEndpoint,accessKey:a.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:a.default.env.preferences.snapkitCacheSize||100})),c.get("/:path(*)?",async(s,g,S)=>{if(ve.some(r=>s.path?.startsWith(r))){S();return}const k="production";let p,v,y=o;if(s.path.startsWith("/pages")){const r=s.params.lang,_=s.cookies.nf_lang,w=new Set([...a.default.env.languages.map(m=>m.code)]);let h=(r&&w.has(r)?r:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!h||!n.supportedLocales?.find(m=>m.locale===h))&&(h=n.supportedLocales?.[0]?.locale||""),h){const m=[];Object.values(n.pages).forEach(l=>{const H=Object.values(l?.sections??{}).filter(d=>d.component==="custom-component"&&d.config?.componentId).map(d=>({id:d.id,componentId:d.config.componentId,useCache:d.config.useCache,cacheDuration:d.config.cacheDuration,properties:l?.dataSource?.[d.id]?.[h]}));m.push(...H)});const W=new Promise(l=>{setTimeout(()=>{l({})},30*1e3)});try{await Promise.race([W,b.getPreloadComponents({mode:k,req:s,state:n,locale:h,instances:m,module:V.PreloadComponentScriptModule.UMD_FN}).then(l=>{l&&(v=E.injectPreloadComponents(l))})])}catch(l){b.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",l)}}}try{const r=p?.title||a.default.env.appName,_=p?.description||a.default.env.appDescription,w=T.withQuery(T.joinURL(a.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:r,description:_});y=ue.default.render(o,{ogTitle:r,ogDescription:_,ogImage:ke(p?.image)||w,pagesPublishedAt:n?.config.publishedAt||new Date().getTime()})}catch{}const f=n?.config.fontFamily,M=s.query.mode==="draft"||s.url.includes("preview")||s.path?.startsWith("/admin");let u=p?.backgroundColor;if(u&&X.isMuiColorKey(u)){const r=await he();u=ie.default(r,`settings.theme.light.palette.${u}`,u)}const j=x.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
2
2
  ${u?`<meta name="theme-color" content="${u}" /><style>html,body,#app {background-color: ${u};}</style>`:""}
3
3
  ${f?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${f.title}&display=swap">`:""}
4
4
  ${f?.description&&f?.description!==f?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${f.description}&display=swap">`:""}
@@ -1 +1 @@
1
- "use strict";const g=require("./chunks/components--WuwSB_H.js"),c=require("./chunks/site-state-C4Zpym9P.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),G=require("@blocklet/sdk/lib/middlewares/auth"),K=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(L),f=m(J),C=m(X),Y=m(W),D=m(B),k=m(G),$=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(g.isMultiTenant()){const P=n.createdBy===r,y=g.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!P&&!y)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(a))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){g.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}};function b(e,t){return new Promise((o,s)=>{const n=u.default.createReadStream(e),r=u.default.createWriteStream(t);n.on("error",s),r.on("error",s),r.on("finish",o),n.pipe(r)})}async function N(e,t){await u.default.promises.mkdir(t,{recursive:!0});const o=await u.default.promises.readdir(e,{withFileTypes:!0});for(const s of o){const n=D.default.join(e,s.name),r=D.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>g.isMultiTenant()?k.default()(e,t,o):k.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=K.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=F.Router(),T="@page",U="@component",j=":",R="ALL",q="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===U)return{componentId:s,projectId:o}},Z=e=>[q,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===q)return o},te=e=>{try{return JSON.parse(e)}catch{}return{}};async function A(e){const t=await c.SiteState.getStateByProjectId(e,"production"),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const a=t.pages[r];if(a)return{id:v({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=Y.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:x({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Z(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:x({componentId:R,projectId:e}),name:"Components",children:n}]}}w.get("/resources",h,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await $(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const oe=f.default.object({projectId:f.default.string().required().min(1),releaseId:f.default.string().allow(""),resources:f.default.array().items(f.default.string()).required(),locale:f.default.string().allow("")});w.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:_}=Q(i)||{};if(d)d===R||d&&_&&a.push({pageId:d,projectId:_});else{const{componentId:I,projectId:p}=V(i)||{};I===R||I&&p&&P.push({componentId:I,projectId:p})}}const y=C.default(a,"projectId"),O=C.default(P,"projectId"),M=new Set([...Object.keys(y),...Object.keys(O)]),E=H(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of M){const d=await c.SiteState.getStateByProjectId(i,r),_=y[i],I=O[i],p=_?.map(l=>l.pageId),S=I?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await z(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}g.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});w.get("/all-resources",h,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=w;
1
+ "use strict";const g=require("./chunks/components-CacZMc0_.js"),c=require("./chunks/site-state-BkjuFb4-.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),G=require("@blocklet/sdk/lib/middlewares/auth"),K=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(L),f=m(J),C=m(X),Y=m(W),D=m(B),k=m(G),$=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(g.isMultiTenant()){const P=n.createdBy===r,y=g.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!P&&!y)return t?.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(a))return t?.status(403).json({error:"No permission to access this project in single-tenant mode"});e.project=n,e.projectId=s,o()}catch(s){g.logger.error("Project middleware error:",s),t?.status(400).json({error:"Internal server error"})}};function b(e,t){return new Promise((o,s)=>{const n=u.default.createReadStream(e),r=u.default.createWriteStream(t);n.on("error",s),r.on("error",s),r.on("finish",o),n.pipe(r)})}async function N(e,t){await u.default.promises.mkdir(t,{recursive:!0});const o=await u.default.promises.readdir(e,{withFileTypes:!0});for(const s of o){const n=D.default.join(e,s.name),r=D.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>g.isMultiTenant()?k.default()(e,t,o):k.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=K.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=F.Router(),T="@page",U="@component",j=":",R="ALL",q="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===U)return{componentId:s,projectId:o}},Z=e=>[q,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===q)return o},te=e=>{try{return JSON.parse(e)}catch{}return{}};async function A(e){const t=await c.SiteState.getStateByProjectId(e,"production"),o=await c.Project.findByPk(e),s=t.pageIds.map(r=>{const a=t.pages[r];if(a)return{id:v({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=Y.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:x({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Z(e),name:o?.name||"Unnamed Project",children:[{id:v({pageId:R,projectId:e}),name:"Pages",children:s},{id:x({componentId:R,projectId:e}),name:"Components",children:n}]}}w.get("/resources",h,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await $(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const oe=f.default.object({projectId:f.default.string().required().min(1),releaseId:f.default.string().allow(""),resources:f.default.array().items(f.default.string()).required(),locale:f.default.string().allow("")});w.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:_}=Q(i)||{};if(d)d===R||d&&_&&a.push({pageId:d,projectId:_});else{const{componentId:I,projectId:p}=V(i)||{};I===R||I&&p&&P.push({componentId:I,projectId:p})}}const y=C.default(a,"projectId"),O=C.default(P,"projectId"),M=new Set([...Object.keys(y),...Object.keys(O)]),E=H(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of M){const d=await c.SiteState.getStateByProjectId(i,r),_=y[i],I=O[i],p=_?.map(l=>l.pageId),S=I?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await z(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}g.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});w.get("/all-resources",h,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=w;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components--WuwSB_H.js");const e=require("./chunks/site-state-C4Zpym9P.js"),u=require("@blocklet/pages-kit/utils/common");require("@blocklet/pages-kit/utils/page-model");require("@blocklet/pages-kit/utils/property");require("@blocklet/pages-kit/utils/route");require("@blocklet/sdk/lib/component");require("@blocklet/sdk/lib/config");require("@reactivedata/reactive");require("@syncedstore/core");require("fs");require("glob");require("lib0/decoding");require("lib0/encoding");require("lodash/cloneDeep");require("lodash/debounce");require("lodash/get");require("lodash/isEmpty");require("lodash/set");require("lodash/union");require("lru-cache");require("p-limit");require("path");require("sequelize");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");const t=require("@blocklet/pages-kit/types/state");exports.PUBLISH_MODES=e.PUBLISH_MODES;exports.SITE_STATE_PATH=e.SITE_STATE_PATH;exports.STATE_MODES=e.STATE_MODES;exports.default=e.SiteState;exports.downloadAsset=e.downloadAsset;exports.downloadAssets=e.downloadAssets;exports.fromPackage=e.fromPackage;exports.getDefaultState=e.getDefaultState;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("./chunks/components-CacZMc0_.js");const e=require("./chunks/site-state-BkjuFb4-.js"),u=require("@blocklet/pages-kit/utils/common");require("@blocklet/pages-kit/utils/page-model");require("@blocklet/pages-kit/utils/property");require("@blocklet/pages-kit/utils/route");require("@blocklet/sdk/lib/component");require("@blocklet/sdk/lib/config");require("@reactivedata/reactive");require("@syncedstore/core");require("fs");require("glob");require("lib0/decoding");require("lib0/encoding");require("lodash/cloneDeep");require("lodash/debounce");require("lodash/get");require("lodash/isEmpty");require("lodash/set");require("lodash/union");require("lru-cache");require("p-limit");require("path");require("sequelize");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");const t=require("@blocklet/pages-kit/types/state");exports.PUBLISH_MODES=e.PUBLISH_MODES;exports.SITE_STATE_PATH=e.SITE_STATE_PATH;exports.STATE_MODES=e.STATE_MODES;exports.default=e.SiteState;exports.downloadAsset=e.downloadAsset;exports.downloadAssets=e.downloadAssets;exports.fromPackage=e.fromPackage;exports.getDefaultState=e.getDefaultState;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
@@ -1,19 +1,19 @@
1
- import { getComponentMountPoint as W } from "@blocklet/pages-kit/builtin/utils";
2
- import { PreloadComponentScriptModule as x } from "@blocklet/pages-kit/types";
3
- import { componentUMDName as Q, RenderNestedComponent as j, mergeComponent as z } from "@blocklet/pages-kit/utils/property";
4
- import { memoize as Z, BuiltinModules as A } from "@blocklet/quickjs";
1
+ import { getComponentMountPoint as Q } from "@blocklet/pages-kit/builtin/utils";
2
+ import { PreloadComponentScriptModule as P } from "@blocklet/pages-kit/types";
3
+ import { componentUMDName as z, RenderNestedComponent as j, mergeComponent as Z } from "@blocklet/pages-kit/utils/property";
4
+ import { memoize as X, BuiltinModules as I } from "@blocklet/quickjs";
5
5
  import { BuiltinModules as M } from "@blocklet/pages-kit/utils/builtin";
6
6
  import h from "@blocklet/sdk/lib/config";
7
- import { LRUCache as X } from "lru-cache";
8
- import Y, { Headers as q } from "node-fetch";
9
- import { joinURL as I, getQuery as ee, withQuery as te, parseURL as D, withHttps as oe } from "ufo";
10
- import ne from "lodash/isEmpty";
11
- import { createHash as re } from "crypto";
12
- import { promises as w } from "fs";
13
- import U, { join as O } from "path";
14
- import se from "lodash/isNil";
15
- import ce from "@blocklet/logger";
16
- import { isRelativeModule as ae, createBuiltinModuleTransformer as ie } from "@blocklet/pages-kit/utils/typescript/builtin-module-transformer";
7
+ import { LRUCache as Y } from "lru-cache";
8
+ import q, { Headers as ee } from "node-fetch";
9
+ import { joinURL as A, getQuery as te, withQuery as oe, parseURL as D, withHttps as ne } from "ufo";
10
+ import re from "lodash/isEmpty";
11
+ import { createHash as se } from "crypto";
12
+ import { promises as g } from "fs";
13
+ import U, { join as b } from "path";
14
+ import ce from "lodash/isNil";
15
+ import ae from "@blocklet/logger";
16
+ import { isRelativeModule as ie, createBuiltinModuleTransformer as pe } from "@blocklet/pages-kit/utils/typescript/builtin-module-transformer";
17
17
  import "@blocklet/sdk/lib/component";
18
18
  h.env.mode;
19
19
  h.env.OPENAI_API_KEY || process.env.OPENAI_API_KEY;
@@ -22,32 +22,32 @@ h.env.TRANSLATE_ADDITIONAL_PROMPT || process.env.TRANSLATE_ADDITIONAL_PROMPT;
22
22
  h.env.PAGE_CONTENT_ADDITIONAL_PROMPT || process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;
23
23
  const qe = "image-bin";
24
24
  h.env.INIT_TEMPLATE_PATH;
25
- const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"), L = h, tt = () => h.env.tenantMode === "multiple", ot = () => (se(L.env.preferences.multiTenantAllProjectAccessPassports) ? [] : L.env.preferences.multiTenantAllProjectAccessPassports?.split(",")) || [], pe = U.join(h.env.dataDir, "fs-memoize-cache"), le = h.env.FS_MEMOIZE_CACHE_VERSION || "v1.0.0", g = ce("pages-kit"), ue = pe, de = le, _ = 30 * 24 * 60 * 60 * 1e3, me = 24 * 60 * 60 * 1e3, B = async (e = "") => {
26
- const t = O(ue, e);
25
+ const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"), L = h, tt = () => h.env.tenantMode === "multiple", ot = () => (ce(L.env.preferences.multiTenantAllProjectAccessPassports) ? [] : L.env.preferences.multiTenantAllProjectAccessPassports?.split(",")) || [], le = U.join(h.env.dataDir, "fs-memoize-cache"), ue = h.env.FS_MEMOIZE_CACHE_VERSION || "v1.0.0", w = ae("pages-kit"), de = le, me = ue, _ = 30 * 24 * 60 * 60 * 1e3, fe = 24 * 60 * 60 * 1e3, B = async (e = "") => {
26
+ const t = b(de, e);
27
27
  try {
28
- if (!(await w.stat(t)).isDirectory())
28
+ if (!(await g.stat(t)).isDirectory())
29
29
  throw new Error(`${t} is not a directory`);
30
30
  } catch {
31
- await w.mkdir(t, { recursive: !0 });
31
+ await g.mkdir(t, { recursive: !0 });
32
32
  }
33
33
  return t;
34
- }, $ = (e, ...t) => e.keyGenerator ? e.keyGenerator(...t) : JSON.stringify([e.subdir || "", ...t]), fe = (e, t) => {
35
- const o = re("md5").update(t).digest("hex");
36
- return O(e, `${de}-${o}.json`);
37
- }, he = async (e = "") => {
34
+ }, $ = (e, ...t) => e.keyGenerator ? e.keyGenerator(...t) : JSON.stringify([e.subdir || "", ...t]), he = (e, t) => {
35
+ const o = se("md5").update(t).digest("hex");
36
+ return b(e, `${me}-${o}.json`);
37
+ }, we = async (e = "") => {
38
38
  const t = await B(e), o = Date.now();
39
39
  try {
40
- const n = await w.readdir(t);
40
+ const n = await g.readdir(t);
41
41
  await Promise.all(
42
42
  n.filter((c) => c.endsWith(".json")).map(async (c) => {
43
- const r = O(t, c);
43
+ const r = b(t, c);
44
44
  try {
45
- const u = await w.readFile(r, "utf-8"), i = JSON.parse(u);
46
- i.createdAt && o - i.createdAt > _ && await w.unlink(r);
45
+ const u = await g.readFile(r, "utf-8"), p = JSON.parse(u);
46
+ p.createdAt && o - p.createdAt > _ && await g.unlink(r);
47
47
  } catch {
48
48
  try {
49
- const i = await w.stat(r);
50
- o - i.mtimeMs > _ && await w.unlink(r);
49
+ const p = await g.stat(r);
50
+ o - p.mtimeMs > _ && await g.unlink(r);
51
51
  } catch {
52
52
  }
53
53
  }
@@ -56,28 +56,28 @@ const et = process.env.DATABASE_URL || U.join(h.env.dataDir, "db/pages-kit.db"),
56
56
  } catch (n) {
57
57
  console.error(`Failed to cleanup cache in ${t}:`, n);
58
58
  }
59
- }, we = (() => {
59
+ }, ge = (() => {
60
60
  const e = /* @__PURE__ */ new Set();
61
61
  return setInterval(async () => {
62
- await Promise.all(Array.from(e).map((n) => he(n)));
63
- }, me).unref(), (n) => {
62
+ await Promise.all(Array.from(e).map((n) => we(n)));
63
+ }, fe).unref(), (n) => {
64
64
  e.add(n);
65
65
  };
66
66
  })();
67
- function b(e, t) {
68
- return t.subdir && we(t.subdir), Z(
67
+ function O(e, t) {
68
+ return t.subdir && ge(t.subdir), X(
69
69
  async (...n) => {
70
- const c = await B(t.subdir || ""), r = $(t, ...n), u = fe(c, r);
70
+ const c = await B(t.subdir || ""), r = $(t, ...n), u = he(c, r);
71
71
  try {
72
- const i = await w.readFile(u, "utf-8"), { value: d, createdAt: l } = JSON.parse(i);
72
+ const p = await g.readFile(u, "utf-8"), { value: d, createdAt: l } = JSON.parse(p);
73
73
  if (l && Date.now() - l > _)
74
- throw await w.unlink(u).catch(() => {
74
+ throw await g.unlink(u).catch(() => {
75
75
  }), new Error("Cache expired");
76
76
  return d;
77
77
  } catch {
78
78
  const d = await e(...n), l = JSON.stringify({ value: d, createdAt: Date.now() });
79
- return w.writeFile(u, l, "utf-8").catch((f) => {
80
- console.error("Failed to write fs cache:", f);
79
+ return g.writeFile(u, l, "utf-8").catch((m) => {
80
+ console.error("Failed to write fs cache:", m);
81
81
  }), d;
82
82
  }
83
83
  },
@@ -90,10 +90,10 @@ function b(e, t) {
90
90
  }
91
91
  );
92
92
  }
93
- const H = async () => await import("typescript"), ge = async () => await import("esbuild"), Ee = async () => (await import("postcss")).default, ye = async () => (await import("tailwindcss")).default, Se = async () => (await import("autoprefixer")).default, xe = !1, Ce = async (e, { componentId: t }) => {
93
+ const H = async () => await import("typescript"), ye = async () => await import("esbuild"), Ee = async () => (await import("postcss")).default, Se = async () => (await import("tailwindcss")).default, xe = async () => (await import("autoprefixer")).default, Ce = !1, Pe = async (e, { componentId: t }) => {
94
94
  const o = `@tailwind components;
95
95
  @tailwind utilities;
96
- `, n = `.CustomComponent_${t}`, c = await Ee(), r = await ye(), u = await Se();
96
+ `, n = `.CustomComponent_${t}`, c = await Ee(), r = await Se(), u = await xe();
97
97
  return (await c([
98
98
  r({ content: [{ raw: e, extension: "tsx" }] }),
99
99
  u({
@@ -102,19 +102,19 @@ const H = async () => await import("typescript"), ge = async () => await import(
102
102
  }),
103
103
  (d) => {
104
104
  d.walkRules((l) => {
105
- l.selectors = l.selectors.map((f) => f.replace(/\.(.+)/g, `${n}.$1,${n} .$1`));
105
+ l.selectors = l.selectors.map((m) => m.replace(/\.(.+)/g, `${n}.$1,${n} .$1`));
106
106
  });
107
107
  }
108
108
  // FIXME: cssnano use browserslist, it is not working with the fs isolation
109
109
  // cssnano({ preset: 'default' }),
110
110
  ]).process(o)).css;
111
- }, Pe = async (e, { componentId: t }) => {
112
- const o = await Ce(e, { componentId: t });
111
+ }, Te = async (e, { componentId: t }) => {
112
+ const o = await Pe(e, { componentId: t });
113
113
  return `export const __PagesKit_CSS__ = ${JSON.stringify(o)};
114
114
 
115
115
  ${e}
116
116
  `;
117
- }, k = b(
117
+ }, k = O(
118
118
  async (e, t) => {
119
119
  let o = await H();
120
120
  try {
@@ -125,10 +125,10 @@ ${e}
125
125
  module: o.ModuleKind.ESNext
126
126
  },
127
127
  transformers: {
128
- before: [ie(o)]
128
+ before: [pe(o)]
129
129
  }
130
130
  }).outputText;
131
- if (t.tailwind && (n = await Pe(n, { componentId: t.componentId })), t.module === x.ESM) return n;
131
+ if (t.tailwind && (n = await Te(n, { componentId: t.componentId })), t.module === P.ESM) return n;
132
132
  const c = o.transpileModule(n, {
133
133
  compilerOptions: {
134
134
  jsx: o.JsxEmit.React,
@@ -137,7 +137,7 @@ ${e}
137
137
  moduleResolution: o.ModuleResolutionKind.Node16
138
138
  }
139
139
  }).outputText;
140
- return t.module === x.CJS ? c : J(t.moduleName, c);
140
+ return t.module === P.CJS ? c : J(t.moduleName, c);
141
141
  } catch (n) {
142
142
  throw new Error(n);
143
143
  } finally {
@@ -147,8 +147,8 @@ ${e}
147
147
  {
148
148
  subdir: "transpileModule"
149
149
  }
150
- ), Te = async (e, t) => {
151
- let { build: o } = await ge(), n = null;
150
+ ), _e = async (e, t) => {
151
+ let { build: o } = await ye(), n = null;
152
152
  try {
153
153
  const r = (await o({
154
154
  entryPoints: ["index.tsx"],
@@ -166,8 +166,8 @@ ${e}
166
166
  return { contents: `export { ${t} } from './component'`, loader: "tsx" };
167
167
  if (l.path === "component.tsx")
168
168
  return { contents: e, loader: "tsx" };
169
- if (ae(l.path)) {
170
- const f = l.path.split("/").pop();
169
+ if (ie(l.path)) {
170
+ const m = l.path.split("/").pop();
171
171
  }
172
172
  return null;
173
173
  });
@@ -185,13 +185,13 @@ ${e}
185
185
  } finally {
186
186
  o = null, n = null;
187
187
  }
188
- }, _e = (e, t) => new RegExp(
188
+ }, ve = (e, t) => new RegExp(
189
189
  `export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,
190
190
  "m"
191
- ).test(e) ? e : void 0, K = b(
191
+ ).test(e) ? e : void 0, K = O(
192
192
  async (e, t) => {
193
- const o = await Te(e, t);
194
- return _e(o, t);
193
+ const o = await _e(e, t);
194
+ return ve(o, t);
195
195
  },
196
196
  {
197
197
  subdir: "extractExportValueSchema"
@@ -226,20 +226,24 @@ var ${e} = async function () {
226
226
  const { Sandbox: e } = await import("@blocklet/quickjs");
227
227
  return e;
228
228
  };
229
- function ve(e) {
229
+ function Ie(e) {
230
230
  return e?.type === "react-component";
231
231
  }
232
- const C = new X({
232
+ const x = new Y({
233
233
  max: 100,
234
234
  ttl: 1e3 * 60 * 60 * 24
235
235
  // 24 hours
236
236
  }), Ae = 60 * 60, F = 10;
237
- function Ie(e) {
238
- g.info("clear preload components cache", { cacheKey: e }), C.delete(e);
237
+ function V(e) {
238
+ w.info("clear preload components cache", { cacheKey: e }), x.delete(e);
239
239
  }
240
240
  function nt(e) {
241
- for (const t of C.keys())
242
- t.includes(e) && (g.info("clear preload components cache", { cacheKey: t }), Ie(t));
241
+ for (const t of x.keys())
242
+ t.includes(e) && (w.info("clear preload components cache", { cacheKey: t }), V(t));
243
+ }
244
+ function rt(e) {
245
+ for (const t of x.keys())
246
+ t.includes(e) && (w.info("clear preload components cache", { cacheKey: t }), V(t));
243
247
  }
244
248
  function Me({
245
249
  mode: e,
@@ -249,7 +253,7 @@ function Me({
249
253
  }) {
250
254
  return ["getPreloadComponents", e, t, o, n].join("-");
251
255
  }
252
- async function rt({
256
+ async function st({
253
257
  mode: e,
254
258
  req: t,
255
259
  state: o,
@@ -259,97 +263,97 @@ async function rt({
259
263
  }) {
260
264
  const {
261
265
  supportedLocales: u,
262
- config: { defaultLocale: i }
266
+ config: { defaultLocale: p }
263
267
  } = o;
264
- if (!i) return null;
268
+ if (!p) return null;
265
269
  const d = (await Promise.all(
266
- c.map(async (a) => {
270
+ c.map(async (s) => {
267
271
  try {
268
- const s = Me({
272
+ const a = Me({
269
273
  mode: e,
270
- instanceId: a.id,
271
- componentId: a.componentId,
274
+ instanceId: s.id,
275
+ componentId: s.componentId,
272
276
  locale: n
273
277
  });
274
- if (e !== "draft" && a.useCache && C.has(s))
275
- return g.info(`get preload component from cache: ${s}`), C.get(s);
276
- const E = v({ state: o, componentId: a.componentId });
277
- if (!E) return null;
278
- const P = await Oe({
278
+ if (e !== "draft" && s.useCache && x.has(a))
279
+ return w.info(`get preload component from cache: ${a}`), x.get(a);
280
+ const f = v({ state: o, componentId: s.componentId });
281
+ if (!f) return null;
282
+ const S = await be({
279
283
  req: t,
280
284
  state: o,
281
- componentId: E.id,
285
+ componentId: f.id,
282
286
  locale: n,
283
- defaultLocale: i,
284
- properties: a.properties
287
+ defaultLocale: p,
288
+ properties: s.properties
285
289
  });
286
- if (!P) return null;
287
- const S = { instanceId: a.id, preload: P };
288
- if (e !== "draft" && a.useCache) {
289
- let y = Ae;
290
- a.cacheDuration && (y = a.cacheDuration), g.info(`set preload component to cache(${y}s): ${s}`), C.set(s, S, {
291
- ttl: y * 1e3
290
+ if (!S) return null;
291
+ const C = { instanceId: s.id, preload: S };
292
+ if (e !== "draft" && s.useCache) {
293
+ let E = Ae;
294
+ s.cacheDuration && (E = s.cacheDuration), w.info(`set preload component to cache(${E}s): ${a}`), x.set(a, C, {
295
+ ttl: E * 1e3
292
296
  });
293
297
  }
294
- return S;
295
- } catch (s) {
296
- return g.error("get preload component error", { instanceId: a.id, componentId: a.componentId }, { error: s }), null;
298
+ return C;
299
+ } catch (a) {
300
+ return w.error("get preload component error", { instanceId: s.id, componentId: s.componentId }, { error: a }), null;
297
301
  }
298
302
  })
299
- )).filter((a) => !!a), l = Object.values(
300
- d.reduce((a, s) => ({ ...a, ...s.preload.components }), {})
303
+ )).filter((s) => !!s), l = Object.values(
304
+ d.reduce((s, a) => ({ ...s, ...a.preload.components }), {})
301
305
  );
302
- async function f() {
303
- const a = await Promise.all(
304
- l.map(async (s) => {
305
- const E = r === x.ESM, P = r === x.UMD_FN, S = r === x.CJS, y = E ? "" : Q({ componentId: s.component.id }), N = je(s.component);
306
+ async function m() {
307
+ const s = await Promise.all(
308
+ l.map(async (a) => {
309
+ const f = r === P.ESM, S = r === P.UMD_FN, C = r === P.CJS, E = f ? "" : z({ componentId: a.component.id }), N = je(a.component);
306
310
  let T = {
307
311
  module: r,
308
312
  script: "",
309
- moduleName: y
313
+ moduleName: E
310
314
  };
311
- if (N && s.component.renderer?.type === "react-component" && E && s.component.renderer?.script)
312
- T.script = s.component.renderer?.script;
313
- else if (N && s.component.renderer?.type === "react-component" && (S || P) && s.component.renderer?.cjsScript) {
314
- const R = s.component.renderer.cjsScript;
315
- T.script = S ? R : J(y, R);
315
+ if (N && a.component.renderer?.type === "react-component" && f && a.component.renderer?.script)
316
+ T.script = a.component.renderer?.script;
317
+ else if (N && a.component.renderer?.type === "react-component" && (C || S) && a.component.renderer?.cjsScript) {
318
+ const R = a.component.renderer.cjsScript;
319
+ T.script = C ? R : J(E, R);
316
320
  } else
317
- T = E ? {
321
+ T = f ? {
318
322
  // ESM
319
323
  module: r,
320
- script: await k(s.script, {
321
- componentId: s.component.id,
324
+ script: await k(a.script, {
325
+ componentId: a.component.id,
322
326
  module: r,
323
327
  tailwind: e !== "draft"
324
328
  })
325
329
  } : {
326
330
  // CJS OR UMD
327
331
  module: r,
328
- script: await k(s.script, {
329
- componentId: s.component.id,
332
+ script: await k(a.script, {
333
+ componentId: a.component.id,
330
334
  module: r,
331
- moduleName: y,
335
+ moduleName: E,
332
336
  tailwind: e !== "draft"
333
337
  }),
334
- moduleName: y
338
+ moduleName: E
335
339
  };
336
- return [s.component.id, { component: s.component, script: T }];
340
+ return [a.component.id, { component: a.component, script: T }];
337
341
  })
338
342
  );
339
- return Object.fromEntries(a);
343
+ return Object.fromEntries(s);
340
344
  }
341
- const p = await f();
345
+ const y = await m();
342
346
  return {
343
- config: { defaultLocale: i, supportedLocales: u },
344
- components: p,
345
- instances: d.map((a) => ({
346
- id: a.instanceId,
347
- componentId: a.preload.component.id,
348
- locales: { [a.preload.locale]: { props: a.preload.props } }
347
+ config: { defaultLocale: p, supportedLocales: u },
348
+ components: y,
349
+ instances: d.map((s) => ({
350
+ id: s.instanceId,
351
+ componentId: s.preload.component.id,
352
+ locales: { [s.preload.locale]: { props: s.preload.props } }
349
353
  }))
350
354
  };
351
355
  }
352
- async function Oe({
356
+ async function be({
353
357
  req: e,
354
358
  state: t,
355
359
  componentId: o,
@@ -357,18 +361,18 @@ async function Oe({
357
361
  defaultLocale: c,
358
362
  properties: r
359
363
  }) {
360
- const { supportedLocales: u } = t, i = v({ state: t, componentId: o });
361
- if (!i) return null;
362
- const d = u.some((f) => f.locale === n) ? n : c;
364
+ const { supportedLocales: u } = t, p = v({ state: t, componentId: o });
365
+ if (!p) return null;
366
+ const d = u.some((m) => m.locale === n) ? n : c;
363
367
  if (!d) return null;
364
- const l = await V({ req: e, state: t, componentId: o, locale: d, defaultLocale: c, properties: r });
368
+ const l = await W({ req: e, state: t, componentId: o, locale: d, defaultLocale: c, properties: r });
365
369
  return l ? {
366
- component: i,
370
+ component: p,
367
371
  ...l
368
372
  } : null;
369
373
  }
370
- const be = 20;
371
- async function V({
374
+ const Oe = 20;
375
+ async function W({
372
376
  req: e,
373
377
  depth: t = 0,
374
378
  state: o,
@@ -377,42 +381,42 @@ async function V({
377
381
  defaultLocale: r,
378
382
  properties: u
379
383
  }) {
380
- if (t > be) throw new RangeError("max component depth exceeded");
381
- const i = Ne({ state: o, componentId: n, properties: u, locale: c });
382
- if (!i) return null;
383
- const { props: d, component: l } = i, f = {
384
+ if (t > Oe) throw new RangeError("max component depth exceeded");
385
+ const p = Ne({ state: o, componentId: n, properties: u, locale: c });
386
+ if (!p) return null;
387
+ const { props: d, component: l } = p, m = {
384
388
  locale: c || r,
385
- components: { [i.component.id]: { component: i.component, script: i.script } },
389
+ components: { [p.component.id]: { component: p.component, script: p.script } },
386
390
  props: { ...d }
387
391
  };
388
392
  try {
389
- const p = ve(l.renderer) ? l.renderer.getServerSideProps : void 0, m = await Re({ ...i, req: e, getServerSideProps: p });
390
- m?.props && Object.assign(f.props, m.props);
391
- } catch (p) {
392
- g.error("preload data at server side error", { componentId: n, name: i.component.name }, { error: p });
393
+ const y = Ie(l.renderer) ? l.renderer.getServerSideProps : void 0, i = await Re({ ...p, req: e, getServerSideProps: y });
394
+ i?.props && Object.assign(m.props, i.props);
395
+ } catch (y) {
396
+ w.error("preload data at server side error", { componentId: n, name: p.component.name }, { error: y });
393
397
  }
394
398
  return await Promise.all(
395
- Object.entries(d).map(async ([p, m]) => {
396
- if (m?.type === j) {
397
- const a = await V({
399
+ Object.entries(d).map(async ([y, i]) => {
400
+ if (i?.type === j) {
401
+ const s = await W({
398
402
  req: e,
399
403
  depth: t + 1,
400
404
  state: o,
401
- componentId: m.componentId,
405
+ componentId: i.componentId,
402
406
  locale: c,
403
407
  defaultLocale: r,
404
- properties: m.properties
408
+ properties: i.properties
405
409
  });
406
- a && (Object.assign(f.components, a.components), Object.assign(f.props, {
407
- [p]: {
410
+ s && (Object.assign(m.components, s.components), Object.assign(m.props, {
411
+ [y]: {
408
412
  type: j,
409
- componentId: m.componentId,
410
- props: a.props
413
+ componentId: i.componentId,
414
+ props: s.props
411
415
  }
412
416
  }));
413
417
  }
414
418
  })
415
- ), f;
419
+ ), m;
416
420
  }
417
421
  function Ne({
418
422
  state: e,
@@ -422,7 +426,7 @@ function Ne({
422
426
  }) {
423
427
  const c = v({ state: e, componentId: t });
424
428
  if (!c) return null;
425
- const r = z({
429
+ const r = Z({
426
430
  componentId: t,
427
431
  getComponent: (u) => v({ state: e, componentId: u }),
428
432
  locale: o,
@@ -434,7 +438,7 @@ function Ne({
434
438
  function v({ state: e, componentId: t }) {
435
439
  return e.components[t]?.data ?? e.resources.components?.[t]?.component;
436
440
  }
437
- function st({ state: e, name: t }) {
441
+ function ct({ state: e, name: t }) {
438
442
  const o = t.toLowerCase();
439
443
  return Object.values(e.components).find((n) => n.data.name?.toLowerCase() === o)?.data ?? (e.resources.components && Object.values(e.resources.components).find((n) => n.component.name?.toLowerCase() === o))?.component;
440
444
  }
@@ -449,12 +453,15 @@ async function Re({
449
453
  return null;
450
454
  const r = c ?? await K(t, "getServerSideProps");
451
455
  if (!r) return null;
452
- const i = (r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/) || r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1] || "getServerSideProps", d = new Promise((p) => {
456
+ const p = (r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/) || r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1] || "getServerSideProps", d = new Promise((i) => {
453
457
  setTimeout(() => {
454
- p({});
458
+ i({});
455
459
  }, F * 1e3);
456
460
  });
457
461
  let l = await G();
462
+ const m = {
463
+ componentMountPoints: h.components
464
+ };
458
465
  return await Promise.race([
459
466
  d,
460
467
  l.callFunction({
@@ -469,7 +476,7 @@ const originalFetch = globalThis.fetch;
469
476
  try {
470
477
  globalThis.location = location;
471
478
  globalThis.fetch = fetch;
472
- return await ${i}(componentProps);
479
+ return await ${p}(componentProps);
473
480
  } finally {
474
481
  // 清理全局状态
475
482
  if (originalLocation) globalThis.location = originalLocation;
@@ -477,63 +484,67 @@ try {
477
484
  }
478
485
  }`,
479
486
  filename: `${e.name || e.id}.js`,
480
- moduleLoader: (p) => {
481
- if (p === "@blocklet/pages-kit/builtin/utils")
487
+ moduleLoader: (i) => {
488
+ if (i === "@blocklet/pages-kit/builtin/utils")
482
489
  return ` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
483
490
  export { joinURL, withQuery, getQuery, getComponentMountPoint }
484
491
  `;
485
- if (p === "@blocklet/pages-kit/builtin/dayjs")
486
- return A.dayjs;
487
- if (p in A)
488
- return A[p];
489
- if (p in M) {
490
- const m = M[p];
491
- return ne(m) ? void 0 : m;
492
+ if (i === "@blocklet/pages-kit/builtin/dayjs")
493
+ return I.dayjs;
494
+ if (i in I)
495
+ return I[i];
496
+ if (i in M) {
497
+ const s = M[i];
498
+ return re(s) ? void 0 : s;
492
499
  }
493
500
  },
494
501
  global: {
495
502
  console: {
496
503
  // NOTE: do not return logger.xxx result, it will cause memory leak
497
504
  // eslint-disable-next-line prettier/prettier
498
- log: (...p) => {
499
- g.info(...p);
505
+ log: (...i) => {
506
+ w.info(...i);
500
507
  },
501
- warn: (...p) => {
502
- g.warn(...p);
508
+ warn: (...i) => {
509
+ w.warn(...i);
503
510
  },
504
- error: (...p) => {
505
- g.error(...p);
511
+ error: (...i) => {
512
+ w.error(...i);
506
513
  }
507
514
  },
508
- getComponentMountPoint: W,
509
- joinURL: I,
510
- withQuery: te,
511
- getQuery: ee
515
+ getComponentMountPoint: Q,
516
+ joinURL: A,
517
+ withQuery: oe,
518
+ getQuery: te,
519
+ window: {
520
+ blocklet: m
521
+ },
522
+ blocklet: m
512
523
  },
513
524
  functionName: "getServerSidePropsWrapper",
514
525
  args: [
515
526
  {
516
527
  // NOTE: IMPORTANT! place location and fetch (has side effect) at the args not global
517
528
  // because the global is shared between all runtime and just init once
518
- location: { href: I(oe(n.hostname), n.originalUrl) },
519
- fetch: (p, { ...m } = {}) => {
520
- const a = typeof p == "string" && p.startsWith("/") ? I(h.env.appUrl, p) : p;
529
+ location: { href: A(ne(n.hostname), n.originalUrl) },
530
+ fetch: (i, { ...s } = {}) => {
531
+ const a = typeof i == "string" && i.startsWith("/") ? A(h.env.appUrl, i) : i;
521
532
  if (typeof a == "string" && D(a).host === D(h.env.appUrl).host) {
522
- const s = n.get("cookie");
523
- if (s) {
524
- const E = new q(m.headers);
525
- E.set("cookie", s), m.headers = E;
533
+ const f = n.get("cookie");
534
+ if (f) {
535
+ const S = new ee(s.headers);
536
+ S.set("cookie", f), s.headers = S;
526
537
  }
527
538
  }
528
- return Y(a, {
529
- ...m,
539
+ return q(a, {
540
+ ...s,
530
541
  timeout: F * 1e3
531
- }).then((s) => ({
532
- ok: s.ok,
533
- status: s.status,
534
- statusText: s.statusText,
535
- headers: Object.fromEntries(s.headers.entries()),
536
- json: () => s.json()
542
+ }).then((f) => ({
543
+ ok: f.ok,
544
+ status: f.status,
545
+ statusText: f.statusText,
546
+ headers: Object.fromEntries(f.headers.entries()),
547
+ json: () => f.json()
537
548
  }));
538
549
  },
539
550
  props: o
@@ -544,7 +555,7 @@ try {
544
555
  })
545
556
  ]);
546
557
  }
547
- const ct = b(
558
+ const at = O(
548
559
  async (e, t, o, n) => {
549
560
  if (!e?.includes(t) && !n)
550
561
  return null;
@@ -567,7 +578,7 @@ const ct = b(
567
578
  r = null;
568
579
  });
569
580
  } catch (r) {
570
- return g.error(`获取 ${t} 失败`, { componentId: o, error: r }), null;
581
+ return w.error(`获取 ${t} 失败`, { componentId: o, error: r }), null;
571
582
  }
572
583
  return null;
573
584
  },
@@ -580,17 +591,18 @@ export {
580
591
  F as G,
581
592
  qe as I,
582
593
  ot as a,
583
- ct as b,
594
+ at as b,
584
595
  nt as c,
585
596
  et as d,
586
- Ie as e,
587
- Me as f,
588
- rt as g,
589
- Oe as h,
597
+ V as e,
598
+ rt as f,
599
+ st as g,
600
+ Me as h,
590
601
  tt as i,
591
- v as j,
592
- st as k,
593
- g as l,
594
- b as m,
602
+ be as j,
603
+ v as k,
604
+ w as l,
605
+ O as m,
606
+ ct as n,
595
607
  je as s
596
608
  };
@@ -1,4 +1,4 @@
1
- import { d as Le, l as f, I as Ye, c as We, m as Qe, b as Xe } from "./components-B8AH-ivu.js";
1
+ import { d as Le, l as f, I as Ye, c as We, m as Qe, b as Xe } from "./components-BWQM8y6L.js";
2
2
  import { getYjsValue as V, syncedStore as Ze } from "@syncedstore/core";
3
3
  import * as N from "yjs";
4
4
  import { setPageDataSource as et } from "@blocklet/pages-kit/utils/data-source";
@@ -8,17 +8,18 @@ import "lru-cache";
8
8
  import "node-fetch";
9
9
  import "ufo";
10
10
  import "lodash/isEmpty";
11
- import { C as _, G as E, e as l, c as N, j as O, k as P, b as c, h as d, g, f as T, s as h } from "./chunks/components-B8AH-ivu.js";
11
+ import { C as S, G as _, e as c, f as E, c as d, k as P, n as N, b as O, j as g, g as I, h as T, s as h } from "./chunks/components-BWQM8y6L.js";
12
12
  export {
13
- _ as CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS,
14
- E as GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS,
15
- l as clearPreloadComponentsCache,
16
- N as clearPreloadComponentsCacheByMode,
17
- O as getComponentFromState,
18
- P as getComponentFromStateByName,
19
- c as getExportSchemaValueFromCode,
20
- d as getPreloadComponent,
21
- g as getPreloadComponents,
13
+ S as CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS,
14
+ _ as GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS,
15
+ c as clearPreloadComponentsCache,
16
+ E as clearPreloadComponentsCacheByInstanceId,
17
+ d as clearPreloadComponentsCacheByMode,
18
+ P as getComponentFromState,
19
+ N as getComponentFromStateByName,
20
+ O as getExportSchemaValueFromCode,
21
+ g as getPreloadComponent,
22
+ I as getPreloadComponents,
22
23
  T as getPreloadComponentsCacheKey,
23
24
  h as skipTranspileComponent
24
25
  };
@@ -5,7 +5,7 @@ import K from "@blocklet/sdk/lib/wallet";
5
5
  import L from "@blocklet/sdk/lib/wallet-authenticator";
6
6
  import W from "@blocklet/sdk/lib/wallet-handler";
7
7
  import D, { resolve as I } from "path";
8
- import { l as S, g as N } from "./chunks/components-B8AH-ivu.js";
8
+ import { l as S, g as N } from "./chunks/components-BWQM8y6L.js";
9
9
  import { createHash as U } from "crypto";
10
10
  import { createSnapshotMiddleware as O } from "@arcblock/crawler-middleware";
11
11
  import { PreloadComponentScriptModule as R } from "@blocklet/pages-kit/types";
@@ -1,5 +1,5 @@
1
- import { i as A, a as M, l as b } from "./chunks/components-B8AH-ivu.js";
2
- import { P as w, C as J, R as X, S as x, t as W, g as G } from "./chunks/site-state-sUwlP4XQ.js";
1
+ import { i as A, a as M, l as b } from "./chunks/components-BWQM8y6L.js";
2
+ import { P as w, C as J, R as X, S as x, t as W, g as G } from "./chunks/site-state-BMW2lUR1.js";
3
3
  import { Router as K } from "express";
4
4
  import a from "fs";
5
5
  import m from "joi";
@@ -1,5 +1,5 @@
1
- import "./chunks/components-B8AH-ivu.js";
2
- import { c as b, a as h, b as B, S as L, e as U, f as q, h as v, d as y, g as z, i as C, m as F, t as G, j as J } from "./chunks/site-state-sUwlP4XQ.js";
1
+ import "./chunks/components-BWQM8y6L.js";
2
+ import { c as b, a as h, b as B, S as L, e as U, f as q, h as v, d as y, g as z, i as C, m as F, t as G, j as J } from "./chunks/site-state-BMW2lUR1.js";
3
3
  import { nextId as N } from "@blocklet/pages-kit/utils/common";
4
4
  import "@blocklet/pages-kit/utils/page-model";
5
5
  import "@blocklet/pages-kit/utils/property";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/pages-kit-inner-components",
3
- "version": "0.6.8",
3
+ "version": "0.6.10",
4
4
  "description": "Pages Kit inner components library",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -203,8 +203,8 @@
203
203
  "yaml": "^2.5.0",
204
204
  "yjs": "^13.6.18",
205
205
  "zustand": "^4.5.5",
206
- "@blocklet/pages-kit": "^0.6.8",
207
- "@blocklet/pages-kit-block-studio": "^0.6.8"
206
+ "@blocklet/pages-kit": "^0.6.10",
207
+ "@blocklet/pages-kit-block-studio": "^0.6.10"
208
208
  },
209
209
  "devDependencies": {
210
210
  "@trivago/prettier-plugin-sort-imports": "^5.2.1",
@@ -1,57 +0,0 @@
1
- "use strict";var oe=Object.create;var U=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var ae=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of re(t))!ce.call(e,s)&&s!==o&&U(e,s,{get:()=>t[s],enumerable:!(n=ne(t,s))||n.enumerable});return e};var y=(e,t,o)=>(o=e!=null?oe(se(e)):{},ae(t||!e||!e.__esModule?U(o,"default",{value:e,enumerable:!0}):o,e));const ie=require("@blocklet/pages-kit/builtin/utils"),x=require("@blocklet/pages-kit/types"),v=require("@blocklet/pages-kit/utils/property"),I=require("@blocklet/quickjs"),j=require("@blocklet/pages-kit/utils/builtin"),le=require("@blocklet/sdk/lib/config"),pe=require("lru-cache"),H=require("node-fetch"),S=require("ufo"),ue=require("lodash/isEmpty"),de=require("crypto"),w=require("fs"),N=require("path"),me=require("lodash/isNil"),fe=require("@blocklet/logger"),q=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),Qe=require("@blocklet/sdk/lib/component"),_=e=>e&&e.__esModule?e:{default:e},h=_(le),he=_(H),ge=_(ue),K=_(N),we=_(me),Ce=_(fe);h.default.env.mode;h.default.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY;h.default.env.OPENAI_BASE_URL||process.env.OPENAI_BASE_URL;h.default.env.TRANSLATE_ADDITIONAL_PROMPT||process.env.TRANSLATE_ADDITIONAL_PROMPT;h.default.env.PAGE_CONTENT_ADDITIONAL_PROMPT||process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;const Ee="image-bin";h.default.env.INIT_TEMPLATE_PATH;const Se=process.env.DATABASE_URL||K.default.join(h.default.env.dataDir,"db/pages-kit.db"),k=h.default,ye=()=>h.default.env.tenantMode==="multiple",_e=()=>(we.default(k.env.preferences.multiTenantAllProjectAccessPassports)?[]:k.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],Pe=K.default.join(h.default.env.dataDir,"fs-memoize-cache"),xe=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=Ce.default("pages-kit"),Me=Pe,Te=xe,b=30*24*60*60*1e3,Ae=24*60*60*1e3,G=async(e="")=>{const t=N.join(Me,e);try{if(!(await w.promises.stat(t)).isDirectory())throw new Error(`${t} is not a directory`)}catch{await w.promises.mkdir(t,{recursive:!0})}return t},$=(e,...t)=>e.keyGenerator?e.keyGenerator(...t):JSON.stringify([e.subdir||"",...t]),Oe=(e,t)=>{const o=de.createHash("md5").update(t).digest("hex");return N.join(e,`${Te}-${o}.json`)},Ie=async(e="")=>{const t=await G(e),o=Date.now();try{const n=await w.promises.readdir(t);await Promise.all(n.filter(s=>s.endsWith(".json")).map(async s=>{const r=N.join(t,s);try{const u=await w.promises.readFile(r,"utf-8"),i=JSON.parse(u);i.createdAt&&o-i.createdAt>b&&await w.promises.unlink(r)}catch{try{const i=await w.promises.stat(r);o-i.mtimeMs>b&&await w.promises.unlink(r)}catch{}}}))}catch(n){console.error(`Failed to cleanup cache in ${t}:`,n)}},ve=(()=>{const e=new Set;return setInterval(async()=>{await Promise.all(Array.from(e).map(n=>Ie(n)))},Ae).unref(),n=>{e.add(n)}})();function R(e,t){return t.subdir&&ve(t.subdir),I.memoize(async(...n)=>{const s=await G(t.subdir||""),r=$(t,...n),u=Oe(s,r);try{const i=await w.promises.readFile(u,"utf-8"),{value:d,createdAt:p}=JSON.parse(i);if(p&&Date.now()-p>b)throw await w.promises.unlink(u).catch(()=>{}),new Error("Cache expired");return d}catch{const d=await e(...n),p=JSON.stringify({value:d,createdAt:Date.now()});return w.promises.writeFile(u,p,"utf-8").catch(f=>{console.error("Failed to write fs cache:",f)}),d}},{keyGenerator:(...n)=>$(t,...n),lruOptions:t.lruOptions||{max:100,ttl:b}})}const J=async()=>await import("typescript"),be=async()=>await import("esbuild"),Ne=async()=>(await import("postcss")).default,Re=async()=>(await import("tailwindcss")).default,je=async()=>(await import("autoprefixer")).default,De=!1,Le=async(e,{componentId:t})=>{const o=`@tailwind components;
2
- @tailwind utilities;
3
- `,n=`.CustomComponent_${t}`,s=await Ne(),r=await Re(),u=await je();return(await s([r({content:[{raw:e,extension:"tsx"}]}),u({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),d=>{d.walkRules(p=>{p.selectors=p.selectors.map(f=>f.replace(/\.(.+)/g,`${n}.$1,${n} .$1`))})}]).process(o)).css},Fe=async(e,{componentId:t})=>{const o=await Le(e,{componentId:t});return`export const __PagesKit_CSS__ = ${JSON.stringify(o)};
4
-
5
- ${e}
6
- `},B=R(async(e,t)=>{let o=await J();try{let n=o.transpileModule(e,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.ESNext},transformers:{before:[q.createBuiltinModuleTransformer(o)]}}).outputText;if(t.tailwind&&(n=await Fe(n,{componentId:t.componentId})),t.module===x.PreloadComponentScriptModule.ESM)return n;const s=o.transpileModule(n,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.CommonJS,moduleResolution:o.ModuleResolutionKind.Node16}}).outputText;return t.module===x.PreloadComponentScriptModule.CJS?s:W(t.moduleName,s)}catch(n){throw new Error(n)}finally{o=null}},{subdir:"transpileModule"}),Ue=async(e,t)=>{let{build:o}=await be(),n=null;try{const r=(await o({entryPoints:["index.tsx"],external:Object.keys(j.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(d){d.onResolve({filter:/.*/},p=>p.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:p.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),d.onLoad({filter:/.*/,namespace:"vfs"},async p=>{if(p.path==="index.tsx")return{contents:`export { ${t} } from './component'`,loader:"tsx"};if(p.path==="component.tsx")return{contents:e,loader:"tsx"};if(q.isRelativeModule(p.path)){const f=p.path.split("/").pop()}return null})}}]})).outputFiles?.[0]?.contents;if(!r)throw new Error("Failed to build server code");const u=Buffer.from(r).toString();return n=await J(),n.transpileModule(u,{compilerOptions:{module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2020}}).outputText}catch(s){throw new Error(s)}finally{o=null,n=null}},ke=(e,t)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,"m").test(e)?e:void 0,V=R(async(e,t)=>{const o=await Ue(e,t);return ke(o,t)},{subdir:"extractExportValueSchema"}),W=(e,t)=>`// GENERATED FILE. DO NOT EDIT.
7
- var ${e} = async function () {
8
-
9
- const exports = {};
10
- let moduleExports = null;
11
-
12
- // add commonjs module compatibility layer
13
- const module = { exports: moduleExports };
14
-
15
- // execute component code
16
- ${t}
17
-
18
- // handle possible module.exports
19
- if (module.exports && module.exports !== moduleExports) {
20
- // if module.exports is used, use it first
21
- return typeof module.exports === 'object' ? module.exports : { default: module.exports };
22
- }
23
-
24
- // ensure a default export
25
- if (!('default' in exports) && Object.keys(exports).length === 0) {
26
- // module has no exports, return null to indicate invalid
27
- return null;
28
- }
29
-
30
- return exports;
31
- };
32
- `,Q=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function $e(e){return e?.type==="react-component"}const M=new pe.LRUCache({max:100,ttl:1e3*60*60*24}),z=60*60,D=10;function Z(e){g.info("clear preload components cache",{cacheKey:e}),M.delete(e)}function Be(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),Z(t))}function X({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function He({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:u,config:{defaultLocale:i}}=o;if(!i)return null;const d=(await Promise.all(s.map(async a=>{try{const c=X({mode:e,instanceId:a.id,componentId:a.componentId,locale:n});if(e!=="draft"&&a.useCache&&M.has(c))return g.info(`get preload component from cache: ${c}`),M.get(c);const C=T({state:o,componentId:a.componentId});if(!C)return null;const A=await Y({req:t,state:o,componentId:C.id,locale:n,defaultLocale:i,properties:a.properties});if(!A)return null;const P={instanceId:a.id,preload:A};if(e!=="draft"&&a.useCache){let E=z;a.cacheDuration&&(E=a.cacheDuration),g.info(`set preload component to cache(${E}s): ${c}`),M.set(c,P,{ttl:E*1e3})}return P}catch(c){return g.error("get preload component error",{instanceId:a.id,componentId:a.componentId},{error:c}),null}}))).filter(a=>!!a),p=Object.values(d.reduce((a,c)=>({...a,...c.preload.components}),{}));async function f(){const a=await Promise.all(p.map(async c=>{const C=r===x.PreloadComponentScriptModule.ESM,A=r===x.PreloadComponentScriptModule.UMD_FN,P=r===x.PreloadComponentScriptModule.CJS,E=C?"":v.componentUMDName({componentId:c.component.id}),L=te(c.component);let O={module:r,script:"",moduleName:E};if(L&&c.component.renderer?.type==="react-component"&&C&&c.component.renderer?.script)O.script=c.component.renderer?.script;else if(L&&c.component.renderer?.type==="react-component"&&(P||A)&&c.component.renderer?.cjsScript){const F=c.component.renderer.cjsScript;O.script=P?F:W(E,F)}else O=C?{module:r,script:await B(c.script,{componentId:c.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await B(c.script,{componentId:c.component.id,module:r,moduleName:E,tailwind:e!=="draft"}),moduleName:E};return[c.component.id,{component:c.component,script:O}]}));return Object.fromEntries(a)}const l=await f();return{config:{defaultLocale:i,supportedLocales:u},components:l,instances:d.map(a=>({id:a.instanceId,componentId:a.preload.component.id,locales:{[a.preload.locale]:{props:a.preload.props}}}))}}async function Y({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:u}=t,i=T({state:t,componentId:o});if(!i)return null;const d=u.some(f=>f.locale===n)?n:s;if(!d)return null;const p=await ee({req:e,state:t,componentId:o,locale:d,defaultLocale:s,properties:r});return p?{component:i,...p}:null}const qe=20;async function ee({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:u}){if(t>qe)throw new RangeError("max component depth exceeded");const i=Ke({state:o,componentId:n,properties:u,locale:s});if(!i)return null;const{props:d,component:p}=i,f={locale:s||r,components:{[i.component.id]:{component:i.component,script:i.script}},props:{...d}};try{const l=$e(p.renderer)?p.renderer.getServerSideProps:void 0,m=await Je({...i,req:e,getServerSideProps:l});m?.props&&Object.assign(f.props,m.props)}catch(l){g.error("preload data at server side error",{componentId:n,name:i.component.name},{error:l})}return await Promise.all(Object.entries(d).map(async([l,m])=>{if(m?.type===v.RenderNestedComponent){const a=await ee({req:e,depth:t+1,state:o,componentId:m.componentId,locale:s,defaultLocale:r,properties:m.properties});a&&(Object.assign(f.components,a.components),Object.assign(f.props,{[l]:{type:v.RenderNestedComponent,componentId:m.componentId,props:a.props}}))}})),f}function Ke({state:e,componentId:t,locale:o,properties:n}){const s=T({state:e,componentId:t});if(!s)return null;const r=v.mergeComponent({componentId:t,getComponent:u=>T({state:e,componentId:u}),locale:o,defaultLocale:e.config.defaultLocale,properties:n});return r?{component:s,script:r.script,props:{locale:o,...r.props}}:null}function T({state:e,componentId:t}){return e.components[t]?.data??e.resources.components?.[t]?.component}function Ge({state:e,name:t}){const o=t.toLowerCase();return Object.values(e.components).find(n=>n.data.name?.toLowerCase()===o)?.data??(e.resources.components&&Object.values(e.resources.components).find(n=>n.component.name?.toLowerCase()===o))?.component}async function Je({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await V(t,"getServerSideProps");if(!r)return null;const i=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",d=new Promise(l=>{setTimeout(()=>{l({})},D*1e3)});let p=await Q();return await Promise.race([d,p.callFunction({code:`${r}
33
-
34
- export async function getServerSidePropsWrapper(props) {
35
- const { location, fetch, props: componentProps } = props;
36
- // 使用局部变量而不是全局变量
37
- const originalLocation = typeof window !== 'undefined' ? window.location : undefined;
38
- const originalFetch = globalThis.fetch;
39
-
40
- try {
41
- globalThis.location = location;
42
- globalThis.fetch = fetch;
43
- return await ${i}(componentProps);
44
- } finally {
45
- // 清理全局状态
46
- if (originalLocation) globalThis.location = originalLocation;
47
- if (originalFetch) globalThis.fetch = originalFetch;
48
- }
49
- }`,filename:`${e.name||e.id}.js`,moduleLoader:l=>{if(l==="@blocklet/pages-kit/builtin/utils")return` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
50
- export { joinURL, withQuery, getQuery, getComponentMountPoint }
51
- `;if(l==="@blocklet/pages-kit/builtin/dayjs")return I.BuiltinModules.dayjs;if(l in I.BuiltinModules)return I.BuiltinModules[l];if(l in j.BuiltinModules){const m=j.BuiltinModules[l];return ge.default(m)?void 0:m}},global:{console:{log:(...l)=>{g.info(...l)},warn:(...l)=>{g.warn(...l)},error:(...l)=>{g.error(...l)}},getComponentMountPoint:ie.getComponentMountPoint,joinURL:S.joinURL,withQuery:S.withQuery,getQuery:S.getQuery},functionName:"getServerSidePropsWrapper",args:[{location:{href:S.joinURL(S.withHttps(n.hostname),n.originalUrl)},fetch:(l,{...m}={})=>{const a=typeof l=="string"&&l.startsWith("/")?S.joinURL(h.default.env.appUrl,l):l;if(typeof a=="string"&&S.parseURL(a).host===S.parseURL(h.default.env.appUrl).host){const c=n.get("cookie");if(c){const C=new H.Headers(m.headers);C.set("cookie",c),m.headers=C}}return he.default(a,{...m,timeout:D*1e3}).then(c=>({ok:c.ok,status:c.status,statusText:c.statusText,headers:Object.fromEntries(c.headers.entries()),json:()=>c.json()}))},props:o}]}).finally(()=>{p=null})])}const Ve=R(async(e,t,o,n)=>{if(!e?.includes(t)&&!n)return null;const s=n??await V(e,t);if(s)try{let r=await Q();return await r.callFunction({cache:!0,code:`
52
- ${s}
53
-
54
- export function get${t}SchemaWrapper() {
55
- return ${t};
56
- }
57
- `,filename:`${o}.js`,functionName:`get${t}SchemaWrapper`}).finally(()=>{r=null})}catch(r){return g.error(`获取 ${t} 失败`,{componentId:o,error:r}),null}return null},{subdir:"getExportSchemaValueFromCode"}),te=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=z;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=D;exports.IMAGE_BIN_NAME=Ee;exports.clearPreloadComponentsCache=Z;exports.clearPreloadComponentsCacheByMode=Be;exports.databaseUrl=Se;exports.getComponentFromState=T;exports.getComponentFromStateByName=Ge;exports.getExportSchemaValueFromCode=Ve;exports.getMultiTenantAllProjectAccessPassports=_e;exports.getPreloadComponent=Y;exports.getPreloadComponents=He;exports.getPreloadComponentsCacheKey=X;exports.isMultiTenant=ye;exports.logger=g;exports.memoizeWithFs=R;exports.skipTranspileComponent=te;