@blocklet/pages-kit-inner-components 0.5.56 → 0.6.0

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 (45) hide show
  1. package/lib/cjs/add-component.js +21 -23
  2. package/lib/cjs/chunks/{draft-data-CuZfaQ4s.js → draft-data-D44_IEV2.js} +1 -1
  3. package/lib/cjs/chunks/home-BYk01EUy.js +39 -0
  4. package/lib/cjs/chunks/index-BRgYwvuv.js +475 -0
  5. package/lib/cjs/chunks/publish-button-C8XPA4g_.js +1 -0
  6. package/lib/cjs/chunks/session-BRtsDvA-.js +1 -0
  7. package/lib/cjs/chunks/site-state-gSkcvhcV.js +57 -0
  8. package/lib/cjs/chunks/state-B6BF5wJ-.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 +7 -7
  12. package/lib/cjs/resources.js +1 -1
  13. package/lib/cjs/setting.js +3 -3
  14. package/lib/cjs/site-state.js +1 -1
  15. package/lib/cjs/theme.js +1 -1
  16. package/lib/es/add-component.js +385 -2356
  17. package/lib/es/chunks/{draft-data-CWM--ooz.js → draft-data-CafrGKeh.js} +1 -1
  18. package/lib/es/chunks/home-DW8SdyfO.js +594 -0
  19. package/lib/es/chunks/index-D5gXPe_7.js +2326 -0
  20. package/lib/es/chunks/publish-button-XSZrDaTQ.js +498 -0
  21. package/lib/es/chunks/session-C72Dq8zg.js +19 -0
  22. package/lib/es/chunks/site-state-W2H7XCSQ.js +2077 -0
  23. package/lib/es/chunks/state-0gvZF3k2.js +573 -0
  24. package/lib/es/components.js +1 -1
  25. package/lib/es/home.js +5 -5
  26. package/lib/es/project-html.js +131 -141
  27. package/lib/es/resources.js +106 -107
  28. package/lib/es/setting.js +1772 -1489
  29. package/lib/es/site-state.js +1 -1
  30. package/lib/es/theme.js +50 -51
  31. package/package.json +46 -47
  32. package/lib/cjs/chunks/array-BqHuYyfx.js +0 -475
  33. package/lib/cjs/chunks/config-string-4bVR9Vc8.js +0 -1
  34. package/lib/cjs/chunks/home-BMjMYgq3.js +0 -38
  35. package/lib/cjs/chunks/publish-button-CGfGqrov.js +0 -1
  36. package/lib/cjs/chunks/session-BA7Qrcia.js +0 -1
  37. package/lib/cjs/chunks/site-state-BtZ8o3J2.js +0 -57
  38. package/lib/cjs/chunks/state-BVdbNJCA.js +0 -1
  39. package/lib/es/chunks/array-c6HYTLze.js +0 -2224
  40. package/lib/es/chunks/config-string-WMpFf-7V.js +0 -88
  41. package/lib/es/chunks/home-PDsc59QG.js +0 -566
  42. package/lib/es/chunks/publish-button-Ds7OBvxV.js +0 -462
  43. package/lib/es/chunks/session-CVblGhSp.js +0 -21
  44. package/lib/es/chunks/site-state-D-moj9fA.js +0 -2125
  45. package/lib/es/chunks/state-l--dTdHq.js +0 -603
