@onereach/orest-input-cli
Version:
The tool for creating, serving, and publishing OREST Inputs
157 lines (133 loc) • 4 kB
JavaScript
const fs = require('fs');
const { version: uuidVersion, validate: uuidValidate } = require('uuid');
const prepareAuth = require('./prepareAuth');
const StoreApi = require('./api/storeApi');
const getMeta = require('./getMeta');
const checkPublished = require('./checkPublished');
const _uniqueBy = require('lodash/uniqBy');
const chalk = require('chalk');
const { verify: verifyPackageType } = require('./packageType');
const repository = 'account';
function checkUuid(uuid) {
if (!uuidValidate(uuid) && uuidVersion(uuid) !== 4) {
throw new Error(`Invalid UUID: ${uuid}`);
}
return true;
}
async function main(
options = { list: null, remove: null, add: null, removeAll: null }
) {
const { answers, userToken } = await prepareAuth(options);
let packageType;
if (options.type) {
verifyPackageType(options.type, true);
packageType = options.type;
}
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];
const meta = await getMeta(relDirPath);
if (meta.packageType) {
packageType = meta.packageType;
}
verifyPackageType(packageType, true); // throw error if empty, etc.
const storeApi = new StoreApi({
userToken,
storeApiUrl: answers.storeApiUrl,
packageType,
});
const isPublished = await checkPublished(
{
id: meta.packageName,
version: meta.packageVersion,
},
{ storeApi }
);
if (!isPublished) {
console.log(`${meta.packageName}@${meta.packageVersion}`);
console.log(
chalk.red(
' Package is not published yet. Use "publish" command first.'
)
);
console.log();
break;
}
console.log();
console.log(
chalk.gray(
`...Load ${meta.packageName} v${meta.packageVersion} meta data...`
)
);
const [packageStatusDetails] = await storeApi.getVersions({
id: meta.packageName,
});
const membersAccount = packageStatusDetails?.member?.account || [];
console.log();
switch (true) {
case options.removeAll:
await storeApi.setReleaseStatus({
repository,
id: meta.packageName,
version: meta.packageVersion,
member: { account: [] },
});
console.log(chalk.green(`✅ Done! Cleared package members.`));
break;
case options.remove && checkUuid(options.remove):
await storeApi.setReleaseStatus({
repository,
id: meta.packageName,
version: meta.packageVersion,
member: {
account: _uniqueBy(
membersAccount.filter(
({ accountId }) => accountId !== options.remove
),
'accountId'
),
},
});
console.log(
chalk.green(
`✅ Done! ${options.remove} removed from package members.`
)
);
break;
case options.add && checkUuid(options.add):
await storeApi.setReleaseStatus({
repository,
id: meta.packageName,
version: meta.packageVersion,
member: {
account: _uniqueBy(
[...membersAccount, { accountId: options.add }],
'accountId'
),
},
});
console.log(
chalk.green(`✅ Done! ${options.add} added to package members.`)
);
break;
case options.list:
default:
membersAccount.length
? console.table(membersAccount)
: console.log(chalk.redBright('No members found.'));
break;
}
}
}
module.exports = (...args) => {
main(...args).catch(err => {
console.error(err);
process.exit(1);
});
};