127 lines
4.2 KiB
JavaScript
127 lines
4.2 KiB
JavaScript
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { detectJsPackageManager, hasDependency, installCommandFor, readPackageJson, runScriptCommandFor, } from './packageManager.js';
|
|
function fileExists(root, names) {
|
|
return names.some((name) => fs.existsSync(path.join(root, name)));
|
|
}
|
|
/**
|
|
* Vite + Vue SFC projects (non-Nuxt).
|
|
*/
|
|
export class VueAdapter {
|
|
root;
|
|
kind = 'vue';
|
|
label;
|
|
packageManager;
|
|
pkg;
|
|
constructor(root) {
|
|
this.root = root;
|
|
this.pkg = readPackageJson(root);
|
|
this.packageManager = detectJsPackageManager(root);
|
|
this.label = 'Vue';
|
|
}
|
|
installCommand() {
|
|
const { command, args } = installCommandFor(this.packageManager);
|
|
return { command, args, cwd: this.root };
|
|
}
|
|
devCommand() {
|
|
return this.requireScript(['dev', 'start']);
|
|
}
|
|
buildCommand() {
|
|
return this.scriptOrNull(['build']);
|
|
}
|
|
testCommand(extraArgs = []) {
|
|
return this.scriptOrNull(['test'], extraArgs);
|
|
}
|
|
lintCommand(fix = false) {
|
|
return this.scriptOrNull(fix ? ['format', 'lint:fix'] : ['lint']);
|
|
}
|
|
readyPattern() {
|
|
return /Local:\s+(https?:\/\/\S+)/i;
|
|
}
|
|
describe() {
|
|
return {
|
|
kind: this.kind,
|
|
label: this.label,
|
|
root: this.root,
|
|
packageManager: this.packageManager,
|
|
vueVersion: this.pkg?.dependencies?.vue ?? this.pkg?.devDependencies?.vue ?? null,
|
|
typescript: hasDependency(this.pkg, 'typescript') || fileExists(this.root, ['tsconfig.json']),
|
|
vite: fileExists(this.root, ['vite.config.js', 'vite.config.ts', 'vite.config.mjs']),
|
|
scripts: this.pkg?.scripts ?? {},
|
|
};
|
|
}
|
|
requireScript(candidates) {
|
|
const cmd = this.scriptOrNull(candidates);
|
|
if (!cmd) {
|
|
throw new Error(`No "${candidates.join('"/"')}" script found in package.json at "${this.root}".`);
|
|
}
|
|
return cmd;
|
|
}
|
|
scriptOrNull(candidates, extraArgs = []) {
|
|
const script = candidates.find((name) => this.pkg?.scripts?.[name]);
|
|
if (!script)
|
|
return null;
|
|
const { command, args } = runScriptCommandFor(this.packageManager, script, extraArgs);
|
|
return { command, args, cwd: this.root };
|
|
}
|
|
}
|
|
/**
|
|
* Nuxt (Vue meta-framework) projects.
|
|
*/
|
|
export class NuxtAdapter {
|
|
root;
|
|
kind = 'nuxt';
|
|
label = 'Nuxt';
|
|
packageManager;
|
|
pkg;
|
|
constructor(root) {
|
|
this.root = root;
|
|
this.pkg = readPackageJson(root);
|
|
this.packageManager = detectJsPackageManager(root);
|
|
}
|
|
installCommand() {
|
|
const { command, args } = installCommandFor(this.packageManager);
|
|
return { command, args, cwd: this.root };
|
|
}
|
|
devCommand() {
|
|
return this.requireScript(['dev', 'start']);
|
|
}
|
|
buildCommand() {
|
|
return this.scriptOrNull(['build', 'generate']);
|
|
}
|
|
testCommand(extraArgs = []) {
|
|
return this.scriptOrNull(['test'], extraArgs);
|
|
}
|
|
lintCommand(fix = false) {
|
|
return this.scriptOrNull(fix ? ['format', 'lint:fix'] : ['lint']);
|
|
}
|
|
readyPattern() {
|
|
return /Local:\s+(https?:\/\/\S+)|Nuxt\s+.+ready/i;
|
|
}
|
|
describe() {
|
|
return {
|
|
kind: this.kind,
|
|
label: this.label,
|
|
root: this.root,
|
|
packageManager: this.packageManager,
|
|
nuxtVersion: this.pkg?.dependencies?.nuxt ?? this.pkg?.devDependencies?.nuxt ?? null,
|
|
typescript: hasDependency(this.pkg, 'typescript') || fileExists(this.root, ['tsconfig.json']),
|
|
scripts: this.pkg?.scripts ?? {},
|
|
};
|
|
}
|
|
requireScript(candidates) {
|
|
const cmd = this.scriptOrNull(candidates);
|
|
if (!cmd) {
|
|
throw new Error(`No "${candidates.join('"/"')}" script found in package.json at "${this.root}".`);
|
|
}
|
|
return cmd;
|
|
}
|
|
scriptOrNull(candidates, extraArgs = []) {
|
|
const script = candidates.find((name) => this.pkg?.scripts?.[name]);
|
|
if (!script)
|
|
return null;
|
|
const { command, args } = runScriptCommandFor(this.packageManager, script, extraArgs);
|
|
return { command, args, cwd: this.root };
|
|
}
|
|
}
|
|
//# sourceMappingURL=vue.js.map
|