@digital-herd/content-hub-cli 1.1.8 → 1.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let commander_1=require("commander"),modules_1=__importDefault(require("./modules")),program=new commander_1.Command;program.name("content-hub-tools").description("ContentHub build & utility CLI").version("1.1.8");for(let o of modules_1.default)for(let e of o.commands)program.addCommand(e);program.parse(process.argv);
2
+ var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let commander_1=require("commander"),modules_1=__importDefault(require("./modules")),program=new commander_1.Command;program.name("content-hub-tools").description("ContentHub build & utility CLI").version("1.1.10");for(let o of modules_1.default)for(let e of o.commands)program.addCommand(e);program.parse(process.argv);
@@ -1 +1 @@
1
- var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&("get"in r?t.__esModule:!r.writable&&!r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,r)}:function(e,t,i,n){e[n=void 0===n?i:n]=t[i]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var r=function(e){return(r=Object.getOwnPropertyNames||function(e){var t,i=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(i[i.length]=t);return i})(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=r(e),n=0;n<i.length;n++)"default"!==i[n]&&__createBinding(t,e,i[n]);return __setModuleDefault(t,e),t}})(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),FileService_1=__importDefault(require("../../../services/FileService")),array_1=require("../../../utils/array"),apiCatch_1=require("../../../utils/apiCatch"),hash_1=require("../../../utils/hash"),logger_1=__importStar(require("../../../utils/logger")),lodash_1=require("lodash");class ExternalComponentPublishService{contenthubService;fileService;constructor(e,t){this.contenthubService=e,this.fileService=new FileService_1.default(t)}async publishToPortalAsset(e){var t;for(t of Array.isArray(e)?e:[e]){var i=this.fileService.getComponentConfig(t),n=this.fileService.getComponentBuild(t),i=await this.fileService.tsFileImport(i),n=await this.createOrUpdateAsset(t,n,i);await this.updateExternalComponents(t,i,{assetId:n.id}),logger_1.loggerSuccess.info(t+" Published")}}async publishToLocalPath(e,t){var i;for(i of Array.isArray(t)?t:[t]){var n=this.fileService.getComponentConfig(i),n=await this.fileService.tsFileImport(n),r=`${e}/${i}.js`;await this.updateExternalComponents(i,n,{path:r}),logger_1.loggerSuccess.info(`"${i}" Page component updated to local path`)}}async updateExternalComponents(e,i,{assetId:n,path:r}){var a=i.components.flatMap(e=>e.pageComponentIdentifiers),o=(logger_1.default.info(`Start updating ${a.length} External Page components`),await Promise.all((0,array_1.arrayToChunks)(a,50).map(e=>(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(e,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption("PageComponent.Settings"),new sc_contenthub_webclient_sdk_1.RelationLoadOption(["AssetToPageComponent"])))))).then(e=>e.flat()));for(let t of a){let e=o.find(e=>e.identifier===t);var s=i.components.find(e=>e.pageComponentIdentifiers.includes(t)),c=(e||(logger_1.default.error(`${t} was not found that was specified in the config of "${e}"`),process.exit(-1)),await e.getPropertyValue("PageComponent.Settings")),s={...c,config:s.config,path:r||void 0},c=((0,lodash_1.isEqual)(c,s)||e.setPropertyValue("PageComponent.Settings",s),e.getRelation("AssetToPageComponent"));n&&!c.getIds().includes(n)?c.setIds([n]):r&&c.setIds([]),e.isDirty&&await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.saveAsync(e))}}async createOrUpdateAsset(e,t,i){var i=await this.getOrCreateAsset(e,i),n=i.getPropertyValue("Digest");if(n){var r=await(0,hash_1.sha1FromFile)(t);if(n.replace("0x","")===r)return logger_1.default.info(`"${e}" source code wasn't updated so skip.`),i}n=new sc_contenthub_webclient_sdk_1.LocalUploadSource("file://"+t);console.log(t);let a=new sc_contenthub_webclient_sdk_1.UploadRequest(n,"AssetUploadConfiguration","NewMainFile");return a.actionParameters={AssetId:i.id},await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.uploads.uploadAsync(a)),logger_1.default.info(`"${e}" source code uploaded to asset`),i}async getOrCreateAsset(e,t){let i=await this.getAssetFromFileName(e);return(i=!i&&t.deprecatedAssetFileName?await this.getAssetFromFileName(t.deprecatedAssetFileName):i)?i.getPropertyValue("Title")!==e&&(i.setPropertyValue("Title",e),i.setPropertyValue("FileName",e+".js"),await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.saveAsync(i))):(t=await this.contenthubService.getOrFetchId("M.Content.Repository.Portal"),(i=await this.contenthubService.client.entityFactory.createAsync("M.Asset")).setPropertyValue("Title",e),i.setPropertyValue("FileName",e+".js"),i.getRelation("ContentRepositoryToAsset")?.setIds([t]),i.id=await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.saveAsync(i))),i}async getAssetFromFileName(e){var t=await this.contenthubService.getOrFetchId("M.Content.Repository.Portal"),e=e.replace(".js","");let i=new sc_contenthub_webclient_sdk_1.Query({filter:new sc_contenthub_webclient_sdk_1.CompositeQueryFilter({combineMethod:sc_contenthub_webclient_sdk_1.CompositeFilterOperator.And,children:[new sc_contenthub_webclient_sdk_1.DefinitionQueryFilter({name:"M.Asset",operator:sc_contenthub_webclient_sdk_1.ComparisonOperator.Equals}),new sc_contenthub_webclient_sdk_1.PropertyQueryFilter({property:"Title",dataType:sc_contenthub_webclient_sdk_1.FilterDataType.String,values:[e,e+".js"],operator:sc_contenthub_webclient_sdk_1.ComparisonOperator.Equals}),new sc_contenthub_webclient_sdk_1.RelationQueryFilter({relation:"ContentRepositoryToAsset",parentId:t})]}),take:1});return(await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.querying.queryAsync(i,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption(["FileName","Title","Digest"]),new sc_contenthub_webclient_sdk_1.RelationLoadOption(["AssetToPageComponent"]))))).items[0]}}exports.default=ExternalComponentPublishService;
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,n,i){void 0===i&&(i=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&("get"in r?t.__esModule:!r.writable&&!r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,i,r)}:function(e,t,n,i){e[i=void 0===i?n:i]=t[n]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var r=function(e){return(r=Object.getOwnPropertyNames||function(e){var t,n=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[n.length]=t);return n})(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n=r(e),i=0;i<n.length;i++)"default"!==n[i]&&__createBinding(t,e,n[i]);return __setModuleDefault(t,e),t}})(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),FileService_1=__importDefault(require("../../../services/FileService")),array_1=require("../../../utils/array"),apiCatch_1=require("../../../utils/apiCatch"),hash_1=require("../../../utils/hash"),logger_1=__importStar(require("../../../utils/logger")),lodash_1=require("lodash");class ExternalComponentPublishService{contenthubService;fileService;constructor(e,t){this.contenthubService=e,this.fileService=new FileService_1.default(t)}async publishToPortalAsset(e){var t;for(t of Array.isArray(e)?e:[e]){var n=this.fileService.getComponentConfig(t),i=this.fileService.getComponentBuild(t),n=await this.fileService.tsFileImport(n),i=await this.createOrUpdateAsset(t,i,n);await this.updateExternalComponents(t,n,{assetId:i.id}),logger_1.loggerSuccess.info(t+" Published")}}async publishToLocalPath(e,t){var n;for(n of Array.isArray(t)?t:[t]){var i=this.fileService.getComponentConfig(n),i=await this.fileService.tsFileImport(i),r=`${e}/${n}.js`;await this.updateExternalComponents(n,i,{path:r}),logger_1.loggerSuccess.info(`"${n}" Page component updated to local path`)}}async updateExternalComponents(n,i,{assetId:r,path:o}){var e=i.components.flatMap(e=>e.pageComponentIdentifiers),a=(logger_1.default.info(`Start updating ${e.length} External Page components`),await Promise.all((0,array_1.arrayToChunks)(e,50).map(e=>(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(e,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption("PageComponent.Settings"),new sc_contenthub_webclient_sdk_1.RelationLoadOption(["AssetToPageComponent"])))))).then(e=>e.flat()));for(let t of e){let e=a.find(e=>e.identifier===t);var s=i.components.find(e=>e.pageComponentIdentifiers.includes(t)),c=(e||(logger_1.default.error(t+` was not found that was specified in the config of "${n}"`),process.exit(-1)),await e.getPropertyValue("PageComponent.Settings")),s={...c,config:s.config,path:o||void 0},c=((0,lodash_1.isEqual)(c,s)||e.setPropertyValue("PageComponent.Settings",s),e.getRelation("AssetToPageComponent"));r&&!c.getIds().includes(r)?c.setIds([r]):o&&c.setIds([]),e.isDirty&&await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.saveAsync(e))}}async createOrUpdateAsset(e,t,n){var n=await this.getOrCreateAsset(e,n),i=n.getPropertyValue("Digest");if(i){var r=await(0,hash_1.sha1FromFile)(t);if(i.replace("0x","")===r)return logger_1.default.info(`"${e}" source code wasn't updated so skip.`),n}i=new sc_contenthub_webclient_sdk_1.LocalUploadSource("file://"+t);let o=new sc_contenthub_webclient_sdk_1.UploadRequest(i,"AssetUploadConfiguration","NewMainFile");return o.actionParameters={AssetId:n.id},await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.uploads.uploadAsync(o)),logger_1.default.info(`"${e}" source code uploaded to asset`),n}async getOrCreateAsset(e,t){let n=await this.getAssetFromFileName(e);return(n=!n&&t.deprecatedAssetFileName?await this.getAssetFromFileName(t.deprecatedAssetFileName):n)?n.getPropertyValue("Title")!==e&&(n.setPropertyValue("Title",e),n.setPropertyValue("FileName",e+".js"),await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.saveAsync(n))):(t=await this.contenthubService.getOrFetchId("M.Content.Repository.Portal"),(n=await this.contenthubService.client.entityFactory.createAsync("M.Asset")).setPropertyValue("Title",e),n.setPropertyValue("FileName",e+".js"),n.getRelation("ContentRepositoryToAsset")?.setIds([t]),n.id=await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.saveAsync(n))),n}async getAssetFromFileName(e){var t=await this.contenthubService.getOrFetchId("M.Content.Repository.Portal"),e=e.replace(".js","");let n=new sc_contenthub_webclient_sdk_1.Query({filter:new sc_contenthub_webclient_sdk_1.CompositeQueryFilter({combineMethod:sc_contenthub_webclient_sdk_1.CompositeFilterOperator.And,children:[new sc_contenthub_webclient_sdk_1.DefinitionQueryFilter({name:"M.Asset",operator:sc_contenthub_webclient_sdk_1.ComparisonOperator.Equals}),new sc_contenthub_webclient_sdk_1.CompositeQueryFilter({combineMethod:sc_contenthub_webclient_sdk_1.CompositeFilterOperator.Or,children:[new sc_contenthub_webclient_sdk_1.PropertyQueryFilter({property:"Title",dataType:sc_contenthub_webclient_sdk_1.FilterDataType.String,values:[e,e+".js"],operator:sc_contenthub_webclient_sdk_1.ComparisonOperator.Equals}),new sc_contenthub_webclient_sdk_1.PropertyQueryFilter({property:"FileName",dataType:sc_contenthub_webclient_sdk_1.FilterDataType.String,values:[e,e+".js"],operator:sc_contenthub_webclient_sdk_1.ComparisonOperator.Equals})]}),new sc_contenthub_webclient_sdk_1.RelationQueryFilter({relation:"ContentRepositoryToAsset",parentId:t})]}),take:1});return(await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.querying.queryAsync(n,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption(["FileName","Title","Digest"]),new sc_contenthub_webclient_sdk_1.RelationLoadOption(["AssetToPageComponent"]))))).items[0]}}exports.default=ExternalComponentPublishService;
@@ -6,7 +6,7 @@ declare class ExternalComponentWatchService {
6
6
  private typeCheck;
7
7
  private publishService;
8
8
  private componentBuilds;
9
- private componentWatchers;
9
+ private componentWatcher;
10
10
  constructor(contenthubService: ContenthubService, config: ContenthubConfig, tsconfigName?: string);
11
11
  watchAll(): Promise<void>;
12
12
  watchSingleComponent(component: string): Promise<void>;
@@ -1,2 +1,2 @@
1
- var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&("get"in o?t.__esModule:!o.writable&&!o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){e[i=void 0===i?r:i]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var o=function(e){return(o=Object.getOwnPropertyNames||function(e){var t,r=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[r.length]=t);return r})(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=o(e),i=0;i<r.length;i++)"default"!==r[i]&&__createBinding(t,e,r[i]);return __setModuleDefault(t,e),t}})(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let FileService_1=__importDefault(require("../../../services/FileService")),vite_1=require("vite"),path_1=__importDefault(require("path")),lodash_1=require("lodash"),fs_1=__importDefault(require("fs")),https_1=__importDefault(require("https")),connect_1=__importDefault(require("connect")),chokidar_1=require("chokidar"),selfsigned_1=__importDefault(require("selfsigned")),logger_1=__importDefault(require("../../../utils/logger")),TypeCheckService_1=__importDefault(require("./TypeCheckService")),ExternalComponentPublishService_1=__importDefault(require("./ExternalComponentPublishService"));class ExternalComponentWatchService{config;fileService;typeCheck;publishService;componentBuilds=new Map;componentWatchers=new Map;constructor(e,t,r){this.config=t,this.fileService=new FileService_1.default(t),this.typeCheck=new TypeCheckService_1.default(t,r),this.publishService=new ExternalComponentPublishService_1.default(e,t)}async watchAll(){logger_1.default.info("In watch all mode, it does not update the external components to local path");var e=this.fileService.getAllComponentNames();await this.watchComponents(e,!1)}async watchSingleComponent(e){await this.watchComponents([e])}async getOrCreateCertificate(){var e=path_1.default.resolve(process.cwd(),".vite-certs"),t=path_1.default.join(e,"key.pem"),r=path_1.default.join(e,"cert.pem");if(fs_1.default.existsSync(t)&&fs_1.default.existsSync(r))return{key:fs_1.default.readFileSync(t,"utf-8"),cert:fs_1.default.readFileSync(r,"utf-8")};fs_1.default.existsSync(e)||fs_1.default.mkdirSync(e,{recursive:!0});try{var i=[{name:"commonName",value:"localhost"}],o=selfsigned_1.default.generate(i,{keySize:2048,days:365,algorithm:"sha256",extensions:[{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]}]});return fs_1.default.writeFileSync(t,o.private),fs_1.default.writeFileSync(r,o.cert),{key:o.private,cert:o.cert}}catch(e){throw logger_1.default.error("Failed to generate certificate:",e),new Error("Failed to generate self-signed certificate.")}}setupFileWatcher(e,t){var r;this.componentWatchers.has(e)||(r=this.fileService.getEntryOfComponent(e),r=path_1.default.dirname(r),(r=(0,chokidar_1.watch)(r,{ignored:/(node_modules|\.git|\.vite-cache)/,awaitWriteFinish:{stabilityThreshold:100,pollInterval:100}})).on("change",()=>{logger_1.default.info(`
2
- šŸ“ File changed in ${e}, rebuilding`),this.componentBuilds.delete(e),this.buildComponent(e,t)}),this.componentWatchers.set(e,r))}async watchComponents(o,e=!0){let t=this.fileService.getAllComponentNames();var r=o.filter(e=>!t.includes(e)),r=(r.length&&(logger_1.default.error("Some components does not exists: "+r.join(", ")),process.exit(-1)),await Promise.resolve().then(()=>__importStar(require("vite")))).loadConfigFromFile,r=await r({command:"serve",mode:"development"},path_1.default.resolve(process.cwd(),"vite.config.js"));if(!r)throw new Error("Vite config not found");var i=this.config.port||4e3;e&&await this.publishService.publishToLocalPath("https://localhost:"+i,o);let a=(0,lodash_1.cloneDeep)(r.config),n=await(0,vite_1.createServer)({...a,server:{middlewareMode:!0}});e=(0,connect_1.default)(),e.use(async(t,r,e)=>{t=t.url.match(/^\/([a-zA-Z0-9_]+)\.js$/);if(t){t=t[1];if(!o.includes(t))return r.statusCode=404,void r.end("Component not found");try{this.setupFileWatcher(t,a);var i=await this.buildComponent(t,a);return r.setHeader("Content-Type","application/javascript"),r.setHeader("Access-Control-Allow-Origin","*"),r.setHeader("Cache-Control","no-cache, no-store, must-revalidate"),void r.end(i)}catch(e){return logger_1.default.error(`Error building ${t}:`,e),r.statusCode=500,void r.end("Error building component: "+e)}}e()}),e.use(n.middlewares),r=await this.getOrCreateCertificate();let l=https_1.default.createServer(r,e);l.listen(i,()=>{logger_1.default.info("\nāœ“ Dev server ready at https://localhost:4000"),logger_1.default.info("\nAvailable components:"),o.forEach(e=>{logger_1.default.info(` • https://localhost:4000/${e}.js`)})}),process.on("SIGINT",async()=>{logger_1.default.info("\nShutting down dev server...");for(var e of this.componentWatchers.values())await e.close();await n.close(),l.close(),process.exit(0)})}async buildComponent(t,e){if(this.componentBuilds.has(t))return this.componentBuilds.get(t);await this.typeCheck.specificComponents(t);var r=this.fileService.getEntryOfComponent(t),e=(0,lodash_1.cloneDeep)(e),r=(e.build={...e.build,lib:{formats:["es"],fileName:t,entry:r},outDir:path_1.default.resolve(process.cwd(),".vite-cache",t),emptyOutDir:!1,minify:!1},e.mode="development",e.logLevel="warn",logger_1.default.info(`Building ${t}...`),(0,vite_1.build)(e).then(()=>{var e=path_1.default.resolve(process.cwd(),".vite-cache",t,t+".js");return logger_1.default.info(t+" build finished"),fs_1.default.readFileSync(e,"utf-8")}));return this.componentBuilds.set(t,r),r}}exports.default=ExternalComponentWatchService;
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&("get"in o?t.__esModule:!o.writable&&!o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){e[i=void 0===i?r:i]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||(()=>{var o=function(e){return(o=Object.getOwnPropertyNames||function(e){var t,r=[];for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[r.length]=t);return r})(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=o(e),i=0;i<r.length;i++)"default"!==r[i]&&__createBinding(t,e,r[i]);return __setModuleDefault(t,e),t}})(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let FileService_1=__importDefault(require("../../../services/FileService")),vite_1=require("vite"),path_1=__importDefault(require("path")),lodash_1=require("lodash"),fs_1=__importDefault(require("fs")),https_1=__importDefault(require("https")),connect_1=__importDefault(require("connect")),chokidar_1=require("chokidar"),selfsigned_1=__importDefault(require("selfsigned")),logger_1=__importDefault(require("../../../utils/logger")),TypeCheckService_1=__importDefault(require("./TypeCheckService")),ExternalComponentPublishService_1=__importDefault(require("./ExternalComponentPublishService"));class ExternalComponentWatchService{config;fileService;typeCheck;publishService;componentBuilds=new Map;componentWatcher;constructor(e,t,r){this.config=t,this.fileService=new FileService_1.default(t),this.typeCheck=new TypeCheckService_1.default(t,r),this.publishService=new ExternalComponentPublishService_1.default(e,t)}async watchAll(){logger_1.default.info("In watch all mode, it does not update the external components to local path");var e=this.fileService.getAllComponentNames();await this.watchComponents(e,!1)}async watchSingleComponent(e){await this.watchComponents([e])}async getOrCreateCertificate(){var e=path_1.default.resolve(process.cwd(),".vite-certs"),t=path_1.default.join(e,"key.pem"),r=path_1.default.join(e,"cert.pem");if(fs_1.default.existsSync(t)&&fs_1.default.existsSync(r))return{key:fs_1.default.readFileSync(t,"utf-8"),cert:fs_1.default.readFileSync(r,"utf-8")};fs_1.default.existsSync(e)||fs_1.default.mkdirSync(e,{recursive:!0});try{var i=[{name:"commonName",value:"localhost"}],o=selfsigned_1.default.generate(i,{keySize:2048,days:365,algorithm:"sha256",extensions:[{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]}]});return fs_1.default.writeFileSync(t,o.private),fs_1.default.writeFileSync(r,o.cert),{key:o.private,cert:o.cert}}catch(e){throw logger_1.default.error("Failed to generate certificate:",e),new Error("Failed to generate self-signed certificate.")}}setupFileWatcher(r){var e=path_1.default.dirname(this.config.componentDir),e=(0,chokidar_1.watch)(e,{ignored:/(node_modules|\.git|\.vite-cache)/,awaitWriteFinish:{stabilityThreshold:100,pollInterval:100}});e.on("change",()=>{var e,t=this.componentBuilds.keys();logger_1.default.info(`
2
+ šŸ“ File changed, rebuilding`),this.componentBuilds.clear();for(e of t)this.buildComponent(e,r)}),this.componentWatcher=e}async watchComponents(o,e=!0){let t=this.fileService.getAllComponentNames();var r=o.filter(e=>!t.includes(e)),r=(r.length&&(logger_1.default.error("Some components does not exists: "+r.join(", ")),process.exit(-1)),await Promise.resolve().then(()=>__importStar(require("vite")))).loadConfigFromFile,r=await r({command:"serve",mode:"development"},path_1.default.resolve(process.cwd(),"vite.config.js"));if(!r)throw new Error("Vite config not found");var i=this.config.port||4e3;e&&await this.publishService.publishToLocalPath("https://localhost:"+i,o);let a=(0,lodash_1.cloneDeep)(r.config),n=await(0,vite_1.createServer)({...a,server:{middlewareMode:!0}});e=(0,connect_1.default)(),this.setupFileWatcher(a),e.use(async(t,r,e)=>{t=t.url.match(/^\/([a-zA-Z0-9_]+)\.js$/);if(t){t=t[1];if(!o.includes(t))return r.statusCode=404,void r.end("Component not found");try{var i=await this.buildComponent(t,a);return r.setHeader("Content-Type","application/javascript"),r.setHeader("Access-Control-Allow-Origin","*"),r.setHeader("Cache-Control","no-cache, no-store, must-revalidate"),void r.end(i)}catch(e){return logger_1.default.error(`Error building ${t}:`,e),r.statusCode=500,void r.end("Error building component: "+e)}}e()}),e.use(n.middlewares),r=await this.getOrCreateCertificate();let l=https_1.default.createServer(r,e);l.listen(i,()=>{logger_1.default.info("\nāœ“ Dev server ready at https://localhost:4000"),logger_1.default.info("\nAvailable components:"),o.forEach(e=>{logger_1.default.info(` • https://localhost:4000/${e}.js`)})}),process.on("SIGINT",async()=>{logger_1.default.info("\nShutting down dev server..."),this.componentWatcher&&await this.componentWatcher.close(),await n.close(),l.close(),process.exit(0)})}async buildComponent(t,e){if(this.componentBuilds.has(t))return this.componentBuilds.get(t);await this.typeCheck.specificComponents(t);var r=this.fileService.getEntryOfComponent(t),e=(0,lodash_1.cloneDeep)(e),r=(e.build={...e.build,lib:{formats:["es"],fileName:t,entry:r},outDir:path_1.default.resolve(process.cwd(),".vite-cache",t),emptyOutDir:!1,minify:!1},e.mode="development",e.logLevel="warn",logger_1.default.info(`Building ${t}...`),(0,vite_1.build)(e).then(()=>{var e=path_1.default.resolve(process.cwd(),".vite-cache",t,t+".js");return logger_1.default.info(t+" build finished"),fs_1.default.readFileSync(e,"utf-8")}));return this.componentBuilds.set(t,r),r}}exports.default=ExternalComponentWatchService;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@digital-herd/content-hub-cli",
3
3
  "description": "CLI tools for managing Sitecore Content Hub external components and scripts",
4
- "version": "1.1.8",
4
+ "version": "1.1.10",
5
5
  "type": "commonjs",
6
6
  "main": "./lib/index.js",
7
7
  "types": "./lib/index.d.ts",