@blocklet/pages-kit-inner-components 0.6.7 → 0.6.9

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.
Files changed (33) hide show
  1. package/lib/cjs/add-component.js +1 -1
  2. package/lib/cjs/chunks/components-CacZMc0_.js +57 -0
  3. package/lib/cjs/chunks/{draft-data-D44_IEV2.js → draft-data-CVjF01PQ.js} +1 -1
  4. package/lib/cjs/chunks/{home-BYk01EUy.js → home-BarvCpAK.js} +2 -2
  5. package/lib/cjs/chunks/index-DH8UBqWG.js +475 -0
  6. package/lib/cjs/chunks/{publish-button-C8XPA4g_.js → publish-button-CNo2gT6Q.js} +1 -1
  7. package/lib/cjs/chunks/site-state-BkjuFb4-.js +1 -0
  8. package/lib/cjs/chunks/state-DCxHc_MB.js +1 -0
  9. package/lib/cjs/components.js +1 -1
  10. package/lib/cjs/home.js +1 -1
  11. package/lib/cjs/project-html.js +6 -9
  12. package/lib/cjs/resources.js +1 -1
  13. package/lib/cjs/setting.js +2 -2
  14. package/lib/cjs/site-state.js +1 -1
  15. package/lib/es/add-component.js +2 -2
  16. package/lib/es/chunks/components-BWQM8y6L.js +608 -0
  17. package/lib/es/chunks/{draft-data-CafrGKeh.js → draft-data-BiayOfQz.js} +1 -1
  18. package/lib/es/chunks/{home-DW8SdyfO.js → home-DBc-g4K0.js} +3 -3
  19. package/lib/es/chunks/{index-D5gXPe_7.js → index-DaF8ujCZ.js} +675 -763
  20. package/lib/es/chunks/{publish-button-XSZrDaTQ.js → publish-button-DiKDLFU8.js} +3 -3
  21. package/lib/es/chunks/site-state-BMW2lUR1.js +1586 -0
  22. package/lib/es/chunks/{state-0gvZF3k2.js → state-C3hsEhCe.js} +117 -121
  23. package/lib/es/components.js +11 -10
  24. package/lib/es/home.js +3 -3
  25. package/lib/es/project-html.js +132 -121
  26. package/lib/es/resources.js +28 -29
  27. package/lib/es/setting.js +148 -145
  28. package/lib/es/site-state.js +16 -15
  29. package/package.json +3 -3
  30. package/lib/cjs/chunks/index-BRgYwvuv.js +0 -475
  31. package/lib/cjs/chunks/site-state-BlQzwACl.js +0 -57
  32. package/lib/cjs/chunks/state-B6BF5wJ-.js +0 -1
  33. package/lib/es/chunks/site-state-BdLTu3Od.js +0 -2123
