@onereach/orest-input-cli
Version:
The tool for creating, serving, and publishing OREST Inputs
160 lines (135 loc) • 3.62 kB
JavaScript
const fs = require('fs');
const runNpmScript = require('./util/runNpmScript');
const removeFromDisk = require('./util/removeFromDisk');
const packBundle = require('./util/packBundle');
const { upload } = require('./upload');
const getMeta = require('./getMetaNpm');
const checkPublished = require('./checkPublished');
const { getProfiles, addProfile } = require('./profiles/profileService');
const prepareAuth = require('./prepareAuth');
function isString(value) {
return typeof value === 'string' || value instanceof String;
}
function isBypassed(options) {
return isString(options.userToken) && isString(options.storeApiUrl);
}
async function main(options) {
let packageType;
let userToken;
let storeApiUrl;
if (isBypassed(options)) {
packageType = options.type;
userToken = options.userToken;
storeApiUrl = options.storeApiUrl;
} else {
const profiles = await getProfiles();
if (!profiles || !profiles[options.profile]) {
await addProfile(options.profile);
}
const { answers, userToken: token } = await prepareAuth(options);
packageType = answers.type || options.type;
userToken = token;
storeApiUrl = answers.storeApiUrl;
}
console.log();
let dirs = options?.directory?.length ? options.directory : [''];
if (options?.directory === true) {
dirs = fs
.readdirSync(process.cwd(), { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name);
}
for (let i = 0; i < dirs.length; i++) {
const relDirPath = dirs[i];
if (options.build && !options.fromNpm) {
await runNpmScript('build', [], relDirPath);
}
const { meta } = await prepareBuild(relDirPath, {
fromNpm: options.fromNpm,
packageName: options.packageName,
packageVersion: options.packageVersion,
});
await publish(
{
storeApiUrl,
packageType,
userToken,
meta,
fromNpm: options.fromNpm,
keepArtifacts: options.keepArtifacts,
},
relDirPath
);
}
}
async function prepareBuild(relDirPath, options) {
let name;
let version;
if (options.fromNpm) {
name = options.packageName;
version = options.packageVersion;
} else {
const orestInputMeta = getMeta(relDirPath);
name = orestInputMeta.name;
version = orestInputMeta.version;
}
const meta = {
id: name, // TODO: validate
name,
description: '',
categories: [],
version,
packageMeta: {
name,
version,
description: '',
},
};
return {
meta,
};
}
async function publish(
{ storeApiUrl, packageType, userToken, meta, fromNpm, keepArtifacts },
relDirPath
) {
const isPublished = await checkPublished({
userToken,
id: meta.id,
version: meta.version,
storeApiUrl,
packageType,
});
console.log();
if (isPublished) {
console.log(`Version ${meta.version} is already published.`);
} else {
const { filePath, destFileName } = await packBundle({
packageName: meta.packageMeta.name,
packageVersion: meta.packageMeta.version,
relDirPath,
fromNpm,
});
await upload({
meta,
filePath,
destFileName,
userToken,
storeApiUrl,
packageType,
});
if (!keepArtifacts) {
await removeFromDisk(filePath);
}
console.log(`Id: ${meta.id}`);
console.log(`Version: ${meta.version}`);
console.log();
console.log('Done!');
}
}
module.exports = (...args) => {
main(...args).catch(err => {
console.error(err);
process.exit(1);
});
};