@digital-herd/content-hub-cli 1.0.1 → 1.0.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.
Files changed (36) hide show
  1. package/README.md +52 -0
  2. package/lib/index.d.ts +1 -0
  3. package/lib/index.js +1 -1
  4. package/lib/modules/external-components/services/TypeCheckService.js +1 -1
  5. package/lib/modules/index.js +1 -1
  6. package/lib/modules/manual-patches/commands/createPatchComponent.d.ts +2 -0
  7. package/lib/modules/manual-patches/commands/createPatchComponent.js +1 -0
  8. package/lib/modules/manual-patches/commands/runPatch.d.ts +2 -0
  9. package/lib/modules/manual-patches/commands/runPatch.js +1 -0
  10. package/lib/modules/manual-patches/index.d.ts +4 -0
  11. package/lib/modules/manual-patches/index.js +1 -0
  12. package/lib/modules/manual-patches/services/CreatePatchService.d.ts +10 -0
  13. package/lib/modules/manual-patches/services/CreatePatchService.js +10 -0
  14. package/lib/modules/manual-patches/services/RunPatchService.d.ts +23 -0
  15. package/lib/modules/manual-patches/services/RunPatchService.js +1 -0
  16. package/lib/modules/patches/commands/createPatchComponent.d.ts +2 -0
  17. package/lib/modules/patches/commands/createPatchComponent.js +1 -0
  18. package/lib/modules/patches/commands/runPatch.d.ts +2 -0
  19. package/lib/modules/patches/commands/runPatch.js +1 -0
  20. package/lib/modules/patches/index.d.ts +4 -0
  21. package/lib/modules/patches/index.js +1 -0
  22. package/lib/modules/patches/services/CreatePatchService.d.ts +10 -0
  23. package/lib/modules/patches/services/CreatePatchService.js +10 -0
  24. package/lib/modules/patches/services/RunPatchService.d.ts +23 -0
  25. package/lib/modules/patches/services/RunPatchService.js +1 -0
  26. package/lib/modules/scripts/index.js +1 -1
  27. package/lib/modules/scripts/services/CreateScriptService.js +1 -1
  28. package/lib/modules/scripts/services/SyncScriptService.d.ts +0 -1
  29. package/lib/modules/scripts/services/SyncScriptService.js +1 -1
  30. package/lib/modules/setup/services/ExternalComponentConfigService.js +2 -2
  31. package/lib/services/ContenthubService.js +1 -1
  32. package/lib/services/FileService.js +1 -1
  33. package/lib/types/ContentHubConfig.interface.d.ts +1 -0
  34. package/lib/types/Patch.interface.d.ts +4 -0
  35. package/lib/types/Patch.interface.js +1 -0
  36. package/package.json +1 -1
package/README.md CHANGED
@@ -8,6 +8,8 @@
8
8
  |---------|-------------|
9
9
  | `create-component` | Create a new React component from template |
10
10
  | `create-script` | Create a new C# script with API auto-fetch |
11
+ | `create-manual-patch` | Create a new manual patch from template |
12
+ | `run-manual-patch` | Run a manual patch on ContentHub |
11
13
  | `build` | Build external components for production |
12
14
  | `watch` | Watch and serve components with HMR |
13
15
  | `publish-script` | Publish scripts to ContentHub environment |
@@ -255,6 +257,56 @@ content-hub-tools <command> [options]
255
257
  content-hub-tools sync-scripts -e local
