contensis-cli 1.6.1-beta.2 → 1.6.1-beta.20

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 (144) hide show
  1. package/dist/index.js +58301 -11
  2. package/dist/index.js.map +4 -4
  3. package/dist/shell.js +58040 -52
  4. package/dist/shell.js.map +4 -4
  5. package/esbuild.config.js +8 -13
  6. package/package.json +3 -2
  7. package/src/commands/create.ts +48 -0
  8. package/src/commands/dev.ts +12 -2
  9. package/src/commands/globalOptions.ts +5 -3
  10. package/src/commands/import.ts +46 -5
  11. package/src/commands/push.ts +8 -1
  12. package/src/commands/set.ts +69 -1
  13. package/src/factories/RequestHandlerFactory.ts +19 -8
  14. package/src/localisation/en-GB.ts +22 -4
  15. package/src/mappers/DevRequests-to-RequestHanderCliArgs.ts +25 -17
  16. package/src/models/CliService.d.ts +5 -1
  17. package/src/providers/GitHubCliModuleProvider.ts +8 -8
  18. package/src/providers/HttpProvider.ts +2 -2
  19. package/src/providers/file-provider.ts +3 -0
  20. package/src/services/ContensisCliService.ts +265 -23
  21. package/src/services/ContensisDevService.ts +99 -35
  22. package/src/shell.ts +7 -1
  23. package/src/util/console.printer.ts +52 -0
  24. package/src/util/logger.ts +3 -4
  25. package/src/util/os.ts +5 -3
  26. package/src/version.ts +1 -1
  27. package/dist/commands/connect.js +0 -44
  28. package/dist/commands/connect.js.map +0 -7
  29. package/dist/commands/copy.js +0 -78
  30. package/dist/commands/copy.js.map +0 -7
  31. package/dist/commands/create.js +0 -170
  32. package/dist/commands/create.js.map +0 -7
  33. package/dist/commands/dev.js +0 -78
  34. package/dist/commands/dev.js.map +0 -7
  35. package/dist/commands/diff.js +0 -57
  36. package/dist/commands/diff.js.map +0 -7
  37. package/dist/commands/execute.js +0 -103
  38. package/dist/commands/execute.js.map +0 -7
  39. package/dist/commands/get.js +0 -330
  40. package/dist/commands/get.js.map +0 -7
  41. package/dist/commands/globalOptions.js +0 -252
  42. package/dist/commands/globalOptions.js.map +0 -7
  43. package/dist/commands/import.js +0 -229
  44. package/dist/commands/import.js.map +0 -7
  45. package/dist/commands/index.js +0 -107
  46. package/dist/commands/index.js.map +0 -7
  47. package/dist/commands/list.js +0 -195
  48. package/dist/commands/list.js.map +0 -7
  49. package/dist/commands/login.js +0 -55
  50. package/dist/commands/login.js.map +0 -7
  51. package/dist/commands/push.js +0 -229
  52. package/dist/commands/push.js.map +0 -7
  53. package/dist/commands/remove.js +0 -193
  54. package/dist/commands/remove.js.map +0 -7
  55. package/dist/commands/set.js +0 -180
  56. package/dist/commands/set.js.map +0 -7
  57. package/dist/commands/update.js +0 -70
  58. package/dist/commands/update.js.map +0 -7
  59. package/dist/factories/RequestHandlerFactory.js +0 -221
  60. package/dist/factories/RequestHandlerFactory.js.map +0 -7
  61. package/dist/localisation/en-GB.js +0 -552
  62. package/dist/localisation/en-GB.js.map +0 -7
  63. package/dist/mappers/ContensisCliService-to-RequestHanderSiteConfigYaml.js +0 -56
  64. package/dist/mappers/ContensisCliService-to-RequestHanderSiteConfigYaml.js.map +0 -7
  65. package/dist/mappers/DevInit-to-CIWorkflow.js +0 -409
  66. package/dist/mappers/DevInit-to-CIWorkflow.js.map +0 -7
  67. package/dist/mappers/DevInit-to-RolePermissions.js +0 -56
  68. package/dist/mappers/DevInit-to-RolePermissions.js.map +0 -7
  69. package/dist/mappers/DevRequests-to-RequestHanderCliArgs.js +0 -161
  70. package/dist/mappers/DevRequests-to-RequestHanderCliArgs.js.map +0 -7
  71. package/dist/mappers/MixedFileData.js +0 -83
  72. package/dist/mappers/MixedFileData.js.map +0 -7
  73. package/dist/models/AppError.d.js +0 -2
  74. package/dist/models/AppError.d.js.map +0 -7
  75. package/dist/models/Cache.d.js +0 -2
  76. package/dist/models/Cache.d.js.map +0 -7
  77. package/dist/models/CliService.d.js +0 -17
  78. package/dist/models/CliService.d.js.map +0 -7
  79. package/dist/models/DevService.d.js +0 -17
  80. package/dist/models/DevService.d.js.map +0 -7
  81. package/dist/models/JsModules.d.js +0 -2
  82. package/dist/models/JsModules.d.js.map +0 -7
  83. package/dist/providers/CredentialProvider.js +0 -126
  84. package/dist/providers/CredentialProvider.js.map +0 -7
  85. package/dist/providers/GitHubCliModuleProvider.js +0 -115
  86. package/dist/providers/GitHubCliModuleProvider.js.map +0 -7
  87. package/dist/providers/HttpProvider.js +0 -73
  88. package/dist/providers/HttpProvider.js.map +0 -7
  89. package/dist/providers/ManifestProvider.js +0 -50
  90. package/dist/providers/ManifestProvider.js.map +0 -7
  91. package/dist/providers/SessionCacheProvider.js +0 -132
  92. package/dist/providers/SessionCacheProvider.js.map +0 -7
  93. package/dist/providers/file-provider.js +0 -174
  94. package/dist/providers/file-provider.js.map +0 -7
  95. package/dist/services/ContensisAuthService.js +0 -88
  96. package/dist/services/ContensisAuthService.js.map +0 -7
  97. package/dist/services/ContensisCliService.js +0 -2598
  98. package/dist/services/ContensisCliService.js.map +0 -7
  99. package/dist/services/ContensisDevService.js +0 -387
  100. package/dist/services/ContensisDevService.js.map +0 -7
  101. package/dist/services/ContensisRoleService.js +0 -112
  102. package/dist/services/ContensisRoleService.js.map +0 -7
  103. package/dist/util/api-ids.js +0 -110
  104. package/dist/util/api-ids.js.map +0 -7
  105. package/dist/util/assert.js +0 -62
  106. package/dist/util/assert.js.map +0 -7
  107. package/dist/util/console.printer.js +0 -425
  108. package/dist/util/console.printer.js.map +0 -7
  109. package/dist/util/csv.formatter.js +0 -118
  110. package/dist/util/csv.formatter.js.map +0 -7
  111. package/dist/util/debug.js +0 -29
  112. package/dist/util/debug.js.map +0 -7
  113. package/dist/util/diff.js +0 -118
  114. package/dist/util/diff.js.map +0 -7
  115. package/dist/util/dotenv.js +0 -56
  116. package/dist/util/dotenv.js.map +0 -7
  117. package/dist/util/error.js +0 -36
  118. package/dist/util/error.js.map +0 -7
  119. package/dist/util/fetch.js +0 -69
  120. package/dist/util/fetch.js.map +0 -7
  121. package/dist/util/find.js +0 -39
  122. package/dist/util/find.js.map +0 -7
  123. package/dist/util/git.js +0 -145
  124. package/dist/util/git.js.map +0 -7
  125. package/dist/util/gitignore.js +0 -61
  126. package/dist/util/gitignore.js.map +0 -7
  127. package/dist/util/html.formatter.js +0 -70
  128. package/dist/util/html.formatter.js.map +0 -7
  129. package/dist/util/index.js +0 -68
  130. package/dist/util/index.js.map +0 -7
  131. package/dist/util/json.formatter.js +0 -66
  132. package/dist/util/json.formatter.js.map +0 -7
  133. package/dist/util/logger.js +0 -304
  134. package/dist/util/logger.js.map +0 -7
  135. package/dist/util/os.js +0 -46
  136. package/dist/util/os.js.map +0 -7
  137. package/dist/util/timers.js +0 -49
  138. package/dist/util/timers.js.map +0 -7
  139. package/dist/util/xml.formatter.js +0 -62
  140. package/dist/util/xml.formatter.js.map +0 -7
  141. package/dist/util/yaml.js +0 -44
  142. package/dist/util/yaml.js.map +0 -7
  143. package/dist/version.js +0 -29
  144. package/dist/version.js.map +0 -7
