diff --git a/.changeset/grumpy-trainers-learn.md b/.changeset/grumpy-trainers-learn.md new file mode 100644 index 00000000..512c8e33 --- /dev/null +++ b/.changeset/grumpy-trainers-learn.md @@ -0,0 +1,9 @@ +--- +"@opennextjs/cloudflare": patch +--- + +make sure that instrumentation files work + +currently [instrumentation files](https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation) +in applications built using the adapter are ignored, the changes here +make sure that those are instead properly included in the applications diff --git a/examples/common/apps.ts b/examples/common/apps.ts index 221ca784..ee320f23 100644 --- a/examples/common/apps.ts +++ b/examples/common/apps.ts @@ -3,7 +3,8 @@ const apps = [ // examples "create-next-app", "middleware", - "playground", + "playground14", + "playground15", "vercel-blog-starter", "vercel-commerce", "ssg-app", diff --git a/examples/playground/README.md b/examples/playground/README.md deleted file mode 100644 index 95904019..00000000 --- a/examples/playground/README.md +++ /dev/null @@ -1 +0,0 @@ -A simple app that only has a single `api/hello` API route (using the `node.js` runtime). diff --git a/examples/playground/e2e/playwright.config.ts b/examples/playground/e2e/playwright.config.ts deleted file mode 100644 index 28f57bfc..00000000 --- a/examples/playground/e2e/playwright.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { configurePlaywright } from "../../common/config-e2e"; - -export default configurePlaywright("playground", { isCI: !!process.env.CI }); diff --git a/examples/playground/.dev.vars b/examples/playground14/.dev.vars similarity index 100% rename from examples/playground/.dev.vars rename to examples/playground14/.dev.vars diff --git a/examples/playground/.env.development b/examples/playground14/.env.development similarity index 100% rename from examples/playground/.env.development rename to examples/playground14/.env.development diff --git a/examples/playground/.gitignore b/examples/playground14/.gitignore similarity index 100% rename from examples/playground/.gitignore rename to examples/playground14/.gitignore diff --git a/examples/playground/app/api/buildid/route.ts b/examples/playground14/app/api/buildid/route.ts similarity index 100% rename from examples/playground/app/api/buildid/route.ts rename to examples/playground14/app/api/buildid/route.ts diff --git a/examples/playground/app/api/env/route.ts b/examples/playground14/app/api/env/route.ts similarity index 100% rename from examples/playground/app/api/env/route.ts rename to examples/playground14/app/api/env/route.ts diff --git a/examples/playground/app/api/hello/route.ts b/examples/playground14/app/api/hello/route.ts similarity index 100% rename from examples/playground/app/api/hello/route.ts rename to examples/playground14/app/api/hello/route.ts diff --git a/examples/playground14/app/api/instrumentation/route.ts b/examples/playground14/app/api/instrumentation/route.ts new file mode 100644 index 00000000..f47c1632 --- /dev/null +++ b/examples/playground14/app/api/instrumentation/route.ts @@ -0,0 +1,10 @@ +import { NextResponse } from "next/server"; + +export const dynamic = "force-dynamic"; + +export function GET() { + return NextResponse.json({ + "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], + "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], + }); +} diff --git a/examples/playground/app/api/request/route.ts b/examples/playground14/app/api/request/route.ts similarity index 100% rename from examples/playground/app/api/request/route.ts rename to examples/playground14/app/api/request/route.ts diff --git a/examples/playground/app/isr/[id]/dynamic/page.tsx b/examples/playground14/app/isr/[id]/dynamic/page.tsx similarity index 100% rename from examples/playground/app/isr/[id]/dynamic/page.tsx rename to examples/playground14/app/isr/[id]/dynamic/page.tsx diff --git a/examples/playground/app/isr/[id]/no-dynamic/page.tsx b/examples/playground14/app/isr/[id]/no-dynamic/page.tsx similarity index 100% rename from examples/playground/app/isr/[id]/no-dynamic/page.tsx rename to examples/playground14/app/isr/[id]/no-dynamic/page.tsx diff --git a/examples/playground/app/layout.js b/examples/playground14/app/layout.js similarity index 100% rename from examples/playground/app/layout.js rename to examples/playground14/app/layout.js diff --git a/examples/playground/app/og/route.tsx b/examples/playground14/app/og/route.tsx similarity index 100% rename from examples/playground/app/og/route.tsx rename to examples/playground14/app/og/route.tsx diff --git a/examples/playground/app/page.js b/examples/playground14/app/page.js similarity index 100% rename from examples/playground/app/page.js rename to examples/playground14/app/page.js diff --git a/examples/playground/e2e/base.spec.ts b/examples/playground14/e2e/base.spec.ts similarity index 100% rename from examples/playground/e2e/base.spec.ts rename to examples/playground14/e2e/base.spec.ts diff --git a/examples/playground/e2e/cloudflare.spec.ts b/examples/playground14/e2e/cloudflare.spec.ts similarity index 100% rename from examples/playground/e2e/cloudflare.spec.ts rename to examples/playground14/e2e/cloudflare.spec.ts diff --git a/examples/playground14/e2e/instrumentation.spec.ts b/examples/playground14/e2e/instrumentation.spec.ts new file mode 100644 index 00000000..7dfdf390 --- /dev/null +++ b/examples/playground14/e2e/instrumentation.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from "@playwright/test"; +import { describe } from "node:test"; + +test.describe("instrumentation", () => { + test("the instrumentation register hook should work for the nodejs runtime", async ({ page }) => { + const res = await page.request.get("/api/instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["nodejs-instrumentation-setup"]).toEqual( + "this value has been set by calling the instrumentation `register` callback in the nodejs runtime" + ); + }); + + test("the instrumentation register hook should work for the edge runtime", async ({ page }) => { + const res = await page.request.get("/middleware-instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["edge-instrumentation-setup"]).toEqual( + "this value has been set by calling the instrumentation `register` callback in the edge runtime" + ); + }); + + // Note: we cannot test this since currently both runtimes share the same global scope + // (see: https://github.com/opennextjs/opennextjs-cloudflare/issues/408) + describe.skip("isolation", () => { + test("the instrumentation register hook nodejs logic should not effect edge routes", async ({ page }) => { + const res = await page.request.get("/middleware-instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["nodejs-instrumentation-setup"]).toBeUndefined(); + }); + + test("the instrumentation register hook edge logic should not effect nodejs routes", async ({ page }) => { + const res = await page.request.get("/api/instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["edge-instrumentation-setup"]).toBeUndefined(); + }); + }); +}); diff --git a/examples/playground/e2e/isr.spec.ts b/examples/playground14/e2e/isr.spec.ts similarity index 100% rename from examples/playground/e2e/isr.spec.ts rename to examples/playground14/e2e/isr.spec.ts diff --git a/examples/playground14/e2e/playwright.config.ts b/examples/playground14/e2e/playwright.config.ts new file mode 100644 index 00000000..114012c5 --- /dev/null +++ b/examples/playground14/e2e/playwright.config.ts @@ -0,0 +1,3 @@ +import { configurePlaywright } from "../../common/config-e2e"; + +export default configurePlaywright("playground14", { isCI: !!process.env.CI }); diff --git a/examples/playground/e2e/playwright.dev.config.ts b/examples/playground14/e2e/playwright.dev.config.ts similarity index 68% rename from examples/playground/e2e/playwright.dev.config.ts rename to examples/playground14/e2e/playwright.dev.config.ts index f05725e6..f1b60f3a 100644 --- a/examples/playground/e2e/playwright.dev.config.ts +++ b/examples/playground14/e2e/playwright.dev.config.ts @@ -1,6 +1,6 @@ import { configurePlaywright } from "../../common/config-e2e"; -export default configurePlaywright("playground", { +export default configurePlaywright("playground14", { isCI: !!process.env.CI, isWorker: false, }); diff --git a/examples/playground14/instrumentation.js b/examples/playground14/instrumentation.js new file mode 100644 index 00000000..828854ae --- /dev/null +++ b/examples/playground14/instrumentation.js @@ -0,0 +1,15 @@ +export function register() { + // Note: we register instrumentation for both the nodejs and edge runtime, we do that using the NEXT_RUNTIME env + // variable as recommended in the official docs: + // https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation#importing-runtime-specific-code + + if (process.env.NEXT_RUNTIME === "nodejs") { + globalThis["__NODEJS_INSTRUMENTATION_SETUP"] = + "this value has been set by calling the instrumentation `register` callback in the nodejs runtime"; + } + + if (process.env.NEXT_RUNTIME === "edge") { + globalThis["__EDGE_INSTRUMENTATION_SETUP"] = + "this value has been set by calling the instrumentation `register` callback in the edge runtime"; + } +} diff --git a/examples/playground14/middleware.js b/examples/playground14/middleware.js new file mode 100644 index 00000000..eef686e8 --- /dev/null +++ b/examples/playground14/middleware.js @@ -0,0 +1,12 @@ +import { NextResponse } from "next/server"; + +export function middleware() { + return NextResponse.json({ + "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], + "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], + }); +} + +export const config = { + matcher: ["/middleware-instrumentation"], +}; diff --git a/examples/playground14/next.config.mjs b/examples/playground14/next.config.mjs new file mode 100644 index 00000000..88ff5ae9 --- /dev/null +++ b/examples/playground14/next.config.mjs @@ -0,0 +1,14 @@ +import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare"; + +initOpenNextCloudflareForDev(); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + // Generate source map to validate the fix for opennextjs/opennextjs-cloudflare#341 + serverSourceMaps: true, + instrumentationHook: true, + }, +}; + +export default nextConfig; diff --git a/examples/playground/open-next.config.ts b/examples/playground14/open-next.config.ts similarity index 100% rename from examples/playground/open-next.config.ts rename to examples/playground14/open-next.config.ts diff --git a/examples/playground/package.json b/examples/playground14/package.json similarity index 96% rename from examples/playground/package.json rename to examples/playground14/package.json index fcfa6462..6dbec953 100644 --- a/examples/playground/package.json +++ b/examples/playground14/package.json @@ -1,5 +1,5 @@ { - "name": "playground", + "name": "playground14", "version": "0.1.0", "private": true, "type": "module", diff --git a/examples/playground/public/.gitkeep b/examples/playground14/public/.gitkeep similarity index 100% rename from examples/playground/public/.gitkeep rename to examples/playground14/public/.gitkeep diff --git a/examples/playground/tsconfig.json b/examples/playground14/tsconfig.json similarity index 100% rename from examples/playground/tsconfig.json rename to examples/playground14/tsconfig.json diff --git a/examples/playground/worker-configuration.d.ts b/examples/playground14/worker-configuration.d.ts similarity index 100% rename from examples/playground/worker-configuration.d.ts rename to examples/playground14/worker-configuration.d.ts diff --git a/examples/playground/wrangler.json b/examples/playground14/wrangler.json similarity index 100% rename from examples/playground/wrangler.json rename to examples/playground14/wrangler.json diff --git a/examples/playground15/.dev.vars b/examples/playground15/.dev.vars new file mode 100644 index 00000000..17f2dcc2 --- /dev/null +++ b/examples/playground15/.dev.vars @@ -0,0 +1 @@ +NEXTJS_ENV=development \ No newline at end of file diff --git a/examples/playground15/.env.development b/examples/playground15/.env.development new file mode 100644 index 00000000..7eeb777a --- /dev/null +++ b/examples/playground15/.env.development @@ -0,0 +1 @@ +TEST_ENV_VAR=TEST_VALUE \ No newline at end of file diff --git a/examples/playground15/.gitignore b/examples/playground15/.gitignore new file mode 100644 index 00000000..3a282111 --- /dev/null +++ b/examples/playground15/.gitignore @@ -0,0 +1,45 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# wrangler +.wrangler + +# playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/examples/playground15/app/api/buildid/route.ts b/examples/playground15/app/api/buildid/route.ts new file mode 100644 index 00000000..0c95b72b --- /dev/null +++ b/examples/playground15/app/api/buildid/route.ts @@ -0,0 +1,9 @@ +// Use headers to force a dynamic response +import { headers } from "next/headers"; + +export async function GET() { + const nextConfig = process.env.__NEXT_PRIVATE_STANDALONE_CONFIG + ? JSON.parse(process.env.__NEXT_PRIVATE_STANDALONE_CONFIG) + : undefined; + return Response.json({ nextConfig, headers: headers() }); +} diff --git a/examples/playground15/app/api/env/route.ts b/examples/playground15/app/api/env/route.ts new file mode 100644 index 00000000..7a49c54d --- /dev/null +++ b/examples/playground15/app/api/env/route.ts @@ -0,0 +1,8 @@ +// This test relies on using `.dev.vars` to set the environment to `development` +// However `next build` is not passed an environment, so we do not want to cache +// the output. +export const dynamic = "force-dynamic"; + +export async function GET() { + return new Response(JSON.stringify(process.env)); +} diff --git a/examples/playground15/app/api/hello/route.ts b/examples/playground15/app/api/hello/route.ts new file mode 100644 index 00000000..35625951 --- /dev/null +++ b/examples/playground15/app/api/hello/route.ts @@ -0,0 +1,21 @@ +import { headers } from "next/headers"; + +import { getCloudflareContext } from "@opennextjs/cloudflare"; + +export async function GET() { + const headersList = await headers(); + + const fromCloudflareContext = headersList.has("from-cloudflare-context"); + + if (!fromCloudflareContext) { + return new Response("Hello World!"); + } + + // Retrieve the bindings defined in wrangler.json + return new Response(getCloudflareContext().env.hello); +} + +export async function POST(request: Request) { + const text = await request.text(); + return new Response(`Hello post-World! body=${text}`); +} diff --git a/examples/playground15/app/api/instrumentation/route.ts b/examples/playground15/app/api/instrumentation/route.ts new file mode 100644 index 00000000..ddf80b59 --- /dev/null +++ b/examples/playground15/app/api/instrumentation/route.ts @@ -0,0 +1,8 @@ +import { NextResponse } from "next/server"; + +export function GET() { + return NextResponse.json({ + "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], + "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], + }); +} diff --git a/examples/playground15/app/api/request/route.ts b/examples/playground15/app/api/request/route.ts new file mode 100644 index 00000000..41d73393 --- /dev/null +++ b/examples/playground15/app/api/request/route.ts @@ -0,0 +1,5 @@ +import { NextRequest } from "next/server"; + +export const GET = (request: NextRequest) => { + return new Response(JSON.stringify({ nextUrl: request.nextUrl.href, url: request.url })); +}; diff --git a/examples/playground15/app/isr/[id]/dynamic/page.tsx b/examples/playground15/app/isr/[id]/dynamic/page.tsx new file mode 100644 index 00000000..e7640c65 --- /dev/null +++ b/examples/playground15/app/isr/[id]/dynamic/page.tsx @@ -0,0 +1,30 @@ +// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration +interface Post { + id: string; + title: string; + content: string; +} + +// Next.js will invalidate the cache when a +// request comes in, at most once every 1 hour. +export const revalidate = 3600; + +// We'll prerender only the params from `generateStaticParams` at build time. +// If a request comes in for a path that hasn't been generated, +// Next.js will server-render the page on-demand. +export const dynamicParams = true; + +export async function generateStaticParams() { + return [{ id: "1" }, { id: "2" }, { id: "3" }]; +} + +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const id = (await params).id; + const post: Post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => res.json()); + return ( +
+

{post.title}

+

{post.content}

+
+ ); +} diff --git a/examples/playground15/app/isr/[id]/no-dynamic/page.tsx b/examples/playground15/app/isr/[id]/no-dynamic/page.tsx new file mode 100644 index 00000000..556fb617 --- /dev/null +++ b/examples/playground15/app/isr/[id]/no-dynamic/page.tsx @@ -0,0 +1,29 @@ +// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration +interface Post { + id: string; + title: string; + content: string; +} + +// Next.js will invalidate the cache when a +// request comes in, at most once every 1 hour. +export const revalidate = 3600; + +// We'll prerender only the params from `generateStaticParams` at build time. +// If a request comes in for a path that hasn't been generated, it will 404. +export const dynamicParams = false; + +export async function generateStaticParams() { + return [{ id: "1" }, { id: "2" }, { id: "3" }]; +} + +export default async function Page({ params }: { params: Promise<{ id: string }> }) { + const id = (await params).id; + const post: Post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => res.json()); + return ( +
+

