@digital-herd/content-hub-cli 1.1.10 ā 1.1.12
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 +1 -1
- package/lib/config/tempDirectory.d.ts +2 -0
- package/lib/config/tempDirectory.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -1
- package/lib/modules/external-components/services/ExternalComponentWatchService.js +1 -1
- package/lib/modules/index.d.ts +1 -0
- package/lib/modules/index.js +1 -1
- package/lib/modules/manual-patches/base/ManualPatch.d.ts +20 -0
- package/lib/modules/manual-patches/base/ManualPatch.js +1 -0
- package/lib/modules/manual-patches/commands/createPatchComponent.js +1 -1
- package/lib/modules/manual-patches/commands/runPatch.js +1 -1
- package/lib/modules/manual-patches/helpers/ManualPatch.d.ts +0 -0
- package/lib/modules/manual-patches/helpers/ManualPatch.js +1 -0
- package/lib/modules/manual-patches/index.d.ts +2 -0
- package/lib/modules/manual-patches/index.js +1 -1
- package/lib/modules/manual-patches/services/CreatePatchService.d.ts +1 -1
- package/lib/modules/manual-patches/services/CreatePatchService.js +8 -5
- package/lib/modules/manual-patches/services/PatchSelectionService.d.ts +11 -0
- package/lib/modules/manual-patches/services/PatchSelectionService.js +1 -0
- package/lib/modules/manual-patches/services/RunPatchService.d.ts +18 -1
- package/lib/modules/manual-patches/services/RunPatchService.js +1 -1
- package/lib/services/FileService.d.ts +2 -0
- package/lib/services/FileService.js +7 -7
- package/package.json +2 -1
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.
|
|
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.11");for(let o of modules_1.default)for(let e of o.commands)program.addCommand(e);program.parse(process.argv);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0}),exports.BUILD_DIRECTORY=exports.GLOBAL_TEMP_DIRECTORY=void 0,exports.GLOBAL_TEMP_DIRECTORY=".contenthub-cli",exports.BUILD_DIRECTORY=".contenthub-cli/dist";
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0}),exports.LOGS_DIRECTORY=exports.PATCH_DIRECTORY=exports.BUILD_DIRECTORY=exports.GLOBAL_TEMP_DIRECTORY=void 0,exports.GLOBAL_TEMP_DIRECTORY=".contenthub-cli",exports.BUILD_DIRECTORY=".contenthub-cli/dist",exports.PATCH_DIRECTORY=".contenthub-cli/patches",exports.LOGS_DIRECTORY=".contenthub-cli/patches";
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,
|
|
1
|
+
var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&("get"in i?t.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,i)}:function(e,t,r,o){e[o=void 0===o?r:o]=t[r]}),__exportStar=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||__createBinding(t,e,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./types/ContentHubConfig.interface.js"),exports),__exportStar(require("./types/ExternalComponentConfig.interface.js"),exports),__exportStar(require("./types/ScriptConfig.interface.js"),exports),__exportStar(require("./types/Patch.interface.js"),exports),__exportStar(require("./modules"),exports);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
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;
|
|
2
|
+
š File changed, rebuilding`),this.componentBuilds.clear();for(e of t)try{this.buildComponent(e,r)}catch(e){logger_1.default.error(e)}}),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/lib/modules/index.d.ts
CHANGED
package/lib/modules/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let external_components_1=__importDefault(require("./external-components")),scripts_1=__importDefault(require("./scripts")),manual_patches_1=__importDefault(require("./manual-patches"));exports.default=[external_components_1.default,scripts_1.default,manual_patches_1.default];
|
|
1
|
+
var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&("get"in n?t.__esModule:!n.writable&&!n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){e[a=void 0===a?r:a]=t[r]}),__exportStar=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||__createBinding(t,e,r)},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let external_components_1=__importDefault(require("./external-components")),scripts_1=__importDefault(require("./scripts")),manual_patches_1=__importDefault(require("./manual-patches"));__exportStar(require("./manual-patches"),exports),exports.default=[external_components_1.default,scripts_1.default,manual_patches_1.default];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ContentHubClient } from "@sitecore/sc-contenthub-webclient-sdk";
|
|
2
|
+
import { Logger } from "tslog";
|
|
3
|
+
export interface PatchConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
onLastHitData: (lastHit: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export type PatchConstructor = new (client: ContentHubClient, props: PatchConfig) => ManualPatch;
|
|
8
|
+
declare abstract class ManualPatch {
|
|
9
|
+
client: ContentHubClient;
|
|
10
|
+
name: string;
|
|
11
|
+
logger: Logger<any>;
|
|
12
|
+
constructor(client: ContentHubClient, { name }: PatchConfig);
|
|
13
|
+
preRun(): Promise<void>;
|
|
14
|
+
postRun(): Promise<void>;
|
|
15
|
+
abstract run(lastHitData: any): Promise<void>;
|
|
16
|
+
logInfo(...args: any): void;
|
|
17
|
+
logWarning(...args: any): void;
|
|
18
|
+
logError(...args: any): void;
|
|
19
|
+
}
|
|
20
|
+
export default ManualPatch;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0});let tslog_1=require("tslog");class ManualPatch{client;name;logger;constructor(e,{name:t}){this.client=e,this.name=t,this.logger=new tslog_1.Logger({name:"Contenthub CLI",minLevel:0,prettyLogTemplate:"{{name}} : "})}async preRun(){}async postRun(){}logInfo(...e){this.logger.info(...e)}logWarning(...e){this.logger.warn(...e)}logError(...e){this.logger.error(...e)}}exports.default=ManualPatch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createPatchCommand=void 0;let commander_1=require("commander"),prompts_1=require("@inquirer/prompts"),globalCommandConfig_js_1=require("../../../utils/globalCommandConfig.js"),logger_js_1=__importDefault(require("../../../utils/logger.js")),CreatePatchService_js_1=__importDefault(require("../services/CreatePatchService.js"));exports.createPatchCommand=new commander_1.Command("create-manual-patch").description("Create a new patch from template").action(async
|
|
1
|
+
var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createPatchCommand=void 0;let commander_1=require("commander"),prompts_1=require("@inquirer/prompts"),globalCommandConfig_js_1=require("../../../utils/globalCommandConfig.js"),logger_js_1=__importDefault(require("../../../utils/logger.js")),CreatePatchService_js_1=__importDefault(require("../services/CreatePatchService.js")),PatchSelectionService_js_1=__importDefault(require("../services/PatchSelectionService.js"));exports.createPatchCommand=new commander_1.Command("create-manual-patch").description("Create a new patch from template").action(async a=>{var r,i,o=(await(0,globalCommandConfig_js_1.globalCommandConfig)(a)).config,s=new CreatePatchService_js_1.default(o),o=new PatchSelectionService_js_1.default(o);try{let t=await o.getGroups(),e=a.group;e||(r="__CREATE_NEW__",i=await(0,prompts_1.select)({message:"Select which patch Group you want to use:",choices:[...t.map(e=>({name:e,value:e})),{name:"ā Create new group...",value:r}]}),e=i===r?await(0,prompts_1.input)({message:"Enter the new group name (e.g., feature):",validate:e=>e&&0!==e.trim().length?!t.includes(e.trim())||"This group already exists. Please choose a different name.":"Group name is required"}):i);var n=(await(0,prompts_1.input)({message:"Enter the patch name (e.g., MyPatch, FixUserIssue):",validate:e=>e&&0!==e.trim().length?!!/^[a-zA-Z]+$/.test(e)||"Patch name must contain only letters":"Patch name is required"})).trim();await s.createPatch(e,n)}catch(e){e instanceof Error&&logger_js_1.default.error("Failed to create patch: "+e.message),process.exit(1)}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.runPatchCommand=void 0;let commander_1=require("commander"),prompts_1=require("@inquirer/prompts"),globalCommandConfig_js_1=require("../../../utils/globalCommandConfig.js"),logger_js_1=__importDefault(require("../../../utils/logger.js")),RunPatchService_js_1=__importDefault(require("../services/RunPatchService.js"));exports.runPatchCommand=(0,globalCommandConfig_js_1.setGlobalConfig)(new commander_1.Command("run-manual-patch")).description("Run a patch").action(async e=>{var{config:
|
|
1
|
+
var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.runPatchCommand=void 0;let commander_1=require("commander"),prompts_1=require("@inquirer/prompts"),globalCommandConfig_js_1=require("../../../utils/globalCommandConfig.js"),logger_js_1=__importDefault(require("../../../utils/logger.js")),RunPatchService_js_1=__importDefault(require("../services/RunPatchService.js")),PatchSelectionService_js_1=__importDefault(require("../services/PatchSelectionService.js"));exports.runPatchCommand=(0,globalCommandConfig_js_1.setGlobalConfig)(new commander_1.Command("run-manual-patch")).option("-g, --group <group>","patch group").option("-p, --patch <patch>","patch in group").description("Run a patch").action(async e=>{var{config:t,contenthubService:a}=await(0,globalCommandConfig_js_1.globalCommandConfig)(e),a=new RunPatchService_js_1.default(a,t),t=new PatchSelectionService_js_1.default(t);try{var o=await t.getGroups(),r=e.group||await(0,prompts_1.select)({message:"Select with patch Group you want to run:",choices:o.map(e=>({name:e,value:e}))}),i=await t.getPatches(r),c=e.patch||await(0,prompts_1.select)({message:"Select with patch Group you want to run:",choices:i.map(e=>({name:e,value:e}))}),n=t.getPatchFile(r,c);await a.runPatch(n,c)}catch(e){e instanceof Error&&logger_js_1.default.error("Failed to run patch: "+e.message),process.exit(1)}});
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});let createPatchComponent_1=require("./commands/createPatchComponent"),runPatch_1=require("./commands/runPatch");exports.default={commands:[createPatchComponent_1.createPatchCommand,runPatch_1.runPatchCommand]};
|
|
1
|
+
var __importDefault=this&&this.__importDefault||function(a){return a&&a.__esModule?a:{default:a}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ManualPatch=void 0;let createPatchComponent_1=require("./commands/createPatchComponent"),runPatch_1=require("./commands/runPatch"),ManualPatch_1=__importDefault(require("./base/ManualPatch"));exports.ManualPatch=ManualPatch_1.default,exports.default={commands:[createPatchComponent_1.createPatchCommand,runPatch_1.runPatchCommand]};
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
var __createBinding=this&&this.__createBinding||(Object.create?function(t,
|
|
1
|
+
var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&("get"in i?t.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){e[a=void 0===a?r:a]=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 i=function(e){return(i=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=i(e),a=0;a<r.length;a++)"default"!==r[a]&&__createBinding(t,e,r[a]);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 fs=__importStar(require("fs")),path=__importStar(require("path")),logger_js_1=__importDefault(require("../../../utils/logger.js"));class CreatePatchService{config;patchDir;constructor(e){this.config=e,this.patchDir=path.resolve(process.cwd(),e.patchDir)}async createPatch(e,t){var t=t.charAt(0).toUpperCase()+t.slice(1),r=t.charAt(0).toLowerCase()+t.slice(1),e=(fs.existsSync(this.patchDir)||fs.mkdirSync(this.patchDir,{recursive:!0}),path.join(this.patchDir,e)),e=(fs.existsSync(e)||fs.mkdirSync(e,{recursive:!0}),path.join(e,r+".patch.ts"));if(fs.existsSync(e))throw logger_js_1.default.error(`Patch "${t}" already exists`),new Error("Patch already exists");logger_js_1.default.info(`š¦ Creating patch "${t}"...`);r=`import { ManualPatch } from "@digital-herd/content-hub-cli";
|
|
2
2
|
|
|
3
|
+
class ${t} extends ManualPatch {
|
|
4
|
+
async preRun() {}
|
|
3
5
|
|
|
6
|
+
async postRun() {}
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
async run() {}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default ${t};
|
|
8
12
|
|
|
9
|
-
export default runPatch${t};
|
|
10
13
|
`;fs.writeFileSync(e,r,"utf-8"),logger_js_1.default.info(`ā
Patch "${t}" created successfully!`),logger_js_1.default.info("š Location: "+path.relative(process.cwd(),e))}}exports.default=CreatePatchService;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ContenthubConfig } from "../../../types/ContentHubConfig.interface";
|
|
2
|
+
declare class PatchSelectionService {
|
|
3
|
+
private config;
|
|
4
|
+
private patchDir;
|
|
5
|
+
private fileService;
|
|
6
|
+
constructor(config: ContenthubConfig);
|
|
7
|
+
getGroups(): Promise<string[]>;
|
|
8
|
+
getPatches(group: string): Promise<string[]>;
|
|
9
|
+
getPatchFile(group: string, patch: string): string;
|
|
10
|
+
}
|
|
11
|
+
export default PatchSelectionService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var c=Object.getOwnPropertyDescriptor(t,r);c&&("get"in c?t.__esModule:!c.writable&&!c.configurable)||(c={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,c)}: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 c=function(e){return(c=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=c(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")),path=__importStar(require("path"));class PatchSelectionService{config;patchDir;fileService;constructor(e){this.config=e,this.patchDir=path.resolve(process.cwd(),e.patchDir),this.fileService=new FileService_1.default(e)}getGroups(){return this.fileService.getAllDirectChildrenOfPath(this.patchDir)}getPatches(e){return this.fileService.getAllDirectChildrenOfPath(this.patchDir+`/${e}/patches`)}getPatchFile(e,t){return this.patchDir+`/${e}/patches/`+t}}exports.default=PatchSelectionService;
|
|
@@ -11,13 +11,30 @@ export default class RunPatchService {
|
|
|
11
11
|
private patchDir;
|
|
12
12
|
private fileService;
|
|
13
13
|
constructor(contenthubService: ContenthubService, config: ContenthubConfig);
|
|
14
|
+
/**
|
|
15
|
+
* Get the path to the lastHit JSON file for a specific patch
|
|
16
|
+
*/
|
|
17
|
+
private getLastHitFilePath;
|
|
18
|
+
/**
|
|
19
|
+
* Read lastHit data from JSON file
|
|
20
|
+
*/
|
|
21
|
+
private readLastHit;
|
|
22
|
+
/**
|
|
23
|
+
* Write lastHit data to JSON file
|
|
24
|
+
*/
|
|
25
|
+
private writeLastHit;
|
|
14
26
|
/**
|
|
15
27
|
* Get all available patch files sorted by last modified (newest first)
|
|
16
28
|
*/
|
|
17
29
|
getAvailablePatches(): PatchFile[];
|
|
30
|
+
/**
|
|
31
|
+
* Build patch with esbuild
|
|
32
|
+
*/
|
|
33
|
+
private buildPatch;
|
|
18
34
|
/**
|
|
19
35
|
* Execute a specific patch
|
|
20
36
|
*/
|
|
21
|
-
runPatch(
|
|
37
|
+
runPatch(patchPath: string, name: string): Promise<void>;
|
|
38
|
+
private runPatchClass;
|
|
22
39
|
}
|
|
23
40
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var __createBinding=this&&this.__createBinding||(Object.create?function(e,
|
|
1
|
+
var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,i){void 0===i&&(i=r);var a=Object.getOwnPropertyDescriptor(e,r);a&&("get"in a?e.__esModule:!a.writable&&!a.configurable)||(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,i,a)}:function(t,e,r,i){t[i=void 0===i?r:i]=e[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||(()=>{var a=function(t){return(a=Object.getOwnPropertyNames||function(t){var e,r=[];for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[r.length]=e);return r})(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r=a(t),i=0;i<r.length;i++)"default"!==r[i]&&__createBinding(e,t,r[i]);return __setModuleDefault(e,t),e}})(),__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0});let fs=__importStar(require("fs")),path=__importStar(require("path")),esbuild_1=require("esbuild"),logger_js_1=__importDefault(require("../../../utils/logger.js")),FileService_js_1=__importDefault(require("../../../services/FileService.js")),tempDirectory_js_1=require("../../../config/tempDirectory.js");class RunPatchService{contenthubService;config;patchDir;fileService;constructor(t,e){this.contenthubService=t,this.config=e,this.patchDir=path.resolve(process.cwd(),e.patchDir),this.fileService=new FileService_js_1.default(e),fs.existsSync(tempDirectory_js_1.PATCH_DIRECTORY)||fs.mkdirSync(tempDirectory_js_1.PATCH_DIRECTORY,{recursive:!0})}getLastHitFilePath(t){return path.join(tempDirectory_js_1.PATCH_DIRECTORY,t+".lastHit.json")}readLastHit(e){var t=this.getLastHitFilePath(e);if(!fs.existsSync(t))return null;try{var r=fs.readFileSync(t,"utf-8");return JSON.parse(r)}catch(t){return logger_js_1.default.warn(`Failed to read lastHit data for "${e}":`,t),null}}writeLastHit(e,t){var r=this.getLastHitFilePath(e);try{fs.writeFileSync(r,JSON.stringify(t,null,2),"utf-8"),logger_js_1.default.info(`š¾ Saved lastHit data for "${e}"`)}catch(t){logger_js_1.default.error(`Failed to write lastHit data for "${e}":`,t)}}getAvailablePatches(){return fs.existsSync(this.patchDir)?fs.readdirSync(this.patchDir).filter(t=>t.endsWith(".patch.ts")).map(t=>{var e=path.join(this.patchDir,t),r=fs.statSync(e);return{name:t.replace(".patch.ts",""),path:e,modifiedTime:r.mtime}}).sort((t,e)=>e.modifiedTime.getTime()-t.modifiedTime.getTime()):(logger_js_1.default.warn("Patch directory not found: "+this.patchDir),[])}async buildPatch(t){var e=path.parse(t).name,r=(path.dirname(t),path.join(tempDirectory_js_1.PATCH_DIRECTORY,e+".esbuild.cjs"));logger_js_1.default.info(`š¦ Building patch "${e}" with esbuild...`);try{return await(0,esbuild_1.build)({entryPoints:[t],outfile:r,bundle:!0,platform:"node",target:"node20",format:"cjs"}),logger_js_1.default.info(`⨠Patch "${e}" built successfully`),console.log(r),r}catch(t){throw logger_js_1.default.error(`Failed to build patch "${e}":`,t),t}}async runPatch(t,e){var r=path.parse(t).name;if(!fs.existsSync(t))throw logger_js_1.default.error(`Patch "${r}" not found at `+t),new Error("Patch not found");logger_js_1.default.info(`š Running patch "${r}"...`);let i=null;try{i=await this.buildPatch(t);var a=new(await this.fileService.jsImport(i))(this.contenthubService.client,{name:e,onLastHitData:t=>this.writeLastHit(e,t)});await this.runPatchClass(a,e),logger_js_1.default.info(`ā
Patch "${r}" completed successfully!`)}catch(t){throw logger_js_1.default.error(`Failed to run patch "${r}":`,t),t}finally{i&&fs.existsSync(i)}}async runPatchClass(e,r,i=!1){try{var t=this.readLastHit(r);await e.preRun(),await e.run(t)}catch(t){throw i||(logger_js_1.default.warn(`Patch "${r}" failed retry in 1m`),setTimeout(()=>this.runPatchClass(e,r,!0),6e4)),t}finally{await e.postRun()}}}exports.default=RunPatchService;
|
|
@@ -13,7 +13,9 @@ declare class FileService {
|
|
|
13
13
|
getScriptContent(scriptName: string): string;
|
|
14
14
|
getAbsolutePath(p: string): string;
|
|
15
15
|
tsFileImport<T = any>(filePath: string, tsconfigPath?: string): Promise<T>;
|
|
16
|
+
jsImport<T = any>(filePath: string): Promise<T>;
|
|
16
17
|
writeScript(scriptName: string, content: string, config: ActionScriptConfig): Promise<void>;
|
|
17
18
|
prettyFile(filePath: string): Promise<void>;
|
|
19
|
+
getAllDirectChildrenOfPath(path: string, type?: "folder" | "file"): Promise<string[]>;
|
|
18
20
|
}
|
|
19
21
|
export default FileService;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0});let glob_1=require("glob"),path_1=__importDefault(require("path")),url_1=require("url"),prettier_1=__importDefault(require("prettier")),tempDirectory_js_1=require("../config/tempDirectory.js"),api_1=require("tsx/esm/api"),fs_1=require("fs");class FileService{config;constructor(t){this.config=t}getAllComponentPaths(t="*.config.ts"){return(0,glob_1.sync)(this.config.componentDir+"/**/"+t)}getAllComponentNames(t="*.config.ts"){return this.getAllComponentPaths(t).map(t=>{t=t.split(path_1.default.sep);return t[t.length-2]})}getDirectoryOfComponent(t){var t=(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.tsx`)[0];return t?((t=t.split(path_1.default.sep)).pop(),t.join(path_1.default.sep)):null}getComponentConfig(t){return(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.config.ts`)[0]}getComponentBuild(t,e=!0){t=(0,glob_1.sync)(tempDirectory_js_1.BUILD_DIRECTORY+`/${t}.js`)[0];return e?t&&this.getAbsolutePath(t):t}getEntryOfComponent(t){return(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.tsx`)[0]}getScriptConfig(t){return(0,glob_1.sync)(this.config.scriptDir+`/${t}/*.config.ts`)[0]}getScriptContent(t){return(0,glob_1.sync)(this.config.scriptDir+`/${t}/*.cs`)[0]}getAbsolutePath(t){return path_1.default.isAbsolute(t)?t:path_1.default.resolve(process.cwd(),t)}async tsFileImport(t,e){t=this.getAbsolutePath(t),e=e?this.getAbsolutePath(e):void 0,t=(0,url_1.pathToFileURL)(t).href,e=e?(0,url_1.pathToFileURL)(e).href:void 0;return(await(0,api_1.tsImport)(t,t,{tsconfig:e})).default}async writeScript(t,e,
|
|
1
|
+
var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(e,r);n&&("get"in n?e.__esModule:!n.writable&&!n.configurable)||(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,i,n)}:function(t,e,r,i){t[i=void 0===i?r:i]=e[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),__importStar=this&&this.__importStar||(()=>{var n=function(t){return(n=Object.getOwnPropertyNames||function(t){var e,r=[];for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[r.length]=e);return r})(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r=n(t),i=0;i<r.length;i++)"default"!==r[i]&&__createBinding(e,t,r[i]);return __setModuleDefault(e,t),e}})(),__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0});let glob_1=require("glob"),path_1=__importDefault(require("path")),url_1=require("url"),prettier_1=__importDefault(require("prettier")),tempDirectory_js_1=require("../config/tempDirectory.js"),api_1=require("tsx/esm/api"),fs_1=require("fs"),promises_1=require("fs/promises");class FileService{config;constructor(t){this.config=t}getAllComponentPaths(t="*.config.ts"){return(0,glob_1.sync)(this.config.componentDir+"/**/"+t)}getAllComponentNames(t="*.config.ts"){return this.getAllComponentPaths(t).map(t=>{t=t.split(path_1.default.sep);return t[t.length-2]})}getDirectoryOfComponent(t){var t=(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.tsx`)[0];return t?((t=t.split(path_1.default.sep)).pop(),t.join(path_1.default.sep)):null}getComponentConfig(t){return(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.config.ts`)[0]}getComponentBuild(t,e=!0){t=(0,glob_1.sync)(tempDirectory_js_1.BUILD_DIRECTORY+`/${t}.js`)[0];return e?t&&this.getAbsolutePath(t):t}getEntryOfComponent(t){return(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.tsx`)[0]}getScriptConfig(t){return(0,glob_1.sync)(this.config.scriptDir+`/${t}/*.config.ts`)[0]}getScriptContent(t){return(0,glob_1.sync)(this.config.scriptDir+`/${t}/*.cs`)[0]}getAbsolutePath(t){return path_1.default.isAbsolute(t)?t:path_1.default.resolve(process.cwd(),t)}async tsFileImport(t,e){t=this.getAbsolutePath(t),e=e?this.getAbsolutePath(e):void 0,t=(0,url_1.pathToFileURL)(t).href,e=e?(0,url_1.pathToFileURL)(e).href:void 0;return(await(0,api_1.tsImport)(t,t,{tsconfig:e})).default}async jsImport(t){t=this.getAbsolutePath(t);return(await Promise.resolve(""+t).then(t=>__importStar(require(t)))).default}async writeScript(t,e,r){var i=this.config.scriptDir+"/"+t,n=((0,fs_1.existsSync)(i)||(0,fs_1.mkdirSync)(i,{recursive:!0}),i+`/${t}.config.ts`);(0,fs_1.writeFileSync)(n,`
|
|
2
2
|
import { type ActionScriptConfig } from "@digital-herd/content-hub-cli";
|
|
3
3
|
export default {
|
|
4
|
-
identifier: "${
|
|
5
|
-
type: "${
|
|
6
|
-
title: "${
|
|
7
|
-
description: \`${
|
|
8
|
-
executeAsUser: ${
|
|
4
|
+
identifier: "${r.identifier}",
|
|
5
|
+
type: "${r.type}",
|
|
6
|
+
title: "${r.title}",
|
|
7
|
+
description: \`${r.description}\`,
|
|
8
|
+
executeAsUser: ${r.executeAsUser?"true":"false"},
|
|
9
9
|
} as ActionScriptConfig;
|
|
10
|
-
`),await this.prettyFile(
|
|
10
|
+
`),await this.prettyFile(n),(0,fs_1.writeFileSync)(i+`/${t}.cs`,e)}async prettyFile(t){var e=await prettier_1.default.format((0,fs_1.readFileSync)(t,"utf8"),{...await prettier_1.default.resolveConfig(t),filepath:t});(0,fs_1.writeFileSync)(t,e)}async getAllDirectChildrenOfPath(t,e){var r,i=[];for(r of await(0,promises_1.readdir)(t,{withFileTypes:!0}))("file"!==e||r.isDirectory())&&("folder"!==e||r.isDirectory())&&e||i.push(r.name);return i}}exports.default=FileService;
|
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.
|
|
4
|
+
"version": "1.1.12",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./lib/index.js",
|
|
7
7
|
"types": "./lib/index.d.ts",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"chokidar": "^5.0.0",
|
|
31
31
|
"commander": "^11.0.0",
|
|
32
32
|
"connect": "^3.7.0",
|
|
33
|
+
"esbuild": "^0.23.0",
|
|
33
34
|
"glob": "^13.0.0",
|
|
34
35
|
"lodash": "^4.17.21",
|
|
35
36
|
"prettier": "^3.8.1",
|