Files
mcp_web_dev_server/dist/lib/frameworks/vue.js
T
2026-07-31 13:12:54 -04:00

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