create-oclif
Version:
oclif: create your own CLI
80 lines (78 loc) • 4.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const command_1 = require("@oclif/command");
const qq = require("qqjs");
const aws_1 = require("../../aws");
const log_1 = require("../../log");
const Tarballs = require("../../tarballs");
const upload_util_1 = require("../../upload-util");
class UploadTarballs extends command_1.Command {
async run() {
const { flags } = this.parse(UploadTarballs);
if (process.platform === 'win32')
throw new Error('upload does not function on windows');
const targets = flags.targets.split(',');
const buildConfig = await Tarballs.buildConfig(flags.root, { targets, xz: flags.xz });
const { s3Config, dist, version, config, xz } = buildConfig;
// fail early if targets are not built
for (const target of buildConfig.targets) {
const tarball = dist(upload_util_1.templateShortKey('versioned', Object.assign({ ext: '.tar.gz', bin: config.bin, version, sha: buildConfig.gitSha }, target)));
// eslint-disable-next-line no-await-in-loop
if (!await qq.exists(tarball))
this.error(`Cannot find a tarball for ${target.platform}-${target.arch}`, {
suggestions: [`Run "oclif-dev pack --target ${target.platform}-${target.arch}" before uploading`],
});
}
const S3Options = {
Bucket: s3Config.bucket,
ACL: s3Config.acl || 'public-read',
};
const uploadTarball = async (options) => {
const TarballS3Options = Object.assign(Object.assign({}, S3Options), { CacheControl: 'max-age=604800' });
const releaseTarballs = async (ext) => {
const localKey = upload_util_1.templateShortKey('versioned', ext, {
arch: options === null || options === void 0 ? void 0 : options.arch,
bin: config.bin,
platform: options === null || options === void 0 ? void 0 : options.platform,
sha: buildConfig.gitSha,
version,
});
const cloudKey = `${upload_util_1.commitAWSDir(version, buildConfig.gitSha, s3Config)}/${localKey}`;
await aws_1.default.s3.uploadFile(dist(localKey), Object.assign(Object.assign({}, TarballS3Options), { ContentType: 'application/gzip', Key: cloudKey }));
};
await releaseTarballs('.tar.gz');
if (xz)
await releaseTarballs('.tar.xz');
const ManifestS3Options = Object.assign(Object.assign({}, S3Options), { CacheControl: 'max-age=86400', ContentType: 'application/json' });
const manifest = upload_util_1.templateShortKey('manifest', {
arch: options === null || options === void 0 ? void 0 : options.arch,
bin: config.bin,
platform: options === null || options === void 0 ? void 0 : options.platform,
sha: buildConfig.gitSha,
version: config.version,
});
const cloudKey = `${upload_util_1.commitAWSDir(version, buildConfig.gitSha, s3Config)}/${manifest}`;
await aws_1.default.s3.uploadFile(dist(manifest), Object.assign(Object.assign({}, ManifestS3Options), { Key: cloudKey }));
};
if (targets.length > 0)
log_1.log('uploading targets');
// eslint-disable-next-line no-await-in-loop
for (const target of buildConfig.targets)
await uploadTarball(target);
log_1.log(`done uploading tarballs & manifests for v${config.version}-${buildConfig.gitSha}`);
}
}
exports.default = UploadTarballs;
UploadTarballs.hidden = true;
UploadTarballs.description = `upload an oclif CLI to S3
"aws-sdk" will need to be installed as a devDependency to upload.
`;
UploadTarballs.flags = {
root: command_1.flags.string({ char: 'r', description: 'path to oclif CLI root', default: '.', required: true }),
targets: command_1.flags.string({
char: 't',
description: 'comma-separated targets to upload (e.g.: linux-arm,win32-x64)',
default: Tarballs.TARGETS.join(','),
}),
xz: command_1.flags.boolean({ description: 'also upload xz', allowNo: true, default: true }),
};