mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-04-27 16:57:19 +00:00
133 lines
4.5 KiB
JavaScript
133 lines
4.5 KiB
JavaScript
// @ts-check
|
|
|
|
(async () => {
|
|
|
|
const os = require('os');
|
|
const path = require('path');
|
|
const glob = require('glob');
|
|
const { v4 } = require('uuid');
|
|
const shell = require('shelljs');
|
|
const protoc = path.dirname(require('protoc/protoc'));
|
|
shell.env.PATH = `${shell.env.PATH}${path.delimiter}${protoc}`;
|
|
shell.env.PATH = `${shell.env.PATH}${path.delimiter}${path.join(__dirname, '..', 'node_modules', '.bin')}`;
|
|
|
|
const repository = path.join(os.tmpdir(), `${v4()}-arduino-cli`);
|
|
if (shell.mkdir('-p', repository).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
|
|
const { owner, repo, commitish } = (() => {
|
|
const pkg = require(path.join(__dirname, '..', 'package.json'));
|
|
if (!pkg) {
|
|
shell.echo(`Could not parse the 'package.json'.`);
|
|
shell.exit(1);
|
|
}
|
|
|
|
const { arduino } = pkg;
|
|
if (!arduino) {
|
|
return { owner: 'arduino', repo: 'arduino-cli' };
|
|
}
|
|
|
|
const { cli } = arduino;
|
|
if (!cli) {
|
|
return { owner: 'arduino', repo: 'arduino-cli' };
|
|
}
|
|
|
|
const { version } = cli;
|
|
if (!version) {
|
|
return { owner: 'arduino', repo: 'arduino-cli' };
|
|
}
|
|
|
|
if (typeof version === 'string') {
|
|
return { owner: 'arduino', repo: 'arduino-cli' };
|
|
}
|
|
|
|
// We assume an object with `owner`, `repo`, commitish?` properties.
|
|
const { owner, repo, commitish } = version;
|
|
if (!owner) {
|
|
shell.echo(`Could not retrieve 'owner' from ${JSON.stringify(version)}`);
|
|
shell.exit(1);
|
|
}
|
|
if (!repo) {
|
|
shell.echo(`Could not retrieve 'repo' from ${JSON.stringify(version)}`);
|
|
shell.exit(1);
|
|
}
|
|
|
|
return { owner, repo, commitish };
|
|
})();
|
|
|
|
const url = `https://github.com/${owner}/${repo}.git`;
|
|
shell.echo(`>>> Cloning repository from '${url}'...`);
|
|
if (shell.exec(`git clone ${url} ${repository}`).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
shell.echo(`<<< Repository cloned.`);
|
|
|
|
const { platform } = process;
|
|
const build = path.join(__dirname, '..', 'build');
|
|
const cli = path.join(build, `arduino-cli${platform === 'win32' ? '.exe' : ''}`);
|
|
const jsonVersion = shell.exec(`${cli} version --format json`).trim();
|
|
if (!jsonVersion) {
|
|
shell.echo(`Could not retrieve the CLI version from ${cli}.`);
|
|
shell.exit(1);
|
|
}
|
|
const version = JSON.parse(jsonVersion).VersionString;
|
|
if (version && version !== '0.0.0-git') { // 0.0.0-git is the version of the CLI when built manually and not downloaded as a releases/nightly.
|
|
shell.echo(`>>> Checking out version: ${version}...`);
|
|
if (shell.exec(`git -C ${repository} checkout ${version} -b ${version}`).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
shell.echo(`<<< Checked out version: ${commitish}.`);
|
|
} else if (commitish) {
|
|
shell.echo(`>>> Checking out commitish: ${commitish}...`);
|
|
if (shell.exec(`git -C ${repository} checkout ${commitish}`).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
shell.echo(`<<< Checked out commitish: ${commitish}.`);
|
|
}
|
|
|
|
shell.echo('>>> Generating TS/JS API from:');
|
|
if (shell.exec(`git -C ${repository} rev-parse --abbrev-ref HEAD`).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
|
|
const rpc = path.join(repository, 'rpc');
|
|
const out = path.join(__dirname, '..', 'src', 'node', 'cli-protocol');
|
|
shell.mkdir('-p', out);
|
|
|
|
const protos = await new Promise(resolve =>
|
|
glob('**/*.proto', { cwd: rpc }, (error, matches) => {
|
|
if (error) {
|
|
shell.echo(error.stack);
|
|
resolve([]);
|
|
return;
|
|
}
|
|
resolve(matches.map(filename => path.join(rpc, filename)));
|
|
}));
|
|
if (!protos || protos.length === 0) {
|
|
shell.echo(`Could not find any .proto files under ${rpc}.`);
|
|
shell.exit(1);
|
|
}
|
|
|
|
// Generate JS code from the `.proto` files.
|
|
if (shell.exec(`grpc_tools_node_protoc \
|
|
--js_out=import_style=commonjs,binary:${out} \
|
|
--grpc_out=generate_package_definition:${out} \
|
|
-I ${rpc} \
|
|
${protos.join(' ')}`).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
|
|
// Generate the `.d.ts` files for JS.
|
|
if (shell.exec(`protoc \
|
|
--plugin=protoc-gen-ts=${path.resolve(__dirname, '..', 'node_modules', '.bin', `protoc-gen-ts${platform === 'win32' ? '.cmd' : ''}`)} \
|
|
--ts_out=generate_package_definition:${out} \
|
|
-I ${rpc} \
|
|
${protos.join(' ')}`).code !== 0) {
|
|
shell.exit(1);
|
|
}
|
|
|
|
shell.echo('<<< Generation was successful.');
|
|
|
|
})();
|