@24i/smartapps-bigscreen-rnv-build-engine 0.0.2-alpha.1321 → 0.0.2-alpha.1323

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 (64) hide show
  1. package/dist/src/index.js +3 -1
  2. package/dist/src/tasks/deploy/aswS3/deployS3.js +3 -2
  3. package/dist/src/tasks/deploy/hbbtv/deployHbbtv.js +12 -9
  4. package/dist/src/tasks/task.rnv.build.js +17 -15
  5. package/dist/src/tasks/task.rnv.configure.js +3 -1
  6. package/dist/src/tasks/task.rnv.configureSoft.js +3 -1
  7. package/dist/src/tasks/task.rnv.deploy.js +5 -2
  8. package/dist/src/tasks/task.rnv.hooks.run.js +4 -2
  9. package/dist/src/utils/forEachSupportedPlatformFlavour.js +8 -8
  10. package/dist/src/utils/getBaseConfig.js +5 -3
  11. package/dist/src/utils/getDeployLocations.js +1 -3
  12. package/dist/src/utils/getVersionOffset.js +4 -4
  13. package/dist/src/utils/replaceRelevantStringsInConfig/replaceTemplateString.js +2 -2
  14. package/engine/src/enginePlatforms.js +16 -0
  15. package/engine/src/index.js +67 -0
  16. package/engine/src/scripts/buildAllWithScheme.js +29 -0
  17. package/engine/src/scripts/gitReleaser/afterVersionBump.js +24 -0
  18. package/engine/src/scripts/gitReleaser/beforeVersionBump.js +15 -0
  19. package/engine/src/scripts/gitReleaser/checkReleaseNotes.js +22 -0
  20. package/engine/src/scripts/gitReleaser/pushRelease.js +41 -0
  21. package/engine/src/scripts/gitReleaser/pushReleaseCandidate.js +8 -0
  22. package/engine/src/scripts/gitReleaser/pushReleaseNotes.js +53 -0
  23. package/engine/src/scripts/release/deleteSourceMaps.js +14 -0
  24. package/engine/src/scripts/release/deployToAppCenter.js +79 -0
  25. package/engine/src/scripts/release/githubRelease.js +138 -0
  26. package/engine/src/scripts/release/notifySlack/makePayload.js +103 -0
  27. package/engine/src/scripts/release/notifySlack/notifySlack.js +26 -0
  28. package/engine/src/scripts/release/notifySlack/slackBlockKitBuilder.js +44 -0
  29. package/engine/src/scripts/release/sentryRelease.js +79 -0
  30. package/engine/src/scripts/release/urlsMarkdown.js +85 -0
  31. package/engine/src/scripts/releaseAllWithScheme.js +91 -0
  32. package/engine/src/scripts/utils/cmdUtils.js +16 -0
  33. package/engine/src/scripts/utils/fsUtils.js +14 -0
  34. package/engine/src/scripts/utils/gitUtils.js +94 -0
  35. package/engine/src/scripts/utils/index.js +11 -0
  36. package/engine/src/scripts/utils/stringUtils.js +5 -0
  37. package/engine/src/sdks/index.js +22 -0
  38. package/engine/src/sdks/sdk-tizen/index.js +287 -0
  39. package/engine/src/sdks/sdk-webos/index.js +201 -0
  40. package/engine/src/sdks/sdk-webpack/index.js +45 -0
  41. package/engine/src/sdks/sdkUtils.js +22 -0
  42. package/engine/src/tasks/deploy/aswS3/aws.js +27 -0
  43. package/engine/src/tasks/deploy/aswS3/deployS3.js +71 -0
  44. package/engine/src/tasks/deploy/hbbtv/deployHbbtv.js +144 -0
  45. package/engine/src/tasks/engineTasks.js +23 -0
  46. package/engine/src/tasks/task.rnv.build.js +126 -0
  47. package/engine/src/tasks/task.rnv.configure.js +52 -0
  48. package/engine/src/tasks/task.rnv.configureSoft.js +31 -0
  49. package/engine/src/tasks/task.rnv.deploy.js +40 -0
  50. package/engine/src/tasks/task.rnv.hooks.run.js +61 -0
  51. package/engine/src/tasks/task.rnv.package.js +27 -0
  52. package/engine/src/tasks/task.rnv.project.configure.js +109 -0
  53. package/engine/src/tasks/task.rnv.start.js +52 -0
  54. package/engine/src/utils/forEachSupportedPlatformFlavour.js +29 -0
  55. package/engine/src/utils/getBaseConfig.js +57 -0
  56. package/engine/src/utils/getDeployLocations.js +78 -0
  57. package/engine/src/utils/getVersionOffset.js +39 -0
  58. package/engine/src/utils/replaceRelevantStringsInConfig/index.js +1 -0
  59. package/engine/src/utils/replaceRelevantStringsInConfig/replaceRelevantStringsInConfig.js +36 -0
  60. package/engine/src/utils/replaceRelevantStringsInConfig/replaceTemplateString.js +70 -0
  61. package/engine/src/utils/resolveBaseUrl.js +35 -0
  62. package/engine/src/utils/resolveBuildVersion.js +47 -0
  63. package/engine/src/utils/zipBuildsByPlatforms.js +70 -0
  64. package/package.json +4 -3
