@blocklet/pages-kit-inner-components 0.6.103 → 0.6.104
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-BmFOXvb0.js +57 -0
- package/lib/cjs/chunks/site-state-BQySNTiP.js +1 -0
- 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-DLjI_Xlm.js +615 -0
- package/lib/es/chunks/site-state-DS7eIMFg.js +1684 -0
- package/lib/es/components.js +14 -13
- 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 +7 -7
- package/lib/cjs/chunks/components-DsHjikTX.js +0 -57
- package/lib/cjs/chunks/site-state-DlLhHuIr.js +0 -1
- package/lib/es/chunks/components-BIhMGXjB.js +0 -610
- package/lib/es/chunks/site-state-CN4Kulgk.js +0 -1671
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";var se=Object.create;var B=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var pe=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ae(t))!le.call(e,s)&&s!==o&&B(e,s,{get:()=>t[s],enumerable:!(n=ce(t,s))||n.enumerable});return e};var P=(e,t,o)=>(o=e!=null?se(ie(e)):{},pe(t||!e||!e.__esModule?B(o,"default",{value:e,enumerable:!0}):o,e));const v=require("@blocklet/quickjs"),ue=require("crypto"),w=require("fs"),j=require("path"),de=require("@blocklet/sdk/lib/config"),me=require("lodash/isNil"),fe=require("@blocklet/pages-kit/builtin/utils"),T=require("@blocklet/pages-kit/types"),L=require("@blocklet/pages-kit/utils/builtin"),N=require("@blocklet/pages-kit/utils/property"),he=require("lodash/isEmpty"),ge=require("lru-cache"),J=require("node-fetch"),Ce=require("p-limit"),S=require("ufo"),we=require("@blocklet/logger"),V=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),et=require("@blocklet/sdk/lib/component"),E=e=>e&&e.__esModule?e:{default:e},W=E(j),h=E(de),ye=E(me),Se=E(he),Ee=E(J),q=E(Ce),xe=E(we);h.default.env.mode;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 _e="image-bin";h.default.env.INIT_TEMPLATE_PATH;const Pe=process.env.DATABASE_URL||W.default.join(h.default.env.dataDir,"db/pages-kit.db"),H=h.default,Me=()=>h.default.env.tenantMode==="multiple",Te=()=>(ye.default(H.env.preferences.multiTenantAllProjectAccessPassports)?[]:H.env.preferences.multiTenantAllProjectAccessPassports?.split(","))||[],Ie=W.default.join(h.default.env.dataDir,"fs-memoize-cache"),Oe=h.default.env.FS_MEMOIZE_CACHE_VERSION||"v1.0.0",g=xe.default("pages-kit"),be=Ie,Ae=Oe,R=30*24*60*60*1e3,ve=24*60*60*1e3,Q=async(e="")=>{const t=j.join(be,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},K=(e,...t)=>e.keyGenerator?e.keyGenerator(...t):JSON.stringify([e.subdir||"",...t]),Ne=(e,t)=>{const o=ue.createHash("md5").update(t).digest("hex");return j.join(e,`${Ae}-${o}.json`)},Re=async(e="")=>{const t=await Q(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=j.join(t,s);try{const p=await w.promises.readFile(r,"utf-8"),a=JSON.parse(p);a.createdAt&&o-a.createdAt>R&&await w.promises.unlink(r)}catch{try{const a=await w.promises.stat(r);o-a.mtimeMs>R&&await w.promises.unlink(r)}catch{}}}))}catch(n){console.error(`Failed to cleanup cache in ${t}:`,n)}},je=(()=>{const e=new Set;return setInterval(async()=>{await Promise.all(Array.from(e).map(n=>Re(n)))},ve).unref(),n=>{e.add(n)}})();function D(e,t){return t.subdir&&je(t.subdir),v.memoize(async(...n)=>{const s=await Q(t.subdir||""),r=K(t,...n),p=Ne(s,r);try{const a=await w.promises.readFile(p,"utf-8"),{value:m,createdAt:i}=JSON.parse(a);if(i&&Date.now()-i>R)throw await w.promises.unlink(p).catch(()=>{}),new Error("Cache expired");return m}catch{const m=await e(...n),i=JSON.stringify({value:m,createdAt:Date.now()});return w.promises.writeFile(p,i,"utf-8").catch(f=>{console.error("Failed to write fs cache:",f)}),m}},{keyGenerator:(...n)=>K(t,...n),lruOptions:t.lruOptions||{max:100,ttl:R}})}const z=async()=>await import("typescript"),De=async()=>await import("esbuild"),Le=async()=>(await import("postcss")).default,ke=async()=>(await import("tailwindcss")).default,Fe=async()=>(await import("autoprefixer")).default,$e=!1,Ue=async(e,{componentId:t})=>{const o=`@tailwind components;
|
|
2
|
+
@tailwind utilities;
|
|
3
|
+
`,n=`.CustomComponent_${t}`,s=await Le(),r=await ke(),p=await Fe();return(await s([r({content:[{raw:e,extension:"tsx"}]}),p({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),m=>{m.walkRules(i=>{i.selectors=i.selectors.map(f=>f.replace(/\.(.+)/g,`${n}.$1,${n} .$1`))})}]).process(o)).css},Be=async(e,{componentId:t})=>{const o=await Ue(e,{componentId:t});return`export const __PagesKit_CSS__ = ${JSON.stringify(o)};
|
|
4
|
+
|
|
5
|
+
${e}
|
|
6
|
+
`},G=D(async(e,t)=>{let o=await z();try{let n=o.transpileModule(e,{compilerOptions:{jsx:o.JsxEmit.React,target:o.ScriptTarget.ES2016,module:o.ModuleKind.ESNext},transformers:{before:[V.createBuiltinModuleTransformer(o)]}}).outputText;if(t.tailwind&&(n=await Be(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:X(t.moduleName,s)}catch(n){throw new Error(n)}finally{o=null}},{subdir:"transpileModule"}),qe=async(e,t)=>{let{build:o}=await De(),n=null;try{const r=(await o({entryPoints:["index.tsx"],external:Object.keys(L.BuiltinModules),format:"esm",target:"esnext",bundle:!0,write:!1,plugins:[{name:"vfs",setup(m){m.onResolve({filter:/.*/},i=>i.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:i.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),m.onLoad({filter:/.*/,namespace:"vfs"},async i=>{if(i.path==="index.tsx")return{contents:`export { ${t} } from './component'`,loader:"tsx"};if(i.path==="component.tsx")return{contents:e,loader:"tsx"};if(V.isRelativeModule(i.path)){const f=i.path.split("/").pop()}return null})}}]})).outputFiles?.[0]?.contents;if(!r)throw new Error("Failed to build server code");const p=Buffer.from(r).toString();return n=await z(),n.transpileModule(p,{compilerOptions:{module:n.ModuleKind.ESNext,target:n.ScriptTarget.ES2020}}).outputText}catch(s){throw new Error(s)}finally{o=null,n=null}},He=(e,t)=>new RegExp(`export\\s+\\{[^}]*(?:\\w+\\s+as\\s+${t}\\b|\\b${t}\\b)[^}]*\\}`,"m").test(e)?e:void 0,Z=D(async(e,t)=>{const o=await qe(e,t);return He(o,t)},{subdir:"extractExportValueSchema"}),X=(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
|
+
`,Y=async()=>{const{Sandbox:e}=await import("@blocklet/quickjs");return e};function Ke(e){return e?.type==="react-component"}const M=new ge.LRUCache({max:600,ttl:1e3*60*60*24*7}),ee=60*60,k=10;function F(e){g.info("clear preload components cache",{cacheKey:e}),M.delete(e)}function Ge(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function Je(e){for(const t of M.keys())t.includes(e)&&(g.info("clear preload components cache",{cacheKey:t}),F(t))}function te({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function Ve({mode:e,req:t,state:o,locale:n,instances:s,module:r}){const{supportedLocales:p,config:{defaultLocale:a}}=o;if(!a)return null;const m=q.default(10),i=(await Promise.all(s.map(l=>m(async()=>{try{const u=te({mode:e,instanceId:l.id,componentId:l.componentId,locale:n});if(e!=="draft"&&l.useCache&&M.has(u))return g.info(`get preload component from cache: ${u}`),M.get(u);const d=I({state:o,componentId:l.componentId});if(!d)return null;const x=await oe({req:t,state:o,componentId:d.id,locale:n,defaultLocale:a,properties:l.properties});if(!x)return null;const O={instanceId:l.id,preload:x};if(e!=="draft"&&l.useCache){let _=ee;l.cacheDuration&&(_=l.cacheDuration),g.info(`set preload component to cache(${_}s): ${u}`),M.set(u,O,{ttl:_*1e3})}return O}catch(u){return g.error("get preload component error",{instanceId:l.id,componentId:l.componentId},{error:u}),null}})))).filter(l=>!!l),f=Object.values(i.reduce((l,u)=>({...l,...u.preload.components}),{}));async function y(){const l=q.default(10),u=await Promise.all(f.map(d=>l(async()=>{const x=r===T.PreloadComponentScriptModule.ESM,O=r===T.PreloadComponentScriptModule.UMD_FN,_=r===T.PreloadComponentScriptModule.CJS,b=x?"":N.componentUMDName({componentId:d.component.id}),$=re(d.component);let A={module:r,script:"",moduleName:b};if($&&d.component.renderer?.type==="react-component"&&x&&d.component.renderer?.script)A.script=d.component.renderer?.script;else if($&&d.component.renderer?.type==="react-component"&&(_||O)&&d.component.renderer?.cjsScript){const U=d.component.renderer.cjsScript;A.script=_?U:X(b,U)}else A=x?{module:r,script:await G(d.script,{componentId:d.component.id,module:r,tailwind:e!=="draft"})}:{module:r,script:await G(d.script,{componentId:d.component.id,module:r,moduleName:b,tailwind:e!=="draft"}),moduleName:b};return[d.component.id,{component:d.component,script:A}]})));return Object.fromEntries(u)}const c=await y();return{config:{defaultLocale:a,supportedLocales:p},components:c,instances:i.map(l=>({id:l.instanceId,componentId:l.preload.component.id,locales:{[l.preload.locale]:{props:l.preload.props}}}))}}async function oe({req:e,state:t,componentId:o,locale:n,defaultLocale:s,properties:r}){const{supportedLocales:p}=t,a=I({state:t,componentId:o});if(!a)return null;const m=p.some(f=>f.locale===n)?n:s;if(!m)return null;const i=await ne({req:e,state:t,componentId:o,locale:m,defaultLocale:s,properties:r});return i?{component:a,...i}:null}const We=20;async function ne({req:e,depth:t=0,state:o,componentId:n,locale:s,defaultLocale:r,properties:p}){if(t>We)throw new RangeError("max component depth exceeded");const a=Qe({state:o,componentId:n,properties:p,locale:s});if(!a)return null;const{props:m,component:i}=a,f={locale:s||r,components:{[a.component.id]:{component:a.component,script:a.script}},props:{...m}};try{const y=Ke(i.renderer)?i.renderer.getServerSideProps:void 0,c=await Ze({...a,req:e,getServerSideProps:y});c?.props&&Object.assign(f.props,c.props)}catch(y){g.error("preload data at server side error",{componentId:n,name:a.component.name},{error:y})}return await Promise.all(Object.entries(m).map(async([y,c])=>{if(c?.type===N.RenderNestedComponent){const C=await ne({req:e,depth:t+1,state:o,componentId:c.componentId,locale:s,defaultLocale:r,properties:c.properties});C&&(Object.assign(f.components,C.components),Object.assign(f.props,{[y]:{type:N.RenderNestedComponent,componentId:c.componentId,props:C.props}}))}})),f}function Qe({state:e,componentId:t,locale:o,properties:n}){const s=I({state:e,componentId:t});if(!s)return null;const r=N.mergeComponent({componentId:t,getComponent:p=>I({state:e,componentId:p}),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 ze({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 Ze({component:e,script:t,props:o,req:n,getServerSideProps:s}){if(!s&&!t?.includes("getServerSideProps"))return null;const r=s??await Z(t,"getServerSideProps");if(!r)return null;const a=(r.match(/export\s*{\s*(\w+)\s+as\s+getServerSideProps\s*}/)||r.match(/export\s*{\s*getServerSideProps\s*}/))?.[1]||"getServerSideProps",m=new Promise(c=>{setTimeout(()=>{c({})},k*1e3)});let i=await Y();const f={componentMountPoints:h.default.components};return await Promise.race([m,i.callFunction({code:`${r}
|
|
33
|
+
|
|
34
|
+
export async function getServerSidePropsWrapper(props) {
|
|
35
|
+
const { location, fetch, props: componentProps } = props;
|
|
36
|
+
// 使用局部变量而不是全局变量
|
|
37
|
+
const originalLocation = typeof window !== 'undefined' ? window.location : undefined;
|
|
38
|
+
const originalFetch = globalThis.fetch;
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
globalThis.location = location;
|
|
42
|
+
globalThis.fetch = fetch;
|
|
43
|
+
return await ${a}(componentProps);
|
|
44
|
+
} finally {
|
|
45
|
+
// 清理全局状态
|
|
46
|
+
if (originalLocation) globalThis.location = originalLocation;
|
|
47
|
+
if (originalFetch) globalThis.fetch = originalFetch;
|
|
48
|
+
}
|
|
49
|
+
}`,filename:`${e.name||e.id}.js`,moduleLoader:c=>{if(c==="@blocklet/pages-kit/builtin/utils")return` const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
|
|
50
|
+
export { joinURL, withQuery, getQuery, getComponentMountPoint }
|
|
51
|
+
`;if(c==="@blocklet/pages-kit/builtin/dayjs")return v.BuiltinModules.dayjs;if(c in v.BuiltinModules)return v.BuiltinModules[c];if(c in L.BuiltinModules){const C=L.BuiltinModules[c];return Se.default(C)?void 0:C}},global:{console:{log:(...c)=>{g.info(...c)},warn:(...c)=>{g.warn(...c)},error:(...c)=>{g.error(...c)}},getComponentMountPoint:fe.getComponentMountPoint,joinURL:S.joinURL,withQuery:S.withQuery,getQuery:S.getQuery,window:{blocklet:f},blocklet:f},functionName:"getServerSidePropsWrapper",args:[{location:{href:S.joinURL(S.withHttps(n.hostname),n.originalUrl)},fetch:(c,{...C}={})=>{const l=typeof c=="string"&&c.startsWith("/")?S.joinURL(h.default.env.appUrl,c):c;if(typeof l=="string"&&S.parseURL(l).host===S.parseURL(h.default.env.appUrl).host){const u=n.get("cookie");if(u){const d=new J.Headers(C.headers);d.set("cookie",u),C.headers=d}}return Ee.default(l,{...C,timeout:k*1e3}).then(u=>({ok:u.ok,status:u.status,statusText:u.statusText,headers:Object.fromEntries(u.headers.entries()),json:()=>u.json()}))},props:o}]}).finally(()=>{i=null})])}const Xe=D(async(e,t,o,n)=>{if(!e?.includes(t)&&!n)return null;const s=n??await Z(e,t);if(s)try{let r=await Y();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"}),re=e=>!!(e.renderer?.type==="react-component"&&e.version&&e.version>=2);exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=ee;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=k;exports.IMAGE_BIN_NAME=_e;exports.clearPreloadComponentsCache=F;exports.clearPreloadComponentsCacheByInstanceId=Je;exports.clearPreloadComponentsCacheByMode=Ge;exports.databaseUrl=Pe;exports.getComponentFromState=I;exports.getComponentFromStateByName=ze;exports.getExportSchemaValueFromCode=Xe;exports.getMultiTenantAllProjectAccessPassports=Te;exports.getPreloadComponent=oe;exports.getPreloadComponents=Ve;exports.getPreloadComponentsCacheKey=te;exports.isMultiTenant=Me;exports.logger=g;exports.memoizeWithFs=D;exports.skipTranspileComponent=re;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const d=require("./components-BmFOXvb0.js"),q=require("@syncedstore/core"),et=require("yjs"),tt=require("@blocklet/pages-kit/utils/data-source"),Q=require("@blocklet/pages-kit/utils/route"),st=require("lodash/cloneDeep"),at=require("@blocklet/sdk/lib/config"),S=require("fs"),g=require("path"),ke=require("@blocklet/pages-kit/utils/common"),nt=require("@blocklet/pages-kit/utils/page-model"),ot=require("@blocklet/pages-kit/utils/property"),Ee=require("@blocklet/sdk/lib/component"),rt=require("@reactivedata/reactive"),Z=require("glob"),it=require("lib0/decoding"),ct=require("lib0/encoding"),lt=require("lodash/debounce"),ut=require("lodash/get"),dt=require("lodash/isEmpty"),pt=require("lodash/set"),ft=require("lodash/union"),we=require("lru-cache"),gt=require("p-limit"),D=require("sequelize"),mt=require("stream/promises"),ht=require("tar"),U=require("ufo"),yt=require("wait-on"),z=require("y-protocols/awareness"),ue=require("y-protocols/sync"),St=require("yaml"),Le=require("./html-xfTPTsl5.js");require("sqlite3");require("@blocklet/pages-kit/types/state");const $=t=>t&&t.__esModule?t:{default:t};function ne(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 M=ne(et),Ae=$(st),A=$(at),de=ne(it),v=ne(ct),Pe=$(lt),je=$(ut),Oe=$(dt),_e=$(pt),It=$(ft),Ne=$(gt),bt=$(yt),B=ne(St),Et=D.DataTypes.sqlite.DATE.parse;D.DataTypes.sqlite.DATE.parse=(t,e)=>typeof t=="number"?new Date(t):Et(t,e);const N=new D.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});N.query("PRAGMA journal_mode = WAL;");N.query("PRAGMA synchronous = normal;");N.query("PRAGMA journal_size_limit = 67108864;");N.query("PRAGMA cache_size = 10000;");process.on("SIGINT",async()=>{await N.close(),process.exit(0)});process.on("SIGTERM",async()=>{await N.close(),process.exit(0)});async function wt(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 me=null;me&&clearInterval(me);me=setInterval(async()=>{d.logger.info("Start cleanupSqliteMemory"),await wt(N,d.databaseUrl),d.logger.info("End cleanupSqliteMemory")},60*1e3*10);const At="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",he="page",ye="trigger-reload-project-resource",De=At,Pt="z2qa7BQdkEb3TwYyEYC1psK6uvmGnHSUHt5RM",jt="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o";class Te extends D.Model{}Te.init({id:{type:D.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:D.DataTypes.UUIDV4},projectId:{type:D.DataTypes.UUID,allowNull:!1},componentId:{type:D.DataTypes.STRING,allowNull:!1}},{sequelize:N,tableName:"ProjectComponents",timestamps:!1});const Ot="SLUG_INVALID",Y=t=>({error:"slugInvalid",code:Ot,field:"slug",message:t}),Dt={error:"slugRequired",code:"SLUG_REQUIRED",field:"slug",message:()=>"Project slug is required"},Tt={error:"slugAlreadyExists",code:"SLUG_EXISTS",field:"slug",message:t=>`Project slug "${t}" already exists`},Ct=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/\\:]/],Ue=t=>{if(!t)return"";if(t==="/")return"/";const e=U.withoutTrailingSlash(t);return U.withLeadingSlash(e)||"/"},Rt=t=>t.did===jt;class L extends D.Model{static async getProjectByIdOrSlug(e,s){return e?L.findOne({where:{[D.Op.or]:[{id:e},{slug:e}],...s?.createdBy?{createdBy:s.createdBy}:{}}}):null}static async validateProjectSlug({slug:e,projectId:s}){if(e==null)return null;if(e==="")return Dt;const a=e==="/"?"/":U.withoutTrailingSlash(U.withLeadingSlash(e)),n=Ue(a);if(a!=="/"&&a.endsWith("/"))return Y(i=>`Project slug "${i}" cannot end with /`);if(/\/{2,}/.test(a))return Y(i=>`Project slug "${i}" cannot contain consecutive /`);if(/\s/.test(a))return Y(i=>`Project slug "${i}" cannot contain whitespace`);if(Ct.some(i=>i.test(a)))return Y(i=>`Project slug "${i}" contains invalid characters`);if(A.default.components?.filter(i=>i.mountPoint&&!Rt(i)).some(i=>Ue(i.mountPoint)===n))return Y(i=>`Project slug "${i}" conflicts with existing blocklet`);const c=await L.findOne({where:{slug:a}});return c&&c?.id!==s?Tt:null}}L.init({id:{type:D.DataTypes.UUID,defaultValue:D.DataTypes.UUIDV4,primaryKey:!0},name:{type:D.DataTypes.STRING,allowNull:!1},description:D.DataTypes.TEXT,createdAt:D.DataTypes.DATE,updatedAt:D.DataTypes.DATE,createdBy:{type:D.DataTypes.STRING,allowNull:!1},updatedBy:{type:D.DataTypes.STRING,allowNull:!1},slug:D.DataTypes.STRING,icon:D.DataTypes.STRING,pinnedAt:D.DataTypes.DATE,useAllResources:D.DataTypes.BOOLEAN,npmSecret:D.DataTypes.STRING,relatedBlocklets:{type:D.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){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:D.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","{}")}}},meta:{type:D.DataTypes.JSON,allowNull:!0}},{sequelize:N,paranoid:!0,indexes:[{name:"projects_slug_unique",unique:!0,fields:["slug"]},{name:"projects_created_by",fields:["createdBy"]},{name:"projects_pinned_updated_meta_not_null",fields:[{name:"pinnedAt",order:"DESC"},{name:"updatedAt",order:"DESC"}],where:{meta:{[D.Op.ne]:null}}}]});L.hasMany(Te,{foreignKey:"projectId",as:"components"});function ee(t){t.observeDeep(e=>{e.some(s=>s.changes.keys.has("updatedAt")||s.changes.keys.has("publishedAt"))||t.set("updatedAt",new Date().toISOString())})}function Fe(){return S.mkdtempSync(g.join(A.default.env.dataDir,"tmp-"))}function te(t,e,s=[]){return Array.isArray(t)?t.flatMap((a,n)=>te(a,e,[...s,n])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([a,n])=>te(n,e,[...s,a])):e(t)?[s]:[]}function k(t){return t.filter(e=>e!=null)}function vt(t){t.pages&&Object.keys(t.pages).forEach(s=>{const a=q.getYjsValue(t.pages[s]);a&&a instanceof M.Map&&ee(a)});const e=q.getYjsValue(t.pages);e&&e instanceof M.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.pages[n]);o&&o instanceof M.Map&&ee(o)}})})}function kt(t){t.routes&&Object.keys(t.routes).forEach(s=>{const a=q.getYjsValue(t.routes?.[s]);a&&a instanceof M.Map&&ee(a)});const e=q.getYjsValue(t.routes);e&&e instanceof M.Map&&e.observe(s=>{s.changes.keys.forEach((a,n)=>{if(a.action==="add"){const o=q.getYjsValue(t.routes?.[n]);o&&o instanceof M.Map&&ee(o)}})})}function Lt(t,e){for(const s of e||Object.keys(t.routes||{})){let a=s,n=[];if(s.includes("-")){const[o,...c]=s.split("-");a=o,n=c||[]}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 c=Q.getRouteMetaDataByOptionIds(n,o);c&&(c.publishedAt=new Date().toISOString())}if(!e){const c=Q.generateParamCombinations({basePath:o.path,params:o.params,routeId:o.id,paramsOptions:o.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const i of c)i.routeMetaData??={},i.routeMetaData.publishedAt=new Date().toISOString()}}}}function pe({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={...Ae.default(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 c of s.supportedLocales){if(e.dataSource){let i=e.id;n&&(i=n.paramOptionIds.join("-"));const p=e.dataSource.pathDataMappings?.[i]?.dataCache?.[c.locale]??e.dataSource.pathDataMappings?.[i]?.dataCache?.[s.config.defaultLocale||"en"];if(!p)continue;tt.setPageDataSource(o,s,c.locale,p)}n&&n.routeMetaData&&(n.routeMetaData.publishedAt=new Date().toISOString())}return o}["true","1","yes","y"].includes(process.env.USE_FS_CACHE_HTML??"");const _t=60*60*1e3,H=new we.LRUCache({max:300,ttl:_t,ttlResolution:10*1e3,allowStale:!0});function Ut(t,e=[]){let s=0;const a=Array.from(H.keys()),n=t.map(o=>U.withoutTrailingSlash(o));for(const o of a)for(const c of n){if(Le.matchCacheKey(o,{currentPath:c})){H.delete(o),s++,d.logger.info(`[Cache CLEAR] key: ${o}`);break}for(const i of e)if(Le.matchCacheKey(o,{currentPath:`/${i}${c}`})){H.delete(o),s++,d.logger.info(`[Cache CLEAR] key: ${o}`);break}}return d.logger.info(`[Cache CLEAR] cleared ${s} entries for paths:`,n),s}function Mt(){const t=H.size;return H.clear(),d.logger.info(`[Cache CLEAR ALL] cleared ${t} entries`),t}A.default.events.on(A.default.Events.envUpdate,Mt);const{uploadToMediaKit:$t}=require("@blocklet/uploader-server"),Ce=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,K=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,Me=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,Nt=1e4,Ft=3e4,W=0,fe=1,qt=0,xt=1,Se=A.default,x=g.join(process.env.BLOCKLET_DATA_DIR,"site-state"),Bt=["production","draft"],Gt=["production"];function se(t){return t?.replace(/\//g,"|")||""}function qe(){const t=Se.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 T extends M.Doc{constructor(e){super(),this.options=e,S.existsSync(this.draftYjsFilePath)&&M.applyUpdate(this,S.readFileSync(this.draftYjsFilePath)),this.syncedStore=rt.reactive(q.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 we.LRUCache({max:300,ttl:1e3*60*60*24});static periodicCheckTimer;static safeDeleteProjectStateDir(e){if(!e)throw new Error("Should provide project context");try{const s=g.join(x,e),a=g.join(x,`@del-${e}`);S.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 Z.globSync("*/",{cwd:x,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*","undefined"]})}static get allShared(){return this.projectIds.map(e=>T.shared(e))}static shared(e){if(!e)throw new Error("Should provide project context");let s=T.sharedInstances[e];return s||(s=new T({path:g.join(x,e)}),T.sharedInstances[e]=s,s)}static async getProductionState(e){const s=await L.findByPk(e,{attributes:["productionState"]});if(Oe.default(s?.productionState)){const a=g.join(x,e,"production"),n=await Re(a,{includeResources:!0})??qe();if(!n?.config?.defaultLocale){n.config??={};const o=Se.env.languages?.map(c=>({locale:c.code,name:c.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 T.sharedInstances[e],super.destroy()}initObserver(){vt(this.syncedStore),kt(this.syncedStore)}get draftYjsFilePath(){return g.join(this.options.path,"draft.yjs")}static async getStateByProjectId(e,s){if(s==="draft"){const a=T.shared(e);return JSON.parse(JSON.stringify(a.syncedStore))}return T.getProductionState(e)}async getState(e){if(e==="draft")return JSON.parse(JSON.stringify(this.syncedStore));const s=g.basename(this.options.path);return T.getProductionState(s)}async setState(e,s){const a=await Ve(s,{exportAssets:!1,includeResources:!0}),n=this.getPublishDir(e);if(S.mkdirSync(g.dirname(n),{recursive:!0}),S.rmSync(n,{force:!0,recursive:!0}),S.renameSync(a,n),e==="production"){const o=g.basename(this.options.path);T.pageUrlMapCache.delete(o);const c=Ae.default(s);await L.update({productionState:c},{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(y=>{p.add(y)}),a.forEach(y=>{p.delete(y)}))}const c=v.createEncoder();v.writeVarUint(c,fe),v.writeVarUint8Array(c,z.encodeAwarenessUpdate(this.awareness,o));const i=v.toUint8Array(c);this.conns.forEach((p,y)=>this.send(y,i))};updateHandler=e=>{const s=v.createEncoder();v.writeVarUint(s,W),ue.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:c}=this.syncedStore;{const i=new Set(Object.keys(s));let p=0;for(;p<a.length;){const y=a[p];i.has(y)?(i.delete(y),p++):a.splice(p,1)}}{const i=new Set(Object.keys(o));let p=0;for(;p<c.length;){const y=c[p];i.has(y)?(i.delete(y),p++):c.splice(p,1)}}e.splice(0,e.length),e.push(...Se.env.languages.map(i=>({locale:i.code,name:i.name}))),n.defaultLocale=e[0]?.locale;{let i=0;const p=new Set;for(;i<e.length;){const{locale:y}=e[i];p.has(y)?e.splice(i,1):(i++,p.add(y))}}};send=(e,s)=>{e.readyState!==qt&&e.readyState!==xt&&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())},T.RELEASE_DELAY),d.logger.info(`[SiteState] scheduled release for project ${e} in ${T.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=Pe.default(()=>{S.mkdirSync(g.dirname(this.draftYjsFilePath),{recursive:!0}),S.writeFileSync(this.draftYjsFilePath,M.encodeStateAsUpdate(this))},Nt);save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()};publish=async({mode:e,routes:s})=>{const a=g.basename(this.options.path);await Qe(a);const n=await this.getState("draft"),o=await this.getState("production");await be(n,o,{routes:s,mergeMode:"replace",deleteRoutes:!0,publishMode:e}),o.config.publishedAt=new Date().getTime(),Lt(this.syncedStore,s),await this.setState(e,o),await this.clearPageCacheForRoutes(s,o)};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((c,i)=>{this.transact(async()=>{try{const p=await be(e,s);c(p)}catch(p){i(p)}})})};clearPageCacheForRoutes=async(e,s)=>{const a=g.basename(this.options.path),o=(await L.findByPk(a))?.slug||a;let c=e;(!c||c.length===0)&&(c=s.pageIds??[]),d.logger.info(`[SiteState] clearing page cache for project ${a}, routes:`,c||[]);const i=s.supportedLocales.map(j=>j.locale),p=[],y=c.filter(j=>s.pageIds?.includes(j));for(const j of y){const E=s.pages[j].slug;o&&o!==a&&(o==="/"?p.push(E):p.push(`/${o}${E}`)),p.push(`/${a}${E}`)}if(p.length>0)try{const j=Ut(p,i);d.logger.info(`[SiteState] cleared ${j} page cache entries for project ${a}, routes:`,c)}catch{}T.pageUrlMapCache.delete(a)};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)}}},Ft);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{s=!0});{const n=v.createEncoder();v.writeVarUint(n,W),ue.writeSyncStep1(n,this),this.send(e,v.toUint8Array(n));const o=this.awareness.getStates();if(o.size>0){const c=v.createEncoder();v.writeVarUint(c,fe),v.writeVarUint8Array(c,z.encodeAwarenessUpdate(this.awareness,Array.from(o.keys()))),this.send(e,v.toUint8Array(c))}}};messageListener=(e,s)=>{try{const a=v.createEncoder(),n=de.createDecoder(s),o=de.readVarUint(n);switch(o){case W:v.writeVarUint(a,W),ue.readSyncMessage(n,a,this,null),v.length(a)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(a)));break;case fe:{z.applyAwarenessUpdate(this.awareness,de.readVarUint8Array(n),e);break}default:d.logger.warn(`Unsupported messageType ${o}`)}}catch(a){d.logger.error(a)}this.save()};static async pageUrlMap(e,s){d.logger.info(`[SiteState] get pageUrlMap, mode: ${e}, projectId: ${s}`);let a=[];s?a=[s]:a=await this.getProjectIds();let n={};if(e==="production"&&a?.length){const o=new Map(a?.map(c=>[c,!0])||[]);for(const c of a){const i=T.pageUrlMapCache.get(c);i&&(Object.assign(n,i),o.delete(c))}a=Array.from(o.keys())}if(a?.length){d.logger.info("[SiteState] find project infos from database, projectIds: ",a);const o=10;for(let c=0;c<a.length;c+=o){const i=a.slice(c,c+o);d.logger.info(`[SiteState] processing project batch ${c/o+1}, ids: `,i);const p=await L.findAll({where:{id:{[D.Op.in]:i}}});await Promise.all(p?.map(async y=>{const j=y.id,R=y.slug||j,E={},m=e==="production"&&y?.productionState?y.productionState:await T.getStateByProjectId(y.id,e),f=It.default(A.default.env.languages?.map(w=>w.code)||[],m.supportedLocales?.map(w=>w.locale)||[]),I=(w,l)=>{R&&(E[U.joinURL("/",R,w)]={...l,shouldRedirect:!0,mainPage:!0}),E[U.joinURL("/",j,w)]={...l,shouldRedirect:!0,mainPage:!0};for(const u of f){const h={...l,locale:u};E[U.joinURL("/",u,j,w)]=h,R&&(E[U.joinURL("/",u,R,w)]=h)}};if(e==="draft")for(const w of m.routeIds||[]){const l=m?.routes?.[w];if(!l)continue;if(l.params&&l.params.length>0){const O=Q.generateParamCombinations({basePath:l.path,params:l.params,routeId:l.id,paramsOptions:l.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]});for(const P of O){const r=P.path,b={projectId:j,projectSlug:R,pageSlug:r,pageId:l.displayTemplateId||"",routeId:w,defaultLocale:f?.[0],locales:f,publishedAt:m.config.publishedAt,isPublic:l.isPublic&&P?.routeMetaData?.isPublic};I(r,b)}}const u=l.path,h={projectId:j,projectSlug:R,pageSlug:u,pageId:l.displayTemplateId||"",routeId:w,defaultLocale:f?.[0],locales:f,publishedAt:m.config.publishedAt,isPublic:l.isPublic};I(u,h)}for(const w of m.pageIds||[]){const l=m.pages[w];if(!l||e==="production"&&!l.isPublic)continue;const u=l.slug,h=y.slug||j,O={projectId:j,projectSlug:h,pageSlug:u,pageId:w,defaultLocale:f?.[0],locales:f,publishedAt:m.config.publishedAt,isPublic:l.isPublic,templateConfig:l.templateConfig};I(u,O)}e==="production"&&T.pageUrlMapCache.set(j,E),n={...n,...E}}))}}return d.logger.info("[SiteState] success get pageUrlMap"),n}getDocumentSize(){return M.encodeStateAsUpdate(this).byteLength}static getInstancesSizeInfo(){const e=[];for(const[s,a]of Object.entries(T.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(T.sharedInstances).length,s=[],a=[];for(const[n,o]of Object.entries(T.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:c}of s)try{d.logger.info(`[SiteState] releasing instance due to periodic check: ${o}`),c.destroy(),n++}catch(i){d.logger.error(`[SiteState] failed to release instance ${o} during periodic check:`,i)}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 Vt(t,e,s){if(!t||!S.existsSync(t)||!S.lstatSync(t).isFile())return null;let a=s[t];return a||(a=(async()=>{try{return(await $t({filePath:t,fileName:e}))?.data?.filename}catch(n){return d.logger.error(`Failed to upload asset ${t}:`,n),null}})(),s[t]=a),a}const xe=async(t,e)=>{const s=g.basename(t),a=await Ee.call({name:De,path:U.joinURL("/uploads",s),responseType:"stream",method:"GET"});if(a.status>=200&&a.status<400){const n=S.createWriteStream(e);await mt.pipeline(a.data,n)}else throw new Error(`download asset failed ${a.status}`)},Be=async(t,e)=>{await Promise.all(t.map(async s=>{try{await xe(s,g.join(e,g.basename(s)))}catch(a){d.logger.error(`Failed to export assets: ${s}, ${a}`)}}))};function Ge(t){return Ce.test(t)?[t]:K.test(t)?(Me.lastIndex=0,Array.from(t.matchAll(Me)).map(s=>s[1]).filter(s=>!!s)):[]}async function X(t,e,s){const{getFilename:a,exportAssets:n}=s,o=g.join(e,a(t));if(S.mkdirSync(g.dirname(o),{recursive:!0}),S.writeFileSync(o,B.stringify(t)),n){const i=te(t,p=>typeof p=="string"&&(Ce.test(p)||K.test(p))).map(p=>{const y=je.default(t,p);return Ge(y)}).flat().filter(Boolean);await Be(i,g.dirname(o))}}const Ie=new we.LRUCache({max:100,ttl:1*60*1e3});async function $e(t,e,s){const a=te(t,i=>typeof i=="string"&&(Ce.test(i)||K.test(i))),n=Ne.default(2),o=a.map(i=>n(async()=>{try{const p=je.default(t,i),y=Ge(p);for(const j of y){const R=g.basename(j),E=s.getFilePath(j,i),m=E?`${E}:${R}`:R,f=Ie.get(m);if(f){K.test(p)||_e.default(t,i,f);return}const I=await Vt(E,R,e);I&&(K.test(p)||_e.default(t,i,I),Ie.set(m,I))}}catch(p){d.logger.error(`Failed to process upload for path ${i.join(".")}:`,p.message||p.reason)}})),c=await Promise.allSettled(o);s.onFinish?.(c)}async function Ve(t,{exportAssets:e,pageIds:s="all",componentIds:a="all",rawConfig:n,includeResources:o=!1,routeIds:c="all"}={}){const i=s==="all"?t.pageIds:s,p=ot.getComponentDependencies({state:t,pageIds:i,componentIds:a==="all"?Object.keys(t.components):a});Object.entries(t.components).forEach(([r,b])=>{b.data?.renderer?.type==="component-template"&&p.push(r)});const y=c==="all"?t.routeIds:c,j=r=>({id:r.id,name:r.name,isTemplateSection:r.isTemplateSection??!1,templateDescription:r.templateDescription,component:r.component,config:r.config,visibility:r.visibility,sections:r?.sectionIds?k(r?.sectionIds?.map(b=>{const C=r.sections?.[b];return C&&j(C)})):void 0}),R=(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:k(r.sectionIds.map(C=>{const F=r.sections[C];return F&&j(F)})),dataSource:Object.fromEntries(Object.entries(r.dataSource||{}).map(([C,F])=>[C,F?.[b]??{}]))}),E=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}),m=k(y.map(r=>{const b=t.routes[r];return b&&E(b)})),f=k(t.supportedLocales.map(r=>r.locale).flatMap(r=>i.map(b=>{const C=t.pages[b];return C&&{locale:r,slug:C.slug,page:R(C,r)}}))),I=Fe(),w=g.join(I,"pages");S.mkdirSync(w,{recursive:!0});const l=g.join(I,"components");S.mkdirSync(l,{recursive:!0});const u=g.join(I,"routes");S.mkdirSync(u,{recursive:!0});for(const{locale:r,slug:b,page:C}of f)await X(C,w,{getFilename:()=>`${se(b)||"index"}.${r}.yml`,exportAssets:e});for(const r of m)await X(r,u,{getFilename:()=>`${se(r.path)||"index"}.yml`,exportAssets:e});for(const r of p){const b=t.components[r]?.data;b&&await X(b,l,{getFilename:C=>`${C.name||"unnamed"}.${C.id}.yml`,exportAssets:e})}const h=g.join(I,".blocklet/pages/pages.config.yml");S.mkdirSync(g.dirname(h),{recursive:!0});const O={pages:k(i.map(r=>{const b=t.pages[r];return b&&{id:r,slug:b.slug}})),routes:k(y.map(r=>{const b=t.routes[r];return b&&{id:r,path:b.path}})),components:k(p.map(r=>{const b=t.components[r]?.data;return b&&{id:r,name:b.name}})),...o?{resources:{components:k(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};S.writeFileSync(h,B.stringify(O));const P=g.join(I,"config.source.json");if(n&&S.writeFileSync(P,JSON.stringify(n)),o){const r=g.join(I,"resources"),b=g.join(r,"components");S.mkdirSync(b,{recursive:!0});for(const G of Object.keys(t?.resources?.components??{}).filter(_=>p.includes(_))){const _=t.resources?.components?.[G]?.component;_&&await X(_,b,{getFilename:V=>`${V.name||"unnamed"}.${V.id}.yml`,exportAssets:e})}const C=g.join(I,"chunks");S.mkdirSync(C,{recursive:!0});const F=zt();for(const G of Object.keys(t?.resources?.components??{}).filter(_=>p.includes(_))){const _=t.resources?.components?.[G]?.component;if(_&&_.renderer?.type==="react-component"){const V=_.renderer?.chunks??[];if(V?.length>0)for(const ce of V){const ve=g.join(C,ce),le=F?.[ce];try{le&&S.existsSync(le)&&!S.existsSync(ve)&&S.copyFileSync(le,ve)}catch(Ze){d.logger.error(`copy chunk ${ce} error`,Ze.message)}}}}}return I}async function Re(t,{importAssets:e,includeResources:s}={}){if(!S.existsSync(t))return null;let a,n=!1;try{S.lstatSync(t).isDirectory()?a=t:/\.(tgz|gz|tar)$/.test(t)&&(n=!0,a=Fe(),await ht.x({file:t,C:a}));const o=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:a,absolute:!0}).at(0),c=o&&g.join(g.dirname(o),"../../pages"),i=o&&g.join(g.dirname(o),"../../components"),p=o&&g.join(g.dirname(o),"../../routes");if(!o)return null;const y=B.parse(S.readFileSync(o).toString()),j=(l,u,h)=>{let O=g.join(l,`${u}${h?`.${h}`:""}.yml`);return(!S.existsSync(O)||!S.lstatSync(O).isFile())&&(O=g.join(l,u,`index${h?`.${h}`:""}.yml`),!S.existsSync(O)||!S.lstatSync(O))?null:B.parse(S.readFileSync(O).toString())},R=(l,u)=>{try{const h=Z.globSync(`*.${u}.yml`,{cwd:l,absolute:!0})[0];return h?B.parse(S.readFileSync(h).toString()):null}catch(h){d.logger.error("parse component error",h)}return null},E=(l,u)=>{let h=g.join(l,`${u}.yml`);return(!S.existsSync(h)||!S.lstatSync(h).isFile())&&(h=g.join(l,u,"index.yml"),!S.existsSync(h)||!S.lstatSync(h))?null:B.parse(S.readFileSync(h).toString())},m=k(y.pages.map(({slug:l})=>{const u=k(y.supportedLocales.map(({locale:P})=>{const r=c?j(c,se(l),P):void 0;if(r)return{locale:P,page:r};const b=c?j(c,l,P):void 0;return b&&{locale:P,page:b}})),h=u[0]?.page;if(!h)return null;const O=h.sections.map(nt.unzipSection);return{id:h.id||ke.nextId(),createdAt:h.createdAt,updatedAt:h.updatedAt,publishedAt:h.publishedAt,isPublic:h.isPublic??!0,templateConfig:h.templateConfig,slug:l,sections:Object.fromEntries(O.map(P=>[P.id,P])),sectionIds:O.map(P=>P.id),locales:Object.fromEntries(u.map(({locale:P,page:r})=>[P,r.meta])),dataSource:h.dataSource?Object.fromEntries([...new Set(u.flatMap(({page:P})=>Object.keys(P.dataSource??{})))].map(P=>[P,Object.fromEntries(u.map(({locale:r,page:b})=>{const C=b.dataSource?.[P];return[r,C||{}]}))])):Object.fromEntries([...new Set(u.flatMap(({page:P})=>P.sections.map(r=>r.id)))].map(P=>[P,Object.fromEntries(u.map(({locale:r,page:b})=>{const C=b.dataSource?.[P];if(C)return[r,C];const F=b.sections.find(G=>G.id===P);return[r,F?.properties||{}]}))]))}})),f=k(y?.routes?.map(({path:l})=>{const u=p?E(p,se(l)):void 0;return{...u,id:u?.id||ke.nextId(),createdAt:u?.createdAt??new Date().toISOString(),updatedAt:u?.updatedAt??new Date().toISOString(),publishedAt:new Date(0).toISOString(),path:u?.path??`/${u?.id}`,params:u?.params,handler:u?.handler??"Pages Kit",isPublic:u?.isPublic??!0,enabledGenerate:u?.enabledGenerate??!1,displayTemplateId:u?.displayTemplateId??void 0,dataSource:u?.dataSource??{}}})??[]),I=i?k(y.components?.map(({id:l})=>R(i,l))??[]):[];if(e){const l=(...u)=>{d.logger.info(`[${n?g.basename(t):g.basename(g.join(t,"../../../../"))}] importAssets:`,...u)};try{l("wait image-bin api ready"),await bt.default({resources:[`${Ee.getComponentWebEndpoint(d.IMAGE_BIN_NAME)}/api/sdk/uploads`],validateStatus:O=>O>=200&&O<=500}),l("image-bin api is ready");const u={},h={};l("start to upload assets"),await Promise.allSettled([$e(I,u,{getFilePath:O=>i&&g.join(i,O),onFinish:O=>{l(`upload ${O.length} component assets`)}}),$e(m,h,{getFilePath:(O,P)=>{const r=je.default(m,P.slice(0,1));return c&&g.join(c,g.dirname(r.slug),O)},onFinish:O=>{l(`upload ${O.length} page assets`)}})]),l("upload assets done"),Ie.clear(),global.gc&&global.gc()}catch(u){l("Error during asset import:",u)}}const w={};if(s){const l=o&&g.join(g.dirname(o),"../../resources/components"),u=k(y.resources?.components?.map(({id:h})=>R(l,h))??[]);u.length>0&&(w.components=Object.fromEntries(u.map((h,O)=>[h.id,{index:O,component:h}])))}return{supportedLocales:y.supportedLocales,pageIds:m.map(l=>l.id),components:Object.fromEntries(I.map((l,u)=>[l.id,{index:u,data:l}])),pages:Object.fromEntries(m.map(l=>[l.id,l])),config:y.config||{},resources:w,routeIds:f.map(l=>l.id),routes:Object.fromEntries(f.map(l=>[l.id,l])),dataSourceIds:[],dataSources:{}}}finally{n&&a&&S.rmSync(a,{force:!0,recursive:!0})}}async function be(t,e,{routes:s,mergeMode:a="byUpdateTime",deleteRoutes:n=!1,publishMode:o=void 0}={}){try{o&&d.clearPreloadComponentsCacheByMode(o)}catch(E){d.logger.error("clear preload page cache error",{error:E})}const{pages:c,pageIds:i,routeIds:p,routes:y,supportedLocales:j}=t;if(o==="production"){let E=s??[],m=null;for(const f of p??[]){const I=y?.[f];if(I?.params&&I?.params.length>0&&I?.paramsOptions&&I?.paramsOptions.length>0){const w=Q.generateParamCombinations({basePath:I.path,params:I.params,routeId:I.id,paramsOptions:I.paramsOptions,currentIndex:0,currentParams:[],currentOptionIds:[],result:[]}),l=Object.fromEntries(w.map(u=>[`${f}-${u.paramOptionIds.join("-")}`,u]));m={...m||{},...l},s||(E=[...E,...w.map(u=>`${f}-${u.paramOptionIds.join("-")}`)])}else s||E.push(f)}d.logger.info("routeIds to be published: ",E);for(const f of E){let I=f;if(I.includes("-")){const[u]=I.split("-");I=u}const w=y?.[I];if(!w){const u=e.pageIds.indexOf(I);u!==-1&&n&&(e.pageIds.splice(u,1),delete e.pages[I]);for(const h of e.pageIds)h.includes(`${I}-`)&&(e.pageIds.splice(e.pageIds.indexOf(h),1),delete e.pages[h]);d.logger.info("delete main route page",I);continue}if(f.includes("-")&&!m?.[f]){const u=e.pageIds.indexOf(f);u!==-1&&n&&(e.pageIds.splice(u,1),delete e.pages[f]),d.logger.info("delete page",f);continue}if(!w.displayTemplateId){d.logger.info("no display template",f);continue}const l=c[w.displayTemplateId];if(!l){d.logger.info("no template page",f);continue}if(e.pageIds.includes(f)){if(d.logger.info("has need update page",f),a==="replace")e.pages[f]=pe({page:l,route:w,state:t,routeId:f,routePathInfo:m?.[f]}),d.logger.info("replace page",f);else if(a==="byUpdateTime"){const u=e.pages[w.id];(!u||w.updatedAt&&w.updatedAt>u.updatedAt)&&(e.pages[f]=pe({page:l,route:w,state:t,routeId:f,routePathInfo:m?.[f]}),d.logger.info("replace page by update time",f))}}else e.pageIds.push(f),e.pages[f]=pe({page:l,route:w,state:t,routeId:f,routePathInfo:m?.[f]}),d.logger.info("add page",f)}if(n&&!s)for(const f of e.pageIds)E?.includes(f)||(delete e.pages[f],d.logger.info("delete page",f)),e.pageIds=[...e.pageIds].filter(I=>E?.includes(I))}else{for(const E of i){const m=c[E];if(m)if(e.pageIds.includes(m.id)){if(a==="replace")e.pages[m.id]=m;else if(a==="byUpdateTime"){const f=e.pages[m.id];(!f||m.updatedAt&&m.updatedAt>f.updatedAt)&&(e.pages[m.id]=m)}}else e.pageIds.push(m.id),e.pages[m.id]=m}for(const E of p){const m=y[E];if(m)if(e.routeIds.includes(m.id)){if(a==="replace")e.routes[m.id]=m;else if(a==="byUpdateTime"){const f=e.routes[m.id];(!f||m.updatedAt&&m.updatedAt>f.updatedAt)&&(e.routes[m.id]=m)}}else e.routeIds.push(m.id),e.routes[m.id]=m}}if(e.supportedLocales.splice(0,e.supportedLocales.length),e.supportedLocales.push(...Ae.default(j)),n)for(const E of Object.keys(e.components))delete e.components[E];let R=JSON.parse(JSON.stringify(t.components));R=Object.fromEntries(await Promise.all(Object.entries(R).map(async([E,m])=>{const f=await ze(m?.data);return[E,{...m,data:f}]}))),Object.assign(e.components,R),Object.assign(e.config,JSON.parse(JSON.stringify(t.config))),Oe.default(t.resources.components)||(e.resources.components=JSON.parse(JSON.stringify(t.resources.components||{})))}const ze=d.memoizeWithFs(async t=>{if(!Oe.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 ae,J,oe,re;const Ye=()=>Ee.getResources({types:[{did:De,type:he},{did:Pt,type:he}]}),zt=()=>{const t=Ye(),e={};return t.forEach(s=>{const a=Z.globSync("**/.blocklet/pages/pages.config.yml",{cwd:s.path,absolute:!0}).at(0),n=a&&g.join(g.dirname(a),"../../chunks");if(n&&S.existsSync(n)){const o=S.readdirSync(n);for(const c of o)e[c]=g.join(n,c)}}),e};function He(){return ae=(async()=>{const t=Ye();J=(await Promise.all(t.map(async s=>{const a=s.path?await Re(s.path,{importAssets:!1}):void 0;return a?{blockletId:s.did,state:a,blockletTitle:s.title}:void 0}))).filter(s=>!!s),oe=J.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=J.reduce((s,a)=>Object.assign(s,Object.fromEntries(Object.values(a.state.components).map(n=>[n.data.id,{blockletId:a.blockletId,component:n.data}]))),{});re=Object.fromEntries(await Promise.all(Object.entries(e).map(async([s,a])=>{const n=await ze(a.component);return[s,{...a,component:n}]})))})(),ae}function Ke(t){const e=Pe.default(async()=>{await He().catch(s=>{d.logger.error("load resource states error",{error:s})}),await t?.({states:J,pages:oe,components:re})},3e3,{leading:!1,trailing:!0});return e(),A.default.events.on(A.default.Events.componentAdded,e),A.default.events.on(A.default.Events.componentRemoved,e),A.default.events.on(A.default.Events.componentStarted,e),A.default.events.on(A.default.Events.componentStopped,e),A.default.events.on(A.default.Events.componentUpdated,e),A.default.events.on(ye,e),()=>{A.default.events.off(A.default.Events.componentAdded,e),A.default.events.off(A.default.Events.componentRemoved,e),A.default.events.off(A.default.Events.componentStarted,e),A.default.events.off(A.default.Events.componentStopped,e),A.default.events.off(A.default.Events.componentUpdated,e),A.default.events.off(ye,e)}}const Je=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),We=Symbol.for("GLOBAL_ENV_UPDATE_LISTENER_KEY"),ie=globalThis;ie[Je]?.();ie[Je]=Ke(async({pages:t,components:e})=>{const s=await T.getProjectIds();d.logger.info(`start update resource states projects(${s.length})`,s);const a=Ne.default(10);await Promise.race([new Promise(n=>{setTimeout(()=>{n({})},30*1e3)}),Promise.all(s.map(n=>a(async()=>{Xe({projectId:n,pages:t,components:e})})))]).catch(n=>{d.logger.error("update resource states failed:",n)})});ie[We]?.();ie[We]=()=>{const t=()=>{T.pageUrlMapCache.clear(),d.logger.info("[Cache CLEAR ALL] clear all page url map cache by env update")};return A.default.events.on(A.default.Events.envUpdate,t),()=>{A.default.events.off(A.default.Events.envUpdate,t)}};T.startPeriodicCheck();process.on("beforeExit",()=>{T.stopPeriodicCheck()});process.on("SIGINT",()=>{T.stopPeriodicCheck(),process.exit(0)});process.on("SIGTERM",()=>{T.stopPeriodicCheck(),process.exit(0)});async function Xe({projectId:t,pages:e,components:s}){const a=T.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 c=(await Te.findAll({where:{projectId:t}})).map(p=>p.componentId),i=Object.fromEntries(Object.entries(s||{}).filter(([p])=>c.includes(p)));a.syncedStore.resources.components=i}d.logger.info(`update [${t}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}const ge=new Map;async function Qe(t){if(!ge.has(t)){const e=Pe.default(async s=>Xe({projectId:s,pages:oe,components:re}),3e3);ge.set(t,e)}return ge.get(t)(t)}async function Yt(){d.logger.info("trigger reload all project resource"),A.default.events.emit(ye)}async function Ht({ensureLoaded:t=!0}={}){return t&&(ae??=He(),await ae),{states:J,pages:oe,components:re}}exports.COMPONENT_DID=De;exports.PUBLISH_MODES=Gt;exports.Project=L;exports.RESOURCE_TYPE=he;exports.SITE_STATE_PATH=x;exports.STATE_MODES=Bt;exports.SiteState=T;exports.downloadAsset=xe;exports.downloadAssets=Be;exports.fromPackage=Re;exports.getDefaultState=qe;exports.getResourceStates=Ht;exports.initPackResourceStates=Ke;exports.mergeState=be;exports.toPackage=Ve;exports.triggerReloadAllProjectResource=Yt;exports.updateResourceStatesByProjectId=Qe;
|
package/lib/cjs/components.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/components-BmFOXvb0.js");require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/builtin");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/sdk/lib/config");require("lodash/isEmpty");require("lru-cache");require("node-fetch");require("p-limit");require("ufo");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";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-
|
|
1
|
+
"use strict";const B=require("@arcblock/did-connect-storage-nedb"),E=require("@blocklet/sdk/lib/config"),D=require("@blocklet/sdk/lib/wallet"),U=require("@blocklet/sdk/lib/wallet-authenticator"),H=require("@blocklet/sdk/lib/wallet-handler"),K=require("@blocklet/sdk/service/auth"),C=require("path"),v=require("./chunks/components-BmFOXvb0.js"),T=require("./chunks/html-xfTPTsl5.js"),W=require("@arcblock/crawler-middleware"),N=require("@blocklet/pages-kit/types"),R=require("@blocklet/pages-kit/utils/common"),A=require("@blocklet/pages-kit/utils/preload"),F=require("@blocklet/sdk/lib/component"),O=require("express"),P=require("fs"),J=require("lodash/get"),z=require("mustache"),j=require("ufo"),y=n=>n&&n.__esModule?n:{default:n},G=y(B),s=y(E),Y=y(C),Q=y(J),V=y(z),X=(n={})=>{const e={data:new Map,timers:new Map,set:(t,d,u=n.ttl||36e5)=>{n.max&&e.data.size>=n.max&&e.delete(e.data.keys().next().value),e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.set(t,setTimeout(()=>e.delete(t),u)),e.data.set(t,d)},get:t=>e.data.get(t),has:t=>e.data.has(t),delete:t=>(e.timers.has(t)&&clearTimeout(e.timers.get(t)),e.timers.delete(t),e.data.delete(t)),clear:()=>{e.data.clear();for(const t of e.timers.values())clearTimeout(t);e.timers.clear()}};return e},q=X({max:1,ttl:1e3*30});D.getWallet();const Z=new U.WalletAuthenticator;new H.WalletHandlers({authenticator:Z,tokenStorage:new G.default({dbPath:Y.default.join(s.default.env.dataDir,"auth.db")})});const ee=new K.BlockletService,te=async()=>{try{const n=q.get("blockletInfo");if(n)return n;const{blocklet:e}=await ee.getBlocklet();return q.set("blockletInfo",e),e}catch{return null}},ne=["/assets/"];function oe({app:n,viteDevServer:e,state:t}){let d;if(e){const o=P.readFileSync(C.resolve(process.cwd(),"./index.html"),"utf-8");n.use(async(f,k,S)=>{const i=f.originalUrl;d=await e.transformIndexHtml(i,o),S()})}else d=P.readFileSync(C.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const u=O.Router();u.use((o,f,k)=>{if(o.headers["x-unique-record"]==="dial_http"){v.logger.info("[html] dial http request, return 200 status code"),f.status(200).send("ok");return}k()}),s.default.env.preferences.snapkitEnabled&&s.default.env.preferences.snapkitEndpoint&&s.default.env.SNAP_KIT_ACCESS_KEY&&u.use(W.createSnapshotMiddleware({endpoint:s.default.env.preferences.snapkitEndpoint,accessKey:s.default.env.SNAP_KIT_ACCESS_KEY,cacheMax:s.default.env.preferences.snapkitCacheSize||100})),u.get("/:path(*)?",async(o,f,k)=>{if(ne.some(c=>o.path?.startsWith(c))){k();return}const S="production";let i,b,g=d;if(o.path.startsWith("/pages")){const c=o.params.lang,_=o.cookies.nf_lang,w=new Set([...s.default.env.languages.map(h=>h.code)]);let m=(c&&w.has(c)?c:void 0)||(w.has(_)?_:void 0)||[...w][0];if((!m||!t.supportedLocales?.find(h=>h.locale===m))&&(m=t.supportedLocales?.[0]?.locale||""),m){const h=[];Object.values(t.pages).forEach(a=>{const L=Object.values(a?.sections??{}).filter(r=>r.component==="custom-component"&&r.config?.componentId).map(r=>({id:r.id,componentId:r.config.componentId,useCache:r.config.useCache,cacheDuration:r.config.cacheDuration,properties:a?.dataSource?.[r.id]?.[m]}));h.push(...L)});const x=new Promise(a=>{setTimeout(()=>{a({})},30*1e3)});try{await Promise.race([x,v.getPreloadComponents({mode:S,req:o,state:t,locale:m,instances:h,module:N.PreloadComponentScriptModule.UMD_FN}).then(a=>{a&&(b=A.injectPreloadComponents(a))})])}catch(a){v.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements",a)}}}try{const c=i?.title||s.default.env.appName,_=i?.description||s.default.env.appDescription,w=j.withQuery(j.joinURL(s.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:c,description:_});g=V.default.render(d,{ogTitle:c,ogDescription:_,ogImage:se(i?.image)||w,pagesPublishedAt:t?.config.publishedAt||new Date().getTime()})}catch{}const p=t?.config.fontFamily,M=o.query.mode==="draft"||o.url.includes("preview")||o.path?.startsWith("/admin");let l=i?.backgroundColor;if(l&&R.isMuiColorKey(l)){const c=await te();l=Q.default(c,`settings.theme.light.palette.${l}`,l)}const I=E.getBlockletJs(),$=[{selector:{cheerio:"#injected-head-elements",pattern:/<script[^>]*id=["']injected-head-elements["'][^>]*><\/script>/gis},value:`
|
|
2
2
|
${l?`<meta name="theme-color" content="${l}" /><style>html,body,#app {background-color: ${l};}</style>`:""}
|
|
3
3
|
${p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.title}&display=swap">`:""}
|
|
4
4
|
${p?.description&&p?.description!==p?.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${p.description}&display=swap">`:""}
|
package/lib/cjs/resources.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const I=require("./chunks/components-
|
|
1
|
+
"use strict";const I=require("./chunks/components-BmFOXvb0.js"),c=require("./chunks/site-state-BQySNTiP.js"),F=require("express"),L=require("fs"),J=require("joi"),X=require("lodash/groupBy"),W=require("lodash/sortBy"),B=require("path"),C=require("@blocklet/sdk/lib/middlewares/auth"),G=require("@blocklet/sdk/lib/component"),g=e=>e&&e.__esModule?e:{default:e},u=g(L),f=g(J),D=g(X),K=g(W),k=g(B),Y=async(e,t,o)=>{try{const{projectId:s}=e.params;if(!s)return o();const n=await c.Project.findByPk(s);if(!n)return t?.status(404).json({error:"Project not found"});const r=e.user?.did,a=e.user?.role||"UNKNOWN_ROLE";if(!r)return t?.status(401).json({error:"Authentication required"});if(I.isMultiTenant()){const P=n.createdBy===r,y=I.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){I.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=k.default.join(e,s.name),r=k.default.join(t,s.name);s.isDirectory()?await N(n,r):await b(n,r)}}async function $(e,t){(await u.default.promises.stat(e)).isDirectory()?await N(e,t):await b(e,t)}const h=(e,t,o)=>I.isMultiTenant()?C.authMiddleware()(e,t,o):C.authMiddleware({roles:["owner","admin","pagesEditor"]})(e,t,o),z=(e,t)=>{const o=G.getResourceExportDir({projectId:e,releaseId:t});return B.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},_=F.Router(),T="@page",U="@component",m=":",R="ALL",M="@project",v=({pageId:e,projectId:t})=>[T,t,e].join(m),H=e=>{const[t,o,s]=e.split(m);if(t===T)return{pageId:s,projectId:o}},x=({componentId:e,projectId:t})=>[U,t,e].join(m),Q=e=>{const[t,o,s]=e.split(m);if(t===U)return{componentId:s,projectId:o}},V=e=>[M,e].join(m),Z=e=>{const[t,o]=e.split(m);if(t===M)return o},ee=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=K.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:V(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}]}}_.get("/resources",h,async(e,t)=>{const{projectId:o}=ee(e.query.resourcesParams);if(o){e.params={...e.params,projectId:o},await Y(e,t,()=>{});const r=await A(o);t.json({resources:[r]});return}const s=await c.Project.findAll({where:{}}),n=await Promise.all(s.map(r=>A(r.id)));t.json({resources:n})});const te=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("")});_.post("/resources",h,async(e,t)=>{const{resources:o,projectId:s,releaseId:n}=await te.validateAsync(e.body),r="production",a=[],P=[];for(const i of o){if(Z(i))continue;const{pageId:d,projectId:w}=H(i)||{};if(d)d===R||d&&w&&a.push({pageId:d,projectId:w});else{const{componentId:j,projectId:p}=Q(i)||{};j===R||j&&p&&P.push({componentId:j,projectId:p})}}const y=D.default(a,"projectId"),O=D.default(P,"projectId"),q=new Set([...Object.keys(y),...Object.keys(O)]),E=z(s,n);u.default.rmSync(E,{recursive:!0,force:!0}),u.default.mkdirSync(E,{recursive:!0});for(const i of q){const d=await c.SiteState.getStateByProjectId(i,r),w=y[i],j=O[i],p=w?.map(l=>l.pageId),S=j?.map(l=>l.componentId);if(p?.length||S?.length){const l=await c.toPackage(d,{exportAssets:!0,pageIds:p,componentIds:S});await $(l,E),u.default.rmSync(l,{recursive:!0,force:!0})}I.logger.info(`Exported resources for project ${i}`,{pageIds:p,componentIds:S})}t.json({})});_.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=_;
|
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-BmFOXvb0.js");const e=require("./chunks/site-state-BQySNTiP.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;exports.updateResourceStatesByProjectId=e.updateResourceStatesByProjectId;Object.defineProperty(exports,"nextId",{enumerable:!0,get:()=>u.nextId});Object.keys(t).forEach(r=>{r!=="default"&&!Object.prototype.hasOwnProperty.call(exports,r)&&Object.defineProperty(exports,r,{enumerable:!0,get:()=>t[r]})});
|