mirror of
https://github.com/Heretek-Games/drop-plugin-sdk.git
synced 2026-11-07 10:06:00 -10:00
feat(cli): compile Vue SFCs and add a watch-mode dev server
Bundle .vue Single File Components with unplugin-vue, extract scoped CSS to dist/client.css (updating manifest.client.css), and shim globalThis.Vue so plugin SFCs run against Drop Desktop's Vue runtime. Adds drop-plugin dev: an incremental watch build served over a CORS-enabled local HTTP server for live Drop Desktop loading, and a --template option on init. Covered by new end-to-end CLI feature tests.
This commit is contained in:
1 parent
c5d2251546
commit
5266b3ba36
8 files changed
+1365
-18
No files matched your search
@@ -7,6 +7,7 @@ import {
|
||||
initPlugin,
|
||||
validateManifest,
|
||||
verifyPlugin,
|
||||
startDevServer,
|
||||
} from "../dist/index.js";
|
||||
import { readFile } from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
@@ -52,7 +53,11 @@ function printUsage() {
|
||||
console.log(`Drop Plugin CLI (drop-plugin)
|
||||
|
||||
Usage:
|
||||
drop-plugin init [dir] Initialize a new plugin from starter template
|
||||
drop-plugin init [dir] Initialize a new plugin from template
|
||||
(--template <starter|client-ui|metadata|store|runner|fullstack>)
|
||||
(--id <id> --name <name> --author <author>)
|
||||
drop-plugin dev [dir] Start hot-reloading dev server for live Drop testing
|
||||
(--port <number>)
|
||||
drop-plugin build [dir] Bundle server/client entry points with esbuild and sign
|
||||
(--out-manifest <path> keeps the source manifest clean)
|
||||
drop-plugin sign [dir] Calculate SHA-256 digests and sign drop-plugin.json
|
||||
@@ -85,7 +90,7 @@ async function main() {
|
||||
switch (command) {
|
||||
case "sign": {
|
||||
const outManifest = readFlagValue(args, "--out-manifest");
|
||||
const dir = positionalArg(args, [outManifest]) || ".";
|
||||
const dir = positionalArg(args, [outManifest].filter(Boolean)) || ".";
|
||||
const res = await signPlugin(dir, undefined, true, { outManifest });
|
||||
console.log(
|
||||
`Signed bundle at ${dir}: ${res.fileCount} files verified (signature: ${res.signed ? "yes" : "no"})` +
|
||||
@@ -104,21 +109,40 @@ async function main() {
|
||||
}
|
||||
case "build": {
|
||||
const outManifest = readFlagValue(args, "--out-manifest");
|
||||
const dir = positionalArg(args, [outManifest]) || ".";
|
||||
const dir = positionalArg(args, [outManifest].filter(Boolean)) || ".";
|
||||
const res = await buildPlugin(dir, { outManifest });
|
||||
console.log(
|
||||
`Built plugin at ${dir} (server: ${res.serverBuilt ? "yes" : "no"}, client: ${res.clientBuilt ? "yes" : "no"})`,
|
||||
);
|
||||
break;
|
||||
}
|
||||
case "dev": {
|
||||
const portStr = readFlagValue(args, "--port");
|
||||
const port = portStr ? parseInt(portStr, 10) : undefined;
|
||||
const dir = positionalArg(args, [portStr].filter(Boolean)) || ".";
|
||||
const server = await startDevServer(dir, { port });
|
||||
console.log(`Drop plugin dev server running at ${server.url}`);
|
||||
console.log(`Serving manifest: ${server.manifestUrl}`);
|
||||
console.log(`Press Ctrl+C to stop.`);
|
||||
await new Promise(() => {});
|
||||
break;
|
||||
}
|
||||
case "test": {
|
||||
const dir = args[0] || ".";
|
||||
await testPlugin(dir);
|
||||
break;
|
||||
}
|
||||
case "init": {
|
||||
const dir = args[0] || "my-drop-plugin";
|
||||
const res = await initPlugin(dir);
|
||||
const template = readFlagValue(args, "--template");
|
||||
const id = readFlagValue(args, "--id");
|
||||
const name = readFlagValue(args, "--name");
|
||||
const author = readFlagValue(args, "--author");
|
||||
const dir =
|
||||
positionalArg(
|
||||
args,
|
||||
[template, id, name, author].filter(Boolean),
|
||||
) || (id ? id : "my-drop-plugin");
|
||||
const res = await initPlugin(dir, { template, id, name, author });
|
||||
console.log(
|
||||
`Initialized new Drop plugin '${res.id}' at ${res.targetPath}`,
|
||||
);
|
||||
|
||||
@@ -50,6 +50,8 @@
|
||||
"dependencies": {
|
||||
"@drop-oss/plugin-sdk": "workspace:*",
|
||||
"ajv": "^8.20.0",
|
||||
"esbuild": "^0.28.2"
|
||||
"esbuild": "^0.28.2",
|
||||
"unplugin-vue": "^8.0.0",
|
||||
"vue": "^3.5.42"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import * as esbuild from "esbuild";
|
||||
import path from "node:path";
|
||||
import { readFile, stat } from "node:fs/promises";
|
||||
import { readFile, writeFile, stat } from "node:fs/promises";
|
||||
import vue from "unplugin-vue/esbuild";
|
||||
import { signPlugin } from "./signer.js";
|
||||
|
||||
export interface BuildOptions {
|
||||
@@ -10,18 +11,68 @@ export interface BuildOptions {
|
||||
signingKey?: string;
|
||||
/** Write derived manifest fields here instead of the source manifest. */
|
||||
outManifest?: string;
|
||||
/** Watch for changes and rebuild incrementally. */
|
||||
watch?: boolean;
|
||||
/** Callback invoked on incremental rebuild completion (in watch mode). */
|
||||
onRebuild?: (result: { error?: Error }) => void;
|
||||
}
|
||||
|
||||
export interface BuildResult {
|
||||
serverBuilt: boolean;
|
||||
clientBuilt: boolean;
|
||||
contexts?: esbuild.BuildContext[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Global shim so bundled Vue SFCs and imports from "vue" resolve to globalThis.Vue (set by Drop Desktop)
|
||||
* at runtime without requiring browser import maps.
|
||||
*/
|
||||
const vueGlobalShimPlugin: esbuild.Plugin = {
|
||||
name: "vue-global-shim",
|
||||
setup(build) {
|
||||
build.onResolve({ filter: /^vue$/ }, () => {
|
||||
return { path: "virtual:vue", namespace: "vue-shim" };
|
||||
});
|
||||
build.onLoad({ filter: /.*/, namespace: "vue-shim" }, () => {
|
||||
return {
|
||||
contents: `
|
||||
const v = globalThis.Vue || (typeof window !== "undefined" ? window.Vue : {});
|
||||
export default v;
|
||||
export const {
|
||||
ref, reactive, computed, watch, watchEffect,
|
||||
onMounted, onUnmounted, onUpdated, onBeforeMount, onBeforeUnmount,
|
||||
h, defineComponent, nextTick, shallowRef, shallowReactive,
|
||||
toRef, toRefs, isRef, isReactive, unref,
|
||||
openBlock, createElementBlock, createBlock, createVNode, createCommentVNode,
|
||||
createTextVNode, createElementVNode, toDisplayString, withDirectives,
|
||||
vShow, vModelText, vModelCheckbox, vModelRadio, vModelSelect,
|
||||
Fragment, Static, Comment, Text, Teleport, Suspense, KeepAlive,
|
||||
renderSlot, resolveComponent, resolveDirective, normalizeClass, normalizeStyle,
|
||||
withCtx, withModifiers, withKeys, renderList, pushScopeId, popScopeId
|
||||
} = new Proxy(v, {
|
||||
get: (target, prop) => {
|
||||
const root = globalThis.Vue || (typeof window !== "undefined" ? window.Vue : undefined);
|
||||
return root ? root[prop] : target[prop];
|
||||
}
|
||||
});
|
||||
`,
|
||||
loader: "js",
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export async function buildPlugin(
|
||||
targetDir = ".",
|
||||
options: BuildOptions = {},
|
||||
): Promise<{ serverBuilt: boolean; clientBuilt: boolean }> {
|
||||
): Promise<BuildResult> {
|
||||
const dir = path.resolve(process.cwd(), targetDir);
|
||||
const manifestPath = path.join(dir, "drop-plugin.json");
|
||||
const manifest = JSON.parse(await readFile(manifestPath, "utf-8"));
|
||||
|
||||
let serverBuilt = false;
|
||||
let clientBuilt = false;
|
||||
const contexts: esbuild.BuildContext[] = [];
|
||||
|
||||
// 1. Build Server Entry if source exists
|
||||
const serverSourceCandidates = [
|
||||
@@ -46,7 +97,7 @@ export async function buildPlugin(
|
||||
);
|
||||
|
||||
if (serverEntrySource) {
|
||||
await esbuild.build({
|
||||
const serverConfig: esbuild.BuildOptions = {
|
||||
entryPoints: [serverEntrySource],
|
||||
outfile: serverOutFile,
|
||||
bundle: true,
|
||||
@@ -62,7 +113,15 @@ export async function buildPlugin(
|
||||
"h3",
|
||||
"pino",
|
||||
],
|
||||
});
|
||||
};
|
||||
|
||||
if (options.watch) {
|
||||
const serverCtx = await esbuild.context(serverConfig);
|
||||
await serverCtx.watch();
|
||||
contexts.push(serverCtx);
|
||||
} else {
|
||||
await esbuild.build(serverConfig);
|
||||
}
|
||||
serverBuilt = true;
|
||||
}
|
||||
|
||||
@@ -88,7 +147,15 @@ export async function buildPlugin(
|
||||
);
|
||||
|
||||
if (clientEntrySource) {
|
||||
await esbuild.build({
|
||||
const clientPlugins: esbuild.Plugin[] = [
|
||||
vueGlobalShimPlugin,
|
||||
(vue as unknown as (opts: unknown) => esbuild.Plugin)({
|
||||
isProduction: true,
|
||||
sourceMap: false,
|
||||
}),
|
||||
];
|
||||
|
||||
const clientConfig: esbuild.BuildOptions = {
|
||||
entryPoints: [clientEntrySource],
|
||||
outfile: clientOutFile,
|
||||
bundle: true,
|
||||
@@ -97,14 +164,34 @@ export async function buildPlugin(
|
||||
format: "esm",
|
||||
sourcemap: options.sourcemap ?? true,
|
||||
minify: options.minify ?? false,
|
||||
plugins: clientPlugins,
|
||||
external: [
|
||||
"vue",
|
||||
"@drop-oss/plugin-sdk",
|
||||
"@droposs/plugin-sdk",
|
||||
"@drop/plugin-sdk",
|
||||
],
|
||||
});
|
||||
};
|
||||
|
||||
if (options.watch) {
|
||||
const clientCtx = await esbuild.context(clientConfig);
|
||||
await clientCtx.watch();
|
||||
contexts.push(clientCtx);
|
||||
} else {
|
||||
await esbuild.build(clientConfig);
|
||||
}
|
||||
clientBuilt = true;
|
||||
|
||||
// Check if CSS was emitted and update manifest.client.css if necessary
|
||||
const clientCssCandidate = clientOutFile.replace(/\.[^.]+$/, ".css");
|
||||
if (await stat(clientCssCandidate).catch(() => null)) {
|
||||
const relCss = path
|
||||
.relative(dir, clientCssCandidate)
|
||||
.replaceAll("\\", "/");
|
||||
if (manifest.client && manifest.client.css !== relCss) {
|
||||
manifest.client.css = relCss;
|
||||
await writeFile(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Automatically re-sign the plugin bundle after building
|
||||
@@ -114,5 +201,6 @@ export async function buildPlugin(
|
||||
});
|
||||
}
|
||||
|
||||
return { serverBuilt, clientBuilt };
|
||||
return { serverBuilt, clientBuilt, contexts: contexts.length > 0 ? contexts : undefined };
|
||||
}
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
import http from "node:http";
|
||||
import path from "node:path";
|
||||
import { readFile, stat } from "node:fs/promises";
|
||||
import { buildPlugin } from "./builder.js";
|
||||
|
||||
export interface DevServerOptions {
|
||||
port?: number;
|
||||
host?: string;
|
||||
sign?: boolean;
|
||||
}
|
||||
|
||||
export interface DevServerInstance {
|
||||
server: http.Server;
|
||||
port: number;
|
||||
url: string;
|
||||
manifestUrl: string;
|
||||
close: () => Promise<void>;
|
||||
stop: () => Promise<void>;
|
||||
}
|
||||
|
||||
const MIME_TYPES: Record<string, string> = {
|
||||
".js": "application/javascript",
|
||||
".mjs": "application/javascript",
|
||||
".css": "text/css",
|
||||
".json": "application/json",
|
||||
".html": "text/html",
|
||||
".png": "image/png",
|
||||
".jpg": "image/jpeg",
|
||||
".svg": "image/svg+xml",
|
||||
};
|
||||
|
||||
export async function startDevServer(
|
||||
targetDir = ".",
|
||||
options: DevServerOptions = {},
|
||||
): Promise<DevServerInstance> {
|
||||
const dir = path.resolve(process.cwd(), targetDir);
|
||||
const manifestPath = path.join(dir, "drop-plugin.json");
|
||||
const manifest = JSON.parse(await readFile(manifestPath, "utf-8"));
|
||||
|
||||
const port = options.port ?? 4567;
|
||||
const host = options.host ?? "localhost";
|
||||
|
||||
// 1. Start incremental watch build
|
||||
const buildResult = await buildPlugin(dir, {
|
||||
watch: true,
|
||||
sign: options.sign ?? true,
|
||||
});
|
||||
|
||||
// 2. Start HTTP static server with CORS
|
||||
const server = http.createServer(async (req, res) => {
|
||||
// CORS headers for Drop Desktop webview
|
||||
res.setHeader("Access-Control-Allow-Origin", "*");
|
||||
res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS");
|
||||
res.setHeader("Access-Control-Allow-Headers", "*");
|
||||
|
||||
if (req.method === "OPTIONS") {
|
||||
res.writeHead(204);
|
||||
res.end();
|
||||
return;
|
||||
}
|
||||
|
||||
const urlPath = (req.url || "/").split("?")[0] || "/";
|
||||
const filePath = path.join(dir, urlPath);
|
||||
|
||||
// Prevent directory traversal
|
||||
const rel = path.relative(dir, filePath);
|
||||
if (rel.startsWith("..") || path.isAbsolute(rel)) {
|
||||
res.writeHead(403);
|
||||
res.end("Forbidden");
|
||||
return;
|
||||
}
|
||||
|
||||
const fileStat = await stat(filePath).catch(() => null);
|
||||
if (!fileStat || fileStat.isDirectory()) {
|
||||
res.writeHead(404);
|
||||
res.end("File not found");
|
||||
return;
|
||||
}
|
||||
|
||||
const ext = path.extname(filePath).toLowerCase();
|
||||
const contentType = MIME_TYPES[ext] || "application/octet-stream";
|
||||
|
||||
try {
|
||||
const content = await readFile(filePath);
|
||||
res.writeHead(200, { "Content-Type": contentType });
|
||||
res.end(content);
|
||||
} catch {
|
||||
res.writeHead(500);
|
||||
res.end("Internal Server Error");
|
||||
}
|
||||
});
|
||||
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
server.listen(port, host, () => resolve());
|
||||
server.on("error", reject);
|
||||
});
|
||||
|
||||
const address = server.address();
|
||||
const actualPort =
|
||||
typeof address === "object" && address ? address.port : port;
|
||||
const url = `http://${host}:${actualPort}`;
|
||||
const manifestUrl = `${url}/drop-plugin.json`;
|
||||
const clientEntry = manifest.client?.entry ?? "dist/src/client.js";
|
||||
|
||||
console.log(`[drop-plugin] Dev server running at ${url}/`);
|
||||
console.log(
|
||||
`[drop-plugin] Client bundle URL: ${url}/${clientEntry}`,
|
||||
);
|
||||
console.log(
|
||||
`[drop-plugin] In Drop Desktop, test this plugin via Extension Settings -> Load Dev Plugin:`,
|
||||
);
|
||||
console.log(` ${url}/${clientEntry}`);
|
||||
console.log(`[drop-plugin] Watching for file changes... (Press Ctrl+C to stop)`);
|
||||
|
||||
const close = async () => {
|
||||
if (buildResult.contexts) {
|
||||
for (const ctx of buildResult.contexts) {
|
||||
await ctx.dispose();
|
||||
}
|
||||
}
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
};
|
||||
|
||||
return {
|
||||
server,
|
||||
port: actualPort,
|
||||
url,
|
||||
manifestUrl,
|
||||
close,
|
||||
stop: close,
|
||||
};
|
||||
}
|
||||
@@ -2,3 +2,5 @@ export * from "./signer.js";
|
||||
export * from "./builder.js";
|
||||
export * from "./testRunner.js";
|
||||
export * from "./scaffolder.js";
|
||||
export * from "./devServer.js";
|
||||
|
||||
@@ -1,10 +1,45 @@
|
||||
import path from "node:path";
|
||||
import { cp, mkdir, readFile, writeFile, stat } from "node:fs/promises";
|
||||
|
||||
export type TemplateType =
|
||||
| "starter"
|
||||
| "client-ui"
|
||||
| "metadata"
|
||||
| "store"
|
||||
| "runner"
|
||||
| "fullstack";
|
||||
|
||||
export interface InitOptions {
|
||||
id?: string;
|
||||
name?: string;
|
||||
author?: string;
|
||||
template?: string;
|
||||
}
|
||||
|
||||
export function resolveTemplateFolder(templateName: string = "starter"): string {
|
||||
const norm = templateName.replace(/^template-/, "").toLowerCase();
|
||||
switch (norm) {
|
||||
case "client-ui":
|
||||
case "ui":
|
||||
case "client":
|
||||
return "template-client-ui";
|
||||
case "metadata":
|
||||
return "template-metadata";
|
||||
case "store":
|
||||
return "template-store";
|
||||
case "runner":
|
||||
return "template-runner";
|
||||
case "fullstack":
|
||||
case "full":
|
||||
return "template-fullstack";
|
||||
case "starter":
|
||||
case "default":
|
||||
return "starter-plugin";
|
||||
default:
|
||||
throw new Error(
|
||||
`Unknown template "${templateName}". Available templates: starter, client-ui, metadata, store, runner, fullstack`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export async function initPlugin(
|
||||
@@ -14,16 +49,25 @@ export async function initPlugin(
|
||||
const targetPath = path.resolve(process.cwd(), targetDir);
|
||||
await mkdir(targetPath, { recursive: true });
|
||||
|
||||
const folder = resolveTemplateFolder(options.template);
|
||||
|
||||
const candidates = [
|
||||
path.resolve(
|
||||
path.dirname(new URL(import.meta.url).pathname),
|
||||
"../../../templates/starter-plugin",
|
||||
"../../../templates",
|
||||
folder,
|
||||
),
|
||||
path.resolve(
|
||||
path.dirname(new URL(import.meta.url).pathname),
|
||||
"../templates/starter-plugin",
|
||||
"../../templates",
|
||||
folder,
|
||||
),
|
||||
path.resolve(process.cwd(), "templates/starter-plugin"),
|
||||
path.resolve(
|
||||
path.dirname(new URL(import.meta.url).pathname),
|
||||
"../templates",
|
||||
folder,
|
||||
),
|
||||
path.resolve(process.cwd(), "templates", folder),
|
||||
];
|
||||
|
||||
let templateDir: string | null = null;
|
||||
@@ -35,7 +79,7 @@ export async function initPlugin(
|
||||
}
|
||||
|
||||
if (!templateDir) {
|
||||
throw new Error("Starter plugin template directory not found");
|
||||
throw new Error(`Plugin template directory for "${folder}" not found`);
|
||||
}
|
||||
|
||||
await cp(templateDir, targetPath, {
|
||||
|
||||
@@ -0,0 +1,285 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import fs from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import os from "node:os";
|
||||
import {
|
||||
validateManifest,
|
||||
initPlugin,
|
||||
buildPlugin,
|
||||
startDevServer,
|
||||
} from "../dist/index.js";
|
||||
|
||||
async function makeTempDir(): Promise<string> {
|
||||
return await fs.mkdtemp(path.join(os.tmpdir(), "drop-cli-feature-test-"));
|
||||
}
|
||||
|
||||
test("validateManifest accepts new capabilities and settingsSchema", async () => {
|
||||
const manifest = {
|
||||
id: "extended-plugin",
|
||||
name: "Extended Plugin",
|
||||
version: "1.0.0",
|
||||
apiVersion: 2,
|
||||
targets: ["server", "client"],
|
||||
server: {
|
||||
entry: "dist/server.js",
|
||||
capabilities: ["auth:provider", "storage:depot"],
|
||||
},
|
||||
client: {
|
||||
entry: "dist/client.js",
|
||||
capabilities: ["game:runner"],
|
||||
},
|
||||
settingsSchema: {
|
||||
fields: [
|
||||
{
|
||||
key: "apiKey",
|
||||
label: "API Key",
|
||||
type: "password",
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
key: "enabled",
|
||||
label: "Enabled",
|
||||
type: "boolean",
|
||||
default: true,
|
||||
},
|
||||
{
|
||||
key: "runnerMode",
|
||||
label: "Runner Mode",
|
||||
type: "select",
|
||||
options: [
|
||||
{ label: "Proton", value: "proton" },
|
||||
{ label: "Wine", value: "wine" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
const res = await validateManifest(manifest);
|
||||
assert.equal(res.valid, true, `Validation errors: ${res.errors.join(", ")}`);
|
||||
});
|
||||
|
||||
test("initPlugin scaffolds various templates correctly", async () => {
|
||||
const tmp = await makeTempDir();
|
||||
|
||||
// Test client-ui template
|
||||
const uiDir = path.join(tmp, "ui-plugin");
|
||||
const uiRes = await initPlugin(uiDir, {
|
||||
template: "client-ui",
|
||||
id: "custom-ui",
|
||||
name: "Custom UI Plugin",
|
||||
});
|
||||
assert.equal(uiRes.id, "custom-ui");
|
||||
const uiManifest = JSON.parse(
|
||||
await fs.readFile(path.join(uiDir, "drop-plugin.json"), "utf-8"),
|
||||
);
|
||||
assert.equal(uiManifest.id, "custom-ui");
|
||||
assert.equal(uiManifest.name, "Custom UI Plugin");
|
||||
assert.ok(
|
||||
await fs.stat(path.join(uiDir, "src/components/MyPanel.vue")).catch(() => null),
|
||||
);
|
||||
|
||||
// Test metadata template
|
||||
const metaDir = path.join(tmp, "meta-plugin");
|
||||
const metaRes = await initPlugin(metaDir, {
|
||||
template: "metadata",
|
||||
id: "custom-meta",
|
||||
});
|
||||
assert.equal(metaRes.id, "custom-meta");
|
||||
const metaManifest = JSON.parse(
|
||||
await fs.readFile(path.join(metaDir, "drop-plugin.json"), "utf-8"),
|
||||
);
|
||||
assert.ok(metaManifest.server.capabilities.includes("metadata:provider"));
|
||||
|
||||
// Test store template
|
||||
const storeDir = path.join(tmp, "store-plugin");
|
||||
const storeRes = await initPlugin(storeDir, {
|
||||
template: "store",
|
||||
id: "custom-store",
|
||||
});
|
||||
assert.equal(storeRes.id, "custom-store");
|
||||
const storeManifest = JSON.parse(
|
||||
await fs.readFile(path.join(storeDir, "drop-plugin.json"), "utf-8"),
|
||||
);
|
||||
assert.ok(storeManifest.client.capabilities.includes("client:library-scan"));
|
||||
|
||||
// Test runner template
|
||||
const runnerDir = path.join(tmp, "runner-plugin");
|
||||
const runnerRes = await initPlugin(runnerDir, {
|
||||
template: "runner",
|
||||
id: "custom-runner",
|
||||
});
|
||||
assert.equal(runnerRes.id, "custom-runner");
|
||||
const runnerManifest = JSON.parse(
|
||||
await fs.readFile(path.join(runnerDir, "drop-plugin.json"), "utf-8"),
|
||||
);
|
||||
assert.ok(runnerManifest.client.capabilities.includes("game:runner"));
|
||||
|
||||
// Test fullstack template
|
||||
const fullDir = path.join(tmp, "full-plugin");
|
||||
const fullRes = await initPlugin(fullDir, {
|
||||
template: "fullstack",
|
||||
id: "custom-full",
|
||||
});
|
||||
assert.equal(fullRes.id, "custom-full");
|
||||
const fullManifest = JSON.parse(
|
||||
await fs.readFile(path.join(fullDir, "drop-plugin.json"), "utf-8"),
|
||||
);
|
||||
assert.ok(fullManifest.targets.includes("server"));
|
||||
assert.ok(fullManifest.targets.includes("client"));
|
||||
assert.equal(fullManifest.settingsSchema.fields.length, 4);
|
||||
assert.ok(
|
||||
await fs
|
||||
.stat(path.join(fullDir, "src/components/StatusPanel.vue"))
|
||||
.catch(() => null),
|
||||
);
|
||||
|
||||
await fs.rm(tmp, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
test("buildPlugin compiles Vue 3 SFC and extracts CSS", async () => {
|
||||
const tmp = await makeTempDir();
|
||||
const manifest = {
|
||||
id: "vue-test-plugin",
|
||||
name: "Vue Test Plugin",
|
||||
version: "1.0.0",
|
||||
apiVersion: 2,
|
||||
targets: ["client"],
|
||||
client: {
|
||||
entry: "dist/client.js",
|
||||
capabilities: ["ui:slot"],
|
||||
},
|
||||
};
|
||||
|
||||
await fs.writeFile(
|
||||
path.join(tmp, "drop-plugin.json"),
|
||||
JSON.stringify(manifest, null, 2),
|
||||
);
|
||||
await fs.mkdir(path.join(tmp, "src"), { recursive: true });
|
||||
|
||||
const sfcCode = `<template>
|
||||
<div class="test-sfc-card">
|
||||
<span class="greeting">{{ greeting }}</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from "vue";
|
||||
const greeting = ref("Hello from Vue SFC!");
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.test-sfc-card {
|
||||
padding: 16px;
|
||||
background: #111;
|
||||
}
|
||||
.greeting {
|
||||
color: #42b883;
|
||||
}
|
||||
</style>
|
||||
`;
|
||||
await fs.writeFile(path.join(tmp, "src/MyCard.vue"), sfcCode, "utf-8");
|
||||
|
||||
const clientTs = `import MyCard from "./MyCard.vue";
|
||||
import type { ClientPlugin, ClientPluginContext } from "@drop-oss/plugin-sdk";
|
||||
|
||||
export default class TestPlugin implements ClientPlugin {
|
||||
metadata = {
|
||||
id: "vue-test-plugin",
|
||||
name: "Vue Test Plugin",
|
||||
version: "1.0.0",
|
||||
apiVersion: 2,
|
||||
targets: ["client" as const],
|
||||
capabilities: ["ui:slot" as const],
|
||||
};
|
||||
|
||||
async init(ctx: ClientPluginContext): Promise<void> {
|
||||
ctx.registerSlot("game-details:tab", MyCard);
|
||||
}
|
||||
}
|
||||
`;
|
||||
await fs.writeFile(path.join(tmp, "src/client.ts"), clientTs, "utf-8");
|
||||
|
||||
const buildResult = await buildPlugin(tmp);
|
||||
assert.equal(buildResult.clientBuilt, true);
|
||||
|
||||
const clientJs = await fs.readFile(path.join(tmp, "dist/client.js"), "utf-8");
|
||||
assert.ok(
|
||||
clientJs.includes("Hello from Vue SFC!"),
|
||||
"Expected compiled template text in JS bundle",
|
||||
);
|
||||
assert.ok(
|
||||
clientJs.includes("globalThis.Vue"),
|
||||
"Expected globalThis.Vue shim in JS bundle",
|
||||
);
|
||||
|
||||
const clientCss = await fs.readFile(path.join(tmp, "dist/client.css"), "utf-8");
|
||||
assert.ok(
|
||||
clientCss.includes(".test-sfc-card"),
|
||||
"Expected CSS rule in extracted client.css",
|
||||
);
|
||||
|
||||
const updatedManifest = JSON.parse(
|
||||
await fs.readFile(path.join(tmp, "drop-plugin.json"), "utf-8"),
|
||||
);
|
||||
assert.equal(updatedManifest.client.css, "dist/client.css");
|
||||
|
||||
await fs.rm(tmp, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
test("startDevServer serves manifest and assets with CORS headers", async () => {
|
||||
const tmp = await makeTempDir();
|
||||
const manifest = {
|
||||
id: "dev-server-plugin",
|
||||
name: "Dev Server Plugin",
|
||||
version: "1.0.0",
|
||||
apiVersion: 2,
|
||||
targets: ["client"],
|
||||
client: {
|
||||
entry: "dist/client.js",
|
||||
capabilities: ["ui:slot"],
|
||||
},
|
||||
};
|
||||
|
||||
await fs.writeFile(
|
||||
path.join(tmp, "drop-plugin.json"),
|
||||
JSON.stringify(manifest, null, 2),
|
||||
);
|
||||
await fs.mkdir(path.join(tmp, "src"), { recursive: true });
|
||||
await fs.writeFile(
|
||||
path.join(tmp, "src/client.ts"),
|
||||
"console.log('dev build');",
|
||||
"utf-8",
|
||||
);
|
||||
|
||||
// Set port to 0 for ephemeral port assignment
|
||||
const server = await startDevServer(tmp, { port: 0 });
|
||||
assert.ok(server.port > 0);
|
||||
|
||||
try {
|
||||
// Fetch manifest
|
||||
const manifestRes = await fetch(server.manifestUrl);
|
||||
assert.equal(manifestRes.status, 200);
|
||||
assert.equal(
|
||||
manifestRes.headers.get("access-control-allow-origin"),
|
||||
"*",
|
||||
);
|
||||
const servedManifest = await manifestRes.json();
|
||||
assert.equal(servedManifest.id, "dev-server-plugin");
|
||||
|
||||
// Fetch client.js
|
||||
const jsRes = await fetch(`${server.url}/dist/client.js`);
|
||||
assert.equal(jsRes.status, 200);
|
||||
assert.equal(jsRes.headers.get("access-control-allow-origin"), "*");
|
||||
const jsContent = await jsRes.text();
|
||||
assert.ok(jsContent.includes("dev build"));
|
||||
|
||||
// Test 404
|
||||
const notFoundRes = await fetch(`${server.url}/nonexistent.js`);
|
||||
assert.equal(notFoundRes.status, 404);
|
||||
} finally {
|
||||
await server.stop();
|
||||
await fs.rm(tmp, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
Generated
+770
@@ -35,6 +35,12 @@ importers:
|
||||
esbuild:
|
||||
specifier: ^0.28.2
|
||||
version: 0.28.2
|
||||
unplugin-vue:
|
||||
specifier: ^8.0.0
|
||||
version: 8.0.0(@types/[email protected])([email protected])([email protected])([email protected]([email protected]))
|
||||
vue:
|
||||
specifier: ^3.5.42
|
||||
version: 3.5.42([email protected])
|
||||
devDependencies:
|
||||
'@types/node':
|
||||
specifier: ^26.5.1
|
||||
@@ -68,8 +74,111 @@ importers:
|
||||
specifier: ^5.7.0
|
||||
version: 5.9.3
|
||||
|
||||
templates/template-client-ui:
|
||||
dependencies:
|
||||
'@drop-oss/plugin-sdk':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-sdk
|
||||
devDependencies:
|
||||
'@drop-oss/plugin-cli':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-cli
|
||||
'@types/node':
|
||||
specifier: ^26.5.1
|
||||
version: 26.5.1
|
||||
typescript:
|
||||
specifier: ^5.7.0
|
||||
version: 5.9.3
|
||||
vue:
|
||||
specifier: ^3.5.0
|
||||
version: 3.5.42([email protected])
|
||||
|
||||
templates/template-fullstack:
|
||||
dependencies:
|
||||
'@drop-oss/plugin-sdk':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-sdk
|
||||
devDependencies:
|
||||
'@drop-oss/plugin-cli':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-cli
|
||||
'@types/node':
|
||||
specifier: ^26.5.1
|
||||
version: 26.5.1
|
||||
typescript:
|
||||
specifier: ^5.7.0
|
||||
version: 5.9.3
|
||||
vue:
|
||||
specifier: ^3.5.0
|
||||
version: 3.5.42([email protected])
|
||||
|
||||
templates/template-metadata:
|
||||
dependencies:
|
||||
'@drop-oss/plugin-sdk':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-sdk
|
||||
devDependencies:
|
||||
'@drop-oss/plugin-cli':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-cli
|
||||
'@types/node':
|
||||
specifier: ^26.5.1
|
||||
version: 26.5.1
|
||||
typescript:
|
||||
specifier: ^5.7.0
|
||||
version: 5.9.3
|
||||
|
||||
templates/template-runner:
|
||||
dependencies:
|
||||
'@drop-oss/plugin-sdk':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-sdk
|
||||
devDependencies:
|
||||
'@drop-oss/plugin-cli':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-cli
|
||||
'@types/node':
|
||||
specifier: ^26.5.1
|
||||
version: 26.5.1
|
||||
typescript:
|
||||
specifier: ^5.7.0
|
||||
version: 5.9.3
|
||||
|
||||
templates/template-store:
|
||||
dependencies:
|
||||
'@drop-oss/plugin-sdk':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-sdk
|
||||
devDependencies:
|
||||
'@drop-oss/plugin-cli':
|
||||
specifier: workspace:*
|
||||
version: link:../../packages/plugin-cli
|
||||
'@types/node':
|
||||
specifier: ^26.5.1
|
||||
version: 26.5.1
|
||||
typescript:
|
||||
specifier: ^5.7.0
|
||||
version: 5.9.3
|
||||
|
||||
packages:
|
||||
|
||||
'@babel/[email protected]':
|
||||
resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@babel/[email protected]':
|
||||
resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@babel/[email protected]':
|
||||
resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
hasBin: true
|
||||
|
||||
'@babel/[email protected]':
|
||||
resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@cacheable/[email protected]':
|
||||
resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==}
|
||||
|
||||
@@ -291,6 +400,22 @@ packages:
|
||||
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
|
||||
engines: {node: '>=18.18'}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
|
||||
|
||||
'@keyv/[email protected]':
|
||||
resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==}
|
||||
engines: {node: '>= 18'}
|
||||
@@ -300,6 +425,108 @@ packages:
|
||||
'@keyv/[email protected]':
|
||||
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
|
||||
|
||||
'@oxc-project/[email protected]':
|
||||
resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==}
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [android]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [ppc64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [s390x]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [openharmony]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
|
||||
|
||||
'@types/[email protected]':
|
||||
resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
|
||||
|
||||
@@ -371,6 +598,33 @@ packages:
|
||||
resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==}
|
||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==}
|
||||
|
||||
'@vue/[email protected]':
|
||||
resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
||||
peerDependencies:
|
||||
@@ -402,6 +656,9 @@ packages:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
|
||||
engines: {node: '>=6.0'}
|
||||
@@ -414,6 +671,14 @@ packages:
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
|
||||
engines: {node: '>=0.12'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
|
||||
engines: {node: '>=18'}
|
||||
@@ -461,6 +726,9 @@ packages:
|
||||
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
|
||||
engines: {node: '>=4.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -499,6 +767,11 @@ packages:
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
os: [darwin]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
@@ -552,10 +825,87 @@ packages:
|
||||
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
|
||||
engines: {node: 18 || 20 || >=22}
|
||||
@@ -563,9 +913,18 @@ packages:
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==}
|
||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||
hasBin: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==}
|
||||
engines: {node: '>=12.20.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -586,10 +945,17 @@ packages:
|
||||
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
|
||||
engines: {node: ^10 || ^12 || >=14}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -611,6 +977,11 @@ packages:
|
||||
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
hasBin: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -624,6 +995,10 @@ packages:
|
||||
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
@@ -653,9 +1028,105 @@ packages:
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-D6TI8IhakUduwNb31+yLfqRAkEYb3yhlwy6DODzO4BLAxvGeefQ070oy1RQ6zmuoZwH4CnqW1jLOXzu3Zjajig==}
|
||||
engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0}
|
||||
peerDependencies:
|
||||
vue: ^3.2.25
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
peerDependencies:
|
||||
'@farmfe/core': '*'
|
||||
'@rsbuild/core': '*'
|
||||
'@rspack/core': '*'
|
||||
bun-types-no-globals: '*'
|
||||
esbuild: '*'
|
||||
rolldown: '*'
|
||||
rollup: '*'
|
||||
unloader: '*'
|
||||
vite: '*'
|
||||
webpack: '*'
|
||||
peerDependenciesMeta:
|
||||
'@farmfe/core':
|
||||
optional: true
|
||||
'@rsbuild/core':
|
||||
optional: true
|
||||
'@rspack/core':
|
||||
optional: true
|
||||
bun-types-no-globals:
|
||||
optional: true
|
||||
esbuild:
|
||||
optional: true
|
||||
rolldown:
|
||||
optional: true
|
||||
rollup:
|
||||
optional: true
|
||||
unloader:
|
||||
optional: true
|
||||
vite:
|
||||
optional: true
|
||||
webpack:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
'@types/node': ^20.19.0 || >=22.12.0
|
||||
'@vitejs/devtools': ^0.7.1
|
||||
esbuild: ^0.27.0 || ^0.28.0
|
||||
jiti: '>=1.21.0'
|
||||
less: ^4.0.0
|
||||
sass: ^1.70.0
|
||||
sass-embedded: ^1.70.0
|
||||
stylus: '>=0.54.8'
|
||||
sugarss: ^5.0.0
|
||||
terser: ^5.16.0
|
||||
tsx: ^4.8.1
|
||||
yaml: ^2.4.2
|
||||
peerDependenciesMeta:
|
||||
'@types/node':
|
||||
optional: true
|
||||
'@vitejs/devtools':
|
||||
optional: true
|
||||
esbuild:
|
||||
optional: true
|
||||
jiti:
|
||||
optional: true
|
||||
less:
|
||||
optional: true
|
||||
sass:
|
||||
optional: true
|
||||
sass-embedded:
|
||||
optional: true
|
||||
stylus:
|
||||
optional: true
|
||||
sugarss:
|
||||
optional: true
|
||||
terser:
|
||||
optional: true
|
||||
tsx:
|
||||
optional: true
|
||||
yaml:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==}
|
||||
peerDependencies:
|
||||
typescript: '*'
|
||||
peerDependenciesMeta:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
|
||||
|
||||
[email protected]:
|
||||
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
||||
engines: {node: '>= 8'}
|
||||
@@ -671,6 +1142,19 @@ packages:
|
||||
|
||||
snapshots:
|
||||
|
||||
'@babel/[email protected]': {}
|
||||
|
||||
'@babel/[email protected]': {}
|
||||
|
||||
'@babel/[email protected]':
|
||||
dependencies:
|
||||
'@babel/types': 7.29.8
|
||||
|
||||
'@babel/[email protected]':
|
||||
dependencies:
|
||||
'@babel/helper-string-parser': 7.29.7
|
||||
'@babel/helper-validator-identifier': 7.29.7
|
||||
|
||||
'@cacheable/[email protected]':
|
||||
dependencies:
|
||||
'@cacheable/utils': 2.5.0
|
||||
@@ -811,6 +1295,25 @@ snapshots:
|
||||
|
||||
'@humanwhocodes/[email protected]': {}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.6.0
|
||||
'@jridgewell/trace-mapping': 0.3.31
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
dependencies:
|
||||
'@jridgewell/gen-mapping': 0.3.13
|
||||
'@jridgewell/trace-mapping': 0.3.31
|
||||
|
||||
'@jridgewell/[email protected]': {}
|
||||
|
||||
'@jridgewell/[email protected]': {}
|
||||
|
||||
'@jridgewell/[email protected]':
|
||||
dependencies:
|
||||
'@jridgewell/resolve-uri': 3.1.2
|
||||
'@jridgewell/sourcemap-codec': 1.6.0
|
||||
|
||||
'@keyv/[email protected]([email protected])':
|
||||
dependencies:
|
||||
hashery: 1.5.1
|
||||
@@ -819,6 +1322,55 @@ snapshots:
|
||||
|
||||
'@keyv/[email protected]': {}
|
||||
|
||||
'@oxc-project/[email protected]': {}
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]':
|
||||
optional: true
|
||||
|
||||
'@rolldown/[email protected]': {}
|
||||
|
||||
'@types/[email protected]': {}
|
||||
|
||||
'@types/[email protected]': {}
|
||||
@@ -920,6 +1472,60 @@ snapshots:
|
||||
'@typescript-eslint/types': 8.70.0
|
||||
eslint-visitor-keys: 5.0.1
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@babel/parser': 7.29.8
|
||||
'@vue/shared': 3.5.42
|
||||
entities: 7.0.1
|
||||
estree-walker: 2.0.2
|
||||
source-map-js: 1.2.1
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@vue/compiler-core': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@babel/parser': 7.29.8
|
||||
'@vue/compiler-core': 3.5.42
|
||||
'@vue/compiler-dom': 3.5.42
|
||||
'@vue/compiler-ssr': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
estree-walker: 2.0.2
|
||||
magic-string: 0.30.21
|
||||
postcss: 8.5.28
|
||||
source-map-js: 1.2.1
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@vue/compiler-dom': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@vue/shared': 3.5.42
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@vue/reactivity': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@vue/reactivity': 3.5.42
|
||||
'@vue/runtime-core': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
csstype: 3.2.3
|
||||
|
||||
'@vue/[email protected]':
|
||||
dependencies:
|
||||
'@vue/compiler-ssr': 3.5.42
|
||||
'@vue/runtime-dom': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
|
||||
'@vue/[email protected]': {}
|
||||
|
||||
[email protected]([email protected]):
|
||||
dependencies:
|
||||
acorn: 8.18.0
|
||||
@@ -960,12 +1566,18 @@ snapshots:
|
||||
shebang-command: 2.0.0
|
||||
which: 2.0.2
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
ms: 2.1.3
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
optionalDependencies:
|
||||
'@esbuild/aix-ppc64': 0.28.2
|
||||
@@ -1059,6 +1671,8 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
@@ -1090,6 +1704,9 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
@@ -1131,18 +1748,75 @@ snapshots:
|
||||
prelude-ls: 1.2.1
|
||||
type-check: 0.4.0
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
optional: true
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
detect-libc: 2.1.2
|
||||
optionalDependencies:
|
||||
lightningcss-android-arm64: 1.33.0
|
||||
lightningcss-darwin-arm64: 1.33.0
|
||||
lightningcss-darwin-x64: 1.33.0
|
||||
lightningcss-freebsd-x64: 1.33.0
|
||||
lightningcss-linux-arm-gnueabihf: 1.33.0
|
||||
lightningcss-linux-arm64-gnu: 1.33.0
|
||||
lightningcss-linux-arm64-musl: 1.33.0
|
||||
lightningcss-linux-x64-gnu: 1.33.0
|
||||
lightningcss-linux-x64-musl: 1.33.0
|
||||
lightningcss-win32-arm64-msvc: 1.33.0
|
||||
lightningcss-win32-x64-msvc: 1.33.0
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
p-locate: 5.0.0
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.6.0
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
brace-expansion: 5.0.9
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
deep-is: 0.1.4
|
||||
@@ -1164,8 +1838,16 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
nanoid: 3.3.19
|
||||
picocolors: 1.1.1
|
||||
source-map-js: 1.2.1
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
@@ -1178,6 +1860,27 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
'@oxc-project/types': 0.150.0
|
||||
'@rolldown/pluginutils': 1.0.1
|
||||
optionalDependencies:
|
||||
'@rolldown/binding-android-arm-eabi': 1.2.9
|
||||
'@rolldown/binding-android-arm64': 1.2.9
|
||||
'@rolldown/binding-darwin-arm64': 1.2.9
|
||||
'@rolldown/binding-darwin-x64': 1.2.9
|
||||
'@rolldown/binding-freebsd-x64': 1.2.9
|
||||
'@rolldown/binding-linux-arm-gnueabihf': 1.2.9
|
||||
'@rolldown/binding-linux-arm64-gnu': 1.2.9
|
||||
'@rolldown/binding-linux-arm64-musl': 1.2.9
|
||||
'@rolldown/binding-linux-ppc64-gnu': 1.2.9
|
||||
'@rolldown/binding-linux-s390x-gnu': 1.2.9
|
||||
'@rolldown/binding-linux-x64-gnu': 1.2.9
|
||||
'@rolldown/binding-linux-x64-musl': 1.2.9
|
||||
'@rolldown/binding-openharmony-arm64': 1.2.9
|
||||
'@rolldown/binding-win32-arm64-msvc': 1.2.9
|
||||
'@rolldown/binding-win32-x64-msvc': 1.2.9
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
@@ -1186,6 +1889,8 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
fdir: 6.5.0([email protected])
|
||||
@@ -1214,10 +1919,75 @@ snapshots:
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected](@types/[email protected])([email protected])([email protected])([email protected]([email protected])):
|
||||
dependencies:
|
||||
'@jridgewell/gen-mapping': 0.3.13
|
||||
'@jridgewell/trace-mapping': 0.3.31
|
||||
'@vue/reactivity': 3.5.42
|
||||
obug: 3.0.0
|
||||
unplugin: 3.4.0([email protected])([email protected])([email protected](@types/[email protected])([email protected]))
|
||||
vite: 8.3.0(@types/[email protected])([email protected])
|
||||
vue: 3.5.42([email protected])
|
||||
transitivePeerDependencies:
|
||||
- '@farmfe/core'
|
||||
- '@rsbuild/core'
|
||||
- '@rspack/core'
|
||||
- '@types/node'
|
||||
- '@vitejs/devtools'
|
||||
- bun-types-no-globals
|
||||
- esbuild
|
||||
- jiti
|
||||
- less
|
||||
- rolldown
|
||||
- rollup
|
||||
- sass
|
||||
- sass-embedded
|
||||
- stylus
|
||||
- sugarss
|
||||
- terser
|
||||
- tsx
|
||||
- unloader
|
||||
- webpack
|
||||
- yaml
|
||||
|
||||
[email protected]([email protected])([email protected])([email protected](@types/[email protected])([email protected])):
|
||||
dependencies:
|
||||
'@jridgewell/remapping': 2.3.5
|
||||
picomatch: 4.0.7
|
||||
webpack-virtual-modules: 0.6.2
|
||||
optionalDependencies:
|
||||
esbuild: 0.28.2
|
||||
rolldown: 1.2.9
|
||||
vite: 8.3.0(@types/[email protected])([email protected])
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
punycode: 2.3.1
|
||||
|
||||
[email protected](@types/[email protected])([email protected]):
|
||||
dependencies:
|
||||
lightningcss: 1.33.0
|
||||
picomatch: 4.0.7
|
||||
postcss: 8.5.28
|
||||
rolldown: 1.2.9
|
||||
tinyglobby: 0.2.17
|
||||
optionalDependencies:
|
||||
'@types/node': 26.5.1
|
||||
esbuild: 0.28.2
|
||||
fsevents: 2.3.3
|
||||
|
||||
[email protected]([email protected]):
|
||||
dependencies:
|
||||
'@vue/compiler-dom': 3.5.42
|
||||
'@vue/compiler-sfc': 3.5.42
|
||||
'@vue/runtime-dom': 3.5.42
|
||||
'@vue/server-renderer': 3.5.42
|
||||
'@vue/shared': 3.5.42
|
||||
optionalDependencies:
|
||||
typescript: 5.9.3
|
||||
|
||||
[email protected]: {}
|
||||
|
||||
[email protected]:
|
||||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
Reference in new issue
Block a user