@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.
- package/dist/src/index.js +3 -1
- package/dist/src/tasks/deploy/aswS3/deployS3.js +3 -2
- package/dist/src/tasks/deploy/hbbtv/deployHbbtv.js +12 -9
- package/dist/src/tasks/task.rnv.build.js +17 -15
- package/dist/src/tasks/task.rnv.configure.js +3 -1
- package/dist/src/tasks/task.rnv.configureSoft.js +3 -1
- package/dist/src/tasks/task.rnv.deploy.js +5 -2
- package/dist/src/tasks/task.rnv.hooks.run.js +4 -2
- package/dist/src/utils/forEachSupportedPlatformFlavour.js +8 -8
- package/dist/src/utils/getBaseConfig.js +5 -3
- package/dist/src/utils/getDeployLocations.js +1 -3
- package/dist/src/utils/getVersionOffset.js +4 -4
- package/dist/src/utils/replaceRelevantStringsInConfig/replaceTemplateString.js +2 -2
- package/engine/src/enginePlatforms.js +16 -0
- package/engine/src/index.js +67 -0
- package/engine/src/scripts/buildAllWithScheme.js +29 -0
- package/engine/src/scripts/gitReleaser/afterVersionBump.js +24 -0
- package/engine/src/scripts/gitReleaser/beforeVersionBump.js +15 -0
- package/engine/src/scripts/gitReleaser/checkReleaseNotes.js +22 -0
- package/engine/src/scripts/gitReleaser/pushRelease.js +41 -0
- package/engine/src/scripts/gitReleaser/pushReleaseCandidate.js +8 -0
- package/engine/src/scripts/gitReleaser/pushReleaseNotes.js +53 -0
- package/engine/src/scripts/release/deleteSourceMaps.js +14 -0
- package/engine/src/scripts/release/deployToAppCenter.js +79 -0
- package/engine/src/scripts/release/githubRelease.js +138 -0
- package/engine/src/scripts/release/notifySlack/makePayload.js +103 -0
- package/engine/src/scripts/release/notifySlack/notifySlack.js +26 -0
- package/engine/src/scripts/release/notifySlack/slackBlockKitBuilder.js +44 -0
- package/engine/src/scripts/release/sentryRelease.js +79 -0
- package/engine/src/scripts/release/urlsMarkdown.js +85 -0
- package/engine/src/scripts/releaseAllWithScheme.js +91 -0
- package/engine/src/scripts/utils/cmdUtils.js +16 -0
- package/engine/src/scripts/utils/fsUtils.js +14 -0
- package/engine/src/scripts/utils/gitUtils.js +94 -0
- package/engine/src/scripts/utils/index.js +11 -0
- package/engine/src/scripts/utils/stringUtils.js +5 -0
- package/engine/src/sdks/index.js +22 -0
- package/engine/src/sdks/sdk-tizen/index.js +287 -0
- package/engine/src/sdks/sdk-webos/index.js +201 -0
- package/engine/src/sdks/sdk-webpack/index.js +45 -0
- package/engine/src/sdks/sdkUtils.js +22 -0
- package/engine/src/tasks/deploy/aswS3/aws.js +27 -0
- package/engine/src/tasks/deploy/aswS3/deployS3.js +71 -0
- package/engine/src/tasks/deploy/hbbtv/deployHbbtv.js +144 -0
- package/engine/src/tasks/engineTasks.js +23 -0
- package/engine/src/tasks/task.rnv.build.js +126 -0
- package/engine/src/tasks/task.rnv.configure.js +52 -0
- package/engine/src/tasks/task.rnv.configureSoft.js +31 -0
- package/engine/src/tasks/task.rnv.deploy.js +40 -0
- package/engine/src/tasks/task.rnv.hooks.run.js +61 -0
- package/engine/src/tasks/task.rnv.package.js +27 -0
- package/engine/src/tasks/task.rnv.project.configure.js +109 -0
- package/engine/src/tasks/task.rnv.start.js +52 -0
- package/engine/src/utils/forEachSupportedPlatformFlavour.js +29 -0
- package/engine/src/utils/getBaseConfig.js +57 -0
- package/engine/src/utils/getDeployLocations.js +78 -0
- package/engine/src/utils/getVersionOffset.js +39 -0
- package/engine/src/utils/replaceRelevantStringsInConfig/index.js +1 -0
- package/engine/src/utils/replaceRelevantStringsInConfig/replaceRelevantStringsInConfig.js +36 -0
- package/engine/src/utils/replaceRelevantStringsInConfig/replaceTemplateString.js +70 -0
- package/engine/src/utils/resolveBaseUrl.js +35 -0
- package/engine/src/utils/resolveBuildVersion.js +47 -0
- package/engine/src/utils/zipBuildsByPlatforms.js +70 -0
- 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,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
|
+
};
|