@blocklet/pages-kit-inner-components 0.1.4 → 0.1.6
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-DITf866E.js → components-CGE2womb.js} +5 -5
- package/lib/cjs/_chunks/site-state-BjTlKyaF.js +1 -0
- package/lib/cjs/components.js +1 -1
- package/lib/cjs/project-html.js +23 -0
- package/lib/cjs/resources.js +1 -1
- package/lib/cjs/site-state.js +1 -1
- package/lib/es/_chunks/{components-Bo3_pN-Y.js → components-2nieeR3G.js} +43 -43
- package/lib/es/_chunks/site-state-BxPgS4Do.js +966 -0
- package/lib/es/components.js +1 -1
- package/lib/es/project-html.js +148 -0
- package/lib/es/resources.js +2 -2
- package/lib/es/site-state.js +2 -2
- package/package.json +20 -16
- package/lib/cjs/_chunks/site-state-kBaXBQhY.js +0 -1
- package/lib/es/_chunks/site-state-D3pCxsiM.js +0 -959
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
"use strict";const v=require("@blocklet/pages-kit/builtin/utils"),N=require("@blocklet/pages-kit/types"),O=require("@blocklet/pages-kit/utils/property"),
|
|
1
|
+
"use strict";const v=require("@blocklet/pages-kit/builtin/utils"),N=require("@blocklet/pages-kit/types"),O=require("@blocklet/pages-kit/utils/property"),S=require("@blocklet/quickjs"),q=require("@blocklet/sdk/lib/config"),F=require("lru-cache"),I=require("node-fetch"),C=require("ufo"),B=require("@blocklet/logger"),K=require("@blocklet/pages-kit/utils/builtin"),Q=require("@blocklet/pages-kit/utils/typescript/builtin-module-transformer"),J=require("autoprefixer"),V=require("esbuild"),A=require("postcss"),G=require("tailwindcss"),W=require("typescript"),h=e=>e&&e.__esModule?e:{default:e};function H(e){if(e&&e.__esModule)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const T=h(q),z=h(I),X=h(B),Y=h(J),Z=H(V),ee=h(A),te=h(G),m=h(W),f=X.default("pages-kit"),oe=async(e,{componentId:t})=>{const o=`@tailwind components;
|
|
2
2
|
@tailwind utilities;
|
|
3
3
|
`,n=`.CustomComponent_${t}`;return(await ee.default([te.default({content:[{raw:e,extension:"tsx"}]}),Y.default({overrideBrowserslist:["> 1%","last 2 versions"],stats:{}}),i=>{i.walkRules(r=>{r.selectors=r.selectors.map(s=>s.replace(/\.(.+)/g,`${n}.$1,${n} .$1`))})}]).process(o)).css},ne=async(e,{componentId:t})=>{const o=await oe(e,{componentId:t});return`export const __PagesKit_CSS__ = ${JSON.stringify(o)};
|
|
4
4
|
|
|
5
5
|
${e}
|
|
6
|
-
`},j=
|
|
6
|
+
`},j=S.memoize(async(e,t)=>{let o=m.default.transpileModule(e,{compilerOptions:{jsx:m.default.JsxEmit.React,target:m.default.ScriptTarget.ES2016,module:m.default.ModuleKind.ESNext},transformers:{before:[Q.createBuiltinModuleTransformer(m.default)]}}).outputText;if(t.tailwind&&(o=await ne(o,{componentId:t.componentId})),t.module===N.PreloadComponentScriptModule.ESM)return o;const n=m.default.transpileModule(o,{compilerOptions:{jsx:m.default.JsxEmit.React,target:m.default.ScriptTarget.ES2016,module:m.default.ModuleKind.CommonJS,moduleResolution:m.default.ModuleResolutionKind.Node16}}).outputText;return se(t.moduleName,n)},{keyGenerator:(e,t)=>JSON.stringify(["transpileModule",e,t])}),re=async(e,t)=>{var r,s;const n=(s=(r=(await Z.build({entryPoints:["index.tsx"],external:Object.keys(K.BuiltinModules),format:"esm",target:"es2020",bundle:!0,write:!1,plugins:[{name:"vfs",setup(u){u.onResolve({filter:/.*/},c=>c.path==="index.tsx"?{path:"index.tsx",namespace:"vfs"}:c.path==="./component"?{path:"component.tsx",namespace:"vfs"}:null),u.onLoad({filter:/.*/,namespace:"vfs"},async c=>c.path==="index.tsx"?{contents:`export { ${t} } from './component'`,loader:"tsx"}:c.path==="component.tsx"?{contents:e,loader:"tsx"}:(console.warn("onLoad 11111111",c.path),null))}}]})).outputFiles)==null?void 0:r[0])==null?void 0:s.contents;if(!n)throw new Error("Failed to build server code");const a=Buffer.from(n).toString();return m.default.transpileModule(a,{compilerOptions:{module:m.default.ModuleKind.ESNext,target:m.default.ScriptTarget.ES2020}}).outputText},R=S.memoize(async(e,t)=>{const o=await re(e,t);return new RegExp(`export\\s+\\{\\s+${t}\\s+\\}`,"m").test(o)?o:void 0},{keyGenerator:(e,t)=>JSON.stringify(["extractExportValueSchema",e,t])}),se=(e,t)=>`// GENERATED FILE. DO NOT EDIT.
|
|
7
7
|
var ${e} = function () {
|
|
8
8
|
return (function(exports) {
|
|
9
9
|
${t}
|
|
10
10
|
return exports
|
|
11
11
|
})({})
|
|
12
12
|
};
|
|
13
|
-
`,
|
|
13
|
+
`,w=new F.LRUCache({max:100}),$=60*60,M=60;function k(e){f.info("clear preload components cache",{cacheKey:e}),w.delete(e)}function ce(e){for(const t of w.keys())t.includes(e)&&(f.info("clear preload components cache",{cacheKey:t}),k(t))}function L({mode:e,instanceId:t,componentId:o,locale:n}){return["getPreloadComponents",e,t,o,n].join("-")}async function ae({mode:e,req:t,state:o,locale:n,instances:a,module:i}){const{supportedLocales:r,config:{defaultLocale:s}}=o;if(!s)return null;const u=(await Promise.all(a.map(async p=>{const d=L({mode:e,instanceId:p.id,componentId:p.componentId,locale:n});if(e!=="draft"&&p.useCache&&w.has(d))return f.info(`get preload component from cache: ${d}`),w.get(d);const _=y({state:o,componentId:p.componentId});if(!_)return null;const E=await U({req:t,state:o,componentId:_.id,locale:n,defaultLocale:s,properties:p.properties});if(!E)return null;const b={instanceId:p.id,preload:E};if(e!=="draft"&&p.useCache){let P=$;p.cacheDuration&&(P=p.cacheDuration),f.info(`set preload component to cache(${P}s): ${d}`),w.set(d,b,{ttl:P*1e3})}return b}))).filter(p=>!!p),c=Object.values(u.reduce((p,d)=>({...p,...d.preload.components}),{}));async function l(){const p=await Promise.all(c.map(async d=>{const _=O.componentUMDName({componentId:d.component.id}),E=i===N.PreloadComponentScriptModule.ESM?{module:i,script:await j(d.script,{componentId:d.component.id,module:i,tailwind:e!=="draft"})}:{module:i,script:await j(d.script,{componentId:d.component.id,module:i,moduleName:_,tailwind:e!=="draft"}),moduleName:_};return[d.component.id,{component:d.component,script:E}]}));return Object.fromEntries(p)}const g=await l();return{config:{defaultLocale:s,supportedLocales:r},components:g,instances:u.map(p=>({id:p.instanceId,componentId:p.preload.component.id,locales:{[p.preload.locale]:{props:p.preload.props}}}))}}async function U({req:e,state:t,componentId:o,locale:n,defaultLocale:a,properties:i}){const{supportedLocales:r}=t,s=y({state:t,componentId:o});if(!s)return null;const u=r.some(l=>l.locale===n)?n:a;if(!u)return null;const c=await D({req:e,state:t,componentId:o,locale:u,defaultLocale:a,properties:i});return c?{component:s,...c}:null}const ie=20;async function D({req:e,depth:t=0,state:o,componentId:n,locale:a,defaultLocale:i,properties:r}){if(t>ie)throw new RangeError("max component depth exceeded");const s=pe({state:o,componentId:n,properties:r,locale:a});if(!s)return null;const{props:u}=s,c={locale:a||i,components:{[s.component.id]:{component:s.component,script:s.script}},props:{...u}};try{const l=await le({...s,req:e});l!=null&&l.props&&Object.assign(c.props,l.props)}catch(l){f.error("preload data at server side error",{componentId:n,name:s.component.name},{error:l})}return await Promise.all(Object.entries(u).map(async([l,g])=>{if((g==null?void 0:g.type)===O.RenderNestedComponent){const x=await D({req:e,depth:t+1,state:o,componentId:g.componentId,locale:a,defaultLocale:i,properties:g.properties});x&&(Object.assign(c.components,x.components),Object.assign(c.props,{[l]:{type:O.RenderNestedComponent,componentId:g.componentId,props:x.props}}))}})),c}function pe({state:e,componentId:t,locale:o,properties:n}){const a=y({state:e,componentId:t});if(!a)return null;const i=O.mergeComponent({componentId:t,getComponent:r=>y({state:e,componentId:r}),locale:o,defaultLocale:e.config.defaultLocale,properties:n});return i?{component:a,script:i.script,props:{locale:o,...i.properties}}:null}function y({state:e,componentId:t}){var o,n,a;return((o=e.components[t])==null?void 0:o.data)??((a=(n=e.resources.components)==null?void 0:n[t])==null?void 0:a.component)}function ue({state:e,name:t}){var n,a;const o=t.toLowerCase();return((n=Object.values(e.components).find(i=>{var r;return((r=i.data.name)==null?void 0:r.toLowerCase())===o}))==null?void 0:n.data)??((a=e.resources.components&&Object.values(e.resources.components).find(i=>{var r;return((r=i.component.name)==null?void 0:r.toLowerCase())===o}))==null?void 0:a.component)}async function le({component:e,script:t,props:o,req:n}){const a=await R(t,"getServerSideProps");if(!a)return null;const i=new Promise((r,s)=>{setTimeout(()=>s(new Error("getServerSideProps timeout in promise race")),M*1e3)});return Promise.race([i,S.Sandbox.callFunction({code:`${a}
|
|
14
14
|
|
|
15
15
|
export async function getServerSidePropsWrapper({ location, fetch, props}) {
|
|
16
16
|
globalThis.location = location
|
|
@@ -20,10 +20,10 @@ export async function getServerSidePropsWrapper({ location, fetch, props}) {
|
|
|
20
20
|
}
|
|
21
21
|
`,filename:`${e.name||e.id}.js`,moduleLoader:r=>{if(r==="@blocklet/pages-kit/builtin/utils")return`const { joinURL, withQuery, getQuery, getComponentMountPoint } = globalThis
|
|
22
22
|
export { joinURL, withQuery, getQuery, getComponentMountPoint }
|
|
23
|
-
`;if(r==="@blocklet/pages-kit/builtin/dayjs")return
|
|
23
|
+
`;if(r==="@blocklet/pages-kit/builtin/dayjs")return S.BuiltinModules.dayjs},global:{console:{log:(...r)=>{f.info(...r)},warn:(...r)=>{f.warn(...r)},error:(...r)=>{f.error(...r)}},getComponentMountPoint:v.getComponentMountPoint,joinURL:C.joinURL,withQuery:C.withQuery,getQuery:C.getQuery},functionName:"getServerSidePropsWrapper",args:[{location:{href:C.joinURL(C.withHttps(n.hostname),n.originalUrl)},fetch:(r,{...s}={})=>{const u=typeof r=="string"&&r.startsWith("/")?C.joinURL(T.default.env.appUrl,r):r;if(typeof u=="string"&&C.parseURL(u).host===C.parseURL(T.default.env.appUrl).host){const c=n.get("cookie");if(c){const l=new I.Headers(s.headers);l.set("cookie",c),s.headers=l}}return z.default(u,{...s,timeout:M*1e3}).then(c=>({ok:c.ok,status:c.status,statusText:c.statusText,headers:Object.fromEntries(c.headers.entries()),json:()=>c.json()}))},props:o}]})])}const de=S.memoize(async(e,t,o)=>{const n=await R(e,t);return n?await S.Sandbox.callFunction({code:`
|
|
24
24
|
${n}
|
|
25
25
|
|
|
26
26
|
export function get${t}SchemaWrapper() {
|
|
27
27
|
return ${t};
|
|
28
28
|
}
|
|
29
|
-
`,filename:`${o}.js`,functionName:`get${t}SchemaWrapper`}):null},{keyGenerator:(e,t,o)=>JSON.stringify(["getExportSchemaValueFromCode",e,t,o])});exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=$;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=M;exports.clearPreloadComponentsCache=k;exports.clearPreloadComponentsCacheByMode=ce;exports.getComponentFromState=
|
|
29
|
+
`,filename:`${o}.js`,functionName:`get${t}SchemaWrapper`}):null},{keyGenerator:(e,t,o)=>JSON.stringify(["getExportSchemaValueFromCode",e,t,o])});exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=$;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=M;exports.clearPreloadComponentsCache=k;exports.clearPreloadComponentsCacheByMode=ce;exports.getComponentFromState=y;exports.getComponentFromStateByName=ue;exports.getExportSchemaValueFromCode=de;exports.getPreloadComponent=U;exports.getPreloadComponents=ae;exports.getPreloadComponentsCacheKey=L;exports.logger=f;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const O=require("./components-CGE2womb.js"),Ue=require("@blocklet/quickjs"),ue=require("@blocklet/sdk/lib/component"),Ce=require("@blocklet/sdk/lib/config"),Ne=require("@reactivedata/reactive"),H=require("@syncedstore/core"),y=require("fs"),re=require("glob"),Fe=require("lib0/decoding"),qe=require("lib0/encoding"),_=require("lodash"),Te=require("lru-cache"),Me=require("nanoid"),xe=require("p-limit"),f=require("path"),Be=require("stream/promises"),Ve=require("tar"),x=require("ufo"),$e=require("wait-on"),M=require("y-protocols/awareness"),te=require("y-protocols/sync"),Ge=require("yaml"),Je=require("yjs"),Ye=require("lodash/isNil"),T=require("sequelize");require("sqlite3");const Y=t=>t&&t.__esModule?t:{default:t};function Z(t){if(t&&t.__esModule)return t;const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const n=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(s,e,n.get?n:{enumerable:!0,get:()=>t[e]})}}return s.default=t,Object.freeze(s)}const S=Y(Ce),se=Z(Fe),j=Z(qe),ze=Y(xe),He=Y(f),Ke=Y($e),V=Z(Ge),q=Z(Je),We=Y(Ye);S.default.env.mode;const Xe="image-bin";S.default.env.INIT_TEMPLATE_PATH;const Qe=process.env.DATABASE_URL||He.default.join(S.default.env.dataDir,"db/pages-kit.db"),Se=S.default,Ze=()=>S.default.env.tenantMode==="multiple",et=()=>{var t;return(We.default(Se.env.preferences.multiTenantAllProjectAccessPassports)?[]:(t=Se.env.preferences.multiTenantAllProjectAccessPassports)==null?void 0:t.split(","))||[]},tt=T.DataTypes.sqlite.DATE.parse;T.DataTypes.sqlite.DATE.parse=(t,s)=>typeof t=="number"?new Date(t):tt(t,s);const z=new T.Sequelize({dialect:"sqlite",storage:Qe,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});z.query("pragma journal_mode = WAL;");z.query("pragma synchronous = normal;");z.query("pragma journal_size_limit = 67108864;");class ee extends T.Model{}ee.init({id:{type:T.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:T.DataTypes.UUIDV4},projectId:{type:T.DataTypes.UUID,allowNull:!1},componentId:{type:T.DataTypes.STRING,allowNull:!1}},{sequelize:z,tableName:"ProjectComponents",timestamps:!1});class C extends T.Model{static async getProjectByIdOrSlug(s){return C.findOne({where:{[T.Op.or]:[{id:s},{slug:s}]}})}}C.init({id:{type:T.DataTypes.UUID,defaultValue:T.DataTypes.UUIDV4,primaryKey:!0},name:{type:T.DataTypes.STRING,allowNull:!1},description:T.DataTypes.TEXT,createdAt:T.DataTypes.DATE,updatedAt:T.DataTypes.DATE,createdBy:{type:T.DataTypes.STRING,allowNull:!1},updatedBy:{type:T.DataTypes.STRING,allowNull:!1},slug:T.DataTypes.STRING,icon:T.DataTypes.STRING,pinnedAt:T.DataTypes.DATE,useAllResources:T.DataTypes.BOOLEAN,relatedBlocklets:{type:T.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){return this.getDataValue("relatedBlocklets")||{}},set(t){this.setDataValue("relatedBlocklets",JSON.stringify(t||{}))}}},{sequelize:z,paranoid:!0});C.hasMany(ee,{foreignKey:"projectId",as:"components"});const st="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",oe="page",ie="trigger-reload-project-resource",de=st,nt="z2qa7rr3eUyVnWp2PCxEVARuUfLFh6cE5V2xV",{uploadToMediaKit:at}=require("@blocklet/uploader-server"),ce=Me.customAlphabet("abcdefghijklmnopqrstuvwxyz0123456789",16),fe=/^\w+(\w|-|\.)+\w+\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm)$/,$=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/i,we=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,rt=1e4,ot=3e4,K=0,ne=1,it=0,ct=1,le=S.default,B=f.join(process.env.BLOCKLET_DATA_DIR,"site-state"),lt=["production","draft"],pt=["production"];function je(t){return(t==null?void 0:t.replace(/\//g,"|"))||""}function ut(){var e;const t=le.env.languages.map(n=>({locale:n.code,name:n.name})),s=(e=t[0])==null?void 0:e.locale;return{pageIds:[],pages:{},components:{},supportedLocales:t,config:{defaultLocale:s},resources:{}}}const U=class U extends q.Doc{constructor(s){super(),this.options=s,this.states={},this.conns=new Map,this.awarenessChangeHandler=({added:e,updated:n,removed:a},o)=>{const l=e.concat(n,a);if(o!==null){const c=this.conns.get(o);c&&(e.forEach(g=>{c.add(g)}),a.forEach(g=>{c.delete(g)}))}const i=j.createEncoder();j.writeVarUint(i,ne),j.writeVarUint8Array(i,M.encodeAwarenessUpdate(this.awareness,l));const r=j.toUint8Array(i);this.conns.forEach((c,g)=>this.send(g,r))},this.updateHandler=e=>{const n=j.createEncoder();j.writeVarUint(n,K),te.writeUpdate(n,e);const a=j.toUint8Array(n);this.conns.forEach((o,l)=>this.send(l,a))},this.ensureDataStructure=()=>{var l;const{supportedLocales:e,pages:n,pageIds:a,config:o}=this.syncedStore;{const i=new Set(Object.keys(n));let r=0;for(;r<a.length;){const c=a[r];i.has(c)?(i.delete(c),r++):a.splice(r,1)}}e.splice(0,e.length),e.push(...le.env.languages.map(i=>({locale:i.code,name:i.name}))),o.defaultLocale=(l=e[0])==null?void 0:l.locale;{let i=0;const r=new Set;for(;i<e.length;){const{locale:c}=e[i];r.has(c)?e.splice(i,1):(i++,r.add(c))}}},this.send=(e,n)=>{e.readyState!==it&&e.readyState!==ct&&this.closeConn(e);try{e.send(n,a=>{a&&this.closeConn(e)})}catch{this.closeConn(e)}},this.closeConn=e=>{if(e.removeAllListeners(),this.conns.has(e)){const n=this.conns.get(e);this.conns.delete(e),n&&M.removeAwarenessStates(this.awareness,Array.from(n),null)}e.close()},this.autoSave=_.debounce(()=>{y.mkdirSync(f.dirname(this.draftYjsFilePath),{recursive:!0}),y.writeFileSync(this.draftYjsFilePath,q.encodeStateAsUpdate(this))},rt),this.save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()},this.publish=async({mode:e,pages:n})=>{const a=await this.getState("draft"),o=await this.getState("production");await pe(a,o,{pages:n,pageMergeMode:"replace",deletePages:!0,publishMode:e}),o.config.publishedAt=new Date().getTime();for(const l of n||Object.keys(this.syncedStore.pages))this.syncedStore.pages[l]&&(this.syncedStore.pages[l].publishedAt=new Date().toISOString());await this.setState(e,o)},this.mergeState=async(e,n)=>{var i,r,c;const a=JSON.parse(JSON.stringify(n));(i=e.config).fontFamily??(i.fontFamily={});const o=(r=a.config)==null?void 0:r.fontFamily,l=(c=e.config)==null?void 0:c.fontFamily;e.config.fontFamily.title=(o==null?void 0:o.title)||(l==null?void 0:l.title),e.config.fontFamily.description=(o==null?void 0:o.description)||(l==null?void 0:l.description),await new Promise((g,p)=>{this.transact(async()=>{try{const h=await pe(e,n);g(h)}catch(h){p(h)}})})},this.addConnection=e=>{if(this.conns.has(e))return;e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",o=>this.messageListener(e,new Uint8Array(o)));let n=!0;const a=setInterval(()=>{if(!n)this.conns.has(e)&&this.closeConn(e),clearInterval(a);else if(this.conns.has(e)){n=!1;try{e.ping()}catch{this.closeConn(e),clearInterval(a)}}},ot);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{n=!0});{const o=j.createEncoder();j.writeVarUint(o,K),te.writeSyncStep1(o,this),this.send(e,j.toUint8Array(o));const l=this.awareness.getStates();if(l.size>0){const i=j.createEncoder();j.writeVarUint(i,ne),j.writeVarUint8Array(i,M.encodeAwarenessUpdate(this.awareness,Array.from(l.keys()))),this.send(e,j.toUint8Array(i))}}},this.messageListener=(e,n)=>{try{const a=j.createEncoder(),o=se.createDecoder(n),l=se.readVarUint(o);switch(l){case K:j.writeVarUint(a,K),te.readSyncMessage(o,a,this,null),j.length(a)>1&&(this.ensureDataStructure(),this.send(e,j.toUint8Array(a)));break;case ne:{M.applyAwarenessUpdate(this.awareness,se.readVarUint8Array(o),e);break}default:O.logger.warn(`Unsupported messageType ${l}`)}}catch(a){O.logger.error(a)}this.save()},y.existsSync(this.draftYjsFilePath)&&q.applyUpdate(this,y.readFileSync(this.draftYjsFilePath)),this.syncedStore=Ne.reactive(H.syncedStore({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{}},this)),this.initObserver(),this.on("update",this.updateHandler),this.awareness=new M.Awareness(this),this.awareness.on("update",this.awarenessChangeHandler),this.ensureDataStructure()}static safeDeleteProjectStateDir(s){if(!s)throw new Error("Should provide project context");try{const e=f.join(B,s),n=f.join(B,`@del-${s}`);y.renameSync(e,n)}catch(e){O.logger.error("Failed to safe delete project state dir:",e)}}static get projectIds(){return re.globSync("*/",{cwd:B,ignore:["@del-*","@tmp-*",".*","staging","production","@backup-*"]})}static get allShared(){return this.projectIds.map(s=>U.shared(s))}static shared(s){if(!s)throw new Error("Should provide project context");let e=this.sharedInstances.get(s);return e||(e=new U({path:f.join(B,s)}),this.sharedInstances.set(s,e),e)}destroy(){this.conns.forEach((s,e)=>this.closeConn(e)),this.awareness.destroy(),super.destroy()}initObserver(){const s=n=>{n.observeDeep(a=>{a.some(o=>o.changes.keys.has("updatedAt")||o.changes.keys.has("publishedAt"))||n.set("updatedAt",new Date().toISOString())})};this.syncedStore.pages&&Object.keys(this.syncedStore.pages).forEach(n=>{const a=H.getYjsValue(this.syncedStore.pages[n]);a&&a instanceof q.Map&&s(a)});const e=H.getYjsValue(this.syncedStore.pages);e&&e instanceof q.Map&&e.observe(n=>{n.changes.keys.forEach((a,o)=>{if(a.action==="add"){const l=H.getYjsValue(this.syncedStore.pages[o]);l&&l instanceof q.Map&&s(l)}})})}get draftYjsFilePath(){return f.join(this.options.path,"draft.yjs")}async getState(s){var e,n,a,o;if(s==="draft")return JSON.parse(JSON.stringify(this.syncedStore));if(!this.states[s]&&(this.states[s]=await ge(this.getPublishDir(s),{includeResources:!0})??ut(),!((n=(e=this.states[s])==null?void 0:e.config)!=null&&n.defaultLocale))){(a=this.states[s]).config??(a.config={});const l=le.env.languages.map(i=>({locale:i.code,name:i.name}));this.states[s].config.defaultLocale=(o=l[0])==null?void 0:o.locale}return{...this.states[s],resources:await Le().then(async l=>{var g,p,h,v;const{pages:i,components:r}=_.pick(l,"pages","components");let c=r;if((p=(g=this.states[s])==null?void 0:g.resources)!=null&&p.components)c={...(v=(h=this.states[s])==null?void 0:h.resources)==null?void 0:v.components};else{const I=f.basename(this.options.path),D=await C.findByPk(I);if(D!=null&&D.useAllResources)c=r;else{const N=(await ee.findAll({where:{projectId:I}})).map(m=>m.componentId);c=Object.fromEntries(Object.entries(r||{}).filter(([m])=>N.includes(m)))}}return{pages:i,components:c}}).catch(()=>({}))}}async setState(s,e){const n=await Oe(e,{exportAssets:!1,includeResources:!0}),a=this.getPublishDir(s);y.mkdirSync(f.dirname(a),{recursive:!0}),y.rmSync(a,{force:!0,recursive:!0}),y.renameSync(n,a),this.states[s]=e}getPublishDir(s){return f.join(this.options.path,s)}static async pageUrlMap(s){const{projectIds:e}=this,n={};for(const a of e){const o=await C.findByPk(a);if(!o)continue;const l=await U.shared(a).getState(s),i=_.union(S.default.env.languages.map(r=>r.code),l.supportedLocales.map(r=>r.locale));for(const r of l.pageIds){const c=l.pages[r];if(!c||s==="production"&&!c.isPublic)continue;const g=c.slug,p=o.slug||a,h={projectId:a,projectSlug:p,pageSlug:g,pageId:r,defaultLocale:i==null?void 0:i[0],locales:i,publishedAt:l.config.publishedAt,isPublic:c.isPublic,isTemplate:c.isTemplate};p&&(n[x.joinURL("/",p,g)]={...h,shouldRedirect:!0,mainPage:!0}),n[x.joinURL("/",a,g)]={...h,shouldRedirect:!0,mainPage:!0};for(const v of i){const I={...h,locale:v};n[x.joinURL("/",v,a,g)]=I,p&&(n[x.joinURL("/",v,p,g)]=I)}}}return n}};U.INSTANCE_TTL=30*60*1e3,U.sharedInstances=new Te.LRUCache({max:100,ttl:U.INSTANCE_TTL,dispose:s=>{s.destroy()}});let J=U;function ve(){return y.mkdtempSync(f.join(S.default.env.dataDir,"tmp-"))}function X(t,s,e=[]){return Array.isArray(t)?t.flatMap((n,a)=>X(n,s,[...e,a])):typeof t=="object"?t===null?[]:Object.entries(t).flatMap(([n,a])=>X(a,s,[...e,n])):s(t)?[e]:[]}function L(t){return t.filter(s=>s!=null)}async function dt(t,s,e){if(!t||!y.existsSync(t)||!y.lstatSync(t).isFile())return null;let n=e[t];return n||(n=(async()=>(await at({filePath:t,fileName:s})).data.filename)(),e[t]=n),n}const ft=async(t,s)=>{const e=f.basename(t),n=await ue.call({name:de,path:x.joinURL("/uploads",e),responseType:"stream",method:"GET"});if(n.status>=200&&n.status<400){const a=y.createWriteStream(s);await Be.pipeline(n.data,a)}else throw new Error(`download asset failed ${n.status}`)},gt=async(t,s)=>{await Promise.all(t.map(async e=>{try{await ft(e,f.join(s,f.basename(e)))}catch(n){O.logger.error(`Failed to export assets: ${e}, ${n}`)}}))};function Ie(t){return fe.test(t)?[t]:$.test(t)?(we.lastIndex=0,Array.from(t.matchAll(we)).map(e=>e[1]).filter(e=>!!e)):[]}async function ae(t,s,e){const{getFilename:n,exportAssets:a}=e,o=f.join(s,n(t));if(y.mkdirSync(f.dirname(o),{recursive:!0}),y.writeFileSync(o,V.stringify(t)),a){const i=X(t,r=>typeof r=="string"&&(fe.test(r)||$.test(r))).map(r=>{const c=_.get(t,r);return Ie(c)}).flat().filter(Boolean);await gt(i,f.dirname(o))}}const Ee=new Te.LRUCache({max:1e3,ttl:30*24*60*60*1e3});async function be(t,s,e){var i;const n=X(t,r=>typeof r=="string"&&(fe.test(r)||$.test(r))),a=ze.default(2),o=n.map(r=>a(async()=>{try{const c=_.get(t,r),g=Ie(c);for(const p of g){const h=f.basename(p),v=e.getFilePath(p,r),I=v?`${v}:${h}`:h,D=Ee.get(I);if(D){$.test(c)||_.set(t,r,D);return}const R=await dt(v,h,s);R&&($.test(c)||_.set(t,r,R),Ee.set(I,R))}}catch(c){O.logger.error(`Failed to process upload for path ${r.join(".")}:`,c.message||c.reason)}})),l=await Promise.allSettled(o);(i=e.onFinish)==null||i.call(e,l)}async function Oe(t,{exportAssets:s,pageIds:e="all",componentIds:n="all",rawConfig:a,includeResources:o=!1}={}){var N,F,m,b,E,A;const l=e==="all"?t.pageIds:e,i=mt({state:t,pageIds:l,componentIds:n==="all"?Object.keys(t.components):n}),r=(d,u)=>{var w;return{id:d.id,name:d.name,isTemplateSection:d.isTemplateSection??!1,component:d.component,config:d.config,visibility:d.visibility,properties:((w=d.locales)==null?void 0:w[u])??{}}},c=(d,u)=>{var w;return{id:d.id,createdAt:d.createdAt,updatedAt:d.updatedAt,publishedAt:d.publishedAt,isPublic:d.isPublic??!0,isTemplate:d.isTemplate??!1,meta:((w=d.locales)==null?void 0:w[u])??{},sections:L(d.sectionIds.map(P=>{const k=d.sections[P];return k&&r(k,u)}))}},g=L(t.supportedLocales.map(d=>d.locale).flatMap(d=>l.map(u=>{const w=t.pages[u];return w&&{locale:d,slug:w.slug,page:c(w,d)}}))),p=ve(),h=f.join(p,"pages");y.mkdirSync(h,{recursive:!0});const v=f.join(p,"components");y.mkdirSync(v,{recursive:!0});for(const{locale:d,slug:u,page:w}of g)await ae(w,h,{getFilename:()=>`${je(u)||"index"}.${d}.yml`,exportAssets:s});for(const d of i){const u=(N=t.components[d])==null?void 0:N.data;u&&await ae(u,v,{getFilename:w=>`${w.name||"unnamed"}.${w.id}.yml`,exportAssets:s})}const I=f.join(p,".blocklet/pages/pages.config.yml");y.mkdirSync(f.dirname(I),{recursive:!0});const D={pages:L(l.map(d=>{const u=t.pages[d];return u&&{id:d,slug:u.slug}})),components:L(i.map(d=>{var w;const u=(w=t.components[d])==null?void 0:w.data;return u&&{id:d,name:u.name}})),...o?{resources:{components:L(Object.keys(((F=t.resources)==null?void 0:F.components)||{}).map(d=>{var u,w,P,k;return{id:d,name:(k=(P=(w=(u=t.resources)==null?void 0:u.components)==null?void 0:w[d])==null?void 0:P.component)==null?void 0:k.name}}))}}:{},supportedLocales:t.supportedLocales,config:t.config};y.writeFileSync(I,V.stringify(D));const R=f.join(p,"config.source.json");if(a&&y.writeFileSync(R,JSON.stringify(a)),o){const d=f.join(p,"resources"),u=f.join(d,"components");y.mkdirSync(u,{recursive:!0});for(const w of Object.keys(((m=t==null?void 0:t.resources)==null?void 0:m.components)??{})){const P=(A=(E=(b=t.resources)==null?void 0:b.components)==null?void 0:E[w])==null?void 0:A.component;P&&await ae(P,u,{getFilename:k=>`${k.name||"unnamed"}.${k.id}.yml`,exportAssets:s})}}return p}async function ge(t,{importAssets:s,includeResources:e}={}){var o,l,i;if(!y.existsSync(t))return null;let n,a=!1;try{y.lstatSync(t).isDirectory()?n=t:/\.(tgz|gz|tar)$/.test(t)&&(a=!0,n=ve(),await Ve.x({file:t,C:n}));const r=re.globSync("**/.blocklet/pages/pages.config.yml",{cwd:n,absolute:!0}).at(0),c=r&&f.join(f.dirname(r),"../../pages"),g=r&&f.join(f.dirname(r),"../../components"),p=r&&f.join(f.dirname(r),"../../chunks");if(!r)return null;const h=V.parse(y.readFileSync(r).toString()),v=(m,b,E)=>{let A=f.join(m,`${b}${E?`.${E}`:""}.yml`);return(!y.existsSync(A)||!y.lstatSync(A).isFile())&&(A=f.join(m,b,`index${E?`.${E}`:""}.yml`),!y.existsSync(A)||!y.lstatSync(A))?null:V.parse(y.readFileSync(A).toString())},I=(m,b)=>{try{const E=re.globSync(`*.${b}.yml`,{cwd:m,absolute:!0})[0];return E?V.parse(y.readFileSync(E).toString()):null}catch(E){O.logger.error("parse component error",E)}return null},D=L(h.pages.map(({slug:m})=>{var d;const b=L(h.supportedLocales.map(({locale:u})=>{const w=c?v(c,je(m),u):void 0;if(w)return{locale:u,page:w};const P=c?v(c,m,u):void 0;return P&&{locale:u,page:P}})),E=(d=b[0])==null?void 0:d.page;if(!E)return null;const A=E.sections.map(u=>{const w=u.id||ce();return{id:w,component:u.component,config:u.config,name:u.name,isTemplateSection:u.isTemplateSection??!1,visibility:u.visibility,locales:Object.fromEntries(L(b.map(({locale:P,page:k})=>{const he=k.sections.find(Re=>Re.id===w);return he&&[P,he.properties]})))}});return{id:E.id||ce(),createdAt:E.createdAt,updatedAt:E.updatedAt,publishedAt:E.publishedAt,isPublic:E.isPublic??!0,isTemplate:E.isTemplate??!1,slug:m,sections:Object.fromEntries(A.map(u=>[u.id,u])),sectionIds:A.map(u=>u.id),locales:Object.fromEntries(b.map(({locale:u,page:w})=>[u,w.meta]))}})),R=g?L(((o=h.components)==null?void 0:o.map(({id:m})=>I(g,m)))??[]):[];if(s){const m=(...b)=>{O.logger.info(`[${a?f.basename(t):f.basename(f.join(t,"../../../../"))}] importAssets:`,...b)};try{m("wait image-bin api ready"),await Ke.default({resources:[`${ue.getComponentWebEndpoint(Xe)}/api/sdk/uploads`],validateStatus:A=>A>=200&&A<=500}),m("image-bin api is ready");const b={},E={};m("start to upload assets"),await Promise.allSettled([be(R,b,{getFilePath:A=>g&&f.join(g,A),onFinish:A=>{m(`upload ${A.length} component assets`)}}),be(D,E,{getFilePath:(A,d)=>{const u=_.get(D,d.slice(0,1));return c&&f.join(c,f.dirname(u.slug),A)},onFinish:A=>{m(`upload ${A.length} page assets`)}})]),m("upload assets done"),global.gc&&global.gc()}catch(b){m("Error during asset import:",b)}}const N={};if(e){const m=r&&f.join(f.dirname(r),"../../resources/components"),b=L(((i=(l=h.resources)==null?void 0:l.components)==null?void 0:i.map(({id:E})=>I(m,E)))??[]);b.length>0&&(N.components=Object.fromEntries(b.map((E,A)=>[E.id,{index:A,component:E}])))}const F={};if(p&&y.existsSync(p)){const m=y.readdirSync(p);for(const b of m)F[b]=y.readFileSync(f.join(p,b),"utf-8")}return{supportedLocales:h.supportedLocales,pageIds:D.map(m=>m.id),components:Object.fromEntries(R.map((m,b)=>[m.id,{index:b,data:m}])),pages:Object.fromEntries(D.map(m=>[m.id,m])),config:h.config||{},resources:N,chunks:F}}finally{a&&n&&y.rmSync(n,{force:!0,recursive:!0})}}async function pe(t,s,{pages:e,pageMergeMode:n="byUpdateTime",deletePages:a=!1,publishMode:o=void 0}={}){try{o&&O.clearPreloadComponentsCacheByMode(o)}catch(g){O.logger.error("clear preload page cache error",{error:g})}const{pageIds:l,pages:i,supportedLocales:r}=t;for(const g of e??l){const p=i[g];if(!p){const h=s.pageIds.indexOf(g);h!==-1&&a&&(s.pageIds.splice(h,1),delete s.pages[g]);continue}if(s.pageIds.includes(p.id)){if(n==="replace")s.pages[p.id]=p;else if(n==="byUpdateTime"){const h=s.pages[p.id];(!h||p.updatedAt&&p.updatedAt>h.updatedAt)&&(s.pages[p.id]=p)}}else s.pageIds.push(p.id),s.pages[p.id]=p}if(a&&!e)for(const g of s.pageIds)t.pageIds.includes(g)||delete s.pages[g],s.pageIds=[...s.pageIds].filter(p=>t.pageIds.includes(p));if(s.supportedLocales.splice(0,s.supportedLocales.length),s.supportedLocales.push(..._.cloneDeep(r)),a)for(const g of Object.keys(s.components))delete s.components[g];let c=JSON.parse(JSON.stringify(t.components));c=Object.fromEntries(await Promise.all(Object.entries(c).map(async([g,p])=>{const h=await De(p==null?void 0:p.data);return[g,{...p,data:h}]}))),Object.assign(s.components,c),Object.assign(s.config,JSON.parse(JSON.stringify(t.config))),s.resources.components=JSON.parse(JSON.stringify(t.resources.components||{}))}const De=Ue.memoize(async t=>{var s;if(!_.isEmpty(t==null?void 0:t.properties))return t;if(((s=t==null?void 0:t.renderer)==null?void 0:s.type)==="react-component"){const{script:e}=(t==null?void 0:t.renderer)||{};if(e)try{const n=await O.getExportSchemaValueFromCode(e,"PROPERTIES_SCHEMA",t.id);n&&n.length>0&&t&&(t.properties={},n.forEach((a,o)=>{t!=null&&t.properties&&(t.properties[a.id]={index:o,data:a})}))}catch(n){O.logger.error("checkPropertiesFromCode error",{componentId:t.id,name:t.name},{error:n})}}return t},{keyGenerator:t=>JSON.stringify(["checkPropertiesFromCode",t])});function mt({state:t,pageIds:s=[],componentIds:e=[]}){var l;const n=(i,r=new Set)=>(Array.isArray(i)&&i.forEach(c=>n(c,r)),i&&typeof i=="object"&&(typeof i.componentId=="string"&&r.add(i.componentId),Object.values(i).forEach(c=>n(c,r))),r),a=new Set(e);for(const i of s){const r=t.pages[i];n(r,a)}const o=[...a];for(;o.length;){const i=o.shift();a.has(i)||a.add(i);const r=(l=t.components[i])==null?void 0:l.data;if(r)for(const c of n(r))a.has(c)||o.push(c)}return[...a]}let Q,G,me,ye;function Pe(){return Q=(async()=>{const t=ue.getResources({types:[{did:de,type:oe},{did:nt,type:oe}]});G=(await Promise.all(t.map(async e=>{const n=e.path?await ge(e.path,{importAssets:!1}):void 0;return n?{blockletId:e.did,state:n,blockletTitle:e.title}:void 0}))).filter(e=>!!e),me=G.reduce((e,n)=>Object.assign(e,Object.fromEntries(Object.values(n.state.pages).map(a=>a?[a==null?void 0:a.id,{page:a,blockletId:n.blockletId}]:[]))),{});const s=G.reduce((e,n)=>Object.assign(e,Object.fromEntries(Object.values(n.state.components).map(a=>[a.data.id,{blockletId:n.blockletId,component:a.data}]))),{});ye=Object.fromEntries(await Promise.all(Object.entries(s).map(async([e,n])=>{const a=await De(n.component);return[e,{...n,component:a}]})))})(),Q}function _e(t){const s=_.debounce(async()=>{await Pe().catch(e=>{O.logger.error("load resource states error",{error:e})}),await(t==null?void 0:t({states:G,pages:me,components:ye}))},3e3,{leading:!1,trailing:!0});return s(),S.default.events.on(S.default.Events.componentAdded,s),S.default.events.on(S.default.Events.componentRemoved,s),S.default.events.on(S.default.Events.componentStarted,s),S.default.events.on(S.default.Events.componentStopped,s),S.default.events.on(S.default.Events.componentUpdated,s),S.default.events.on(ie,s),()=>{S.default.events.off(S.default.Events.componentAdded,s),S.default.events.off(S.default.Events.componentRemoved,s),S.default.events.off(S.default.Events.componentStarted,s),S.default.events.off(S.default.Events.componentStopped,s),S.default.events.off(S.default.Events.componentUpdated,s),S.default.events.off(ie,s)}}const ke=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),W=globalThis;var Ae;(Ae=W[ke])==null||Ae.call(W);W[ke]=_e(async({pages:t,components:s})=>{const{projectIds:e}=J;await Promise.all(e.map(async n=>{const a=J.shared(n);a.syncedStore.resources.pages=t;const o=await C.findByPk(n);if(o!=null&&o.useAllResources)a.syncedStore.resources.components=s;else{const i=(await ee.findAll({where:{projectId:n}})).map(c=>c.componentId),r=Object.fromEntries(Object.entries(s||{}).filter(([c])=>i.includes(c)));a.syncedStore.resources.components=r}O.logger.info(`update [${n}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}))});async function yt(){O.logger.info("trigger reload all project resource"),S.default.events.emit(ie)}async function Le(){return Q??(Q=Pe()),await Q,{states:G,pages:me,components:ye}}exports.COMPONENT_DID=de;exports.PUBLISH_MODES=pt;exports.Project=C;exports.RESOURCE_TYPE=oe;exports.SITE_STATE_PATH=B;exports.STATE_MODES=lt;exports.SiteState=J;exports.fromPackage=ge;exports.getMultiTenantAllProjectAccessPassports=et;exports.getResourceStates=Le;exports.initPackResourceStates=_e;exports.isMultiTenant=Ze;exports.mergeState=pe;exports.nextId=ce;exports.toPackage=Oe;exports.triggerReloadAllProjectResource=yt;
|
package/lib/cjs/components.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/sdk/lib/config");require("lru-cache");require("node-fetch");require("ufo");const e=require("./_chunks/components-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("@blocklet/pages-kit/builtin/utils");require("@blocklet/pages-kit/types");require("@blocklet/pages-kit/utils/property");require("@blocklet/quickjs");require("@blocklet/sdk/lib/config");require("lru-cache");require("node-fetch");require("ufo");const e=require("./_chunks/components-CGE2womb.js");exports.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS=e.CUSTOM_COMPONENT_CACHE_DURATION_IN_SECONDS;exports.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS=e.GET_SERVER_SIDE_PROPS_TIMEOUT_IN_SECONDS;exports.clearPreloadComponentsCache=e.clearPreloadComponentsCache;exports.clearPreloadComponentsCacheByMode=e.clearPreloadComponentsCacheByMode;exports.getComponentFromState=e.getComponentFromState;exports.getComponentFromStateByName=e.getComponentFromStateByName;exports.getExportSchemaValueFromCode=e.getExportSchemaValueFromCode;exports.getPreloadComponent=e.getPreloadComponent;exports.getPreloadComponents=e.getPreloadComponents;exports.getPreloadComponentsCacheKey=e.getPreloadComponentsCacheKey;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";const S=require("./_chunks/components-CGE2womb.js"),T=require("@blocklet/crawler/middlewares"),J=require("@blocklet/pages-kit/types"),G=require("@blocklet/pages-kit/utils/preload"),z=require("@blocklet/sdk/lib/component"),R=require("@blocklet/sdk/lib/config"),K=require("cheerio"),Q=require("express"),L=require("fs"),V=require("mustache"),A=require("path"),D=require("ufo"),U=e=>e&&e.__esModule?e:{default:e};function X(e){if(e&&e.__esModule)return e;const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const d in e)if(d!=="default"){const t=Object.getOwnPropertyDescriptor(e,d);Object.defineProperty(a,d,t.get?t:{enumerable:!0,get:()=>e[d]})}}return a.default=e,Object.freeze(a)}const i=U(R),q=X(K),Y=U(V),Z=["/assets/"],x=()=>[!0,"true"].includes(i.default.env.preferences.allowCrawler);function H(){x()?T.initCronCrawlBlocklet({time:"30 30 */12 * * *",options:{}}):T.cancelCronCrawlBlocklet()}H();i.default.events.on(i.default.Events.envUpdate,H);function F({app:e,viteDevServer:a,projectId:d,state:t}){let _;if(a){const n=L.readFileSync(A.resolve(process.cwd(),"./index.html"),"utf-8");e.use(async(y,E,P)=>{const b=y.originalUrl;_=await a.transformIndexHtml(b,n),P()})}else _=L.readFileSync(A.resolve(process.env.BLOCKLET_APP_DIR,"dist/index.html"),"utf-8");const k=Q.Router();k.use(T.initSEOMiddleware({autoReturnHtml:!1,allowCrawler:x})),k.get("/:path(*)?",async(n,y,E)=>{var O,$,M;if(Z.some(c=>n.path.startsWith(c))){E();return}const P=performance.now(),b=()=>Math.round(performance.now()-P),N="production";let r,m,C=_;if(n.path.startsWith("/pages")){const c=n.params.lang,h=n.cookies.nf_lang,g=new Set([...i.default.env.languages.map(u=>u.code)]);let p=(c&&g.has(c)?c:void 0)||(g.has(h)?h:void 0)||[...g][0];if((!p||!((O=t.supportedLocales)!=null&&O.find(u=>u.locale===p)))&&(p=((M=($=t.supportedLocales)==null?void 0:$[0])==null?void 0:M.locale)||""),p){const u=[];Object.values(t.pages).forEach(s=>{const v=Object.values((s==null?void 0:s.sections)??{}).filter(l=>{var w;return l.component==="custom-component"&&((w=l.config)==null?void 0:w.componentId)}).map(l=>{var w,I;return{id:l.id,componentId:l.config.componentId,useCache:l.config.useCache,cacheDuration:l.config.cacheDuration,properties:(I=(w=l.locales)==null?void 0:w[p])==null?void 0:I.properties}});u.push(...v)});const B=new Promise((s,v)=>{setTimeout(()=>{v(new Error("getPreloadComponents timeout in promise race, skip it"))},90*1e3)});try{await Promise.race([B,S.getPreloadComponents({mode:N,req:n,state:t,locale:p,instances:u,module:J.PreloadComponentScriptModule.UMD_FN}).then(s=>{s&&(m=G.injectPreloadComponents(s))})])}catch{S.logger.warn("getPreloadComponents timeout in promise race, skip inject html elements")}}}try{const c=(r==null?void 0:r.title)||i.default.env.appName,h=(r==null?void 0:r.description)||i.default.env.appDescription,g=D.withQuery(D.joinURL(i.default.env.appUrl,"/.well-known/service/blocklet/og.png"),{title:c,description:h});C=Y.default.render(_,{ogTitle:c,ogDescription:h,ogImage:ee(r==null?void 0:r.image)||g,pagesPublishedAt:(t==null?void 0:t.config.publishedAt)||new Date().getTime()})}catch{}const o=t==null?void 0:t.config.fontFamily,W=n.query.mode==="draft"||n.url.includes("preview"),f=q.load(C);f("head").find("#injected-head-elements").replaceWith(`
|
|
2
|
+
|
|
3
|
+
${o!=null&&o.title?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${o.title}&display=swap">`:""}
|
|
4
|
+
${o!=null&&o.description&&(o==null?void 0:o.description)!==(o==null?void 0:o.title)?`<link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=${o.description}&display=swap">`:""}
|
|
5
|
+
<script>
|
|
6
|
+
window.__PROJECT_ID__ = "${d}"
|
|
7
|
+
window.__PAGE_STATE__ = ${JSON.stringify(t)}
|
|
8
|
+
|
|
9
|
+
document.querySelectorAll('link[rel="preload"][as="style"]').forEach(function (link) {
|
|
10
|
+
const l = document.createElement('link');
|
|
11
|
+
l.rel = 'stylesheet';
|
|
12
|
+
l.href = link.href;
|
|
13
|
+
document.head.appendChild(l);
|
|
14
|
+
});
|
|
15
|
+
<\/script>
|
|
16
|
+
|
|
17
|
+
${W?`<script src="https://cdn.tailwindcss.com"><\/script>
|
|
18
|
+
<script>
|
|
19
|
+
window.tailwind.config = {
|
|
20
|
+
darkMode: "class",
|
|
21
|
+
};
|
|
22
|
+
<\/script>`:""}
|
|
23
|
+
`);const j=R.getBlockletJs();if(j&&f('script[src="__blocklet__.js"]').replaceWith(`<script>${j}<\/script>`),m!=null&&m.html&&f("head").find("#injected-html-elements").replaceWith(m.html),n.cachedHtml){const c=q.load(n.cachedHtml);f("body").html(c("body").html()||"")}C=f.html(),y.send(C),S.logger.info(`[html] render: ${n.path}, ${b()}ms`)}),e.use(k)}function ee(e){return z.getComponentMountPoint("image-bin"),e}module.exports=F;
|
package/lib/cjs/resources.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const c=require("./_chunks/site-state-
|
|
1
|
+
"use strict";const c=require("./_chunks/site-state-BjTlKyaF.js"),b=require("./_chunks/components-CGE2womb.js"),U=require("async_hooks"),F=require("express"),J=require("fs"),X=require("joi"),O=require("lodash"),N=require("path"),W=require("@blocklet/sdk/lib/middlewares/auth"),G=require("@blocklet/sdk/lib/component"),E=t=>t&&t.__esModule?t:{default:t},p=E(J),I=E(X),k=E(N),v=E(W);new U.AsyncLocalStorage;const K=async(t,e,o)=>{var n,s,r,a;try{const{projectId:u}=t.params;if(!u)return o();const f=await c.Project.findByPk(u);if(!f)return e==null?void 0:e.status(404).json({error:"Project not found"});const P=(n=t.user)==null?void 0:n.did,h=((s=t.user)==null?void 0:s.role)||"UNKNOWN_ROLE";if(!P)return e==null?void 0:e.status(401).json({error:"Authentication required"});if(c.isMultiTenant()){const w=f.createdBy===P,i=(a=(r=c.getMultiTenantAllProjectAccessPassports())==null?void 0:r.includes)==null?void 0:a.call(r,h);if(!w&&!i)return e==null?void 0:e.status(403).json({error:"No permission to access this project in multi-tenant mode"})}else if(!["owner","admin","pagesEditor"].includes(h))return e==null?void 0:e.status(403).json({error:"No permission to access this project in single-tenant mode"});t.project=f,t.projectId=u,o()}catch(u){b.logger.error("Project middleware error:",u),e==null||e.status(500).json({error:"Internal server error"})}};function T(t,e){return new Promise((o,n)=>{const s=p.default.createReadStream(t),r=p.default.createWriteStream(e);s.on("error",n),r.on("error",n),r.on("finish",o),s.pipe(r)})}async function B(t,e){await p.default.promises.mkdir(e,{recursive:!0});const o=await p.default.promises.readdir(t,{withFileTypes:!0});for(const n of o){const s=k.default.join(t,n.name),r=k.default.join(e,n.name);n.isDirectory()?await B(s,r):await T(s,r)}}async function Y(t,e){(await p.default.promises.stat(t)).isDirectory()?await B(t,e):await T(t,e)}const D=(t,e,o)=>c.isMultiTenant()?v.default()(t,e,o):v.default({roles:["owner","admin","pagesEditor"]})(t,e,o),$=(t,e)=>{const o=G.getResourceExportDir({projectId:t,releaseId:e});return N.join(o,c.COMPONENT_DID,c.RESOURCE_TYPE)},S=F.Router(),q="@page",L="@component",y=":",_="ALL",M="@project",C=({pageId:t,projectId:e})=>[q,e,t].join(y),z=t=>{const[e,o,n]=t.split(y);if(e===q)return{pageId:n,projectId:o}},A=({componentId:t,projectId:e})=>[L,e,t].join(y),H=t=>{const[e,o,n]=t.split(y);if(e===L)return{componentId:n,projectId:o}},Q=t=>[M,t].join(y),V=t=>{const[e,o]=t.split(y);if(e===M)return o},Z=t=>{try{return JSON.parse(t)}catch{}return{}};async function x(t){const e=await c.SiteState.shared(t).getState("production"),o=await c.Project.findByPk(t),n=e.pageIds.map(r=>{const a=e.pages[r];if(a)return{id:C({pageId:r,projectId:t}),name:a.slug}}).filter(Boolean),s=O.sortBy(Object.values(e.components),r=>r.index).map(({data:r})=>({id:A({componentId:r.id,projectId:t}),name:r.name||r.id}));return{id:Q(t),name:(o==null?void 0:o.name)||"Unnamed Project",children:[{id:C({pageId:_,projectId:t}),name:"Pages",children:n},{id:A({componentId:_,projectId:t}),name:"Components",children:s}]}}S.get("/resources",D,async(t,e)=>{const{projectId:o}=Z(t.query.resourcesParams);if(o){t.params={...t.params,projectId:o},await K(t,e,()=>{});const r=await x(o);e.json({resources:[r]});return}const n=await c.Project.findAll({where:{}}),s=await Promise.all(n.map(r=>x(r.id)));e.json({resources:s})});const tt=I.default.object({projectId:I.default.string().required().min(1),releaseId:I.default.string().allow(""),resources:I.default.array().items(I.default.string()).required(),locale:I.default.string().allow("")});S.post("/resources",D,async(t,e)=>{const{resources:o,projectId:n,releaseId:s}=await tt.validateAsync(t.body),r="production",a=[],u=[];for(const i of o){if(V(i))continue;const{pageId:m,projectId:j}=z(i)||{};if(m)m===_||m&&j&&a.push({pageId:m,projectId:j});else{const{componentId:l,projectId:d}=H(i)||{};l===_||l&&d&&u.push({componentId:l,projectId:d})}}const f=O.groupBy(a,"projectId"),P=O.groupBy(u,"projectId"),h=new Set([...Object.keys(f),...Object.keys(P)]),w=$(n,s);p.default.rmSync(w,{recursive:!0,force:!0}),p.default.mkdirSync(w,{recursive:!0});for(const i of h){const m=await c.SiteState.shared(i).getState(r),j=f[i],l=P[i],d=j==null?void 0:j.map(g=>g.pageId),R=l==null?void 0:l.map(g=>g.componentId);if(d!=null&&d.length||R!=null&&R.length){const g=await c.toPackage(m,{exportAssets:!0,pageIds:d,componentIds:R});await Y(g,w),p.default.rmSync(g,{recursive:!0,force:!0})}b.logger.info(`Exported resources for project ${i}`,{pageIds:d,componentIds:R})}e.json({})});S.get("/all-resources",D,async(t,e)=>{const{states:o}=await c.getResourceStates(),n=o==null?void 0:o.map(s=>{const r={blockletId:s.blockletId,blockletTitle:s.blockletTitle,components:{}};if(s.state.components&&(r.components=s.state.components),Object.keys(r.components).length!==0)return r}).filter(Boolean);e.json(n)});module.exports=S;
|
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-CGE2womb.js");const e=require("./_chunks/site-state-BjTlKyaF.js");require("@blocklet/quickjs");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");require("lru-cache");require("nanoid");require("p-limit");require("path");require("stream/promises");require("tar");require("ufo");require("wait-on");require("y-protocols/awareness");require("y-protocols/sync");require("yaml");require("yjs");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.fromPackage=e.fromPackage;exports.getResourceStates=e.getResourceStates;exports.initPackResourceStates=e.initPackResourceStates;exports.mergeState=e.mergeState;exports.nextId=e.nextId;exports.toPackage=e.toPackage;exports.triggerReloadAllProjectResource=e.triggerReloadAllProjectResource;
|
|
@@ -75,14 +75,14 @@ ${e}
|
|
|
75
75
|
{
|
|
76
76
|
name: "vfs",
|
|
77
77
|
setup(l) {
|
|
78
|
-
l.onResolve({ filter: /.*/ }, (
|
|
78
|
+
l.onResolve({ filter: /.*/ }, (c) => c.path === "index.tsx" ? { path: "index.tsx", namespace: "vfs" } : c.path === "./component" ? { path: "component.tsx", namespace: "vfs" } : null), l.onLoad({ filter: /.*/, namespace: "vfs" }, async (c) => c.path === "index.tsx" ? { contents: `export { ${t} } from './component'`, loader: "tsx" } : c.path === "component.tsx" ? { contents: e, loader: "tsx" } : (console.warn("onLoad 11111111", c.path), null));
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
]
|
|
82
82
|
})).outputFiles) == null ? void 0 : n[0]) == null ? void 0 : s.contents;
|
|
83
83
|
if (!r) throw new Error("Failed to build server code");
|
|
84
|
-
const
|
|
85
|
-
return d.transpileModule(
|
|
84
|
+
const i = Buffer.from(r).toString();
|
|
85
|
+
return d.transpileModule(i, {
|
|
86
86
|
compilerOptions: { module: d.ModuleKind.ESNext, target: d.ScriptTarget.ES2020 }
|
|
87
87
|
}).outputText;
|
|
88
88
|
}, N = O(
|
|
@@ -121,7 +121,7 @@ async function Pe({
|
|
|
121
121
|
req: t,
|
|
122
122
|
state: o,
|
|
123
123
|
locale: r,
|
|
124
|
-
instances:
|
|
124
|
+
instances: i,
|
|
125
125
|
module: a
|
|
126
126
|
}) {
|
|
127
127
|
const {
|
|
@@ -130,7 +130,7 @@ async function Pe({
|
|
|
130
130
|
} = o;
|
|
131
131
|
if (!s) return null;
|
|
132
132
|
const l = (await Promise.all(
|
|
133
|
-
|
|
133
|
+
i.map(async (p) => {
|
|
134
134
|
const u = ne({
|
|
135
135
|
mode: e,
|
|
136
136
|
instanceId: p.id,
|
|
@@ -159,12 +159,12 @@ async function Pe({
|
|
|
159
159
|
}
|
|
160
160
|
return P;
|
|
161
161
|
})
|
|
162
|
-
)).filter((p) => !!p),
|
|
162
|
+
)).filter((p) => !!p), c = Object.values(
|
|
163
163
|
l.reduce((p, u) => ({ ...p, ...u.preload.components }), {})
|
|
164
164
|
);
|
|
165
165
|
async function m() {
|
|
166
166
|
const p = await Promise.all(
|
|
167
|
-
|
|
167
|
+
c.map(async (u) => {
|
|
168
168
|
const h = v({ componentId: u.component.id }), S = a === $.ESM ? {
|
|
169
169
|
module: a,
|
|
170
170
|
script: await I(u.script, {
|
|
@@ -203,17 +203,17 @@ async function re({
|
|
|
203
203
|
state: t,
|
|
204
204
|
componentId: o,
|
|
205
205
|
locale: r,
|
|
206
|
-
defaultLocale:
|
|
206
|
+
defaultLocale: i,
|
|
207
207
|
properties: a
|
|
208
208
|
}) {
|
|
209
209
|
const { supportedLocales: n } = t, s = C({ state: t, componentId: o });
|
|
210
210
|
if (!s) return null;
|
|
211
|
-
const l = n.some((m) => m.locale === r) ? r :
|
|
211
|
+
const l = n.some((m) => m.locale === r) ? r : i;
|
|
212
212
|
if (!l) return null;
|
|
213
|
-
const
|
|
214
|
-
return
|
|
213
|
+
const c = await R({ req: e, state: t, componentId: o, locale: l, defaultLocale: i, properties: a });
|
|
214
|
+
return c ? {
|
|
215
215
|
component: s,
|
|
216
|
-
...
|
|
216
|
+
...c
|
|
217
217
|
} : null;
|
|
218
218
|
}
|
|
219
219
|
const se = 20;
|
|
@@ -222,21 +222,21 @@ async function R({
|
|
|
222
222
|
depth: t = 0,
|
|
223
223
|
state: o,
|
|
224
224
|
componentId: r,
|
|
225
|
-
locale:
|
|
225
|
+
locale: i,
|
|
226
226
|
defaultLocale: a,
|
|
227
227
|
properties: n
|
|
228
228
|
}) {
|
|
229
229
|
if (t > se) throw new RangeError("max component depth exceeded");
|
|
230
|
-
const s = ce({ state: o, componentId: r, properties: n, locale:
|
|
230
|
+
const s = ce({ state: o, componentId: r, properties: n, locale: i });
|
|
231
231
|
if (!s) return null;
|
|
232
|
-
const { props: l } = s,
|
|
233
|
-
locale:
|
|
232
|
+
const { props: l } = s, c = {
|
|
233
|
+
locale: i || a,
|
|
234
234
|
components: { [s.component.id]: { component: s.component, script: s.script } },
|
|
235
235
|
props: { ...l }
|
|
236
236
|
};
|
|
237
237
|
try {
|
|
238
238
|
const m = await ie({ ...s, req: e });
|
|
239
|
-
m != null && m.props && Object.assign(
|
|
239
|
+
m != null && m.props && Object.assign(c.props, m.props);
|
|
240
240
|
} catch (m) {
|
|
241
241
|
g.error("preload data at server side error", { componentId: r, name: s.component.name }, { error: m });
|
|
242
242
|
}
|
|
@@ -248,11 +248,11 @@ async function R({
|
|
|
248
248
|
depth: t + 1,
|
|
249
249
|
state: o,
|
|
250
250
|
componentId: f.componentId,
|
|
251
|
-
locale:
|
|
251
|
+
locale: i,
|
|
252
252
|
defaultLocale: a,
|
|
253
253
|
properties: f.properties
|
|
254
254
|
});
|
|
255
|
-
x && (Object.assign(
|
|
255
|
+
x && (Object.assign(c.components, x.components), Object.assign(c.props, {
|
|
256
256
|
[m]: {
|
|
257
257
|
type: M,
|
|
258
258
|
componentId: f.componentId,
|
|
@@ -261,7 +261,7 @@ async function R({
|
|
|
261
261
|
}));
|
|
262
262
|
}
|
|
263
263
|
})
|
|
264
|
-
),
|
|
264
|
+
), c;
|
|
265
265
|
}
|
|
266
266
|
function ce({
|
|
267
267
|
state: e,
|
|
@@ -269,8 +269,8 @@ function ce({
|
|
|
269
269
|
locale: o,
|
|
270
270
|
properties: r
|
|
271
271
|
}) {
|
|
272
|
-
const
|
|
273
|
-
if (!
|
|
272
|
+
const i = C({ state: e, componentId: t });
|
|
273
|
+
if (!i) return null;
|
|
274
274
|
const a = L({
|
|
275
275
|
componentId: t,
|
|
276
276
|
getComponent: (n) => C({ state: e, componentId: n }),
|
|
@@ -278,22 +278,22 @@ function ce({
|
|
|
278
278
|
defaultLocale: e.config.defaultLocale,
|
|
279
279
|
properties: r
|
|
280
280
|
});
|
|
281
|
-
return a ? { component:
|
|
281
|
+
return a ? { component: i, script: a.script, props: { locale: o, ...a.properties } } : null;
|
|
282
282
|
}
|
|
283
283
|
function C({ state: e, componentId: t }) {
|
|
284
|
-
var o, r,
|
|
285
|
-
return ((o = e.components[t]) == null ? void 0 : o.data) ?? ((
|
|
284
|
+
var o, r, i;
|
|
285
|
+
return ((o = e.components[t]) == null ? void 0 : o.data) ?? ((i = (r = e.resources.components) == null ? void 0 : r[t]) == null ? void 0 : i.component);
|
|
286
286
|
}
|
|
287
287
|
function Me({ state: e, name: t }) {
|
|
288
|
-
var r,
|
|
288
|
+
var r, i;
|
|
289
289
|
const o = t.toLowerCase();
|
|
290
290
|
return ((r = Object.values(e.components).find((a) => {
|
|
291
291
|
var n;
|
|
292
292
|
return ((n = a.data.name) == null ? void 0 : n.toLowerCase()) === o;
|
|
293
|
-
})) == null ? void 0 : r.data) ?? ((
|
|
293
|
+
})) == null ? void 0 : r.data) ?? ((i = e.resources.components && Object.values(e.resources.components).find((a) => {
|
|
294
294
|
var n;
|
|
295
295
|
return ((n = a.component.name) == null ? void 0 : n.toLowerCase()) === o;
|
|
296
|
-
})) == null ? void 0 :
|
|
296
|
+
})) == null ? void 0 : i.component);
|
|
297
297
|
}
|
|
298
298
|
async function ie({
|
|
299
299
|
component: e,
|
|
@@ -301,15 +301,15 @@ async function ie({
|
|
|
301
301
|
props: o,
|
|
302
302
|
req: r
|
|
303
303
|
}) {
|
|
304
|
-
const
|
|
305
|
-
if (!
|
|
304
|
+
const i = await N(t, "getServerSideProps");
|
|
305
|
+
if (!i) return null;
|
|
306
306
|
const a = new Promise((n, s) => {
|
|
307
307
|
setTimeout(() => s(new Error("getServerSideProps timeout in promise race")), j * 1e3);
|
|
308
308
|
});
|
|
309
309
|
return Promise.race([
|
|
310
310
|
a,
|
|
311
311
|
_.callFunction({
|
|
312
|
-
code: `${
|
|
312
|
+
code: `${i}
|
|
313
313
|
|
|
314
314
|
export async function getServerSidePropsWrapper({ location, fetch, props}) {
|
|
315
315
|
globalThis.location = location
|
|
@@ -355,21 +355,21 @@ export { joinURL, withQuery, getQuery, getComponentMountPoint }
|
|
|
355
355
|
fetch: (n, { ...s } = {}) => {
|
|
356
356
|
const l = typeof n == "string" && n.startsWith("/") ? E(T.env.appUrl, n) : n;
|
|
357
357
|
if (typeof l == "string" && b(l).host === b(T.env.appUrl).host) {
|
|
358
|
-
const
|
|
359
|
-
if (
|
|
358
|
+
const c = r.get("cookie");
|
|
359
|
+
if (c) {
|
|
360
360
|
const m = new B(s.headers);
|
|
361
|
-
m.set("cookie",
|
|
361
|
+
m.set("cookie", c), s.headers = m;
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
364
|
return F(l, {
|
|
365
365
|
...s,
|
|
366
366
|
timeout: j * 1e3
|
|
367
|
-
}).then((
|
|
368
|
-
ok:
|
|
369
|
-
status:
|
|
370
|
-
statusText:
|
|
371
|
-
headers: Object.fromEntries(
|
|
372
|
-
json: () =>
|
|
367
|
+
}).then((c) => ({
|
|
368
|
+
ok: c.ok,
|
|
369
|
+
status: c.status,
|
|
370
|
+
statusText: c.statusText,
|
|
371
|
+
headers: Object.fromEntries(c.headers.entries()),
|
|
372
|
+
json: () => c.json()
|
|
373
373
|
}));
|
|
374
374
|
},
|
|
375
375
|
props: o
|
|
@@ -400,10 +400,10 @@ const Te = O(
|
|
|
400
400
|
export {
|
|
401
401
|
te as C,
|
|
402
402
|
j as G,
|
|
403
|
-
|
|
404
|
-
|
|
403
|
+
Pe as a,
|
|
404
|
+
oe as b,
|
|
405
405
|
Oe as c,
|
|
406
|
-
|
|
406
|
+
ne as d,
|
|
407
407
|
re as e,
|
|
408
408
|
C as f,
|
|
409
409
|
Te as g,
|