diff --git a/.github/workflows/preview-build.yaml b/.github/workflows/preview-build.yaml index f858905c3..cfa93e8de 100644 --- a/.github/workflows/preview-build.yaml +++ b/.github/workflows/preview-build.yaml @@ -51,8 +51,8 @@ jobs: runs-on: ubuntu-latest # Run on internal PRs or external PRs with 'approve public build' label if: | - (github.event_name == 'pull_request_target' && !github.event.pull_request.head.repo.fork) || - (github.event_name == 'pull_request_target' && contains(github.event.pull_request.labels.*.name, 'approve public build')) + (github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork) || + (github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.fork && contains(github.event.pull_request.labels.*.name, 'approve public build')) permissions: contents: read id-token: write diff --git a/docs/pages/docs/quickstart.md b/docs/pages/docs/quickstart.md index 0e1c619ed..c3e01a66d 100644 --- a/docs/pages/docs/quickstart.md +++ b/docs/pages/docs/quickstart.md @@ -10,7 +10,7 @@ have you up and running with a modern, customizable site that your developers wi ## Prerequisites -- **Node.js** `22.7.0+` (or `20.19+`) - [Download here](https://nodejs.org/) +- **Node.js** `22.12.0+` (or `20.19+`) - [Download here](https://nodejs.org/) - A terminal or command prompt - Your favorite code editor diff --git a/examples/with-vite-config/vite.config.ts b/examples/with-vite-config/vite.config.ts index 52c815d8f..ff0e9692e 100644 --- a/examples/with-vite-config/vite.config.ts +++ b/examples/with-vite-config/vite.config.ts @@ -3,7 +3,7 @@ import { visualizer } from "rollup-plugin-visualizer"; /** @type {import('vite').UserConfig} */ export default { build: { - rollupOptions: { + rolldownOptions: { plugins: [visualizer()], }, }, diff --git a/packages/zudoku/cli.js b/packages/zudoku/cli.js index 7da840b3c..67c457228 100755 --- a/packages/zudoku/cli.js +++ b/packages/zudoku/cli.js @@ -2,10 +2,10 @@ import semver from "semver"; -if (!semver.satisfies(process.version, ">=20.19.0 <21.0.0 || >=22.7.0")) { +if (!semver.satisfies(process.version, ">=20.19.0 <21.0.0 || >=22.12.0")) { // biome-ignore lint/suspicious/noConsole: Logging allowed here console.error( - `⚠️ Zudoku requires Node.js version >=20.19.0 or >=22.7.0. Your version: ${process.version}`, + `⚠️ Zudoku requires Node.js version >=20.19.0 or >=22.12.0. Your version: ${process.version}`, ); process.exit(1); } diff --git a/packages/zudoku/package.json b/packages/zudoku/package.json index 7784622ff..2ca8e3012 100644 --- a/packages/zudoku/package.json +++ b/packages/zudoku/package.json @@ -175,7 +175,6 @@ "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.1", "remark-mdx-frontmatter": "5.2.0", - "rollup": "4.57.1", "semver": "7.7.4", "shiki": "3.22.0", "sitemap": "9.0.0", @@ -187,7 +186,7 @@ "unist-util-visit": "5.1.0", "vaul": "1.1.2", "vfile": "6.0.3", - "vite": "7.3.1", + "vite": "8.0.0-beta.16", "yaml": "2.8.2", "yargs": "18.0.0", "zod": "4.3.6", diff --git a/packages/zudoku/scripts/generate-types.ts b/packages/zudoku/scripts/generate-types.ts index a94a7c0ae..6d5ffd85f 100644 --- a/packages/zudoku/scripts/generate-types.ts +++ b/packages/zudoku/scripts/generate-types.ts @@ -1,12 +1,9 @@ import { writeFile } from "node:fs/promises"; import { fileURLToPath } from "node:url"; +import icons from "lucide-react/dist/esm/dynamicIconImports.js"; import { format } from "oxfmt"; -const icons = await import("lucide-react/dist/esm/dynamicIconImports.js").then( - (module) => module.default, -); - -const iconNames = Object.keys(icons) +const iconNames = Object.keys(icons.default) .sort() .map((icon) => `"${icon}"`) .join(","); diff --git a/packages/zudoku/src/config/loader.ts b/packages/zudoku/src/config/loader.ts index 9e550fae4..c41b25d5b 100644 --- a/packages/zudoku/src/config/loader.ts +++ b/packages/zudoku/src/config/loader.ts @@ -1,8 +1,8 @@ import { stat } from "node:fs/promises"; import path from "node:path"; import colors from "picocolors"; -import type { RollupOutput, RollupWatcher } from "rollup"; import { + type build, type ConfigEnv, runnerImport, loadEnv as viteLoadEnv, @@ -95,9 +95,9 @@ async function loadZudokuConfigWithMeta( return configWithMetadata; } -export function findOutputPathOfServerConfig( - output: RollupOutput | RollupOutput[] | RollupWatcher, -) { +type BuildResult = Awaited>; + +export function findOutputPathOfServerConfig(output: BuildResult) { if (Array.isArray(output)) { throw new Error("Expected a single output, but got an array"); } diff --git a/packages/zudoku/src/lib/authentication/errors.ts b/packages/zudoku/src/lib/authentication/errors.ts index b488f6453..0d6012443 100644 --- a/packages/zudoku/src/lib/authentication/errors.ts +++ b/packages/zudoku/src/lib/authentication/errors.ts @@ -3,12 +3,11 @@ import { ZudokuError, type ZudokuErrorOptions } from "../util/invariant.js"; export class AuthorizationError extends Error {} export class OAuthAuthorizationError extends ZudokuError { - constructor( - message: string, - public error?: unknown, - options?: ZudokuErrorOptions, - ) { + error: unknown; + + constructor(message: string, error?: unknown, options?: ZudokuErrorOptions) { super(message, options); + this.error = error; } } diff --git a/packages/zudoku/src/lib/plugins/openapi/client/GraphQLClient.tsx b/packages/zudoku/src/lib/plugins/openapi/client/GraphQLClient.tsx index 6557a615c..9f3ad94b2 100644 --- a/packages/zudoku/src/lib/plugins/openapi/client/GraphQLClient.tsx +++ b/packages/zudoku/src/lib/plugins/openapi/client/GraphQLClient.tsx @@ -23,26 +23,27 @@ const throwIfError = (response: GraphQLResponse) => { }; export class GraphQLClient { - private readonly config: OpenApiPluginOptions; + #config: OpenApiPluginOptions; + constructor(config: OpenApiPluginOptions) { if (config.schemaImports) { Object.assign(sharedSchemaImports, config.schemaImports); } - this.config = config; + this.#config = config; } #getLocalServer = async () => { if (!localServerPromise) { localServerPromise = import("./createServer.js").then((m) => - m.createServer({ ...this.config, schemaImports: sharedSchemaImports }), + m.createServer({ ...this.#config, schemaImports: sharedSchemaImports }), ); } return localServerPromise; }; #executeFetch = async (init: RequestInit): Promise => { - if (this.config.server) { - return fetch(this.config.server, init); + if (this.#config.server) { + return fetch(this.#config.server, init); } const localServer = await this.#getLocalServer(); diff --git a/packages/zudoku/src/vite/build.ts b/packages/zudoku/src/vite/build.ts index c6c1fae12..96a736949 100644 --- a/packages/zudoku/src/vite/build.ts +++ b/packages/zudoku/src/vite/build.ts @@ -1,6 +1,6 @@ import { mkdir, rename, rm, writeFile } from "node:fs/promises"; import path from "node:path"; -import { build as viteBuild } from "vite"; +import { createBuilder } from "vite"; import { ZuploEnv } from "../app/env.js"; import { findOutputPathOfServerConfig, @@ -18,26 +18,24 @@ const DIST_DIR = "dist"; export async function runBuild(options: { dir: string }) { try { - // Shouldn't run in parallel because it's potentially racy - const viteClientConfig = await getViteConfig(options.dir, { + const viteConfig = await getViteConfig(options.dir, { mode: "production", command: "build", }); - const viteServerConfig = await getViteConfig(options.dir, { - mode: "production", - command: "build", - isSsrBuild: true, - }); - // Don't run in parallel because it might overwrite itself - const clientResult = await viteBuild(viteClientConfig); - const serverResult = await viteBuild({ - ...viteServerConfig, - logLevel: "silent", - }); - if (Array.isArray(clientResult)) { - throw new Error("Build failed"); - } + const builder = await createBuilder(viteConfig); + + invariant(builder.environments.client, "Client environment is missing"); + invariant(builder.environments.ssr, "SSR environment is missing"); + + const clientResult = await builder.build(builder.environments.client); + const serverResult = await builder.build(builder.environments.ssr); + + invariant( + clientResult && !Array.isArray(clientResult), + "Client build failed to produce valid output", + ); + invariant(serverResult, "SSR build failed to produce valid output"); const { config } = await loadZudokuConfig( { mode: "production", command: "build" }, @@ -46,108 +44,99 @@ export async function runBuild(options: { dir: string }) { const issuer = await getIssuer(config); - if ("output" in clientResult) { - const [jsEntry, cssEntries] = [ - clientResult.output.find((o) => "isEntry" in o && o.isEntry)?.fileName, - clientResult.output - .filter((o) => o.fileName.endsWith(".css")) - .map((o) => o.fileName), - ]; + const base = viteConfig.base ?? "/"; + const clientOutDir = viteConfig.environments?.client?.build?.outDir; + const serverOutDir = viteConfig.environments?.ssr?.build?.outDir; - if (!jsEntry || cssEntries.length === 0) { - throw new Error("Build failed. No js or css assets found"); - } + invariant(clientOutDir, "Client build outDir is missing"); + invariant(serverOutDir, "Server build outDir is missing"); - const html = getBuildHtml({ - jsEntry: joinUrl(viteClientConfig.base, jsEntry), - cssEntries: cssEntries.map((css) => - joinUrl(viteClientConfig.base, css), - ), - dir: config.site?.dir, - }); + if (!("output" in clientResult)) { + throw new Error("Client build output is missing"); + } - const serverConfigFilename = findOutputPathOfServerConfig(serverResult); + const [jsEntry, cssEntries] = [ + clientResult.output.find((o) => "isEntry" in o && o.isEntry)?.fileName, + clientResult.output + .filter((o) => o.fileName.endsWith(".css")) + .map((o) => o.fileName), + ]; - invariant( - viteClientConfig.build?.outDir, - "Client build outDir is missing", - ); - invariant( - viteServerConfig.build?.outDir, - "Server build outDir is missing", - ); + if (!jsEntry || cssEntries.length === 0) { + throw new Error("Build failed. No js or css assets found"); + } - try { - const results = await prerender({ - html, - dir: options.dir, - basePath: config.basePath, - serverConfigFilename, - writeRedirects: process.env.VERCEL === undefined, - }); + const html = getBuildHtml({ + jsEntry: joinUrl(base, jsEntry), + cssEntries: cssEntries.map((css) => joinUrl(base, css)), + dir: config.site?.dir, + }); - const indexHtml = path.join( - viteClientConfig.build.outDir, - "index.html", - ); + const serverConfigFilename = findOutputPathOfServerConfig(serverResult); + + try { + const results = await prerender({ + html, + dir: options.dir, + basePath: config.basePath, + serverConfigFilename, + writeRedirects: process.env.VERCEL === undefined, + }); - if (!results.find((r) => r.outputPath === indexHtml)) { - await writeFile(indexHtml, html, "utf-8"); - } + const indexHtml = path.join(clientOutDir, "index.html"); + + if (!results.find((r) => r.outputPath === indexHtml)) { + await writeFile(indexHtml, html, "utf-8"); + } - // find 400.html, 404.html, 500.html - const statusPages = results.flatMap((r) => - /400|404|500\.html$/.test(r.outputPath) ? r.outputPath : [], + // find 400.html, 404.html, 500.html + const statusPages = results.flatMap((r) => + /400|404|500\.html$/.test(r.outputPath) ? r.outputPath : [], + ); + + // move status pages to root path (i.e. without base path) + for (const statusPage of statusPages) { + await rename( + statusPage, + path.join(options.dir, DIST_DIR, path.basename(statusPage)), ); + } - // move status pages to root path (i.e. without base path) - for (const statusPage of statusPages) { - await rename( - statusPage, - path.join(options.dir, DIST_DIR, path.basename(statusPage)), - ); - } + // Delete the server build output directory because we don't need it anymore + await rm(serverOutDir, { + recursive: true, + force: true, + }); - // Delete the server build output directory because we don't need it anymore - await rm(viteServerConfig.build.outDir, { + if (process.env.VERCEL) { + await mkdir(path.join(options.dir, ".vercel/output/static"), { recursive: true, - force: true, }); + await rename( + path.join(options.dir, DIST_DIR), + path.join(options.dir, ".vercel/output/static"), + ); + } - if (process.env.VERCEL) { - await mkdir(path.join(options.dir, ".vercel/output/static"), { - recursive: true, - }); - await rename( - path.join(options.dir, DIST_DIR), - path.join(options.dir, ".vercel/output/static"), - ); - } - - // Write the build output file - await writeOutput(options.dir, { - config, - redirects: results.flatMap((r) => r.redirect ?? []), - }); + // Write the build output file + await writeOutput(options.dir, { + config, + redirects: results.flatMap((r) => r.redirect ?? []), + }); - if (ZuploEnv.isZuplo && issuer) { - await writeFile( - path.join(options.dir, DIST_DIR, ".output/zuplo.json"), - JSON.stringify({ issuer }, null, 2), - "utf-8", - ); - } - } catch (e) { - // dynamic imports in prerender swallow the stack trace, so we log it here - // biome-ignore lint/suspicious/noConsole: Logging allowed here - console.error(e); - throw e; + if (ZuploEnv.isZuplo && issuer) { + await writeFile( + path.join(options.dir, DIST_DIR, ".output/zuplo.json"), + JSON.stringify({ issuer }, null, 2), + "utf-8", + ); } - - return; + } catch (e) { + // dynamic imports in prerender swallow the stack trace, so we log it here + // biome-ignore lint/suspicious/noConsole: Logging allowed here + console.error(e); + throw e; } - - throw new Error("Build failed"); } catch (error) { // biome-ignore lint/suspicious/noConsole: Logging allowed here console.error("\n❌ [FATAL] Build error in runBuild:"); diff --git a/packages/zudoku/src/vite/config.ts b/packages/zudoku/src/vite/config.ts index f2370a0b7..064a6b991 100644 --- a/packages/zudoku/src/vite/config.ts +++ b/packages/zudoku/src/vite/config.ts @@ -150,32 +150,43 @@ export async function getViteConfig( }, }, build: { - ssr: configEnv.isSsrBuild, sourcemap: true, target: "es2022", - outDir: path.resolve( - path.join( - dir, - "dist", - config.basePath ?? "", - configEnv.isSsrBuild ? "server" : "", - ), - ), - emptyOutDir: true, - rollupOptions: { - input: - configEnv.command === "build" - ? configEnv.isSsrBuild - ? ["zudoku/app/entry.server.tsx", config.__meta.configPath] - : "zudoku/app/entry.client.tsx" - : undefined, - external: [ - joinUrl(config.basePath, "/pagefind/pagefind.js"), - "mermaid", - ], - }, chunkSizeWarningLimit: 1500, }, + environments: { + client: { + build: { + outDir: path.resolve(path.join(dir, "dist", config.basePath ?? "")), + emptyOutDir: true, + rolldownOptions: { + input: + configEnv.command === "build" + ? "zudoku/app/entry.client.tsx" + : undefined, + external: [joinUrl(config.basePath, "/pagefind/pagefind.js")], + }, + }, + }, + ssr: { + build: { + outDir: path.resolve( + path.join(dir, "dist", config.basePath ?? "", "server"), + ), + emptyOutDir: true, + rolldownOptions: { + input: + configEnv.command === "build" + ? ["zudoku/app/entry.server.tsx", config.__meta.configPath] + : undefined, + external: [ + joinUrl(config.basePath, "/pagefind/pagefind.js"), + "mermaid", + ], + }, + }, + }, + }, experimental: { renderBuiltUrl(filename) { if (cdnUrl?.base && [".js", ".css"].includes(path.extname(filename))) { @@ -190,11 +201,9 @@ export async function getViteConfig( }, }, optimizeDeps: { - esbuildOptions: { - target: "es2022", - }, entries: [path.posix.join(getModuleDir(), "src/{app,lib}/**")], include: [ + "@mdx-js/react", "react-dom/client", ...(process.env.SENTRY_DSN ? ["@sentry/react"] : []), ], @@ -212,6 +221,8 @@ export async function getViteConfig( removePluginHookHandleHotUpdate: "warn", removePluginHookSsrArgument: "warn", removeServerHot: "warn", + removeServerPluginContainer: "warn", + removeServerReloadModule: "warn", }, }; diff --git a/packages/zudoku/src/vite/dev-server.ts b/packages/zudoku/src/vite/dev-server.ts index d3d245590..7da17ac50 100644 --- a/packages/zudoku/src/vite/dev-server.ts +++ b/packages/zudoku/src/vite/dev-server.ts @@ -25,23 +25,25 @@ import { errorMiddleware } from "./error-handler.js"; import { getDevHtml } from "./html.js"; import { buildPagefindDevIndex } from "./pagefind-dev-index.js"; -const DEFAULT_DEV_PORT = 3000; - type EntryServerImport = typeof import("../app/entry.server.js"); +type DevServerOptions = { + dir: string; + ssr?: boolean; + open?: boolean; + argPort?: number; +}; + +const DEFAULT_DEV_PORT = 3000; export class DevServer { - private terminator: HttpTerminator | undefined; - public resolvedPort = 0; - public protocol = "http"; - - constructor( - private options: { - dir: string; - ssr?: boolean; - open?: boolean; - argPort?: number; - }, - ) {} + resolvedPort = 0; + protocol = "http"; + #terminator: HttpTerminator | undefined; + #options: DevServerOptions; + + constructor(options: DevServerOptions) { + this.#options = options; + } private async createNodeServer( app: Express, @@ -50,7 +52,7 @@ export class DevServer { if (!config.https) return http.createServer(app); this.protocol = "https"; - const { dir } = this.options; + const { dir } = this.#options; const [key, cert, ca] = await Promise.all([ fs.readFile(path.resolve(dir, config.https.key)), @@ -69,13 +71,12 @@ export class DevServer { const configEnv: ZudokuConfigEnv = { mode: "development", command: "serve", - isSsrBuild: this.options.ssr, }; - const viteConfig = await getViteConfig(this.options.dir, configEnv); - const { config } = await loadZudokuConfig(configEnv, this.options.dir); + const viteConfig = await getViteConfig(this.#options.dir, configEnv); + const { config } = await loadZudokuConfig(configEnv, this.#options.dir); this.resolvedPort = await findAvailablePort( - this.options.argPort ?? config.port ?? DEFAULT_DEV_PORT, + this.#options.argPort ?? config.port ?? DEFAULT_DEV_PORT, ); const server = await this.createNodeServer(app, config); @@ -97,7 +98,7 @@ export class DevServer { ); app.use(async (req, res, next) => { - const { config } = await loadZudokuConfig(configEnv, this.options.dir); + const { config } = await loadZudokuConfig(configEnv, this.#options.dir); const base = config.basePath; if ( req.method.toLowerCase() === "get" && @@ -115,7 +116,7 @@ export class DevServer { app.get("/__z/pagefind-reindex", async (_req, res) => { const { config: currentConfig } = await loadZudokuConfig( configEnv, - this.options.dir, + this.#options.dir, ); if (currentConfig.search?.type !== "pagefind") { @@ -163,7 +164,7 @@ export class DevServer { app.use(vite.middlewares); printDiagnosticsToConsole( - `Server-side rendering ${this.options.ssr ? "enabled" : "disabled"}`, + `Server-side rendering ${this.#options.ssr ? "enabled" : "disabled"}`, ); if (config.search?.type === "pagefind") { @@ -189,14 +190,14 @@ export class DevServer { } try { - const { config } = await loadZudokuConfig(configEnv, this.options.dir); + const { config } = await loadZudokuConfig(configEnv, this.#options.dir); const rawHtml = getDevHtml({ jsEntry: "/__z/entry.client.tsx", dir: config.site?.dir, }); const template = await vite.transformIndexHtml(url, rawHtml); - if (this.options.ssr) { + if (this.#options.ssr) { const server = await ssrEnvironment.runner.import( getAppServerEntryPath(), ); @@ -226,10 +227,10 @@ export class DevServer { server.listen(this.resolvedPort, () => resolve()); }); - this.terminator = createHttpTerminator({ server }); + this.#terminator = createHttpTerminator({ server }); // Manually set resolved URLs on the Vite server since we're managing the HTTP server - if (this.options.open || process.env.ZUDOKU_OPEN_BROWSER) { + if (this.#options.open || process.env.ZUDOKU_OPEN_BROWSER) { const url = `${this.protocol}://localhost:${this.resolvedPort}`; vite.resolvedUrls = { local: [`${url}${vite.config.base || "/"}`], @@ -242,6 +243,6 @@ export class DevServer { } async stop() { - await this.terminator?.terminate(); + await this.#terminator?.terminate(); } } diff --git a/packages/zudoku/src/vite/plugin-api.ts b/packages/zudoku/src/vite/plugin-api.ts index 0eec1d7de..a95ff4cff 100644 --- a/packages/zudoku/src/vite/plugin-api.ts +++ b/packages/zudoku/src/vite/plugin-api.ts @@ -52,14 +52,25 @@ const viteApiPlugin = async (): Promise => { processors, }); + // Shared promise to ensure buildStart only processes schemas once across environments + let processingPromise: Promise | null = null; + + const processSchemas = async () => { + await fs.rm(tmpStoreDir, { recursive: true, force: true }); + await fs.mkdir(tmpStoreDir, { recursive: true }); + await schemaManager.processAllSchemas(); + }; + return { name: "zudoku-api-plugins", + // Share this plugin instance across all environments during build + sharedDuringBuild: true, async buildStart() { - await fs.rm(tmpStoreDir, { recursive: true, force: true }); - await fs.mkdir(tmpStoreDir, { recursive: true }); - - await schemaManager.processAllSchemas(); + if (!processingPromise) { + processingPromise = processSchemas(); + } + await processingPromise; schemaManager .getAllTrackedFiles() .forEach((file) => this.addWatchFile(file)); diff --git a/packages/zudoku/src/vite/plugin-metadata.ts b/packages/zudoku/src/vite/plugin-metadata.ts index 4790ff1e5..54a98540a 100644 --- a/packages/zudoku/src/vite/plugin-metadata.ts +++ b/packages/zudoku/src/vite/plugin-metadata.ts @@ -12,7 +12,7 @@ const viteBuildMetadata = (): Plugin => { const deps = []; for (const id of this.getModuleIds()) { const m = this.getModuleInfo(id); - if (m != null && !m.isExternal) { + if (m != null) { for (const target of m.importedIds) { deps.push({ source: m.id, target }); } diff --git a/packages/zudoku/src/vite/plugin-shiki-register.ts b/packages/zudoku/src/vite/plugin-shiki-register.ts index 6f725748a..de56fdc57 100644 --- a/packages/zudoku/src/vite/plugin-shiki-register.ts +++ b/packages/zudoku/src/vite/plugin-shiki-register.ts @@ -16,41 +16,19 @@ const resolveLang = (lang: BundledLanguage): string => aliasToId.get(lang) ?? lang; export const viteShikiRegisterPlugin = (): Plugin => { + const shikiIdPattern = /^@shikijs\/(langs|themes)\/.+$/; const virtualModuleId = "virtual:zudoku-shiki-register"; const resolvedVirtualModuleId = `\0${virtualModuleId}`; return { name: "vite-plugin-shiki-register", - config() { - const config = getCurrentConfig(); - const languages = - config.syntaxHighlighting?.languages ?? defaultLanguages; - const themes = Object.values( - config.syntaxHighlighting?.themes ?? defaultHighlightOptions.themes, - ); - - return { - resolve: { - alias: [ - { - find: /^@shikijs\/(langs|themes)\/.+$/, - replacement: "$&", - customResolver: (id) => fileURLToPath(import.meta.resolve(id)), - }, - ], - }, - optimizeDeps: { - include: [ - ...languages.map((lang) => `@shikijs/langs/${resolveLang(lang)}`), - ...themes.map((theme) => `@shikijs/themes/${theme}`), - ], - }, - }; - }, resolveId(id) { if (id === virtualModuleId) { return resolvedVirtualModuleId; } + if (shikiIdPattern.test(id)) { + return fileURLToPath(import.meta.resolve(id)); + } }, async load(id) { if (id !== resolvedVirtualModuleId) return; diff --git a/packages/zudoku/src/vite/plugin-theme.test.ts b/packages/zudoku/src/vite/plugin-theme.test.ts index 9018af9ca..3cdebfc33 100644 --- a/packages/zudoku/src/vite/plugin-theme.test.ts +++ b/packages/zudoku/src/vite/plugin-theme.test.ts @@ -1,4 +1,3 @@ -import type { PluginContext, TransformPluginContext } from "rollup"; import type { Plugin } from "vite"; import { describe, expect, it, vi } from "vitest"; import type { ConfigWithMeta } from "../config/loader.js"; @@ -11,14 +10,16 @@ const callPluginLoad = async (plugin: Plugin, id: string) => { // biome-ignore lint/style/noNonNullAssertion: is guaranteed to be defined const hook = plugin.load!; const loadFn = typeof hook === "function" ? hook : hook.handler; - return loadFn.call({} as PluginContext, id); + // biome-ignore lint/suspicious/noExplicitAny: Allow any type + return loadFn.call({} as any, id); }; const callPluginTransform = async (plugin: Plugin, src: string, id: string) => { // biome-ignore lint/style/noNonNullAssertion: is guaranteed to be defined const hook = plugin.transform!; const transformFn = typeof hook === "function" ? hook : hook.handler; - return transformFn.call({} as TransformPluginContext, src, id); + // biome-ignore lint/suspicious/noExplicitAny: Allow any type + return transformFn.call({} as any, src, id); }; describe("plugin-theme", () => { diff --git a/packages/zudoku/tsconfig.app.json b/packages/zudoku/tsconfig.app.json index 548a1b41f..1f22449a5 100644 --- a/packages/zudoku/tsconfig.app.json +++ b/packages/zudoku/tsconfig.app.json @@ -9,6 +9,7 @@ "module": "NodeNext", "resolveJsonModule": true, "useUnknownInCatchVariables": false, + "erasableSyntaxOnly": true, "noUncheckedIndexedAccess": true, "strict": true, "strictNullChecks": true, diff --git a/packages/zudoku/tsconfig.node.json b/packages/zudoku/tsconfig.node.json index 024df03b9..86353a26a 100644 --- a/packages/zudoku/tsconfig.node.json +++ b/packages/zudoku/tsconfig.node.json @@ -5,6 +5,7 @@ "lib": ["esnext"], "strict": true, "moduleResolution": "bundler", + "erasableSyntaxOnly": true, "esModuleInterop": true, "noEmit": true, "resolveJsonModule": true diff --git a/packages/zudoku/vite.standalone.config.ts b/packages/zudoku/vite.standalone.config.ts index 244e2b364..0440ffcfb 100644 --- a/packages/zudoku/vite.standalone.config.ts +++ b/packages/zudoku/vite.standalone.config.ts @@ -34,7 +34,7 @@ export default defineConfig({ return `zudoku.${fileName}.js`; }, }, - rollupOptions: { + rolldownOptions: { onwarn(warning, warn) { // Suppress "Module level directives cause errors when bundled" warnings if ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f0fd21d8..913622293 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: version: 2.2.6 '@nx/vite': specifier: 22.5.1 - version: 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@nx/web': specifier: 22.5.1 version: 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1) @@ -98,7 +98,7 @@ importers: dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': specifier: ^0.6.3 - version: 0.6.3(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.6.3(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) mermaid: specifier: ^11.12.2 version: 11.12.2 @@ -325,7 +325,7 @@ importers: version: 19.2.4(react@19.2.4) rollup-plugin-visualizer: specifier: 6.0.5 - version: 6.0.5(rolldown@1.0.0-rc.3)(rollup@4.57.1) + version: 6.0.5(rolldown@1.0.0-rc.6)(rollup@4.57.1) zudoku: specifier: workspace:* version: link:../../packages/zudoku @@ -641,7 +641,7 @@ importers: version: 0.5.19(tailwindcss@4.2.0) '@tailwindcss/vite': specifier: 4.2.0 - version: 4.2.0(vite@7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.0(vite@8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@tanem/react-nprogress': specifier: 5.0.63 version: 5.0.63(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -656,7 +656,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(vite@7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@x0k/json-schema-merge': specifier: 1.0.2 version: 1.0.2 @@ -828,9 +828,6 @@ importers: remark-mdx-frontmatter: specifier: 5.2.0 version: 5.2.0 - rollup: - specifier: 4.57.1 - version: 4.57.1 semver: specifier: 7.7.4 version: 7.7.4 @@ -865,8 +862,8 @@ importers: specifier: 6.0.3 version: 6.0.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: 8.0.0-beta.16 + version: 8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) yaml: specifier: 2.8.2 version: 2.8.2 @@ -3401,9 +3398,16 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@oxc-project/runtime@0.115.0': + resolution: {integrity: sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-project/types@0.112.0': resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} + '@oxc-project/types@0.115.0': + resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} + '@oxfmt/binding-android-arm-eabi@0.34.0': resolution: {integrity: sha512-sqkqjh/Z38l+duOb1HtVqJTAj1grt2ttkobCopC/72+a4Xxz4xUgZPFyQ4HxrYMvyqO/YA0tvM1QbfOu70Gk1Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4321,30 +4325,60 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-rc.6': + resolution: {integrity: sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.3': resolution: {integrity: sha512-JWWLzvcmc/3pe7qdJqPpuPk91SoE/N+f3PcWx/6ZwuyDVyungAEJPvKm/eEldiDdwTmaEzWfIR+HORxYWrCi1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-rc.6': + resolution: {integrity: sha512-+tJhD21KvGNtUrpLXrZQlT+j5HZKiEwR2qtcZb3vNOUpvoT9QjEykr75ZW/Kr0W89gose/HVXU6351uVZD8Qvw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.3': resolution: {integrity: sha512-MTakBxfx3tde5WSmbHxuqlDsIW0EzQym+PJYGF4P6lG2NmKzi128OGynoFUqoD5ryCySEY85dug4v+LWGBElIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.6': + resolution: {integrity: sha512-DKNhjMk38FAWaHwUt1dFR3rA/qRAvn2NUvSG2UGvxvlMxSmN/qqww/j4ABAbXhNRXtGQNmrAINMXRuwHl16ZHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.3': resolution: {integrity: sha512-jje3oopyOLs7IwfvXoS6Lxnmie5JJO7vW29fdGFu5YGY1EDbVDhD+P9vDihqS5X6fFiqL3ZQZCMBg6jyHkSVww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-rc.6': + resolution: {integrity: sha512-8TThsRkCPAnfyMBShxrGdtoOE6h36QepqRQI97iFaQSCRbHFWHcDHppcojZnzXoruuhPnjMEygzaykvPVJsMRg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': resolution: {integrity: sha512-A0n8P3hdLAaqzSFrQoA42p23ZKBYQOw+8EH5r15Sa9X1kD9/JXe0YT2gph2QTWvdr0CVK2BOXiK6ENfy6DXOag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.6': + resolution: {integrity: sha512-ZfmFoOwPUZCWtGOVC9/qbQzfc0249FrRUOzV2XabSMUV60Crp211OWLQN1zmQAsRIVWRcEwhJ46Z1mXGo/L/nQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': resolution: {integrity: sha512-kWXkoxxarYISBJ4bLNf5vFkEbb4JvccOwxWDxuK9yee8lg5XA7OpvlTptfRuwEvYcOZf+7VS69Uenpmpyo5Bjw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4352,6 +4386,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.6': + resolution: {integrity: sha512-ZsGzbNETxPodGlLTYHaCSGVhNN/rvkMDCJYHdT7PZr5jFJRmBfmDi2awhF64Dt2vxrJqY6VeeYSgOzEbHRsb7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': resolution: {integrity: sha512-Z03/wrqau9Bicfgb3Dbs6SYTHliELk2PM2LpG2nFd+cGupTMF5kanLEcj2vuuJLLhptNyS61rtk7SOZ+lPsTUA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4359,6 +4400,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': + resolution: {integrity: sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': resolution: {integrity: sha512-iSXXZsQp08CSilff/DCTFZHSVEpEwdicV3W8idHyrByrcsRDVh9sGC3sev6d8BygSGj3vt8GvUKBPCoyMA4tgQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4366,6 +4414,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': + resolution: {integrity: sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': resolution: {integrity: sha512-qaj+MFudtdCv9xZo9znFvkgoajLdc+vwf0Kz5N44g+LU5XMe+IsACgn3UG7uTRlCCvhMAGXm1XlpEA5bZBrOcw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4373,32 +4428,65 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': + resolution: {integrity: sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': resolution: {integrity: sha512-U662UnMETyjT65gFmG9ma+XziENrs7BBnENi/27swZPYagubfHRirXHG2oMl+pEax2WvO7Kb9gHZmMakpYqBHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': + resolution: {integrity: sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': resolution: {integrity: sha512-gekrQ3Q2HiC1T5njGyuUJoGpK/l6B/TNXKed3fZXNf9YRTJn3L5MOZsFBn4bN2+UX+8+7hgdlTcEsexX988G4g==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.6': + resolution: {integrity: sha512-mYa1+h2l6Zc0LvmwUh0oXKKYihnw/1WC73vTqw+IgtfEtv47A+rWzzcWwVDkW73+UDr0d/Ie/HRXoaOY22pQDw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': resolution: {integrity: sha512-85y5JifyMgs8m5K2XzR/VDsapKbiFiohl7s5lEj7nmNGO0pkTXE7q6TQScei96BNAsoK7JC3pA7ukA8WRHVJpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.6': + resolution: {integrity: sha512-e2ABskbNH3MRUBMjgxaMjYIw11DSwjLJxBII3UgpF6WClGLIh8A20kamc+FKH5vIaFVnYQInmcLYSUVpqMPLow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': resolution: {integrity: sha512-a4VUQZH7LxGbUJ3qJ/TzQG8HxdHvf+jOnqf7B7oFx1TEBm+j2KNL2zr5SQ7wHkNAcaPevF6gf9tQnVBnC4mD+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.6': + resolution: {integrity: sha512-dJVc3ifhaRXxIEh1xowLohzFrlQXkJ66LepHm+CmSprTWgVrPa8Fx3OL57xwIqDEH9hufcKkDX2v65rS3NZyRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + '@rolldown/pluginutils@1.0.0-rc.6': + resolution: {integrity: sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==} + '@rollup/pluginutils@5.1.0': resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -9007,6 +9095,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-rc.6: + resolution: {integrity: sha512-B8vFPV1ADyegoYfhg+E7RAucYKv0xdVlwYYsIJgfPNeiSxZGWNxts9RqhyGzC11ULK/VaeXyKezGCwpMiH8Ktw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-visualizer@6.0.5: resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==} engines: {node: '>=18'} @@ -9775,6 +9868,49 @@ packages: yaml: optional: true + vite@8.0.0-beta.16: + resolution: {integrity: sha512-c0t7hYkxsjws89HH+BUFh/sL3BpPNhNsL9CJrTpMxBmwKQBRSa5OJ5w4o9O0bQVI/H/vx7UpUUIevvXa37NS/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.0.0-alpha.31 + esbuild: ^0.27.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 + vitest@4.0.18: resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -12791,11 +12927,11 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.3(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.3(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: glob: 11.1.0 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 @@ -13066,11 +13202,11 @@ snapshots: '@nx/nx-win32-x64-msvc@22.5.1': optional: true - '@nx/vite@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@nx/vite@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@nx/devkit': 22.5.1(nx@22.5.1) '@nx/js': 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1) - '@nx/vitest': 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@nx/vitest': 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@phenomnomnominal/tsquery': 6.1.4(typescript@5.9.3) ajv: 8.17.1 enquirer: 2.3.6 @@ -13078,7 +13214,7 @@ snapshots: semver: 7.7.4 tsconfig-paths: 4.2.0 tslib: 2.8.1 - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@babel/traverse' @@ -13090,7 +13226,7 @@ snapshots: - typescript - verdaccio - '@nx/vitest@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@nx/vitest@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)(typescript@5.9.3)(vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@nx/devkit': 22.5.1(nx@22.5.1) '@nx/js': 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1) @@ -13098,7 +13234,7 @@ snapshots: semver: 7.7.4 tslib: 2.8.1 optionalDependencies: - vite: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.0)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@babel/traverse' @@ -13398,8 +13534,12 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) + '@oxc-project/runtime@0.115.0': {} + '@oxc-project/types@0.112.0': {} + '@oxc-project/types@0.115.0': {} + '@oxfmt/binding-android-arm-eabi@0.34.0': optional: true @@ -14246,46 +14386,89 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-rc.3': optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.6': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.3': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.6': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.3': optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.6': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.3': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.6': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.6': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.6': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.3': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.6': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.6': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.6': + optional: true + '@rolldown/pluginutils@1.0.0-rc.3': {} + '@rolldown/pluginutils@1.0.0-rc.6': {} + '@rollup/pluginutils@5.1.0(rollup@4.57.1)': dependencies: '@types/estree': 1.0.8 @@ -14982,12 +15165,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.2.0 - '@tailwindcss/vite@4.2.0(vite@7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.0(vite@8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.0 '@tailwindcss/oxide': 4.2.0 tailwindcss: 4.2.0 - vite: 7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) '@tanem/react-nprogress@5.0.63(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -15411,7 +15594,7 @@ snapshots: '@vercel/ncc@0.38.4': {} - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -15419,7 +15602,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -19987,14 +20170,33 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-rc.3)(rollup@4.57.1): + rolldown@1.0.0-rc.6: + dependencies: + '@oxc-project/types': 0.115.0 + '@rolldown/pluginutils': 1.0.0-rc.6 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.6 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.6 + '@rolldown/binding-darwin-x64': 1.0.0-rc.6 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.6 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.6 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.6 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.6 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.6 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.6 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.6 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.6 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.6 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.6 + + rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-rc.6)(rollup@4.57.1): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-rc.3 + rolldown: 1.0.0-rc.6 rollup: 4.57.1 rollup@4.57.1: @@ -20810,6 +21012,40 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 + vite@8.0.0-beta.16(@types/node@22.19.1)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@oxc-project/runtime': 0.115.0 + lightningcss: 1.31.1 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-rc.6 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.1 + esbuild: 0.27.3 + fsevents: 2.3.3 + jiti: 2.6.1 + terser: 5.46.0 + tsx: 4.21.0 + yaml: 2.8.2 + + vite@8.0.0-beta.16(@types/node@25.3.0)(esbuild@0.27.3)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@oxc-project/runtime': 0.115.0 + lightningcss: 1.31.1 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-rc.6 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.0 + esbuild: 0.27.3 + fsevents: 2.3.3 + jiti: 2.6.1 + terser: 5.46.0 + tsx: 4.21.0 + yaml: 2.8.2 + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(happy-dom@20.6.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 17f93b81c..171d37e53 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -33,6 +33,10 @@ minimumReleaseAgeExclude: - tailwindcss - "@tailwindcss/*" - lucide-react + - vite + - rolldown + - "@oxc-project/*" + - "@rolldown/*" onlyBuiltDependencies: - esbuild