@tokens-studio/sdk
Version:
The official SDK for Tokens Studio
169 lines • 5.64 kB
JavaScript
/* eslint-disable no-console */
import path from 'node:path';
import fs from 'node:fs/promises';
import { tasks } from '@tokens-studio/cli-kit';
import chalk from 'chalk';
import { prompt } from '../utils/prompt.js';
import { error, info } from '../utils/messages.js';
import { createClient } from '../utils/client.js';
import { configFileName } from '../utils/constants.js';
import { getOrgs, getProjects } from '../utils/queries.js';
import { getVersion } from '../utils/get-version.js';
import { fetchPaginatedData } from '../utils/fetch-paginated-data.js';
async function createConfigFile({ id, org, branch, }, configPath) {
const filepath = path.resolve(configPath ?? '', configFileName);
let shouldWrite = true;
let fileExists = true;
try {
await fs.lstat(filepath);
}
catch (_e) {
fileExists = false;
}
if (fileExists) {
const { overwriteFile } = await prompt([
{
name: 'overwriteFile',
type: 'confirm',
label: '',
message: `File ${chalk.cyanBright(filepath)} already exists, do you want to overwrite it?`,
initial: true,
},
], {}, { name: 'overwriteFile', value: true });
shouldWrite = !!overwriteFile;
}
if (!shouldWrite)
return;
const dirPath = path.dirname(filepath);
let directoryExists = false;
try {
const stat = await fs.lstat(dirPath);
if (stat.isDirectory()) {
directoryExists = true;
}
}
catch (_e) {
await fs.mkdir(dirPath, { recursive: true });
directoryExists = true;
}
if (directoryExists) {
await fs.writeFile(filepath, JSON.stringify({
version: getVersion().split('.')[0],
org,
project: id,
branch,
release: '',
output: 'studio-export',
}, null, 2));
console.log(`\n ${chalk.bold('Successfully wrote your settings to')} ${chalk.cyanBright(filepath)}`);
}
else {
throw new Error(`File already exists at config folder path ${dirPath}, which means we cannot create the ${configFileName} file.`);
}
}
async function selectProject(client) {
let orgs = [];
let projects = [];
console.log('\r');
await tasks({
start: 'Fetching data',
end: 'Done!',
}, [
{
pending: 'orgs',
start: `Getting organizations`,
end: `Fetched organizations`,
while: async () => {
orgs = await fetchPaginatedData(client, getOrgs);
},
onError(e) {
error(e);
},
},
{
pending: 'projects',
start: `Getting projects & branches`,
end: `Fetched projects`,
while: async () => {
const projectsData = await Promise.all(orgs.map(({ id }) => fetchPaginatedData(client, getProjects, { org: id })));
projects = projectsData.flatMap((projs) => {
return projs.map((proj) => {
const { id, name, organizationId: org, branches } = proj;
const branch = (branches.data.find((b) => b.isDefault) ?? branches.data[0]).name;
return { id, name, org, branch };
});
});
},
onError(e) {
error(e);
throw e;
},
},
]);
if (projects.length === 0) {
error(`Your API key does not have access to any existing Studio App projects.`);
return;
}
else if (projects.length === 1) {
info(`Only 1 project available, so we will preselect ${projects[0].name} for you`);
return projects[0];
}
let org;
if (orgs.length === 1) {
info(`Only 1 organization available, so we will preselect ${orgs[0].name} for you`);
org = orgs[0].id;
}
else {
const answer = await prompt([
{
name: 'org',
type: 'select',
label: '',
message: 'Select your organisation',
choices: orgs.map((org) => ({
value: org.id,
label: org.name,
})),
initial: orgs[0]?.id,
},
], {}, { name: 'org', value: orgs[0].id });
org = answer.org;
}
if (!org) {
return;
}
const orgProjects = projects.filter((proj) => proj.org === org);
let proj;
if (orgProjects.length === 0) {
error('No projects available for this organization.');
}
else if (orgProjects.length === 1) {
info(`Only 1 project available, so we will preselect ${orgProjects[0].name} for you`);
proj = orgProjects[0];
}
else {
const answer = await prompt([
{
name: 'proj',
type: 'select',
label: '',
message: 'Select your project',
choices: orgProjects.map((proj) => ({
value: proj,
label: proj.name,
})),
initial: orgProjects[0],
},
], {}, { name: 'proj', value: orgProjects[0] });
proj = answer.proj;
}
return proj;
}
export async function setup(args) {
const client = createClient(args);
const project = await selectProject(client);
if (project) {
await createConfigFile(project, args['--config']);
}
}
//# sourceMappingURL=setup.js.map