256
258
  ```
257
259
 
260
+ - **create-manual-patch** — Create a new manual patch from template (interactive)
261
+
262
+ This command will interactively prompt you to provide a patch name and create a TypeScript patch file that can be used to run one-off data migrations or fixes.
263
+
264
+ Examples:
265
+
266
+ - Create a new patch (interactive prompts):
267
+ ```bash
268
+ content-hub-tools create-manual-patch
269
+ ```
270
+
271
+ The interactive prompts will guide you through:
272
+ - **Patch name**: Enter a PascalCase name (e.g., `FixUserIssue`, `MigrateData`)
273
+ - Only letters are allowed in the name
274
+ - The name will be automatically converted to PascalCase if needed
275
+
276
+ After running, the patch will be created at:
277
+ ```
278
+ patches/<PatchName>.patch.ts
279
+ ```
280
+
281
+ The generated patch file will contain:
282
+ - `PatchParams` interface with ContentHub client
283
+ - `runPatch<Name>` function ready for implementation
284
+
285
+ - **run-manual-patch** — Run a manual patch on ContentHub (interactive)
286
+
287
+ This command will display all available patches sorted by last modified date (newest first) and execute the selected patch.
288
+
289
+ Examples:
290
+
291
+ - Run a patch (interactive selection):
292
+ ```bash
293
+ content-hub-tools run-manual-patch -e staging
294
+ ```
295
+
296
+ - Run a patch on production:
297
+ ```bash
298
+ content-hub-tools run-manual-patch -e production
299
+ ```
300
+
301
+ The interactive prompt will show:
302
+ - List of all available `.patch.ts` files
303
+ - Last modified timestamp for each patch
304
+ - Patches sorted with newest first
305
+
306
+ The patch will be executed with:
307
+ - Access to the ContentHub client via `PatchParams`
308
+ - Connection to the selected environment
309
+
258
310
  ## Developer notes
259
311
 
260
312
  - The CLI is implemented with `commander` and TypeScript. Entry point: `src/bin.ts`.
package/lib/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./types/ContentHubConfig.interface.js";
2
2
  export * from "./types/ExternalComponentConfig.interface.js";
3
3
  export * from "./types/ScriptConfig.interface.js";
4
+ export * from "./types/Patch.interface.js";
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=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,n,i)}:function(e,t,r,n){e[n=void 0===n?r:n]=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);
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=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,i,n)}:function(e,t,r,i){e[i=void 0===i?r:i]=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);
@@ -1 +1 @@
1
- var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let tempDirectory_1=require("../../../config/tempDirectory"),FileService_1=__importDefault(require("../../../services/FileService")),logger_1=__importDefault(require("../../../utils/logger")),child_process_1=require("child_process"),fs_1=require("fs"),path_1=__importDefault(require("path"));class TypeCheckService{tsconfigPath;fileService;constructor(e,t){this.tsconfigPath=path_1.default.resolve(process.cwd(),t||"tsconfig.json"),this.fileService=new FileService_1.default(e)}all(){logger_1.default.info("Running TypeScript type check");try{(0,child_process_1.execSync)("npx tsc --noEmit --project "+this.tsconfigPath,{stdio:"inherit"}),logger_1.default.info("TypeScript type check passed")}catch(e){logger_1.default.error("TypeScript type check failed"),process.exit(-1)}}specificComponents(e){var e=Array.isArray(e)?e:[e],t=process.cwd()+"/"+tempDirectory_1.GLOBAL_TEMP_DIRECTORY,t=((0,fs_1.existsSync)(t)||(0,fs_1.mkdirSync)(t,{recursive:!0}),path_1.default.join(t,process.pid+".tsconfig.tmp.json")),e=(console.log(this.tsconfigPath),{extends:this.tsconfigPath,include:e.map(e=>"../"+this.fileService.getDirectoryOfComponent(e))});(0,fs_1.writeFileSync)(t,JSON.stringify(e,null,2)),logger_1.default.info("Running TypeScript type check");try{(0,child_process_1.execSync)("npx tsc --noEmit --project "+t,{stdio:"inherit"}),(0,fs_1.unlinkSync)(t),logger_1.default.info("TypeScript type check passed")}catch(e){logger_1.default.error("TypeScript type check failed"),(0,fs_1.unlinkSync)(t),process.exit(-1)}}}exports.default=TypeCheckService;
1
+ var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});let tempDirectory_1=require("../../../config/tempDirectory"),FileService_1=__importDefault(require("../../../services/FileService")),logger_1=__importDefault(require("../../../utils/logger")),child_process_1=require("child_process"),fs_1=require("fs"),path_1=__importDefault(require("path"));class TypeCheckService{tsconfigPath;fileService;constructor(e,t){this.tsconfigPath=path_1.default.resolve(process.cwd(),t||"tsconfig.json"),this.fileService=new FileService_1.default(e)}all(){logger_1.default.info("Running TypeScript type check");try{(0,child_process_1.execSync)("npx tsc --noEmit --project "+this.tsconfigPath,{stdio:"inherit"}),logger_1.default.info("TypeScript type check passed")}catch(e){logger_1.default.error("TypeScript type check failed"),process.exit(-1)}}specificComponents(e){var e=Array.isArray(e)?e:[e],t=process.cwd()+"/"+tempDirectory_1.GLOBAL_TEMP_DIRECTORY,t=((0,fs_1.existsSync)(t)||(0,fs_1.mkdirSync)(t,{recursive:!0}),path_1.default.join(t,process.pid+".tsconfig.tmp.json")),e={extends:this.tsconfigPath,include:e.map(e=>"../"+this.fileService.getDirectoryOfComponent(e))};(0,fs_1.writeFileSync)(t,JSON.stringify(e,null,2)),logger_1.default.info("Running TypeScript type check");try{(0,child_process_1.execSync)("npx tsc --noEmit --project "+t,{stdio:"inherit"}),(0,fs_1.unlinkSync)(t),logger_1.default.info("TypeScript type check passed")}catch(e){logger_1.default.error("TypeScript type check failed"),(0,fs_1.unlinkSync)(t),process.exit(-1)}}}exports.default=TypeCheckService;
@@ -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"));exports.default=[external_components_1.default,scripts_1.default];
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];
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const createPatchCommand: Command;
@@ -0,0 +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 e=>{e=(await(0,globalCommandConfig_js_1.globalCommandConfig)(e)).config,e=new CreatePatchService_js_1.default(e);try{var t=(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 e.createPatch(t)}catch(e){e instanceof Error&&logger_js_1.default.error("Failed to create patch: "+e.message),process.exit(1)}});
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const runPatchCommand: Command;
@@ -0,0 +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:e,contenthubService:a}=await(0,globalCommandConfig_js_1.globalCommandConfig)(e),a=new RunPatchService_js_1.default(a,e);try{var r=a.getAvailablePatches(),t=(0===r.length&&(logger_js_1.default.error("No patches found in the patch directory"),process.exit(1)),await(0,prompts_1.select)({message:"Select a patch to run:",choices:r.map(e=>({name:`${e.name} (modified: ${e.modifiedTime.toLocaleString()})`,value:e.name}))}));await a.runPatch(t)}catch(e){e instanceof Error&&logger_js_1.default.error("Failed to run patch: "+e.message),process.exit(1)}});
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ commands: import("commander").Command[];
3
+ };
4
+ export default _default;
@@ -0,0 +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]};
@@ -0,0 +1,10 @@
1
+ import { ContenthubConfig } from "../../../types/ContentHubConfig.interface.js";
2
+ export default class CreatePatchService {
3
+ private config;
4
+ private patchDir;
5
+ constructor(config: ContenthubConfig);
6
+ /**
7
+ * Create a new patch file from template
8
+ */
9
+ createPatch(patchName: string): Promise<void>;
10
+ }
@@ -0,0 +1,10 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(e,r);i&&("get"in i?e.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,a,i)}:function(t,e,r,a){t[a=void 0===a?r:a]=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 i=function(t){return(i=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=i(t),a=0;a<r.length;a++)"default"!==r[a]&&__createBinding(e,t,r[a]);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")),logger_js_1=__importDefault(require("../../../utils/logger.js"));class CreatePatchService{config;patchDir;constructor(t){this.config=t,this.patchDir=path.resolve(process.cwd(),t.patchDir)}async createPatch(t){var t=t.charAt(0).toUpperCase()+t.slice(1),e=t.charAt(0).toLowerCase()+t.slice(1),e=(fs.existsSync(this.patchDir)||fs.mkdirSync(this.patchDir,{recursive:!0}),path.join(this.patchDir,e+".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}"...`);var r=`import { PatchParams } from "@digital-herd/content-hub-cli";
2
+
3
+
4
+
5
+ const runPatch${t} = ({ client }: PatchParams) => {
6
+ // run patch
7
+ };
8
+
9
+ export default runPatch${t};
10
+ `;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,23 @@
1
+ import { ContenthubConfig } from "../../../types/ContentHubConfig.interface.js";
2
+ import ContenthubService from "../../../services/ContenthubService.js";
3
+ interface PatchFile {
4
+ name: string;
5
+ path: string;
6
+ modifiedTime: Date;
7
+ }
8
+ export default class RunPatchService {
9
+ private contenthubService;
10
+ private config;
11
+ private patchDir;
12
+ private fileService;
13
+ constructor(contenthubService: ContenthubService, config: ContenthubConfig);
14
+ /**
15
+ * Get all available patch files sorted by last modified (newest first)
16
+ */
17
+ getAvailablePatches(): PatchFile[];
18
+ /**
19
+ * Execute a specific patch
20
+ */
21
+ runPatch(patchName: string): Promise<void>;
22
+ }
23
+ export {};
@@ -0,0 +1 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&("get"in a?t.__esModule:!a.writable&&!a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,a)}: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 a=function(e){return(a=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=a(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 fs=__importStar(require("fs")),path=__importStar(require("path")),logger_js_1=__importDefault(require("../../../utils/logger.js")),FileService_js_1=__importDefault(require("../../../services/FileService.js"));class RunPatchService{contenthubService;config;patchDir;fileService;constructor(e,t){this.contenthubService=e,this.config=t,this.patchDir=path.resolve(process.cwd(),t.patchDir),this.fileService=new FileService_js_1.default(t)}getAvailablePatches(){return fs.existsSync(this.patchDir)?fs.readdirSync(this.patchDir).filter(e=>e.endsWith(".patch.ts")).map(e=>{var t=path.join(this.patchDir,e),r=fs.statSync(t);return{name:e.replace(".patch.ts",""),path:t,modifiedTime:r.mtime}}).sort((e,t)=>t.modifiedTime.getTime()-e.modifiedTime.getTime()):(logger_js_1.default.warn("Patch directory not found: "+this.patchDir),[])}async runPatch(t){var e=path.join(this.patchDir,t+".patch.ts");if(!fs.existsSync(e))throw logger_js_1.default.error(`Patch "${t}" not found at `+e),new Error("Patch not found");logger_js_1.default.info(`🚀 Running patch "${t}"...`);try{var r=await this.fileService.tsFileImport(e);if("function"!=typeof r)throw new Error(`Patch "${t}" does not export a default function`);await r({client:this.contenthubService.client}),logger_js_1.default.info(`✅ Patch "${t}" completed successfully!`)}catch(e){throw logger_js_1.default.error(`Failed to run patch "${t}":`,e),e}}}exports.default=RunPatchService;
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const createPatchCommand: Command;
@@ -0,0 +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-patch").description("Create a new patch from template").action(async e=>{e=(await(0,globalCommandConfig_js_1.globalCommandConfig)(e)).config,e=new CreatePatchService_js_1.default(e);try{var t=(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 e.createPatch(t)}catch(e){e instanceof Error&&logger_js_1.default.error("Failed to create patch: "+e.message),process.exit(1)}});
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const runPatchCommand: Command;
@@ -0,0 +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-patch")).description("Run a patch").action(async e=>{var{config:e,contenthubService:a}=await(0,globalCommandConfig_js_1.globalCommandConfig)(e),a=new RunPatchService_js_1.default(a,e);try{var r=a.getAvailablePatches(),t=(0===r.length&&(logger_js_1.default.error("No patches found in the patch directory"),process.exit(1)),await(0,prompts_1.select)({message:"Select a patch to run:",choices:r.map(e=>({name:`${e.name} (modified: ${e.modifiedTime.toLocaleString()})`,value:e.name}))}));await a.runPatch(t)}catch(e){e instanceof Error&&logger_js_1.default.error("Failed to run patch: "+e.message),process.exit(1)}});
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ commands: import("commander").Command[];
3
+ };
4
+ export default _default;
@@ -0,0 +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]};
@@ -0,0 +1,10 @@
1
+ import { ContenthubConfig } from "../../../types/ContentHubConfig.interface.js";
2
+ export default class CreatePatchService {
3
+ private config;
4
+ private patchDir;
5
+ constructor(config: ContenthubConfig);
6
+ /**
7
+ * Create a new patch file from template
8
+ */
9
+ createPatch(patchName: string): Promise<void>;
10
+ }
@@ -0,0 +1,10 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(e,r);i&&("get"in i?e.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,a,i)}:function(t,e,r,a){t[a=void 0===a?r:a]=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 i=function(t){return(i=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=i(t),a=0;a<r.length;a++)"default"!==r[a]&&__createBinding(e,t,r[a]);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")),logger_js_1=__importDefault(require("../../../utils/logger.js"));class CreatePatchService{config;patchDir;constructor(t){this.config=t,this.patchDir=path.resolve(process.cwd(),t.patchDir)}async createPatch(t){var t=t.charAt(0).toUpperCase()+t.slice(1),e=t.charAt(0).toLowerCase()+t.slice(1),e=(fs.existsSync(this.patchDir)||fs.mkdirSync(this.patchDir,{recursive:!0}),path.join(this.patchDir,e+".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}"...`);var r=`import { PatchParams } from "@digital-herd/content-hub-cli";
2
+
3
+
4
+
5
+ const runPatch${t} = ({ client }: PatchParams) => {
6
+ // run patch
7
+ };
8
+
9
+ export default runPatch${t};
10
+ `;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,23 @@
1
+ import { ContenthubConfig } from "../../../types/ContentHubConfig.interface.js";
2
+ import ContenthubService from "../../../services/ContenthubService.js";
3
+ interface PatchFile {
4
+ name: string;
5
+ path: string;
6
+ modifiedTime: Date;
7
+ }
8
+ export default class RunPatchService {
9
+ private contenthubService;
10
+ private config;
11
+ private patchDir;
12
+ private fileService;
13
+ constructor(contenthubService: ContenthubService, config: ContenthubConfig);
14
+ /**
15
+ * Get all available patch files sorted by last modified (newest first)
16
+ */
17
+ getAvailablePatches(): PatchFile[];
18
+ /**
19
+ * Execute a specific patch
20
+ */
21
+ runPatch(patchName: string): Promise<void>;
22
+ }
23
+ export {};
@@ -0,0 +1 @@
1
+ var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&("get"in a?t.__esModule:!a.writable&&!a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,a)}: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 a=function(e){return(a=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=a(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 fs=__importStar(require("fs")),path=__importStar(require("path")),logger_js_1=__importDefault(require("../../../utils/logger.js")),FileService_js_1=__importDefault(require("../../../services/FileService.js"));class RunPatchService{contenthubService;config;patchDir;fileService;constructor(e,t){this.contenthubService=e,this.config=t,this.patchDir=path.resolve(process.cwd(),t.patchDir),this.fileService=new FileService_js_1.default(t)}getAvailablePatches(){return fs.existsSync(this.patchDir)?fs.readdirSync(this.patchDir).filter(e=>e.endsWith(".patch.ts")).map(e=>{var t=path.join(this.patchDir,e),r=fs.statSync(t);return{name:e.replace(".patch.ts",""),path:t,modifiedTime:r.mtime}}).sort((e,t)=>t.modifiedTime.getTime()-e.modifiedTime.getTime()):(logger_js_1.default.warn("Patch directory not found: "+this.patchDir),[])}async runPatch(t){var e=path.join(this.patchDir,t+".patch.ts");if(!fs.existsSync(e))throw logger_js_1.default.error(`Patch "${t}" not found at `+e),new Error("Patch not found");logger_js_1.default.info(`🚀 Running patch "${t}"...`);try{var r=await this.fileService.tsFileImport(e);if("function"!=typeof r)throw new Error(`Patch "${t}" does not export a default function`);await r({client:this.contenthubService.client}),logger_js_1.default.info(`✅ Patch "${t}" completed successfully!`)}catch(e){throw logger_js_1.default.error(`Failed to run patch "${t}":`,e),e}}}exports.default=RunPatchService;
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0});let PublishScriptCommand_1=require("./commands/PublishScriptCommand"),CreateScriptCommand_1=require("./commands/CreateScriptCommand");exports.default={commands:[PublishScriptCommand_1.publishScriptCommand,CreateScriptCommand_1.createScriptCommand]};
1
+ Object.defineProperty(exports,"__esModule",{value:!0});let PublishScriptCommand_1=require("./commands/PublishScriptCommand"),SyncScriptsFromEnvironmentCommand_1=require("./commands/SyncScriptsFromEnvironmentCommand"),CreateScriptCommand_1=require("./commands/CreateScriptCommand");exports.default={commands:[PublishScriptCommand_1.publishScriptCommand,CreateScriptCommand_1.createScriptCommand,SyncScriptsFromEnvironmentCommand_1.syncScriptsFromEnvironmentCommand]};
@@ -1,4 +1,4 @@
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 fs=__importStar(require("fs")),path=__importStar(require("path")),logger_js_1=__importDefault(require("../../../utils/logger.js")),sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),apiCatch_js_1=require("../../../utils/apiCatch.js"),script_js_1=require("../utils/script.js");class CreateScriptService{contenthubService;config;templateDir;scriptsDir;constructor(e,t){this.contenthubService=e,this.config=t,this.templateDir=t.templates.script,this.scriptsDir=path.resolve(process.cwd(),t.scriptDir)}async fetchScriptDefaults(t){try{var e=await(0,apiCatch_js_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getAsync(t,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption(["M.Script.Name","M.Script.Description","M.Script.ExecuteAsUser","M.Script.Type"]))));return e?{identifier:e.identifier,type:e.getPropertyValue("M.Script.Type")||"Action",title:e.getPropertyValue("M.Script.Name")||"",description:e.getPropertyValue("M.Script.Description")||"",executeAsUser:e.getPropertyValue("M.Script.ExecuteAsUser")||!1}:null}catch(e){return logger_js_1.default.warn("⚠️ Could not fetch script from API: "+t),null}}async createScript(r){if(!fs.existsSync(this.templateDir))throw logger_js_1.default.error("Template directory not found: "+this.templateDir),new Error("Template directory not found");var i,c=(0,script_js_1.scriptNameToSlug)(r.title),s=path.join(this.scriptsDir,c);if(fs.existsSync(s))throw logger_js_1.default.error(`Script "${c}" already exists`),new Error("Script already exists");logger_js_1.default.info(`📦 Creating script "${c}"...`),fs.mkdirSync(s,{recursive:!0});for(i of fs.readdirSync(this.templateDir)){var n=path.join(this.templateDir,i);let e=i;"<ScriptName>.config.ts"===i?e=c+".config.ts":"<ScriptName>.cs"===i&&(e=c+".cs");var o=path.join(s,e);let t=fs.readFileSync(n,"utf-8");"<ScriptName>.config.ts"===i&&(t=`import { type ActionScriptConfig } from "@nestle/contenthub-cli";
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 fs=__importStar(require("fs")),path=__importStar(require("path")),logger_js_1=__importDefault(require("../../../utils/logger.js")),sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),apiCatch_js_1=require("../../../utils/apiCatch.js"),script_js_1=require("../utils/script.js");class CreateScriptService{contenthubService;config;templateDir;scriptsDir;constructor(e,t){this.contenthubService=e,this.config=t,this.templateDir=t.templates.script,this.scriptsDir=path.resolve(process.cwd(),t.scriptDir)}async fetchScriptDefaults(t){try{var e=await(0,apiCatch_js_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getAsync(t,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption(["M.Script.Name","M.Script.Description","M.Script.ExecuteAsUser","M.Script.Type"]))));return e?{identifier:e.identifier,type:e.getPropertyValue("M.Script.Type")||"Action",title:e.getPropertyValue("M.Script.Name")||"",description:e.getPropertyValue("M.Script.Description")||"",executeAsUser:e.getPropertyValue("M.Script.ExecuteAsUser")||!1}:null}catch(e){return logger_js_1.default.warn("⚠️ Could not fetch script from API: "+t),null}}async createScript(r){if(!fs.existsSync(this.templateDir))throw logger_js_1.default.error("Template directory not found: "+this.templateDir),new Error("Template directory not found");var i,c=(0,script_js_1.scriptNameToSlug)(r.title),s=path.join(this.scriptsDir,c);if(fs.existsSync(s))throw logger_js_1.default.error(`Script "${c}" already exists`),new Error("Script already exists");logger_js_1.default.info(`📦 Creating script "${c}"...`),fs.mkdirSync(s,{recursive:!0});for(i of fs.readdirSync(this.templateDir)){var n=path.join(this.templateDir,i);let e=i;"<ScriptName>.config.ts"===i?e=c+".config.ts":"<ScriptName>.cs"===i&&(e=c+".cs");var o=path.join(s,e);let t=fs.readFileSync(n,"utf-8");"<ScriptName>.config.ts"===i&&(t=`import { type ActionScriptConfig } from "@digital-herd/content-hub-cli";
2
2
 
3
3
  export default {
4
4
  identifier: "${r.identifier}",
@@ -4,7 +4,6 @@ import FileService from "../../../services/FileService";
4
4
  declare class SyncScriptService {
5
5
  contenthubService: ContenthubService;
6
6
  config: ContenthubConfig;
7
- static IgnoreUserScriptsOnSyncAll: string[];
8
7
  fileService: FileService;
9
8
  constructor(contenthubService: ContenthubService, config: ContenthubConfig);
10
9
  syncAllScripts(): Promise<void>;
@@ -1 +1 @@
1
- var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0});let array_1=require("../../../utils/array"),apiCatch_1=require("../../../utils/apiCatch"),sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),FileService_1=__importDefault(require("../../../services/FileService")),script_js_1=require("../utils/script.js"),scriptLoadConfig=new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption(["M.Script.Name","M.Script.Enabled","M.Script.ExecuteAsUser","M.Script.Description","M.Script.Type"]),new sc_contenthub_webclient_sdk_1.RelationLoadOption(["ScriptToActiveScriptContent","ScriptToDraftScriptContent"]));class SyncScriptService{contenthubService;config;static IgnoreUserScriptsOnSyncAll=["@sitecore","Administrator","Jeroen Feyaerts","Evgeni Ivakhnov"];fileService;constructor(t,e){this.contenthubService=t,this.config=e,this.fileService=new FileService_1.default(e)}async syncAllScripts(){var t=await this.loadAllScripts();await this.syncScripts(t)}async syncScripts(t,e=0){var i=Array.isArray(t)?t:[t],t=i.flatMap(t=>{var e=t.getRelation("ScriptToActiveScriptContent")?.getIds();return e?.length?e||[]:t.getRelation("ScriptToDraftScriptContent")?.getIds()||[]}),r=await Promise.all((0,array_1.arrayToChunks)(t,50).map(t=>(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(t,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption("M.ScriptContent.Script")))))).then(t=>t.flat());for(let t of i){let e=t.getRelation("ScriptToActiveScriptContent")?.getIds()[0];var n=r.find(t=>t.id===e);n&&await this.syncScriptInFolder(t,n)}}async syncScriptInFolder(t,e){var i=t.getPropertyValue("M.Script.Name"),r=(0,script_js_1.scriptNameToSlug)(i),n=this.fileService.getScriptConfig(i);let c={identifier:t.identifier,type:t.getPropertyValue("M.Script.Type"),title:i,description:t.getPropertyValue("M.Script.Description")||"",executeAsUser:t.getPropertyValue("M.Script.ExecuteAsUser")||!1};if(n){let t=await this.fileService.tsFileImport(n);if(c.identifier!==t.identifier)throw new Error("Identifier in local folder does not match with environment");c=t}await this.fileService.writeScript(r,e.getPropertyValue("M.ScriptContent.Script"),c)}async loadAllScripts(){for(var t=await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getByDefinitionAsync("M.Script",scriptLoadConfig,0,100)),e=[...t.items],i=t.createIterator();i.canMoveNext();)await i.moveNextAsync(),e.push(...i.current?.items||[]);t=e.flatMap(t=>[t.createdBy,t.modifiedBy]),t=[...new Set(t)];let r=(await Promise.all((0,array_1.arrayToChunks)(t,50).map(t=>(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(t,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption("Username")))))).then(t=>t.flat())).filter(e=>!SyncScriptService.IgnoreUserScriptsOnSyncAll.some(t=>e.getPropertyValue("Username").includes(t))).map(t=>t.id);return e.filter(t=>r.includes(t.createdBy)||r.includes(t.modifiedBy))}}exports.default=SyncScriptService;
1
+ var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0});let array_1=require("../../../utils/array"),apiCatch_1=require("../../../utils/apiCatch"),sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),FileService_1=__importDefault(require("../../../services/FileService")),script_js_1=require("../utils/script.js"),logger_1=__importDefault(require("../../../utils/logger")),scriptLoadConfig=new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption(["M.Script.Name","M.Script.Enabled","M.Script.ExecuteAsUser","M.Script.Description","M.Script.Type"]),new sc_contenthub_webclient_sdk_1.RelationLoadOption(["ScriptToActiveScriptContent","ScriptToDraftScriptContent"]));class SyncScriptService{contenthubService;config;fileService;constructor(t,e){this.contenthubService=t,this.config=e,this.fileService=new FileService_1.default(e)}async syncAllScripts(){var t=await this.loadAllScripts();await this.syncScripts(t)}async syncScripts(t){var e=Array.isArray(t)?t:[t],t=e.flatMap(t=>{var e=t.getRelation("ScriptToActiveScriptContent")?.getIds();return e?.length?e||[]:t.getRelation("ScriptToDraftScriptContent")?.getIds()||[]}),i=await Promise.all((0,array_1.arrayToChunks)(t,50).map(t=>(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(t,new sc_contenthub_webclient_sdk_1.EntityLoadConfiguration(sc_contenthub_webclient_sdk_1.CultureLoadOption.Default,new sc_contenthub_webclient_sdk_1.PropertyLoadOption("M.ScriptContent.Script")))))).then(t=>t.flat());for(let t of e){let e=t.getRelation("ScriptToActiveScriptContent")?.getIds()[0];var r=i.find(t=>t.id===e);r&&await this.syncScriptInFolder(t,r)}}async syncScriptInFolder(t,e){var i=t.getPropertyValue("M.Script.Name"),r=(0,script_js_1.scriptNameToSlug)(i),c=this.fileService.getScriptConfig(i);let n={identifier:t.identifier,type:t.getPropertyValue("M.Script.Type"),title:i,description:t.getPropertyValue("M.Script.Description")||"",executeAsUser:t.getPropertyValue("M.Script.ExecuteAsUser")||!1};if(c){let t=await this.fileService.tsFileImport(c);if(n.identifier!==t.identifier)throw new Error("Identifier in local folder does not match with environment");n=t}await this.fileService.writeScript(r,e.getPropertyValue("M.ScriptContent.Script"),n)}async loadAllScripts(){logger_1.default.info("Load all scripts");for(var t=await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getByDefinitionAsync("M.Script",scriptLoadConfig,0,100)),e=[...t.items],i=t.createIterator();i.canMoveNext();)await i.moveNextAsync(),e.push(...i.current?.items||[]);return logger_1.default.info("All scripts loaded"),e}}exports.default=SyncScriptService;
@@ -1,5 +1,5 @@
1
- var __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")),fs_1=require("fs"),lodash_1=require("lodash"),apiCatch_1=require("../../../utils/apiCatch");class ExternalComponentConfigService{contenthubService;externalComponentsService;constructor(e,t){this.contenthubService=e,this.externalComponentsService=new FileService_1.default(t)}async syncConfigAsset(e,t){let n=t.getRelation("AssetToPageComponent")?.getIds()||[];t=(await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(n,sc_contenthub_webclient_sdk_1.EntityLoadConfiguration.Full))).reduce((e,t)=>{let n=t.getPropertyValue("PageComponent.Settings").config;var i=e.find(e=>(0,lodash_1.isEqual)(e.config,n));return i?i.pageComponentIdentifiers.push(t.identifier):e.push({pageComponentIdentifiers:[t.identifier],config:n}),e},[]);this.writeConfigFile(e,{components:t})}writeConfigFile(e,t){var n=this.externalComponentsService.getDirectoryOfComponent(e);(0,fs_1.writeFileSync)(n+`/${e}.config.ts`,`
2
- import { type ExternalComponentConfig } from "@nestle/contenthub-cli";
1
+ var __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")),fs_1=require("fs"),lodash_1=require("lodash"),apiCatch_1=require("../../../utils/apiCatch");class ExternalComponentConfigService{contenthubService;externalComponentsService;constructor(e,t){this.contenthubService=e,this.externalComponentsService=new FileService_1.default(t)}async syncConfigAsset(e,t){let i=t.getRelation("AssetToPageComponent")?.getIds()||[];t=(await(0,apiCatch_1.apiErrorCatch)(()=>this.contenthubService.client.entities.getManyAsync(i,sc_contenthub_webclient_sdk_1.EntityLoadConfiguration.Full))).reduce((e,t)=>{let i=t.getPropertyValue("PageComponent.Settings").config;var n=e.find(e=>(0,lodash_1.isEqual)(e.config,i));return n?n.pageComponentIdentifiers.push(t.identifier):e.push({pageComponentIdentifiers:[t.identifier],config:i}),e},[]);this.writeConfigFile(e,{components:t})}writeConfigFile(e,t){var i=this.externalComponentsService.getDirectoryOfComponent(e);(0,fs_1.writeFileSync)(i+`/${e}.config.ts`,`
2
+ import { type ExternalComponentConfig } from "@digital-herd/content-hub-cli";
3
3
 
4
4
  export default ${JSON.stringify(t)} as ExternalComponentConfig;
5
5
 
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0});let sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),apiCatch_js_1=require("../utils/apiCatch.js");class ContenthubService{client;entityIdMapping=new Map;constructor(t,e){if(!e||!e.length)throw new Error("Api Token is invalid");this.client=new sc_contenthub_webclient_sdk_1.ContentHubClient(t),this.client.internalClient.setRequestHeaders({"x-auth-token":e})}async validateClient(){if(!await(0,apiCatch_js_1.apiErrorCatch)(()=>this.client.internalClient.authenticateAsync()))throw Error("Authentication failed")}async getOrFetchId(t){if(this.entityIdMapping.has(t))return this.entityIdMapping.get(t);var e=await(0,apiCatch_js_1.apiErrorCatch)(()=>this.client.entities.getAsync(t,sc_contenthub_webclient_sdk_1.EntityLoadConfiguration.Minimal));if(e)return this.entityIdMapping.set(t,e.id),e.id;throw new Error(t+" does not exist")}}exports.default=ContenthubService;
1
+ var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0});let sc_contenthub_webclient_sdk_1=require("@sitecore/sc-contenthub-webclient-sdk"),apiCatch_js_1=require("../utils/apiCatch.js"),logger_js_1=__importDefault(require("../utils/logger.js"));class ContenthubService{client;entityIdMapping=new Map;constructor(t,e){e&&e.length||(logger_js_1.default.error("Api token is invalid"),process.exit(-1)),logger_js_1.default.info("Contenthub endpoint: "+t),this.client=new sc_contenthub_webclient_sdk_1.ContentHubClient(t),this.client.internalClient.setRequestHeaders({"x-auth-token":e})}async validateClient(){await(0,apiCatch_js_1.apiErrorCatch)(()=>this.client.internalClient.authenticateAsync())||(logger_js_1.default.error("Authentication failed with endpoint + api token"),process.exit(-1))}async getOrFetchId(t){if(this.entityIdMapping.has(t))return this.entityIdMapping.get(t);var e=await(0,apiCatch_js_1.apiErrorCatch)(()=>this.client.entities.getAsync(t,sc_contenthub_webclient_sdk_1.EntityLoadConfiguration.Minimal));if(e)return this.entityIdMapping.set(t,e.id),e.id;throw new Error(t+" does not exist")}}exports.default=ContenthubService;
@@ -1,5 +1,5 @@
1
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")),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("/");return t[t.length-2]})}getDirectoryOfComponent(t){var t=(0,glob_1.sync)(this.config.componentDir+`/**/${t}/*.tsx`)[0];return t?((t=t.split("/")).pop(),t.join("/")):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){t=this.getAbsolutePath(t);return(await(0,api_1.tsImport)(t,t)).default}async writeScript(t,e,i){var r=this.config.scriptDir+"/"+t,n=((0,fs_1.existsSync)(r)||(0,fs_1.mkdirSync)(r,{recursive:!0}),r+`/${t}.config.ts`);(0,fs_1.writeFileSync)(n,`
2
- import { type ActionScriptConfig } from "@nestle/contenthub-cli";
2
+ import { type ActionScriptConfig } from "@digital-herd/content-hub-cli";
3
3
  export default {
4
4
  identifier: "${i.identifier}",
5
5
  type: "${i.type}",
@@ -6,6 +6,7 @@ export interface ContenthubEnvironment {
6
6
  export interface ContenthubConfig {
7
7
  componentDir: string;
8
8
  scriptDir: string;
9
+ patchDir: string;
9
10
  port: number;
10
11
  templates: {
11
12
  externalComponent: string;
@@ -0,0 +1,4 @@
1
+ import { ContentHubClient } from "@sitecore/sc-contenthub-webclient-sdk";
2
+ export interface PatchParams {
3
+ client: ContentHubClient;
4
+ }
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,"__esModule",{value:!0});
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.0.1",
4
+ "version": "1.0.3",
5
5
  "type": "commonjs",
6
6
  "main": "./lib/index.js",
7
7
  "types": "./lib/index.d.ts",