@curvenote/cli
Version:
CLI Client library for Curvenote
65 lines (64 loc) • 2.57 kB
JavaScript
import inquirer from 'inquirer';
import { getMyWorkFromKey, getMyWorksFromDoi, workKeyExists } from './utils.js';
export async function resolveExistingWork(session, opts) {
if (opts.mode === 'id') {
if (opts.forceNew)
return undefined;
if (!opts.key)
return undefined;
return getMyWorkFromKey(session, opts.key);
}
const doi = typeof opts.doi === 'string' && opts.doi.trim().length > 0 ? opts.doi.trim() : undefined;
if (!doi) {
throw new Error(`--key doi requires a non-empty doi in your project config (myst.yml / curvenote.yml). Add a doi field or use --key id.`);
}
let works = [];
if (!opts.forceNew) {
works = await getMyWorksFromDoi(session, doi);
}
if (works.length === 0) {
// In DOI mode, creating a new work can still fail if the project.id/work key
// is already taken by an inaccessible work. Preflight this consistently.
if (opts.fallbackCreateKey) {
const owned = await getMyWorkFromKey(session, opts.fallbackCreateKey);
if (!owned) {
const taken = await workKeyExists(session, opts.fallbackCreateKey);
if (taken) {
throw new Error(`Cannot create a new work for ${opts.contextLabel}: project id/key "${opts.fallbackCreateKey}" is already in use by a work you cannot access.`);
}
}
}
return undefined;
}
let selected = works[0];
if (works.length > 1 && !opts.yes) {
const response = await inquirer.prompt([
{
name: 'workId',
type: 'list',
message: `Multiple works found for DOI "${doi}". Which work should receive a new version for ${opts.contextLabel}?`,
choices: works.map((work) => ({
name: `${work.title || 'Untitled'} (${work.id})`,
value: work.id,
})),
},
]);
selected = works.find((work) => work.id === response.workId) ?? selected;
}
else if (!opts.yes) {
const response = await inquirer.prompt([
{
name: 'confirm',
type: 'confirm',
default: true,
message: `A work you own already exists for DOI "${doi}". Create a new version for ${opts.contextLabel}?`,
},
]);
if (!response.confirm) {
works = [];
}
}
if (works.length === 0)
return undefined;
return selected;
}