UNPKG

dependency-cruiser

Version:

Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.

171 lines (167 loc) 4.87 kB
// @ts-check import prompts from "prompts"; import { isLikelyMonoRepo, isTypeModule, getMonoRepoPackagesCandidates, getSourceFolderCandidates, getTestFolderCandidates, hasJSConfigCandidates, hasTSConfigCandidates, hasTestsWithinSource, toSourceLocationArray, getJSConfigCandidates, getTSConfigCandidates, hasBabelConfigCandidates, getBabelConfigCandidates, hasWebpackConfigCandidates, getWebpackConfigCandidates, likelyUsesBun, } from "./environment-helpers.mjs"; import { validateLocation } from "./validators.mjs"; import { isAvailable as tscIsAvailable } from "#extract/tsc/parse.mjs"; function toPromptChoice(pString) { return { title: pString, value: pString, }; } /** @type {import('prompts').PromptObject[]} */ const QUESTIONS = [ { name: "isMonoRepo", type: () => (isLikelyMonoRepo() ? "confirm" : false), message: "This looks like mono repo. Is that correct?", initial: isLikelyMonoRepo(), }, { name: "isTypeModule", type: () => (isTypeModule() ? "confirm" : false), message: "It looks like this is an ESM package. Is that correct?", initial: isTypeModule(), }, { name: "sourceLocation", type: (_, pAnswers) => (pAnswers.isMonoRepo ? "list" : false), message: "Mono repo it is! Where do your packages live?", initial: getMonoRepoPackagesCandidates().join(", "), validate: validateLocation, }, { name: "combinedDependencies", type: (_, pAnswers) => (pAnswers.isMonoRepo ? "confirm" : false), message: "Do your packages use dependencies declared in the root of your repo?", initial: false, }, { name: "sourceLocation", type: (_, pAnswers) => (pAnswers.isMonoRepo ? false : "list"), message: "Where do your source files live?", initial: getSourceFolderCandidates().join(", "), validate: validateLocation, }, { name: "hasTestsOutsideSource", type: (_, pAnswers) => (pAnswers.isMonoRepo ? false : "confirm"), message: "Do your test files live in a separate folder?", initial: (_, pAnswers) => { return !hasTestsWithinSource( getTestFolderCandidates(), toSourceLocationArray(pAnswers.sourceLocation), ); }, }, { name: "testLocation", type: (_, pAnswers) => pAnswers.hasTestsOutsideSource && !pAnswers.isMonoRepo ? "list" : false, message: "Where do your test files live?", initial: getTestFolderCandidates().join(", "), validate: validateLocation, }, { name: "useJsConfig", type: () => hasJSConfigCandidates() && !hasTSConfigCandidates() ? "confirm" : false, message: "Looks like you're using a 'jsconfig.json'. Use that?", initial: true, }, { name: "jsConfig", type: (_, pAnswers) => (pAnswers.useJsConfig ? "select" : false), message: "Full path to your 'jsconfig.json", choices: getJSConfigCandidates().map((pCandidate) => ({ title: pCandidate, value: pCandidate, })), }, { name: "useTsConfig", type: () => (hasTSConfigCandidates() ? "confirm" : false), message: "Looks like you're using a 'tsconfig.json'. Use that?", initial: true, }, { name: "tsConfig", type: (_, pAnswers) => (pAnswers.useTsConfig ? "select" : false), message: "Full path to your 'tsconfig.json", choices: getTSConfigCandidates().map(toPromptChoice), }, { name: "detectJSDocImports", type: () => (tscIsAvailable() ? "confirm" : false), message: "Do you want to detect JSDoc imports (slightly slower)?", initial: false, }, { name: "detectProcessBuiltinModuleCalls", type: "confirm", message: "Do you want to detect process.getBuiltinModule imports (slightly slower)?", initial: true, }, { name: "tsPreCompilationDeps", type: (_, pAnswers) => (pAnswers.useTsConfig ? "confirm" : false), message: "Also regard TypeScript dependencies that exist only before compilation?", initial: true, }, { name: "useBabelConfig", type: () => (hasBabelConfigCandidates() ? "confirm" : false), message: "Looks like you're using Babel. Use a babel config?", initial: true, }, { name: "babelConfig", type: (_, pAnswers) => (pAnswers.useBabelConfig ? "select" : false), message: "Full path to your babel config:", choices: getBabelConfigCandidates().map(toPromptChoice), }, { name: "useWebPackConfig", type: () => (hasWebpackConfigCandidates() ? "confirm" : false), message: "Looks like you're using webpack - specify a webpack config?", initial: true, }, { name: "webpackConfig", type: (_, pAnswers) => (pAnswers.useWebpackConfig ? "select" : false), message: "Full path to your webpack config:", choices: getWebpackConfigCandidates().map(toPromptChoice), }, { name: "usesBun", type: () => (likelyUsesBun() ? "confirm" : false), message: "Looks like you're using bun. Detect its builtins?", initial: true, }, ]; /** * @return {Promise<import("./types").IPartialInitConfig>} */ export default function getUserInput() { return prompts(QUESTIONS); }