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:
BillyOutlast committed 2026-09-17 22:43:28 -04:00
1 parent c5d2251546
commit 5266b3ba36
8 files changed
+1365 -18

No files matched your search

+29 -5
View File
@@ -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}`,
);
+3 -1
View File
@@ -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"
}
}
+96 -8
View File
@@ -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 };
}
+132
View File
@@ -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
View File
@@ -2,3 +2,5 @@ export * from "./signer.js";
export * from "./builder.js";
export * from "./testRunner.js";
export * from "./scaffolder.js";
export * from "./devServer.js";
+48 -4
View File
@@ -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, {
+285
View File
@@ -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 });
}
});
+770
View File
@@ -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