@suitegeezus/suitecloud-cli 3.1.4

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 (157) hide show
  1. package/CONTRIBUTING.md +7 -0
  2. package/DELTA.md +235 -0
  3. package/README.md +107 -0
  4. package/docs/Command.md +299 -0
  5. package/messages.json +317 -0
  6. package/package.json +51 -0
  7. package/postinstall.js +8 -0
  8. package/resources/FUTC-LICENSE.txt +115 -0
  9. package/src/ApplicationConstants.js +87 -0
  10. package/src/CLI.js +202 -0
  11. package/src/CLIException.js +21 -0
  12. package/src/ExecutionEnvironmentContext.js +39 -0
  13. package/src/SdkExecutionContext.js +90 -0
  14. package/src/SdkExecutor.js +160 -0
  15. package/src/commands/Command.js +158 -0
  16. package/src/commands/account/manageauth/ManageAccountAction.js +126 -0
  17. package/src/commands/account/manageauth/ManageAccountCommand.js +20 -0
  18. package/src/commands/account/manageauth/ManageAccountInputHandler.js +215 -0
  19. package/src/commands/account/manageauth/ManageAccountOutputHandler.js +30 -0
  20. package/src/commands/account/setup/SetupAction.js +39 -0
  21. package/src/commands/account/setup/SetupCommand.js +21 -0
  22. package/src/commands/account/setup/SetupInputHandler.js +169 -0
  23. package/src/commands/account/setup/SetupOutputHandler.js +65 -0
  24. package/src/commands/account/setupci/AccountSetupCiAction.js +58 -0
  25. package/src/commands/account/setupci/AccountSetupCiCommand.js +20 -0
  26. package/src/commands/account/setupci/AccountSetupCiConstants.js +21 -0
  27. package/src/commands/account/setupci/AccountSetupCiOutputHandler.js +40 -0
  28. package/src/commands/account/setupci/AccountSetupCiValidation.js +100 -0
  29. package/src/commands/base/BaseAction.js +37 -0
  30. package/src/commands/base/BaseInputHandler.js +24 -0
  31. package/src/commands/base/BaseOutputHandler.js +30 -0
  32. package/src/commands/custom/hello/Action.js +58 -0
  33. package/src/commands/custom/hello/Command.js +20 -0
  34. package/src/commands/custom/hello/Handler.js +26 -0
  35. package/src/commands/custom/hello/README.md +78 -0
  36. package/src/commands/custom/hook/Action.js +28 -0
  37. package/src/commands/custom/hook/Command.js +22 -0
  38. package/src/commands/custom/hook/InputHandler.js +8 -0
  39. package/src/commands/custom/hook/OutputHandler.js +8 -0
  40. package/src/commands/custom/hook/README.md +32 -0
  41. package/src/commands/file/create/CreateFileAction.js +89 -0
  42. package/src/commands/file/create/CreateFileCommand.js +20 -0
  43. package/src/commands/file/create/CreateFileInputHandler.js +175 -0
  44. package/src/commands/file/create/CreateFileOutputHandler.js +22 -0
  45. package/src/commands/file/import/ImportFilesAction.js +112 -0
  46. package/src/commands/file/import/ImportFilesCommand.js +22 -0
  47. package/src/commands/file/import/ImportFilesInputHandler.js +130 -0
  48. package/src/commands/file/import/ImportFilesOutputHandler.js +53 -0
  49. package/src/commands/file/list/ListFilesAction.js +55 -0
  50. package/src/commands/file/list/ListFilesCommand.js +20 -0
  51. package/src/commands/file/list/ListFilesInputHandler.js +55 -0
  52. package/src/commands/file/list/ListFilesOutputHandler.js +24 -0
  53. package/src/commands/file/upload/UploadFilesAction.js +67 -0
  54. package/src/commands/file/upload/UploadFilesCommand.js +20 -0
  55. package/src/commands/file/upload/UploadFilesInputHandler.js +125 -0
  56. package/src/commands/file/upload/UploadFilesOutputHandler.js +49 -0
  57. package/src/commands/object/create/CreateObjectAction.js +33 -0
  58. package/src/commands/object/create/CreateObjectCommand.js +19 -0
  59. package/src/commands/object/create/CreateObjectInputHandler.js +82 -0
  60. package/src/commands/object/import/ImportObjectsAction.js +225 -0
  61. package/src/commands/object/import/ImportObjectsCommand.js +20 -0
  62. package/src/commands/object/import/ImportObjectsInputHandler.js +310 -0
  63. package/src/commands/object/import/ImportObjectsOutputHandler.js +114 -0
  64. package/src/commands/object/list/ListObjectsAction.js +62 -0
  65. package/src/commands/object/list/ListObjectsCommand.js +20 -0
  66. package/src/commands/object/list/ListObjectsInputHandler.js +148 -0
  67. package/src/commands/object/list/ListObjectsOutputHandler.js +29 -0
  68. package/src/commands/object/update/UpdateAction.js +138 -0
  69. package/src/commands/object/update/UpdateCommand.js +20 -0
  70. package/src/commands/object/update/UpdateInputHandler.js +170 -0
  71. package/src/commands/object/update/UpdateOutputHandler.js +61 -0
  72. package/src/commands/project/adddependencies/AddDependenciesAction.js +55 -0
  73. package/src/commands/project/adddependencies/AddDependenciesCommand.js +19 -0
  74. package/src/commands/project/adddependencies/AddDependenciesOutputHandler.js +114 -0
  75. package/src/commands/project/create/CreateProjectAction.js +370 -0
  76. package/src/commands/project/create/CreateProjectCommand.js +20 -0
  77. package/src/commands/project/create/CreateProjectInputHandler.js +169 -0
  78. package/src/commands/project/create/CreateProjectOutputHandler.js +36 -0
  79. package/src/commands/project/deploy/DeployAction.js +161 -0
  80. package/src/commands/project/deploy/DeployCommand.js +20 -0
  81. package/src/commands/project/deploy/DeployInputHandler.js +100 -0
  82. package/src/commands/project/deploy/DeployOutputHandler.js +49 -0
  83. package/src/commands/project/package/PackageAction.js +59 -0
  84. package/src/commands/project/package/PackageCommand.js +18 -0
  85. package/src/commands/project/package/PackageOutputHandler.js +18 -0
  86. package/src/commands/project/validate/ValidateAction.js +106 -0
  87. package/src/commands/project/validate/ValidateCommand.js +20 -0
  88. package/src/commands/project/validate/ValidateInputHandler.js +92 -0
  89. package/src/commands/project/validate/ValidateOutputHandler.js +74 -0
  90. package/src/core/CommandActionExecutor.js +347 -0
  91. package/src/core/CommandAuthentication.js +13 -0
  92. package/src/core/CommandOptionsValidator.js +42 -0
  93. package/src/core/CommandRegistrationService.js +130 -0
  94. package/src/core/CommandsMetadataService.js +104 -0
  95. package/src/core/extensibility/CLIConfigurationService.js +192 -0
  96. package/src/core/extensibility/CommandUserExtension.js +64 -0
  97. package/src/core/sdksetup/SdkDownloadService.js +109 -0
  98. package/src/core/sdksetup/SdkLicense.js +39 -0
  99. package/src/core/sdksetup/SdkProperties.js +51 -0
  100. package/src/loggers/ConsoleLogger.js +32 -0
  101. package/src/loggers/LoggerFontFormatter.mjs +17 -0
  102. package/src/loggers/LoggerOsConstants.js +12 -0
  103. package/src/loggers/NodeConsoleLogger.js +47 -0
  104. package/src/metadata/CommandGenerators.json +92 -0
  105. package/src/metadata/NodeCommandsMetadata.json +139 -0
  106. package/src/metadata/ObjectTypesMetadata.js +615 -0
  107. package/src/metadata/SdkCommandsMetadata.json +846 -0
  108. package/src/metadata/SdkCommandsMetadataPatch.json +130 -0
  109. package/src/metadata/SuiteScriptModulesMetadata.js +152 -0
  110. package/src/metadata/SuiteScriptTypesMetadata.js +64 -0
  111. package/src/services/AccountFileCabinetService.js +86 -0
  112. package/src/services/EnvironmentInformationService.js +31 -0
  113. package/src/services/ExecutionContextService.js +108 -0
  114. package/src/services/FileCabinetService.js +65 -0
  115. package/src/services/FileSystemService.js +245 -0
  116. package/src/services/NodeTranslationService.js +22 -0
  117. package/src/services/NpmInstallRunner.js +33 -0
  118. package/src/services/ProjectInfoService.js +209 -0
  119. package/src/services/SuiteCloudAuthProxyService.js +469 -0
  120. package/src/services/TranslationKeys.js +506 -0
  121. package/src/services/TranslationService.js +30 -0
  122. package/src/services/actionresult/ActionResult.js +129 -0
  123. package/src/services/actionresult/AuthenticateActionResult.js +85 -0
  124. package/src/services/actionresult/CreateProjectActionResult.js +100 -0
  125. package/src/services/actionresult/DeployActionResult.js +69 -0
  126. package/src/services/actionresult/HelloActionResult.js +13 -0
  127. package/src/services/actionresult/ManageAccountActionResult.js +70 -0
  128. package/src/services/settings/CLISettings.js +46 -0
  129. package/src/services/settings/CLISettingsService.js +132 -0
  130. package/src/suitecloud.js +33 -0
  131. package/src/templates/TemplateKeys.js +25 -0
  132. package/src/templates/objects/commerceextension.xml +9 -0
  133. package/src/templates/projectconfigs/default_gitignore.template +47 -0
  134. package/src/templates/projectconfigs/sdf.config.js +4 -0
  135. package/src/templates/projectconfigs/suitecloud.config.js +4 -0
  136. package/src/templates/scripts/blankscript.js +3 -0
  137. package/src/templates/unittest/jest.config.js.template +7 -0
  138. package/src/templates/unittest/jsconfig.json.template +5 -0
  139. package/src/templates/unittest/package.json.template +12 -0
  140. package/src/templates/unittest/sample-test.js.template +37 -0
  141. package/src/templates/unittest/suitecloud.config.js.template +15 -0
  142. package/src/ui/CliSpinner.js +34 -0
  143. package/src/utils/AccountCredentialsFormatter.js +62 -0
  144. package/src/utils/AccountSpecificValuesUtils.js +55 -0
  145. package/src/utils/ActionResultUtils.js +47 -0
  146. package/src/utils/ApplyInstallationPreferencesUtils.js +41 -0
  147. package/src/utils/AuthenticationUtils.js +262 -0
  148. package/src/utils/CommandUtils.js +50 -0
  149. package/src/utils/CryptoUtils.js +41 -0
  150. package/src/utils/ExceptionUtils.js +33 -0
  151. package/src/utils/FileUtils.js +43 -0
  152. package/src/utils/SdkOperationResult.js +68 -0
  153. package/src/utils/SdkOperationResultUtils.js +20 -0
  154. package/src/utils/ValidationErrorsFormatter.js +23 -0
  155. package/src/utils/http/HttpConstants.js +39 -0
  156. package/src/utils/http/ProxyAgent.js +110 -0
  157. package/src/validation/InteractiveAnswersValidator.js +205 -0
