Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"@oclif/plugin-autocomplete": "^0.2.0",
"@oclif/plugin-help": "^2.2.0",
"@oclif/plugin-not-found": "^1.2.2",
"@rocket.chat/apps-compiler": "^0.1.2",
"@rocket.chat/apps-engine": "^1.12.0",
"axios": "^0.19.0",
"chalk": "^2.4.2",
Expand Down
40 changes: 32 additions & 8 deletions src/commands/deploy.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { Command, flags } from '@oclif/command';
import chalk from 'chalk';
import cli from 'cli-ux';
import * as semver from 'semver';

import { FolderDetails, unicodeSymbols } from '../misc';
import { checkReport, getServerInfo, packageAndZip, uploadApp } from '../misc/deployHelpers';
import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition';
import { AppCompiler, AppPackager, FolderDetails, unicodeSymbols } from '../misc';
import { getServerInfo, uploadApp } from '../misc/deployHelpers';

export default class Deploy extends Command {
public static description = 'allows deploying an App to a server';
Expand Down Expand Up @@ -46,29 +48,51 @@ export default class Deploy extends Command {
} catch (e) {
this.error(e && e.message ? e.message : e, {exit: 2});
}

if (flags.i2fa) {
flags.code = await cli.prompt('2FA code', { type: 'hide' });
}
let serverInfo;
let zipName;

cli.log(chalk.bold.greenBright(' Starting App Deployment to Server\n'));

try {
cli.action.start(chalk.bold.greenBright(' Getting Server Info'));
serverInfo = await getServerInfo(fd, flags);
const serverInfo = await getServerInfo(fd, flags);
cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark')));

cli.action.start(chalk.bold.greenBright(' Packaging the app'));
checkReport(this, fd, flags);
zipName = await packageAndZip(this, fd);
const compiler = new AppCompiler(fd);
const result = await compiler.compile();

if (result.diagnostics.length && !flags.force) {
this.reportDiagnostics(result.diagnostics);
this.error('TypeScript compiler error(s) occurred');
this.exit(1);
return;
}

let zipName: string;

if (semver.satisfies(semver.coerce(serverInfo.serverVersion), '>=3.8')) {
zipName = await compiler.outputZip();
} else {
const packager = new AppPackager(this, fd);
zipName = await packager.zipItUp();
}

cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark')));

cli.action.start(chalk.bold.greenBright(' Uploading App'));
await uploadApp(serverInfo, fd, zipName);
cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark')));
} catch (e) {
cli.action.stop(chalk.red(unicodeSymbols.get('heavyMultiplicationX')));
this.log(chalk.bold.redBright(
this.error(chalk.bold.redBright(
` ${unicodeSymbols.get('longRightwardsSquiggleArrow')} ${e && e.message ? e.message : e}`));
}
}

private reportDiagnostics(diag: Array<ICompilerDiagnostic>): void {
diag.forEach((d) => this.error(d.message));
}
}
42 changes: 27 additions & 15 deletions src/commands/package.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
import { Command, flags } from '@oclif/command';
import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition';
import chalk from 'chalk';
import cli from 'cli-ux';
import * as path from 'path';

import {
AppCompiler,
AppPackager,
FolderDetails,
} from '../misc';
import { AppCompiler, AppPackager, FolderDetails } from '../misc';

export default class Package extends Command {
public static description = 'packages up your App in a distributable format';
public static aliases = ['p', 'pack'];

public static flags = {
help: flags.help({ char: 'h' }),
'help': flags.help({ char: 'h' }),
// flag with no value (-f, --force)
force: flags.boolean({
'no-compile': flags.boolean({
description: "don't compile the source, package as is (for older Rocket.Chat versions)",
}),
'force': flags.boolean({
char: 'f',
description: 'forcefully package the App, ignores lint & TypeScript errors',
}),
};

public async run(): Promise<void> {
const { flags } = this.parse(Package);

cli.action.start('packaging your app');

Expand All @@ -36,21 +34,35 @@ export default class Package extends Command {
return;
}

const compiler = new AppCompiler(this, fd);
const report = compiler.logDiagnostics();
const compiler = new AppCompiler(fd);

const result = await compiler.compile();

const { flags } = this.parse(Package);

if (!report.isValid && !flags.force) {
if (result.diagnostics.length && !flags.force) {
this.reportDiagnostics(result.diagnostics);
this.error('TypeScript compiler error(s) occurred');
this.exit(1);
return;
}

const packager = new AppPackager(this, fd);
const zipName = await packager.zipItUp();
let zipName: string;

if (flags['no-compile']) {
const packager = new AppPackager(this, fd);
zipName = await packager.zipItUp();
} else {
zipName = await compiler.outputZip();
}

cli.action.stop('finished!');

this.log(chalk.black(' '));
this.log(chalk.green('App packaged up at:'), path.join(fd.folder, zipName));
this.log(chalk.green('App packaged up at:'), fd.mergeWithFolder(zipName));
}

private reportDiagnostics(diag: Array<ICompilerDiagnostic>): void {
diag.forEach((d) => this.error(d.message));
}
}
8 changes: 4 additions & 4 deletions src/commands/submit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ export default class Submit extends Command {
this.error(e && e.message ? e.message : e);
}

const compiler = new AppCompiler(this, fd);
const report = compiler.logDiagnostics();
const compiler = new AppCompiler(fd);
const report = await compiler.compile();

if (!report.isValid) {
if (!report.diagnostics.length) {
this.error('TypeScript compiler error(s) occurred');
}

Expand Down Expand Up @@ -139,7 +139,7 @@ export default class Submit extends Command {
return true;
},
// tslint:disable:promise-function-async
source: (answersSoFar: object, input: string) => {
source: (_answersSoFar: object, input: string) => {
input = input || '';

return new Promise((resolve) => {
Expand Down
59 changes: 34 additions & 25 deletions src/commands/watch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import chalk from 'chalk';
import * as chokidar from 'chokidar';
import cli from 'cli-ux';

import { FolderDetails, unicodeSymbols } from '../misc';
import { checkReport, checkUpload, getIgnoredFiles, getServerInfo,
packageAndZip, uploadApp } from '../misc/deployHelpers';
import { ICompilerDiagnostic } from '@rocket.chat/apps-compiler/definition';
import { AppCompiler, FolderDetails, unicodeSymbols } from '../misc';
import { checkUpload, getIgnoredFiles, getServerInfo, uploadApp } from '../misc/deployHelpers';

export default class Watch extends Command {

Expand Down Expand Up @@ -39,9 +39,10 @@ export default class Watch extends Command {
};

public async run() {

const { flags } = this.parse(Watch);

const fd = new FolderDetails(this);

try {
await fd.readInfoFile();
} catch (e) {
Expand All @@ -51,49 +52,57 @@ export default class Watch extends Command {
if (flags.i2fa) {
flags.code = await cli.prompt('2FA code', { type: 'hide' });
}

let ignoredFiles: Array<string>;
try {
ignoredFiles = await getIgnoredFiles(fd);
} catch (e) {
this.error(chalk.bold.red(e && e.message ? e.message : e));
}

const watcher = chokidar.watch(fd.folder, {
chokidar.watch(fd.folder, {
ignored: ignoredFiles,
awaitWriteFinish: true,
persistent: true,
interval: 300,
});
watcher
.on('change', async () => {
tasks(this, fd, flags)
.catch((e) => {
this.log(chalk.bold.redBright(
}).on('change', async () => {
tasks(this, fd, flags)
.catch((e) => {
this.log(chalk.bold.redBright(
` ${unicodeSymbols.get('longRightwardsSquiggleArrow')} ${e && e.message ? e.message : e}`));
});
})
.on('ready', async () => {
tasks(this, fd, flags)
.catch((e) => {
this.log(chalk.bold.redBright(
});
}).on('ready', async () => {
tasks(this, fd, flags)
.catch((e) => {
this.log(chalk.bold.redBright(
` ${unicodeSymbols.get('longRightwardsSquiggleArrow')} ${e && e.message ? e.message : e}`));
});
});
});
}
}

function reportDiagnostics(command: Command, diag: Array<ICompilerDiagnostic>): void {
diag.forEach((d) => command.error(d.message));
}

const tasks = async (command: Command, fd: FolderDetails, flags: { [key: string]: any }): Promise<void> => {
let serverInfo;
let zipName;
try {
command.log('\n');

cli.action.start(chalk.bold.greenBright(' Packaging the app'));
checkReport(command, fd, flags);
zipName = await packageAndZip(command, fd);
const compiler = new AppCompiler(fd);
const result = await compiler.compile();

if (result.diagnostics.length && !flags.force) {
reportDiagnostics(command, result.diagnostics);
command.error('TypeScript compiler error(s) occurred');
command.exit(1);
return;
}

const zipName = await compiler.outputZip();
cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark')));

cli.action.start(chalk.bold.greenBright(' Getting Server Info'));
serverInfo = await getServerInfo(fd, flags);
const serverInfo = await getServerInfo(fd, flags);
cli.action.stop(chalk.bold.greenBright(unicodeSymbols.get('checkMark')));

const status = await checkUpload({...flags, ...serverInfo}, fd);
Expand Down
Loading