ark-demo/webapp/_templates/layer/new/prompt.js (92 lines of code) (raw):
const path = require('path');
// see types of prompts:
// https://github.com/enquirer/enquirer/tree/master/examples
//
const { promptArgs, getFiles, checkName } = require('../../promptUtils');
const VIEWS_DIR = `components${path.sep}views`;
const prompt = async ({ prompter, args }) => {
let questions = [];
if (!args.name) {
questions.push({
type: 'input',
name: 'name',
message: 'Name:',
});
}
// Check name to remove layer word if the user added it by (his/her)self
let answers = await promptArgs({ prompter, args, questions });
answers.name = checkName(answers.name, 'Layer');
const sourceFiles = await getFiles(`src${path.sep}data${path.sep}sources`);
const sourcesOpts = sourceFiles.reduce((total, { name }) => {
name = name.replace('.js', '');
if (name.includes('Source')) {
total.push({ title: name });
}
return total;
}, []);
if (!sourcesOpts.length) {
throw new Error("There isn't any source to choose.");
}
questions = [
{
type: 'select',
name: 'source_file',
message: 'Choose a source',
choices: [...sourcesOpts],
},
];
answers = {
...answers,
...(await promptArgs({ prompter, args: answers, questions })),
};
// // Detect what kind of layer we need (CartoSQLLayer, CartoBQTilerLayer)
// const selectedSourceFileContent = readFile(`src${path.sep}data${path.sep}sources${path.sep}${answers.source_file}.js`);
// const res = /(?:type: ')(?<type>sql|bigquery*)(?:')/g.exec(selectedSourceFileContent);
// answers.type_source = 'sql';
questions = [
{
type: 'confirm',
name: 'attach',
message: 'Do you want to attach to some view',
},
];
answers = {
...answers,
...(await promptArgs({ prompter, args: answers, questions })),
};
if (answers.attach) {
const viewFiles = await getFiles(`src${path.sep}${VIEWS_DIR}`);
const viewsOpts = viewFiles.reduce((total, { path, name }) => {
name = name.replace('.js', '');
if (/[A-Z]/.test(name[0])) {
total.push({
title: `${name}${
path !== `${VIEWS_DIR}${path.sep}${name}`
? ' (' + path.replace(VIEWS_DIR, 'views') + ')'
: ''
}`,
});
}
return total;
}, []);
if (!viewsOpts.length) {
throw new Error("There isn't any view to choose.");
}
questions = [
{
type: 'select',
name: 'view',
message: 'Choose a view',
choices: [...viewsOpts],
},
];
answers = {
...answers,
...(await promptArgs({ prompter, args: answers, questions })),
};
if (answers.view.includes(`views${path.sep}`)) {
const selectedViewInitialPath = answers.view.split('(')[1].replace(')', '');
answers.view_path = viewFiles.find((viewFile) => {
return viewFile.path === selectedViewInitialPath.replace('views', VIEWS_DIR);
}).path;
} else {
answers.view_path = `${VIEWS_DIR}${path.sep}${answers.view}.js`;
}
}
return answers;
};
module.exports = {
prompt,
};