@webos-tools/cli 3.0.0

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 (177) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc.js +52 -0
  3. package/APIs.js +79 -0
  4. package/CHANGELOG.md +110 -0
  5. package/LICENSE +201 -0
  6. package/README.md +218 -0
  7. package/bin/ares-config.js +199 -0
  8. package/bin/ares-device-info.js +30 -0
  9. package/bin/ares-device.js +219 -0
  10. package/bin/ares-generate.js +270 -0
  11. package/bin/ares-inspect.js +179 -0
  12. package/bin/ares-install.js +223 -0
  13. package/bin/ares-launch.js +318 -0
  14. package/bin/ares-log.js +255 -0
  15. package/bin/ares-novacom.js +223 -0
  16. package/bin/ares-package.js +336 -0
  17. package/bin/ares-pull.js +156 -0
  18. package/bin/ares-push.js +155 -0
  19. package/bin/ares-server.js +174 -0
  20. package/bin/ares-setup-device.js +520 -0
  21. package/bin/ares-shell.js +132 -0
  22. package/bin/ares.js +166 -0
  23. package/files/conf/ares.json +49 -0
  24. package/files/conf/command-service.json +73 -0
  25. package/files/conf/config.json +22 -0
  26. package/files/conf/ipk.json +30 -0
  27. package/files/conf/novacom-devices.json +35 -0
  28. package/files/conf/query/query-app.json +14 -0
  29. package/files/conf/query/query-hosted.json +18 -0
  30. package/files/conf/query/query-package.json +10 -0
  31. package/files/conf/query/query-service.json +6 -0
  32. package/files/conf/sdk.json +8 -0
  33. package/files/conf/template.json +57 -0
  34. package/files/conf/webos_emul +27 -0
  35. package/files/conf-base/env/sdk-ose.json +8 -0
  36. package/files/conf-base/env/sdk-tv.json +8 -0
  37. package/files/conf-base/profile/config-ose.json +21 -0
  38. package/files/conf-base/profile/config-tv.json +22 -0
  39. package/files/conf-base/query/query-app.json +14 -0
  40. package/files/conf-base/query/query-hosted.json +18 -0
  41. package/files/conf-base/query/query-package.json +10 -0
  42. package/files/conf-base/query/query-service.json +6 -0
  43. package/files/conf-base/template-conf/ose-templates.json +67 -0
  44. package/files/conf-base/template-conf/tv-sdk-templates.json +57 -0
  45. package/files/help/ares-config.help +43 -0
  46. package/files/help/ares-device.help +94 -0
  47. package/files/help/ares-generate.help +65 -0
  48. package/files/help/ares-inspect.help +70 -0
  49. package/files/help/ares-install.help +90 -0
  50. package/files/help/ares-launch.help +100 -0
  51. package/files/help/ares-log-pmlogd.help +84 -0
  52. package/files/help/ares-log.help +101 -0
  53. package/files/help/ares-novacom.help +68 -0
  54. package/files/help/ares-package.help +101 -0
  55. package/files/help/ares-pull.help +38 -0
  56. package/files/help/ares-push.help +38 -0
  57. package/files/help/ares-server.help +39 -0
  58. package/files/help/ares-setup-device.help +75 -0
  59. package/files/help/ares-shell.help +42 -0
  60. package/files/help/ares.help +47 -0
  61. package/files/help/readme.help +23 -0
  62. package/files/schema/ApplicationDescription.schema +319 -0
  63. package/files/schema/NovacomDevices.schema +61 -0
  64. package/files/templates/ose-sdk-templates/appinfo/appinfo.json +10 -0
  65. package/files/templates/ose-sdk-templates/bootplate-web/index.html +88 -0
  66. package/files/templates/ose-sdk-templates/hosted-webapp/index.html +14 -0
  67. package/files/templates/ose-sdk-templates/icon/icon.png +0 -0
  68. package/files/templates/ose-sdk-templates/js-service/helloclient.js +31 -0
  69. package/files/templates/ose-sdk-templates/js-service/helloworld_webos_service.js +188 -0
  70. package/files/templates/ose-sdk-templates/qml-app/main.qml +68 -0
  71. package/files/templates/ose-sdk-templates/qmlappinfo/appinfo.json +10 -0
  72. package/files/templates/ose-sdk-templates/serviceinfo/package.json +11 -0
  73. package/files/templates/ose-sdk-templates/serviceinfo/services.json +8 -0
  74. package/files/templates/tv-sdk-templates/appinfo/appinfo.json +10 -0
  75. package/files/templates/tv-sdk-templates/bootplate-web/index.html +58 -0
  76. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/LICENSE-2.0.txt +202 -0
  77. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/webOSTV-dev.js +1 -0
  78. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/webOSTV.js +1 -0
  79. package/files/templates/tv-sdk-templates/hosted-webapp/index.html +14 -0
  80. package/files/templates/tv-sdk-templates/js-service/helloworld_service.js +37 -0
  81. package/files/templates/tv-sdk-templates/packageinfo/packageinfo.json +4 -0
  82. package/files/templates/tv-sdk-templates/serviceinfo/package.json +11 -0
  83. package/files/templates/tv-sdk-templates/serviceinfo/services.json +8 -0
  84. package/files/templates/tv-sdk-templates/webicon/icon.png +0 -0
  85. package/files/templates/tv-sdk-templates/webicon/largeIcon.png +0 -0
  86. package/lib/base/ares.html +40 -0
  87. package/lib/base/cli-appdata.js +289 -0
  88. package/lib/base/cli-control.js +44 -0
  89. package/lib/base/common-tools.js +29 -0
  90. package/lib/base/error-handler.js +265 -0
  91. package/lib/base/file-watcher.js +155 -0
  92. package/lib/base/help-format.js +147 -0
  93. package/lib/base/luna.js +178 -0
  94. package/lib/base/novacom.js +1191 -0
  95. package/lib/base/sdkenv.js +59 -0
  96. package/lib/base/server.js +137 -0
  97. package/lib/base/setup-device.js +324 -0
  98. package/lib/base/version-tools.js +79 -0
  99. package/lib/com.sdk.ares.hostedapp.ipk +0 -0
  100. package/lib/device.js +1419 -0
  101. package/lib/generator.js +377 -0
  102. package/lib/inspect.js +494 -0
  103. package/lib/install.js +463 -0
  104. package/lib/launch.js +605 -0
  105. package/lib/log.js +584 -0
  106. package/lib/package.js +2129 -0
  107. package/lib/pull.js +231 -0
  108. package/lib/pusher.js +210 -0
  109. package/lib/session.js +74 -0
  110. package/lib/shell.js +193 -0
  111. package/lib/tar-filter-pack.js +62 -0
  112. package/lib/util/copy.js +31 -0
  113. package/lib/util/createFileName.js +40 -0
  114. package/lib/util/eof.js +30 -0
  115. package/lib/util/json.js +63 -0
  116. package/lib/util/merge.js +14 -0
  117. package/lib/util/objclone.js +40 -0
  118. package/lib/util/spinner.js +37 -0
  119. package/npm-shrinkwrap.json +85 -0
  120. package/package.json +98 -0
  121. package/spec/helpers/reporter.js +65 -0
  122. package/spec/jsSpecs/apiTest/generator.spec.js +372 -0
  123. package/spec/jsSpecs/apiTest/inspector.spec.js +89 -0
  124. package/spec/jsSpecs/apiTest/installer.spec.js +67 -0
  125. package/spec/jsSpecs/apiTest/launcher.spec.js +150 -0
  126. package/spec/jsSpecs/apiTest/packager.spec.js +194 -0
  127. package/spec/jsSpecs/apiTest/puller.spec.js +101 -0
  128. package/spec/jsSpecs/apiTest/pusher.spec.js +103 -0
  129. package/spec/jsSpecs/apiTest/server.spec.js +115 -0
  130. package/spec/jsSpecs/apiTest/setupDevice.spec.js +93 -0
  131. package/spec/jsSpecs/apiTest/shell.spec.js +49 -0
  132. package/spec/jsSpecs/ares-config.spec.js +78 -0
  133. package/spec/jsSpecs/ares-device.spec.js +443 -0
  134. package/spec/jsSpecs/ares-generate.spec.js +397 -0
  135. package/spec/jsSpecs/ares-inspect.spec.js +252 -0
  136. package/spec/jsSpecs/ares-install.spec.js +150 -0
  137. package/spec/jsSpecs/ares-launch.spec.js +301 -0
  138. package/spec/jsSpecs/ares-log.spec.js +824 -0
  139. package/spec/jsSpecs/ares-novacom.spec.js +149 -0
  140. package/spec/jsSpecs/ares-package.spec.js +1211 -0
  141. package/spec/jsSpecs/ares-pull.spec.js +157 -0
  142. package/spec/jsSpecs/ares-push.spec.js +146 -0
  143. package/spec/jsSpecs/ares-server.spec.js +160 -0
  144. package/spec/jsSpecs/ares-setup-device.spec.js +281 -0
  145. package/spec/jsSpecs/ares-shell.spec.js +220 -0
  146. package/spec/jsSpecs/ares.spec.js +83 -0
  147. package/spec/jsSpecs/common-spec.js +169 -0
  148. package/spec/support/jasmine.json +22 -0
  149. package/spec/tempFiles/com.jasmine.native.app_0.0.1_arm.ipk +0 -0
  150. package/spec/tempFiles/com.jasmine.native.app_0.0.1_x86.ipk +0 -0
  151. package/spec/tempFiles/com.jasmine.web.app_0.0.1_all.ipk +0 -0
  152. package/spec/tempFiles/com.logtest.web.app_1.0.0_all.ipk +0 -0
  153. package/spec/tempFiles/copyFiles/helloFile.txt +1 -0
  154. package/spec/tempFiles/copyFiles/testFile.txt +1 -0
  155. package/spec/tempFiles/ipks/com.sample.echo_0.0.1_all.ipk +0 -0
  156. package/spec/tempFiles/ipks/com.web.app_1.0.0_all.ipk +0 -0
  157. package/spec/tempFiles/nativeApp/auto/pkg_arm64/GLES2 +0 -0
  158. package/spec/tempFiles/nativeApp/auto/pkg_arm64/appinfo.json +9 -0
  159. package/spec/tempFiles/nativeApp/auto/pkg_arm64/icon.png +0 -0
  160. package/spec/tempFiles/nativeApp/auto/pkg_arm64/largeIcon.png +0 -0
  161. package/spec/tempFiles/nativeApp/ose/pkg_arm/Hello +0 -0
  162. package/spec/tempFiles/nativeApp/ose/pkg_arm/appinfo.json +9 -0
  163. package/spec/tempFiles/nativeApp/ose/pkg_arm/icon.png +0 -0
  164. package/spec/tempFiles/nativeApp/ose/pkg_arm/largeIcon.png +0 -0
  165. package/spec/tempFiles/nativeApp/ose/pkg_arm/package.properties +2 -0
  166. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/Hello +0 -0
  167. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/appinfo.json +9 -0
  168. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/icon.png +0 -0
  169. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/largeIcon.png +0 -0
  170. package/spec/tempFiles/nativeApp/rsi/pkg_x86/GLES2 +0 -0
  171. package/spec/tempFiles/nativeApp/rsi/pkg_x86/appinfo.json +9 -0
  172. package/spec/tempFiles/nativeApp/rsi/pkg_x86/icon.png +0 -0
  173. package/spec/tempFiles/nativeApp/rsi/pkg_x86/largeIcon.png +0 -0
  174. package/spec/tempFiles/sign/sign.crt +32 -0
  175. package/spec/tempFiles/sign/signPriv.key +52 -0
  176. package/spec/test_data/ares-generate.json +41 -0
  177. package/spec/test_data/ares.json +33 -0
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env node
2
+
3
+ /*
4
+ * Copyright (c) 2020-2024 LG Electronics Inc.
5
+ *
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+
9
+ const path = require('path'),
10
+ log = require('npmlog'),
11
+ nopt = require('nopt'),
12
+ async = require('async'),
13
+ novacom = require('./../lib/base/novacom'),
14
+ commonTools = require('./../lib/base/common-tools');
15
+
16
+ const version = commonTools.version,
17
+ cliControl = commonTools.cliControl,
18
+ help = commonTools.help,
19
+ setupDevice = commonTools.setupDevice,
20
+ appdata = commonTools.appdata,
21
+ errHndl = commonTools.errMsg;
22
+
23
+ const processName = path.basename(process.argv[1], '.js');
24
+
25
+ process.on('uncaughtException', function(err) {
26
+ log.error('uncaughtException', err.toString());
27
+ log.verbose('uncaughtException', err.stack);
28
+ cliControl.end(-1);
29
+ });
30
+
31
+ const knownOpts = {
32
+ // generic options
33
+ "help": Boolean,
34
+ "hidden-help": Boolean,
35
+ "level": ['silly', 'verbose', 'info', 'http', 'warn', 'error'],
36
+ "version": Boolean,
37
+ // command-specific options
38
+ "device-list": Boolean,
39
+ "forward": Boolean,
40
+ "port": [String, Array],
41
+ "getkey": Boolean,
42
+ "passphrase": [String, null],
43
+ "device": [String, null],
44
+ "run": [String, null],
45
+ // no shortHands
46
+ "put": [String, null],
47
+ "get": [String, null]
48
+ };
49
+
50
+ const shortHands = {
51
+ // generic aliases
52
+ "h": ["--help"],
53
+ "hh": ["--hidden-help"],
54
+ "v": ["--level", "verbose"],
55
+ "V": ["--version"],
56
+ // command-specific aliases
57
+ "D": ["--device-list"],
58
+ "f": ["--forward"],
59
+ "p": ["--port"],
60
+ "k": ["--getkey"],
61
+ "pass": ["--passphrase"],
62
+ "d": ["--device"],
63
+ "r": ["--run"]
64
+ };
65
+
66
+ const argv = nopt(knownOpts, shortHands, process.argv, 2 /* drop 'node' & 'ares-*.js' */);
67
+
68
+ log.heading = processName;
69
+ log.level = argv.level || 'warn';
70
+ log.verbose("argv", argv);
71
+
72
+ const curConfigData = appdata.getConfig(true);
73
+ if (curConfigData.profile !== "tv") {
74
+ return finish(errHndl.getErrMsg("NOT_SUPPORT_COMMOND", curConfigData.profile));
75
+ }
76
+
77
+ const options = {
78
+ name: argv.device
79
+ };
80
+
81
+ let op;
82
+ if (argv['device-list']) {
83
+ setupDevice.showDeviceList(finish);
84
+ } else if (argv.getkey) {
85
+ op = getkey;
86
+ } else if (argv.run) {
87
+ op = run;
88
+ } else if (argv.forward) {
89
+ op = forward;
90
+ } else if (argv.version) {
91
+ version.showVersionAndExit();
92
+ } else {
93
+ if (argv['hidden-help']) {
94
+ help.display(processName, appdata.getConfig(true).profile, true);
95
+ } else {
96
+ help.display(processName, appdata.getConfig(true).profile, false);
97
+ }
98
+ cliControl.end();
99
+ }
100
+
101
+ if (op) {
102
+ version.checkNodeVersion(function() {
103
+ async.series([
104
+ op.bind(this)
105
+ ], finish);
106
+ });
107
+ }
108
+
109
+ function getkey(next) {
110
+ const resolver = new novacom.Resolver();
111
+ async.waterfall([
112
+ resolver.load.bind(resolver),
113
+ resolver.getSshPrvKey.bind(resolver, options),
114
+ function(keyFileName, next) {
115
+ if (keyFileName) {
116
+ if (argv.passphrase) {
117
+ return next(null, keyFileName, argv.passphrase);
118
+ }
119
+ process.stdin.resume();
120
+ process.stdin.setEncoding('utf8');
121
+ process.stdout.write('input passphrase [default: webos]:');
122
+ process.stdin.on('data', function(text) {
123
+ let passphrase = text.toString().trim();
124
+ if (passphrase === '') {
125
+ passphrase = 'webos';
126
+ }
127
+ log.info('registered passphrase is ', passphrase);
128
+ next(null, keyFileName, passphrase);
129
+ });
130
+ } else {
131
+ return next(new Error("Error getting key file from the device"));
132
+ }
133
+ },
134
+ function(keyFileName, passphrase, next) {
135
+ const target = {};
136
+ target.name = options.name;
137
+ target.privateKey = {
138
+ "openSsh": keyFileName
139
+ };
140
+ target.passphrase = passphrase;
141
+ target.files = 'sftp';
142
+ target.port = '9922';
143
+ target.username = 'prisoner';
144
+ target.password = '@DELETE@';
145
+ next(null, target);
146
+ },
147
+ resolver.modifyDeviceFile.bind(resolver, 'modify')
148
+ ], function(err) {
149
+ if (err)
150
+ return next(err);
151
+ next(null, {
152
+ "msg": "Success"
153
+ });
154
+ });
155
+ }
156
+
157
+ function run(next) {
158
+ if (argv.run === 'true') {
159
+ finish(errHndl.getErrMsg("EMPTY_VALUE", "DEVICE_COMMAND"));
160
+ } else {
161
+ const printTarget = true;
162
+ options.session = new novacom.Session(options, printTarget, function(err) {
163
+ if (err) {
164
+ next(err);
165
+ return;
166
+ }
167
+ options.session.run(argv.run, process.stdin, process.stdout, process.stderr, next);
168
+ });
169
+ }
170
+ }
171
+
172
+ function forward(next) {
173
+ if (!argv.port || argv.port.toString() === 'true') {
174
+ finish(errHndl.getErrMsg("EMPTY_VALUE", "DEVICE_PORT:HOST_PORT"));
175
+ } else {
176
+ const tasks = [
177
+ function(next) {
178
+ const printTarget = true;
179
+ options.session = new novacom.Session(options, printTarget, next);
180
+ }
181
+ ];
182
+ try {
183
+ argv.port.forEach(function(portStr) {
184
+ const portArr = portStr.split(':');
185
+ const devicePort = parseInt(portArr[0], 10);
186
+ const localPort = parseInt(portArr[1], 10) || devicePort;
187
+ tasks.push(function(next) {
188
+ options.session.forward(devicePort, localPort, next);
189
+ });
190
+ tasks.push(function() {
191
+ console.log('forward', 'running...');
192
+ });
193
+ });
194
+ } catch (err) {
195
+ next(err);
196
+ return;
197
+ }
198
+ async.series(tasks, next);
199
+ }
200
+ }
201
+
202
+ function finish(err, value) {
203
+ if (err) {
204
+ // handle err from getErrMsg()
205
+ if (Array.isArray(err) && err.length > 0) {
206
+ for (const index in err) {
207
+ log.error(err[index].heading, err[index].message);
208
+ }
209
+ log.verbose(err[0].stack);
210
+ } else {
211
+ // handle general err (string & object)
212
+ log.error(err.toString());
213
+ log.verbose(err.stack);
214
+ }
215
+ cliControl.end(-1);
216
+ } else {
217
+ log.info('finish():', value);
218
+ if (value && value.msg) {
219
+ console.log(value.msg);
220
+ }
221
+ cliControl.end();
222
+ }
223
+ }
@@ -0,0 +1,336 @@
1
+ #!/usr/bin/env node
2
+
3
+ /*
4
+ * Copyright (c) 2020-2024 LG Electronics Inc.
5
+ *
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+
9
+ const async = require('async'),
10
+ nopt = require('nopt'),
11
+ log = require('npmlog'),
12
+ path = require('path'),
13
+ packageLib = require('../lib/package'),
14
+ commonTools = require('./../lib/base/common-tools'),
15
+ errHndl = require('./../lib/base/error-handler');
16
+
17
+ const cliControl = commonTools.cliControl,
18
+ version = commonTools.version,
19
+ help = commonTools.help,
20
+ appdata = commonTools.appdata;
21
+
22
+ const processName = path.basename(process.argv[1]).replace(/.js/, '');
23
+
24
+ process.on('uncaughtException', function(err) {
25
+ log.error('uncaughtException', err.toString());
26
+ log.verbose('uncaughtException', err.stack);
27
+ cliControl.end(-1);
28
+ });
29
+
30
+ if (process.argv.length === 2) {
31
+ process.argv.splice(2, 0, '--help');
32
+ }
33
+
34
+ function PalmPackage() {
35
+ this.destination = '.';
36
+ this.options = {};
37
+ this.appCnt = 0;
38
+ this.dirCounts = {};
39
+
40
+ const knownOpts = {
41
+ "help": Boolean,
42
+ "hidden-help": Boolean,
43
+ "version": Boolean,
44
+ "level": ['silly', 'verbose', 'info', 'http', 'warn', 'error'],
45
+ "outdir": path,
46
+ "check": Boolean,
47
+ "no-minify": Boolean,
48
+ "app-exclude": [String, Array],
49
+ "rom": Boolean,
50
+ "encrypt": Boolean,
51
+ "sign": String,
52
+ "certificate": String,
53
+ "force": Boolean,
54
+ "pkgid": String,
55
+ "pkgversion": String,
56
+ "pkginfofile": String,
57
+ "info": String,
58
+ "info-detail": String
59
+ };
60
+
61
+ const shortHands = {
62
+ "h": "--help",
63
+ "hh": "--hidden-help",
64
+ "V": "--version",
65
+ "o": "--outdir",
66
+ "c": "--check",
67
+ "n": "--no-minify",
68
+ "e": "--app-exclude",
69
+ "r": "--rom",
70
+ "enc": "--encrypt",
71
+ "s": "--sign",
72
+ "crt": "--certificate",
73
+ "f": "--force",
74
+ "pi": "--pkgid",
75
+ "pv": "--pkgversion",
76
+ "pf": "--pkginfofile",
77
+ "i": "--info",
78
+ "I": "--info-detail",
79
+ "v": ["--level", "verbose"]
80
+ };
81
+
82
+ this.argv = nopt(knownOpts, shortHands, process.argv, 2 /* drop 'node' & basename*/);
83
+
84
+ this.hiddenhelpString = [
85
+ "",
86
+ "EXTRA-OPTION",
87
+ help.format("-f, --force", "Make .ipk package forcibly with same file structure in APP_DIR"),
88
+ help.format("","If file/directories in APP_DIR consists of the following structure"),
89
+ help.format("\t (ex) APP_DIR/"),
90
+ help.format("\t +-- usr/"),
91
+ help.format("\t +-- usr/bin"),
92
+ help.format("\t +-- usr/bin/foo"),
93
+ help.format("\t +-- etc/"),
94
+ help.format("\t +-- etc/boo.conf"),
95
+ help.format("","'-f, --force' option will keep this structure in .ipk"),
96
+ "",
97
+ help.format("-pn, --pkgname <NAME>", "Set package name"),
98
+ help.format("-pv, --pkgversion <VERSION>", "Set package version"),
99
+ "EXAMPLES",
100
+ "",
101
+ "# Create a package although directory has no appinfo.json and no services.json",
102
+ " make a ipk file which of package name is 'foopkg' and package version is '1.0.1'",
103
+ " the following command should generate a foopkg_1.0.1.ipk",
104
+ processName+" APP_DIR -f -pn foopkg -pv 1.0.1",
105
+ ""
106
+ ];
107
+
108
+ log.heading = processName;
109
+ log.level = this.argv.level || 'warn';
110
+ log.verbose("argv", this.argv);
111
+
112
+ /**
113
+ * For consistent of "$command -v", argv is used.
114
+ * By nopt, argv is parsed and set key-value in argv object.
115
+ * If -v or --level option is input with command, it is set key-value in argv.
116
+ * After it is deleted, If remained key is only one in argv object
117
+ * (If any other are remained, it's mean another options is input)
118
+ * and there is no remaining after parsing the input command by nopt
119
+ * (If any other are remained, it's mean another parameters ares input),
120
+ * each command of webOS CLI print help message with log message.
121
+ */
122
+ if (this.argv.level) {
123
+ delete this.argv.level;
124
+ if (this.argv.argv.remain.length === 0 && (Object.keys(this.argv)).length === 1) {
125
+ this.argv.help = true;
126
+ }
127
+ }
128
+ }
129
+
130
+ PalmPackage.prototype = {
131
+ unsupportedOptions: {
132
+ "noclean": 1, // Do not cleanup temporary directories - For debug only
133
+ "force": 1
134
+ },
135
+
136
+ showUsage: function(hiddenFlag, exitCode) {
137
+ if (exitCode === undefined) {
138
+ exitCode = 0;
139
+ }
140
+ if (hiddenFlag) {
141
+ help.display(processName, appdata.getConfig(true).profile, hiddenFlag);
142
+ } else {
143
+ help.display(processName, appdata.getConfig(true).profile);
144
+ }
145
+ cliControl.end(exitCode);
146
+ },
147
+
148
+ checkAndShowHelp: function() {
149
+ if (this.argv.help) {
150
+ this.showUsage(false, 0);
151
+ } else if (this.argv["hidden-help"]) {
152
+ this.showUsage(true, 0);
153
+ }
154
+ },
155
+
156
+ handleOptions: function() {
157
+ this.options.level = log.level;
158
+
159
+ // Pass unsupported options verbatim thru the options Object -- TODO: TBR
160
+ for (const key in this.argv) {
161
+ if (this.unsupportedOptions[key]) {
162
+ this.options[key] = this.argv[key];
163
+ }
164
+ }
165
+
166
+ if (Object.hasOwnProperty.call(this.argv, 'minify')) {
167
+ this.options.minify = this.argv.minify;
168
+ } else {
169
+ this.options.minify = true;
170
+ }
171
+
172
+ if (Object.hasOwnProperty.call(this.argv, 'app-exclude')) {
173
+ this.options.excludefiles = this.argv['app-exclude'];
174
+ }
175
+
176
+ if (Object.hasOwnProperty.call(this.argv, 'rom')) {
177
+ this.options.rom = this.argv.rom;
178
+ } else {
179
+ this.options.rom = false;
180
+ }
181
+
182
+ if (Object.hasOwnProperty.call(this.argv, 'encrypt')) {
183
+ this.options.encrypt = this.argv.encrypt;
184
+ } else {
185
+ this.options.encrypt = false;
186
+ }
187
+
188
+ if (Object.hasOwnProperty.call(this.argv, 'sign')) {
189
+ this.options.sign = this.argv.sign;
190
+ }
191
+
192
+ if (Object.hasOwnProperty.call(this.argv, 'certificate')) {
193
+ this.options.certificate = this.argv.certificate;
194
+ }
195
+
196
+ if (Object.hasOwnProperty.call(this.argv, 'pkgid')) {
197
+ this.options.pkgid = this.argv.pkgid;
198
+ }
199
+
200
+ if (Object.hasOwnProperty.call(this.argv, 'pkgversion')) {
201
+ this.options.pkgversion = this.argv.pkgversion;
202
+ }
203
+
204
+ if (Object.hasOwnProperty.call(this.argv, 'pkginfofile')) {
205
+ this.options.pkginfofile = this.argv.pkginfofile;
206
+ }
207
+
208
+ if (Object.hasOwnProperty.call(this.argv, 'info-detail')) {
209
+ this.options.infodetail = this.argv['info-detail'];
210
+ }
211
+
212
+ if (Object.hasOwnProperty.call(this.argv, 'info')) {
213
+ this.options.info = this.argv.info;
214
+ }
215
+ },
216
+
217
+ setOutputDir: function(next) {
218
+ log.info("setOutputDir()");
219
+ if (this.argv.outdir) {
220
+ this.destination = this.argv.outdir;
221
+ }
222
+
223
+ if (this.destination === '.') {
224
+ this.destination = process.cwd();
225
+ }
226
+ next();
227
+ },
228
+
229
+ checkInputDir: function(next) {
230
+ log.info("checkInputDir()");
231
+ const packager = new packageLib.Packager();
232
+ this.dirCounts = packager.checkInputDirectories(this.argv.argv.remain, this.options, next);
233
+ },
234
+
235
+ packageApp: function(next) {
236
+ log.info("packageApp()");
237
+ const packager = new packageLib.Packager();
238
+ if (this.dirCounts.app === 0) { // packaging without app
239
+ if (Object.prototype.hasOwnProperty.call(this.options, 'pkginfofile') && Object.prototype.hasOwnProperty.call(this.options, 'pkgid')) {
240
+ this.finish(errHndl.getErrMsg("NOT_USE_WITH_OPTIONS", "pkginfofile, pkgid"));
241
+ cliControl.end(-1);
242
+ } else if (Object.prototype.hasOwnProperty.call(this.options, 'pkgid') || Object.prototype.hasOwnProperty.call(this.options, 'pkginfofile')) {
243
+ if (this.dirCounts.resource > 0) {
244
+ packager.resourcePackaging(this.argv.argv.remain, this.destination, this.options, this.outputTxt, next);
245
+ } else {
246
+ packager.servicePackaging(this.argv.argv.remain, this.destination, this.options, this.outputTxt, next);
247
+ }
248
+ } else {
249
+ this.finish(errHndl.getErrMsg("USE_PKGID_PKGINFO"));
250
+ cliControl.end(-1);
251
+ }
252
+ } else { // packaging with app
253
+ if (Object.prototype.hasOwnProperty.call(this.options, 'pkgversion')) {
254
+ this.finish(errHndl.getErrMsg("NOT_PACKAGE_WITH_OPTION", "pkgversion"));
255
+ }
256
+ packager.generatePackage(this.argv.argv.remain, this.destination, this.options, this.outputTxt, next);
257
+ }
258
+ },
259
+
260
+ packageProject: function() {
261
+ async.series([
262
+ version.checkNodeVersion,
263
+ this.setOutputDir.bind(this),
264
+ this.checkInputDir.bind(this),
265
+ this.packageApp.bind(this)
266
+ ], this.finish.bind(this));
267
+ },
268
+
269
+ checkApplication: function() {
270
+ async.series([
271
+ version.checkNodeVersion,
272
+ this.checkInputDir.bind(this)
273
+ ], function(err) {
274
+ if (err) {
275
+ return this.finish(err);
276
+ }
277
+ return this.finish(null, {msg: "no problems detected"});
278
+ }.bind(this));
279
+ },
280
+
281
+ showPkgInfo: function() {
282
+ log.info("showPkgInfo()");
283
+ const packager = new packageLib.Packager();
284
+ packager.analyzeIPK(this.options, this.finish);
285
+ },
286
+
287
+ finish: function(err, value) {
288
+ log.info("finish()");
289
+ if (err) {
290
+ // handle err from getErrMsg()
291
+ if (Array.isArray(err) && err.length > 0) {
292
+ for (const index in err) {
293
+ log.error(err[index].heading, err[index].message);
294
+ }
295
+ log.verbose(err[0].stack);
296
+ } else {
297
+ // handle general err (string & object)
298
+ log.error(err.toString());
299
+ log.verbose(err.stack);
300
+ }
301
+ cliControl.end(-1);
302
+ } else {
303
+ log.verbose("finish()", "value:", value);
304
+ if (value && value[value.length-1] && value[value.length-1].msg) {
305
+ console.log(value[value.length-1].msg);
306
+ } else if (value && value.msg) {
307
+ console.log(value.msg);
308
+ }
309
+ cliControl.end();
310
+ }
311
+ },
312
+
313
+ outputTxt: function(value) {
314
+ log.info("outputTxt()");
315
+ console.log(value);
316
+ },
317
+
318
+ exec: function() {
319
+ this.handleOptions();
320
+ this.checkAndShowHelp();
321
+
322
+ if (this.argv.check) {
323
+ this.checkApplication();
324
+ } else if (this.argv.version) {
325
+ version.showVersionAndExit();
326
+ } else if (this.argv.info || this.argv['info-detail']) {
327
+ this.showPkgInfo();
328
+ } else {
329
+ this.packageProject();
330
+ }
331
+ }
332
+ };
333
+
334
+ // Main
335
+ const cmd = new PalmPackage();
336
+ cmd.exec();