@shoplineos/cli 1.5.2 → 1.5.3
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,r){for(var t in r)Object.defineProperty(e,t,{enumerable:!0,get:r[t]})}(exports,{createNewTheme:()=>g,getThemes:()=>h,getThemeInfo:()=>m,uploadTheme:()=>R,getThemeFileList:()=>_,deleteFiles:()=>T,updateFile:()=>O,createFile:()=>$,downloadTheme:()=>b,getThemeFileDetail:()=>I,themeCheck:()=>w});const e=f(require("axios")),r=f(require("form-data")),t=f(require("chalk")),o=f(require("../../../helpers/config")),l=require("../../../utils/const"),i=require("../../../utils/error"),n=require("../const"),s=f(require("../../../utils/debug")),d=f(require("../../../utils/winston")),a=require("../../../helpers/sentry"),u=f(require("../no-second-check")),c=require("../../../utils/ui/render");function f(e){return e&&e.__esModule?e:{default:e}}const{loginInfo:E,currentStore:v}=o.default,p=e.default.create({baseURL:`${v}/api/website/admin/theme/cli`,maxContentLength:1/0,maxBodyLength:1/0});p.interceptors.request.use(e=>{if(E){let r=Object.keys(E).map(e=>`${e}=${E[e]}`).join(";"),t=o.default.dfpToken||"";Object.assign(e.headers,{cookie:r,"dfp-token":t,"User-Agent":l.CLI_USER_AGENT})}return(null==e?void 0:e.data)instanceof r.default&&Object.assign(e.headers,null==e?void 0:e.data.getHeaders()),e}),p.interceptors.response.use(async e=>{var r,o,l,f,E,v,p,g,h,m;if("stream"===e.config.responseType)return e;let R=null==e?void 0:null===(r=e.data)||void 0===r?void 0:r.success,_=null==e?void 0:null===(o=e.data)||void 0===o?void 0:o.code,{config:T}=e;if(s.default.printResponse(T,e),(0,a.reportHttpRes)(e),d.default.logHttp({type:"response",method:e.config.method,url:e.config.baseURL+e.config.url,params:e.config.params,body:e.data,status:e.status,traceId:(null==e?void 0:null===(l=e.data)||void 0===l?void 0:l.trace_id)||(null==e?void 0:null===(f=e.headers)||void 0===f?void 0:f["x-request-id"])||""}),n.ERROR_CODES.THEME_COUNT_LIMIT.includes(_))throw Error(n.ERRORS.THEME_COUNT_LIMIT);if(n.ERROR_CODES.DEVELOPMENT_THEME_NOT_EXIST.includes(_))throw Error(n.ERRORS.THEME_IS_INVALID);if(n.ERROR_CODES.FEATURE_KEY_NOT_EXIST.includes(_))throw Error(n.ERRORS.FEATURE_KEY_NOT_EXIST);if(n.ERROR_CODES.NO_SECOND_CHECK.includes(_))await u.default.run();else if(n.ERROR_CODES.INVALID_FILE.includes(_)){console.log();let{errors:r}=e.data.data;throw r.forEach(({filename:e,message:r})=>{(0,c.renderInfo)({headline:e,body:`${t.default.red("[error]: ")}${r}`})}),new i.AbortError(`Theme Check Summary.
|
|
2
2
|
|
|
3
|
-
${
|
|
4
|
-
${JSON.stringify(null!==(
|
|
3
|
+
${r.length} error${1===r.length?"":"s"} found.`)}if(!R)throw new i.AbortError(`${null!==(g=null==e?void 0:null===(v=e.config)||void 0===v?void 0:v.baseURL)&&void 0!==g?g:""}${null!==(h=null==e?void 0:null===(p=e.config)||void 0===p?void 0:p.url)&&void 0!==h?h:""}
|
|
4
|
+
${JSON.stringify(null!==(m=null==e?void 0:e.data)&&void 0!==m?m:{},null,2)}`);return null==e?void 0:null===(E=e.data)||void 0===E?void 0:E.data},e=>{var r,t,o,l,n,s;let a;let u=null===(r=e.response)||void 0===r?void 0:r.status,c=null===(t=e.response)||void 0===t?void 0:t.data,f=(null===(o=e.config)||void 0===o?void 0:o.baseURL)?`${e.config.baseURL}${null!==(n=e.config.url)&&void 0!==n?n:""}`:"",E=(null!==(s=null===(l=e.config)||void 0===l?void 0:l.method)&&void 0!==s?s:"").toUpperCase();if(e.response){let r=(null==c?void 0:c.message)||(null==c?void 0:c.msg)||e.message||"Unknown error";a=`Request failed (${u}): ${r}`}else a=`Network error: ${e.message||"Unable to connect to server"}`;d.default.log(`[API Error] ${E} ${f} - ${a}`),d.default.logError(e);let v=new i.AbortError(a);return Promise.reject(v)});const g=e=>p.post("/theme/upload",e),h=async()=>p.get("/themes"),m=e=>p.get(`/theme/${e}`),R=e=>p.post("/files/upload",e),_=e=>p.get("/files",{params:{themeId:e}}),T=(e,r)=>p.delete("/files",{data:{themeId:e,fileNames:r}}),O=e=>p.put("/file",e),$=e=>p.post("/file",e),b=e=>p.get(`/theme/${e}/download`,{responseType:"stream"}),I=(e,r)=>p.get("/files",{params:{themeId:e,fileNames:r.join(",")}}),w=e=>p.post("/theme/check",e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"PullService3",{enumerable:!0,get:()=>
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"PullService3",{enumerable:!0,get:()=>P});const e=T(require("fs-extra")),t=T(require("pathe")),i=T(require("progress")),r=T(require("adm-zip")),l=require("../../../utils/path"),o=T(require("../../../utils/debug")),s=T(require("../../../utils/include-filter")),a=T(require("../../../utils/ignore-filter")),n=T(require("../../../utils/winston")),u=require("../../../utils/error"),d=require("../utils"),h=require("../inquirer"),c=require("../../../utils/ora-manager"),m=T(require("../../../utils/logger")),f=T(require("./theme")),p=require("../const"),w=require("./api"),g=T(require("../../../helpers/config")),v=require("../../../utils/check-theme-type-version"),y=require("../pull");function E(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function T(e){return e&&e.__esModule?e:{default:e}}class P extends o.default{async pull(){n.default.log("Prepare pull theme...");let{id:e,themeTypeVersion:t}=await this.prepareTheme();if(n.default.log(`Current pull theme id: ${e}`),n.default.log(`Current pull theme type version: ${t}`),!(0,v.isRemoteThemeTypeVersion3)(t)){await new y.PullService({...this.options,theme:e},this.cwd).pull();return}if(this.themeId=e,e){await this.beforePull(),n.default.log(`Downloading theme (${e})...`);let{fileName:t}=await this.processDownloadTheme(e);n.default.log(`Unzipping theme (${t})...`),this.unzipTheme(t),n.default.log(`Theme (${e}) pulled successfully`),m.default.success("Theme pulled successfully")}else throw new u.AbortError(p.ERRORS.THEME_ID_NOT_EXIST)}unzipTheme(i){let l=t.default.join(this.cwd,i);if(e.default.existsSync(l)){try{let e=new r.default(l),t=e.getEntries();t.forEach(t=>{let i=t.entryName,r=this.ignoreFilter.match(i),l=this.includeFilter.match(i);!r&&l&&e.extractEntryTo(i,this.cwd,!0,!0)})}catch(e){throw n.default.log(`[Pull] Failed to unzip theme: ${e.message}`),new u.AbortError(e.message,p.ERRORS.UNZIP_THEME_FAILED)}e.default.removeSync(l)}}async processDownloadTheme(e){let t=(0,c.createOra)("Fetching the theme package file...");try{t.start();let{fileName:i}=await this.downloadTheme(e,t);return await Promise.resolve({fileName:i,themeId:e})}catch(i){return n.default.log(`[Pull] Download theme #${e} failed: ${i.message||i}`),t.isSpinning&&t.fail().clear(),Promise.reject(i.message||i)}}downloadTheme(e,t){return new Promise(async(i,r)=>{let l=await (0,w.downloadTheme)(e);if(t.succeed().clear(),200===l.status){let t=l.headers,o=t["theme-status"],s=t["theme-develop-type"];if(void 0===o||void 0===s){n.default.log(`[Pull] Missing theme headers for #${e}: status=${o}, type=${s}`),r(new u.AbortError(p.ERRORS.THEME_ID_NOT_EXIST));return}this.onDownloadProgress(l,e).then(e=>i(e)).catch(r)}else n.default.log(`[Pull] Unexpected download status ${l.status} for theme #${e}`),r(new u.AbortError(p.ERRORS.DOWNLOAD_THEME_FAILED))})}onDownloadProgress(r,l){return new Promise((o,s)=>{var a,n;let u;let h=r.headers["theme-status"],m=r.headers["theme-develop-type"],f=r.headers["content-length"]||0,w=r.headers["content-disposition"],v=null!==(n=null===(a=/fileName=([^;]+)/.exec(w))||void 0===a?void 0:a[1])&&void 0!==n?n:p.DEFAULT_ZIP_NAME;v=decodeURIComponent(v);let y=t.default.basename(v,".zip"),E=e.default.createWriteStream(t.default.join(this.cwd,v)),T=(0,d.getKeyMessage)(`Pulling theme files from ${decodeURIComponent(y)} (#${l}) on ${g.default.currentStore}`);f?(u=new i.default((0,d.getKeyMessage)("[:bar] :rate/bps :percent :etas"),{complete:"=",incomplete:" ",total:+f,width:50}),console.log(T)):u=(0,c.createOra)({text:T,spinner:"bouncingBar"}),r.data.pipe(E),r.data.on("data",e=>{f?u.tick(e.length):u.start()}),r.data.on("error",e=>{f||u.fail(),s(e)}),r.data.on("end",()=>{f||u.succeed(),E.on("finish",()=>{let i=e.default.statSync(t.default.join(this.cwd,v)).size;this.log("fileSize: %O",i),0===i?(f||u.fail("Downloaded file is empty"),s(Error("Downloaded file is empty"))):o({themeStatus:h,themeType:m,fileName:v})})})})}get isEmptyDir(){return(0,d.isEmptyDir)(!0,this.cwd)}async beforePull(){if(this.isEmptyDir||this.nodelete)return Promise.resolve();let t=await (0,h.askForPull)();return"clear"===t&&(n.default.log("Clear local theme files..."),e.default.emptyDirSync(this.cwd)),Promise.resolve()}async prepareTheme(){if(this.themeId){let{id:e,themeTypeVersion:t}=await f.default.getThemeInfo(this.themeId);return{id:e,themeTypeVersion:t}}if(this.live){let{id:e,themeTypeVersion:t}=await f.default.getLiveThemeInfo();if(!e)throw new u.AbortError('Theme "live" doesn\'t exist');return{id:e,themeTypeVersion:t}}if(this.development){let{id:e,themeTypeVersion:t=""}=await f.default.getDevelopmentThemeInfo();if(!e)throw new u.AbortError('Theme "development" doesn\'t exist');return{id:e,themeTypeVersion:t}}let{id:e,themeTypeVersion:t}=await f.default.chooseThemeList("pull");return{id:e,themeTypeVersion:t}}constructor(e,t=(0,l.cwd)()){var i,r,o,n;super("theme:pull"),E(this,"cwd",void 0),E(this,"themeId",void 0),E(this,"live",void 0),E(this,"development",void 0),E(this,"nodelete",void 0),E(this,"includeFilter",void 0),E(this,"ignoreFilter",void 0),E(this,"options",void 0),this.options=e,this.cwd=t,this.themeId=e.theme||"",this.live=null!==(i=e.live)&&void 0!==i&&i,this.development=null!==(r=e.development)&&void 0!==r&&r,this.nodelete=e.nodelete;let u=null!==(o=e.only)&&void 0!==o?o:[],d=null!==(n=e.ignore)&&void 0!==n?n:[];this.log("includes: %O",u),this.log("ignores: %O",d),this.includeFilter=new s.default(u,this.cwd),this.ignoreFilter=new a.default(d,this.cwd)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var i in t)Object.defineProperty(e,i,{enumerable:!0,get:t[i]})}(exports,{default:()=>w,prompt:()=>v});const e=p(require("inquirer")),t=p(require("ora")),i=p(require("../../../utils/debug")),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var i in t)Object.defineProperty(e,i,{enumerable:!0,get:t[i]})}(exports,{default:()=>w,prompt:()=>v});const e=p(require("inquirer")),t=p(require("ora")),i=p(require("../../../utils/debug")),s=require("../../../utils/path"),r=p(require("../../../utils/print-preview")),l=require("../../../utils/output"),u=require("../types"),n=p(require("./theme")),o=require("../../../utils/ui/ui"),a=p(require("../../../utils/ignore-filter")),h=p(require("../../../utils/include-filter")),d=p(require("../../../utils/winston")),c=require("../../../utils/error"),m=require("../../../utils/check-theme-type-version");function f(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function p(e){return e&&e.__esModule?e:{default:e}}const v=e.default.createPromptModule();class w extends i.default{async confirmPushMode(){if(this.includes.length>0||this.ignores.length>0)return;let{mode:e}=await v([{type:"list",name:"mode",message:"Please choose an action (Use arrow keys)",default:"overwrite",choices:[{name:"Push all static files (safe mode)",value:"safe"},{name:"Push all files (overwrite existing ones)",value:"overwrite"}]}]);({safe:()=>{this.includeFilter=new h.default(["!**/*.json"],this.cwd)},overwrite:()=>{}})[e]()}async push(){d.default.log("Prepare push theme...");let e=await this.prepareTheme();if(!e)return;await this.confirmPushMode();let i=(0,t.default)("Uploading your theme...").start(),s=e.id;try{if(e.status!==u.EThemeStatus.Unpublished||e.id){d.default.log(`[Push] Syncing to existing theme #${e.id}`);let t=new n.default({themeId:e.id,cwd:this.cwd,includeFilter:this.includeFilter,ignoreFilter:this.ignoreFilter});await t.syncTheme({nodelete:this.nodelete})}else{d.default.log(`[Push] Creating new unpublished theme: ${e.name}`);let t=new n.default({cwd:this.cwd,includeFilter:this.includeFilter,ignoreFilter:this.ignoreFilter}),i=await t.createNewTheme({status:e.status,name:e.name});s=i.id}}catch(e){throw i.fail(),d.default.log(`[Push] Failed to push theme: ${e.message}`),e}i.succeed(),d.default.log(`[Push] Theme (${s}) pushed successfully`),(0,l.outputSuccess)("Your theme was pushed successfully"),(0,r.default)(s)}async prepareTheme(){if(this.development){let{id:e,name:t,status:i}=await n.default.getValidDevelopmentInfo();return{id:e,name:t,status:i}}if(this.live){let{id:e,name:t,status:i}=await n.default.getLiveThemeInfo();if(!e)throw new c.AbortError('Theme "live" doesn\'t exist, please try again!');return{id:e,name:t,status:i}}if(this.unpublished){let e=await w.getThemeNamePrompt();return{id:"",name:e,status:u.EThemeStatus.Unpublished}}if(this.themeId){let{id:e,name:t,status:i}=await n.default.getThemeInfo(this.themeId);return{id:e,name:t,status:i}}let{id:e,status:t,name:i,themeTypeVersion:s}=await n.default.chooseThemeList("push"),r=t===u.EThemeStatus.Published,l=(0,m.getThemeTypeVersion)(this.cwd,!0);if(l!==s)throw new c.AbortError(`The theme type version is not matched, local: ${l}, selected: ${s}`);if(r){if(this.allowAlive)return{id:e,name:i,status:t};let s=await w.confirmOverrideStoreTheme();return s?{id:e,name:i,status:t}:null}return{id:e,name:i,status:t}}static async confirmOverrideStoreTheme(){let{isOverride:e}=await v([{type:"confirm",name:"isOverride",message:"Are you sure you want to push to your live theme?",default:!0}]);return e}static async getThemeNamePrompt(){return(0,o.renderTextPrompt)({message:"Please input the unpublished theme name",validate:e=>{if(!e.trim())return"Theme name cannot be empty"}})}constructor(e,t=(0,s.cwd)()){var i,r,l,u,n;super("theme:push"),f(this,"cwd",void 0),f(this,"themeId",void 0),f(this,"live",void 0),f(this,"allowAlive",void 0),f(this,"development",void 0),f(this,"unpublished",void 0),f(this,"includeFilter",void 0),f(this,"ignoreFilter",void 0),f(this,"nodelete",void 0),f(this,"includes",void 0),f(this,"ignores",void 0),this.cwd=t,this.themeId=e.theme||"",this.live=null!==(i=e.live)&&void 0!==i&&i,this.allowAlive=e.allowLive,this.development=null!==(r=e.development)&&void 0!==r&&r,this.unpublished=e.unpublished,this.nodelete=null!==(l=e.nodelete)&&void 0!==l&&l,this.includes=null!==(u=e.only)&&void 0!==u?u:[],this.ignores=null!==(n=e.ignore)&&void 0!==n?n:[],this.log("includes: %O",this.includes),this.log("ignores: %O",this.ignores),this.includeFilter=new h.default(this.includes,this.cwd),this.ignoreFilter=new a.default(this.ignores,this.cwd)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:()=>p});const e=d(require("fs-extra")),t=require("../../../helpers/sentry"),l=require("../../../utils/error"),a=d(require("../../../utils/winston")),i=d(require("../../../utils/get-objects-diff")),r=require("../inquirer"),s=require("../../../utils/messages"),o=d(require("./file")),n=require("./api"),f=d(require("../operation")),c=d(require("../../../utils/debug"));function u(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function d(e){return e&&e.__esModule?e:{default:e}}class p extends c.default{async syncRemoteUpdate(){let{local:e,remote:t}=await this.themeService.getFileChecksums();a.default.log("[Remote Watch] Get remote and local diffs...");let l=await (0,i.default)(t,e);this.log("remote diffs: %O",l),a.default.log(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:()=>p});const e=d(require("fs-extra")),t=require("../../../helpers/sentry"),l=require("../../../utils/error"),a=d(require("../../../utils/winston")),i=d(require("../../../utils/get-objects-diff")),r=require("../inquirer"),s=require("../../../utils/messages"),o=d(require("./file")),n=require("./api"),f=d(require("../operation")),c=d(require("../../../utils/debug"));function u(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function d(e){return e&&e.__esModule?e:{default:e}}class p extends c.default{async syncRemoteUpdate(){let{local:e,remote:t}=await this.themeService.getFileChecksums();a.default.log("[Remote Watch] Get remote and local diffs...");let l=await (0,i.default)(t,e);this.log("remote diffs: %O",l),a.default.log(`[Remote Watch] Found ${l.length} remote diffs, applying...`),await this.updateStrategy(l,!0)}async updateStrategy(e,t){let{local:l,remote:i}=await p.prepareUpdateDiffs(e,t);this.log("local diffs: %O",l),this.log("remote diffs: %O",i),l.length&&a.default.log(`Run local diffs ${JSON.stringify(l)}...`),i.length&&(a.default.log(`Run remote diffs ${JSON.stringify(i)}...`),i.forEach(async({type:e,key:t})=>{let l=new o.default(t,this.themeService.cwd);await this.processRemoteDiffFile(e,l);let a=new f.default("update"===e?"get":e,l).asSyncMessage();console.log(a)}))}removeUpdateToLocalFiles(e){let t=this.updateToLocalFiles.findIndex(t=>t.fileName===e);-1!==t&&this.updateToLocalFiles.splice(t,1)}shouldUpdateToLocal(e){return this.updateToLocalFiles.find(t=>t.fileName===e)}appendUpdateToLocalFiles(e){this.updateToLocalFiles.find(t=>t.fileName===e.fileName)||this.updateToLocalFiles.push(e)}async processRemoteDiffFile(t,l){let{fullPath:i}=l;if("create"===t||"update"===t){a.default.log(`Get file (${l.fileName}) information: ${l.fileName}`);let t=await this.getFileInfo(l.fileName);a.default.log("Writing file content"),e.default.ensureFileSync(i),this.appendUpdateToLocalFiles(l),e.default.writeFileSync(i,t)}else"delete"===t&&(a.default.log(`Delete file (${l.fileName})`),this.appendUpdateToLocalFiles(l),e.default.unlinkSync(i))}async getFileInfo(e){let t=await (0,n.getThemeFileDetail)(this.themeService.themeId,[e]);return t[0].content}static async prepareUpdateDiffs(e,t){let l={local:[],remote:[]},i=e.length,s=e=>"create"===e?"delete":"delete"===e?"create":"update",o=(e,t)=>{let a=t.filter(e=>{let t=e.key;return(t.startsWith("theme.config")||t.startsWith("templates/"))&&t.endsWith(".json")});"remote"===e?l.remote=l.remote.concat(a):l.local=l.local.concat(a.map(e=>({...e,type:s(e.type)})))};if(!i)return l;if(t)return o("remote",e),l;a.default.log("Update conflicts files...");let[{key:n},...f]=e,c=await p.promptUpdateStrategy(n);if(o(c,[e[0]]),1===i)return l;let u=await (0,r.askForApplyToAll)(f.length);for await(let e of(console.log(),f))if(u)a.default.log("Apply to all files to solve conflict files..."),o(c,f);else{let t=await this.promptUpdateStrategy(e.key);a.default.log(`Apply ${e.key} strategy to solve conflict files...`),console.log(),o(t,[e])}return l}static async promptUpdateStrategy(e){let t=(0,s.getMessage)("theme.serve.syncer.update_strategy.title_content",{file_name:e});console.log(t);let l=await (0,r.askForUpdateStrategy)();return l}start(){this.timer=setInterval(async()=>{try{await this.syncRemoteUpdate()}catch(a){this.stop(),(0,t.reportBug)(a);let e=new l.AbortError(a.message);throw e.stack=a.stack,e}},3e3)}stop(){this.timer&&clearInterval(this.timer)}constructor(e){super("theme:serve:update"),u(this,"themeService",void 0),u(this,"timer",void 0),u(this,"updateToLocalFiles",void 0),this.themeService=e,this.timer=null,this.updateToLocalFiles=[]}}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var a in t)Object.defineProperty(e,a,{enumerable:!0,get:t[a]})}(exports,{default:()=>N,startThemeService:()=>O,themePresenter:()=>
|
|
2
|
-
The presence of ${
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var a in t)Object.defineProperty(e,a,{enumerable:!0,get:t[a]})}(exports,{default:()=>N,startThemeService:()=>O,themePresenter:()=>W});const e=k(require("fast-glob")),t=k(require("form-data")),a=k(require("fs")),i=k(require("inquirer")),r=k(require("chokidar")),s=k(require("ora")),l=require("lodash"),n=k(require("../../../utils/debug")),d=k(require("../../../helpers/config")),u=require("../../../utils/messages"),h=require("../../../helpers/sentry"),o=require("../../../utils/path"),c=k(require("../../../utils/winston")),m=require("./api"),f=require("../types"),p=require("../utils"),g=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var a=q(t);if(a&&a.has(e))return a.get(e);var i={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var s in e)if("default"!==s&&Object.prototype.hasOwnProperty.call(e,s)){var l=r?Object.getOwnPropertyDescriptor(e,s):null;l&&(l.get||l.set)?Object.defineProperty(i,s,l):i[s]=e[s]}return i.default=e,a&&a.set(e,i),i}(require("../../../utils/logger")),y=k(require("../../../utils/get-objects-diff")),v=k(require("./file")),T=k(require("./package")),w=require("../../../utils/error"),F=require("../const"),S=k(require("../../../utils/colors")),D=k(require("./remote-watcher")),b=require("../../../utils/ui/render");function I(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function k(e){return e&&e.__esModule?e:{default:e}}function q(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,a=new WeakMap;return(q=function(e){return e?a:t})(e)}const E=i.default.createPromptModule();class N extends n.default{async watchRemote(){this.editorSync&&(this.remoteWatcher=new D.default(this),this.remoteWatcher.start())}watch(){this.watchRemote();let e=r.default.watch((0,p.getThemeDirectory3)(this.cwd),{ignored:/(^|[/\\])\../,ignoreInitial:!0});e.on("ready",()=>{e.on("add",(...e)=>{let t=e[0];c.default.log(`Add theme file: ${t}`),this.shouldWatchFile(t)&&this.onAdd(t)}),e.on("change",(...e)=>{let t=e[0];c.default.log(`Change theme file: ${t}`),this.shouldWatchFile(t)&&this.onChange(t)}),e.on("unlink",(...e)=>{let t=e[0];c.default.log(`Unlink theme file: ${t}`),this.shouldWatchFile(t)&&this.onUnlink(t)})})}shouldWatchFile(e){var t;let a=(0,p.parseFileName)(e,this.cwd);if(null===(t=this.remoteWatcher)||void 0===t?void 0:t.shouldUpdateToLocal(a)){this.remoteWatcher.removeUpdateToLocalFiles(a);return}let i=this.ignoreFilter.match(a),r=this.includeFilter.match(a);return!i&&r}async onAdd(e){let i=(0,p.parseFileName)(e,this.cwd),r=new t.default;r.append("file",a.default.createReadStream(e)),r.append("themeId",this.themeId),r.append("fileName",i);let l=(0,s.default)((0,u.getMessage)("theme.serve.syncer.create_strategy.success",{file_name:i})).start();try{var n;await (0,m.createFile)(r),null===(n=this.sse)||void 0===n||n.broadcast(this.getSseData(e,"add")),l.succeed()}catch(e){c.default.log(`[Watch] Failed to create remote file: ${i}`),(0,b.renderFatalError)(e),l.fail()}}async onChange(e){let i=(0,p.parseFileName)(e,this.cwd),r=new t.default;r.append("file",a.default.createReadStream(e)),r.append("themeId",this.themeId),r.append("fileName",i);let l=(0,s.default)((0,u.getMessage)("theme.serve.syncer.update_strategy.success",{file_name:i})).start();try{var n;await (0,m.updateFile)(r),null===(n=this.sse)||void 0===n||n.broadcast(this.getSseData(e)),l.succeed()}catch(e){c.default.log(`[Watch] Failed to update remote file: ${i}`),(0,b.renderFatalError)(e),l.fail()}}async onUnlink(e){var t;let a=(0,p.parseFileName)(e,this.cwd),i=(0,s.default)((0,u.getMessage)("theme.serve.syncer.delete_strategy.success",{file_name:a})).start();await (0,m.deleteFiles)(this.themeId,[a]),null===(t=this.sse)||void 0===t||t.broadcast(this.getSseData(e,"unlink")),i.succeed()}getSseData(e,t){return"full-page"===this.mode||t&&["add","unlink"].includes(t)?{data:{reload_page:!0}}:{data:{modified:[(0,p.getRelativePath)(e,this.cwd)]}}}async syncTheme({nodelete:e}={nodelete:!1}){let t=(0,s.default)(`✨ Syncing theme #${this.themeId} on ${d.default.currentStore}`).start();c.default.log(`[Sync] Starting sync for theme #${this.themeId}...`);let{name:a,status:i}=await this.findOrCreateTheme(),{local:r,remote:l}=await this.getFileChecksums(),n=await (0,y.default)(r,l);if(c.default.log(`[Sync] Found ${n.length} diffs`),n.length){let t=[],r=[];if(n.forEach(e=>{switch(e.type){case"create":case"update":t.push(e);break;case"delete":r.push(e)}}),!e&&r.length){let e=r.map(e=>e.key);c.default.log(`[Sync] Deleting ${e.length} remote files...`),await (0,m.deleteFiles)(this.themeId,e)}if(t.length){let e=t.map(e=>e.key);c.default.log(`[Sync] Uploading ${e.length} files...`);let r=this.getThemeZipFormData({fileList:e,name:a,status:i});await (0,m.uploadTheme)(r)}}c.default.log(`[Sync] Theme #${this.themeId} synced successfully`),t.succeed()}getThemeZipFormData({fileList:e,status:i,name:r}){let s=new T.default({cwd:this.cwd}).pack(e),l=new t.default;return l.append("file",a.default.createReadStream(s)),l.append("themeId",this.themeId||""),l.append("status",i),l.append("name",r),l}async getFileChecksums(){let{localeFileChecksums:e}=this,t=await (0,m.getThemeFileList)(this.themeId),a=t.reduce((e,t)=>(e[t.name]=t.checksum||"",e),Object.create(null)),i=this.getFilterFileChecksums(e),r=this.getFilterFileChecksums(a);return{local:i,remote:r}}getFilterFileChecksums(e){let t=Object.keys(e).reduce((t,a)=>{let i=this.ignoreFilter.match(a),r=this.includeFilter.match(a);return!i&&r&&(t[a]=e[a]),t},{});return t}get localeFileChecksums(){return this.themeFiles().reduce((e,t)=>(e[t.fileName]=t.checksum,e),{})}themeFiles(){let t=e.default.sync(p.themeDirectoryGlobList3,{cwd:this.cwd,onlyFiles:!0,unique:!0});return t.map(e=>new v.default(e,this.cwd))}static async getThemeInfo(e){let{id:t,name:a,status:i,themeTypeVersion:r}=await (0,m.getThemeInfo)(e);return{id:t,name:a,status:i,themeTypeVersion:r}}async findOrCreateTheme(){try{let{id:e,name:t,status:a}=await N.getThemeInfo(this.themeId);return{id:e,name:t,status:a}}catch(i){c.default.log(`[Sync] Theme #${this.themeId} not found (${i.message}), creating new development theme...`);let{id:e,name:t,status:a}=await this.createNewDevelopmentTheme();return{id:e,name:t,status:a}}}async createNewTheme({name:e,status:t}){let a=this.getThemeZipFormData({status:t,name:e}),{themeId:i}=await (0,m.createNewTheme)(a);return{id:i,name:e,status:t}}async createNewDevelopmentTheme(){let e=(0,p.generateDevThemeName)(),t=this.getThemeZipFormData({name:e,status:f.EThemeStatus.Development}),{themeId:a}=await (0,m.createNewTheme)(t);return this.themeId=a,d.default.developmentThemeId=a,d.default.developmentThemeName=e,{id:a,name:e,status:f.EThemeStatus.Development}}static async getValidDevelopmentInfo(){let e=d.default.developmentThemeId;return await N.isValidDevTheme(e)?{id:e,name:"",status:f.EThemeStatus.Development}:{id:"",name:(0,p.generateDevThemeName)(),status:f.EThemeStatus.Development}}static async isValidDevTheme(e){try{let t=await (0,m.getThemeInfo)(e);if((null==t?void 0:t.status)===f.EThemeStatus.Development)return{id:t.id,name:t.name,status:t.status,themeTypeVersion:t.themeTypeVersion};return null}catch(e){return null}}static async chooseThemeList(e){let t=N.addDevelopmentTheme(await (0,m.getThemes)()),a=t.map(e=>({name:W(e,"short"),value:e.id})).filter(e=>e.value),{themeId:i}=await E([{type:"list",name:"themeId",message:{pull:"Select a theme to pull from",push:"Select theme to push to"}[e],pageSize:a.length,default:a[0].value,loop:!1,choices:a}]),{status:r,name:s,themeTypeVersion:l}=t.find(e=>e.id===i);return{id:i,name:s,status:r,themeTypeVersion:l}}static addDevelopmentTheme(e){let t=d.default.developmentThemeId,a=d.default.developmentThemeName;return t?e.concat({name:a,status:f.EThemeStatus.Development,id:t,themeTypeVersion:""}):e}static async package(e,t=(0,o.cwd)()){try{let e=new T.default({cwd:t});await e.pack()}catch(e){(0,p.handleError)(e)}}static async list(){try{c.default.log("Checking login..."),d.default.isLogin(),console.log((0,u.getMessage)("theme.list.title",{store:d.default.currentStore})),c.default.log("Printing theme list...");let e=await (0,m.getThemes)();e.forEach(e=>{console.log(W(e))}),c.default.log("Print theme list succeed!")}catch(e){(0,p.handleError)(e)}}static async getLiveThemeInfo(){let e=await (0,m.getThemes)(),{id:t,name:a,status:i,themeTypeVersion:r}=e.find(e=>e.status===f.EThemeStatus.Published);return{id:t,name:a,status:i,themeTypeVersion:r}}static async getDevelopmentThemeInfo(){let e=d.default.developmentThemeId,t=d.default.developmentThemeName,a=await N.isValidDevTheme(e);return a?{id:e,name:t,status:a.status,themeTypeVersion:a.themeTypeVersion}:{id:"",name:"",status:"",themeTypeVersion:""}}static checkThemeStandardStructure(e){if(0===e.length)throw new w.AbortError(F.ERRORS.NOT_STANDARD_DIRECTORY);let t=(0,l.difference)(p.standardThemeDirectories3,e);t.length>0&&Error(`
|
|
2
|
+
The presence of ${S.default.bold(null==t?void 0:t[0])} in the directory structure isn't supported.
|
|
3
3
|
|
|
4
4
|
Move any files to a parent folder, then delete unsupported subdirectories.
|
|
5
5
|
|
|
6
6
|
• Required directory structure: https://developer.myshopline.com/docs/introduce/bGgYARTh
|
|
7
|
-
`)}constructor({themeId:e,mode:t,cwd:a,sse:
|
|
7
|
+
`)}constructor({themeId:e,mode:t,cwd:a,sse:i,includeFilter:r,ignoreFilter:s,editorSync:l}){super("theme:theme"),I(this,"cwd",""),I(this,"themeId",""),I(this,"sse",void 0),I(this,"includeFilter",void 0),I(this,"ignoreFilter",void 0),I(this,"editorSync",void 0),I(this,"remoteWatcher",void 0),I(this,"mode",void 0),this.themeId=e||"",this.sse=i,this.cwd=a,this.mode=t||"hot-reload",this.includeFilter=r,this.ignoreFilter=s,this.editorSync=l,this.remoteWatcher=null}}async function O({mode:e,cwd:t,sse:a,includeFilter:i,ignoreFilter:r,editorSync:s}){try{let l=d.default.developmentThemeId,n=new N({themeId:l,mode:e,cwd:t,sse:a,includeFilter:i,ignoreFilter:r,editorSync:s}).watch();return{themeId:l,themeInstance:n}}catch(e){var l,n;return g.error((null==e?void 0:null===(l=e.response)||void 0===l?void 0:null===(n=l.data)||void 0===n?void 0:n.msg)||(null==e?void 0:e.stack)),(0,h.reportAndExit)(e)}}const $={[f.EThemeStatus.Published]:"green",[f.EThemeStatus.Unpublished]:"yellow",[f.EThemeStatus.Development]:"magenta"},P={[f.EThemeStatus.Published]:"live",[f.EThemeStatus.Unpublished]:"unpublished",[f.EThemeStatus.Development]:"development"};function W(e,t="long"){let a=$[e.status],i=[`${S.default[a](`[${P[e.status]}]`)}`];if(e.id===d.default.developmentThemeId&&i.push(S.default.cyan("[yours]")),e.themeTypeVersion&&i.push(S.default.bold.italic.cyan(e.themeTypeVersion)),"long"===t){let t=(0,u.getMessage)("theme.list.long",{id:e.id,name:e.name,tags:i.join(" ")});return t}let r=(0,u.getMessage)("theme.list.short",{name:e.name,tags:i.join(" ")});return r}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shoplineos/cli",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.3",
|
|
4
4
|
"description": "A CLI tool to build for the Shopline platform",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sl": "./bin/index.js"
|
|
@@ -21,7 +21,9 @@
|
|
|
21
21
|
"build:inshopline": "pnpm compile:swc:inshopline && zx scripts/build.mjs --dot-env=inshopline",
|
|
22
22
|
"release:inshopline": "zx scripts/release.mjs --npm-registry inshopline",
|
|
23
23
|
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
|
|
24
|
-
"upload:sourcemaps": "zx scripts/upload-source-maps.mjs --npm-registry npmjs"
|
|
24
|
+
"upload:sourcemaps": "zx scripts/upload-source-maps.mjs --npm-registry npmjs",
|
|
25
|
+
"check-node-compat": "node scripts/min-node-version.mjs",
|
|
26
|
+
"check-node-compat:prod": "node scripts/min-node-version.mjs --prod"
|
|
25
27
|
},
|
|
26
28
|
"repository": {
|
|
27
29
|
"type": "git"
|