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