@@ -1,57 +0,0 @@
1
- "use strict";var It=Object.create;var xe=Object.defineProperty;var bt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var Ct=Object.getPrototypeOf,At=Object.prototype.hasOwnProperty;var Ot=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Pt(e))!At.call(t,o)&&o!==n&&xe(t,o,{get:()=>e[o],enumerable:!(s=bt(e,o))||s.enumerable});return t};var q=(t,e,n)=>(n=t!=null?It(Ct(t)):{},Ot(e||!t||!t.__esModule?xe(n,"default",{value:t,enumerable:!0}):n,t));const Tt=require("@blocklet/pages-kit/builtin/utils"),Ee=require("@blocklet/pages-kit/types"),Q=require("@blocklet/pages-kit/utils/property"),te=require("@blocklet/quickjs"),Ie=require("@blocklet/pages-kit/utils/builtin"),jt=require("@blocklet/sdk/lib/config"),le=require("lru-cache"),Be=require("node-fetch"),_=require("ufo"),vt=require("lodash/isEmpty"),Dt=require("crypto"),w=require("fs"),h=require("path"),Rt=require("lodash/isNil"),_t=require("@blocklet/logger"),Ve=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),Te=require("@blocklet/sdk/lib/component"),F=require("@syncedstore/core"),kt=require("yjs"),xt=require("@blocklet/pages-kit/utils/data-source"),ne=require("@blocklet/pages-kit/utils/route"),Mt=require("lodash"),Me=require("@blocklet/pages-kit/utils/common"),Lt=require("@blocklet/pages-kit/utils/page-model"),Nt=require("@reactivedata/reactive"),se=require("glob"),$t=require("lib0/decoding"),Ut=require("lib0/encoding"),Ft=require("lodash/cloneDeep"),qt=require("lodash/debounce"),Bt=require("lodash/get"),Vt=require("lodash/set"),Gt=require("lodash/union"),Ht=require("p-limit"),v=require("sequelize"),Jt=require("stream/promises"),Kt=require("tar"),zt=require("wait-on"),J=require("y-protocols/awareness"),ge=require("y-protocols/sync"),Yt=require("yaml");require("sqlite3");require("@blocklet/pages-kit/types/state");const x=t=>t&&t.__esModule?t:{default:t};function pe(t){if(t&&t.__esModule)return t;const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const s=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,s.get?s:{enumerable:!0,get:()=>t[n]})}}return e.default=t,Object.freeze(e)}const b=x(jt),Wt=x(Be),je=x(vt),Ge=x(h),Qt=x(Rt),Xt=x(_t),N=pe(kt),ye=pe($t),R=pe(Ut),Zt=x(Ft),He=x(qt),ve=x(Bt),Le=x(Vt),en=x(Gt),tn=x(Ht),nn=x(zt),B=pe(Yt);b.default.env.mode;b.default.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY;b.default.env.OPENAI_BASE_URL||process.env.OPENAI_BASE_URL;b.default.env.TRANSLATE_ADDITIONAL_PROMPT||process.env.TRANSLATE_ADDITIONAL_PROMPT;b.default.env.PAGE_CONTENT_ADDITIONAL_PROMPT||process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;const sn="image-bin";b.default.env.INIT_TEMPLATE_PATH;const Je=process.env.DATABASE_URL||Ge.default.join(b.default.env.dataDir,"db/pages-kit.db"),Ne=b.default,on=()=>b.default.env.tenantMode==="multiple",rn=()=>(Qt.default(Ne.env.preferences.multiTenantAllProjectAccessPassports)?[]:Ne.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],an=Ge.default.join(b.default.env.dataDir,"fs-memoize-cache"),cn=b.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",f=Xt.default("pages-kit"),ln=v.DataTypes.sqlite.DATE.parse;v.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):ln(t,e);const $=new v.Sequelize({dialect:"sqlite",storage:Je,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});$.query("pragma journal_mode = WAL;");$.query("pragma synchronous = normal;");$.query("pragma journal_size_limit = 33554432;");$.query("pragma cache_size = -2000;");$.query("pragma mmap_size = 33554432;");process.on("SIGINT",async()=>{await $.close(),process.exit(0)});process.on("SIGTERM",async()=>{await $.close(),process.exit(0)});async function pn(t,e){try{if(t.getDialect()!=="sqlite")return;const[n]=await t.query("SELECT 1");if(!n||n.length===0)return;await t.query("PRAGMA shrink_memory;")}catch(n){if(n.name==="SequelizeConnectionError"||n?.message&&/closed!/.test(n.message))return;console.error("Failed to cleanup SQLite memory",e,n)}}setInterval(async()=>{f.info("Start cleanupSqliteMemory"),await pn($,Je),f.info("End cleanupSqliteMemory")},60*1e3*10);class De extends v.Model{}De.init({id:{type:v.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:v.DataTypes.UUIDV4},projectId:{type:v.DataTypes.UUID,allowNull:!1},componentId:{type:v.DataTypes.STRING,allowNull:!1}},{sequelize:$,tableName:"ProjectComponents",timestamps:!1});class M extends v.Model{static async getProjectByIdOrSlug(e){return M.findOne({where:{[v.Op.or]:[{id:e},{slug:e}]}})}}M.init({id:{type:v.DataTypes.UUID,defaultValue:v.DataTypes.UUIDV4,primaryKey:!0},name:{type:v.DataTypes.STRING,allowNull:!1},description:v.DataTypes.TEXT,createdAt:v.DataTypes.DATE,updatedAt:v.DataTypes.DATE,createdBy:{type:v.DataTypes.STRING,allowNull:!1},updatedBy:{type:v.DataTypes.STRING,allowNull:!1},slug:v.DataTypes.STRING,icon:v.DataTypes.STRING,pinnedAt:v.DataTypes.DATE,useAllResources:v.DataTypes.BOOLEAN,npmSecret:v.DataTypes.STRING,relatedBlocklets:{type:v.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("relatedBlocklets");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return f.error("Failed to parse relatedBlocklets",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("relatedBlocklets",t?JSON.stringify(t):"{}")}catch(e){f.error("Failed to set relatedBlocklets",{error:e,value:t}),this.setDataValue("relatedBlocklets","{}")}}},productionState:{type:v.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){const t=this.getDataValue("productionState");if(typeof t=="object")return t??{};try{return t?JSON.parse(t):{}}catch(e){return f.error("Failed to parse productionState",{error:e,rawValue:t}),{}}},set(t){try{this.setDataValue("productionState",t?JSON.stringify(t):"{}")}catch(e){f.error("Failed to set productionState",{error:e,value:t}),this.setDataValue("productionState","{}")}}}},{sequelize:$,paranoid:!0});M.hasMany(De,{foreignKey:"projectId",as:"components"});const un=an,dn=cn,oe=30*24*60*60*1e3,fn=24*60*60*1e3,Ke=async(t="")=>{const e=h.join(un,t);try{if(!(await w.promises.stat(e)).isDirectory())throw new Error(`${e} is not a directory`)}catch{await w.promises.mkdir(e,{recursive:!0})}return e},$e=(t,...e)=>t.keyGenerator?t.keyGenerator(...e):JSON.stringify([t.subdir||"",...e]),mn=(t,e)=>{const n=Dt.createHash("md5").update(e).digest("hex");return h.join(t,`${dn}-${n}.json`)},hn=async(t="")=>{const e=await Ke(t),n=Date.now();try{const s=await w.promises.readdir(e);await Promise.all(s.filter(o=>o.endsWith(".json")).map(async o=>{const r=h.join(e,o);try{const c=await w.promises.readFile(r,"utf-8"),a=JSON.parse(c);a.createdAt&&n-a.createdAt>oe&&await w.promises.unlink(r)}catch{try{const a=await w.promises.stat(r);n-a.mtimeMs>oe&&await w.promises.unlink(r)}catch{}}}))}catch(s){console.error(`Failed to cleanup cache in ${e}:`,s)}},gn=(()=>{const t=new Set;return setInterval(async()=>{await Promise.all(Array.from(t).map(s=>hn(s)))},fn).unref(),s=>{t.add(s)}})();function ue(t,e){return e.subdir&&gn(e.subdir),te.memoize(async(...s)=>{const o=await Ke(e.subdir||""),r=$e(e,...s),c=mn(o,r);try{const a=await w.promises.readFile(c,"utf-8"),{value:p,createdAt:d}=JSON.parse(a);if(d&&Date.now()-d>oe)throw await w.promises.unlink(c).catch(()=>{}),new Error("Cache expired");return p}catch{const p=await t(...s),d=JSON.stringify({value:p,createdAt:Date.now()});return w.promises.writeFile(c,d,"utf-8").catch(P=>{console.error("Failed to write fs cache:",P)}),p}},{keyGenerator:(...s)=>$e(e,...s),lruOptions:e.lruOptions||{max:100,ttl:oe}})}const ze=async()=>await import("typescript"),yn=async()=>await import("esbuild"),Sn=async()=>(await import("postcss")).default,wn=async()=>(await import("tailwindcss")).default,En=async()=>(await import("autoprefixer")).default,In=async(t,{componentId:e})=>{const n=`@tailwind components;
2
- @tailwind utilities;
3
- `,s=`.CustomComponent_${e}`,o=await Sn(),r=await wn(),c=await En();return(await o([r({content:[{raw:t,extension:"tsx"}]}),c({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),p=>{p.walkRules(d=>{d.selectors=d.selectors.map(P=>P.replace(/\.(.+)/g,`${s}.$1,${s} .$1`))})}]).process(n)).css},bn=async(t,{componentId:e})=>{const n=await In(t,{componentId:e});return`export const __PagesKit_CSS__ = ${JSON.stringify(n)};
4
-
5
- ${t}
6
- `},Ue=ue(async(t,e)=>{const n=await ze();let s=n.transpileModule(t,{compilerOptions:{jsx:n.JsxEmit.React,target:n.ScriptTarget.ES2016,module:n.ModuleKind.ESNext},transformers:{before:[Ve.createBuiltinModuleTransformer(n)]}}).outputText;if(e.tailwind&&(s=await bn(s,{componentId:e.componentId})),e.module===Ee.PreloadComponentScriptModule.ESM)return s;const o=n.transpileModule(s,{compilerOptions:{jsx:n.JsxEmit.React,target:n.ScriptTarget.ES2016,module:n.ModuleKind.CommonJS,moduleResolution:n.ModuleResolutionKind.Node16}}).outputText;return e.module===Ee.PreloadComponentScriptModule.CJS?o:An(e.moduleName,o)},{subdir:"transpileModule"}),Pn=async(t,e)=>{const{build:n}=await yn(),o=(await n({entryPoints:["index.tsx"],external:Object.keys(Ie.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(p){let d=null;p.onResolve({filter:/.*/},P=>P.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:P.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),p.onLoad({filter:/.*/,namespace:"vfs"},async P=>{if(P.path==="index.tsx")return{contents:`export { ${e} } from './component'`,loader:"tsx"};if(P.path==="component.tsx")return{contents:t,loader:"tsx"};if(Ve.isRelativeModule(P.path)){const g=P.path.split("/").pop();if(d||(d=await wt({ensureLoaded:!1})),d?.chunks?.[g])try{const E=w.readFileSync(d.chunks[g],"utf-8");return f.info("get chunk from local file system",g),{contents:E,loader:"tsx"}}catch{}}return null})}}]})).outputFiles?.[0]?.contents;if(!o)throw new Error("Failed to build server code");const r=Buffer.from(o).toString(),c=await ze();return c.transpileModule(r,{compilerOptions:{module:c.ModuleKind.ESNext,target:c.ScriptTarget.ES2020}}).outputText},Cn=(t,e)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${e}\\b|\\b${e}\\b)[^}]*\\}`,"m").test(t)?t:void 0,Ye=ue(async(t,e)=>{const n=await Pn(t,e);return Cn(n,e)},{subdir:"extractExportValueSchema"}),An=(t,e)=>`// GENERATED FILE. DO NOT EDIT.
7
- var ${t} = 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
- ${e}
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
- `,We=async()=>{const{Sandbox:t}=await import("@blocklet/quickjs");return t};function On(t){return t?.type==="react-component"}const z=new le.LRUCache({max:100,ttl:1e3*60*60*24}),Qe=60*60,be=10;function Xe(t){f.info("clear preload components cache",{cacheKey:t}),z.delete(t)}function Ze(t){for(const e of z.keys())e.includes(t)&&(f.info("clear preload components cache",{cacheKey:e}),Xe(e))}function et({mode:t,instanceId:e,componentId:n,locale:s}){return["getPreloadComponents",t,e,n,s].join("-")}async function Tn({mode:t,req:e,state:n,locale:s,instances:o,module:r}){const{supportedLocales:c,config:{defaultLocale:a}}=n;if(!a)return null;const p=(await Promise.all(o.map(async l=>{try{const i=et({mode:t,instanceId:l.id,componentId:l.componentId,locale:s});if(t!=="draft"&&l.useCache&&z.has(i))return f.info(`get preload component from cache: ${i}`),z.get(i);const S=X({state:n,componentId:l.componentId});if(!S)return null;const A=await tt({req:e,state:n,componentId:S.id,locale:s,defaultLocale:a,properties:l.properties});if(!A)return null;const y={instanceId:l.id,preload:A};if(t!=="draft"&&l.useCache){let m=Qe;l.cacheDuration&&(m=l.cacheDuration),f.info(`set preload component to cache(${m}s): ${i}`),z.set(i,y,{ttl:m*1e3})}return y}catch(i){return f.error("get preload component error",{instanceId:l.id,componentId:l.componentId},{error:i}),null}}))).filter(l=>!!l),d=Object.values(p.reduce((l,i)=>({...l,...i.preload.components}),{}));async function P(){const l=await Promise.all(d.map(async i=>{const S=Q.componentUMDName({componentId:i.component.id}),A=r===Ee.PreloadComponentScriptModule.ESM?{module:r,script:await Ue(i.script,{componentId:i.component.id,module:r,tailwind:t!=="draft"})}:{module:r,script:await Ue(i.script,{componentId:i.component.id,module:r,moduleName:S,tailwind:t!=="draft"}),moduleName:S};return[i.component.id,{component:i.component,script:A}]}));return Object.fromEntries(l)}const g=await P();return{config:{defaultLocale:a,supportedLocales:c},components:g,instances:p.map(l=>({id:l.instanceId,componentId:l.preload.component.id,locales:{[l.preload.locale]:{props:l.preload.props}}}))}}async function tt({req:t,state:e,componentId:n,locale:s,defaultLocale:o,properties:r}){const{supportedLocales:c}=e,a=X({state:e,componentId:n});if(!a)return null;const p=c.some(P=>P.locale===s)?s:o;if(!p)return null;const d=await nt({req:t,state:e,componentId:n,locale:p,defaultLocale:o,properties:r});return d?{component:a,...d}:null}const jn=20;async function nt({req:t,depth:e=0,state:n,componentId:s,locale:o,defaultLocale:r,properties:c}){if(e>jn)throw new RangeError("max component depth exceeded");const a=vn({state:n,componentId:s,properties:c,locale:o});if(!a)return null;const{props:p,component:d}=a,P={locale:o||r,components:{[a.component.id]:{component:a.component,script:a.script}},props:{...p}};try{const g=On(d.renderer)?d.renderer.getServerSideProps:void 0,E=await Rn({...a,req:t,serverSideProps:g});E?.props&&Object.assign(P.props,E.props)}catch(g){f.error("preload data at server side error",{componentId:s,name:a.component.name},{error:g})}return await Promise.all(Object.entries(p).map(async([g,E])=>{if(E?.type===Q.RenderNestedComponent){const l=await nt({req:t,depth:e+1,state:n,componentId:E.componentId,locale:o,defaultLocale:r,properties:E.properties});l&&(Object.assign(P.components,l.components),Object.assign(P.props,{[g]:{type:Q.RenderNestedComponent,componentId:E.componentId,props:l.props}}))}})),P}function vn({state:t,componentId:e,locale:n,properties:s}){const o=X({state:t,componentId:e});if(!o)return null;const r=Q.mergeComponent({componentId:e,getComponent:c=>X({state:t,componentId:c}),locale:n,defaultLocale:t.config.defaultLocale,properties:s});return r?{component:o,script:r.script,props:{locale:n,...r.props}}:null}function X({state:t,componentId:e}){return t.components[e]?.data??t.resources.components?.[e]?.component}function Dn({state:t,name:e}){const n=e.toLowerCase();return Object.values(t.components).find(s=>s.data.name?.toLowerCase()===n)?.data??(t.resources.components&&Object.values(t.resources.components).find(s=>s.component.name?.toLowerCase()===n))?.component}async function Rn({component:t,script:e,props:n,req:s,serverSideProps:o}){if(!o&&!e?.includes("getServerSideProps"))return null;const r=o??await Ye(e,"getServerSideProps");if(!r)return null;const a=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",p=new Promise(g=>{setTimeout(()=>{g({})},be*1e3)}),d=await We();return await Promise.race([p,d.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 ${a}(componentProps);
44
- } finally {
45
- // 清理全局状态
46
- if (originalLocation) globalThis.location = originalLocation;
47
- if (originalFetch) globalThis.fetch = originalFetch;
48
- }
49
- }`,filename:`${t.name||t.id}.js`,moduleLoader:g=>{if(g==="@blocklet/pages-kit/builtin/utils")return` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
50
- export { joinURL, withQuery, getQuery, getComponentMountPoint }
51
- `;if(g==="@blocklet/pages-kit/builtin/dayjs")return te.BuiltinModules.dayjs;if(g in te.BuiltinModules)return te.BuiltinModules[g];if(g in Ie.BuiltinModules){const E=Ie.BuiltinModules[g];return je.default(E)?void 0:E}},global:{console:{log:(...g)=>{f.info(...g)},warn:(...g)=>{f.warn(...g)},error:(...g)=>{f.error(...g)}},getComponentMountPoint:Tt.getComponentMountPoint,joinURL:_.joinURL,withQuery:_.withQuery,getQuery:_.getQuery},functionName:"getServerSidePropsWrapper",args:[{location:{href:_.joinURL(_.withHttps(s.hostname),s.originalUrl)},fetch:(g,{...E}={})=>{const l=typeof g=="string"&&g.startsWith("/")?_.joinURL(b.default.env.appUrl,g):g;if(typeof l=="string"&&_.parseURL(l).host===_.parseURL(b.default.env.appUrl).host){const i=s.get("cookie");if(i){const S=new Be.Headers(E.headers);S.set("cookie",i),E.headers=S}}return Wt.default(l,{...E,timeout:be*1e3}).then(i=>({ok:i.ok,status:i.status,statusText:i.statusText,headers:Object.fromEntries(i.headers.entries()),json:()=>i.json()}))},props:n}]})])}const st=ue(async(t,e,n,s)=>{if(!t?.includes(e)&&!s)return null;const o=s??await Ye(t,e);if(o)try{return await(await We()).callFunction({code:`
52
- ${o}
53
-
54
- export function get${e}SchemaWrapper() {
55
- return ${e};
56
- }
57
- `,filename:`${n}.js`,functionName:`get${e}SchemaWrapper`})}catch(r){return f.error(`获取 ${e} 失败`,{componentId:n,error:r}),null}return null},{subdir:"getExportSchemaValueFromCode"}),_n=t=>!!(t.version&&t.version>=2),kn="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",Pe="page",Ce="trigger-reload-project-resource",Re=kn,xn="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM";function re(t){t.observeDeep(e=>{e.some(n=>n.changes.keys.has("updatedAt")||n.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function ot(){return w.mkdtempSync(h.join(b.default.env.dataDir,"tmp-"))}function ae(t,e,n=[]){return Array.isArray(t)?t.flatMap((s,o)=>ae(s,e,[...n,o])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([s,o])=>ae(o,e,[...n,s])):e(t)?[n]:[]}function k(t){return t.filter(e=>e!=null)}function Mn(t){t.pages&&Object.keys(t.pages).forEach(n=>{const s=F.getYjsValue(t.pages[n]);s&&s instanceof N.Map&&re(s)});const e=F.getYjsValue(t.pages);e&&e instanceof N.Map&&e.observe(n=>{n.changes.keys.forEach((s,o)=>{if(s.action==="add"){const r=F.getYjsValue(t.pages[o]);r&&r instanceof N.Map&&re(r)}})})}function Ln(t){t.routes&&Object.keys(t.routes).forEach(n=>{const s=F.getYjsValue(t.routes?.[n]);s&&s instanceof N.Map&&re(s)});const e=F.getYjsValue(t.routes);e&&e instanceof N.Map&&e.observe(n=>{n.changes.keys.forEach((s,o)=>{if(s.action==="add"){const r=F.getYjsValue(t.routes?.[o]);r&&r instanceof N.Map&&re(r)}})})}function Nn(t,e){for(const n of e||Object.keys(t.routes||{})){let s=n,o=[];if(n.includes("-")){const[r,...c]=n.split("-");s=r,o=c||[]}if(t.routes?.[s]!==void 0){t.routes[s].publishedAt=new Date().toISOString();const r=t.routes[s];if(!r||!r.params||r.params.length===0)continue;if(n.includes("-")&&o.length>0){const c=ne.getRouteMetaDataByOptionIds(o,r);c&&(c.publishedAt=new Date().toISOString())}if(!e){const c=ne.generateParamCombinations({basePath:r.path,params:r.params,routeId:r.id,paramsOptions:r.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const a of c)a.routeMetaData??={},a.routeMetaData.publishedAt=new Date().toISOString()}}}}function Se({page:t,route:e,state:n,routeId:s,routePathInfo:o}){f.info(`Executing datasource data assembly, routeId: ${s}, routePathInfo: ${JSON.stringify(o)}`);const r={...Mt.cloneDeep(t),id:s,slug:o?.path??e.path,createdAt:e.createdAt,updatedAt:o?.routeMetaData?.updatedAt??e.updatedAt,publishedAt:o?.routeMetaData?.publishedAt??e.publishedAt,isPublic:(o?.routeMetaData?.isPublic??e.isPublic)&&e.isPublic};for(const c of n.supportedLocales){if(e.dataSource){let a=e.id;o&&(a=o.paramOptionIds.join("-"));const p=e.dataSource.pathDataMappings?.[a]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[a]?.dataCache?.[n.config.defaultLocale||"en"];if(!p)continue;xt.setPageDataSource(r,n,c.locale,p)}o&&o.routeMetaData&&(o.routeMetaData.publishedAt=new Date().toISOString())}return r}const V=new le.LRUCache({max:100,ttl:10*60*1e3});function $n(t,e=[]){let n=0;const s=Array.from(V.keys()),o=[];for(const r of t){o.push(`page-html:prod:${r}:lang-path=none`);for(const c of e)o.push(`page-html:prod:/${c}${r}:lang-path=${c}`)}for(const r of s){const c=r.split(":lang-path=")[0]||"";for(const a of o){const d=(a.split(":lang-path=")[0]||"").replace(/\/:[^/]+/g,"");if(c.startsWith(d)){V.delete(r),n++,f.info(`[Cache CLEAR] key: ${r}`);break}}}return f.info(`[Cache CLEAR] cleared ${n} entries for patterns:`,o),n}function Un({projectId:t,projectSlug:e,supportedLocales:n=[]}){let s=0;const o=Array.from(V.keys()),r=[];r.push(`page-html:prod:/${t}`),e&&e!==t&&r.push(`page-html:prod:/${e}`);for(const c of n)r.push(`page-html:prod:/${c}/${t}`),e&&e!==t&&(e!=="/"?r.push(`page-html:prod:/${c}/${e}`):r.push(`page-html:prod:/${c}`));for(const c of o)for(const a of r)if(c.startsWith(a)){V.delete(c),s++,f.info(`[Cache CLEAR PROJECT] key: ${c}`);break}return f.info(`[Cache CLEAR PROJECT] cleared ${s} entries for project ${t}${e?` (slug: ${e})`:""}`),s}function Fn(){const t=V.size;return V.clear(),f.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}b.default.events.on(b.default.Events.envUpdate,Fn);const{uploadToMediaKit:qn}=require("@blocklet/uploader-server"),_e=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,Y=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,Fe=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Bn=1e4,Vn=3e4,Z=0,we=1,Gn=0,Hn=1,rt=b.default,K=h.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Jn=["production","draft"],Kn=["production"];function ie(t){return t?.replace(/\//g,"|")||""}function at(){const t=rt.env.languages.map(n=>({locale:n.code,name:n.name})),e=t[0]?.locale;return{pageIds:[],pages:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{},components:{},supportedLocales:t,config:{defaultLocale:e},resources:{}}}class j extends N.Doc{constructor(e){super(),this.options=e,w.existsSync(this.draftYjsFilePath)&&N.applyUpdate(this,w.readFileSync(this.draftYjsFilePath)),this.syncedStore=Nt.reactive(F.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new J.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 le.LRUCache({max:100,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const n=h.join(K,e),s=h.join(K,`@del-${e}`);w.renameSync(n,s)}catch(n){f.error("Failed to safe delete project state dir:",n)}}static async getProjectIds(){return(await M.findAll({attributes:["id"],raw:!0})).map(e=>e.id)}static get projectIds(){return se.globSync("*/",{cwd:K,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>j.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let n=j.sharedInstances[e];return n||(n=new j({path:h.join(K,e)}),j.sharedInstances[e]=n,St({projectId:e,pages:de,components:fe}),n)}static async getProductionState(e){return(await M.findByPk(e,{attributes:["productionState"]}))?.productionState??at()}destroy(){this.cancelRelease(),this.save({flush:!0}),this.conns.forEach((n,s)=>this.closeConn(s)),this.awareness.destroy();const e=h.basename(this.options.path);delete j.sharedInstances[e],super.destroy()}initObserver(){Mn(this.syncedStore),Ln(this.syncedStore)}get draftYjsFilePath(){return h.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,n){if(n==="draft"){const s=j.shared(e);return JSON.parse(JSON.stringify(s.syncedStore))}return j.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const n=h.basename(this.options.path);return j.getProductionState(n)}async setState(e,n){const s=await pt(n,{exportAssets:!1,includeResources:!0}),o=this.getPublishDir(e);if(w.mkdirSync(h.dirname(o),{recursive:!0}),w.rmSync(o,{force:!0,recursive:!0}),w.renameSync(s,o),e==="production"){const r=h.basename(this.options.path);j.pageUrlMapCache.delete(r),await M.update({productionState:n},{where:{id:r}})}}getPublishDir(e){return h.join(this.options.path,e)}syncedStore;conns=new Map;awareness;releaseTimer;awarenessChangeHandler=({added:e,updated:n,removed:s},o)=>{const r=e.concat(n,s);if(o!==null){const p=this.conns.get(o);p&&(e.forEach(d=>{p.add(d)}),s.forEach(d=>{p.delete(d)}))}const c=R.createEncoder();R.writeVarUint(c,we),R.writeVarUint8Array(c,J.encodeAwarenessUpdate(this.awareness,r));const a=R.toUint8Array(c);this.conns.forEach((p,d)=>this.send(d,a))};updateHandler=e=>{const n=R.createEncoder();R.writeVarUint(n,Z),ge.writeUpdate(n,e);const s=R.toUint8Array(n);this.conns.forEach((o,r)=>this.send(r,s))};ensureDataStructure=()=>{const{supportedLocales:e,pages:n,pageIds:s,config:o,routes:r,routeIds:c}=this.syncedStore;{const a=new Set(Object.keys(n));let p=0;for(;p<s.length;){const d=s[p];a.has(d)?(a.delete(d),p++):s.splice(p,1)}}{const a=new Set(Object.keys(r));let p=0;for(;p<c.length;){const d=c[p];a.has(d)?(a.delete(d),p++):c.splice(p,1)}}e.splice(0,e.length),e.push(...rt.env.languages.map(a=>({locale:a.code,name:a.name}))),o.defaultLocale=e[0]?.locale;{let a=0;const p=new Set;for(;a<e.length;){const{locale:d}=e[a];p.has(d)?e.splice(a,1):(a++,p.add(d))}}};send=(e,n)=>{e.readyState!==Gn&&e.readyState!==Hn&&this.closeConn(e);try{e.send(n,s=>{s&&this.closeConn(e)})}catch{this.closeConn(e)}};closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const n=this.conns.get(e);this.conns.delete(e),n&&J.removeAwarenessStates(this.awareness,Array.from(n),null)}e.close(),this.checkAndScheduleRelease()};checkAndScheduleRelease(){this.conns.size===0&&this.scheduleRelease()}scheduleRelease(){this.cancelRelease();const e=h.basename(this.options.path);this.releaseTimer=setTimeout(()=>{f.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},j.RELEASE_DELAY),f.info(`[SiteState] scheduled release for project ${e} in ${j.RELEASE_DELAY/1e3}s`)}cancelRelease(){if(this.releaseTimer){clearTimeout(this.releaseTimer),this.releaseTimer=void 0;const e=h.basename(this.options.path);f.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=He.default(()=>{w.mkdirSync(h.dirname(this.draftYjsFilePath),{recursive:!0}),w.writeFileSync(this.draftYjsFilePath,N.encodeStateAsUpdate(this))},Bn);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:n})=>{const s=await this.getState("draft"),o=await this.getState("production");await Oe(s,o,{routes:n,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),o.config.publishedAt=new Date().getTime(),Nn(this.syncedStore,n),await this.setState(e,o),await this.clearPageCacheForRoutes(n,o)};mergeState=async(e,n)=>{const s=JSON.parse(JSON.stringify(n));e.config.fontFamily??={};const o=s.config?.fontFamily,r=e.config?.fontFamily;e.config.fontFamily.title=o?.title||r?.title,e.config.fontFamily.description=o?.description||r?.description,await new Promise((c,a)=>{this.transact(async()=>{try{const p=await Oe(e,n);c(p)}catch(p){a(p)}})})};clearPageCacheForRoutes=async(e,n)=>{const s=h.basename(this.options.path),r=(await M.findByPk(s))?.slug||s;if(f.info(`[SiteState] clearing page cache for project ${s}, routes:`,e||[]),!e||e.length===0){Un({projectId:s,projectSlug:r,supportedLocales:n.supportedLocales.map(d=>d.locale)});return}const c=n.supportedLocales.map(d=>d.locale),a=[],p=e.filter(d=>n.pages[d]);for(const d of p){const g=n.pages[d].slug;r&&r!==s&&(r==="/"?a.push(g):a.push(`/${r}${g}`)),a.push(`/${s}${g}`)}if(f.info(`[SiteState] clearing page cache for project ${s}, pathPatterns:`,a),a.length>0){const d=$n(a,c);f.info(`[SiteState] cleared ${d} page cache entries for project ${s}, routes:`,e)}};addConnection=e=>{if(this.conns.has(e))return;this.cancelRelease(),e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",o=>this.messageListener(e,new Uint8Array(o)));let n=!0;const s=setInterval(()=>{if(!n)this.conns.has(e)&&this.closeConn(e),clearInterval(s);else if(this.conns.has(e)){n=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(s)}}},Vn);e.on("close",()=>{this.closeConn(e),clearInterval(s)}),e.on("pong",()=>{n=!0});{const o=R.createEncoder();R.writeVarUint(o,Z),ge.writeSyncStep1(o,this),this.send(e,R.toUint8Array(o));const r=this.awareness.getStates();if(r.size>0){const c=R.createEncoder();R.writeVarUint(c,we),R.writeVarUint8Array(c,J.encodeAwarenessUpdate(this.awareness,Array.from(r.keys()))),this.send(e,R.toUint8Array(c))}}};messageListener=(e,n)=>{try{const s=R.createEncoder(),o=ye.createDecoder(n),r=ye.readVarUint(o);switch(r){case Z:R.writeVarUint(s,Z),ge.readSyncMessage(o,s,this,null),R.length(s)>1&&(this.ensureDataStructure(),this.send(e,R.toUint8Array(s)));break;case we:{J.applyAwarenessUpdate(this.awareness,ye.readVarUint8Array(o),e);break}default:f.warn(`Unsupported messageType ${r}`)}}catch(s){f.error(s)}this.save()};static async pageUrlMap(e,n){let s=[];n?s=[n]:s=await this.getProjectIds();let o={};if(e==="production"&&s?.length){const r=new Map(s.map(c=>[c,!0]));for(const c of s){const a=j.pageUrlMapCache.get(c);a&&(o={...o,...a},r.delete(c))}s=Array.from(r.keys())}if(s?.length){const r=await M.findAll({where:{id:{[v.Op.in]:s}}});await Promise.all(r.map(async c=>{const a=c.id,p=c.slug||a,d={},P=e==="production"&&c?.productionState?c.productionState:await j.getStateByProjectId(c.id,e),g=en.default(b.default.env.languages.map(l=>l.code),P.supportedLocales.map(l=>l.locale)),E=(l,i)=>{p&&(d[_.joinURL("/",p,l)]={...i,shouldRedirect:!0,mainPage:!0}),d[_.joinURL("/",a,l)]={...i,shouldRedirect:!0,mainPage:!0};for(const S of g){const A={...i,locale:S};d[_.joinURL("/",S,a,l)]=A,p&&(d[_.joinURL("/",S,p,l)]=A)}};if(e==="draft")for(const l of P.routeIds||[]){const i=P?.routes?.[l];if(!i)continue;if(i.params&&i.params.length>0){const y=ne.generateParamCombinations({basePath:i.path,params:i.params,routeId:i.id,paramsOptions:i.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const m of y){const I=m.path,O={projectId:a,projectSlug:p,pageSlug:I,pageId:i.displayTemplateId||"",routeId:l,defaultLocale:g?.[0],locales:g,publishedAt:P.config.publishedAt,isPublic:i.isPublic&&m?.routeMetaData?.isPublic};E(I,O)}}const S=i.path,A={projectId:a,projectSlug:p,pageSlug:S,pageId:i.displayTemplateId||"",routeId:l,defaultLocale:g?.[0],locales:g,publishedAt:P.config.publishedAt,isPublic:i.isPublic};E(S,A)}for(const l of P.pageIds){const i=P.pages[l];if(!i||e==="production"&&!i.isPublic)continue;const S=i.slug,A=c.slug||a,y={projectId:a,projectSlug:A,pageSlug:S,pageId:l,defaultLocale:g?.[0],locales:g,publishedAt:P.config.publishedAt,isPublic:i.isPublic,templateConfig:i.templateConfig};E(S,y)}e==="production"&&j.pageUrlMapCache.set(a,d),o={...o,...d}}))}return o}getDocumentSize(){return N.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[n,s]of Object.entries(j.sharedInstances)){const o=s.getDocumentSize();e.push({projectId:n,sizeInBytes:o,sizeInMB:`${(o/(1024*1024)).toFixed(2)} MB`,activeConnections:s.conns.size})}return e}static startPeriodicCheck(){this.periodicCheckTimer||(this.periodicCheckTimer=setInterval(()=>{this.performPeriodicCheck()},this.PERIODIC_CHECK_INTERVAL),f.info(`[SiteState] periodic check started, interval: ${this.PERIODIC_CHECK_INTERVAL/(60*60*1e3)} hours`))}static stopPeriodicCheck(){this.periodicCheckTimer&&(clearInterval(this.periodicCheckTimer),this.periodicCheckTimer=void 0,f.info("[SiteState] periodic check stopped"))}static performPeriodicCheck(){const e=Object.keys(j.sharedInstances).length,n=[],s=[];for(const[o,r]of Object.entries(j.sharedInstances))r.conns.size===0?n.push({projectId:o,instance:r}):s.push({projectId:o,connections:r.conns.size});if(f.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${s.length}, without connections: ${n.length}`),n.length>0){f.info(`[SiteState] releasing ${n.length} instances without connections:`,n.map(r=>r.projectId));let o=0;for(const{projectId:r,instance:c}of n)try{f.info(`[SiteState] releasing instance due to periodic check: ${r}`),c.destroy(),o++}catch(a){f.error(`[SiteState] failed to release instance ${r} during periodic check:`,a)}f.info(`[SiteState] periodic check completed: ${o}/${n.length} instances released successfully`)}else e>0?f.debug("[SiteState] periodic check: all instances have active connections"):f.debug("[SiteState] periodic check: no instances exist")}}async function zn(t,e,n){if(!t||!w.existsSync(t)||!w.lstatSync(t).isFile())return null;let s=n[t];return s||(s=(async()=>{try{return(await qn({filePath:t,fileName:e}))?.data?.filename}catch(o){return f.error(`Failed to upload asset ${t}:`,o),null}})(),n[t]=s),s}const it=async(t,e)=>{const n=h.basename(t),s=await Te.call({name:Re,path:_.joinURL("/uploads",n),responseType:"stream",method:"GET"});if(s.status>=200&&s.status<400){const o=w.createWriteStream(e);await Jt.pipeline(s.data,o)}else throw new Error(`download asset failed ${s.status}`)},ct=async(t,e)=>{await Promise.all(t.map(async n=>{try{await it(n,h.join(e,h.basename(n)))}catch(s){f.error(`Failed to export assets: ${n}, ${s}`)}}))};function lt(t){return _e.test(t)?[t]:Y.test(t)?(Fe.lastIndex=0,Array.from(t.matchAll(Fe)).map(n=>n[1]).filter(n=>!!n)):[]}async function ee(t,e,n){const{getFilename:s,exportAssets:o}=n,r=h.join(e,s(t));if(w.mkdirSync(h.dirname(r),{recursive:!0}),w.writeFileSync(r,B.stringify(t)),o){const a=ae(t,p=>typeof p=="string"&&(_e.test(p)||Y.test(p))).map(p=>{const d=ve.default(t,p);return lt(d)}).flat().filter(Boolean);await ct(a,h.dirname(r))}}const Ae=new le.LRUCache({max:100,ttl:1*60*1e3});async function qe(t,e,n){const s=ae(t,a=>typeof a=="string"&&(_e.test(a)||Y.test(a))),o=tn.default(2),r=s.map(a=>o(async()=>{try{const p=ve.default(t,a),d=lt(p);for(const P of d){const g=h.basename(P),E=n.getFilePath(P,a),l=E?`${E}:${g}`:g,i=Ae.get(l);if(i){Y.test(p)||Le.default(t,a,i);return}const S=await zn(E,g,e);S&&(Y.test(p)||Le.default(t,a,S),Ae.set(l,S))}}catch(p){f.error(`Failed to process upload for path ${a.join(".")}:`,p.message||p.reason)}})),c=await Promise.allSettled(r);n.onFinish?.(c)}async function pt(t,{exportAssets:e,pageIds:n="all",componentIds:s="all",rawConfig:o,includeResources:r=!1,routeIds:c="all"}={}){const a=n==="all"?t.pageIds:n,p=Q.getComponentDependencies({state:t,pageIds:a,componentIds:s==="all"?Object.keys(t.components):s}),d=c==="all"?t.routeIds:c,P=u=>({id:u.id,name:u.name,isTemplateSection:u.isTemplateSection??!1,templateDescription:u.templateDescription,llmConfig:u.llmConfig,component:u.component,config:u.config,visibility:u.visibility,sections:u?.sectionIds?k(u?.sectionIds?.map(C=>{const D=u.sections?.[C];return D&&P(D)})):void 0}),g=(u,C)=>({id:u.id,createdAt:u.createdAt,updatedAt:u.updatedAt,publishedAt:u.publishedAt,isPublic:u.isPublic??!0,templateConfig:u.templateConfig,meta:u.locales?.[C]??{},sections:k(u.sectionIds.map(D=>{const U=u.sections[D];return U&&P(U)})),dataSource:Object.fromEntries(Object.entries(u.dataSource||{}).map(([D,U])=>[D,U?.[C]??{}]))}),E=u=>({id:u.id,createdAt:u.createdAt,updatedAt:u.updatedAt,publishedAt:u.publishedAt,path:u.path,handler:u.handler,isPublic:u.isPublic??!0,params:u.params??[],enabledGenerate:u.enabledGenerate??!1,displayTemplateId:u.displayTemplateId,dataSource:u.dataSource}),l=k(d.map(u=>{const C=t.routes[u];return C&&E(C)})),i=k(t.supportedLocales.map(u=>u.locale).flatMap(u=>a.map(C=>{const D=t.pages[C];return D&&{locale:u,slug:D.slug,page:g(D,u)}}))),S=ot(),A=h.join(S,"pages");w.mkdirSync(A,{recursive:!0});const y=h.join(S,"components");w.mkdirSync(y,{recursive:!0});const m=h.join(S,"routes");w.mkdirSync(m,{recursive:!0});for(const{locale:u,slug:C,page:D}of i)await ee(D,A,{getFilename:()=>`${ie(C)||"index"}.${u}.yml`,exportAssets:e});for(const u of l)await ee(u,m,{getFilename:()=>`${ie(u.path)||"index"}.yml`,exportAssets:e});for(const u of p){const C=t.components[u]?.data;C&&await ee(C,y,{getFilename:D=>`${D.name||"unnamed"}.${D.id}.yml`,exportAssets:e})}const I=h.join(S,".blocklet/pages/pages.config.yml");w.mkdirSync(h.dirname(I),{recursive:!0});const O={pages:k(a.map(u=>{const C=t.pages[u];return C&&{id:u,slug:C.slug}})),routes:k(d.map(u=>{const C=t.routes[u];return C&&{id:u,path:C.path}})),components:k(p.map(u=>{const C=t.components[u]?.data;return C&&{id:u,name:C.name}})),...r?{resources:{components:k(Object.keys(t.resources?.components||{}).filter(u=>p.includes(u)).map(u=>({id:u,name:t.resources?.components?.[u]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};w.writeFileSync(I,B.stringify(O));const T=h.join(S,"config.source.json");if(o&&w.writeFileSync(T,JSON.stringify(o)),r){const u=h.join(S,"resources"),C=h.join(u,"components");w.mkdirSync(C,{recursive:!0});for(const G of Object.keys(t?.resources?.components??{}).filter(L=>p.includes(L))){const L=t.resources?.components?.[G]?.component;L&&await ee(L,C,{getFilename:H=>`${H.name||"unnamed"}.${H.id}.yml`,exportAssets:e})}const D=h.join(S,"chunks");w.mkdirSync(D,{recursive:!0});const U=Yn();for(const G of Object.keys(t?.resources?.components??{}).filter(L=>p.includes(L))){const L=t.resources?.components?.[G]?.component;if(L&&L.renderer?.type==="react-component"){const H=L.renderer?.chunks??[];if(H?.length>0)for(const me of H){const ke=h.join(D,me),he=U?.[me];try{he&&w.existsSync(he)&&!w.existsSync(ke)&&w.copyFileSync(he,ke)}catch(Et){f.error(`copy chunk ${me} error`,Et.message)}}}}}return S}async function ut(t,{importAssets:e,includeResources:n}={}){if(!w.existsSync(t))return null;let s,o=!1;try{w.lstatSync(t).isDirectory()?s=t:/\.(tgz|gz|tar)$/.test(t)&&(o=!0,s=ot(),await Kt.x({file:t,C:s}));const r=se.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s,absolute:!0}).at(0),c=r&&h.join(h.dirname(r),"../../pages"),a=r&&h.join(h.dirname(r),"../../components"),p=r&&h.join(h.dirname(r),"../../routes");if(!r)return null;const d=B.parse(w.readFileSync(r).toString()),P=(y,m,I)=>{let O=h.join(y,`${m}${I?`.${I}`:""}.yml`);return(!w.existsSync(O)||!w.lstatSync(O).isFile())&&(O=h.join(y,m,`index${I?`.${I}`:""}.yml`),!w.existsSync(O)||!w.lstatSync(O))?null:B.parse(w.readFileSync(O).toString())},g=(y,m)=>{try{const I=se.globSync(`*.${m}.yml`,{cwd:y,absolute:!0})[0];return I?B.parse(w.readFileSync(I).toString()):null}catch(I){f.error("parse component error",I)}return null},E=(y,m)=>{let I=h.join(y,`${m}.yml`);return(!w.existsSync(I)||!w.lstatSync(I).isFile())&&(I=h.join(y,m,"index.yml"),!w.existsSync(I)||!w.lstatSync(I))?null:B.parse(w.readFileSync(I).toString())},l=k(d.pages.map(({slug:y})=>{const m=k(d.supportedLocales.map(({locale:T})=>{const u=c?P(c,ie(y),T):void 0;if(u)return{locale:T,page:u};const C=c?P(c,y,T):void 0;return C&&{locale:T,page:C}})),I=m[0]?.page;if(!I)return null;const O=I.sections.map(Lt.unzipSection);return{id:I.id||Me.nextId(),createdAt:I.createdAt,updatedAt:I.updatedAt,publishedAt:I.publishedAt,isPublic:I.isPublic??!0,templateConfig:I.templateConfig,slug:y,sections:Object.fromEntries(O.map(T=>[T.id,T])),sectionIds:O.map(T=>T.id),locales:Object.fromEntries(m.map(({locale:T,page:u})=>[T,u.meta])),dataSource:I.dataSource?Object.fromEntries([...new Set(m.flatMap(({page:T})=>Object.keys(T.dataSource??{})))].map(T=>[T,Object.fromEntries(m.map(({locale:u,page:C})=>{const D=C.dataSource?.[T];return[u,D||{}]}))])):Object.fromEntries([...new Set(m.flatMap(({page:T})=>T.sections.map(u=>u.id)))].map(T=>[T,Object.fromEntries(m.map(({locale:u,page:C})=>{const D=C.dataSource?.[T];if(D)return[u,D];const U=C.sections.find(G=>G.id===T);return[u,U?.properties||{}]}))]))}})),i=k(d?.routes?.map(({path:y})=>{const m=p?E(p,ie(y)):void 0;return{...m,id:m?.id||Me.nextId(),createdAt:m?.createdAt??new Date().toISOString(),updatedAt:m?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:m?.path??`/${m?.id}`,params:m?.params,handler:m?.handler??"Pages Kit",isPublic:m?.isPublic??!0,enabledGenerate:m?.enabledGenerate??!1,displayTemplateId:m?.displayTemplateId??void 0,dataSource:m?.dataSource??{}}})??[]),S=a?k(d.components?.map(({id:y})=>g(a,y))??[]):[];if(e){const y=(...m)=>{f.info(`[${o?h.basename(t):h.basename(h.join(t,"../../../../"))}] importAssets:`,...m)};try{y("wait image-bin api ready"),await nn.default({resources:[`${Te.getComponentWebEndpoint(sn)}/api/sdk/uploads`],validateStatus:O=>O>=200&&O<=500}),y("image-bin api is ready");const m={},I={};y("start to upload assets"),await Promise.allSettled([qe(S,m,{getFilePath:O=>a&&h.join(a,O),onFinish:O=>{y(`upload ${O.length} component assets`)}}),qe(l,I,{getFilePath:(O,T)=>{const u=ve.default(l,T.slice(0,1));return c&&h.join(c,h.dirname(u.slug),O)},onFinish:O=>{y(`upload ${O.length} page assets`)}})]),y("upload assets done"),Ae.clear(),global.gc&&global.gc()}catch(m){y("Error during asset import:",m)}}const A={};if(n){const y=r&&h.join(h.dirname(r),"../../resources/components"),m=k(d.resources?.components?.map(({id:I})=>g(y,I))??[]);m.length>0&&(A.components=Object.fromEntries(m.map((I,O)=>[I.id,{index:O,component:I}])))}return{supportedLocales:d.supportedLocales,pageIds:l.map(y=>y.id),components:Object.fromEntries(S.map((y,m)=>[y.id,{index:m,data:y}])),pages:Object.fromEntries(l.map(y=>[y.id,y])),config:d.config||{},resources:A,routeIds:i.map(y=>y.id),routes:Object.fromEntries(i.map(y=>[y.id,y])),dataSourceIds:[],dataSources:{}}}finally{o&&s&&w.rmSync(s,{force:!0,recursive:!0})}}async function Oe(t,e,{routes:n,mergeMode:s="byUpdateTime",deleteRoutes:o=!1,publishMode:r=void 0}={}){try{r&&Ze(r)}catch(E){f.error("clear preload page cache error",{error:E})}const{pages:c,pageIds:a,routeIds:p,routes:d,supportedLocales:P}=t;if(r==="production"){let E=n??[],l=null;for(const i of p??[]){const S=d?.[i];if(S?.params&&S?.params.length>0&&S?.paramsOptions&&S?.paramsOptions.length>0){const A=ne.generateParamCombinations({basePath:S.path,params:S.params,routeId:S.id,paramsOptions:S.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),y=Object.fromEntries(A.map(m=>[`${i}-${m.paramOptionIds.join("-")}`,m]));l={...l||{},...y},n||(E=[...E,...A.map(m=>`${i}-${m.paramOptionIds.join("-")}`)])}else n||E.push(i)}f.info("routeIds to be published: ",E);for(const i of E){let S=i;if(S.includes("-")){const[m]=S.split("-");S=m}const A=d?.[S];if(!A){const m=e.pageIds.indexOf(S);m!==-1&&o&&(e.pageIds.splice(m,1),delete e.pages[S]);for(const I of e.pageIds)I.includes(`${S}-`)&&(e.pageIds.splice(e.pageIds.indexOf(I),1),delete e.pages[I]);f.info("delete main route page",S);continue}if(i.includes("-")&&!l?.[i]){const m=e.pageIds.indexOf(i);m!==-1&&o&&(e.pageIds.splice(m,1),delete e.pages[i]),f.info("delete page",i);continue}if(!A.displayTemplateId){f.info("no display template",i);continue}const y=c[A.displayTemplateId];if(!y){f.info("no template page",i);continue}if(e.pageIds.includes(i)){if(f.info("has need update page",i),s==="replace")e.pages[i]=Se({page:y,route:A,state:t,routeId:i,routePathInfo:l?.[i]}),f.info("replace page",i);else if(s==="byUpdateTime"){const m=e.pages[A.id];(!m||A.updatedAt&&A.updatedAt>m.updatedAt)&&(e.pages[i]=Se({page:y,route:A,state:t,routeId:i,routePathInfo:l?.[i]}),f.info("replace page by update time",i))}}else e.pageIds.push(i),e.pages[i]=Se({page:y,route:A,state:t,routeId:i,routePathInfo:l?.[i]}),f.info("add page",i)}if(o&&!n)for(const i of e.pageIds)E?.includes(i)||(delete e.pages[i],f.info("delete page",i)),e.pageIds=[...e.pageIds].filter(S=>E?.includes(S))}else{for(const E of a){const l=c[E];if(l)if(e.pageIds.includes(l.id)){if(s==="replace")e.pages[l.id]=l;else if(s==="byUpdateTime"){const i=e.pages[l.id];(!i||l.updatedAt&&l.updatedAt>i.updatedAt)&&(e.pages[l.id]=l)}}else e.pageIds.push(l.id),e.pages[l.id]=l}for(const E of p){const l=d[E];if(l)if(e.routeIds.includes(l.id)){if(s==="replace")e.routes[l.id]=l;else if(s==="byUpdateTime"){const i=e.routes[l.id];(!i||l.updatedAt&&l.updatedAt>i.updatedAt)&&(e.routes[l.id]=l)}}else e.routeIds.push(l.id),e.routes[l.id]=l}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...Zt.default(P)),o)for(const E of Object.keys(e.components))delete e.components[E];let g=JSON.parse(JSON.stringify(t.components));g=Object.fromEntries(await Promise.all(Object.entries(g).map(async([E,l])=>{const i=await dt(l?.data);return[E,{...l,data:i}]}))),Object.assign(e.components,g),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),je.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const dt=ue(async t=>{if(!je.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e,PROPERTIES_SCHEMA:n}=t?.renderer||{};if(n||e&&e.includes("PROPERTIES_SCHEMA"))try{const s=await st(e??"","PROPERTIES_SCHEMA",t.id,n);s&&s.length>0&&t&&(t.properties={},s.forEach((o,r)=>{t?.properties&&(t.properties[o.id]={index:r,data:o})}))}catch(s){f.error("getPropertiesFromCode error",{componentId:t.id,name:t.name},{error:s})}}return t},{subdir:"getPropertiesFromCode"});let ce,W,de,fe;const ft=()=>Te.getResources({types:[{did:Re,type:Pe},{did:xn,type:Pe}]}),Yn=()=>{const t=ft(),e={};return t.forEach(n=>{const s=se.globSync("**/.blocklet/pages/pages.config.yml",{cwd:n.path,absolute:!0}).at(0),o=s&&h.join(h.dirname(s),"../../chunks");if(o&&w.existsSync(o)){const r=w.readdirSync(o);for(const c of r)e[c]=h.join(o,c)}}),e};function mt(){return ce=(async()=>{const t=ft();W=(await Promise.all(t.map(async n=>{const s=n.path?await ut(n.path,{importAssets:!1}):void 0;return s?{blockletId:n.did,state:s,blockletTitle:n.title}:void 0}))).filter(n=>!!n),de=W.reduce((n,s)=>Object.assign(n,Object.fromEntries(Object.values(s.state.pages).map(o=>o?[o?.id,{page:o,blockletId:s.blockletId}]:[]))),{});const e=W.reduce((n,s)=>Object.assign(n,Object.fromEntries(Object.values(s.state.components).map(o=>[o.data.id,{blockletId:s.blockletId,component:o.data}]))),{});fe=Object.fromEntries(await Promise.all(Object.entries(e).map(async([n,s])=>{const o=await dt(s.component);return[n,{...s,component:o}]})))})(),ce}function ht(t){const e=He.default(async()=>{await mt().catch(n=>{f.error("load resource states error",{error:n})}),await t?.({states:W,pages:de,components:fe})},3e3,{leading:!1,trailing:!0});return e(),b.default.events.on(b.default.Events.componentAdded,e),b.default.events.on(b.default.Events.componentRemoved,e),b.default.events.on(b.default.Events.componentStarted,e),b.default.events.on(b.default.Events.componentStopped,e),b.default.events.on(b.default.Events.componentUpdated,e),b.default.events.on(Ce,e),()=>{b.default.events.off(b.default.Events.componentAdded,e),b.default.events.off(b.default.Events.componentRemoved,e),b.default.events.off(b.default.Events.componentStarted,e),b.default.events.off(b.default.Events.componentStopped,e),b.default.events.off(b.default.Events.componentUpdated,e),b.default.events.off(Ce,e)}}const gt=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),yt=globalThis;yt[gt]?.();yt[gt]=ht(async({pages:t,components:e})=>{const n=await j.getProjectIds();f.info(`start update resource states projects(${n.length})`,n),await Promise.race([new Promise(s=>{setTimeout(()=>{s({})},30*1e3)}),Promise.all(n.map(async s=>{St({projectId:s,pages:t,components:e})}))]).catch(s=>{f.error("update resource states failed:",s)})});j.startPeriodicCheck();process.on("beforeExit",()=>{j.stopPeriodicCheck()});process.on("SIGINT",()=>{j.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{j.stopPeriodicCheck(),process.exit(0)});async function St({projectId:t,pages:e,components:n}){const s=j.sharedInstances[t];if(!s){f.info(`projectId: ${t} not found in sharedInstances`);return}if(s.syncedStore.resources.pages=e,(await M.findByPk(t))?.useAllResources)s.syncedStore.resources.components=n;else{const c=(await De.findAll({where:{projectId:t}})).map(p=>p.componentId),a=Object.fromEntries(Object.entries(n||{}).filter(([p])=>c.includes(p)));s.syncedStore.resources.components=a}f.info(`update [${t}] resource states:`,{pages:Object.keys(s.syncedStore.resources.pages||{}).length,components:Object.keys(s.syncedStore.resources.components||{}).length})}async function Wn(){f.info("trigger reload all project resource"),b.default.events.emit(Ce)}async function wt({ensureLoaded:t=!0}={}){return t&&(ce??=mt(),await ce),{states:W,pages:de,components:fe}}b.default.events.on(b.default.Events.envUpdate,()=>{j.pageUrlMapCache.clear(),f.info("clear all page url map cache")});exports.COMPONENT_DID=Re;exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=Qe;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=be;exports.PUBLISH_MODES=Kn;exports.Project=M;exports.RESOURCE_TYPE=Pe;exports.SITE_STATE_PATH=K;exports.STATE_MODES=Jn;exports.SiteState=j;exports.clearPreloadComponentsCache=Xe;exports.clearPreloadComponentsCacheByMode=Ze;exports.defaultState=at;exports.downloadAsset=it;exports.downloadAssets=ct;exports.fromPackage=ut;exports.getComponentFromState=X;exports.getComponentFromStateByName=Dn;exports.getExportSchemaValueFromCode=st;exports.getMultiTenantAllProjectAccessPassports=rn;exports.getPreloadComponent=tt;exports.getPreloadComponents=Tn;exports.getPreloadComponentsCacheKey=et;exports.getResourceStates=wt;exports.initPackResourceStates=ht;exports.isMultiTenant=on;exports.logger=f;exports.mergeState=Oe;exports.skipCompileComponent=_n;exports.toPackage=pt;exports.triggerReloadAllProjectResource=Wn;
@@ -1 +0,0 @@
1
- "use strict";const L=require("react/jsx-runtime"),T=require("@mui/material"),j=require("ufo"),Y=require("@blocklet/js-sdk"),Z=require("lodash/isEmpty"),H=require("yaml"),ee=require("@arcblock/ux/lib/Locale/context"),b=require("@blocklet/pages-kit/utils/common"),te=require("@blocklet/pages-kit/utils/page-model"),J=require("@syncedstore/core"),oe=require("@syncedstore/react"),ne=require("ahooks"),C=require("immer"),re=require("lodash/cloneDeep"),se=require("lodash/debounce"),l=require("react"),G=require("react-router-dom"),ce=require("y-indexeddb"),ae=require("y-websocket"),ie=require("yjs");require("@blocklet/pages-kit/types");const O=t=>t&&t.__esModule?t:{default:t};function de(t){if(t&&t.__esModule)return t;const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const u in t)if(u!=="default"){const p=Object.getOwnPropertyDescriptor(t,u);Object.defineProperty(n,u,p.get?p:{enumerable:!0,get:()=>t[u]})}}return n.default=t,Object.freeze(n)}const ue=O(Z),le=de(H),pe=O(J),U=O(re),B=O(se);function F(){const{pathname:t}=window.location,u=t.match(/\/admin\/(maker|previewer)\/([^/]+)/)?.[2],p=window.__PROJECT_ID__;if(!u&&!p)throw new Error("Unable to get projectId from pathname");return u||p}function fe(t){return`${t}:pages:version`}function ge(t,n){return n==="yaml"?ue.default(t)?"":le.stringify(t,{indent:2}):n==="json"?JSON.parse(JSON.stringify(t||{})):n==="array"?JSON.parse(JSON.stringify(t||[])):t}function me({error:t}){return L.jsx(T.Box,{children:L.jsx(T.Alert,{severity:"error",children:t.message})})}const E=window.blocklet?.prefix||"/",_=Y.createAxios({timeout:200*1e3}),Se=window.location.protocol==="https:"?"wss":"ws",Pe=t=>j.joinURL(`${Se}://${window.location.hostname}`,E,`api/${t}/ws/pages`),Ie="z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9";blocklet?.componentMountPoints.find(t=>t.did===Ie)?.mountPoint||j.joinURL(E,"/image-bin");function we(t){return t&&!/^(https?:\/\/|\/)/.test(t)?window.location.origin+j.joinURL(E,"uploads",t):t}const ye=window.innerWidth<=750;function he(t,n,u){if(!t||/\.gif/.test(t))return t;const p=(ye?n/1.5:n)*(u==="quality"?1.5:1);return Ce(t,{imageFilter:"resize",w:p,f:"webp"})}function Ce(t,n){return!t||!n?t:j.withQuery(t,n)}async function je(t){return _.get(`/api/projects/${t}`).then(n=>n.data)}async function ve(t){return _.post(`/api/projects/${t.id}/update`,t).then(n=>n.data)}const be=500,W=l.createContext(null);function xe({url:t,name:n,children:u,waitingSynced:p}){const[w,h]=l.useState(!1),{locale:g}=ee.useLocaleContext(),I=k(),M=`${I}:MakerLocalState`,e=`${I}:${n}`,[o,s]=ne.useLocalStorageState(M,{defaultValue:{},listenStorageChange:!0}),r=l.useRef(o);r.current=o;const i=l.useMemo(()=>pe.default({dataSourceIds:[],dataSources:{},pages:{},pageIds:[],routes:{},routeIds:[],components:{},supportedLocales:[],config:{},resources:{}}),[]),c=l.useMemo(()=>J.getYjsDoc(i),[i]);l.useMemo(()=>new ce.IndexeddbPersistence(e,c),[e,c]);const a=l.useMemo(()=>new ae.WebsocketProvider(t,e,c,{params:{},resyncInterval:5*60*1e3}),[t,e,c]),d=l.useCallback(()=>{a&&(a.disconnect(),a.connect())},[a]),m=l.useMemo(()=>new ie.UndoManager([c.getArray("pageIds"),c.getMap("pages"),c.getArray("supportedLocales"),c.getMap("config"),c.getMap("dataSources"),c.getArray("dataSourceIds"),c.getArray("routeIds"),c.getMap("routes")],{doc:c}),[c]),[v,x]=l.useState(null),[R,N]=l.useState(!1),[A,D]=l.useState(void 0),q=l.useCallback(async()=>{if(I){N(!0);try{const f=await je(I);x(f)}catch(f){console.error("Failed to fetch project:",f)}finally{N(!1)}}},[I]),$=l.useCallback(async(f,S)=>{if(D(void 0),!!I){S?.optimisticUpdate&&v&&x(P=>({...P,...f}));try{const P=await ve({...f});x(P)}catch(P){console.error("Failed to update project:",P),S?.optimisticUpdate&&x(v),D(P?.response?.data)}}},[I,v]);l.useEffect(()=>{I&&q()},[I,q]);const X=l.useMemo(()=>({doc:c,state:i,localState:{...o,currentLocale:g},setLocalState:f=>s(typeof f=="function"?S=>f(S??{}):f),undoManager:m,projectState:{project:v,isLoadingProject:R,error:A},updateProject:$,forceSync:d}),[c,i,JSON.stringify(o),s,m,v,R,$,A,g,d]);return l.useEffect(()=>{m.on("stack-item-added",({stackItem:f})=>{const{currentPageId:S,currentLocale:P,pages:y}=r.current;f.meta.set("localState",{currentPageId:S,currentLocale:P,pages:y})}),m.on("stack-item-popped",({stackItem:f})=>{const S=f.meta.get("localState");S&&s(P=>({...P,...S}))})},[m,s]),l.useEffect(()=>{a.awareness.setLocalState(o)},[a,o]),l.useEffect(()=>{a.once("synced",()=>h(!0));const f=()=>{s(y=>({...y,networkStatus:void 0}))},S=()=>{s(y=>({...y,networkStatus:"offline"}))},P=B.default(({status:y})=>{y==="connected"?f():y==="disconnected"&&S()},be);return a.on("status",P),window.addEventListener("online",f),window.addEventListener("offline",S),()=>{a.off("status",P),window.removeEventListener("online",f),window.removeEventListener("offline",S)}},[a,s]),p&&!w?null:L.jsx(W.Provider,{value:X,children:u})}const V=()=>{const t=l.useContext(W);if(!t)throw new Error("Context is null");const n=oe.useSyncedStore(t.state),{setLocalState:u,localState:p}=t,w=G.useNavigate(),h=k(),g=l.useMemo(()=>({get currentPage(){const{localState:{currentPageId:e}}=t;return e?n.pages[e]:void 0},get currentSection(){const{localState:{currentPageId:e,...o}}=t;if(!e)return;const s=o.pages?.[e]?.currentSectionId;if(s)return n.pages[e]?.sections[s]??this.currentPageModel?.getComponentById(s)?.model},get currentSectionProperties(){const{localState:{currentPageId:e,...o}}=t;if(!e)return;const s=o.pages?.[e]?.currentSectionId;if(!s)return;const r=n.pages[e]?.dataSource?.[s];if(!r)return;const{currentLocale:i}=this.currentLocaleMap;return i?r[i]:void 0},get currentSectionPropertiesWithFallback(){const{localState:{currentPageId:e,...o}}=t;if(!e)return;const s=o.pages?.[e]?.currentSectionId;if(!s)return;const r=n.pages[e]?.dataSource?.[s];if(!r)return;const{currentLocale:i,defaultLocale:c,fallbackLocale:a}=this.currentLocaleMap;if(i&&r[i])return r[i];if(c&&r[c])return r[c];if(a&&r[a])return r[a]},get currentLocaleMap(){const{localState:{currentLocale:e},state:{supportedLocales:o,config:{defaultLocale:s}}}=t;return{currentLocale:e,defaultLocale:s,fallbackLocale:o?.[0]?.locale??"en"}},get currentRoute(){const{localState:{currentRouteId:e}}=t;return e?n.routes?.[e]:void 0},get currentPageModel(){const e=this.currentPage??null;if(e)return te.getPageTemplateModel(e,!1)}}),[JSON.stringify(p),n]),I=l.useMemo(()=>({setCurrentSectionId:(e,o)=>{e===p.currentPageId&&o===p.pages?.[e]?.currentSectionId||(w(j.joinURL("/admin/maker",h??"","pages",e)),u(s=>C.produce(s,r=>{r.currentPageId=e,r.currentComponentId=void 0,o!==void 0&&(r.pages??={},r.pages[e]??={},r.pages[e].currentSectionId=o??void 0),o?window.sessionStorage.setItem("iframe_show_id",`"${o}"`):window.sessionStorage.removeItem("iframe_show_id")})))},setCurrentComponentId:e=>{e!==p.currentComponentId&&(w(j.joinURL("/admin/maker",h??"","components",e)),u(o=>C.produce(o,s=>{s.currentComponentId=e})))},setCurrentRouteId:({routeId:e,dynamicParams:o})=>{u(s=>C.produce(s,r=>{r.currentRouteId=e,r.currentDynamicParams=o}))},setCustomComponentPreviewerProperties:(()=>{const e={};let o="";const s=B.default(()=>{u(r=>C.produce(r,i=>{i.customComponentPreviewerProperties??={},i.customComponentPreviewerProperties[o]={...i.customComponentPreviewerProperties[o],...U.default(e[o])},delete e[o]}))},5);return(r,i)=>{const c=e[r]??{};Object.assign(c,i),e[r]=c,o=r,s()}})(),setRouteGenerateProcess:e=>{u(o=>C.produce(o,s=>{e?s.routeGenerateProcess={...s.routeGenerateProcess,...e}:s.routeGenerateProcess={}}))},resetRouteGenerateProcess:()=>{u(e=>C.produce(e,o=>{o.routeGenerateProcess={progress:"complete"}}))}}),[u,w,h,g]),M=l.useMemo(()=>({addPage:(e,o)=>{const s=e?.id??b.nextId(),r={...e,id:s,createdAt:e?.createdAt??new Date().toISOString(),updatedAt:e?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),slug:e?.slug??`/${s}`,sections:e?.sections??{},sectionIds:e?.sectionIds??[],isPublic:e?.isPublic??!0,templateConfig:e?.templateConfig??{isTemplate:e?.templateConfig?.isTemplate??!0,displayTemplateId:e?.templateConfig?.displayTemplateId??void 0,dataSourceIds:e?.templateConfig?.dataSourceIds??void 0,dataSourceParameters:e?.templateConfig?.dataSourceParameters??{},enabledGenerate:e?.templateConfig?.enabledGenerate??!1,agentId:e?.templateConfig?.agentId??void 0}};return t.doc.transact(()=>{n.pages[r.id]=r,n.pageIds.splice(o??n.pageIds.length,0,r.id)}),r},addRoute:(e,o)=>{const s=e?.id??b.nextId(),r={...e,id:s,createdAt:e?.createdAt??new Date().toISOString(),updatedAt:e?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:e?.path??`/${s}`,handler:e?.handler??"Pages Kit",isPublic:e?.isPublic??!0,params:e?.params??[],enabledGenerate:e?.enabledGenerate??!1,displayTemplateId:e?.displayTemplateId??void 0,dataSource:e?.dataSource??{}};return t.doc.transact(()=>{n.routes??={},n.routeIds??=[],n.routes[r.id]=r,n.routeIds.splice(o??n.routeIds.length,0,r.id)}),r},deleteRoute:e=>{if(!e)return;const o=n.routeIds?.indexOf(e);o!==void 0&&o!==-1&&t.doc.transact(()=>{n.routeIds?.splice(o,1),delete n.routes?.[e]})},deletePage:e=>{const o=n.pageIds.indexOf(e);o!==-1&&t.doc.transact(()=>{n.pageIds.splice(o,1),delete n.pages[e]})},movePage:(e,o)=>{const{pageIds:s}=n,r=s.indexOf(e);r>=0&&s.splice(o,0,...s.splice(r,1))},addSection:(e,o,s,r)=>{const i=n.pages[e];if(!i)throw new Error(`Page ${e} is not exists`);const c={...o,id:o.id??b.nextId(),isTemplateSection:o.isTemplateSection??!0,llmConfig:o.llmConfig??{}},a=U.default(c.locales);return delete c.locales,t.doc.transact(()=>{if(r&&r.component==="layout-block"){const d=g.currentPageModel?.getComponentById(r.id);d&&(d.model.sections??={},d.model.sections[c.id]=c,d.model.sectionIds??=[],d.model.sectionIds.push(c.id))}else i.sections[c.id]=c,i.sectionIds.splice(s??i.sectionIds.length,0,c.id);a&&(i.dataSource??={},i.dataSource[c.id]=a)}),c},deleteSection:(e,o)=>{const s=n.pages[e];if(!s)throw new Error(`Page ${e} is not exists`);t.doc.transact(()=>{const r=[],i=g.currentPageModel?.getComponentById(o),c=i?.parent;if(i&&(r.push(i.model.id,...i.all().map(a=>a.model.id)),c?.model.component==="layout-block")){const a=c.model.sectionIds?.indexOf(o);a!==void 0&&a!==-1&&(c.model.sectionIds?.splice(a,1),delete c.model.sections?.[o]),c.model.config?.gridSettings&&Object.keys(c.model.config.gridSettings).forEach(d=>{try{delete c.model.config.gridSettings[d]?.[o]}catch{}}),c.model.config?.backgroundSectionId===o&&(c.model.config.backgroundSectionId=void 0)}r.forEach(a=>{const d=s.sectionIds.indexOf(a);d!==-1&&s.sectionIds.splice(d,1),s.sections[a]&&delete s.sections[a],s.dataSource?.[a]&&delete s.dataSource?.[a]})})},lockSection:(e,o)=>{if(!n.pages[e])throw new Error(`Page ${e} is not exists`);const r=g.currentPageModel?.getComponentById(o)?.model;r&&(r.locked=!r.locked)},toggleSectionVisibility:(e,o,s)=>{if(!n.pages[e])throw new Error(`Page ${e} is not exists`);const i=g.currentPageModel?.getComponentById(o)?.model;i&&(i.visibility=s)},moveSection:(e,o,s,r)=>{if(!n.pages[e])throw new Error(`Page ${e} is not exists`);if(r&&r!==o){const c=g.currentPageModel?.getComponentById(o),a=g.currentPageModel?.getComponentById(r),d=c?.parent,m=a?.parent;m&&d&&m?.model?.id===d?.model?.id?t.doc.transact(()=>{d.model.sectionIds.splice(c.getIndex(),1),d.model.sectionIds.splice(a.getIndex(),0,o)}):m&&d&&m?.model?.id!==d?.model?.id&&o!==r&&!c?.model?.sectionIds?.includes(r)&&t.doc.transact(()=>{m.model.sections[o]=JSON.parse(JSON.stringify(c.model)),m.model.sectionIds.splice(a.getIndex(),0,o),d.model.sectionIds.splice(c.getIndex(),1),delete d.model.sections[o]})}},copySection:(e,o)=>{if(!n.pages[e])throw new Error(`Page ${e} is not exists`);const r=g.currentPageModel?.getComponentById(o);if(!r?.model)throw new Error(`Section ${o} is not exists`);const i=JSON.parse(JSON.stringify(r.model)),c=Le(i),a=c.id,d=r?.parent;return d&&(d.model.sections[a]=c,d.model.sectionIds.push(a),I.setCurrentSectionId(e,a),g.currentPage?.dataSource?.[o]&&(g.currentPage.dataSource[a]=JSON.parse(JSON.stringify(g.currentPage.dataSource[o])))),c},addDataSource:e=>{const o=e.id??b.nextId(),s={...e??{},id:o,createdAt:new Date().toISOString()};return t.doc.transact(()=>{n.dataSourceIds??=[],n.dataSources??={},n.dataSourceIds.push(o),n.dataSources[o]=s}),n.dataSources[o]},deleteDataSource:e=>{const o=n.dataSourceIds.indexOf(e);o!==-1&&t.doc.transact(()=>{n.dataSourceIds.splice(o,1),delete n.dataSources[e]})}}),[n,t.doc,g]);return{...t,state:n,actions:M,localActions:I,...g}},k=()=>{const{projectId:t}=G.useParams();return t??F()??""},Oe=()=>window.__PROJECT_SLUG__??"";function z(t){const{resources:n}=t;if(!n.components)return{};const u={};return window?.blocklet?.componentMountPoints?.forEach(p=>{u[p.did]=p}),Object.fromEntries(Object.entries(n.components).map(([p,{blockletId:w,component:h}])=>[p,{data:h,blockletId:w,blockletTitle:u[w]?.title||w}]))}function K(t){const{components:n}=t;return n||{}}function Q(t){return{...z(t),...K(t)}}const Me=()=>Q(V().state);function Le(t){const n=JSON.parse(JSON.stringify(t)),u=b.nextId();return{...n,id:u}}exports.ErrorView=me;exports.StoreProvider=xe;exports.api=_;exports.autoResizeImage=he;exports.getAllComponents=Q;exports.getCustomComponents=K;exports.getImageAbsoluteUrl=we;exports.getProjectIdFromPathnameOrWindow=F;exports.getProjectPageVersionKey=fe;exports.getResourceComponents=z;exports.getWssURL=Pe;exports.transformValue=ge;exports.useAllComponents=Me;exports.useProjectId=k;exports.useProjectSlug=Oe;exports.useStore=V;