{post.title}

+

{post.content}

+
+ ); +} diff --git a/examples/playground15/app/layout.js b/examples/playground15/app/layout.js new file mode 100644 index 00000000..175f2b0a --- /dev/null +++ b/examples/playground15/app/layout.js @@ -0,0 +1,12 @@ +export const metadata = { + title: "API hello-world", + description: "a simple api hello-world app", +}; + +export default function RootLayout({ children }) { + return ( + + {children} + + ); +} diff --git a/examples/playground15/app/og/route.tsx b/examples/playground15/app/og/route.tsx new file mode 100644 index 00000000..3f48fb0f --- /dev/null +++ b/examples/playground15/app/og/route.tsx @@ -0,0 +1,65 @@ +import { ImageResponse } from "next/og"; + +export const dynamic = "force-dynamic"; + +export async function GET() { + try { + return new ImageResponse( + ( +
+
+ Vercel +
+
+ 'next/og' +
+
+ ), + { + width: 1200, + height: 630, + } + ); + } catch (e: any) { + return new Response("Failed to generate the image", { + status: 500, + }); + } +} diff --git a/examples/playground15/app/page.js b/examples/playground15/app/page.js new file mode 100644 index 00000000..26ca4cad --- /dev/null +++ b/examples/playground15/app/page.js @@ -0,0 +1,7 @@ +export default function Home() { + return ( +
+

Test misc Next features

+
+ ); +} diff --git a/examples/playground15/e2e/base.spec.ts b/examples/playground15/e2e/base.spec.ts new file mode 100644 index 00000000..792e722b --- /dev/null +++ b/examples/playground15/e2e/base.spec.ts @@ -0,0 +1,61 @@ +import { test, expect } from "@playwright/test"; +import type { BinaryLike } from "node:crypto"; +import { createHash } from "node:crypto"; + +const OG_MD5 = "2f7b724d62d8c7739076da211aa62e7b"; + +export function validateMd5(data: Buffer, expectedHash: string) { + return ( + createHash("md5") + .update(data as BinaryLike) + .digest("hex") === expectedHash + ); +} + +test.describe("playground/base", () => { + test("index", async ({ page }) => { + await page.goto("/"); + await expect(page.getByText("Test misc Next features")).toBeVisible(); + }); + + test("the hello-world api GET route works as intended", async ({ page }) => { + const res = await page.request.get("/api/hello"); + expect(res.headers()["content-type"]).toContain("text/plain"); + expect(await res.text()).toEqual("Hello World!"); + }); + + test("returns a hello world string from the cloudflare context env", async ({ page }) => { + const res = await page.request.get("/api/hello", { + headers: { + "from-cloudflare-context": "true", + }, + }); + expect(res.headers()["content-type"]).toContain("text/plain"); + expect(await res.text()).toEqual("Hello World from the cloudflare context!"); + }); + + test("the hello-world api POST route works as intended", async ({ page }) => { + const res = await page.request.post("/api/hello", { data: "some body" }); + expect(res.headers()["content-type"]).toContain("text/plain"); + await expect(res.text()).resolves.toEqual("Hello post-World! body=some body"); + }); + + test("sets environment variables from the Next.js env file", async ({ page }) => { + const res = await page.request.get("/api/env"); + await expect(res.json()).resolves.toEqual(expect.objectContaining({ TEST_ENV_VAR: "TEST_VALUE" })); + }); + + test("returns correct information about the request from a route handler", async ({ page }) => { + const res = await page.request.get("/api/request"); + // Next.js can fall back to `localhost:3000` or `n` if it doesn't get the host - neither of these are expected. + const expectedURL = expect.stringMatching(/https?:\/\/localhost:(?!3000)\d+\/api\/request/); + await expect(res.json()).resolves.toEqual({ nextUrl: expectedURL, url: expectedURL }); + }); + + test.skip("generates an og image successfully", async ({ page }) => { + const res = await page.request.get("/og"); + expect(res.status()).toEqual(200); + expect(res.headers()["content-type"]).toEqual("image/png"); + expect(validateMd5(await res.body(), OG_MD5)).toEqual(true); + }); +}); diff --git a/examples/playground15/e2e/cloudflare.spec.ts b/examples/playground15/e2e/cloudflare.spec.ts new file mode 100644 index 00000000..2b669f99 --- /dev/null +++ b/examples/playground15/e2e/cloudflare.spec.ts @@ -0,0 +1,16 @@ +/** + * Cloudflare specific tests. + * + * The tests in this file do not run on Node (`next dev`). + */ + +import { test, expect } from "@playwright/test"; + +test.describe("playground/cloudflare", () => { + test("NextConfig", async ({ page }) => { + const res = await page.request.get("/api/buildid"); + expect(res.status()).toEqual(200); + const { nextConfig } = await res.json(); + expect(nextConfig.output).toEqual("standalone"); + }); +}); diff --git a/examples/playground15/e2e/instrumentation.spec.ts b/examples/playground15/e2e/instrumentation.spec.ts new file mode 100644 index 00000000..7dfdf390 --- /dev/null +++ b/examples/playground15/e2e/instrumentation.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from "@playwright/test"; +import { describe } from "node:test"; + +test.describe("instrumentation", () => { + test("the instrumentation register hook should work for the nodejs runtime", async ({ page }) => { + const res = await page.request.get("/api/instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["nodejs-instrumentation-setup"]).toEqual( + "this value has been set by calling the instrumentation `register` callback in the nodejs runtime" + ); + }); + + test("the instrumentation register hook should work for the edge runtime", async ({ page }) => { + const res = await page.request.get("/middleware-instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["edge-instrumentation-setup"]).toEqual( + "this value has been set by calling the instrumentation `register` callback in the edge runtime" + ); + }); + + // Note: we cannot test this since currently both runtimes share the same global scope + // (see: https://github.com/opennextjs/opennextjs-cloudflare/issues/408) + describe.skip("isolation", () => { + test("the instrumentation register hook nodejs logic should not effect edge routes", async ({ page }) => { + const res = await page.request.get("/middleware-instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["nodejs-instrumentation-setup"]).toBeUndefined(); + }); + + test("the instrumentation register hook edge logic should not effect nodejs routes", async ({ page }) => { + const res = await page.request.get("/api/instrumentation"); + const respJson: Record = await res.json(); + expect(respJson["edge-instrumentation-setup"]).toBeUndefined(); + }); + }); +}); diff --git a/examples/playground15/e2e/isr.spec.ts b/examples/playground15/e2e/isr.spec.ts new file mode 100644 index 00000000..3f4cd869 --- /dev/null +++ b/examples/playground15/e2e/isr.spec.ts @@ -0,0 +1,32 @@ +import { test, expect, type APIResponse } from "@playwright/test"; +import type { BinaryLike } from "node:crypto"; +import { createHash } from "node:crypto"; + +test.describe("playground/isr", () => { + test("Generated pages exist", async ({ page }) => { + const generatedIds = [1, 2, 3]; + let res: APIResponse; + for (const id of generatedIds) { + res = await page.request.get(`/isr/${id}/dynamic`); + expect(res.status()).toBe(200); + res = await page.request.get(`/isr/${id}/no-dynamic`); + expect(res.status()).toBe(200); + } + }); + + test("Non generated pages 404 when dynamic is false", async ({ page }) => { + const generatedIds = [4, 5, 6]; + for (const id of generatedIds) { + const res = await page.request.get(`/isr/${id}/no-dynamic`); + expect(res.status()).toBe(404); + } + }); + + test("Non generated pages are generated when dynamic is true", async ({ page }) => { + const generatedIds = [4, 5, 6]; + for (const id of generatedIds) { + const res = await page.request.get(`/isr/${id}/dynamic`); + expect(res.status()).toBe(200); + } + }); +}); diff --git a/examples/playground15/e2e/playwright.config.ts b/examples/playground15/e2e/playwright.config.ts new file mode 100644 index 00000000..6e19577c --- /dev/null +++ b/examples/playground15/e2e/playwright.config.ts @@ -0,0 +1,3 @@ +import { configurePlaywright } from "../../common/config-e2e"; + +export default configurePlaywright("playground15", { isCI: !!process.env.CI }); diff --git a/examples/playground15/e2e/playwright.dev.config.ts b/examples/playground15/e2e/playwright.dev.config.ts new file mode 100644 index 00000000..ec9cb287 --- /dev/null +++ b/examples/playground15/e2e/playwright.dev.config.ts @@ -0,0 +1,6 @@ +import { configurePlaywright } from "../../common/config-e2e"; + +export default configurePlaywright("playground15", { + isCI: !!process.env.CI, + isWorker: false, +}); diff --git a/examples/playground15/instrumentation.js b/examples/playground15/instrumentation.js new file mode 100644 index 00000000..828854ae --- /dev/null +++ b/examples/playground15/instrumentation.js @@ -0,0 +1,15 @@ +export function register() { + // Note: we register instrumentation for both the nodejs and edge runtime, we do that using the NEXT_RUNTIME env + // variable as recommended in the official docs: + // https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation#importing-runtime-specific-code + + if (process.env.NEXT_RUNTIME === "nodejs") { + globalThis["__NODEJS_INSTRUMENTATION_SETUP"] = + "this value has been set by calling the instrumentation `register` callback in the nodejs runtime"; + } + + if (process.env.NEXT_RUNTIME === "edge") { + globalThis["__EDGE_INSTRUMENTATION_SETUP"] = + "this value has been set by calling the instrumentation `register` callback in the edge runtime"; + } +} diff --git a/examples/playground15/middleware.js b/examples/playground15/middleware.js new file mode 100644 index 00000000..eef686e8 --- /dev/null +++ b/examples/playground15/middleware.js @@ -0,0 +1,12 @@ +import { NextResponse } from "next/server"; + +export function middleware() { + return NextResponse.json({ + "nodejs-instrumentation-setup": globalThis["__NODEJS_INSTRUMENTATION_SETUP"], + "edge-instrumentation-setup": globalThis["__EDGE_INSTRUMENTATION_SETUP"], + }); +} + +export const config = { + matcher: ["/middleware-instrumentation"], +}; diff --git a/examples/playground/next.config.mjs b/examples/playground15/next.config.mjs similarity index 100% rename from examples/playground/next.config.mjs rename to examples/playground15/next.config.mjs diff --git a/examples/playground15/open-next.config.ts b/examples/playground15/open-next.config.ts new file mode 100644 index 00000000..ef2e20a9 --- /dev/null +++ b/examples/playground15/open-next.config.ts @@ -0,0 +1,26 @@ +import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js"; +import cache from "@opennextjs/cloudflare/kv-cache"; + +const config: OpenNextConfig = { + default: { + override: { + wrapper: "cloudflare-node", + converter: "edge", + incrementalCache: async () => cache, + queue: "direct", + // Unused implementation + tagCache: "dummy", + }, + }, + + middleware: { + external: true, + override: { + wrapper: "cloudflare-edge", + converter: "edge", + proxyExternalRequest: "fetch", + }, + }, +}; + +export default config; diff --git a/examples/playground15/package.json b/examples/playground15/package.json new file mode 100644 index 00000000..29967395 --- /dev/null +++ b/examples/playground15/package.json @@ -0,0 +1,28 @@ +{ + "name": "playground15", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "build:worker": "pnpm opennextjs-cloudflare", + "preview": "pnpm build:worker && pnpm wrangler dev", + "e2e": "playwright test -c e2e/playwright.config.ts", + "e2e:dev": "playwright test -c e2e/playwright.dev.config.ts", + "cf-typegen": "wrangler types --env-interface CloudflareEnv" + }, + "dependencies": { + "next": "^15.1.7", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@opennextjs/cloudflare": "workspace:*", + "@playwright/test": "catalog:", + "@types/node": "catalog:", + "wrangler": "catalog:" + } +} diff --git a/examples/playground15/public/.gitkeep b/examples/playground15/public/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/examples/playground15/tsconfig.json b/examples/playground15/tsconfig.json new file mode 100644 index 00000000..232e6d61 --- /dev/null +++ b/examples/playground15/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "noEmit": true, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ], + "target": "ES2017" + }, + "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx", "worker-configuration.d.ts"], + "exclude": ["node_modules", "open-next.config.ts"] +} diff --git a/examples/playground15/worker-configuration.d.ts b/examples/playground15/worker-configuration.d.ts new file mode 100644 index 00000000..7775bd52 --- /dev/null +++ b/examples/playground15/worker-configuration.d.ts @@ -0,0 +1,5 @@ +// Generated by Wrangler by running `wrangler types --env-interface CloudflareEnv` + +interface CloudflareEnv { + hello: "Hello World from the cloudflare context!"; +} diff --git a/examples/playground15/wrangler.json b/examples/playground15/wrangler.json new file mode 100644 index 00000000..53a0fbe6 --- /dev/null +++ b/examples/playground15/wrangler.json @@ -0,0 +1,20 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "main": ".open-next/worker.js", + "name": "api", + "compatibility_date": "2024-12-30", + "compatibility_flags": ["nodejs_compat"], + "assets": { + "directory": ".open-next/assets", + "binding": "ASSETS" + }, + "kv_namespaces": [ + { + "binding": "NEXT_CACHE_WORKERS_KV", + "id": "" + } + ], + "vars": { + "hello": "Hello World from the cloudflare context!" + } +} diff --git a/packages/cloudflare/src/cli/build/bundle-server.ts b/packages/cloudflare/src/cli/build/bundle-server.ts index ce2d2b68..577ff957 100644 --- a/packages/cloudflare/src/cli/build/bundle-server.ts +++ b/packages/cloudflare/src/cli/build/bundle-server.ts @@ -14,7 +14,7 @@ import { ContentUpdater } from "./patches/plugins/content-updater.js"; import { inlineEvalManifest } from "./patches/plugins/eval-manifest.js"; import { patchFetchCacheSetMissingWaitUntil } from "./patches/plugins/fetch-cache-wait-until.js"; import { inlineFindDir } from "./patches/plugins/find-dir.js"; -import { patchLoadInstrumentation } from "./patches/plugins/load-instrumentation.js"; +import { patchInstrumentation } from "./patches/plugins/instrumentation.js"; import { inlineLoadManifest } from "./patches/plugins/load-manifest.js"; import { handleOptionalDependencies } from "./patches/plugins/optional-deps.js"; import { fixRequire } from "./patches/plugins/require.js"; @@ -91,7 +91,7 @@ export async function bundleServer(buildOpts: BuildOptions): Promise { setWranglerExternal(), fixRequire(updater), handleOptionalDependencies(optionalDependencies), - patchLoadInstrumentation(updater), + patchInstrumentation(updater, buildOpts), patchFetchCacheSetMissingWaitUntil(updater), inlineEvalManifest(updater, buildOpts), inlineFindDir(updater, buildOpts), diff --git a/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.spec.ts b/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.spec.ts new file mode 100644 index 00000000..321cbf3b --- /dev/null +++ b/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.spec.ts @@ -0,0 +1,98 @@ +import { describe, expect, test } from "vitest"; + +import { patchCode } from "../ast/util.js"; +import { getNext14Rule, getNext15Rule } from "./instrumentation.js"; + +describe("LoadInstrumentationModule (Next15)", () => { + const code = ` + export default class NextNodeServer extends BaseServer { + protected async loadInstrumentationModule() { + if (!this.serverOptions.dev) { + try { + this.instrumentation = await dynamicRequire( + resolve( + this.serverOptions.dir || '.', + this.serverOptions.conf.distDir!, + 'server', + INSTRUMENTATION_HOOK_FILENAME + ) + ) + } catch (err: any) { + if (err.code !== 'MODULE_NOT_FOUND') { + throw new Error( + 'An error occurred while loading the instrumentation hook', + { cause: err } + ) + } + } + } + return this.instrumentation + } + } + `; + + test("patch when an instrumentation file is not present", async () => { + expect(patchCode(code, getNext15Rule(null))).toMatchInlineSnapshot(` + "export default class NextNodeServer extends BaseServer { + async loadInstrumentationModule() { this.instrumentation = null; return this.instrumentation; } + } + " + `); + }); + + test("patch when an instrumentation file is present", async () => { + expect(patchCode(code, getNext15Rule("/_file_exists_/instrumentation.js"))).toMatchInlineSnapshot(` + "export default class NextNodeServer extends BaseServer { + async loadInstrumentationModule() { this.instrumentation = require('/_file_exists_/instrumentation.js'); return this.instrumentation; } + } + " + `); + }); +}); + +describe("prepareImpl (Next14)", () => { + const code = ` + export default class NextNodeServer extends BaseServer { + async prepareImpl() { + await super.prepareImpl(); + if (!this.serverOptions.dev && this.nextConfig.experimental.instrumentationHook) { + try { + const instrumentationHook = await dynamicRequire((0, _path.resolve)(this.serverOptions.dir || ".", this.serverOptions.conf.distDir, "server", _constants1.INSTRUMENTATION_HOOK_FILENAME)); + await (instrumentationHook.register == null ? void 0 : instrumentationHook.register.call(instrumentationHook)); + } catch (err2) { + if (err2.code !== "MODULE_NOT_FOUND") { + err2.message = \`An error occurred while loading instrumentation hook: \${err2.message}\`; + throw err2; + } + } + } + } + } + `; + + test("patch when an instrumentation file is not present", async () => { + expect(patchCode(code, getNext14Rule(null))).toMatchInlineSnapshot(` + "export default class NextNodeServer extends BaseServer { + async prepareImpl() { + await super.prepareImpl(); + const instrumentationHook = {}; + await (instrumentationHook.register == null ? void 0 : instrumentationHook.register.call(instrumentationHook)); + } + } + " + `); + }); + + test("patch when an instrumentation file is present", async () => { + expect(patchCode(code, getNext14Rule("/_file_exists_/instrumentation.js"))).toMatchInlineSnapshot(` + "export default class NextNodeServer extends BaseServer { + async prepareImpl() { + await super.prepareImpl(); + const instrumentationHook = require('/_file_exists_/instrumentation.js'); + await (instrumentationHook.register == null ? void 0 : instrumentationHook.register.call(instrumentationHook)); + } + } + " + `); + }); +}); diff --git a/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts b/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts new file mode 100644 index 00000000..e720d6b1 --- /dev/null +++ b/packages/cloudflare/src/cli/build/patches/plugins/instrumentation.ts @@ -0,0 +1,87 @@ +import { existsSync } from "node:fs"; +import { join } from "node:path"; + +import { type BuildOptions, getPackagePath } from "@opennextjs/aws/build/helper.js"; + +import { patchCode } from "../ast/util.js"; +import type { ContentUpdater } from "./content-updater.js"; + +export function patchInstrumentation(updater: ContentUpdater, buildOpts: BuildOptions) { + const builtInstrumentationPath = getBuiltInstrumentationPath(buildOpts); + + updater.updateContent( + "patch-instrumentation-next15", + { filter: /\.(js|mjs|cjs|jsx|ts|tsx)$/, contentFilter: /async loadInstrumentationModule\(/ }, + async ({ contents }) => patchCode(contents, getNext15Rule(builtInstrumentationPath)) + ); + + updater.updateContent( + "patch-instrumentation-next14", + { filter: /\.(js|mjs|cjs|jsx|ts|tsx)$/, contentFilter: /async prepareImpl\(/ }, + async ({ contents }) => patchCode(contents, getNext14Rule(builtInstrumentationPath)) + ); + + return { + name: "patch-instrumentation", + setup() {}, + }; +} + +export function getNext15Rule(builtInstrumentationPath: string | null) { + return ` + rule: + kind: method_definition + all: + - has: {field: name, regex: ^loadInstrumentationModule$} + - has: {pattern: dynamicRequire, stopBy: end} + + fix: + async loadInstrumentationModule() { + this.instrumentation = ${builtInstrumentationPath ? `require('${builtInstrumentationPath}')` : "null"}; + return this.instrumentation; + } + `; +} + +export function getNext14Rule(builtInstrumentationPath: string | null) { + return ` + rule: + kind: method_definition + any: + - has: { field: name, regex: ^prepareImpl$, pattern: $NAME } + all: + - has: { pattern: dynamicRequire, stopBy: end } + - has: { pattern: $_.INSTRUMENTATION_HOOK_FILENAME, stopBy: end } + fix: |- + async $NAME() { + await super.prepareImpl(); + const instrumentationHook = ${builtInstrumentationPath ? `require('${builtInstrumentationPath}')` : "{}"}; + await (instrumentationHook.register == null ? void 0 : instrumentationHook.register.call(instrumentationHook)); + } + `; +} + +/** + * Gets the instrumentation.js file that the Next.js build process generates when an + * instrumentation hook is provided in the app's source + * + * @param buildOpts the open-next build options + * @returns the path to instrumentation.js, or null if it doesn't exist + */ +function getBuiltInstrumentationPath(buildOpts: BuildOptions): string | null { + const { outputDir } = buildOpts; + + const maybeBuiltInstrumentationPath = join( + outputDir, + "server-functions/default", + getPackagePath(buildOpts), + `.next/server/${INSTRUMENTATION_HOOK_FILENAME}.js` + ); + return existsSync(maybeBuiltInstrumentationPath) ? maybeBuiltInstrumentationPath : null; +} + +/** + * Pattern to detect instrumentation hooks file + * (taken from Next.js source: https://github.com/vercel/next.js/blob/1d5820563/packages/next/src/lib/constants.ts#L46-L47) + */ +const INSTRUMENTATION_HOOK_FILENAME = "instrumentation"; diff --git a/packages/cloudflare/src/cli/build/patches/plugins/load-instrumentation.spec.ts b/packages/cloudflare/src/cli/build/patches/plugins/load-instrumentation.spec.ts deleted file mode 100644 index 4fc1a713..00000000 --- a/packages/cloudflare/src/cli/build/patches/plugins/load-instrumentation.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { describe, expect, test } from "vitest"; - -import { patchCode } from "../ast/util.js"; -import { instrumentationRule } from "./load-instrumentation.js"; - -describe("LoadInstrumentationModule", () => { - test("patch", () => { - const code = ` -export default class NextNodeServer extends BaseServer< - Options, - NodeNextRequest, - NodeNextResponse -> { - protected async loadInstrumentationModule() { - if (!this.serverOptions.dev) { - try { - this.instrumentation = await dynamicRequire( - resolve( - this.serverOptions.dir || '.', - this.serverOptions.conf.distDir!, - 'server', - INSTRUMENTATION_HOOK_FILENAME - ) - ) - } catch (err: any) { - if (err.code !== 'MODULE_NOT_FOUND') { - throw new Error( - 'An error occurred while loading the instrumentation hook', - { cause: err } - ) - } - } - } - return this.instrumentation - } -}`; - - expect(patchCode(code, instrumentationRule)).toMatchInlineSnapshot(` - "export default class NextNodeServer extends BaseServer< - Options, - NodeNextRequest, - NodeNextResponse - > { - async loadInstrumentationModule() { } - }" - `); - }); -}); diff --git a/packages/cloudflare/src/cli/build/patches/plugins/load-instrumentation.ts b/packages/cloudflare/src/cli/build/patches/plugins/load-instrumentation.ts deleted file mode 100644 index 99076715..00000000 --- a/packages/cloudflare/src/cli/build/patches/plugins/load-instrumentation.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * `loadInstrumentationModule` uses a dynamic require which is not supported. - */ - -import { patchCode } from "../ast/util.js"; -import type { ContentUpdater } from "./content-updater.js"; - -export const instrumentationRule = ` -rule: - kind: method_definition - all: - - has: {field: name, regex: ^loadInstrumentationModule$} - - has: {pattern: dynamicRequire, stopBy: end} - -fix: async loadInstrumentationModule() { } -`; - -export function patchLoadInstrumentation(updater: ContentUpdater) { - return updater.updateContent( - "patch-load-instrumentation", - { filter: /\.(js|mjs|cjs|jsx|ts|tsx)$/, contentFilter: /async loadInstrumentationModule\(/ }, - ({ contents }) => patchCode(contents, instrumentationRule) - ); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c5d509c..17f81e65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -683,7 +683,7 @@ importers: specifier: 'catalog:' version: 3.107.3(@cloudflare/workers-types@4.20250109.0) - examples/playground: + examples/playground14: dependencies: next: specifier: 'catalog:' @@ -708,6 +708,31 @@ importers: specifier: 'catalog:' version: 3.107.3(@cloudflare/workers-types@4.20250109.0) + examples/playground15: + dependencies: + next: + specifier: ^15.1.7 + version: 15.1.7(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@opennextjs/cloudflare': + specifier: workspace:* + version: link:../../packages/cloudflare + '@playwright/test': + specifier: 'catalog:' + version: 1.47.0 + '@types/node': + specifier: 'catalog:' + version: 22.2.0 + wrangler: + specifier: 'catalog:' + version: 3.107.3(@cloudflare/workers-types@4.20250109.0) + examples/ssg-app: dependencies: next: @@ -9039,9 +9064,6 @@ packages: tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -12977,7 +12999,7 @@ snapshots: '@react-aria/ssr@3.9.5(react@19.0.0-rc-3208e73e-20240730)': dependencies: - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.15 react: 19.0.0-rc-3208e73e-20240730 '@react-aria/utils@3.25.2(react@19.0.0-rc-3208e73e-20240730)': @@ -15337,7 +15359,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 dotenv@16.4.7: {} @@ -15921,8 +15943,8 @@ snapshots: '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.36.1(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -15941,7 +15963,7 @@ snapshots: '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.36.1(eslint@8.57.1) @@ -15961,7 +15983,7 @@ snapshots: '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) eslint: 9.11.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)) eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@1.21.6)) eslint-plugin-react: 7.37.4(eslint@9.11.1(jiti@1.21.6)) @@ -15981,7 +16003,7 @@ snapshots: '@typescript-eslint/parser': 8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3) eslint: 9.19.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.19.0(jiti@1.21.6)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.19.0(jiti@1.21.6)) eslint-plugin-jsx-a11y: 6.10.0(eslint@9.19.0(jiti@1.21.6)) eslint-plugin-react: 7.37.4(eslint@9.19.0(jiti@1.21.6)) @@ -16001,32 +16023,32 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.2.1 @@ -16039,13 +16061,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 9.11.1(jiti@1.21.6) - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.2.1 @@ -16058,13 +16080,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.19.0(jiti@1.21.6)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 9.19.0(jiti@1.21.6) - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.19.0(jiti@1.21.6)) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.2.1 @@ -16077,84 +16099,73 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)): + eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) eslint: 9.11.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)): + eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.19.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3) eslint: 9.19.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.19.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) eslint: 9.11.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.19.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3) eslint: 9.19.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.19.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -16165,7 +16176,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -16193,7 +16204,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -16222,7 +16233,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.11.1(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -16251,7 +16262,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.19.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)))(eslint@9.19.0(jiti@1.21.6)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.19.0(jiti@1.21.6)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -17784,7 +17795,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 lru-cache@10.4.3: {} @@ -18428,7 +18439,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.3 + tslib: 2.8.1 node-abi@3.73.0: dependencies: @@ -19487,7 +19498,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 snakecase-keys@5.4.4: dependencies: @@ -20142,8 +20153,6 @@ snapshots: tslib@2.4.1: {} - tslib@2.6.3: {} - tslib@2.8.1: {} tsx@4.19.2: