Skip to content

Commit a35244c

Browse files
committed
feat(cubejs-cli): Run dev-server/server commands from @cubejs-backend/core
1 parent c13a729 commit a35244c

File tree

6 files changed

+89
-13
lines changed

6 files changed

+89
-13
lines changed

packages/cubejs-cli/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@
3939
"node-fetch": "^2.6.0",
4040
"node-machine-id": "^1.1.10",
4141
"request": "^2.88.2",
42-
"request-promise": "^4.2.5"
42+
"request-promise": "^4.2.5",
43+
"semver": "^7.3.2"
4344
},
4445
"devDependencies": {
4546
"@types/cross-spawn": "^6.0.2",
4647
"@types/node": "^14.11.10",
48+
"@types/semver": "^7.3.4",
4749
"eslint": "^6.8.0",
4850
"eslint-config-airbnb-base": "^13.1.0",
4951
"eslint-plugin-import": "^2.16.0",

packages/cubejs-cli/src/cli.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,22 @@ import inquirer from 'inquirer';
1414

1515
import { configureDevServerCommand } from './command/dev-server';
1616
import { configureServerCommand } from './command/server';
17-
import { executeCommand, npmInstall, writePackageJson, requireFromPackage, event, displayError } from './utils';
17+
import {
18+
executeCommand,
19+
npmInstall,
20+
writePackageJson,
21+
requireFromPackage,
22+
event,
23+
displayError,
24+
loadCliManifest,
25+
} from './utils';
1826

1927
const Config = require('./config');
2028
const templates = require('./templates');
2129
const { deploy } = require('./deploy');
2230
const { token, defaultExpiry, collect } = require('./token');
2331

24-
const packageJson = require('../package.json');
32+
const packageJson = loadCliManifest();
2533

2634
program.name(Object.keys(packageJson.bin)[0])
2735
.version(packageJson.version);

packages/cubejs-cli/src/command/proxy-command.ts

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { CommanderStatic } from 'commander';
2-
import { displayError, packageExists, requireFromPackage } from '../utils';
2+
import { displayError, loadCliManifest, packageExists, requireFromPackage, requirePackageManifest } from '../utils';
33
import chalk from 'chalk';
4+
import semver from 'semver';
45

56
export async function proxyCommand(program: CommanderStatic, command: string) {
67
const serverPackageExists = packageExists('@cubejs-backend/server');
@@ -9,24 +10,60 @@ export async function proxyCommand(program: CommanderStatic, command: string) {
910
.command(command);
1011

1112
if (serverPackageExists) {
12-
const OriginalCommandPackage = await requireFromPackage(`@cubejs-backend/server/dist/command/${command}`);
13-
// eslint-disable-next-line new-cap
14-
const Command = new OriginalCommandPackage.default([]);
13+
const PackageManifiest = await requirePackageManifest('@cubejs-backend/server');
14+
15+
if (PackageManifiest.cubejsCliVersion) {
16+
const cliManifiest = loadCliManifest();
17+
if (semver.satisfies(cliManifiest.version, PackageManifiest.cubejsCliVersion)) {
18+
const OriginalCommandPackage = await requireFromPackage(
19+
`@cubejs-backend/server/dist/command/${command}`
20+
);
21+
// eslint-disable-next-line new-cap
22+
const Command = new OriginalCommandPackage.default([]);
23+
24+
commandInfo
25+
.description(OriginalCommandPackage.default.description)
26+
.action(
27+
() => Command.run().catch(
28+
(e: any) => displayError(e.stack || e.message)
29+
)
30+
);
31+
32+
return;
33+
}
34+
35+
const message = `${chalk.red('Unavailable.')} @cubejs-backend/server inside current directory requires ` +
36+
`cubejs-cli (${PackageManifiest.cubejsCliVersion}).`;
37+
38+
commandInfo
39+
.description(
40+
message
41+
)
42+
.action(
43+
() => displayError(message)
44+
);
45+
46+
return;
47+
}
48+
49+
const message = `${chalk.red('Unavailable.')} Please upgrade @cubejs-backend/server.`;
1550

1651
commandInfo
17-
.description(OriginalCommandPackage.default.description)
52+
.description(
53+
message
54+
)
1855
.action(
19-
() => Command.run().catch(
20-
(e: any) => displayError(e.stack || e.message)
21-
)
56+
() => displayError(message)
2257
);
2358
} else {
59+
const message = `${chalk.red('Unavailable.')} Please run this command from project directory.`;
60+
2461
commandInfo
2562
.description(
26-
chalk.red('Unavailable.') + ' Please run this command from project directory.'
63+
message
2764
)
2865
.action(
29-
() => displayError('Unavailable. Please run this command from project directory.')
66+
() => displayError(message)
3067
);
3168
}
3269

packages/cubejs-cli/src/utils.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,20 @@ export const requiredPackageExists = async (moduleName: string) => {
8484
}
8585
};
8686

87+
export const requirePackageManifest = async (moduleName: string) => {
88+
await requiredPackageExists(moduleName);
89+
90+
const modulePath = path.join(process.cwd(), 'node_modules', moduleName);
91+
92+
if (!fs.pathExistsSync(modulePath) && !fs.pathExistsSync(path.join(modulePath, 'package.json'))) {
93+
await displayError(
94+
`${moduleName} dependency package.json not found. Please run this command from project directory.`
95+
);
96+
}
97+
98+
return require(path.join(modulePath, 'package.json'));
99+
};
100+
87101
export const requireFromPackage = async (moduleName: string) => {
88102
await requiredPackageExists(moduleName);
89103

@@ -97,3 +111,7 @@ const logStage = async (stage: string, eventName: string, props: any) => {
97111
await event(eventName, props);
98112
}
99113
};
114+
115+
export function loadCliManifest() {
116+
return require('../package.json');
117+
}

packages/cubejs-cli/yarn.lock

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,11 @@
372372
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
373373
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
374374

375+
"@types/semver@^7.3.4":
376+
version "7.3.4"
377+
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb"
378+
integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==
379+
375380
"@types/stack-utils@^1.0.1":
376381
version "1.0.1"
377382
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
@@ -4221,6 +4226,11 @@ semver@^6.0.0, semver@^6.1.2:
42214226
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
42224227
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
42234228

4229+
semver@^7.3.2:
4230+
version "7.3.2"
4231+
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
4232+
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
4233+
42244234
serialize-javascript@3.0.0:
42254235
version "3.0.0"
42264236
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e"

packages/cubejs-server/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"bin": {
2424
"cubejs-dev-server": "./bin/dev-server.js"
2525
},
26+
"cubejsCliVersion": "^0.22",
2627
"scripts": {
2728
"tsc": "tsc",
2829
"watch": "tsc -w",

0 commit comments

Comments
 (0)