@blocklet/pages-kit-inner-components 0.0.18 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/home.js +1 -1
- package/lib/cjs/locales.js +1 -1
- package/lib/cjs/resources.js +1 -1
- package/lib/cjs/setting.js +3 -3
- package/lib/cjs/site-state.js +1 -1
- package/lib/{draft-data-ByCPsDRp.mjs → draft-data-BR6QMafP.mjs} +1 -1
- package/lib/{draft-data-DJNZo1YQ.js → draft-data-DY34VJHh.js} +1 -1
- package/lib/es/home.js +7 -6
- package/lib/es/locales.js +15 -5
- package/lib/es/resources.js +1 -1
- package/lib/es/setting.js +764 -690
- package/lib/es/site-state.js +1 -1
- package/lib/home-DhKwQuXD.js +542 -0
- package/lib/{home-Cy0eoqJw.mjs → home-eQg2nzvF.mjs} +695 -641
- package/lib/{publish-button-B_ySfzVo.js → publish-button-B-kvMf2a.js} +1 -1
- package/lib/{publish-button-B63RIwA3.mjs → publish-button-CKgx9XuN.mjs} +2 -2
- package/lib/{site-state-7Hsu0igk.mjs → site-state-CrZeDXXY.mjs} +244 -234
- package/lib/site-state-Ur6wK5g3.js +1 -0
- package/lib/{state-CETtldI3.mjs → state-BfVA6vd8.mjs} +38 -36
- package/lib/state-C6F-M3XT.js +1 -0
- package/package.json +14 -14
- package/lib/home-DHx60V0N.js +0 -542
- package/lib/site-state-DR63hFZ4.js +0 -1
- package/lib/state-CfaAw7fr.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const P=require("./components-DITf866E.js"),ke=require("@blocklet/quickjs"),le=require("@blocklet/sdk/lib/component"),Re=require("@blocklet/sdk/lib/config"),Ce=require("@reactivedata/reactive"),H=require("@syncedstore/core"),y=require("fs"),re=require("glob"),Le=require("lib0/decoding"),Ue=require("lib0/encoding"),_=require("lodash"),Ee=require("lru-cache"),Ne=require("nanoid"),Fe=require("p-limit"),d=require("path"),qe=require("stream/promises"),Me=require("tar"),x=require("ufo"),xe=require("wait-on"),M=require("y-protocols/awareness"),te=require("y-protocols/sync"),Be=require("yaml"),Ve=require("yjs"),$e=require("lodash/isNil"),A=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 m=Y(Re),se=Z(Le),v=Z(Ue),Ge=Y(Fe),Je=Y(d),Ye=Y(xe),V=Z(Be),q=Z(Ve),ze=Y($e);m.default.env.mode;const He="image-bin";m.default.env.INIT_TEMPLATE_PATH;const Ke=process.env.DATABASE_URL||Je.default.join(m.default.env.dataDir,"db/pages-kit.db"),me=m.default,We=()=>m.default.env.tenantMode==="multiple",Xe=()=>{var t;return(ze.default(me.env.preferences.multiTenantAllProjectAccessPassports)?[]:(t=me.env.preferences.multiTenantAllProjectAccessPassports)==null?void 0:t.split(","))||[]},Qe=A.DataTypes.sqlite.DATE.parse;A.DataTypes.sqlite.DATE.parse=(t,s)=>typeof t=="number"?new Date(t):Qe(t,s);const z=new A.Sequelize({dialect:"sqlite",storage:Ke,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 A.Model{}ee.init({id:{type:A.DataTypes.UUID,allowNull:!1,primaryKey:!0,defaultValue:A.DataTypes.UUIDV4},projectId:{type:A.DataTypes.UUID,allowNull:!1},componentId:{type:A.DataTypes.STRING,allowNull:!1}},{sequelize:z,tableName:"ProjectComponents",timestamps:!1});class N extends A.Model{static async getProjectByIdOrSlug(s){return N.findOne({where:{[A.Op.or]:[{id:s},{slug:s}]}})}}N.init({id:{type:A.DataTypes.UUID,defaultValue:A.DataTypes.UUIDV4,primaryKey:!0},name:{type:A.DataTypes.STRING,allowNull:!1},description:A.DataTypes.TEXT,createdAt:A.DataTypes.DATE,updatedAt:A.DataTypes.DATE,createdBy:{type:A.DataTypes.STRING,allowNull:!1},updatedBy:{type:A.DataTypes.STRING,allowNull:!1},slug:A.DataTypes.STRING,icon:A.DataTypes.STRING,pinnedAt:A.DataTypes.DATE,useAllResources:A.DataTypes.BOOLEAN,relatedBlocklets:{type:A.DataTypes.JSON,allowNull:!1,defaultValue:{},get(){return this.getDataValue("relatedBlocklets")||{}},set(t){this.setDataValue("relatedBlocklets",JSON.stringify(t||{}))}}},{sequelize:z,paranoid:!0});N.hasMany(ee,{foreignKey:"projectId",as:"components"});const Ze="z8iZiDFg3vkkrPwsiba1TLXy3H9XHzFERsP8o",be="page",oe="trigger-reload-project-resource",pe=Ze,{uploadToMediaKit:et}=require("@blocklet/uploader-server"),ie=Ne.customAlphabet("abcdefghijklmnopqrstuvwxyz0123456789",16),ue=/^\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,ye=/mediakit:\/\/([a-f0-9]{32}\.(jpe?g|png|gif|svg|bmp|webp|mp4|m4v|webm))/gi,tt=1e4,st=3e4,K=0,ne=1,nt=0,at=1,rt=m.default,B=d.join(process.env.BLOCKLET_DATA_DIR,"site-state"),ot=["production","draft"],it=["production"];function Ae(t){return(t==null?void 0:t.replace(/\//g,"|"))||""}function ct(){return{pageIds:[],pages:{},components:{},supportedLocales:[],config:{},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},r)=>{const l=e.concat(n,a);if(r!==null){const c=this.conns.get(r);c&&(e.forEach(f=>{c.add(f)}),a.forEach(f=>{c.delete(f)}))}const i=v.createEncoder();v.writeVarUint(i,ne),v.writeVarUint8Array(i,M.encodeAwarenessUpdate(this.awareness,l));const o=v.toUint8Array(i);this.conns.forEach((c,f)=>this.send(f,o))},this.updateHandler=e=>{const n=v.createEncoder();v.writeVarUint(n,K),te.writeUpdate(n,e);const a=v.toUint8Array(n);this.conns.forEach((r,l)=>this.send(l,a))},this.ensureDataStructure=()=>{var l;const{supportedLocales:e,pages:n,pageIds:a,config:r}=this.syncedStore;{const i=new Set(Object.keys(n));let o=0;for(;o<a.length;){const c=a[o];i.has(c)?(i.delete(c),o++):a.splice(o,1)}}e.splice(0,e.length),e.push(...rt.env.languages.map(i=>({locale:i.code,name:i.name}))),r.defaultLocale=(l=e[0])==null?void 0:l.locale;{let i=0;const o=new Set;for(;i<e.length;){const{locale:c}=e[i];o.has(c)?e.splice(i,1):(i++,o.add(c))}}},this.send=(e,n)=>{e.readyState!==nt&&e.readyState!==at&&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(d.dirname(this.draftYjsFilePath),{recursive:!0}),y.writeFileSync(this.draftYjsFilePath,q.encodeStateAsUpdate(this))},tt),this.save=({flush:e=!1}={})=>{this.autoSave(),e&&this.autoSave.flush()},this.publish=async({mode:e,pages:n})=>{const a=await this.getState("draft"),r=await this.getState("production");await ce(a,r,{pages:n,pageMergeMode:"replace",deletePages:!0,publishMode:e}),r.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,r)},this.mergeState=async(e,n)=>{var i,o,c;const a=JSON.parse(JSON.stringify(n));(i=e.config).fontFamily??(i.fontFamily={});const r=(o=a.config)==null?void 0:o.fontFamily,l=(c=e.config)==null?void 0:c.fontFamily;e.config.fontFamily.title=(r==null?void 0:r.title)||(l==null?void 0:l.title),e.config.fontFamily.description=(r==null?void 0:r.description)||(l==null?void 0:l.description),await new Promise((f,p)=>{this.transact(async()=>{try{const w=await ce(e,n);f(w)}catch(w){p(w)}})})},this.addConnection=e=>{if(this.conns.has(e))return;e.binaryType="arraybuffer",this.conns.set(e,new Set),e.on("message",r=>this.messageListener(e,new Uint8Array(r)));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)}}},st);e.on("close",()=>{this.closeConn(e),clearInterval(a)}),e.on("pong",()=>{n=!0});{const r=v.createEncoder();v.writeVarUint(r,K),te.writeSyncStep1(r,this),this.send(e,v.toUint8Array(r));const l=this.awareness.getStates();if(l.size>0){const i=v.createEncoder();v.writeVarUint(i,ne),v.writeVarUint8Array(i,M.encodeAwarenessUpdate(this.awareness,Array.from(l.keys()))),this.send(e,v.toUint8Array(i))}}},this.messageListener=(e,n)=>{try{const a=v.createEncoder(),r=se.createDecoder(n),l=se.readVarUint(r);switch(l){case K:v.writeVarUint(a,K),te.readSyncMessage(r,a,this,null),v.length(a)>1&&(this.ensureDataStructure(),this.send(e,v.toUint8Array(a)));break;case ne:{M.applyAwarenessUpdate(this.awareness,se.readVarUint8Array(r),e);break}default:P.logger.warn(`Unsupported messageType ${l}`)}}catch(a){P.logger.error(a)}this.save()},y.existsSync(this.draftYjsFilePath)&&q.applyUpdate(this,y.readFileSync(this.draftYjsFilePath)),this.syncedStore=Ce.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=d.join(B,s),n=d.join(B,`@del-${s}`);y.renameSync(e,n)}catch(e){P.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:d.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(r=>r.changes.keys.has("updatedAt")||r.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,r)=>{if(a.action==="add"){const l=H.getYjsValue(this.syncedStore.pages[r]);l&&l instanceof q.Map&&s(l)}})})}get draftYjsFilePath(){return d.join(this.options.path,"draft.yjs")}async getState(s){return s==="draft"?JSON.parse(JSON.stringify(this.syncedStore)):(this.states[s]||(this.states[s]=await de(this.getPublishDir(s),{includeResources:!0})??ct()),{...this.states[s],resources:await _e().then(async e=>{var l,i,o,c;const{pages:n,components:a}=_.pick(e,"pages","components");let r=a;if((i=(l=this.states[s])==null?void 0:l.resources)!=null&&i.components)r={...(c=(o=this.states[s])==null?void 0:o.resources)==null?void 0:c.components};else{const f=d.basename(this.options.path),p=await N.findByPk(f);if(p!=null&&p.useAllResources)r=a;else{const I=(await ee.findAll({where:{projectId:f}})).map(D=>D.componentId);r=Object.fromEntries(Object.entries(a||{}).filter(([D])=>I.includes(D)))}}return{pages:n,components:r}}).catch(()=>({}))})}async setState(s,e){const n=await ve(e,{exportAssets:!1,includeResources:!0}),a=this.getPublishDir(s);y.mkdirSync(d.dirname(a),{recursive:!0}),y.rmSync(a,{force:!0,recursive:!0}),y.renameSync(n,a),this.states[s]=e}getPublishDir(s){return d.join(this.options.path,s)}static async pageUrlMap(s){const{projectIds:e}=this,n={};for(const a of e){const r=await N.findByPk(a);if(!r)continue;const l=await U.shared(a).getState(s),i=_.union(m.default.env.languages.map(o=>o.code),l.supportedLocales.map(o=>o.locale));for(const o of l.pageIds){const c=l.pages[o];if(!c||s==="production"&&!c.isPublic)continue;const f=c.slug,p=r.slug||a,w={projectId:a,projectSlug:p,pageSlug:f,pageId:o,defaultLocale:i==null?void 0:i[0],locales:i,publishedAt:l.config.publishedAt,isPublic:c.isPublic};p&&(n[x.joinURL("/",p,f)]={...w,shouldRedirect:!0,mainPage:!0}),n[x.joinURL("/",a,f)]={...w,shouldRedirect:!0,mainPage:!0};for(const I of i){const O={...w,locale:I};n[x.joinURL("/",I,a,f)]=O,p&&(n[x.joinURL("/",I,p,f)]=O)}}}return n}};U.INSTANCE_TTL=30*60*1e3,U.sharedInstances=new Ee.LRUCache({max:100,ttl:U.INSTANCE_TTL,dispose:s=>{s.destroy()}});let J=U;function Te(){return y.mkdtempSync(d.join(m.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 C(t){return t.filter(s=>s!=null)}async function lt(t,s,e){if(!t||!y.existsSync(t)||!y.lstatSync(t).isFile())return null;let n=e[t];return n||(n=(async()=>(await et({filePath:t,fileName:s})).data.filename)(),e[t]=n),n}const pt=async(t,s)=>{const e=d.basename(t),n=await le.call({name:pe,path:x.joinURL("/uploads",e),responseType:"stream",method:"GET"});if(n.status>=200&&n.status<400){const a=y.createWriteStream(s);await qe.pipeline(n.data,a)}else throw new Error(`download asset failed ${n.status}`)},ut=async(t,s)=>{await Promise.all(t.map(async e=>{try{await pt(e,d.join(s,d.basename(e)))}catch(n){P.logger.error(`Failed to export assets: ${e}, ${n}`)}}))};function je(t){return ue.test(t)?[t]:$.test(t)?(ye.lastIndex=0,Array.from(t.matchAll(ye)).map(e=>e[1]).filter(e=>!!e)):[]}async function ae(t,s,e){const{getFilename:n,exportAssets:a}=e,r=d.join(s,n(t));if(y.mkdirSync(d.dirname(r),{recursive:!0}),y.writeFileSync(r,V.stringify(t)),a){const i=X(t,o=>typeof o=="string"&&(ue.test(o)||$.test(o))).map(o=>{const c=_.get(t,o);return je(c)}).flat().filter(Boolean);await ut(i,d.dirname(r))}}const he=new Ee.LRUCache({max:1e3,ttl:30*24*60*60*1e3});async function Se(t,s,e){var i;const n=X(t,o=>typeof o=="string"&&(ue.test(o)||$.test(o))),a=Ge.default(2),r=n.map(o=>a(async()=>{try{const c=_.get(t,o),f=je(c);for(const p of f){const w=d.basename(p),I=e.getFilePath(p,o),O=I?`${I}:${w}`:w,D=he.get(O);if(D){$.test(c)||_.set(t,o,D);return}const L=await lt(I,w,s);L&&($.test(c)||_.set(t,o,L),he.set(O,L))}}catch(c){P.logger.error(`Failed to process upload for path ${o.join(".")}:`,c.message||c.reason)}})),l=await Promise.allSettled(r);(i=e.onFinish)==null||i.call(e,l)}async function ve(t,{exportAssets:s,pageIds:e="all",componentIds:n="all",rawConfig:a,includeResources:r=!1}={}){var g,T,S,E,F,j;const l=e==="all"?t.pageIds:e,i=dt({state:t,pageIds:l,componentIds:n==="all"?Object.keys(t.components):n}),o=(u,h)=>{var b;return{id:u.id,name:u.name,component:u.component,config:u.config,visibility:u.visibility,properties:((b=u.locales)==null?void 0:b[h])??{}}},c=(u,h)=>{var b;return{id:u.id,createdAt:u.createdAt,updatedAt:u.updatedAt,publishedAt:u.publishedAt,isPublic:u.isPublic??!0,meta:((b=u.locales)==null?void 0:b[h])??{},sections:C(u.sectionIds.map(k=>{const R=u.sections[k];return R&&o(R,h)}))}},f=C(t.supportedLocales.map(u=>u.locale).flatMap(u=>l.map(h=>{const b=t.pages[h];return b&&{locale:u,slug:b.slug,page:c(b,u)}}))),p=Te(),w=d.join(p,"pages");y.mkdirSync(w,{recursive:!0});const I=d.join(p,"components");y.mkdirSync(I,{recursive:!0});for(const{locale:u,slug:h,page:b}of f)await ae(b,w,{getFilename:()=>`${Ae(h)||"index"}.${u}.yml`,exportAssets:s});for(const u of i){const h=(g=t.components[u])==null?void 0:g.data;h&&await ae(h,I,{getFilename:b=>`${b.name||"unnamed"}.${b.id}.yml`,exportAssets:s})}const O=d.join(p,".blocklet/pages/pages.config.yml");y.mkdirSync(d.dirname(O),{recursive:!0});const D={pages:C(l.map(u=>{const h=t.pages[u];return h&&{id:u,slug:h.slug}})),components:C(i.map(u=>{var b;const h=(b=t.components[u])==null?void 0:b.data;return h&&{id:u,name:h.name}})),...r?{resources:{components:C(Object.keys(((T=t.resources)==null?void 0:T.components)||{}).map(u=>{var h,b,k,R;return{id:u,name:(R=(k=(b=(h=t.resources)==null?void 0:h.components)==null?void 0:b[u])==null?void 0:k.component)==null?void 0:R.name}}))}}:{},supportedLocales:t.supportedLocales,config:t.config};y.writeFileSync(O,V.stringify(D));const L=d.join(p,"config.source.json");if(a&&y.writeFileSync(L,JSON.stringify(a)),r){const u=d.join(p,"resources"),h=d.join(u,"components");y.mkdirSync(h,{recursive:!0});for(const b of Object.keys(((S=t==null?void 0:t.resources)==null?void 0:S.components)??{})){const k=(j=(F=(E=t.resources)==null?void 0:E.components)==null?void 0:F[b])==null?void 0:j.component;k&&await ae(k,h,{getFilename:R=>`${R.name||"unnamed"}.${R.id}.yml`,exportAssets:s})}}return p}async function de(t,{importAssets:s,includeResources:e}={}){var r,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=Te(),await Me.x({file:t,C:n}));const o=re.globSync("**/.blocklet/pages/pages.config.yml",{cwd:n,absolute:!0}).at(0),c=o&&d.join(d.dirname(o),"../../pages"),f=o&&d.join(d.dirname(o),"../../components");if(!o)return null;const p=V.parse(y.readFileSync(o).toString()),w=(g,T,S)=>{let E=d.join(g,`${T}${S?`.${S}`:""}.yml`);return(!y.existsSync(E)||!y.lstatSync(E).isFile())&&(E=d.join(g,T,`index${S?`.${S}`:""}.yml`),!y.existsSync(E)||!y.lstatSync(E))?null:V.parse(y.readFileSync(E).toString())},I=(g,T)=>{try{const S=re.globSync(`*.${T}.yml`,{cwd:g,absolute:!0})[0];return S?V.parse(y.readFileSync(S).toString()):null}catch(S){P.logger.error("parse component error",S)}return null},O=C(p.pages.map(({slug:g})=>{var F;const T=C(p.supportedLocales.map(({locale:j})=>{const u=c?w(c,Ae(g),j):void 0;if(u)return{locale:j,page:u};const h=c?w(c,g,j):void 0;return h&&{locale:j,page:h}})),S=(F=T[0])==null?void 0:F.page;if(!S)return null;const E=S.sections.map(j=>{const u=j.id||ie();return{id:u,component:j.component,config:j.config,name:j.name,visibility:j.visibility,locales:Object.fromEntries(C(T.map(({locale:h,page:b})=>{const k=b.sections.find(R=>R.id===u);return k&&[h,k.properties]})))}});return{id:S.id||ie(),createdAt:S.createdAt,updatedAt:S.updatedAt,publishedAt:S.publishedAt,isPublic:S.isPublic??!0,slug:g,sections:Object.fromEntries(E.map(j=>[j.id,j])),sectionIds:E.map(j=>j.id),locales:Object.fromEntries(T.map(({locale:j,page:u})=>[j,u.meta]))}})),D=f?C(((r=p.components)==null?void 0:r.map(({id:g})=>I(f,g)))??[]):[];if(s){const g=(...T)=>{P.logger.info(`[${a?d.basename(t):d.basename(d.join(t,"../../../../"))}] importAssets:`,...T)};try{g("wait image-bin api ready"),await Ye.default({resources:[`${le.getComponentWebEndpoint(He)}/api/sdk/uploads`],validateStatus:E=>E>=200&&E<=500}),g("image-bin api is ready");const T={},S={};g("start to upload assets"),await Promise.allSettled([Se(D,T,{getFilePath:E=>f&&d.join(f,E),onFinish:E=>{g(`upload ${E.length} component assets`)}}),Se(O,S,{getFilePath:(E,F)=>{const j=_.get(O,F.slice(0,1));return c&&d.join(c,d.dirname(j.slug),E)},onFinish:E=>{g(`upload ${E.length} page assets`)}})]),g("upload assets done"),global.gc&&global.gc()}catch(T){g("Error during asset import:",T)}}const L={};if(e){const g=o&&d.join(d.dirname(o),"../../resources/components"),T=C(((i=(l=p.resources)==null?void 0:l.components)==null?void 0:i.map(({id:S})=>I(g,S)))??[]);T.length>0&&(L.components=Object.fromEntries(T.map((S,E)=>[S.id,{index:E,component:S}])))}return{supportedLocales:p.supportedLocales,pageIds:O.map(g=>g.id),components:Object.fromEntries(D.map((g,T)=>[g.id,{index:T,data:g}])),pages:Object.fromEntries(O.map(g=>[g.id,g])),config:p.config||{},resources:L}}finally{a&&n&&y.rmSync(n,{force:!0,recursive:!0})}}async function ce(t,s,{pages:e,pageMergeMode:n="byUpdateTime",deletePages:a=!1,publishMode:r=void 0}={}){try{r&&P.clearPreloadComponentsCacheByMode(r)}catch(f){P.logger.error("clear preload page cache error",{error:f})}const{pageIds:l,pages:i,supportedLocales:o}=t;for(const f of e??l){const p=i[f];if(!p){const w=s.pageIds.indexOf(f);w!==-1&&a&&(s.pageIds.splice(w,1),delete s.pages[f]);continue}if(s.pageIds.includes(p.id)){if(n==="replace")s.pages[p.id]=p;else if(n==="byUpdateTime"){const w=s.pages[p.id];(!w||p.updatedAt&&p.updatedAt>w.updatedAt)&&(s.pages[p.id]=p)}}else s.pageIds.push(p.id),s.pages[p.id]=p}if(a&&!e)for(const f of s.pageIds)t.pageIds.includes(f)||delete s.pages[f],s.pageIds=[...s.pageIds].filter(p=>t.pageIds.includes(p));if(s.supportedLocales.splice(0,s.supportedLocales.length),s.supportedLocales.push(..._.cloneDeep(o)),a)for(const f of Object.keys(s.components))delete s.components[f];let c=JSON.parse(JSON.stringify(t.components));c=Object.fromEntries(await Promise.all(Object.entries(c).map(async([f,p])=>{const w=await Ie(p==null?void 0:p.data);return[f,{...p,data:w}]}))),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 Ie=ke.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 P.getExportSchemaValueFromCode(e,"PROPERTIES_SCHEMA",t.id);n&&n.length>0&&t&&(t.properties={},n.forEach((a,r)=>{t!=null&&t.properties&&(t.properties[a.id]={index:r,data:a})}))}catch(n){P.logger.error("checkPropertiesFromCode error",{componentId:t.id,name:t.name},{error:n})}}return t},{keyGenerator:t=>JSON.stringify(["checkPropertiesFromCode",t])});function dt({state:t,pageIds:s=[],componentIds:e=[]}){var l;const n=(i,o=new Set)=>(Array.isArray(i)&&i.forEach(c=>n(c,o)),i&&typeof i=="object"&&(typeof i.componentId=="string"&&o.add(i.componentId),Object.values(i).forEach(c=>n(c,o))),o),a=new Set(e);for(const i of s){const o=t.pages[i];n(o,a)}const r=[...a];for(;r.length;){const i=r.shift();a.has(i)||a.add(i);const o=(l=t.components[i])==null?void 0:l.data;if(o)for(const c of n(o))a.has(c)||r.push(c)}return[...a]}let Q,G,fe,ge;function Oe(){return Q=(async()=>{const t=le.getResources({types:[{did:pe,type:be}]});G=(await Promise.all(t.map(async e=>{const n=e.path?await de(e.path,{importAssets:!1}):void 0;return n?{blockletId:e.did,state:n,blockletTitle:e.title}:void 0}))).filter(e=>!!e),fe=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}]))),{});ge=Object.fromEntries(await Promise.all(Object.entries(s).map(async([e,n])=>{const a=await Ie(n.component);return[e,{...n,component:a}]})))})(),Q}function Pe(t){const s=_.debounce(async()=>{await Oe().catch(e=>{P.logger.error("load resource states error",{error:e})}),await(t==null?void 0:t({states:G,pages:fe,components:ge}))},3e3,{leading:!1,trailing:!0});return s(),m.default.events.on(m.default.Events.componentAdded,s),m.default.events.on(m.default.Events.componentRemoved,s),m.default.events.on(m.default.Events.componentStarted,s),m.default.events.on(m.default.Events.componentStopped,s),m.default.events.on(m.default.Events.componentUpdated,s),m.default.events.on(oe,s),()=>{m.default.events.off(m.default.Events.componentAdded,s),m.default.events.off(m.default.Events.componentRemoved,s),m.default.events.off(m.default.Events.componentStarted,s),m.default.events.off(m.default.Events.componentStopped,s),m.default.events.off(m.default.Events.componentUpdated,s),m.default.events.off(oe,s)}}const De=Symbol.for("GLOBAL_RESOURCE_STATES_LISTENER_KEY"),W=globalThis;var we;(we=W[De])==null||we.call(W);W[De]=Pe(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 r=await N.findByPk(n);if(r!=null&&r.useAllResources)a.syncedStore.resources.components=s;else{const i=(await ee.findAll({where:{projectId:n}})).map(c=>c.componentId),o=Object.fromEntries(Object.entries(s||{}).filter(([c])=>i.includes(c)));a.syncedStore.resources.components=o}P.logger.info(`update [${n}] resource states:`,{pages:Object.keys(a.syncedStore.resources.pages||{}).length,components:Object.keys(a.syncedStore.resources.components||{}).length})}))});async function ft(){P.logger.info("trigger reload all project resource"),m.default.events.emit(oe)}async function _e(){return Q??(Q=Oe()),await Q,{states:G,pages:fe,components:ge}}exports.COMPONENT_DID=pe;exports.PUBLISH_MODES=it;exports.Project=N;exports.RESOURCE_TYPE=be;exports.SITE_STATE_PATH=B;exports.STATE_MODES=ot;exports.SiteState=J;exports.fromPackage=de;exports.getMultiTenantAllProjectAccessPassports=Xe;exports.getResourceStates=_e;exports.initPackResourceStates=Pe;exports.isMultiTenant=We;exports.mergeState=ce;exports.nextId=ie;exports.toPackage=ve;exports.triggerReloadAllProjectResource=ft;
|
package/lib/state-CfaAw7fr.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const j=require("react/jsx-runtime"),v=require("@mui/material"),Q=require("gradient-parser"),X=require("tinycolor2"),I=require("ufo"),Y=require("@blocklet/js-sdk"),T=require("@syncedstore/core"),Z=require("@syncedstore/react"),J=require("ahooks"),$=require("immer"),H=require("js-cookie"),ee=require("lodash/debounce"),te=require("nanoid"),c=require("react"),F=require("react-router-dom"),ne=require("y-indexeddb"),oe=require("y-websocket"),se=require("yjs"),y=e=>e&&e.__esModule?e:{default:e},re=y(Q),ce=y(X),ie=y(T),ae=y(H),ue=y(ee);function B(){const{pathname:e}=window.location,n=e.match(/\/admin\/(maker|previewer)\/([^/]+)/),l=n==null?void 0:n[2],a=window.__PROJECT_ID__;if(!l&&!a)throw new Error("Unable to get projectId from pathname");return l||a}function de(e){return`${e}:pages:version`}function le({error:e}){return j.jsx(v.Box,{children:j.jsx(v.Alert,{severity:"error",children:e.message})})}var W;const _=((W=window.blocklet)==null?void 0:W.prefix)||"/",b=Y.createAxios({timeout:200*1e3}),fe=window.location.protocol==="https:"?"wss":"ws",me=e=>I.joinURL(`${fe}://${window.location.hostname}`,_,`api/${e}/ws/pages`),pe="z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9";var D;(D=blocklet==null?void 0:blocklet.componentMountPoints.find(e=>e.did===pe))!=null&&D.mountPoint||I.joinURL(_,"/image-bin");function we(e){return e&&!/^(https?:\/\/|\/)/.test(e)?window.location.origin+I.joinURL(_,"uploads",e):e}const ge=window.innerWidth<=750;function he(e,n,l){if(!e||/\.gif/.test(e))return e;const a=(ge?n/1.5:n)*(l==="quality"?1.5:1);return Se(e,{imageFilter:"resize",w:a,f:"webp"})}function Se(e,n){return!e||!n?e:I.withQuery(e,n)}function V(e){if(e!=null&&e.trim())try{return re.default.parse(e),!0}catch{return!1}return!1}function Pe(e){return typeof e!="string"?!1:!!(V(e)||ce.default(e).isValid())}async function je(e){return b.get(`/api/projects/${e}`).then(n=>n.data)}async function Ie(e){return b.post(`/api/projects/${e.id}/update`,e).then(n=>n.data)}const ke=500,C=te.customAlphabet("abcdefghijklmnopqrstuvwxyz0123456789",16),z=c.createContext(null);function xe({url:e,name:n,children:l,waitingSynced:a}){const[u,f]=c.useState(!1),w=L(),t=`${w}:MakerLocalState`,s=`${w}:${n}`,[r,o]=J.useLocalStorageState(t,{defaultValue:{}}),i=c.useRef(r);i.current=r;const h=c.useMemo(()=>ie.default({pages:{},pageIds:[],components:{},supportedLocales:[],config:{},resources:{}}),[]),g=c.useMemo(()=>T.getYjsDoc(h),[h]);c.useMemo(()=>new ne.IndexeddbPersistence(s,g),[s,g]);const P=c.useMemo(()=>new oe.WebsocketProvider(e,s,g,{params:{token:ae.default.get("login_token")}}),[e,s,g]),k=c.useMemo(()=>new se.UndoManager([g.getArray("pageIds"),g.getMap("pages"),g.getArray("supportedLocales"),g.getMap("config")],{doc:g}),[g]),[x,E]=c.useState(null),[A,q]=c.useState(!1),[R,M]=c.useState(void 0),O=c.useCallback(async()=>{if(w){q(!0);try{const d=await je(w);E(d)}catch(d){console.error("Failed to fetch project:",d)}finally{q(!1)}}},[w]),U=c.useCallback(async(d,m)=>{var S;if(M(void 0),!!w){m!=null&&m.optimisticUpdate&&x&&E(p=>({...p,...d}));try{const p=await Ie({...d});E(p)}catch(p){console.error("Failed to update project:",p),m!=null&&m.optimisticUpdate&&E(x),M((S=p==null?void 0:p.response)==null?void 0:S.data)}}},[w,x]);c.useEffect(()=>{w&&O()},[w,O]);const K=c.useMemo(()=>({doc:g,state:h,localState:r,setLocalState:d=>o(typeof d=="function"?m=>d(m??{}):d),undoManager:k,projectState:{project:x,isLoadingProject:A,error:R},updateProject:U}),[g,h,r,o,k,x,A,U,R]);return c.useEffect(()=>{k.on("stack-item-added",({stackItem:d})=>{const{currentPageId:m,currentLocale:S,pages:p}=i.current;d.meta.set("localState",{currentPageId:m,currentLocale:S,pages:p})}),k.on("stack-item-popped",({stackItem:d})=>{const m=d.meta.get("localState");m&&o(S=>({...S,...m}))})},[k,o]),c.useEffect(()=>{P.awareness.setLocalState(r)},[P,r]),c.useEffect(()=>{P.once("synced",()=>f(!0));const d=()=>{o(p=>({...p,networkStatus:void 0}))},m=()=>{o(p=>({...p,networkStatus:"offline"}))},S=ue.default(({status:p})=>{p==="connected"?d():p==="disconnected"&&m()},ke);return P.on("status",S),window.addEventListener("online",d),window.addEventListener("offline",m),()=>{P.off("status",S),window.removeEventListener("online",d),window.removeEventListener("offline",m)}},[P,o]),a&&!u?null:j.jsx(z.Provider,{value:K,children:l})}const G=()=>{const e=c.useContext(z);if(!e)throw new Error("Context is null");const n=Z.useSyncedStore(e.state),{setLocalState:l}=e,a=F.useNavigate(),u=L(),f=c.useMemo(()=>({setCurrentSectionId:(t,s)=>{a(I.joinURL("/admin/maker",u??"","pages",t)),l(r=>$.produce(r,o=>{var i;o.currentPageId=t,o.currentComponentId=void 0,s!==void 0&&(o.pages??(o.pages={}),(i=o.pages)[t]??(i[t]={}),o.pages[t].currentSectionId=s??void 0),s?window.sessionStorage.setItem("iframe_show_id",`"${s}"`):window.sessionStorage.removeItem("iframe_show_id")}))},setCurrentComponentId:t=>{a(I.joinURL("/admin/maker",u??"","components",t)),l(s=>$.produce(s,r=>{r.currentComponentId=t}))}}),[l,a,u]),w=c.useMemo(()=>({addPage:(t,s)=>{const r=(t==null?void 0:t.id)??C(),o={...t,id:r,createdAt:(t==null?void 0:t.createdAt)??new Date().toISOString(),updatedAt:(t==null?void 0:t.updatedAt)??new Date().toISOString(),publishedAt:new Date(0).toISOString(),slug:(t==null?void 0:t.slug)??`/${r}`,sections:(t==null?void 0:t.sections)??{},sectionIds:(t==null?void 0:t.sectionIds)??[],isPublic:(t==null?void 0:t.isPublic)??!0};return e.doc.transact(()=>{n.pages[o.id]=o,n.pageIds.splice(s??n.pageIds.length,0,o.id)}),o},deletePage:t=>{const s=n.pageIds.indexOf(t);s!==-1&&e.doc.transact(()=>{n.pageIds.splice(s,1),delete n.pages[t]})},movePage:(t,s)=>{const{pageIds:r}=n,o=r.indexOf(t);o>=0&&r.splice(s,0,...r.splice(o,1))},addSection:(t,s,r)=>{const o=n.pages[t];if(!o)throw new Error(`Page ${t} is not exists`);const i={...s,id:s.id??C()};return e.doc.transact(()=>{o.sections[i.id]=i,o.sectionIds.splice(r??o.sectionIds.length,0,i.id)}),i},deleteSection:(t,s)=>{const r=n.pages[t];if(!r)throw new Error(`Page ${t} is not exists`);const o=r.sectionIds.indexOf(s);o!==-1&&e.doc.transact(()=>{r.sectionIds.splice(o,1),delete r.sections[s]})},toggleSectionVisibility:(t,s,r)=>{const o=n.pages[t];if(!o)throw new Error(`Page ${t} is not exists`);const i=o.sections[s];i&&(i.visibility=r)},moveSection:(t,s,r)=>{const o=n.pages[t];if(!o)throw new Error(`Page ${t} is not exists`);const{sectionIds:i}=o,h=i.indexOf(s);h>=0&&i.splice(r,0,...i.splice(h,1))}}),[n,e.doc]);return{...e,state:n,actions:w,localActions:f,get currentPage(){const{localState:{currentPageId:t}}=e;return t?n.pages[t]:void 0},get currentSection(){var o,i,h;const{localState:{currentPageId:t,...s}}=e;if(!t)return;const r=(i=(o=s.pages)==null?void 0:o[t])==null?void 0:i.currentSectionId;if(r)return(h=n.pages[t])==null?void 0:h.sections[r]}}},L=()=>{const{projectId:e}=F.useParams();return e??B()};function ve(e){var a,u;const{resources:n}=e;if(!n.components)return{};const l={};return(u=(a=window==null?void 0:window.blocklet)==null?void 0:a.componentMountPoints)==null||u.forEach(f=>{l[f.did]=f}),Object.fromEntries(Object.entries(n.components).map(([f,{blockletId:w,component:t}])=>{var s;return[f,{data:t,blockletId:w,blockletTitle:((s=l[w])==null?void 0:s.title)||w}]}))}function ye(e){const{components:n}=e;return n||{}}function N(e){return{...ve(e),...ye(e)}}const Ee=()=>N(G().state),Ce=[/\.\./,/<[^>]*>/,/%[0-9a-f]{2}/i,/[<>'"%;{}()\\]/,/\x00/,/\n|\r|\t|\v|\f/,/[^a-zA-Z0-9-_@/]/];function _e(e,n,l){const a=[];{let u;n.slug?n.slug.startsWith("/")?n.slug!=="/"&&n.slug.endsWith("/")?u=e("maker.properties.pathCheckEndWithoutSlash"):/\/{2,}/.test(n.slug)?u=e("maker.properties.pathCheckConsecutiveSlash"):/\s/.test(n.slug)?u=e("maker.properties.pathCheckWhitespace"):Ce.some(f=>f.test(n.slug))?u=e("maker.properties.pathCheckInvalid"):Object.values(l.pages).some(f=>(f==null?void 0:f.id)!==n.id&&(f==null?void 0:f.slug)===n.slug)&&(u=e("maker.properties.pathCheckAlreadyExist")):u=e("maker.properties.pathCheckStartWithSlash"):u=e("maker.properties.pathCheckRequired"),u&&a.push({path:["path"],message:u})}return a.length>0?a:null}function be({errors:e,...n}){return e!=null&&e.length?j.jsx(v.Tooltip,{...n,title:j.jsx(v.Box,{children:e.map((l,a)=>j.jsx(v.Box,{children:l.message},a))})}):null}exports.ErrorView=le;exports.PageErrorTip=be;exports.StoreProvider=xe;exports.api=b;exports.autoResizeImage=he;exports.checkPage=_e;exports.getAllComponents=N;exports.getImageAbsoluteUrl=we;exports.getProjectIdFromPathnameOrWindow=B;exports.getProjectPageVersionKey=de;exports.getWssURL=me;exports.isColorString=Pe;exports.isGradient=V;exports.nextId=C;exports.useAllComponents=Ee;exports.useProjectId=L;exports.useStore=G;
|