Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CLI improvements #1437

Merged
merged 13 commits into from Mar 7, 2024
97 changes: 12 additions & 85 deletions __mocks__/@rnv/core.ts
Expand Up @@ -21,14 +21,21 @@ const _chalkCols: any = {
blue: (v) => v,
cyan: (v) => v,
magenta: (v) => v,
bold: (v) => v,
rgb: (v) => v,
};
_chalkCols.rgb = () => (v) => v;
_chalkCols.bold = _chalkCols;
function mockChalk() {
return _chalkCols;
}
Object.assign(mockChalk, _chalkCols);
Object.keys(_chalkCols).forEach((key) => {
_chalkCols[key] = mockChalk;
});
const _chalkMono = {
..._chalkCols,
};

export const generateRnvConfigPathObj = () => {
const generateRnvConfigPathObj = () => {
return {
configs: [],
configsPrivate: [],
Expand All @@ -45,15 +52,15 @@ export const generateRnvConfigPathObj = () => {
};
};

export const generateRnvConfigFileObj = () => {
const generateRnvConfigFileObj = () => {
return {
configs: [],
configsLocal: [],
configsPrivate: [],
};
};

export const generateContextDefaults = (ctx?: Context) => {
const generateContextDefaults = (ctx?: Context) => {
const runtime: any = {
currentEngine: { rootPath: '' },
enginesByPlatform: {},
Expand Down Expand Up @@ -244,90 +251,10 @@ export const generateContextDefaults = (ctx?: Context) => {
},
};
};

rnvcore.getEngineRunnerByPlatform = () => ({
getOriginalPlatformTemplatesDir: () => 'sometemptdir',
});
rnvcore.executeTask = jest.fn();
rnvcore.shouldSkipTask = () => false;
rnvcore.generatePlatformChoices = () => [];
rnvcore.executeAsync = jest.fn();
rnvcore.removeDirs = jest.fn();
rnvcore.fsExistsSync = jest.fn();
rnvcore.fsReaddirSync = () => [];
rnvcore.getRealPath = () => '';
rnvcore.copyFolderContentsRecursiveSync = jest.fn();
rnvcore.getConfigProp = jest.fn();
rnvcore.confirmActiveBundler = () => null;
rnvcore.getAppFolder = jest.fn();
rnvcore.logToSummary = jest.fn();
rnvcore.logTask = jest.fn();
rnvcore.logDefault = jest.fn();
rnvcore.logDebug = jest.fn();
rnvcore.logInfo = jest.fn();
rnvcore.logError = jest.fn();
rnvcore.logWarning = jest.fn();
rnvcore.logSuccess = jest.fn();
rnvcore.logSummary = jest.fn();
rnvcore.chalk = () => _chalkMono;
rnvcore.inquirerPrompt = jest.fn();
rnvcore.getPlatformProjectDir = jest.fn();

rnvcore.createRnvContext = (ctx?: Context) => {
rnvcore.__MOCK_RNV_CONTEXT = generateContextDefaults(ctx);
};
rnvcore.getContext = () => rnvcore.__MOCK_RNV_CONTEXT;
rnvcore.generateContextDefaults = generateContextDefaults;

rnvcore.createRnvApi = () => {
global.MOCK_RNV_API = {
doResolve: jest.fn(),
getConfigProp: jest.fn(),
logger: jest.fn(),
analytics: {
captureEvent: () => {
//NOOP
},
captureException() {
//NOOP
},
teardown: async () => {
//NOOP
},
},
prompt: {
generateOptions() {
//NOOP
return {
asString: '',
keysAsArray: [],
keysAsObject: {},
optionsAsArray: [],
valuesAsArray: [],
valuesAsObject: {},
};
},
inquirerPrompt: async () => {
return {};
},
pressAnyKeyToContinue: async () => {
return {};
},
inquirerSeparator() {
return {};
},
},
spinner: jest.fn(),
fsExistsSync: jest.fn(),
fsReadFileSync: jest.fn(),
fsReaddirSync: jest.fn(),
fsWriteFileSync: jest.fn(),
path: jest.fn(),
};
};

rnvcore.getApi = () => {
return global.MOCK_RNV_API;
};

module.exports = rnvcore;
1 change: 1 addition & 0 deletions buildHooks/src/prePublish.ts
Expand Up @@ -29,6 +29,7 @@ const VERSIONED_PACKAGES = [
'sdk-webos',
'sdk-utils',
'renative',
'integration-docker',
];

type PackageConfig = {
Expand Down
1 change: 1 addition & 0 deletions packages/app-harness/package.json
Expand Up @@ -68,6 +68,7 @@
"@rnv/engine-rn-next": "1.0.0-rc.12",
"@rnv/engine-rn-tvos": "1.0.0-rc.12",
"@rnv/engine-rn-web": "1.0.0-rc.12",
"@rnv/integration-starter": "1.0.0-rc.12",
"@rnv/template-starter": "1.0.0-rc.12",
"@types/react": "18.2.52",
"@types/react-dom": "18.2.18",
Expand Down
8 changes: 7 additions & 1 deletion packages/app-harness/renative.json
Expand Up @@ -5,6 +5,9 @@
"crypto": {
"path": "./secrets/privateConfigs.enc"
},
"integrations": {
"@rnv/integration-starter": {}
},
"plugins": {
"react-native-splash-screen": {
"android": {
Expand Down Expand Up @@ -151,7 +154,10 @@
"templateXcode": {
"AppDelegate_h": {
"appDelegateExtensions": ["UNUserNotificationCenterDelegate"],
"appDelegateImports": ["<UserNotifications/UNUserNotificationCenter.h>", "<UserNotifications/UserNotifications.h>"]
"appDelegateImports": [
"<UserNotifications/UNUserNotificationCenter.h>",
"<UserNotifications/UserNotifications.h>"
]
},
"AppDelegate_mm": {
"appDelegateImports": ["<RNCPushNotificationIOS.h>"],
Expand Down
38 changes: 20 additions & 18 deletions packages/cli/src/index.ts
@@ -1,7 +1,7 @@
import program from 'commander';
import fs from 'fs';
import path from 'path';
import { logComplete, logError, getContext, RnvTaskOptionPresets } from '@rnv/core';
import { logComplete, logError, getContext, RnvTaskOptionPresets, generateStringFromTaskOption } from '@rnv/core';
import Spinner from './ora';
import Prompt from './prompt';
import Logger from './logger';
Expand Down Expand Up @@ -29,24 +29,11 @@ export const run = () => {
program.version(packageJson.version, '-v, --version', 'output current version');

RnvTaskOptionPresets.withAll().forEach((param) => {
let cmd = '';
if (param.shortcut) {
cmd += `-${param.shortcut}, `;
}
cmd += `--${param.key}`;

if (param.value) {
if (param.isRequired) {
cmd += ` <${param.value}>`;
} else if (param.variadic) {
cmd += ` [${param.value}...]`;
} else {
cmd += ` [${param.value}]`;
}
}
program.option(cmd, param.description);
program.option(generateStringFromTaskOption(param), param.description);
});

program.allowUnknownOption(true); // integration options are not known ahead of time

// Make both arguments optional un order to allow `$ rnv` top level command
program.arguments('[cmd] [option]').action((cmd, option) => {
cmdValue = cmd;
Expand All @@ -60,7 +47,22 @@ export const run = () => {
process.exit(0);
});

executeRnv({ cmd: cmdValue, subCmd: cmdOption, program, process, spinner: Spinner, prompt: Prompt, logger: Logger })
// If the first argument is a flag, then the subCommand is missing
// this occurs when rnv has to execute unknown commands (ie intergration commands)
// commander does not handle this scenario automatically
if (cmdOption && (cmdOption.startsWith('--') || cmdOption.startsWith('-'))) {
cmdOption = '';
}

executeRnv({
cmd: cmdValue,
subCmd: cmdOption,
program,
process,
spinner: Spinner,
prompt: Prompt,
logger: Logger,
})
.then(() => {
logComplete(!getContext().runtime.keepSessionActive);
})
Expand Down