@@ -0,0 +1,57 @@
1
+ "use strict";const ht=require("@blocklet/pages-kit/builtin/utils"),se=require("@blocklet/pages-kit/types"),W=require("@blocklet/pages-kit/utils/property"),Q=require("@blocklet/quickjs"),gt=require("@blocklet/sdk/lib/config"),pe=require("lru-cache"),He=require("node-fetch"),L=require("ufo"),B=require("crypto"),yt=require("@blocklet/logger"),g=require("fs"),h=require("path"),St=require("lodash/isNil"),Et=require("@blocklet/pages-kit/utils/builtin"),Ge=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),je=require("@blocklet/sdk/lib/component"),wt=require("autoprefixer"),It=require("esbuild"),bt=require("postcss"),Pt=require("tailwindcss"),Ct=require("typescript"),H=require("@syncedstore/core"),Ot=require("yjs"),At=require("@blocklet/pages-kit/utils/data-source"),oe=require("@blocklet/pages-kit/utils/route"),Tt=require("lodash"),Ne=require("@blocklet/pages-kit/utils/common"),jt=require("@blocklet/pages-kit/utils/page-model"),Dt=require("@reactivedata/reactive"),Ie=require("glob"),_t=require("lib0/decoding"),kt=require("lib0/encoding"),vt=require("lodash/cloneDeep"),Rt=require("lodash/debounce"),xt=require("lodash/get"),Lt=require("lodash/isEmpty"),Nt=require("lodash/pick"),Mt=require("lodash/set"),$t=require("lodash/union"),Ut=require("p-limit"),Ft=require("stream/promises"),qt=require("tar"),Bt=require("wait-on"),K=require("y-protocols/awareness"),ye=require("y-protocols/sync"),Ht=require("yaml"),D=require("sequelize");require("sqlite3");require("@blocklet/pages-kit/types/state");const v=t=>t&&t.__esModule?t:{default:t};function Z(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 P=v(gt),Gt=v(He),Vt=v(yt),Ve=v(h),Jt=v(St),Kt=v(wt),zt=Z(It),Yt=v(bt),Wt=v(Pt),x=v(Ct),$=Z(Ot),Se=Z(_t),k=Z(kt),Qt=v(vt),Je=v(Rt),De=v(xt),Ke=v(Lt),Xt=v(Nt),Me=v(Mt),Zt=v($t),en=v(Ut),tn=v(Bt),V=Z(Ht);P.default.env.mode;P.default.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY;P.default.env.OPENAI_BASE_URL||process.env.OPENAI_BASE_URL;P.default.env.TRANSLATE_ADDITIONAL_PROMPT||process.env.TRANSLATE_ADDITIONAL_PROMPT;P.default.env.PAGE_CONTENT_ADDITIONAL_PROMPT||process.env.PAGE_CONTENT_ADDITIONAL_PROMPT;const nn="image-bin";P.default.env.INIT_TEMPLATE_PATH;const sn=process.env.DATABASE_URL||Ve.default.join(P.default.env.dataDir,"db/pages-kit.db"),$e=P.default,on=()=>P.default.env.tenantMode==="multiple",rn=()=>(Jt.default($e.env.preferences.multiTenantAllProjectAccessPassports)?[]:$e.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],an=Ve.default.join(P.default.env.dataDir,"fs-memoize-cache"),cn=P.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",m=Vt.default("pages-kit"),ln=D.DataTypes.sqlite.DATE.parse;D.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):ln(t,e);const ee=new D.Sequelize({dialect:"sqlite",storage:sn,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});ee.query("pragma journal_mode = WAL;");ee.query("pragma synchronous = normal;");ee.query("pragma journal_size_limit = 67108864;");class ue extends D.Model{}ue.init({id:{type:D.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:D.DataTypes.UUIDV4},projectId:{type:D.DataTypes.UUID,allowNull:!1},componentId:{type:D.DataTypes.STRING,allowNull:!1}},{sequelize:ee,tableName:"ProjectComponents",timestamps:!1});class U extends D.Model{static async getProjectByIdOrSlug(e){return U.findOne({where:{[D.Op.or]:[{id:e},{slug:e}]}})}}U.init({id:{type:D.DataTypes.UUID,defaultValue:D.DataTypes.UUIDV4,primaryKey:!0},name:{type:D.DataTypes.STRING,allowNull:!1},description:D.DataTypes.TEXT,createdAt:D.DataTypes.DATE,updatedAt:D.DataTypes.DATE,createdBy:{type:D.DataTypes.STRING,allowNull:!1},updatedBy:{type:D.DataTypes.STRING,allowNull:!1},slug:D.DataTypes.STRING,icon:D.DataTypes.STRING,pinnedAt:D.DataTypes.DATE,useAllResources:D.DataTypes.BOOLEAN,npmSecret:D.DataTypes.STRING,relatedBlocklets:{type:D.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){return this.getDataValue("relatedBlocklets")||{}},set(t){this.setDataValue("relatedBlocklets",JSON.stringify(t||{}))}}},{sequelize:ee,paranoid:!0});U.hasMany(ue,{foreignKey:"projectId",as:"components"});const pn=an,un=cn,be=7*24*60*60*1e3,dn=24*60*60*1e3,ze=async(t="")=>{const e=h.join(pn,t);try{if(!(await g.promises.stat(e)).isDirectory())throw new Error(`${e} is not a directory`)}catch{await g.promises.mkdir(e,{recursive:!0})}return e},fn=(t,e)=>{const n=B.createHash("md5").update(e).digest("hex");return h.join(t,`${un}-${n}.json`)},mn=async(t="")=>{const e=await ze(t),n=Date.now();try{const s=await g.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 g.promises.readFile(r,"utf-8"),a=JSON.parse(c);a.createdAt&&n-a.createdAt>be&&await g.promises.unlink(r)}catch{try{const a=await g.promises.stat(r);n-a.mtimeMs>be&&await g.promises.unlink(r)}catch{}}}))}catch(s){console.error(`Failed to cleanup cache in ${e}:`,s)}},hn=(()=>{const t=new Set;return setInterval(async()=>{await Promise.all(Array.from(t).map(s=>mn(s)))},dn).unref(),s=>{t.add(s)}})();function _e(t,e){return e.subdir&&hn(e.subdir),Q.memoize(async(...s)=>{const o=await ze(e.subdir||""),r=e.keyGenerator?e.keyGenerator(...s):JSON.stringify(s),c=fn(o,r);try{const a=await g.promises.readFile(c,"utf-8"),{value:i,createdAt:p}=JSON.parse(a);if(p&&Date.now()-p>be)throw await g.promises.unlink(c).catch(()=>{}),new Error("Cache expired");return i}catch{const i=await t(...s),p=JSON.stringify({value:i,createdAt:Date.now()});return g.promises.writeFile(c,p,"utf-8").catch(b=>{console.error("Failed to write fs cache:",b)}),i}},{keyGenerator:e.keyGenerator,lruOptions:e.lruOptions})}const gn=async(t,{componentId:e})=>{const n=`@tailwind components;
2
+ @tailwind utilities;
3
+ `,s=`.CustomComponent_${e}`;return(await Yt.default([Wt.default({content:[{raw:t,extension:"tsx"}]}),Kt.default({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),r=>{r.walkRules(c=>{c.selectors=c.selectors.map(a=>a.replace(/\.(.+)/g,`${s}.$1,${s} .$1`))})}]).process(n)).css},yn=async(t,{componentId:e})=>{const n=await gn(t,{componentId:e});return`export const __PagesKit_CSS__ = ${JSON.stringify(n)};
4
+
5
+ ${t}
6
+ `},Ue=_e(async(t,e)=>{let n=x.default.transpileModule(t,{compilerOptions:{jsx:x.default.JsxEmit.React,target:x.default.ScriptTarget.ES2016,module:x.default.ModuleKind.ESNext},transformers:{before:[Ge.createBuiltinModuleTransformer(x.default)]}}).outputText;if(e.tailwind&&(n=await yn(n,{componentId:e.componentId})),e.module===se.PreloadComponentScriptModule.ESM)return n;const s=x.default.transpileModule(n,{compilerOptions:{jsx:x.default.JsxEmit.React,target:x.default.ScriptTarget.ES2016,module:x.default.ModuleKind.CommonJS,moduleResolution:x.default.ModuleResolutionKind.Node16}}).outputText;return e.module===se.PreloadComponentScriptModule.CJS?s:En(e.moduleName,s)},{keyGenerator:(t,e)=>{const n=B.createHash("md5").update(t).digest("hex"),s={...e,componentId:e.componentId,module:e.module,...e.module!==se.PreloadComponentScriptModule.ESM?{moduleName:e.moduleName}:{},tailwind:e.tailwind};return JSON.stringify(["transpileModule",n,s])},lruOptions:{max:100,ttl:1e3*60*60*24*7},subdir:"transpileModule"}),Sn=async(t,e)=>{const s=(await zt.build({entryPoints:["index.tsx"],external:Object.keys(Et.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(c){let a=null;c.onResolve({filter:/.*/},i=>i.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:i.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),c.onLoad({filter:/.*/,namespace:"vfs"},async i=>{if(i.path==="index.tsx")return{contents:`export { ${e} } from './component'`,loader:"tsx"};if(i.path==="component.tsx")return{contents:t,loader:"tsx"};if(Ge.isRelativeModule(i.path)){const p=i.path.split("/").pop();if(a||(a=await me({ensureLoaded:!1})),a?.chunks?.[p])try{const b=g.readFileSync(a.chunks[p],"utf-8");return m.info("get chunk from local file system",p),{contents:b,loader:"tsx"}}catch{}}return null})}}]})).outputFiles?.[0]?.contents;if(!s)throw new Error("Failed to build server code");const o=Buffer.from(s).toString();return x.default.transpileModule(o,{compilerOptions:{module:x.default.ModuleKind.ESNext,target:x.default.ScriptTarget.ES2020}}).outputText},Ye=_e(async(t,e)=>{const n=await Sn(t,e);return new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${e}\\b|\\b${e}\\b)[^}]*\\}`,"m").test(n)?n:void 0},{keyGenerator:(t,e)=>{const n=B.createHash("md5").update(t).digest("hex");return JSON.stringify(["extractExportValueSchema",n,e])},lruOptions:{max:100,ttl:1e3*60*60*24*7},subdir:"extractExportValueSchema"}),En=(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
+ `,z=new pe.LRUCache({max:100}),We=60*60,Pe=60;function Qe(t){m.info("clear preload components cache",{cacheKey:t}),z.delete(t)}function Xe(t){for(const e of z.keys())e.includes(t)&&(m.info("clear preload components cache",{cacheKey:e}),Qe(e))}function Ze({mode:t,instanceId:e,componentId:n,locale:s}){return["getPreloadComponents",t,e,n,s].join("-")}async function wn({mode:t,req:e,state:n,locale:s,instances:o,module:r}){const{supportedLocales:c,config:{defaultLocale:a}}=n;if(!a)return null;const i=(await Promise.all(o.map(async u=>{try{const d=Ze({mode:t,instanceId:u.id,componentId:u.componentId,locale:s});if(t!=="draft"&&u.useCache&&z.has(d))return m.info(`get preload component from cache: ${d}`),z.get(d);const w=X({state:n,componentId:u.componentId});if(!w)return null;const T=await et({req:e,state:n,componentId:w.id,locale:s,defaultLocale:a,properties:u.properties});if(!T)return null;const _={instanceId:u.id,preload:T};if(t!=="draft"&&u.useCache){let A=We;u.cacheDuration&&(A=u.cacheDuration),m.info(`set preload component to cache(${A}s): ${d}`),z.set(d,_,{ttl:A*1e3})}return _}catch(d){return m.error("get preload component error",{instanceId:u.id,componentId:u.componentId},{error:d}),null}}))).filter(u=>!!u),p=Object.values(i.reduce((u,d)=>({...u,...d.preload.components}),{}));async function b(){const u=await Promise.all(p.map(async d=>{const w=W.componentUMDName({componentId:d.component.id}),T=r===se.PreloadComponentScriptModule.ESM?{module:r,script:await Ue(d.script,{componentId:d.component.id,module:r,tailwind:t!=="draft"})}:{module:r,script:await Ue(d.script,{componentId:d.component.id,module:r,moduleName:w,tailwind:t!=="draft"}),moduleName:w};return[d.component.id,{component:d.component,script:T}]}));return Object.fromEntries(u)}const S=await b();return{config:{defaultLocale:a,supportedLocales:c},components:S,instances:i.map(u=>({id:u.instanceId,componentId:u.preload.component.id,locales:{[u.preload.locale]:{props:u.preload.props}}}))}}async function et({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 i=c.some(b=>b.locale===s)?s:o;if(!i)return null;const p=await tt({req:t,state:e,componentId:n,locale:i,defaultLocale:o,properties:r});return p?{component:a,...p}:null}const In=20;async function tt({req:t,depth:e=0,state:n,componentId:s,locale:o,defaultLocale:r,properties:c}){if(e>In)throw new RangeError("max component depth exceeded");const a=bn({state:n,componentId:s,properties:c,locale:o});if(!a)return null;const{props:i}=a,p={locale:o||r,components:{[a.component.id]:{component:a.component,script:a.script}},props:{...i}};try{const b=await Cn({...a,req:t});b?.props&&Object.assign(p.props,b.props)}catch(b){m.error("preload data at server side error",{componentId:s,name:a.component.name},{error:b})}return await Promise.all(Object.entries(i).map(async([b,S])=>{if(S?.type===W.RenderNestedComponent){const f=await tt({req:t,depth:e+1,state:n,componentId:S.componentId,locale:o,defaultLocale:r,properties:S.properties});f&&(Object.assign(p.components,f.components),Object.assign(p.props,{[b]:{type:W.RenderNestedComponent,componentId:S.componentId,props:f.props}}))}})),p}function bn({state:t,componentId:e,locale:n,properties:s}){const o=X({state:t,componentId:e});if(!o)return null;const r=W.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 Pn({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 Cn({component:t,script:e,props:n,req:s}){if(!e?.includes("getServerSideProps"))return null;const o=await Ye(e,"getServerSideProps");if(!o)return null;const c=(o.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||o.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",a=new Promise(p=>{setTimeout(()=>{p({})},Pe*1e3)});return await Promise.race([a,Q.Sandbox.callFunction({code:`${o}
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 ${c}(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:p=>{if(p==="@blocklet/pages-kit/builtin/utils")return`const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
50
+ export { joinURL, withQuery, getQuery, getComponentMountPoint }
51
+ `;if(p==="@blocklet/pages-kit/builtin/dayjs")return Q.BuiltinModules.dayjs},global:{console:{log:(...p)=>{m.info(...p)},warn:(...p)=>{m.warn(...p)},error:(...p)=>{m.error(...p)}},getComponentMountPoint:ht.getComponentMountPoint,joinURL:L.joinURL,withQuery:L.withQuery,getQuery:L.getQuery},functionName:"getServerSidePropsWrapper",args:[{location:{href:L.joinURL(L.withHttps(s.hostname),s.originalUrl)},fetch:(p,{...b}={})=>{const S=typeof p=="string"&&p.startsWith("/")?L.joinURL(P.default.env.appUrl,p):p;if(typeof S=="string"&&L.parseURL(S).host===L.parseURL(P.default.env.appUrl).host){const f=s.get("cookie");if(f){const u=new He.Headers(b.headers);u.set("cookie",f),b.headers=u}}return Gt.default(S,{...b,timeout:Pe*1e3}).then(f=>({ok:f.ok,status:f.status,statusText:f.statusText,headers:Object.fromEntries(f.headers.entries()),json:()=>f.json()}))},props:n}]})])}const nt=Q.memoize(async(t,e,n)=>{if(!t?.includes(e))return null;const s=await Ye(t,e);if(s)try{return await Q.Sandbox.callFunction({code:`
52
+ ${s}
53
+
54
+ export function get${e}SchemaWrapper() {
55
+ return ${e};
56
+ }
57
+ `,filename:`${n}.js`,functionName:`get${e}SchemaWrapper`})}catch(o){return m.error(`获取 ${e} 失败`,{componentId:n,error:o}),null}return null},{keyGenerator:(t,e,n)=>{const s=B.createHash("md5").update(t).digest("hex");return JSON.stringify(["getExportSchemaValueFromCode",s,e,n])},lruOptions:{max:100,ttl:1e3*60*60}}),On="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",Ce="page",Oe="trigger-reload-project-resource",ke=On,An="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 st(){return g.mkdtempSync(h.join(P.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 N(t){return t.filter(e=>e!=null)}function Tn(t){t.pages&&Object.keys(t.pages).forEach(n=>{const s=H.getYjsValue(t.pages[n]);s&&s instanceof $.Map&&re(s)});const e=H.getYjsValue(t.pages);e&&e instanceof $.Map&&e.observe(n=>{n.changes.keys.forEach((s,o)=>{if(s.action==="add"){const r=H.getYjsValue(t.pages[o]);r&&r instanceof $.Map&&re(r)}})})}function jn(t){t.routes&&Object.keys(t.routes).forEach(n=>{const s=H.getYjsValue(t.routes?.[n]);s&&s instanceof $.Map&&re(s)});const e=H.getYjsValue(t.routes);e&&e instanceof $.Map&&e.observe(n=>{n.changes.keys.forEach((s,o)=>{if(s.action==="add"){const r=H.getYjsValue(t.routes?.[o]);r&&r instanceof $.Map&&re(r)}})})}function Dn(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=oe.getRouteMetaDataByOptionIds(o,r);c&&(c.publishedAt=new Date().toISOString())}if(!e){const c=oe.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 Ee({page:t,route:e,state:n,routeId:s,routePathInfo:o}){m.info(`Executing datasource data assembly, routeId: ${s}, routePathInfo: ${JSON.stringify(o)}`);const r={...Tt.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 i=e.dataSource.pathDataMappings?.[a]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[a]?.dataCache?.[n.config.defaultLocale||"en"];if(!i)continue;At.setPageDataSource(r,n,c.locale,i)}o&&o.routeMetaData&&(o.routeMetaData.publishedAt=new Date().toISOString())}return r}const ce=new pe.LRUCache({max:20,ttl:10*60*1e3});function _n(t,e=[]){let n=0;const s=Array.from(ce.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 p=(a.split(":lang-path=")[0]||"").replace(/\/:[^/]+/g,"");if(c.startsWith(p)){ce.delete(r),n++,m.info(`[Cache CLEAR] key: ${r}`);break}}}return m.info(`[Cache CLEAR] cleared ${n} entries for patterns:`,o),n}function kn({projectId:t,projectSlug:e,supportedLocales:n=[]}){let s=0;const o=Array.from(ce.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)){ce.delete(c),s++,m.info(`[Cache CLEAR PROJECT] key: ${c}`);break}return m.info(`[Cache CLEAR PROJECT] cleared ${s} entries for project ${t}${e?` (slug: ${e})`:""}`),s}const{uploadToMediaKit:vn}=require("@blocklet/uploader-server"),ve=/^\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,Rn=1e4,xn=3e4,te=0,we=1,Ln=0,Nn=1,Ae=P.default,G=h.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Mn=["production","draft"],$n=["production"];function ie(t){return t?.replace(/\//g,"|")||""}function Un(){const t=Ae.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 $.Doc{constructor(e){super(),this.options=e,g.existsSync(this.draftYjsFilePath)&&$.applyUpdate(this,g.readFileSync(this.draftYjsFilePath)),this.syncedStore=Dt.reactive(H.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{},routeIds:[],routes:{},dataSourceIds:[],dataSources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new K.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static PRODUCTION_CACHE_TTL=7*24*60*60*1e3;static RELEASE_DELAY=5*60*1e3;static PERIODIC_CHECK_INTERVAL=2*60*60*1e3;static sharedInstances={};static productionStates=new pe.LRUCache({max:100,ttl:j.PRODUCTION_CACHE_TTL});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const n=h.join(G,e),s=h.join(G,`@del-${e}`);g.renameSync(n,s)}catch(n){m.error("Failed to safe delete project state dir:",n)}}static get projectIds(){return Ie.globSync("*/",{cwd:G,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*"]})}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(G,e)}),j.sharedInstances[e]=n,ft({projectId:e,pages:de,components:fe}),n)}static async getProductionState(e){let n=j.productionStates.get(e);if(!n){const s=h.join(G,e,"production");if(n=await Re(s,{includeResources:!0})??Un(),!n?.config?.defaultLocale){n.config??={};const o=Ae.env.languages.map(r=>({locale:r.code,name:r.name}));n.config.defaultLocale=o[0]?.locale}j.productionStates.set(e,n)}return{...n,resources:await me().then(async s=>{const{pages:o,components:r}=Xt.default(s,"pages","components");let c=r;if((await U.findByPk(e))?.useAllResources)c=r;else{const p=(await ue.findAll({where:{projectId:e}})).map(S=>S.componentId);c=Object.fromEntries(Object.entries(r||{}).filter(([S])=>p.includes(S)))}return Object.keys(n?.resources?.components||{}).length>0&&(c={...c,...n?.resources?.components}),{pages:o,components:c}}).catch(()=>({}))}}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(){Tn(this.syncedStore),jn(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 ct(n,{exportAssets:!1,includeResources:!0}),o=this.getPublishDir(e);if(g.mkdirSync(h.dirname(o),{recursive:!0}),g.rmSync(o,{force:!0,recursive:!0}),g.renameSync(s,o),e==="production"){const r=h.basename(this.options.path);j.productionStates.set(r,n)}}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 i=this.conns.get(o);i&&(e.forEach(p=>{i.add(p)}),s.forEach(p=>{i.delete(p)}))}const c=k.createEncoder();k.writeVarUint(c,we),k.writeVarUint8Array(c,K.encodeAwarenessUpdate(this.awareness,r));const a=k.toUint8Array(c);this.conns.forEach((i,p)=>this.send(p,a))};updateHandler=e=>{const n=k.createEncoder();k.writeVarUint(n,te),ye.writeUpdate(n,e);const s=k.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 i=0;for(;i<s.length;){const p=s[i];a.has(p)?(a.delete(p),i++):s.splice(i,1)}}{const a=new Set(Object.keys(r));let i=0;for(;i<c.length;){const p=c[i];a.has(p)?(a.delete(p),i++):c.splice(i,1)}}e.splice(0,e.length),e.push(...Ae.env.languages.map(a=>({locale:a.code,name:a.name}))),o.defaultLocale=e[0]?.locale;{let a=0;const i=new Set;for(;a<e.length;){const{locale:p}=e[a];i.has(p)?e.splice(a,1):(a++,i.add(p))}}};send=(e,n)=>{e.readyState!==Ln&&e.readyState!==Nn&&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&&K.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(()=>{m.info(`[SiteState] releasing instance due to no active connections: ${e}`),this.conns.size===0&&(this.releaseTimer=void 0,this.destroy())},j.RELEASE_DELAY),m.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);m.info(`[SiteState] cancelled scheduled release for project ${e}`)}}autoSave=Je.default(()=>{g.mkdirSync(h.dirname(this.draftYjsFilePath),{recursive:!0}),g.writeFileSync(this.draftYjsFilePath,$.encodeStateAsUpdate(this))},Rn);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 Te(s,o,{routes:n,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),o.config.publishedAt=new Date().getTime(),Dn(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 i=await Te(e,n);c(i)}catch(i){a(i)}})})};clearPageCacheForRoutes=async(e,n)=>{const s=h.basename(this.options.path),r=(await U.findByPk(s))?.slug||s;if(m.info(`[SiteState] clearing page cache for project ${s}, routes:`,e||[]),!e||e.length===0){kn({projectId:s,projectSlug:r,supportedLocales:n.supportedLocales.map(p=>p.locale)});return}const c=n.supportedLocales.map(p=>p.locale),a=[],i=e.filter(p=>n.pages[p]);for(const p of i){const S=n.pages[p].slug;r&&r!==s&&(r==="/"?a.push(S):a.push(`/${r}${S}`)),a.push(`/${s}${S}`)}if(m.info(`[SiteState] clearing page cache for project ${s}, pathPatterns:`,a),a.length>0){const p=_n(a,c);m.info(`[SiteState] cleared ${p} 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)}}},xn);e.on("close",()=>{this.closeConn(e),clearInterval(s)}),e.on("pong",()=>{n=!0});{const o=k.createEncoder();k.writeVarUint(o,te),ye.writeSyncStep1(o,this),this.send(e,k.toUint8Array(o));const r=this.awareness.getStates();if(r.size>0){const c=k.createEncoder();k.writeVarUint(c,we),k.writeVarUint8Array(c,K.encodeAwarenessUpdate(this.awareness,Array.from(r.keys()))),this.send(e,k.toUint8Array(c))}}};messageListener=(e,n)=>{try{const s=k.createEncoder(),o=Se.createDecoder(n),r=Se.readVarUint(o);switch(r){case te:k.writeVarUint(s,te),ye.readSyncMessage(o,s,this,null),k.length(s)>1&&(this.ensureDataStructure(),this.send(e,k.toUint8Array(s)));break;case we:{K.applyAwarenessUpdate(this.awareness,Se.readVarUint8Array(o),e);break}default:m.warn(`Unsupported messageType ${r}`)}}catch(s){m.error(s)}this.save()};static async pageUrlMap(e,n){let{projectIds:s}=this;n&&(s=[n]);const o={};for(const r of s){const c=await U.findByPk(r);if(!c)continue;const a=await j.getStateByProjectId(r,e),i=c.slug||r,p=Zt.default(P.default.env.languages.map(S=>S.code),a.supportedLocales.map(S=>S.locale)),b=(S,f)=>{i&&(o[L.joinURL("/",i,S)]={...f,shouldRedirect:!0,mainPage:!0}),o[L.joinURL("/",r,S)]={...f,shouldRedirect:!0,mainPage:!0};for(const u of p){const d={...f,locale:u};o[L.joinURL("/",u,r,S)]=d,i&&(o[L.joinURL("/",u,i,S)]=d)}};if(e==="draft")for(const S of a.routeIds||[]){const f=a?.routes?.[S];if(!f)continue;if(f.params&&f.params.length>0){const w=oe.generateParamCombinations({basePath:f.path,params:f.params,routeId:f.id,paramsOptions:f.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const T of w){const _=T.path,A={projectId:r,projectSlug:i,pageSlug:_,pageId:f.displayTemplateId||"",routeId:S,defaultLocale:p?.[0],locales:p,publishedAt:a.config.publishedAt,isPublic:f.isPublic&&T?.routeMetaData?.isPublic};b(_,A)}}const u=f.path,d={projectId:r,projectSlug:i,pageSlug:u,pageId:f.displayTemplateId||"",routeId:S,defaultLocale:p?.[0],locales:p,publishedAt:a.config.publishedAt,isPublic:f.isPublic};b(u,d)}for(const S of a.pageIds){const f=a.pages[S];if(!f||e==="production"&&!f.isPublic)continue;const u=f.slug,d=c.slug||r,w={projectId:r,projectSlug:d,pageSlug:u,pageId:S,defaultLocale:p?.[0],locales:p,publishedAt:a.config.publishedAt,isPublic:f.isPublic,templateConfig:f.templateConfig};b(u,w)}}return o}getDocumentSize(){return $.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),m.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,m.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(m.info(`[SiteState] periodic check summary: total instances: ${e}, with connections: ${s.length}, without connections: ${n.length}`),n.length>0){m.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{m.info(`[SiteState] releasing instance due to periodic check: ${r}`),c.destroy(),o++}catch(a){m.error(`[SiteState] failed to release instance ${r} during periodic check:`,a)}m.info(`[SiteState] periodic check completed: ${o}/${n.length} instances released successfully`)}else e>0?m.debug("[SiteState] periodic check: all instances have active connections"):m.debug("[SiteState] periodic check: no instances exist")}}async function Fn(t,e,n){if(!t||!g.existsSync(t)||!g.lstatSync(t).isFile())return null;let s=n[t];return s||(s=(async()=>{try{return(await vn({filePath:t,fileName:e}))?.data?.filename}catch(o){return m.error(`Failed to upload asset ${t}:`,o),null}})(),n[t]=s),s}const ot=async(t,e)=>{const n=h.basename(t),s=await je.call({name:ke,path:L.joinURL("/uploads",n),responseType:"stream",method:"GET"});if(s.status>=200&&s.status<400){const o=g.createWriteStream(e);await Ft.pipeline(s.data,o)}else throw new Error(`download asset failed ${s.status}`)},rt=async(t,e)=>{await Promise.all(t.map(async n=>{try{await ot(n,h.join(e,h.basename(n)))}catch(s){m.error(`Failed to export assets: ${n}, ${s}`)}}))};function at(t){return ve.test(t)?[t]:Y.test(t)?(Fe.lastIndex=0,Array.from(t.matchAll(Fe)).map(n=>n[1]).filter(n=>!!n)):[]}async function ne(t,e,n){const{getFilename:s,exportAssets:o}=n,r=h.join(e,s(t));if(g.mkdirSync(h.dirname(r),{recursive:!0}),g.writeFileSync(r,V.stringify(t)),o){const a=ae(t,i=>typeof i=="string"&&(ve.test(i)||Y.test(i))).map(i=>{const p=De.default(t,i);return at(p)}).flat().filter(Boolean);await rt(a,h.dirname(r))}}const qe=new pe.LRUCache({max:20,ttl:30*24*60*60*1e3});async function Be(t,e,n){const s=ae(t,a=>typeof a=="string"&&(ve.test(a)||Y.test(a))),o=en.default(2),r=s.map(a=>o(async()=>{try{const i=De.default(t,a),p=at(i);for(const b of p){const S=h.basename(b),f=n.getFilePath(b,a),u=f?`${f}:${S}`:S,d=qe.get(u);if(d){Y.test(i)||Me.default(t,a,d);return}const w=await Fn(f,S,e);w&&(Y.test(i)||Me.default(t,a,w),qe.set(u,w))}}catch(i){m.error(`Failed to process upload for path ${a.join(".")}:`,i.message||i.reason)}})),c=await Promise.allSettled(r);n.onFinish?.(c)}async function ct(t,{exportAssets:e,pageIds:n="all",componentIds:s="all",rawConfig:o,includeResources:r=!1,routeIds:c="all"}={}){const a=n==="all"?t.pageIds:n,i=W.getComponentDependencies({state:t,pageIds:a,componentIds:s==="all"?Object.keys(t.components):s}),p=c==="all"?t.routeIds:c,b=l=>({id:l.id,name:l.name,isTemplateSection:l.isTemplateSection??!1,templateDescription:l.templateDescription,llmConfig:l.llmConfig,component:l.component,config:l.config,visibility:l.visibility,sections:l?.sectionIds?N(l?.sectionIds?.map(y=>{const O=l.sections?.[y];return O&&b(O)})):void 0}),S=(l,y)=>({id:l.id,createdAt:l.createdAt,updatedAt:l.updatedAt,publishedAt:l.publishedAt,isPublic:l.isPublic??!0,templateConfig:l.templateConfig,meta:l.locales?.[y]??{},sections:N(l.sectionIds.map(O=>{const R=l.sections[O];return R&&b(R)})),dataSource:Object.fromEntries(Object.entries(l.dataSource||{}).map(([O,R])=>[O,R?.[y]??{}]))}),f=l=>({id:l.id,createdAt:l.createdAt,updatedAt:l.updatedAt,publishedAt:l.publishedAt,path:l.path,handler:l.handler,isPublic:l.isPublic??!0,params:l.params??[],enabledGenerate:l.enabledGenerate??!1,displayTemplateId:l.displayTemplateId,dataSource:l.dataSource}),u=N(p.map(l=>{const y=t.routes[l];return y&&f(y)})),d=N(t.supportedLocales.map(l=>l.locale).flatMap(l=>a.map(y=>{const O=t.pages[y];return O&&{locale:l,slug:O.slug,page:S(O,l)}}))),w=st(),T=h.join(w,"pages");g.mkdirSync(T,{recursive:!0});const _=h.join(w,"components");g.mkdirSync(_,{recursive:!0});const A=h.join(w,"routes");g.mkdirSync(A,{recursive:!0});for(const{locale:l,slug:y,page:O}of d)await ne(O,T,{getFilename:()=>`${ie(y)||"index"}.${l}.yml`,exportAssets:e});for(const l of u)await ne(l,A,{getFilename:()=>`${ie(l.path)||"index"}.yml`,exportAssets:e});for(const l of i){const y=t.components[l]?.data;y&&await ne(y,_,{getFilename:O=>`${O.name||"unnamed"}.${O.id}.yml`,exportAssets:e})}const E=h.join(w,".blocklet/pages/pages.config.yml");g.mkdirSync(h.dirname(E),{recursive:!0});const I={pages:N(a.map(l=>{const y=t.pages[l];return y&&{id:l,slug:y.slug}})),routes:N(p.map(l=>{const y=t.routes[l];return y&&{id:l,path:y.path}})),components:N(i.map(l=>{const y=t.components[l]?.data;return y&&{id:l,name:y.name}})),...r?{resources:{components:N(Object.keys(t.resources?.components||{}).filter(l=>i.includes(l)).map(l=>({id:l,name:t.resources?.components?.[l]?.component?.name})))}}:{},supportedLocales:t.supportedLocales,config:t.config};g.writeFileSync(E,V.stringify(I));const C=h.join(w,"config.source.json");if(o&&g.writeFileSync(C,JSON.stringify(o)),r){const l=h.join(w,"resources"),y=h.join(l,"components");g.mkdirSync(y,{recursive:!0});for(const F of Object.keys(t?.resources?.components??{}).filter(M=>i.includes(M))){const M=t.resources?.components?.[F]?.component;M&&await ne(M,y,{getFilename:q=>`${q.name||"unnamed"}.${q.id}.yml`,exportAssets:e})}const O=h.join(w,"chunks");g.mkdirSync(O,{recursive:!0});const{chunks:R}=await me();for(const F of Object.keys(t?.resources?.components??{}).filter(M=>i.includes(M))){const M=t.resources?.components?.[F]?.component;if(M&&M.renderer?.type==="react-component"){const q=M.renderer?.chunks??[];if(q?.length>0)for(const he of q){const Le=h.join(O,he),ge=R?.[he];try{ge&&g.existsSync(ge)&&!g.existsSync(Le)&&g.copyFileSync(ge,Le)}catch(mt){m.error(`copy chunk ${he} error`,mt.message)}}}}}return w}async function Re(t,{importAssets:e,includeResources:n}={}){if(!g.existsSync(t))return null;let s,o=!1;try{g.lstatSync(t).isDirectory()?s=t:/\.(tgz|gz|tar)$/.test(t)&&(o=!0,s=st(),await qt.x({file:t,C:s}));const r=Ie.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"),i=r&&h.join(h.dirname(r),"../../chunks"),p=r&&h.join(h.dirname(r),"../../routes");if(!r)return null;const b=V.parse(g.readFileSync(r).toString()),S=(E,I,C)=>{let l=h.join(E,`${I}${C?`.${C}`:""}.yml`);return(!g.existsSync(l)||!g.lstatSync(l).isFile())&&(l=h.join(E,I,`index${C?`.${C}`:""}.yml`),!g.existsSync(l)||!g.lstatSync(l))?null:V.parse(g.readFileSync(l).toString())},f=(E,I)=>{try{const C=Ie.globSync(`*.${I}.yml`,{cwd:E,absolute:!0})[0];return C?V.parse(g.readFileSync(C).toString()):null}catch(C){m.error("parse component error",C)}return null},u=(E,I)=>{let C=h.join(E,`${I}.yml`);return(!g.existsSync(C)||!g.lstatSync(C).isFile())&&(C=h.join(E,I,"index.yml"),!g.existsSync(C)||!g.lstatSync(C))?null:V.parse(g.readFileSync(C).toString())},d=N(b.pages.map(({slug:E})=>{const I=N(b.supportedLocales.map(({locale:y})=>{const O=c?S(c,ie(E),y):void 0;if(O)return{locale:y,page:O};const R=c?S(c,E,y):void 0;return R&&{locale:y,page:R}})),C=I[0]?.page;if(!C)return null;const l=C.sections.map(jt.unzipSection);return{id:C.id||Ne.nextId(),createdAt:C.createdAt,updatedAt:C.updatedAt,publishedAt:C.publishedAt,isPublic:C.isPublic??!0,templateConfig:C.templateConfig,slug:E,sections:Object.fromEntries(l.map(y=>[y.id,y])),sectionIds:l.map(y=>y.id),locales:Object.fromEntries(I.map(({locale:y,page:O})=>[y,O.meta])),dataSource:C.dataSource?Object.fromEntries([...new Set(I.flatMap(({page:y})=>Object.keys(y.dataSource??{})))].map(y=>[y,Object.fromEntries(I.map(({locale:O,page:R})=>{const F=R.dataSource?.[y];return[O,F||{}]}))])):Object.fromEntries([...new Set(I.flatMap(({page:y})=>y.sections.map(O=>O.id)))].map(y=>[y,Object.fromEntries(I.map(({locale:O,page:R})=>{const F=R.dataSource?.[y];if(F)return[O,F];const M=R.sections.find(q=>q.id===y);return[O,M?.properties||{}]}))]))}})),w=N(b?.routes?.map(({path:E})=>{const I=p?u(p,ie(E)):void 0;return{...I,id:I?.id||Ne.nextId(),createdAt:I?.createdAt??new Date().toISOString(),updatedAt:I?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:I?.path??`/${I?.id}`,params:I?.params,handler:I?.handler??"Pages Kit",isPublic:I?.isPublic??!0,enabledGenerate:I?.enabledGenerate??!1,displayTemplateId:I?.displayTemplateId??void 0,dataSource:I?.dataSource??{}}})??[]),T=a?N(b.components?.map(({id:E})=>f(a,E))??[]):[];if(e){const E=(...I)=>{m.info(`[${o?h.basename(t):h.basename(h.join(t,"../../../../"))}] importAssets:`,...I)};try{E("wait image-bin api ready"),await tn.default({resources:[`${je.getComponentWebEndpoint(nn)}/api/sdk/uploads`],validateStatus:l=>l>=200&&l<=500}),E("image-bin api is ready");const I={},C={};E("start to upload assets"),await Promise.allSettled([Be(T,I,{getFilePath:l=>a&&h.join(a,l),onFinish:l=>{E(`upload ${l.length} component assets`)}}),Be(d,C,{getFilePath:(l,y)=>{const O=De.default(d,y.slice(0,1));return c&&h.join(c,h.dirname(O.slug),l)},onFinish:l=>{E(`upload ${l.length} page assets`)}})]),E("upload assets done"),global.gc&&global.gc()}catch(I){E("Error during asset import:",I)}}const _={};if(n){const E=r&&h.join(h.dirname(r),"../../resources/components"),I=N(b.resources?.components?.map(({id:C})=>f(E,C))??[]);I.length>0&&(_.components=Object.fromEntries(I.map((C,l)=>[C.id,{index:l,component:C}])))}const A={};if(i&&g.existsSync(i)){const E=g.readdirSync(i);for(const I of E)A[I]=h.join(i,I)}return{supportedLocales:b.supportedLocales,pageIds:d.map(E=>E.id),components:Object.fromEntries(T.map((E,I)=>[E.id,{index:I,data:E}])),pages:Object.fromEntries(d.map(E=>[E.id,E])),config:b.config||{},resources:_,chunks:A,routeIds:w.map(E=>E.id),routes:Object.fromEntries(w.map(E=>[E.id,E])),dataSourceIds:[],dataSources:{}}}finally{o&&s&&g.rmSync(s,{force:!0,recursive:!0})}}async function Te(t,e,{routes:n,mergeMode:s="byUpdateTime",deleteRoutes:o=!1,publishMode:r=void 0}={}){try{r&&Xe(r)}catch(f){m.error("clear preload page cache error",{error:f})}const{pages:c,pageIds:a,routeIds:i,routes:p,supportedLocales:b}=t;if(r==="production"){let f=n??[],u=null;for(const d of i??[]){const w=p?.[d];if(w?.params&&w?.params.length>0&&w?.paramsOptions&&w?.paramsOptions.length>0){const T=oe.generateParamCombinations({basePath:w.path,params:w.params,routeId:w.id,paramsOptions:w.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),_=Object.fromEntries(T.map(A=>[`${d}-${A.paramOptionIds.join("-")}`,A]));u={...u||{},..._},n||(f=[...f,...T.map(A=>`${d}-${A.paramOptionIds.join("-")}`)])}else n||f.push(d)}m.info("routeIds to be published: ",f);for(const d of f){let w=d;if(w.includes("-")){const[A]=w.split("-");w=A}const T=p?.[w];if(!T){const A=e.pageIds.indexOf(w);A!==-1&&o&&(e.pageIds.splice(A,1),delete e.pages[w]);for(const E of e.pageIds)E.includes(`${w}-`)&&(e.pageIds.splice(e.pageIds.indexOf(E),1),delete e.pages[E]);m.info("delete main route page",w);continue}if(d.includes("-")&&!u?.[d]){const A=e.pageIds.indexOf(d);A!==-1&&o&&(e.pageIds.splice(A,1),delete e.pages[d]),m.info("delete page",d);continue}if(!T.displayTemplateId){m.info("no display template",d);continue}const _=c[T.displayTemplateId];if(!_){m.info("no template page",d);continue}if(e.pageIds.includes(d)){if(m.info("has need update page",d),s==="replace")e.pages[d]=Ee({page:_,route:T,state:t,routeId:d,routePathInfo:u?.[d]}),m.info("replace page",d);else if(s==="byUpdateTime"){const A=e.pages[T.id];(!A||T.updatedAt&&T.updatedAt>A.updatedAt)&&(e.pages[d]=Ee({page:_,route:T,state:t,routeId:d,routePathInfo:u?.[d]}),m.info("replace page by update time",d))}}else e.pageIds.push(d),e.pages[d]=Ee({page:_,route:T,state:t,routeId:d,routePathInfo:u?.[d]}),m.info("add page",d)}if(o&&!n)for(const d of e.pageIds)f?.includes(d)||(delete e.pages[d],m.info("delete page",d)),e.pageIds=[...e.pageIds].filter(w=>f?.includes(w))}else{for(const f of a){const u=c[f];if(u)if(e.pageIds.includes(u.id)){if(s==="replace")e.pages[u.id]=u;else if(s==="byUpdateTime"){const d=e.pages[u.id];(!d||u.updatedAt&&u.updatedAt>d.updatedAt)&&(e.pages[u.id]=u)}}else e.pageIds.push(u.id),e.pages[u.id]=u}for(const f of i){const u=p[f];if(u)if(e.routeIds.includes(u.id)){if(s==="replace")e.routes[u.id]=u;else if(s==="byUpdateTime"){const d=e.routes[u.id];(!d||u.updatedAt&&u.updatedAt>d.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(...Qt.default(b)),o)for(const f of Object.keys(e.components))delete e.components[f];let S=JSON.parse(JSON.stringify(t.components));S=Object.fromEntries(await Promise.all(Object.entries(S).map(async([f,u])=>{const d=await it(u?.data);return[f,{...u,data:d}]}))),Object.assign(e.components,S),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Ke.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const it=_e(async t=>{if(!Ke.default(t?.properties))return t;if(t?.renderer?.type==="react-component"){const{script:e}=t?.renderer||{};if(e&&e.includes("PROPERTIES_SCHEMA"))try{const n=await nt(e,"PROPERTIES_SCHEMA",t.id);n&&n.length>0&&t&&(t.properties={},n.forEach((s,o)=>{t?.properties&&(t.properties[s.id]={index:o,data:s})}))}catch(n){m.error("checkPropertiesFromCode error",{componentId:t.id,name:t.name},{error:n})}}return t},{keyGenerator:t=>{const e=t?.id||"",n=t?.name||"",s=t?.renderer?.type||"",o=t?.properties||{},r=t?.updatedAt||"",c=B.createHash("md5").update(JSON.stringify(o)).digest("hex");let a="",i="";return t?.renderer?.type==="react-component"&&(a=B.createHash("md5").update(t?.renderer?.script||"").digest("hex"),i=B.createHash("md5").update(t?.renderer?.editComponent||"").digest("hex")),JSON.stringify(["checkPropertiesFromCode",e,n,s,c,r,a,i])},lruOptions:{max:100,ttl:1e3*60*60},subdir:"checkPropertiesFromCode"});let le,J,de,fe,xe;function lt(){return le=(async()=>{const t=je.getResources({types:[{did:ke,type:Ce},{did:An,type:Ce}]});J=(await Promise.all(t.map(async n=>{const s=n.path?await Re(n.path,{importAssets:!1}):void 0;return s?{blockletId:n.did,state:s,blockletTitle:n.title}:void 0}))).filter(n=>!!n),de=J.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=J.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 it(s.component);return[n,{...s,component:o}]}))),xe=J.reduce((n,s)=>Object.assign(n,s.state.chunks),{})})(),le}function pt(t){const e=Je.default(async()=>{await lt().catch(n=>{m.error("load resource states error",{error:n})}),await t?.({states:J,pages:de,components:fe,chunks:xe})},3e3,{leading:!1,trailing:!0});return e(),P.default.events.on(P.default.Events.componentAdded,e),P.default.events.on(P.default.Events.componentRemoved,e),P.default.events.on(P.default.Events.componentStarted,e),P.default.events.on(P.default.Events.componentStopped,e),P.default.events.on(P.default.Events.componentUpdated,e),P.default.events.on(Oe,e),()=>{P.default.events.off(P.default.Events.componentAdded,e),P.default.events.off(P.default.Events.componentRemoved,e),P.default.events.off(P.default.Events.componentStarted,e),P.default.events.off(P.default.Events.componentStopped,e),P.default.events.off(P.default.Events.componentUpdated,e),P.default.events.off(Oe,e)}}const ut=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),dt=globalThis;dt[ut]?.();dt[ut]=pt(async({pages:t,components:e})=>{const{projectIds:n}=j;m.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=>{ft({projectId:s,pages:t,components:e})}))]).catch(s=>{m.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 ft({projectId:t,pages:e,components:n}){const s=j.sharedInstances[t];if(!s){m.info(`projectId: ${t} not found in sharedInstances`);return}if(s.syncedStore.resources.pages=e,(await U.findByPk(t))?.useAllResources)s.syncedStore.resources.components=n;else{const c=(await ue.findAll({where:{projectId:t}})).map(i=>i.componentId),a=Object.fromEntries(Object.entries(n||{}).filter(([i])=>c.includes(i)));s.syncedStore.resources.components=a}m.info(`update [${t}] resource states:`,{pages:Object.keys(s.syncedStore.resources.pages||{}).length,components:Object.keys(s.syncedStore.resources.components||{}).length})}async function qn(){m.info("trigger reload all project resource"),P.default.events.emit(Oe)}async function me({ensureLoaded:t=!0}={}){return t&&(le??=lt(),await le),{states:J,pages:de,components:fe,chunks:xe}}exports.COMPONENT_DID=ke;exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=We;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=Pe;exports.PUBLISH_MODES=$n;exports.Project=U;exports.RESOURCE_TYPE=Ce;exports.SITE_STATE_PATH=G;exports.STATE_MODES=Mn;exports.SiteState=j;exports.clearPreloadComponentsCache=Qe;exports.clearPreloadComponentsCacheByMode=Xe;exports.downloadAsset=ot;exports.downloadAssets=rt;exports.fromPackage=Re;exports.getComponentFromState=X;exports.getComponentFromStateByName=Pn;exports.getExportSchemaValueFromCode=nt;exports.getMultiTenantAllProjectAccessPassports=rn;exports.getPreloadComponent=et;exports.getPreloadComponents=wn;exports.getPreloadComponentsCacheKey=Ze;exports.getResourceStates=me;exports.initPackResourceStates=pt;exports.isMultiTenant=on;exports.logger=m;exports.mergeState=Te;exports.toPackage=ct;exports.triggerReloadAllProjectResource=qn;
@@ -0,0 +1 @@
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;
@@ -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/sdk/lib/config");require("lru-cache");require("node-fetch");require("ufo");require("crypto");const e=require("./chunks/site-state-BtZ8o3J2.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;
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/sdk/lib/config");require("lru-cache");require("node-fetch");require("ufo");require("crypto");const e=require("./chunks/site-state-gSkcvhcV.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;
package/lib/cjs/home.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("react/jsx-runtime");require("./chunks/state-BVdbNJCA.js");require("@arcblock/ux/lib/Locale/context");require("@arcblock/ux/lib/Result");require("@blocklet/pages-kit/builtin/page/header");require("@blocklet/pages-kit/contexts/color");require("@blocklet/pages-kit/utils/data-source");require("@blocklet/pages-kit/utils/route");require("@blocklet/ui-react/lib/Header");require("@emotion/css");require("@emotion/react");require("@emotion/styled");require("@mui/material");require("ahooks");require("isomorphic-dompurify");require("lodash/cloneDeep");require("lodash/isEmpty");require("lodash/isEqual");require("react");require("react-helmet");require("react-router-dom");require("react-use");require("ufo");require("./chunks/array-BqHuYyfx.js");const e=require("./chunks/home-BMjMYgq3.js");require("./chunks/session-BA7Qrcia.js");exports.HomeView=e.HomeView;exports.PageRoutes=e.PageRoutes;exports.PageView=e.PageView;exports.PageViewByPath=e.PageViewByPath;exports.PageViewWithDataSource=e.PageViewWithDataSource;exports.TranslucentHeader=e.TranslucentHeader;exports.default=e.Home;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require("react/jsx-runtime");require("./chunks/state-B6BF5wJ-.js");require("@arcblock/ux/lib/Locale/context");require("@arcblock/ux/lib/Result");require("@arcblock/ux/lib/Theme");require("@blocklet/pages-kit/builtin/page/header");require("@blocklet/pages-kit/contexts/color");require("@blocklet/pages-kit/utils/data-source");require("@blocklet/pages-kit/utils/route");require("@blocklet/ui-react/lib/Header");require("@emotion/css");require("@emotion/react");require("@mui/material");require("ahooks");require("isomorphic-dompurify");require("lodash/cloneDeep");require("lodash/isEmpty");require("lodash/isEqual");require("react");require("react-helmet");require("react-router-dom");require("react-use");require("ufo");require("./chunks/index-BRgYwvuv.js");const e=require("./chunks/home-BYk01EUy.js");require("./chunks/session-BRtsDvA-.js");exports.HomeView=e.HomeView;exports.PageRoutes=e.PageRoutes;exports.PageView=e.PageView;exports.PageViewByPath=e.PageViewByPath;exports.PageViewWithDataSource=e.PageViewWithDataSource;exports.TranslucentHeader=e.TranslucentHeader;exports.default=e.Home;
@@ -1,10 +1,10 @@
1
- "use strict";const R=require("@arcblock/did-auth-storage-nedb"),U=require("@blocklet/sdk/lib/config"),z=require("@blocklet/sdk/lib/service/auth"),J=require("@blocklet/sdk/lib/wallet"),G=require("@blocklet/sdk/lib/wallet-authenticator"),Y=require("@blocklet/sdk/lib/wallet-handler"),P=require("path"),C=require("./chunks/site-state-BtZ8o3J2.js"),Q=require("@arcblock/crawler-middleware"),V=require("@blocklet/pages-kit/types"),X=require("@blocklet/pages-kit/utils/common"),x=require("@blocklet/pages-kit/utils/preload"),Z=require("@blocklet/sdk/lib/component"),F=require("cheerio/slim"),ee=require("express"),L=require("fs"),te=require("lodash/get"),ne=require("mustache"),I=require("ufo"),d=n=>n&&n.__esModule?n:{default:n};function oe(n){if(n&&n.__esModule)return n;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const e in n)if(e!=="default"){const i=Object.getOwnPropertyDescriptor(n,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:()=>n[e]})}}return t.default=n,Object.freeze(t)}const ce=d(R),a=d(U),re=d(z),se=d(J),le=d(G),ae=d(Y),ie=d(P),O=oe(F),de=d(te),ue=d(ne),pe=(n={})=>{const t={data:new Map,timers:new Map,set:(e,i,h=n.ttl||36e5)=>{n.max&&t.data.size>=n.max&&t.delete(t.data.keys().next().value),t.timers.has(e)&&clearTimeout(t.timers.get(e)),t.timers.set(e,setTimeout(()=>t.delete(e),h)),t.data.set(e,i)},get:e=>t.data.get(e),has:e=>t.data.has(e),delete:e=>(t.timers.has(e)&&clearTimeout(t.timers.get(e)),t.timers.delete(e),t.data.delete(e)),clear:()=>{t.data.clear();for(const e of t.timers.values())clearTimeout(e);t.timers.clear()}};return t},D=pe({max:1,ttl:1e3*30});se.default();const fe=new le.default;new ae.default({authenticator:fe,tokenStorage:new ce.default({dbPath:ie.default.join(a.default.env.dataDir,"auth.db")})});const he=new re.default,me=async()=>{try{const n=D.get("blockletInfo");if(n)return n;const{blocklet:t}=await he.getBlocklet();return D.set("blockletInfo",t),t}catch{return null}},ge=["/assets/"];function _e({app:n,viteDevServer:t,state:e}){let i;if(t){const o=L.readFileSync(P.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(S,v,T)=>{const A=S.originalUrl;i=await t.transformIndexHtml(A,o),T()})}else i=L.readFileSync(P.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const h=ee.Router();h.use((o,S,v)=>{if(o.headers["x-unique-record"]==="dial_http"){C.logger.info("[html] dial http request, return 200 status code"),S.status(200).send("ok");return}v()}),a.default.env.preferences.snapkitEnabled&&a.default.env.preferences.snapkitEndpoint&&a.default.env.SNAP_KIT_ACCESS_KEY&&h.use(Q.createSnapshotMiddleware({endpoint:a.default.env.preferences.snapkitEndpoint,accessKey:a.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:a.default.env.preferences.snapkitCacheSize||100})),h.get("/:path(*)?",async(o,S,v)=>{var M,q,j,$;if(ge.some(l=>{var p;return(p=o.path)==null?void 0:p.startsWith(l)})){v();return}const T=performance.now(),A=()=>Math.round(performance.now()-T),K="production";let r,m,b=i;if(o.path.startsWith("/pages")){const l=o.params.lang,p=o.cookies.nf_lang,k=new Set([...a.default.env.languages.map(w=>w.code)]);let _=(l&&k.has(l)?l:void 0)||(k.has(p)?p:void 0)||[...k][0];if((!_||!((M=e.supportedLocales)!=null&&M.find(w=>w.locale===_)))&&(_=((j=(q=e.supportedLocales)==null?void 0:q[0])==null?void 0:j.locale)||""),_){const w=[];Object.values(e.pages).forEach(s=>{const H=Object.values((s==null?void 0:s.sections)??{}).filter(f=>{var y;return f.component==="custom-component"&&((y=f.config)==null?void 0:y.componentId)}).map(f=>{var y,W;return{id:f.id,componentId:f.config.componentId,useCache:f.config.useCache,cacheDuration:f.config.cacheDuration,properties:(W=(y=s==null?void 0:s.dataSource)==null?void 0:y[f.id])==null?void 0:W[_]}});w.push(...H)});const B=new Promise(s=>{setTimeout(()=>{s({})},90*1e3)});try{await Promise.race([B,C.getPreloadComponents({mode:K,req:o,state:e,locale:_,instances:w,module:V.PreloadComponentScriptModule.UMD_FN}).then(s=>{s&&(m=x.injectPreloadComponents(s))})])}catch(s){C.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",s)}}}try{const l=(r==null?void 0:r.title)||a.default.env.appName,p=(r==null?void 0:r.description)||a.default.env.appDescription,k=I.withQuery(I.joinURL(a.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:l,description:p});b=ue.default.render(i,{ogTitle:l,ogDescription:p,ogImage:we(r==null?void 0:r.image)||k,pagesPublishedAt:(e==null?void 0:e.config.publishedAt)||new Date().getTime()})}catch{}const c=e==null?void 0:e.config.fontFamily,N=o.query.mode==="draft"||o.url.includes("preview")||(($=o.path)==null?void 0:$.startsWith("/admin")),g=O.load(b);let u=r==null?void 0:r.backgroundColor;if(u&&X.isMuiColorKey(u)){const l=await me();u=de.default(l,`settings.theme.light.palette.${u}`,u)}g("head").find("#injected-head-elements").replaceWith(`
2
- ${u?`<meta name="theme-color" content="${u}" /><style>html,body,#app {background-color: ${u};}</style>`:""}
3
- ${c!=null&&c.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${c.title}&display=swap">`:""}
4
- ${c!=null&&c.description&&(c==null?void 0:c.description)!==(c==null?void 0:c.title)?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${c.description}&display=swap">`:""}
1
+ "use strict";const D=require("@arcblock/did-auth-storage-nedb"),$=require("@blocklet/sdk/lib/config"),U=require("@blocklet/sdk/lib/service/auth"),K=require("@blocklet/sdk/lib/wallet"),N=require("@blocklet/sdk/lib/wallet-authenticator"),B=require("@blocklet/sdk/lib/wallet-handler"),A=require("path"),v=require("./chunks/site-state-gSkcvhcV.js"),H=require("@arcblock/crawler-middleware"),R=require("@blocklet/pages-kit/types"),F=require("@blocklet/pages-kit/utils/common"),j=require("@blocklet/pages-kit/utils/preload"),z=require("@blocklet/sdk/lib/component"),J=require("cheerio/slim"),G=require("express"),E=require("fs"),Y=require("lodash/get"),Q=require("mustache"),P=require("ufo"),r=t=>t&&t.__esModule?t:{default:t};function V(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 X=r(D),c=r($),Z=r(U),ee=r(K),te=r(N),ne=r(B),oe=r(A),M=V(J),ae=r(Y),ce=r(Q),se=(t={})=>{const e={data:new Map,timers:new Map,set:(n,s,u=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),u)),e.data.set(n,s)},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=se({max:1,ttl:1e3*30});ee.default();const le=new te.default;new ne.default({authenticator:le,tokenStorage:new X.default({dbPath:oe.default.join(c.default.env.dataDir,"auth.db")})});const re=new Z.default,ie=async()=>{try{const t=q.get("blockletInfo");if(t)return t;const{blocklet:e}=await re.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},de=["/assets/"];function ue({app:t,viteDevServer:e,state:n}){let s;if(e){const o=E.readFileSync(A.resolve(process.cwd(),"./index.html"),"utf-8");t.use(async(g,b,C)=>{const T=g.originalUrl;s=await e.transformIndexHtml(T,o),C()})}else s=E.readFileSync(A.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const u=G.Router();u.use((o,g,b)=>{if(o.headers["x-unique-record"]==="dial_http"){v.logger.info("[html] dial http request, return 200 status code"),g.status(200).send("ok");return}b()}),c.default.env.preferences.snapkitEnabled&&c.default.env.preferences.snapkitEndpoint&&c.default.env.SNAP_KIT_ACCESS_KEY&&u.use(H.createSnapshotMiddleware({endpoint:c.default.env.preferences.snapkitEndpoint,accessKey:c.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:c.default.env.preferences.snapkitCacheSize||100})),u.get("/:path(*)?",async(o,g,b)=>{if(de.some(a=>o.path?.startsWith(a))){b();return}const C=performance.now(),T=()=>Math.round(performance.now()-C),W="production";let _,k,w=s;if(o.path.startsWith("/pages")){const a=o.params.lang,y=o.cookies.nf_lang,S=new Set([...c.default.env.languages.map(h=>h.code)]);let m=(a&&S.has(a)?a:void 0)||(S.has(y)?y:void 0)||[...S][0];if((!m||!n.supportedLocales?.find(h=>h.locale===m))&&(m=n.supportedLocales?.[0]?.locale||""),m){const h=[];Object.values(n.pages).forEach(l=>{const O=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]?.[m]}));h.push(...O)});const L=new Promise(l=>{setTimeout(()=>{l({})},90*1e3)});try{await Promise.race([L,v.getPreloadComponents({mode:W,req:o,state:n,locale:m,instances:h,module:R.PreloadComponentScriptModule.UMD_FN}).then(l=>{l&&(k=j.injectPreloadComponents(l))})])}catch(l){v.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",l)}}}try{const a=_?.title||c.default.env.appName,y=_?.description||c.default.env.appDescription,S=P.withQuery(P.joinURL(c.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:a,description:y});w=ce.default.render(s,{ogTitle:a,ogDescription:y,ogImage:pe(_?.image)||S,pagesPublishedAt:n?.config.publishedAt||new Date().getTime()})}catch{}const p=n?.config.fontFamily,x=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin"),f=M.load(w);let i=_?.backgroundColor;if(i&&F.isMuiColorKey(i)){const a=await ie();i=ae.default(a,`settings.theme.light.palette.${i}`,i)}f("head").find("#injected-head-elements").replaceWith(`
2
+ ${i?`<meta name="theme-color" content="${i}" /><style>html,body,#app {background-color: ${i};}</style>`:""}
3
+ ${p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.title}&display=swap">`:""}
4
+ ${p?.description&&p?.description!==p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.description}&display=swap">`:""}
5
5
  <script>
6
6
 
7
- window.__PAGE_STATE__ = ${x.safeJSONStringify(e||null)};
7
+ window.__PAGE_STATE__ = ${j.safeJSONStringify(n||null)};
8
8
 
9
9
  document.querySelectorAll('link[rel="preload"][as="style"]').forEach(function (link) {
10
10
  const l = document.createElement('link');
@@ -14,10 +14,10 @@
14
14
  });
15
15
  <\/script>
16
16
 
17
- ${N?`<script src="https://cdn.tailwindcss.com"><\/script>
17
+ ${x?`<script src="https://cdn.tailwindcss.com"><\/script>
18
18
  <script>
19
19
  window.tailwind.config = {
20
20
  darkMode: "class",
21
21
  };
22
22
  <\/script>`:""}
23
- `);const E=U.getBlockletJs();if(E&&g('script[src="__blocklet__.js"]').replaceWith(`<script>${E}<\/script>`),m!=null&&m.html&&g("head").find("#injected-html-elements").replaceWith(m.html),o.cachedHtml){const l=O.load(o.cachedHtml);g("body").html(l("body").html()||"")}b=g.html(),S.send(b),C.logger.info(`[html] render: ${o.path}, ${A()}ms`),g.root().children().remove(),b=null,r=null,m=null}),n.use(h)}function we(n){const t=Z.getComponentMountPoint("image-bin");return t&&n&&!/^(https?:\/\/|\/)/.test(n)?a.default.env.appUrl+I.joinURL(t,"uploads",n):n}module.exports=_e;
23
+ `);const I=$.getBlockletJs();if(I&&f('script[src="__blocklet__.js"]').replaceWith(`<script>${I}<\/script>`),k?.html&&f("head").find("#injected-html-elements").replaceWith(k.html),o.cachedHtml){const a=M.load(o.cachedHtml);f("body").html(a("body").html()||"")}w=f.html(),g.send(w),v.logger.info(`[html] render: ${o.path}, ${T()}ms`),f.root().children().remove(),w=null,_=null,k=null}),t.use(u)}function pe(t){const e=z.getComponentMountPoint("image-bin");return e&&t&&!/^(https?:\/\/|\/)/.test(t)?c.default.env.appUrl+P.joinURL(e,"uploads",t):t}module.exports=ue;
@@ -1 +1 @@
1
- "use strict";const c=require("./chunks/site-state-BtZ8o3J2.js"),M=require("async_hooks"),U=require("express"),F=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),$=require("@blocklet/sdk/lib/middlewares/auth"),G=require("@blocklet/sdk/lib/component"),y=t=>t&&t.__esModule?t:{default:t},l=y(F),I=y(J),D=y(X),K=y(W),k=y(B),v=y($);new M.AsyncLocalStorage;const Y=async(t,e,o)=>{var n,s,r,i;try{const{projectId:u}=t.params;if(!u)return o();const f=await c.Project.findByPk(u);if(!f)return e==null?void 0:e.status(404).json({error:"Project not found"});const _=(n=t.user)==null?void 0:n.did,E=((s=t.user)==null?void 0:s.role)||"UNKNOWN_ROLE";if(!_)return e==null?void 0:e.status(401).json({error:"Authentication required"});if(c.isMultiTenant()){const w=f.createdBy===_,a=(i=(r=c.getMultiTenantAllProjectAccessPassports())==null?void 0:r.includes)==null?void 0:i.call(r,E);if(!w&&!a)return e==null?void 0:e.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(E))return e==null?void 0:e.status(403).json({error:"No permission to access this project in single-tenant mode"});t.project=f,t.projectId=u,o()}catch(u){c.logger.error("Project middleware error:",u),e==null||e.status(400).json({error:"Internal server error"})}};function b(t,e){return new Promise((o,n)=>{const s=l.default.createReadStream(t),r=l.default.createWriteStream(e);s.on("error",n),r.on("error",n),r.on("finish",o),s.pipe(r)})}async function N(t,e){await l.default.promises.mkdir(e,{recursive:!0});const o=await l.default.promises.readdir(t,{withFileTypes:!0});for(const n of o){const s=k.default.join(t,n.name),r=k.default.join(e,n.name);n.isDirectory()?await N(s,r):await b(s,r)}}async function z(t,e){(await l.default.promises.stat(t)).isDirectory()?await N(t,e):await b(t,e)}const O=(t,e,o)=>c.isMultiTenant()?v.default()(t,e,o):v.default({roles:["owner","admin","pagesEditor"]})(t,e,o),H=(t,e)=>{const o=G.getResourceExportDir({projectId:t,releaseId:e});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},h=U.Router(),T="@page",q="@component",P=":",S="ALL",L="@project",C=({pageId:t,projectId:e})=>[T,e,t].join(P),Q=t=>{const[e,o,n]=t.split(P);if(e===T)return{pageId:n,projectId:o}},A=({componentId:t,projectId:e})=>[q,e,t].join(P),V=t=>{const[e,o,n]=t.split(P);if(e===q)return{componentId:n,projectId:o}},Z=t=>[L,t].join(P),tt=t=>{const[e,o]=t.split(P);if(e===L)return o},et=t=>{try{return JSON.parse(t)}catch{}return{}};async function x(t){const e=await c.SiteState.getStateByProjectId(t,"production"),o=await c.Project.findByPk(t),n=e.pageIds.map(r=>{const i=e.pages[r];if(i)return{id:C({pageId:r,projectId:t}),name:i.slug}}).filter(Boolean),s=K.default(Object.values(e.components),r=>r.index).map(({data:r})=>({id:A({componentId:r.id,projectId:t}),name:r.name||r.id}));return{id:Z(t),name:(o==null?void 0:o.name)||"Unnamed Project",children:[{id:C({pageId:S,projectId:t}),name:"Pages",children:n},{id:A({componentId:S,projectId:t}),name:"Components",children:s}]}}h.get("/resources",O,async(t,e)=>{const{projectId:o}=et(t.query.resourcesParams);if(o){t.params={...t.params,projectId:o},await Y(t,e,()=>{});const r=await x(o);e.json({resources:[r]});return}const n=await c.Project.findAll({where:{}}),s=await Promise.all(n.map(r=>x(r.id)));e.json({resources:s})});const ot=I.default.object({projectId:I.default.string().required().min(1),releaseId:I.default.string().allow(""),resources:I.default.array().items(I.default.string()).required(),locale:I.default.string().allow("")});h.post("/resources",O,async(t,e)=>{const{resources:o,projectId:n,releaseId:s}=await ot.validateAsync(t.body),r="production",i=[],u=[];for(const a of o){if(tt(a))continue;const{pageId:m,projectId:j}=Q(a)||{};if(m)m===S||m&&j&&i.push({pageId:m,projectId:j});else{const{componentId:p,projectId:d}=V(a)||{};p===S||p&&d&&u.push({componentId:p,projectId:d})}}const f=D.default(i,"projectId"),_=D.default(u,"projectId"),E=new Set([...Object.keys(f),...Object.keys(_)]),w=H(n,s);l.default.rmSync(w,{recursive:!0,force:!0}),l.default.mkdirSync(w,{recursive:!0});for(const a of E){const m=await c.SiteState.getStateByProjectId(a,r),j=f[a],p=_[a],d=j==null?void 0:j.map(g=>g.pageId),R=p==null?void 0:p.map(g=>g.componentId);if(d!=null&&d.length||R!=null&&R.length){const g=await c.toPackage(m,{exportAssets:!0,pageIds:d,componentIds:R});await z(g,w),l.default.rmSync(g,{recursive:!0,force:!0})}c.logger.info(`Exported resources for project ${a}`,{pageIds:d,componentIds:R})}e.json({})});h.get("/all-resources",O,async(t,e)=>{const{states:o}=await c.getResourceStates(),n=o==null?void 0:o.map(s=>{const r={blockletId:s.blockletId,blockletTitle:s.blockletTitle,components:{}};if(s.state.components&&(r.components=s.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);e.json(n)});module.exports=h;
1
+ "use strict";const c=require("./chunks/site-state-gSkcvhcV.js"),L=require("async_hooks"),M=require("express"),F=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),x=require("path"),$=require("@blocklet/sdk/lib/middlewares/auth"),G=require("@blocklet/sdk/lib/component"),m=e=>e&&e.__esModule?e:{default:e},u=m(F),f=m(J),O=m(X),K=m(W),C=m(x),D=m($);new L.AsyncLocalStorage;const Y=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(c.isMultiTenant()){const g=n.createdBy===r,P=c.getMultiTenantAllProjectAccessPassports()?.includes?.(a);if(!g&&!P)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){c.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 b(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=C.default.join(e,s.name),r=C.default.join(t,s.name);s.isDirectory()?await b(n,r):await B(n,r)}}async function z(e,t){(await u.default.promises.stat(e)).isDirectory()?await b(e,t):await B(e,t)}const S=(e,t,o)=>c.isMultiTenant()?D.default()(e,t,o):D.default({roles:["owner","admin","pagesEditor"]})(e,t,o),H=(e,t)=>{const o=G.getResourceExportDir({projectId:e,releaseId:t});return x.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},w=M.Router(),N="@page",T="@component",j=":",_="ALL",U="@project",k=({pageId:e,projectId:t})=>[N,t,e].join(j),Q=e=>{const[t,o,s]=e.split(j);if(t===N)return{pageId:s,projectId:o}},v=({componentId:e,projectId:t})=>[T,t,e].join(j),V=e=>{const[t,o,s]=e.split(j);if(t===T)return{componentId:s,projectId:o}},Z=e=>[U,e].join(j),ee=e=>{const[t,o]=e.split(j);if(t===U)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:k({pageId:r,projectId:e}),name:a.slug}}).filter(Boolean),n=K.default(Object.values(t.components),r=>r.index).map(({data:r})=>({id:v({componentId:r.id,projectId:e}),name:r.name||r.id}));return{id:Z(e),name:o?.name||"Unnamed Project",children:[{id:k({pageId:_,projectId:e}),name:"Pages",children:s},{id:v({componentId:_,projectId:e}),name:"Components",children:n}]}}w.get("/resources",S,async(e,t)=>{const{projectId:o}=te(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await Y(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const 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",S,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await oe.validateAsync(e.body),r="production",a=[],g=[];for(const i of o){if(ee(i))continue;const{pageId:d,projectId:y}=Q(i)||{};if(d)d===_||d&&y&&a.push({pageId:d,projectId:y});else{const{componentId:I,projectId:p}=V(i)||{};I===_||I&&p&&g.push({componentId:I,projectId:p})}}const P=O.default(a,"projectId"),h=O.default(g,"projectId"),q=new Set([...Object.keys(P),...Object.keys(h)]),R=H(s,n);u.default.rmSync(R,{recursive:!0,force:!0}),u.default.mkdirSync(R,{recursive:!0});for(const i of q){const d=await c.SiteState.getStateByProjectId(i,r),y=P[i],I=h[i],p=y?.map(l=>l.pageId),E=I?.map(l=>l.componentId);if(p?.length||E?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:E});await z(l,R),u.default.rmSync(l,{recursive:!0,force:!0})}c.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:E})}t.json({})});w.get("/all-resources",S,async(e,t)=>{const{states:o}=await c.getResourceStates(),s=o?.map(n=>{const r={blockletId:n.blockletId,blockletTitle:n.blockletTitle,components:{}};if(n.state.components&&(r.components=n.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);t.json(s)});module.exports=w;