@@ -0,0 +1,94 @@
1
+ const { ok } = require('assert').strict;
2
+ const { cmdSyncTrimOut, cmdSyncInheritOut, cmdSyncPipeOut } = require('./cmdUtils');
3
+ const { splitByNewLine } = require('./stringUtils');
4
+
5
+ const statusList = () => {
6
+ const gitCmd = 'git status --porcelain';
7
+ const outputString = cmdSyncTrimOut(gitCmd);
8
+
9
+ if (!outputString) return [];
10
+ const handleMultipleWhitespaces = (rowString) => {
11
+ const spaceChar = ' ';
12
+ const parts = rowString.split(spaceChar);
13
+ return parts.filter(Boolean).join(spaceChar);
14
+ };
15
+
16
+ return splitByNewLine(outputString).map(handleMultipleWhitespaces);
17
+ };
18
+
19
+ const getCurrentBranchName = () => cmdSyncTrimOut('git branch --show-current');
20
+
21
+ // only for GitHub
22
+ const pullRequest = (fromBranch, toBranch, prTitle) => {
23
+ const cmdTool = 'hub';
24
+ const installDocUrl = 'https://github.com/github/hub#installation';
25
+ const errorMsg = `${cmdTool} is not installed! See ${installDocUrl}\n`;
26
+
27
+ try {
28
+ const toolPath = cmdSyncTrimOut(`${cmdTool} --version`);
29
+ ok(toolPath, errorMsg);
30
+ } catch (error) {
31
+ throw new Error(errorMsg);
32
+ }
33
+
34
+ cmdSyncInheritOut(`${cmdTool} pull-request -m "${prTitle}" --head ${fromBranch} --base ${toBranch}`);
35
+ };
36
+
37
+ const remoteBranchExists = (expectedBranchName) => {
38
+ const gitCmd = `git ls-remote --heads origin ${expectedBranchName}`;
39
+ const output = cmdSyncTrimOut(gitCmd);
40
+ return Boolean(output);
41
+ };
42
+
43
+ const pull = () => cmdSyncPipeOut('git remote update -p && git merge --ff-only @{u}');
44
+
45
+ const addAll = () => cmdSyncPipeOut('git add --all');
46
+
47
+ const add = (fileList) => cmdSyncPipeOut(`git add ${fileList.join(' ')}`);
48
+
49
+ const checkout = (branchName) => cmdSyncPipeOut(`git checkout ${branchName}`);
50
+
51
+ const createBranch = (branchName) => cmdSyncPipeOut(`git branch ${branchName}`);
52
+
53
+ const commit = (commitMessage, noVerify) => {
54
+ const maybeNoVerifyParam = noVerify ? '--no-verify' : '';
55
+ return cmdSyncPipeOut(`git commit -m "${commitMessage}" ${maybeNoVerifyParam}`.trimEnd());
56
+ }
57
+
58
+ const push = (branchName, noVerify) => {
59
+ const maybeNoVerifyParam = noVerify ? '--no-verify' : '';
60
+ return cmdSyncPipeOut(`git push --set-upstream origin ${branchName} ${maybeNoVerifyParam}`.trimEnd());
61
+ }
62
+
63
+ const assertEmptyStatusList = () => {
64
+ ok(statusList().length === 0, 'An empty GIT stage is expected!');
65
+ };
66
+
67
+ const assertCurrentBranch = (expectedBranchName) => {
68
+ const currentGitBranchName = getCurrentBranchName();
69
+ const errorMsg = `The ${expectedBranchName} branch is expected to be active, not "${currentGitBranchName}"`;
70
+ ok(currentGitBranchName === expectedBranchName, errorMsg);
71
+ };
72
+
73
+ const assertRemoteBranch = (expectedBranchName) => {
74
+ const errorMsg = `Remote branch ${expectedBranchName} does not exist!`;
75
+ ok(remoteBranchExists(expectedBranchName), errorMsg);
76
+ };
77
+
78
+ module.exports = {
79
+ statusList,
80
+ getCurrentBranchName,
81
+ pullRequest, // only for GitHub
82
+ remoteBranchExists,
83
+ pull,
84
+ addAll,
85
+ add,
86
+ checkout,
87
+ createBranch,
88
+ commit,
89
+ push,
90
+ // asserts
91
+ assertEmptyStatusList,
92
+ assertCurrentBranch,
93
+ assertRemoteBranch,
94
+ };
@@ -0,0 +1,11 @@
1
+ const cmdUtils = require('./cmdUtils');
2
+ const fsUtils = require('./fsUtils');
3
+ const gitUtils = require('./gitUtils');
4
+ const stringUtils = require('./stringUtils');
5
+
6
+ module.exports = {
7
+ cmdUtils,
8
+ fsUtils,
9
+ gitUtils,
10
+ stringUtils,
11
+ };
@@ -0,0 +1,5 @@
1
+ const splitByNewLine = (string = '') => string.split(/\r?\n/);
2
+
3
+ module.exports = {
4
+ splitByNewLine,
5
+ };
@@ -0,0 +1,22 @@
1
+ import { enginePlatforms } from '../enginePlatforms';
2
+ import * as SDKWebos from './sdk-webos';
3
+ import * as SDKTizen from './sdk-tizen';
4
+ import * as SDKWebpack from './sdk-webpack';
5
+
6
+ const handlePlatformSdk = async (c) => {
7
+ switch (c.platform) {
8
+ case enginePlatforms.TIZEN:
9
+ await SDKTizen.handleTizenSdk(c);
10
+ break;
11
+ case enginePlatforms.WEBOS:
12
+ await SDKWebos.handleWebosSdk(c);
13
+ break;
14
+ }
15
+ }
16
+
17
+ export {
18
+ SDKWebos,
19
+ SDKTizen,
20
+ SDKWebpack,
21
+ handlePlatformSdk,
22
+ };
@@ -0,0 +1,287 @@
1
+ import path from 'path';
2
+ import semver from 'semver';
3
+ import os from 'os';
4
+ import fs from 'fs';
5
+ const { spawnSync, execSync } = require('child_process');
6
+ const { installSdk, registerSdkPath } = require('../sdkUtils');
7
+ const { checkAndConfigureTizenSdks } = require('rnv/dist/core/sdkManager/installer');
8
+ import { Exec, WebpackUtils, FileUtils, Common, Logger, Constants, SDKManager, PlatformManager, ProjectManager } from 'rnv';
9
+
10
+ const { execCLI } = Exec;
11
+ const { CLI_TIZEN, REMOTE_DEBUGGER_ENABLED_PLATFORMS } = Constants;
12
+ const {
13
+ getPlatformProjectDir,
14
+ getAppVersion,
15
+ getConfigProp,
16
+ checkPortInUse,
17
+ confirmActiveBundler,
18
+ addSystemInjects
19
+ } = Common;
20
+ const {
21
+ chalk,
22
+ logTask,
23
+ logDebug,
24
+ logError,
25
+ logSuccess,
26
+ logWarning,
27
+ logInfo
28
+ } = Logger;
29
+ const { isPlatformActive } = PlatformManager;
30
+ const { writeCleanFile, fsExistsSync } = FileUtils;
31
+ const { buildCoreWebpackProject, runWebpackServer, configureCoreWebProject, waitForWebpack } = WebpackUtils;
32
+ const { copyAssetsFolder, copyBuildsFolder } = ProjectManager;
33
+
34
+ const {
35
+ runTizenSimOrDevice, createDevelopTizenCertificate,
36
+ DEFAULT_CERTIFICATE_NAME, DEFAULT_SECURITY_PROFILE_NAME
37
+ } = SDKManager.Tizen;
38
+
39
+ const DEFAULT_CERTIFICATE_NAME_WITH_EXTENSION = `${DEFAULT_CERTIFICATE_NAME}.p12`;
40
+
41
+ export const configureTizenGlobal = c => new Promise((resolve, reject) => {
42
+ logTask('configureTizenGlobal');
43
+ // Check Tizen Cert
44
+ const tizenAuthorCert = path.join(c.paths.workspace.dir, DEFAULT_CERTIFICATE_NAME_WITH_EXTENSION);
45
+ if (fsExistsSync(tizenAuthorCert)) {
46
+ logDebug(`${DEFAULT_CERTIFICATE_NAME_WITH_EXTENSION} file exists!`);
47
+ resolve();
48
+ } else {
49
+ logWarning(
50
+ `${DEFAULT_CERTIFICATE_NAME_WITH_EXTENSION} file missing! Creating one for you...`
51
+ );
52
+ createDevelopTizenCertificate(c)
53
+ .then(() => resolve())
54
+ .catch(e => reject(e));
55
+ }
56
+ });
57
+
58
+ const _runTizenSimOrDevice = async (c) => {
59
+ try {
60
+ await runTizenSimOrDevice(c);
61
+ } catch (e) {
62
+ // TODO: Capture different errors and react accordingly
63
+ return Promise.reject(e);
64
+ }
65
+ return true;
66
+ };
67
+
68
+ export const runTizen = async (c, target) => {
69
+ logTask('runTizen', `target:${target}`);
70
+ const { platform } = c;
71
+ const { hosted } = c.program;
72
+
73
+ const isHosted = hosted && !getConfigProp(c, platform, 'bundleAssets');
74
+
75
+ if (isHosted) {
76
+ const isPortActive = await checkPortInUse(c, platform, c.runtime.port);
77
+ if (isPortActive) {
78
+ const resetCompleted = await confirmActiveBundler(c);
79
+ c.runtime.skipActiveServerCheck = !resetCompleted;
80
+ }
81
+ }
82
+
83
+ logTask('runTizen', `target:${target} hosted:${!!isHosted}`);
84
+ if (isHosted) return;
85
+
86
+ const bundleAssets = getConfigProp(c, platform, 'bundleAssets') === true;
87
+
88
+ if (bundleAssets) {
89
+ await buildCoreWebpackProject(c);
90
+ await _runTizenSimOrDevice(c);
91
+ } else {
92
+ const isPortActive = await checkPortInUse(c, platform, c.runtime.port);
93
+ const isWeinreEnabled = REMOTE_DEBUGGER_ENABLED_PLATFORMS.includes(platform) && !bundleAssets && !hosted;
94
+
95
+ if (!isPortActive) {
96
+ logInfo(
97
+ `Your ${chalk().white(
98
+ platform
99
+ )} devServer at port ${chalk().white(
100
+ c.runtime.port
101
+ )} is not running. Starting it up for you...`
102
+ );
103
+ waitForWebpack(c)
104
+ .then(() => _runTizenSimOrDevice(c))
105
+ .catch(logError);
106
+ await runWebpackServer(c, isWeinreEnabled);
107
+ } else {
108
+ const resetCompleted = await confirmActiveBundler(c);
109
+
110
+ if (resetCompleted) {
111
+ waitForWebpack(c)
112
+ .then(() => _runTizenSimOrDevice(c))
113
+ .catch(logError);
114
+ await runWebpackServer(c, isWeinreEnabled);
115
+ } else {
116
+ await _runTizenSimOrDevice(c);
117
+ }
118
+ }
119
+ }
120
+ };
121
+
122
+ export const buildTizenProject = async (c) => {
123
+ logTask('buildTizenProject');
124
+
125
+ await buildCoreWebpackProject(c);
126
+ if (!c.program.hosted) {
127
+ const { buildConfig, platform } = c;
128
+ const platformConfig = buildConfig.platforms[platform];
129
+ const projectDir = getPlatformProjectDir(c);
130
+ const projectParentDir = path.join(projectDir, '..');
131
+
132
+ const tBuild = path.join(projectParentDir, 'build');
133
+ const tOut = path.join(projectParentDir, 'output');
134
+ const certProfile = platformConfig.certificateProfile ?? DEFAULT_SECURITY_PROFILE_NAME;
135
+
136
+ await execCLI(c, CLI_TIZEN, `build-web -- ${projectDir} -out ${tBuild}`);
137
+ await execCLI(
138
+ c,
139
+ CLI_TIZEN,
140
+ `package -- ${tBuild} -s ${certProfile} -t wgt -o ${tOut}`
141
+ );
142
+
143
+ logSuccess(`Your WGT package is located in ${chalk().cyan(tOut)} .`);
144
+ }
145
+
146
+ return true;
147
+ };
148
+
149
+ let _isGlobalConfigured = false;
150
+
151
+ export const configureTizenProject = async (c) => {
152
+ logTask('configureTizenProject');
153
+ const { platform } = c;
154
+
155
+ c.runtime.platformBuildsProjectPath = `${getPlatformProjectDir(c)}`;
156
+
157
+ if (!isPlatformActive(c, platform)) {
158
+ return;
159
+ }
160
+
161
+ if (!_isGlobalConfigured) {
162
+ _isGlobalConfigured = true;
163
+ await configureTizenGlobal(c);
164
+ }
165
+
166
+ await copyAssetsFolder(c, platform);
167
+ await configureCoreWebProject(c);
168
+ await _configureProject(c);
169
+ return copyBuildsFolder(c, platform);
170
+ };
171
+
172
+ const _configureProject = c => new Promise((resolve) => {
173
+ logTask('_configureProject');
174
+ const { platform } = c;
175
+
176
+ const configFile = 'config.xml';
177
+ const p = c.buildConfig.platforms[platform];
178
+
179
+ const injects = [
180
+ { pattern: '{{PACKAGE}}', override: p.package },
181
+ { pattern: '{{ID}}', override: p.id },
182
+ { pattern: '{{APP_NAME}}', override: p.appName },
183
+ { pattern: '{{APP_VERSION}}', override: semver.coerce(getAppVersion(c, platform)) }
184
+ ];
185
+
186
+ addSystemInjects(c, injects);
187
+
188
+ const file = path.join(getPlatformProjectDir(c), configFile);
189
+ writeCleanFile(file, file, injects, null, c);
190
+
191
+ resolve();
192
+ });
193
+
194
+ const handleLinuxKeyring = () => {
195
+ if (process.env.CI && os.platform() === 'linux') {
196
+ const options = { stdio: 'inherit' };
197
+
198
+ execSync('eval $(dbus-launch --sh-syntax)', options);
199
+ execSync('mkdir -p ~/.cache', options);
200
+ execSync('mkdir -p ~/.local/share/keyrings', options);
201
+ execSync('eval "$(printf \'\\n\' | gnome-keyring-daemon --unlock)"', options);
202
+ execSync('eval "$(printf \'\\n\' | /usr/bin/gnome-keyring-daemon --start)"', options);
203
+ }
204
+ };
205
+
206
+ const setTizenCertificate = (c) => {
207
+ const {
208
+ TIZEN_SECURITY_PROFILE_NAME = '24i-SmartApps-BigScreen',
209
+ TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH = 'certificates/24i_smartapps_bigscreen_author.p12',
210
+ TIZEN_AUTHOR_CERTIFICATE_PASSWORD,
211
+ } = process.env;
212
+ const tizenCliPath = c.cli.tizen;
213
+
214
+ if (!fs.existsSync(TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH)) {
215
+ console.log(`'process.env.TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH' points to not existing location: ${TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH}`);
216
+ return false;
217
+ }
218
+
219
+ if (!TIZEN_AUTHOR_CERTIFICATE_PASSWORD) {
220
+ console.log(`'process.env.TIZEN_AUTHOR_CERTIFICATE_PASSWORD' password is not set`);
221
+ return false;
222
+ }
223
+
224
+ if (!tizenCliPath) {
225
+ console.log(`'c.cli.tizen' is not set`);
226
+ return false;
227
+ }
228
+
229
+ const spawnSyncReturn = spawnSync(tizenCliPath, [
230
+ 'security-profiles', 'add',
231
+ '-n', TIZEN_SECURITY_PROFILE_NAME,
232
+ '-a', TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH,
233
+ '-p', TIZEN_AUTHOR_CERTIFICATE_PASSWORD,
234
+ ]);
235
+
236
+ if (spawnSyncReturn.error) throw spawnSyncReturn.error;
237
+ if (spawnSyncReturn.stdout.toString().includes('Invalid file or password')) {
238
+ throw spawnSyncReturn.stdout.toString();
239
+ }
240
+
241
+ process.stdout.write(spawnSyncReturn.stdout || '');
242
+
243
+ const rnvWorkspaceConfigPath = c.paths.workspace.config;
244
+ const customObjectToMerge = {
245
+ platforms: {
246
+ tizen: { certificateProfile: TIZEN_SECURITY_PROFILE_NAME },
247
+ },
248
+ };
249
+ FileUtils.updateObjectSync(rnvWorkspaceConfigPath, customObjectToMerge);
250
+ Object.assign(c.buildConfig, customObjectToMerge);
251
+
252
+ return true;
253
+ };
254
+
255
+ const getSdkInstallerUrl = () => {
256
+ switch (os.platform()) {
257
+ case 'darwin':
258
+ return 'https://s3.amazonaws.com/tools.nxg-bigscreen.24imedia.com/sdks/tizen/tizen_builder_v3.7_mac.zip';
259
+ case 'linux':
260
+ return 'https://s3.amazonaws.com/tools.nxg-bigscreen.24imedia.com/sdks/tizen/tizen_builder_v3.7_ubuntu.zip';
261
+ default:
262
+ return '';
263
+ }
264
+ }
265
+
266
+ export const handleTizenSdk = async (c) => {
267
+ const { TIZEN_SDK_INSTALLER_URL = getSdkInstallerUrl() } = process.env;
268
+ const { TIZEN_SDK } = c.buildConfig?.sdks || {};
269
+ const installPath = `${os.homedir()}/tizen-studio`;
270
+ const rnvSdkKey = 'TIZEN_SDK'
271
+
272
+ if (!TIZEN_SDK) {
273
+ handleLinuxKeyring(); // needed to work with Tizen certificate passwords
274
+
275
+ if (fs.existsSync(installPath)) {
276
+ await registerSdkPath(c, rnvSdkKey, installPath);
277
+ } else {
278
+ const sdkInstalledToPath = await installSdk(TIZEN_SDK_INSTALLER_URL, installPath);
279
+ if (sdkInstalledToPath) {
280
+ await registerSdkPath(c, rnvSdkKey, sdkInstalledToPath);
281
+ }
282
+ }
283
+ }
284
+
285
+ await checkAndConfigureTizenSdks(c);
286
+ setTizenCertificate(c);
287
+ }
@@ -0,0 +1,201 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import semver from 'semver';
4
+ const { homedir } = require('os');
5
+ const { installSdk, registerSdkPath } = require('../sdkUtils');
6
+ const { checkAndConfigureWebosSdks } = require('rnv/dist/core/sdkManager/installer');
7
+ import { Exec, WebpackUtils, FileUtils, Common, Logger, Constants, PlatformManager, ProjectManager, SDKManager } from 'rnv';
8
+
9
+ const { writeCleanFile } = FileUtils;
10
+ const { execCLI } = Exec;
11
+ const {
12
+ getPlatformProjectDir,
13
+ getTemplateProjectDir,
14
+ getPlatformBuildDir,
15
+ getAppVersion,
16
+ getAppTitle,
17
+ getAppId,
18
+ getAppDescription,
19
+ getConfigProp,
20
+ checkPortInUse,
21
+ confirmActiveBundler,
22
+ addSystemInjects
23
+ } = Common;
24
+ const { buildCoreWebpackProject, runWebpackServer, configureCoreWebProject, waitForWebpack } = WebpackUtils;
25
+
26
+ const { isPlatformActive } = PlatformManager;
27
+ const {
28
+ chalk,
29
+ logTask,
30
+ logInfo,
31
+ logSuccess,
32
+ logError
33
+ } = Logger;
34
+ const {
35
+ copyBuildsFolder,
36
+ copyAssetsFolder
37
+ } = ProjectManager;
38
+ const {
39
+ CLI_WEBOS_ARES_PACKAGE,
40
+ REMOTE_DEBUGGER_ENABLED_PLATFORMS
41
+ } = Constants;
42
+ const { runWebosSimOrDevice } = SDKManager.Webos;
43
+
44
+
45
+ export const runWebOS = async (c) => {
46
+ const { hosted } = c.program;
47
+ const { target } = c.runtime;
48
+ const { platform } = c;
49
+
50
+
51
+ const isHosted = hosted && !getConfigProp(c, platform, 'bundleAssets');
52
+
53
+ if (isHosted) {
54
+ const isPortActive = await checkPortInUse(c, platform, c.runtime.port);
55
+ if (isPortActive) {
56
+ const resetCompleted = await confirmActiveBundler(c);
57
+ c.runtime.skipActiveServerCheck = !resetCompleted;
58
+ }
59
+ }
60
+
61
+ logTask('runWebOS', `target:${target} hosted:${!!isHosted}`);
62
+ if (isHosted) return;
63
+
64
+ const bundleAssets = getConfigProp(c, platform, 'bundleAssets') === true;
65
+
66
+ if (bundleAssets) {
67
+ await buildCoreWebpackProject(c);
68
+ await runWebosSimOrDevice(c);
69
+ } else {
70
+ const isPortActive = await checkPortInUse(c, platform, c.runtime.port);
71
+ const isWeinreEnabled = REMOTE_DEBUGGER_ENABLED_PLATFORMS.includes(platform) && !bundleAssets && !hosted;
72
+
73
+ if (!isPortActive) {
74
+ logInfo(
75
+ `Your ${chalk().white(
76
+ platform
77
+ )} devServer at port ${chalk().white(
78
+ c.runtime.port
79
+ )} is not running. Starting it up for you...`
80
+ );
81
+ waitForWebpack(c)
82
+ .then(() => runWebosSimOrDevice(c))
83
+ .catch(logError);
84
+ await runWebpackServer(c, isWeinreEnabled);
85
+ } else {
86
+ const resetCompleted = await confirmActiveBundler(c);
87
+ if (resetCompleted) {
88
+ waitForWebpack(c)
89
+ .then(() => runWebosSimOrDevice(c))
90
+ .catch(logError);
91
+ await runWebpackServer(c, isWeinreEnabled);
92
+ } else {
93
+ await runWebosSimOrDevice(c);
94
+ }
95
+ }
96
+ }
97
+ };
98
+
99
+ export const buildWebOSProject = async (c) => {
100
+ logTask('buildWebOSProject');
101
+
102
+ await buildCoreWebpackProject(c);
103
+
104
+ if (!c.program.hosted) {
105
+ const tDir = getPlatformProjectDir(c);
106
+ const tOut = path.join(getPlatformBuildDir(c), 'output');
107
+ await execCLI(c, CLI_WEBOS_ARES_PACKAGE, `-o ${tOut} ${tDir} -n`);
108
+
109
+ logSuccess(
110
+ `Your IPK package is located in ${chalk().cyan(tOut)} .`
111
+ );
112
+ }
113
+ };
114
+
115
+ export const configureWebOSProject = async (c) => {
116
+ logTask('configureWebOSProject');
117
+
118
+ const { platform } = c;
119
+
120
+ c.runtime.platformBuildsProjectPath = getPlatformProjectDir(c);
121
+
122
+ if (!isPlatformActive(c, platform)) return;
123
+
124
+ await copyAssetsFolder(c, platform);
125
+ await configureCoreWebProject(c);
126
+ await _configureProject(c);
127
+ return copyBuildsFolder(c, platform);
128
+ };
129
+
130
+ const _configureProject = async (c) => {
131
+ logTask('_configureProject');
132
+ const { platform } = c;
133
+
134
+ const configFile = 'appinfo.json';
135
+
136
+ const injects = [
137
+ {
138
+ pattern: '{{APPLICATION_ID}}',
139
+ override: getAppId(c, platform).toLowerCase()
140
+ },
141
+ {
142
+ pattern: '{{APP_TITLE}}',
143
+ override: getAppTitle(c, platform)
144
+ },
145
+ {
146
+ pattern: '{{APP_VERSION}}',
147
+ override: semver.coerce(getAppVersion(c, platform))
148
+ },
149
+ {
150
+ pattern: '{{APP_DESCRIPTION}}',
151
+ override: getAppDescription(c, platform)
152
+ },
153
+ {
154
+ pattern: '{{APP_BG_COLOR}}',
155
+ override: getConfigProp(c, platform, 'bgColor', '#fff')
156
+ },
157
+ {
158
+ pattern: '{{APP_ICON_COLOR}}',
159
+ override: getConfigProp(c, platform, 'iconColor', '#000')
160
+ },
161
+ {
162
+ pattern: '{{APP_VENDOR}}',
163
+ override: getConfigProp(c, platform, 'vendor', '24i')
164
+ }
165
+ ];
166
+
167
+ addSystemInjects(c, injects);
168
+
169
+ writeCleanFile(
170
+ path.join(getTemplateProjectDir(c), configFile),
171
+ path.join(getPlatformProjectDir(c), configFile),
172
+ injects, null, c
173
+ );
174
+
175
+ return true;
176
+ };
177
+
178
+ const getSdkInstallerUrl = () => {
179
+ return 'https://s3.amazonaws.com/tools.nxg-bigscreen.24imedia.com/sdks/webos/ares_webos_builder_v1.10.4_multiplatform.zip';
180
+ }
181
+
182
+ export const handleWebosSdk = async (c) => {
183
+ const { WEBOS_SDK_INSTALLER_URL = getSdkInstallerUrl() } = process.env;
184
+ const { WEBOS_SDK } = c.buildConfig?.sdks || {};
185
+ const installPath = `${homedir()}/webOS_TV_SDK`;
186
+ const rnvSdkKey = 'WEBOS_SDK'
187
+
188
+
189
+ if (!WEBOS_SDK) {
190
+ if (fs.existsSync(installPath)) {
191
+ await registerSdkPath(c, rnvSdkKey, installPath);
192
+ }
193
+
194
+ const sdkInstalledToPath = await installSdk(WEBOS_SDK_INSTALLER_URL, installPath);
195
+ if (sdkInstalledToPath) {
196
+ await registerSdkPath(c, rnvSdkKey, sdkInstalledToPath);
197
+ }
198
+ }
199
+
200
+ await checkAndConfigureWebosSdks(c);
201
+ };
@@ -0,0 +1,45 @@
1
+
2
+ import { WebpackUtils, Common, Logger, PlatformManager, ProjectManager } from 'rnv';
3
+
4
+ const { getPlatformProjectDir } = Common;
5
+ const { isPlatformActive } = PlatformManager;
6
+ const { logTask } = Logger;
7
+ const { copyBuildsFolder, copyAssetsFolder } = ProjectManager;
8
+
9
+ const { buildCoreWebpackProject, configureCoreWebProject } = WebpackUtils;
10
+
11
+ export const buildWeb = async c => buildCoreWebpackProject(c);
12
+
13
+ export const configureWebProject = async (c) => {
14
+ logTask('configureWebProject');
15
+
16
+ const { platform } = c;
17
+
18
+ c.runtime.platformBuildsProjectPath = getPlatformProjectDir(c);
19
+
20
+ if (!isPlatformActive(c, platform)) return;
21
+
22
+ await copyAssetsFolder(c, platform);
23
+ await configureCoreWebProject(c);
24
+
25
+ return copyBuildsFolder(c, platform);
26
+ };
27
+
28
+ export const deployWeb = () => {
29
+ logTask('deployWeb');
30
+ // const { platform } = c;
31
+
32
+ // DEPRECATED: custom deployers moved to external packages
33
+ // return selectWebToolAndDeploy(c, platform);
34
+
35
+ return true;
36
+ };
37
+
38
+ export const exportWeb = () => {
39
+ logTask('exportWeb');
40
+ // const { platform } = c;
41
+
42
+ // DEPRECATED: custom deployers moved to external packages
43
+ // return selectWebToolAndExport(c, platform);
44
+ return true;
45
+ };
@@ -0,0 +1,22 @@
1
+ const { FileUtils } = require('rnv');
2
+ const { sdkInstaller } = require('@24i/smartapps-bigscreen-sdk-installer');
3
+
4
+ const registerSdkPath = async (c, sdkKey, sdkValue) => {
5
+ const rnvWorkspaceConfigPath = c.paths.workspace.config;
6
+ const customObjectToMerge = { sdks: { [sdkKey]: sdkValue } };
7
+ FileUtils.updateObjectSync(rnvWorkspaceConfigPath, customObjectToMerge);
8
+ Object.assign(c.buildConfig, customObjectToMerge);
9
+ };
10
+
11
+ const installSdk = async (installerUrl, installPath) => {
12
+ return sdkInstaller({
13
+ zipPath: installerUrl,
14
+ installPath,
15
+ enableLogs: true,
16
+ });
17
+ };
18
+
19
+ export {
20
+ registerSdkPath,
21
+ installSdk
22
+ };