@@ -93,6 +93,9 @@ export const cwdPath = (filePath: string) =>
93
93
 
94
94
  export const joinPath = path.join;
95
95
 
96
+ export const pathExists = (filePath: string) =>
97
+ fs.existsSync(appPath(filePath));
98
+
96
99
  export const addExecutePermission = (filePath: string) =>
97
100
  // Fails in windows with `TypeError [ERR_INVALID_ARG_TYPE]: The "mode" argument must be of type number. Received undefined`
98
101
  fs.chmodSync(filePath, fs.constants.S_IRWXU);
@@ -8,8 +8,10 @@ import clone from 'rfdc';
8
8
 
9
9
  import { Component, ContentType, Project } from 'contensis-core-api';
10
10
  import {
11
+ ICreateNode,
11
12
  ICreateTag,
12
13
  ICreateTagGroup,
14
+ Node,
13
15
  Role,
14
16
  Tag,
15
17
  TagGroup,
@@ -23,6 +25,7 @@ import {
23
25
  Model,
24
26
  BlockActionType,
25
27
  logEntitiesTable,
28
+ Renderer,
26
29
  } from 'migratortron';
27
30
 
28
31
  import ContensisAuthService from './ContensisAuthService';
@@ -54,6 +57,7 @@ import {
54
57
  printModelMigrationResult,
55
58
  printNodeTreeOutput,
56
59
  printNodesMigrateResult,
60
+ printWebhooksMigrateResult,
57
61
  } from '~/util/console.printer';
58
62
  import { csvFormatter } from '~/util/csv.formatter';
59
63
  import { htmlFormatter } from '~/util/html.formatter';
@@ -93,6 +97,9 @@ class ContensisCli {
93
97
  targetEnv?: string;
94
98
  urls: CliUrls;
95
99
  log = Logger;
100
+ /** Currently used to pass to other modules such as migratortron and request handler
101
+ * and less-so in the CLI service itself */
102
+ logLevel?: 'debug' | 'info' | 'warning' | 'error' | 'none';
96
103
  messages = LogMessages;
97
104
 
98
105
  verb: string;
@@ -156,6 +163,7 @@ class ContensisCli {
156
163
  );
157
164
  }
158
165
 
166
+ this.logLevel = outputOpts?.logLevel;
159
167
  this.format = outputOpts?.format;
160
168
  this.output = outputOpts?.output
161
169
  ? path.isAbsolute(outputOpts.output)
@@ -1833,7 +1841,7 @@ class ContensisCli {
1833
1841
  else
1834
1842
  await this.HandleFormattingAndOutput(result, () => {
1835
1843
  // print the results to console
1836
- if (!result.committed) {
1844
+ if (result && !result?.committed) {
1837
1845
  log.raw(log.boldText(`\nContent types:`));
1838
1846
  if (!result.contentTypes) log.info(`- None returned\n`);
1839
1847
  else printModelMigrationAnalysis(this, result.contentTypes);
@@ -1859,7 +1867,7 @@ class ContensisCli {
1859
1867
  log.object(result.errors);
1860
1868
  }
1861
1869
  } else {
1862
- const { modelsResult = {} } = result;
1870
+ const { modelsResult = {} } = result || {};
1863
1871
  log.raw(log.boldText(`\nContent types:`));
1864
1872
  printModelMigrationResult(
1865
1873
  this,
@@ -2267,8 +2275,8 @@ class ContensisCli {
2267
2275
  });
2268
2276
  if (
2269
2277
  !err &&
2270
- ((!commit && result.entriesToMigrate[currentProject].totalCount) ||
2271
- (commit && result.migrateResult?.deleted))
2278
+ ((!commit && result?.entriesToMigrate[currentProject].totalCount) ||
2279
+ (commit && result?.migrateResult?.deleted))
2272
2280
  ) {
2273
2281
  log.success(messages.entries.removed(currentEnv, commit));
2274
2282
  if (!commit) {
@@ -2357,7 +2365,7 @@ class ContensisCli {
2357
2365
  const [err, result] = await contensis.MigrateEntries();
2358
2366
 
2359
2367
  if (err) logError(err);
2360
- else {
2368
+ else if (result) {
2361
2369
  const { entries, nodes, tags } =
2362
2370
  contensis.content.targets[currentProject];
2363
2371
 
@@ -2394,19 +2402,24 @@ class ContensisCli {
2394
2402
  }
2395
2403
  if (
2396
2404
  !err &&
2397
- !result.errors?.length &&
2398
- ((!commit && result.entriesToMigrate[currentProject].totalCount) ||
2405
+ !result?.errors?.length &&
2406
+ ((!commit && result?.entriesToMigrate[currentProject].totalCount) ||
2399
2407
  (commit &&
2400
- (result.migrateResult?.created || result.migrateResult?.updated)))
2408
+ (result?.migrateResult?.created ||
2409
+ result?.migrateResult?.updated ||
2410
+ result?.nodesResult?.created ||
2411
+ result?.nodesResult?.updated ||
2412
+ result?.tagsResult?.created ||
2413
+ result?.tagsResult?.updated)))
2401
2414
  ) {
2402
2415
  log.success(
2403
2416
  messages.entries.imported(
2404
2417
  currentEnv,
2405
2418
  commit,
2406
2419
  commit
2407
- ? (result.migrateResult?.created || 0) +
2408
- (result.migrateResult?.updated || 0)
2409
- : result.entriesToMigrate[currentProject].totalCount,
2420
+ ? (result?.migrateResult?.created || 0) +
2421
+ (result?.migrateResult?.updated || 0)
2422
+ : result?.entriesToMigrate[currentProject].totalCount,
2410
2423
  commit
2411
2424
  ? (result.nodesResult?.created || 0) +
2412
2425
  (result.nodesResult?.updated || 0)
@@ -2665,7 +2678,7 @@ class ContensisCli {
2665
2678
  const [err, result] = await contensis.MigrateNodes();
2666
2679
 
2667
2680
  if (err) log.raw(``);
2668
- else
2681
+ else if (result)
2669
2682
  await this.HandleFormattingAndOutput(result, () => {
2670
2683
  // print the migrateResult to console
2671
2684
  const migrateTree =
@@ -2688,9 +2701,9 @@ class ContensisCli {
2688
2701
 
2689
2702
  if (
2690
2703
  !err &&
2691
- (!result.errors?.length || this.contensisOpts.ignoreErrors) &&
2704
+ (!result?.errors?.length || this.contensisOpts.ignoreErrors) &&
2692
2705
  ((!commit && nodesMigrateCount) ||
2693
- (commit && (nodesCreated || nodesUpdated || result.errors?.length)))
2706
+ (commit && (nodesCreated || nodesUpdated || result?.errors?.length)))
2694
2707
  ) {
2695
2708
  let totalCount: number;
2696
2709
  if (commit) {
@@ -2751,8 +2764,8 @@ class ContensisCli {
2751
2764
  }
2752
2765
  if (
2753
2766
  !err &&
2754
- ((!commit && result.nodesToMigrate[currentProject].totalCount) ||
2755
- (commit && result.nodesResult?.deleted))
2767
+ ((!commit && result?.nodesToMigrate[currentProject].totalCount) ||
2768
+ (commit && result?.nodesResult?.deleted))
2756
2769
  ) {
2757
2770
  log.success(
2758
2771
  messages.nodes.removed(currentEnv, commit, contensis.nodes.rootPath)
@@ -2769,6 +2782,143 @@ class ContensisCli {
2769
2782
  }
2770
2783
  };
2771
2784
 
2785
+ CreateOrUpdateNode = async (
2786
+ nodePathOrId: string,
2787
+ nodeUpdates: Partial<Node>,
2788
+ displayName?: string | undefined,
2789
+ slug?: string | undefined,
2790
+ language?: string | undefined
2791
+ ) => {
2792
+ const { currentEnv, currentProject, log, messages } = this;
2793
+ const contensis = await this.ConnectContensis();
2794
+
2795
+ const nodePath = nodePathOrId.startsWith('/') ? nodePathOrId : undefined;
2796
+ let nodeId = isUuid(nodePathOrId) ? nodePathOrId : undefined;
2797
+
2798
+ let existingNode: Node | undefined;
2799
+ let parentNode: Node | undefined;
2800
+ let updateNode: Node | undefined;
2801
+
2802
+ if (contensis) {
2803
+ // Retrieve node
2804
+ if (nodePath) {
2805
+ const [, nodesByPath] = await to(contensis.nodes.GetNodes(nodePath, 0));
2806
+
2807
+ if (Array.isArray(nodesByPath) && nodesByPath[0]?.id) {
2808
+ nodeId = nodesByPath[0].id;
2809
+ }
2810
+ }
2811
+
2812
+ if (nodeId) {
2813
+ // Get the management node so we can update it
2814
+ const [, nodeById] = await to(
2815
+ contensis.source.repo.GetNodeById(nodeId)
2816
+ );
2817
+
2818
+ if (nodeById) existingNode = nodeById;
2819
+ }
2820
+
2821
+ // TODO: resolve any renderer id to its uuid so we can support passing the regular id for ease of use
2822
+ if (!existingNode) {
2823
+ // Build a node object to create or reject if there is not enough data
2824
+
2825
+ if (!language) {
2826
+ const project =
2827
+ await contensis.source.repo.GetProject(currentProject);
2828
+ language = project?.primaryLanguage || 'en-GB';
2829
+ }
2830
+
2831
+ if (!nodeUpdates.parentId) {
2832
+ // Find the node's parentId from the path if possible
2833
+ if (!nodePath)
2834
+ throw new Error(
2835
+ `A node with id "${nodeId}" does not exist, and a path was not provided to find the parent node.`
2836
+ );
2837
+
2838
+ const parentPath =
2839
+ nodePath.substring(0, nodePath.lastIndexOf('/')) || '/';
2840
+ const [, parentNodesByPath] = await to(
2841
+ contensis.nodes.GetNodes(parentPath, 0)
2842
+ );
2843
+
2844
+ if (!parentNodesByPath?.[0]?.id)
2845
+ throw new Error(
2846
+ `A node with id "${nodeId}" does not exist, and the parent node could not be found at path "${parentPath}".`
2847
+ );
2848
+ else parentNode = parentNodesByPath[0] as unknown as Node;
2849
+ }
2850
+ const pathSlug = nodePath?.substring(nodePath.lastIndexOf('/') + 1);
2851
+
2852
+ const createNode: ICreateNode = {
2853
+ id: nodeId,
2854
+ parentId: nodeUpdates.parentId || parentNode?.id,
2855
+ projectId: currentProject,
2856
+ displayName: displayName
2857
+ ? {
2858
+ [language]: displayName,
2859
+ }
2860
+ : nodeUpdates.displayName
2861
+ ? nodeUpdates.displayName
2862
+ : pathSlug
2863
+ ? {
2864
+ [language]: pathSlug,
2865
+ }
2866
+ : (undefined as any),
2867
+ slug: slug
2868
+ ? {
2869
+ [language]: slug,
2870
+ }
2871
+ : nodeUpdates.slug
2872
+ ? nodeUpdates.slug
2873
+ : pathSlug
2874
+ ? {
2875
+ [language]: pathSlug,
2876
+ }
2877
+ : (undefined as any),
2878
+ entryId: nodeUpdates.entryId,
2879
+ isCanonical: nodeUpdates.isCanonical,
2880
+ renderer: nodeUpdates.renderer,
2881
+ proxy: nodeUpdates.proxy,
2882
+ includeInMenu: nodeUpdates.includeInMenu,
2883
+ };
2884
+
2885
+ // Validate createNode
2886
+ updateNode = createNode as Node;
2887
+ } else {
2888
+ updateNode = { ...existingNode, ...nodeUpdates };
2889
+ }
2890
+
2891
+ if (updateNode) {
2892
+ log.info(messages.nodes.setPayload());
2893
+ log.object(updateNode);
2894
+ log.raw('');
2895
+ const [err, newNode] = await contensis.source.repo.UpdateOrCreateNode(
2896
+ existingNode as Node,
2897
+ updateNode
2898
+ );
2899
+
2900
+ if (err)
2901
+ log.error(
2902
+ messages.nodes[existingNode ? 'failedSet' : 'failedCreate'](
2903
+ currentEnv,
2904
+ nodePathOrId
2905
+ ),
2906
+ err
2907
+ );
2908
+ else if (newNode) {
2909
+ log.success(
2910
+ messages.nodes[existingNode ? 'set' : 'created'](
2911
+ currentEnv,
2912
+ newNode.id
2913
+ )
2914
+ );
2915
+
2916
+ await this.HandleFormattingAndOutput(newNode, log.object);
2917
+ }
2918
+ }
2919
+ }
2920
+ };
2921
+
2772
2922
  PrintWebhookSubscriptions = async (subscriptionIdsOrNames?: string[]) => {
2773
2923
  const { currentEnv, log, messages } = this;
2774
2924
  const contensis = await this.ConnectContensis();
@@ -2809,7 +2959,7 @@ class ContensisCli {
2809
2959
  } of filteredResults) {
2810
2960
  console.log(
2811
2961
  log.infoText(
2812
- ` ${chalk.bold.white`- ${name}`} ${id} [${(
2962
+ `${chalk.bold.white`${enabled ? '🟢' : '🔴'} ${name}`} ${id} [${(
2813
2963
  version.modified || version.created
2814
2964
  )
2815
2965
  .toString()
@@ -2819,6 +2969,9 @@ class ContensisCli {
2819
2969
  )
2820
2970
  );
2821
2971
  if (description) console.log(log.infoText` ${description}`);
2972
+ console.log(
2973
+ ` ${log.infoText`enabled`}: ${chalk[enabled ? 'green' : 'red'](enabled)}`
2974
+ );
2822
2975
  console.log(` ${log.infoText`[${method}]`} ${url}`);
2823
2976
  if (headers && Object.keys(headers).length) {
2824
2977
  console.log(` ${log.infoText`headers`}:`);
@@ -2849,8 +3002,6 @@ class ContensisCli {
2849
3002
  templates
2850
3003
  ).join(' ')}`
2851
3004
  );
2852
- if (enabled === false)
2853
- console.log(` ${log.infoText`enabled`}: ${enabled}`);
2854
3005
  }
2855
3006
  });
2856
3007
  }
@@ -2863,6 +3014,90 @@ class ContensisCli {
2863
3014
  }
2864
3015
  };
2865
3016
 
3017
+ ImportWebhooks = async ({
3018
+ commit,
3019
+ fromFile,
3020
+ logOutput,
3021
+ enabled = false,
3022
+ disabled = false,
3023
+ }: {
3024
+ commit: boolean;
3025
+ fromFile?: string;
3026
+ logOutput: string;
3027
+ enabled?: boolean;
3028
+ disabled?: boolean;
3029
+ }) => {
3030
+ const { currentEnv, currentProject, log, messages } = this;
3031
+
3032
+ const contensis = await this.ConnectContensisImport({
3033
+ commit,
3034
+ fromFile,
3035
+ });
3036
+
3037
+ if (contensis) {
3038
+ log.line();
3039
+ if (contensis.isPreview) {
3040
+ log.success(messages.migrate.preview());
3041
+ } else {
3042
+ log.warning(messages.migrate.commit());
3043
+ }
3044
+
3045
+ const [err, result] = await to(
3046
+ contensis.webhooks.MigrateWebhooks({
3047
+ // trying to simulate XOR logic, setting enabled arg from
3048
+ // enabled or disabled option only if one of them is set
3049
+ enabled: enabled !== disabled ? enabled || !disabled : undefined,
3050
+ })
3051
+ );
3052
+
3053
+ if (err) logError(err);
3054
+ else if (result) {
3055
+ await this.HandleFormattingAndOutput(result, () => {
3056
+ printWebhooksMigrateResult(this, result, {
3057
+ showAll: logOutput === 'all',
3058
+ showDiff: logOutput === 'all' || logOutput === 'changes',
3059
+ showChanged: logOutput === 'changes',
3060
+ });
3061
+ });
3062
+ }
3063
+ if (
3064
+ !err &&
3065
+ !result.errors?.length &&
3066
+ ((!commit && result.webhooksToMigrate[currentProject].totalCount) ||
3067
+ (commit &&
3068
+ (result.webhooksResult?.created || result.webhooksResult?.updated)))
3069
+ ) {
3070
+ log.success(
3071
+ messages.webhooks.imported(
3072
+ currentEnv,
3073
+ commit,
3074
+ commit
3075
+ ? (result.webhooksResult?.created || 0) +
3076
+ (result.webhooksResult?.updated || 0)
3077
+ : (result.webhooksToMigrate[currentProject].totalCount as number)
3078
+ )
3079
+ );
3080
+ if (!commit) {
3081
+ log.raw(``);
3082
+ log.help(messages.migrate.commitTip());
3083
+ }
3084
+ } else {
3085
+ const noChanges =
3086
+ result?.webhooksToMigrate?.[currentProject]?.['no change'] &&
3087
+ result?.webhooksToMigrate?.[currentProject].totalCount === 0;
3088
+
3089
+ if (noChanges && !err && !result.errors?.length) {
3090
+ log.help(messages.webhooks.noChange(currentEnv));
3091
+ } else {
3092
+ log.error(messages.webhooks.failedCreate(currentEnv), err);
3093
+ }
3094
+ }
3095
+ } else {
3096
+ log.warning(messages.models.noList(currentProject));
3097
+ log.help(messages.connect.tip());
3098
+ }
3099
+ };
3100
+
2866
3101
  PrintBlocks = async () => {
2867
3102
  const { currentEnv, env, log, messages } = this;
2868
3103
  const contensis = await this.ConnectContensis();
@@ -3282,7 +3517,6 @@ class ContensisCli {
3282
3517
  }
3283
3518
  };
3284
3519
 
3285
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
3286
3520
  PrintRenderers = async (rendererId?: string) => {
3287
3521
  const { currentEnv, env, log, messages } = this;
3288
3522
  const contensis = await this.ConnectContensis();
@@ -3291,19 +3525,27 @@ class ContensisCli {
3291
3525
  const [err, renderers] = await contensis.renderers.GetRenderers();
3292
3526
 
3293
3527
  if (Array.isArray(renderers)) {
3294
- await this.HandleFormattingAndOutput(renderers, () => {
3528
+ const result = rendererId
3529
+ ? ([renderers.find(r => r.id === rendererId)].filter(
3530
+ Boolean
3531
+ ) as Renderer[])
3532
+ : renderers || [];
3533
+
3534
+ await this.HandleFormattingAndOutput(result, () => {
3295
3535
  // print the renderers to console
3296
3536
  log.success(messages.renderers.list(currentEnv, env.currentProject));
3297
3537
  for (const {
3538
+ uuid,
3298
3539
  id,
3299
3540
  description,
3300
3541
  assignedContentTypes,
3301
3542
  rules,
3302
3543
  version,
3303
- } of renderers) {
3544
+ } of result) {
3304
3545
  console.log(
3305
3546
  ` - ${id} [${version.versionNo}] ${log.infoText`${description}`}`
3306
3547
  );
3548
+ console.log(log.infoText` uuid: ${uuid}`);
3307
3549
  if (assignedContentTypes?.length)
3308
3550
  console.log(
3309
3551
  log.infoText` assignedContentTypes: ${assignedContentTypes.join(
@@ -3319,7 +3561,7 @@ class ContensisCli {
3319
3561
  );
3320
3562
  }
3321
3563
  });
3322
- return renderers;
3564
+ return result;
3323
3565
  }
3324
3566
 
3325
3567
  if (err) {
@@ -1,3 +1,4 @@
1
+ import { search } from '@inquirer/prompts';
1
2
  import ansiEscapes from 'ansi-escapes';
2
3
  import to from 'await-to-js';
3
4
  import inquirer from 'inquirer';
@@ -413,10 +414,11 @@ class ContensisDev extends ContensisRole {
413
414
 
414
415
  ExecRequestHandler = async (
415
416
  blockId: string[],
417
+ blockOverrides: string[] | boolean,
416
418
  overrideArgs: string[] = [],
417
419
  version?: string
418
420
  ) => {
419
- const { debug, log, messages } = this;
421
+ const { currentEnv, currentProject, debug, log, messages } = this;
420
422
 
421
423
  const spinner = !debug
422
424
  ? createSpinner(messages.devrequests.launch())
@@ -425,43 +427,105 @@ class ContensisDev extends ContensisRole {
425
427
  // Ensure request handler is available to use
426
428
  const requestHandler = await createRequestHandler(version);
427
429
 
428
- // Generate args for request handler using CLI methods
429
- const args = new RequestHandlerArgs(this);
430
- spinner?.start();
431
- await args.Create();
432
- spinner?.success();
433
-
434
- // Prompt block id and dev uri to run locally (if not supplied)
435
- const blockIdChoices = args.siteConfig?.blocks.map(block => block.id) || [];
436
- blockIdChoices.push('none');
437
- const defaultDeveloperUri = 'http://localhost:3000';
438
-
439
- const { overrideBlockId, overrideUri } = blockId.length
440
- ? {
441
- overrideBlockId: blockId[0],
442
- overrideUri: blockId?.[1] || defaultDeveloperUri,
430
+ // Get the available blocks for the project
431
+ const contensis = await this.ConnectContensis();
432
+ if (contensis) {
433
+ const blockBranches = new Map<string, string>();
434
+
435
+ const [err, projectBlocks] = await contensis.blocks.GetBlocks();
436
+ if (err) log.error(messages.blocks.noList(currentEnv, currentProject));
437
+ else if (projectBlocks) {
438
+ // Prompt block id and dev uri to run locally (if not supplied)
439
+ const blockIdChoices = projectBlocks.map(block => block.id) || [];
440
+ blockIdChoices.push('none');
441
+ const defaultDeveloperUri = 'http://localhost:3000';
442
+
443
+ const { developmentBlockId, developmentBlockUri } = blockId.length
444
+ ? {
445
+ developmentBlockId: blockId[0],
446
+ developmentBlockUri: blockId?.[1] || defaultDeveloperUri,
447
+ }
448
+ : await inquirer.prompt([
449
+ {
450
+ type: 'list',
451
+ prefix: '🧱',
452
+ message: messages.devrequests.overrideBlock(),
453
+ name: 'developmentBlockId',
454
+ choices: blockIdChoices,
455
+ },
456
+ {
457
+ type: 'input',
458
+ prefix: '🔗',
459
+ message: messages.devrequests.overrideUri(),
460
+ name: 'developmentBlockUri',
461
+ default: defaultDeveloperUri,
462
+ },
463
+ ]);
464
+
465
+ // Prompt for other block overrides (e.g. branch)
466
+ if (blockOverrides) {
467
+ // Prompt for which blocks to override
468
+ const blockIdChoices =
469
+ projectBlocks
470
+ // ?.filter(block => block.id !== developmentBlockId)
471
+ ?.map(block => ({
472
+ name: `${block.id}${block.description ? ` (${block.description})` : ''}`,
473
+ value: block.id,
474
+ })) || [];
475
+ blockIdChoices.push({ name: 'none', value: 'none' });
476
+
477
+ const { overrideBlockIds } = Array.isArray(blockOverrides)
478
+ ? {
479
+ overrideBlockIds: blockOverrides
480
+ .map(bId => projectBlocks.find(b => b.id === bId)?.id)
481
+ .filter(Boolean) as string[],
482
+ }
483
+ : await inquirer.prompt<{ overrideBlockIds: string[] }>([
484
+ {
485
+ type: 'checkbox',
486
+ prefix: '🧱',
487
+ message: messages.devrequests.overrideBlocks(),
488
+ name: 'overrideBlockIds',
489
+ choices: blockIdChoices,
490
+ // default: blockIdChoices.findIndex(b => b.value === 'none'),
491
+ },
492
+ ]);
493
+
494
+ // For each block to override, prompt for the branch to use
495
+ for (const overrideBlockId of overrideBlockIds) {
496
+ if (overrideBlockId === 'none') continue;
497
+ const choices = projectBlocks
498
+ .find(b => b.id === overrideBlockId)
499
+ ?.branches.map(b => b.id);
500
+ if (choices) {
501
+ const overrideBranch = await search<string>({
502
+ message: `🌿 ${messages.devrequests.overrideBranch(overrideBlockId)}`,
503
+ source: input => {
504
+ input = input || '';
505
+ const fuzzyResult = input
506
+ ? choices?.filter(choice =>
507
+ choice.toLowerCase().includes(input.toLowerCase())
508
+ )
509
+ : choices;
510
+ return fuzzyResult || [];
511
+ },
512
+ });
513
+ blockBranches.set(overrideBlockId, overrideBranch);
514
+ }
515
+ }
443
516
  }
444
- : await inquirer.prompt([
445
- {
446
- type: 'list',
447
- prefix: '🧱',
448
- message: messages.devrequests.overrideBlock(),
449
- name: 'overrideBlockId',
450
- choices: blockIdChoices,
451
- },
452
- {
453
- type: 'input',
454
- prefix: '🔗',
455
- message: messages.devrequests.overrideUri(),
456
- name: 'overrideUri',
457
- default: defaultDeveloperUri,
458
- },
459
- ]);
460
517
 
461
- args.overrideBlock(overrideBlockId, overrideUri);
518
+ // Generate args for request handler using CLI methods
519
+ const args = new RequestHandlerArgs(projectBlocks, blockBranches, this);
520
+ spinner?.start();
521
+ await args.Create();
522
+ args.overrideBlock(developmentBlockId, developmentBlockUri);
523
+ spinner?.success();
462
524
 
463
- // Launch request handler
464
- await requestHandler(args.getArgs(overrideArgs));
525
+ // Launch request handler
526
+ await requestHandler(args.getArgs(overrideArgs));
527
+ }
528
+ }
465
529
  };
466
530
  }
467
531
  export const devCommand = (
package/src/shell.ts CHANGED
@@ -142,12 +142,15 @@ class ContensisShell {
142
142
  'login',
143
143
  'list projects',
144
144
  'set project',
145
- ...(this.env?.projects || []).map(project => `set project ${project.id}`)
145
+ ...(this.env?.projects || []).map(
146
+ project => `set project ${project.id}`
147
+ )
146
148
  );
147
149
  if (userId)
148
150
  availableCommands.push(
149
151
  'copy field',
150
152
  'create key',
153
+ 'create node',
151
154
  'create project',
152
155
  'create role',
153
156
  'create tag',
@@ -183,6 +186,7 @@ class ContensisShell {
183
186
  'import nodes',
184
187
  'import tags',
185
188
  'import taggroups',
189
+ 'import webhooks',
186
190
  'list blocks',
187
191
  'list contenttypes',
188
192
  'list components',
@@ -207,6 +211,8 @@ class ContensisShell {
207
211
  'remove tags',
208
212
  'remove tags in',
209
213
  'remove taggroup',
214
+ 'set node entry',
215
+ 'set node renderer',
210
216
  'set project name',
211
217
  'set project description',
212
218
  'set role name',