@@ -0,0 +1,89 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const path = require('path');
8
+ const { executeWithSpinner } = require('../../../ui/CliSpinner');
9
+ const { ActionResult } = require('../../../services/actionresult/ActionResult');
10
+ const { FOLDERS } = require('../../../ApplicationConstants');
11
+ const BaseAction = require('../../base/BaseAction');
12
+ const CommandUtils = require('../../../utils/CommandUtils');
13
+ const NodeTranslationService = require('../../../services/NodeTranslationService');
14
+ const SdkExecutionContext = require('../../../SdkExecutionContext');
15
+ const SdkOperationResultUtils = require('../../../utils/SdkOperationResultUtils');
16
+
17
+ const {
18
+ COMMAND_CREATEFILE: { MESSAGES },
19
+ } = require('../../../services/TranslationKeys');
20
+
21
+ const COMMAND_OPTIONS = {
22
+ MODULE: 'module',
23
+ PATH: 'path',
24
+ PROJECT: 'project',
25
+ TYPE: 'type',
26
+ };
27
+ const JS_EXTENSION = '.js';
28
+
29
+ module.exports = class CreateFileAction extends BaseAction {
30
+ preExecute(params) {
31
+ params[COMMAND_OPTIONS.PROJECT] = CommandUtils.quoteString(this._projectFolder);
32
+
33
+ if (this._runInInteractiveMode) {
34
+ params[COMMAND_OPTIONS.PATH] = params.parentPath + params.name;
35
+ }
36
+ if (params.hasOwnProperty(COMMAND_OPTIONS.PATH)) {
37
+ if (!params[COMMAND_OPTIONS.PATH].endsWith(JS_EXTENSION)) {
38
+ params[COMMAND_OPTIONS.PATH] = params[COMMAND_OPTIONS.PATH] + JS_EXTENSION;
39
+ }
40
+ params[COMMAND_OPTIONS.PATH] = CommandUtils.quoteString(params[COMMAND_OPTIONS.PATH]);
41
+ }
42
+
43
+ if (params.hasOwnProperty(COMMAND_OPTIONS.MODULE)) {
44
+ if (Array.isArray(params[COMMAND_OPTIONS.MODULE])) {
45
+ params[COMMAND_OPTIONS.MODULE] = params[COMMAND_OPTIONS.MODULE].map(CommandUtils.quoteString).join(' ');
46
+ } else {
47
+ params[COMMAND_OPTIONS.MODULE] = CommandUtils.quoteString(params[COMMAND_OPTIONS.MODULE]);
48
+ }
49
+ }
50
+
51
+ delete params.parentPath;
52
+ delete params.name;
53
+
54
+ return params;
55
+ }
56
+
57
+ async execute(params) {
58
+ const executionContextCreateFile = SdkExecutionContext.Builder.forCommand(this._commandMetadata.sdkCommand)
59
+ .integration()
60
+ .addParams(params)
61
+ .build();
62
+
63
+ const operationResult = await executeWithSpinner({
64
+ action: this._sdkExecutor.execute(executionContextCreateFile),
65
+ message: NodeTranslationService.getMessage(MESSAGES.CREATING_FILE),
66
+ });
67
+
68
+ if (operationResult.status === SdkOperationResultUtils.STATUS.SUCCESS) {
69
+ const suiteScriptFileAbsolutePath = path.join(
70
+ this._projectFolder,
71
+ FOLDERS.FILE_CABINET,
72
+ CommandUtils.unquoteString(params[COMMAND_OPTIONS.PATH])
73
+ );
74
+
75
+ let resultMessage = NodeTranslationService.getMessage(MESSAGES.SUITESCRIPT_FILE_CREATED, suiteScriptFileAbsolutePath);
76
+ if (params.hasOwnProperty(COMMAND_OPTIONS.MODULE)) {
77
+ resultMessage = NodeTranslationService.getMessage(
78
+ MESSAGES.SUITESCRIPT_FILE_CREATED_WITH_MODULES,
79
+ suiteScriptFileAbsolutePath,
80
+ params[COMMAND_OPTIONS.MODULE].split(' ').join(', ')
81
+ );
82
+ }
83
+
84
+ return ActionResult.Builder.withData(operationResult.data).withResultMessage(resultMessage).withCommandParameters(params).build();
85
+ } else {
86
+ return ActionResult.Builder.withErrors(operationResult.errorMessages).withCommandParameters(params).build();
87
+ }
88
+ }
89
+ };
@@ -0,0 +1,20 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const Command = require('../../Command');
8
+ const CreateFileAction = require('./CreateFileAction');
9
+ const CreateFileInputHandler = require('./CreateFileInputHandler');
10
+ const CreateFileOutputHandler = require('./CreateFileOutputHandler');
11
+
12
+ module.exports = {
13
+ create(options) {
14
+ return Command.Builder.withOptions(options)
15
+ .withAction(CreateFileAction)
16
+ .withInput(CreateFileInputHandler)
17
+ .withOutput(CreateFileOutputHandler)
18
+ .build();
19
+ }
20
+ };
@@ -0,0 +1,175 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const { default : { prompt, Separator } } = require('inquirer');
8
+ const path = require('path');
9
+ const { FOLDERS } = require('../../../ApplicationConstants');
10
+ const {
11
+ showValidationResults,
12
+ validateArrayIsNotEmpty,
13
+ validateFieldIsNotEmpty,
14
+ validateSuiteScriptFileDoesNotExist,
15
+ validateFileName
16
+ } = require('../../../validation/InteractiveAnswersValidator');
17
+ const {
18
+ COMMAND_CREATEFILE: { QUESTIONS },
19
+ YES,
20
+ NO,
21
+ } = require('../../../services/TranslationKeys');
22
+ const ApplicationConstants = require('../../../ApplicationConstants');
23
+ const BaseInputHandler = require('../../base/BaseInputHandler');
24
+ const CommandUtils = require('../../../utils/CommandUtils');
25
+ const FileSystemService = require('../../../services/FileSystemService');
26
+ const FileCabinetService = require('../../../services/FileCabinetService');
27
+ const NodeTranslationService = require('../../../services/NodeTranslationService');
28
+ const ProjectInfoService = require('../../../services/ProjectInfoService');
29
+ const SUITESCRIPT_MODULES = require('../../../metadata/SuiteScriptModulesMetadata');
30
+ const SUITESCRIPT_TYPES = require('../../../metadata/SuiteScriptTypesMetadata');
31
+
32
+ const ANSWER_NAMES = {
33
+ ADD_SUITESCRIPT_MODULES: 'addSuiteScriptModules',
34
+ NAME: 'name',
35
+ MODULE: 'module',
36
+ PARENT_PATH: 'parentPath',
37
+ TYPE: 'type',
38
+ };
39
+ const SUITEAPPS_PATH = '/SuiteApps';
40
+ const SUITESCRIPTS_PATH = '/SuiteScripts';
41
+ const WEB_HOSTING_SUBFOLDER_PATH = '/Web Site Hosting Files/.*/';
42
+
43
+ module.exports = class CreateFileInputHandler extends BaseInputHandler {
44
+
45
+ constructor(options) {
46
+ super(options);
47
+
48
+ this._fileSystemService = new FileSystemService();
49
+ this._fileCabinetService = new FileCabinetService(path.join(this._projectFolder, FOLDERS.FILE_CABINET));
50
+ this._projectInfoService = new ProjectInfoService(this._projectFolder);
51
+
52
+ this._accountCustomizationProject = this._projectInfoService.isAccountCustomizationProject();
53
+ }
54
+
55
+ async getParameters(params) {
56
+ const answers = await prompt([
57
+ this._questionSelectSuiteScriptType(),
58
+ this._questionAddSuiteScriptModules(),
59
+ this._questionSelectSuiteScriptModules(),
60
+ this._questionSelectDestinationFolder(),
61
+
62
+ ]);
63
+
64
+ const nameAnswer = await prompt(this._questionEnterName(answers[ANSWER_NAMES.PARENT_PATH]));
65
+ answers[ANSWER_NAMES.NAME] = nameAnswer[ANSWER_NAMES.NAME];
66
+
67
+ delete answers[ANSWER_NAMES.ADD_SUITESCRIPT_MODULES];
68
+
69
+ return answers;
70
+ }
71
+
72
+ _questionSelectSuiteScriptType() {
73
+ return {
74
+ type: CommandUtils.INQUIRER_TYPES.LIST,
75
+ name: ANSWER_NAMES.TYPE,
76
+ message: NodeTranslationService.getMessage(QUESTIONS.CHOOSE_SUITESCRIPT_TYPE),
77
+ pageSize: 15,
78
+ choices: [
79
+ ...SUITESCRIPT_TYPES.map(( suiteScriptType) => ({
80
+ name: suiteScriptType.name,
81
+ value: suiteScriptType.id,
82
+ })),
83
+ new Separator(),
84
+ ],
85
+ };
86
+ }
87
+
88
+ _questionAddSuiteScriptModules() {
89
+ return {
90
+ type: CommandUtils.INQUIRER_TYPES.LIST,
91
+ name: ANSWER_NAMES.ADD_SUITESCRIPT_MODULES,
92
+ message: NodeTranslationService.getMessage(QUESTIONS.ADD_SUITESCRIPT_MODULES),
93
+ default: true,
94
+ choices: [
95
+ { name: NodeTranslationService.getMessage(YES), value: true },
96
+ { name: NodeTranslationService.getMessage(NO), value: false },
97
+ ],
98
+ };
99
+ }
100
+
101
+ _questionSelectSuiteScriptModules() {
102
+ return {
103
+ when: function(response) {
104
+ return response[ANSWER_NAMES.ADD_SUITESCRIPT_MODULES];
105
+ },
106
+ type: CommandUtils.INQUIRER_TYPES.CHECKBOX,
107
+ name: ANSWER_NAMES.MODULE,
108
+ message: NodeTranslationService.getMessage(QUESTIONS.SELECT_SUITESCRIPT_MODULES),
109
+ pageSize: 15,
110
+ choices: [
111
+ ...SUITESCRIPT_MODULES.map((suiteScriptModule) => ({
112
+ name: suiteScriptModule.id,
113
+ value: suiteScriptModule.id,
114
+ })),
115
+ new Separator(),
116
+ ],
117
+ validate: (fieldValue) => showValidationResults(fieldValue, validateArrayIsNotEmpty),
118
+ };
119
+ }
120
+
121
+ _questionSelectDestinationFolder() {
122
+ return {
123
+ type: CommandUtils.INQUIRER_TYPES.LIST,
124
+ name: ANSWER_NAMES.PARENT_PATH,
125
+ message: NodeTranslationService.getMessage(QUESTIONS.SELECT_FOLDER),
126
+ pageSize: 15,
127
+ choices: this._getFolderChoices(),
128
+ };
129
+ }
130
+
131
+ _questionEnterName(parentRelativePath) {
132
+ const parentAbsolutePath = path.join(this._projectFolder, ApplicationConstants.FOLDERS.FILE_CABINET, parentRelativePath);
133
+
134
+ return {
135
+ type: CommandUtils.INQUIRER_TYPES.INPUT,
136
+ name: ANSWER_NAMES.NAME,
137
+ message: NodeTranslationService.getMessage(QUESTIONS.ENTER_NAME),
138
+ filter: (fieldValue) => fieldValue.trim(),
139
+ validate: (fieldValue) => showValidationResults(
140
+ fieldValue.trim(),
141
+ validateFieldIsNotEmpty,
142
+ validateFileName,
143
+ (fieldValue) => validateSuiteScriptFileDoesNotExist(parentAbsolutePath, fieldValue.trim())
144
+ ),
145
+ };
146
+ }
147
+
148
+ _getFolderChoices() {
149
+ const transformFolderToChoicesObjectFuntion = (folder) => {
150
+ let folderRestricted;
151
+
152
+ const folderRelativePath = this._fileCabinetService.getFileCabinetRelativePath(folder) + '/';
153
+
154
+ if (this._accountCustomizationProject) {
155
+ folderRestricted = !(folderRelativePath.startsWith(SUITESCRIPTS_PATH) || folderRelativePath.match(WEB_HOSTING_SUBFOLDER_PATH));
156
+ } else {
157
+ const applicationId = this._projectInfoService.getApplicationId();
158
+ const applicationSuiteAppFolderAbsolutePath = path.join(this._projectFolder, FOLDERS.FILE_CABINET, SUITEAPPS_PATH, '/', applicationId, '/');
159
+ const applicationSuiteAppFolderRelativePath = this._fileCabinetService.getFileCabinetRelativePath(applicationSuiteAppFolderAbsolutePath);
160
+ folderRestricted = !folderRelativePath.startsWith(applicationSuiteAppFolderRelativePath);
161
+ }
162
+
163
+ return {
164
+ name: FOLDERS.FILE_CABINET + folderRelativePath,
165
+ value: folderRelativePath,
166
+ disabled: folderRestricted,
167
+ };
168
+ }
169
+
170
+ return this._fileSystemService
171
+ .getFoldersFromDirectoryRecursively(path.join(this._projectFolder, FOLDERS.FILE_CABINET))
172
+ .map(transformFolderToChoicesObjectFuntion);
173
+ }
174
+
175
+ };
@@ -0,0 +1,22 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const ActionResultUtils = require('../../../utils/ActionResultUtils');
8
+ const BaseOutputHandler = require('../../base/BaseOutputHandler');
9
+
10
+ module.exports = class CreateProjectOutputHandler extends BaseOutputHandler {
11
+
12
+ constructor(options) {
13
+ super(options);
14
+ }
15
+
16
+ parse(actionResult) {
17
+ ActionResultUtils.logResultMessage(actionResult, this._log);
18
+
19
+ return actionResult;
20
+ }
21
+
22
+ };
@@ -0,0 +1,112 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const { ActionResult } = require('../../../services/actionresult/ActionResult');
8
+ const CommandUtils = require('../../../utils/CommandUtils');
9
+ const NodeTranslationService = require('../../../services/NodeTranslationService');
10
+ const { executeWithSpinner } = require('../../../ui/CliSpinner');
11
+ const SdkOperationResultUtils = require('../../../utils/SdkOperationResultUtils');
12
+ const SdkExecutionContext = require('../../../SdkExecutionContext');
13
+ const ProjectInfoService = require('../../../services/ProjectInfoService');
14
+ const { PROJECT_SUITEAPP } = require('../../../ApplicationConstants');
15
+ const { getProjectDefaultAuthId } = require('../../../utils/AuthenticationUtils');
16
+ const BaseAction = require('../../base/BaseAction');
17
+ const {
18
+ COMMAND_IMPORTFILES: { ERRORS, MESSAGES, WARNINGS },
19
+ } = require('../../../services/TranslationKeys');
20
+ const CLIException = require('../../../CLIException');
21
+
22
+ const COMMAND_OPTIONS = {
23
+ ALLOW_FOR_SUITEAPPS: 'allowforsuiteapps',
24
+ AUTH_ID: 'authid',
25
+ CALLED_FROM_COMPARE_FILES: 'calledfromcomparefiles',
26
+ CALLED_FROM_UPDATE: 'calledfromupdate',
27
+ FOLDER: 'folder',
28
+ PATHS: 'paths',
29
+ EXCLUDE_PROPERTIES: 'excludeproperties',
30
+ PROJECT: 'project',
31
+ };
32
+
33
+ module.exports = class ImportFilesAction extends BaseAction {
34
+ constructor(options) {
35
+ super(options);
36
+
37
+ this._projectInfoService = new ProjectInfoService(this._projectFolder);
38
+ this._calledFromCompareFiles = false;
39
+ this._calledFromUpdate = false;
40
+ }
41
+
42
+ preExecute(params) {
43
+ const { PROJECT, PATHS, EXCLUDE_PROPERTIES, AUTH_ID } = COMMAND_OPTIONS;
44
+ params[PROJECT] = CommandUtils.quoteString(this._projectFolder);
45
+ if (params.hasOwnProperty(PATHS)) {
46
+ if (Array.isArray(params[PATHS])) {
47
+ params[PATHS] = params[PATHS].map(CommandUtils.quoteString).join(' ');
48
+ } else {
49
+ params[PATHS] = CommandUtils.quoteString(params[PATHS]);
50
+ }
51
+ }
52
+ if (params[EXCLUDE_PROPERTIES]) {
53
+ params[EXCLUDE_PROPERTIES] = '';
54
+ } else {
55
+ delete params[EXCLUDE_PROPERTIES];
56
+ }
57
+
58
+ if (params[COMMAND_OPTIONS.CALLED_FROM_COMPARE_FILES]) {
59
+ this._calledFromCompareFiles = true;
60
+ delete params[COMMAND_OPTIONS.CALLED_FROM_COMPARE_FILES];
61
+ }
62
+ if (params[COMMAND_OPTIONS.CALLED_FROM_UPDATE]) {
63
+ this._calledFromUpdate = true;
64
+ delete params[COMMAND_OPTIONS.CALLED_FROM_UPDATE];
65
+ }
66
+
67
+ return params;
68
+ }
69
+
70
+ async execute(params) {
71
+ try {
72
+ if (!this._calledFromCompareFiles && this._projectInfoService.getProjectType() === PROJECT_SUITEAPP) {
73
+ return ActionResult.Builder.withErrors([NodeTranslationService.getMessage(ERRORS.IS_SUITEAPP)]).build();
74
+ }
75
+
76
+ if (!this._calledFromCompareFiles && !this._calledFromUpdate && this._runInInteractiveMode === false) {
77
+ await this._log.info(NodeTranslationService.getMessage(WARNINGS.OVERRIDE));
78
+ }
79
+
80
+ if (this._calledFromCompareFiles) {
81
+ params[COMMAND_OPTIONS.ALLOW_FOR_SUITEAPPS] = '';
82
+ }
83
+
84
+ const executionContextImportObjects = SdkExecutionContext.Builder.forCommand(this._commandMetadata.sdkCommand)
85
+ .integration()
86
+ .addParams(params)
87
+ .build();
88
+
89
+ const operationResult = await executeWithSpinner({
90
+ action: this._sdkExecutor.execute(executionContextImportObjects),
91
+ message: NodeTranslationService.getMessage(MESSAGES.IMPORTING_FILES),
92
+ });
93
+
94
+ if (this._calledFromCompareFiles) {
95
+ params[COMMAND_OPTIONS.CALLED_FROM_COMPARE_FILES] = true;
96
+ }
97
+ if (this._calledFromUpdate) {
98
+ params[COMMAND_OPTIONS.CALLED_FROM_UPDATE] = true;
99
+ }
100
+
101
+ return operationResult.status === SdkOperationResultUtils.STATUS.SUCCESS
102
+ ? ActionResult.Builder.withData(operationResult.data)
103
+ .withResultMessage(operationResult.resultMessage)
104
+ .withCommandParameters(params)
105
+ .build()
106
+ : ActionResult.Builder.withErrors(operationResult.errorMessages).withCommandParameters(params).build();
107
+ } catch (error) {
108
+ const errorMessage = error instanceof CLIException ? error.getErrorMessage() : error;
109
+ return ActionResult.Builder.withErrors([errorMessage]).build();
110
+ }
111
+ }
112
+ };
@@ -0,0 +1,22 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const Command = require('../../Command');
8
+ const ImportFilesAction = require('./ImportFilesAction');
9
+ const ImportFilesInputHandler = require('./ImportFilesInputHandler');
10
+ const ImportFilesOutputHandler = require('./ImportFilesOutputHandler');
11
+
12
+
13
+ module.exports = {
14
+ create(options) {
15
+ return Command.Builder.withOptions(options)
16
+ .withAction(ImportFilesAction)
17
+ .withInput(ImportFilesInputHandler)
18
+ .withOutput(ImportFilesOutputHandler)
19
+ .build();
20
+ }
21
+ };
22
+
@@ -0,0 +1,130 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const CommandUtils = require('../../../utils/CommandUtils');
8
+ const { default: { prompt} } = require('inquirer');
9
+ const NodeTranslationService = require('../../../services/NodeTranslationService');
10
+ const SdkOperationResultUtils = require('../../../utils/SdkOperationResultUtils');
11
+ const AccountFileCabinetService = require('../../../services/AccountFileCabinetService');
12
+ const ProjectInfoService = require('../../../services/ProjectInfoService');
13
+ const { PROJECT_SUITEAPP } = require('../../../ApplicationConstants');
14
+ const { getProjectDefaultAuthId } = require('../../../utils/AuthenticationUtils');
15
+ const BaseInputHandler = require('../../base/BaseInputHandler');
16
+ const SdkExecutor = require('../../../SdkExecutor');
17
+ const { showValidationResults, validateArrayIsNotEmpty } = require('../../../validation/InteractiveAnswersValidator');
18
+ const {
19
+ COMMAND_IMPORTFILES: { ERRORS, QUESTIONS, MESSAGES },
20
+ NO,
21
+ YES,
22
+ } = require('../../../services/TranslationKeys');
23
+
24
+ const SUITE_SCRIPTS_FOLDER = '/SuiteScripts';
25
+ const COMMAND_OPTIONS = {
26
+ AUTH_ID: 'authid',
27
+ FOLDER: 'folder',
28
+ PATHS: 'paths',
29
+ EXCLUDE_PROPERTIES: 'excludeproperties',
30
+ PROJECT: 'project',
31
+ };
32
+
33
+ const COMMAND_ANSWERS = {
34
+ OVERWRITE_FILES: 'overwrite',
35
+ };
36
+
37
+ module.exports = class ImportFilesInputHandler extends BaseInputHandler {
38
+ constructor(options) {
39
+ super(options);
40
+ // TODO input handlers shouldn't execute actions. rework this
41
+ this._sdkExecutor = new SdkExecutor(this._sdkPath, this._executionEnvironmentContext);
42
+
43
+ this._projectInfoService = new ProjectInfoService(this._projectFolder);
44
+ }
45
+
46
+ async getParameters(params) {
47
+ if (this._projectInfoService.getProjectType() === PROJECT_SUITEAPP) {
48
+ throw NodeTranslationService.getMessage(ERRORS.IS_SUITEAPP);
49
+ }
50
+
51
+ const accountFileCabinetService = new AccountFileCabinetService(this._sdkPath, this._executionEnvironmentContext, this._authId);
52
+
53
+ const listFoldersResult = await accountFileCabinetService.getAccountFileCabinetFolders();
54
+ if (listFoldersResult.length === 0) {
55
+ throw NodeTranslationService.getMessage(ERRORS.NO_FOLDERS_FOUND);
56
+ }
57
+
58
+ const selectFolderQuestion = this._generateSelectFolderQuestion(listFoldersResult);
59
+ const selectFolderAnswer = await prompt([selectFolderQuestion]);
60
+ const listFilesResult = await accountFileCabinetService.listFiles(selectFolderAnswer.folder);
61
+
62
+ if (listFilesResult.status === SdkOperationResultUtils.STATUS.ERROR) {
63
+ throw listFilesResult.errorMessages;
64
+ }
65
+ if (Array.isArray(listFilesResult.data) && listFilesResult.data.length === 0) {
66
+ throw SdkOperationResultUtils.getResultMessage(listFilesResult);
67
+ }
68
+
69
+ const selectFilesQuestions = this._generateSelectFilesQuestions(listFilesResult);
70
+ const selectFilesAnswer = await prompt(selectFilesQuestions);
71
+
72
+ const overwriteAnswer = await prompt([this._generateOverwriteQuestion()]);
73
+ if (overwriteAnswer[COMMAND_ANSWERS.OVERWRITE_FILES] === false) {
74
+ throw NodeTranslationService.getMessage(MESSAGES.CANCEL_IMPORT);
75
+ }
76
+
77
+ return selectFilesAnswer;
78
+ }
79
+
80
+ _generateSelectFolderQuestion(listFoldersResult) {
81
+ return {
82
+ type: CommandUtils.INQUIRER_TYPES.LIST,
83
+ name: COMMAND_OPTIONS.FOLDER,
84
+ message: NodeTranslationService.getMessage(QUESTIONS.SELECT_FOLDER),
85
+ default: SUITE_SCRIPTS_FOLDER,
86
+ choices: this._getFileCabinetFolders(listFoldersResult),
87
+ };
88
+ }
89
+
90
+ _getFileCabinetFolders(listFoldersResponse) {
91
+ return listFoldersResponse.map((folderPath) => ({
92
+ name: folderPath,
93
+ value: folderPath,
94
+ }));
95
+ }
96
+
97
+ _generateSelectFilesQuestions(listFilesResult) {
98
+ return [
99
+ {
100
+ type: CommandUtils.INQUIRER_TYPES.CHECKBOX,
101
+ name: COMMAND_OPTIONS.PATHS,
102
+ message: NodeTranslationService.getMessage(QUESTIONS.SELECT_FILES),
103
+ choices: listFilesResult.data.map((path) => ({ name: path, value: path })),
104
+ validate: (fieldValue) => showValidationResults(fieldValue, validateArrayIsNotEmpty),
105
+ },
106
+ {
107
+ type: CommandUtils.INQUIRER_TYPES.LIST,
108
+ name: COMMAND_OPTIONS.EXCLUDE_PROPERTIES,
109
+ message: NodeTranslationService.getMessage(QUESTIONS.EXCLUDE_PROPERTIES),
110
+ choices: [
111
+ { name: NodeTranslationService.getMessage(YES), value: true },
112
+ { name: NodeTranslationService.getMessage(NO), value: false },
113
+ ],
114
+ },
115
+ ];
116
+ }
117
+
118
+ _generateOverwriteQuestion() {
119
+ return {
120
+ type: CommandUtils.INQUIRER_TYPES.LIST,
121
+ name: COMMAND_ANSWERS.OVERWRITE_FILES,
122
+ message: NodeTranslationService.getMessage(QUESTIONS.OVERWRITE_FILES),
123
+ default: true,
124
+ choices: [
125
+ { name: NodeTranslationService.getMessage(YES), value: true },
126
+ { name: NodeTranslationService.getMessage(NO), value: false },
127
+ ],
128
+ };
129
+ }
130
+ };
@@ -0,0 +1,53 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+ const BaseOutputHandler = require('../../base/BaseOutputHandler');
7
+ const NodeTranslationService = require('../../../services/NodeTranslationService');
8
+
9
+ const {
10
+ COMMAND_IMPORTFILES: { OUTPUT },
11
+ } = require('../../../services/TranslationKeys');
12
+
13
+ const COMMAND_OPTIONS_CALLED_FROM_COMPARE_FILES = 'calledfromcomparefiles';
14
+ const COMMAND_OPTIONS_CALLED_FROM_UPDATE = 'calledfromupdate';
15
+
16
+ module.exports = class ImportFilesOutputHandler extends BaseOutputHandler {
17
+ constructor(options) {
18
+ super(options);
19
+ }
20
+
21
+ parse(actionResult) {
22
+ if (Array.isArray(actionResult.data.results)) {
23
+ const successful = actionResult.data.results.filter((result) => result.loaded === true);
24
+ const unsuccessful = actionResult.data.results.filter((result) => result.loaded !== true);
25
+ if (successful.length) {
26
+ if (actionResult.commandParameters[COMMAND_OPTIONS_CALLED_FROM_COMPARE_FILES]) {
27
+ return actionResult;
28
+ }
29
+ if (actionResult.commandParameters[COMMAND_OPTIONS_CALLED_FROM_UPDATE]) {
30
+ this._log.result(NodeTranslationService.getMessage(OUTPUT.FILE_UPDATED));
31
+ } else {
32
+ this._log.result(NodeTranslationService.getMessage(OUTPUT.FILES_IMPORTED));
33
+ }
34
+ successful.forEach((result) => {
35
+ this._log.result(result.path);
36
+ });
37
+ }
38
+ if (unsuccessful.length) {
39
+ if (actionResult.commandParameters[COMMAND_OPTIONS_CALLED_FROM_COMPARE_FILES]) {
40
+ this._log.warning(NodeTranslationService.getMessage(OUTPUT.FILES_NOT_COMPARED));
41
+ } else if (actionResult.commandParameters[COMMAND_OPTIONS_CALLED_FROM_UPDATE]) {
42
+ this._log.warning(NodeTranslationService.getMessage(OUTPUT.FILE_NOT_UPDATED));
43
+ } else {
44
+ this._log.warning(NodeTranslationService.getMessage(OUTPUT.FILES_NOT_IMPORTED));
45
+ }
46
+ unsuccessful.forEach((result) => {
47
+ this._log.warning(`${result.path}, ${result.message}`);
48
+ });
49
+ }
50
+ }
51
+ return actionResult;
52
+ }
53
+ };
@@ -0,0 +1,55 @@
1
+ /*
2
+ ** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
3
+ ** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4
+ */
5
+ 'use strict';
6
+
7
+ const { ActionResult } = require('../../../services/actionresult/ActionResult');
8
+ const SdkExecutionContext = require('../../../SdkExecutionContext');
9
+ const NodeTranslationService = require('../../../services/NodeTranslationService');
10
+ const executeWithSpinner = require('../../../ui/CliSpinner').executeWithSpinner;
11
+ const SdkOperationResultUtils = require('../../../utils/SdkOperationResultUtils');
12
+ const { getProjectDefaultAuthId } = require('../../../utils/AuthenticationUtils');
13
+ const BaseAction = require('../../base/BaseAction');
14
+ const {
15
+ COMMAND_LISTFILES: { LOADING_FILES },
16
+ } = require('../../../services/TranslationKeys');
17
+
18
+ const COMMAND_OPTIONS = {
19
+ AUTH_ID: 'authid'
20
+ }
21
+
22
+ module.exports = class ListFilesAction extends BaseAction {
23
+ constructor(options) {
24
+ super(options);
25
+ }
26
+
27
+ preExecute(args) {
28
+ return args;
29
+ }
30
+
31
+ async execute(params) {
32
+ try {
33
+ // quote folder path to preserve spaces
34
+ params.folder = `\"${params.folder}\"`;
35
+ const executionContext = SdkExecutionContext.Builder.forCommand(this._commandMetadata.sdkCommand)
36
+ .integration()
37
+ .addParams(params)
38
+ .build();
39
+
40
+ const operationResult = await executeWithSpinner({
41
+ action: this._sdkExecutor.execute(executionContext),
42
+ message: NodeTranslationService.getMessage(LOADING_FILES),
43
+ });
44
+
45
+ return operationResult.status === SdkOperationResultUtils.STATUS.SUCCESS
46
+ ? ActionResult.Builder.withData(operationResult.data)
47
+ .withResultMessage(operationResult.resultMessage)
48
+ .withCommandParameters(params)
49
+ .build()
50
+ : ActionResult.Builder.withErrors(operationResult.errorMessages).withCommandParameters(params).build();
51
+ } catch (error) {
52
+ return ActionResult.Builder.withErrors([error]).build();
53
+ }
54
+ }
55
+ };