@nuxt/devtools
Version:
<a href="https://devtools.nuxt.com"><img width="1200" alt="Nuxt DevTools" src="https://github-production-user-asset-6210df.s3.amazonaws.com/904724/261577617-a10567bd-ad33-48cc-9bda-9e37dbe1929f.png"></a> <br>
174 lines (170 loc) • 5.56 kB
JavaScript
import { existsSync } from 'node:fs';
import fs from 'node:fs/promises';
import { hostname } from 'node:os';
import { resolve } from 'node:path';
import { startSubprocess } from '@nuxt/devtools-kit';
import { logger } from '@nuxt/kit';
import { execa } from 'execa';
import { checkPort, getPort } from 'get-port-please';
import which from 'which';
import { L as LOG_PREFIX } from './module-main.mjs';
import 'consola/utils';
import 'pathe';
import 'sirv';
import 'vite';
import '../shared/devtools.68e43ed6.mjs';
import '../dirs.mjs';
import 'node:url';
import 'is-installed-globally';
import '@antfu/utils';
import 'ohash';
import 'birpc';
import 'flatted';
import 'simple-git';
import 'tinyglobby';
import 'image-meta';
import 'perfect-debounce';
import 'destr';
import 'scule';
import 'unimport';
import '../../dist/runtime/shared/hooks.js';
import 'magicast';
import 'magicast/helpers';
import 'nypm';
import 'node:module';
import 'local-pkg';
import 'pkg-types';
import 'semver';
async function setup({ nuxt, options, openInEditorHooks, rpc }) {
const installed = !!await which("code-server").catch(() => null);
const vsOptions = options?.vscode || {};
let port = vsOptions?.port || 3080;
let url = `http://localhost:${port}`;
let loaded = false;
let promise = null;
const mode = vsOptions?.mode || "local-serve";
const computerHostName = vsOptions.tunnel?.name || hostname().split(".").join("");
const root = nuxt.options.rootDir;
const vscodeServerControllerFile = resolve(root, ".vscode", ".server-controller-port.log");
openInEditorHooks.push(async (file) => {
if (!existsSync(vscodeServerControllerFile))
return false;
try {
const { port: port2 } = JSON.parse(await fs.readFile(vscodeServerControllerFile, "utf-8"));
const url2 = `http://localhost:${port2}/open?path=${encodeURIComponent(file)}`;
await fetch(url2);
rpc.broadcast.navigateTo("/modules/custom-builtin-vscode");
return true;
} catch (e) {
console.debug(`Failed to open file "${file}" in VS Code Server`);
console.debug(e);
return false;
}
});
async function startCodeServer() {
if (existsSync(vscodeServerControllerFile))
await fs.rm(vscodeServerControllerFile, { force: true });
if (vsOptions?.reuseExistingServer && !await checkPort(port)) {
loaded = true;
url = `http://localhost:${port}/?folder=${encodeURIComponent(root)}`;
logger.info(LOG_PREFIX, `Existing VS Code Server found at port ${port}...`);
return;
}
port = await getPort({ port });
url = `http://localhost:${port}/?folder=${encodeURIComponent(root)}`;
logger.info(LOG_PREFIX, `Starting VS Code Server at ${url} ...`);
execa("code-server", [
"serve-local",
"--accept-server-license-terms",
"--install-extension",
"antfu.vscode-server-controller"
], { stderr: "inherit", stdout: "ignore", reject: false });
startSubprocess(
{
command: "code-server",
args: [
"serve-local",
"--accept-server-license-terms",
"--without-connection-token",
`--port=${port}`
]
},
{
id: "devtools:vscode",
name: "VS Code Server",
icon: "logos-visual-studio-code"
},
nuxt
);
for (let i = 0; i < 100; i++) {
if (await fetch(url).then((r) => r.ok).catch(() => false))
break;
await new Promise((resolve2) => setTimeout(resolve2, 500));
}
await new Promise((resolve2) => setTimeout(resolve2, 2e3));
loaded = true;
}
async function startCodeTunnel() {
const { stdout: currentDir } = await execa("pwd");
url = `https://vscode.dev/tunnel/${computerHostName}${currentDir}`;
logger.info(LOG_PREFIX, `Starting VS Code tunnel at ${url} ...`);
const command = execa("code", [
"tunnel",
"--accept-server-license-terms",
"--name",
`${computerHostName}`
]);
command.stderr?.pipe(process.stderr);
command.stdout?.pipe(process.stdout);
nuxt.hook("close", () => {
command.kill();
});
for (let i = 0; i < 100; i++) {
if (await fetch(url).then((r) => r.ok).catch(() => false))
break;
await new Promise((resolve2) => setTimeout(resolve2, 500));
}
await new Promise((resolve2) => setTimeout(resolve2, 2e3));
loaded = true;
}
async function start() {
if (mode === "tunnel")
await startCodeTunnel();
else
await startCodeServer();
}
nuxt.hook("devtools:customTabs", (tabs) => {
tabs.push({
name: "builtin-vscode",
title: "VS Code",
icon: "bxl-visual-studio",
category: "modules",
requireAuth: true,
view: !installed ? {
type: "launch",
title: "Install VS Code Server",
description: `It seems you don't have code-server installed.
Learn more about it with <a href="https://code.visualstudio.com/blogs/2022/07/07/vscode-server" target="_blank">this guide</a>.
Once installed, restart Nuxt and visit this tab again.`,
actions: []
} : !loaded ? {
type: "launch",
description: "Launch VS Code right in the devtools!",
actions: [{
label: promise ? "Starting..." : "Launch",
pending: !!promise,
handle: () => {
promise = promise || start();
return promise;
}
}]
} : {
type: "iframe",
src: url
}
});
});
if (vsOptions?.startOnBoot)
promise = promise || start();
}
export { setup };