@wular/pnext 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -0
- package/bin/pnext +67 -0
- package/config/lint/base.js +48 -0
- package/config/ts/base.json +26 -0
- package/config/ts/react.json +13 -0
- package/package.json +70 -0
- package/reference/compat.md +63 -0
- package/reference/config.md +120 -0
- package/reference/css.md +58 -0
- package/reference/dev.md +69 -0
- package/reference/env.md +40 -0
- package/reference/metadata.md +86 -0
- package/reference/navigation.md +149 -0
- package/reference/overview.md +35 -0
- package/reference/performance.md +97 -0
- package/reference/rendering.md +127 -0
- package/reference/routing.md +167 -0
- package/reference/typegen.md +64 -0
- package/src/api/cache.ts +80 -0
- package/src/api/client-cache.ts +9 -0
- package/src/api/client-navigation.ts +279 -0
- package/src/api/dynamic.tsx +102 -0
- package/src/api/link.tsx +119 -0
- package/src/api/navigation.ts +198 -0
- package/src/api/router/events.ts +53 -0
- package/src/api/router/history.ts +70 -0
- package/src/api/router/hub.ts +194 -0
- package/src/api/router/policies.ts +107 -0
- package/src/api/router/runtime.ts +5238 -0
- package/src/api/router/types.ts +299 -0
- package/src/api/router.ts +167 -0
- package/src/api/server.ts +323 -0
- package/src/api/suspense.ts +16 -0
- package/src/cache/context.ts +61 -0
- package/src/cli/adapters/vercel-warm.ts +375 -0
- package/src/cli/adapters/vercel.ts +1310 -0
- package/src/cli/analyze-print.ts +181 -0
- package/src/cli/analyze.ts +328 -0
- package/src/cli/boot-trace.ts +29 -0
- package/src/cli/build.ts +3114 -0
- package/src/cli/dev.ts +276 -0
- package/src/cli/index.ts +196 -0
- package/src/cli/named-bin.ts +119 -0
- package/src/cli/serve-ui.ts +160 -0
- package/src/cli/start.ts +1425 -0
- package/src/client/build.ts +2136 -0
- package/src/client/chunk-fold.ts +526 -0
- package/src/client/entry.ts +1525 -0
- package/src/client/paths.ts +22 -0
- package/src/client/prebuilt.ts +621 -0
- package/src/client/profile.ts +75 -0
- package/src/client/react-compiler.ts +94 -0
- package/src/client/reference-stub.ts +145 -0
- package/src/client/reference.ts +47 -0
- package/src/compat/actions/action-client.ts +531 -0
- package/src/compat/actions/action-dispatch.ts +676 -0
- package/src/compat/actions/action-router.ts +40 -0
- package/src/compat/actions/action-shared.ts +95 -0
- package/src/compat/actions/client-plugin.ts +135 -0
- package/src/compat/actions/client-stub.ts +65 -0
- package/src/compat/actions/config.ts +164 -0
- package/src/compat/actions/detect.ts +208 -0
- package/src/compat/actions/discovery.ts +244 -0
- package/src/compat/actions/early-submit.ts +40 -0
- package/src/compat/actions/endpoint.ts +602 -0
- package/src/compat/actions/flight.ts +52 -0
- package/src/compat/actions/form-state.ts +73 -0
- package/src/compat/actions/hoist.ts +485 -0
- package/src/compat/actions/ids.ts +39 -0
- package/src/compat/actions/index.ts +41 -0
- package/src/compat/actions/instances.ts +144 -0
- package/src/compat/actions/origin.ts +109 -0
- package/src/compat/actions/protocol.ts +125 -0
- package/src/compat/actions/registry.ts +74 -0
- package/src/compat/actions/rewrite.ts +282 -0
- package/src/compat/actions/serve.ts +414 -0
- package/src/compat/actions/server-tag.ts +21 -0
- package/src/compat/actions/unrecognized-error.ts +30 -0
- package/src/compat/adapter/build-complete.ts +257 -0
- package/src/compat/bundler/bun-externals.ts +53 -0
- package/src/compat/bundler/cjs-exports.ts +542 -0
- package/src/compat/bundler/config.ts +363 -0
- package/src/compat/bundler/externals.ts +34 -0
- package/src/compat/bundler/import-meta-url.ts +60 -0
- package/src/compat/bundler/modularize-imports.ts +119 -0
- package/src/compat/bundler/new-url-asset.ts +87 -0
- package/src/compat/bundler/optimize-package-imports.ts +273 -0
- package/src/compat/bundler/polyfill.ts +88 -0
- package/src/compat/bundler/react-compiler.ts +61 -0
- package/src/compat/bundler/react-profiler.tsx +25 -0
- package/src/compat/bundler/relay-transform.ts +116 -0
- package/src/compat/bundler/require-context.ts +281 -0
- package/src/compat/bundler/resolve-extensions.ts +75 -0
- package/src/compat/bundler/source-cache.ts +61 -0
- package/src/compat/bundler/static-imports.ts +25 -0
- package/src/compat/bundler/symlink-imports.ts +119 -0
- package/src/compat/bundler/tsconfig-paths.ts +50 -0
- package/src/compat/bundler/wasm.ts +153 -0
- package/src/compat/bundler/webpack-loaders.ts +685 -0
- package/src/compat/bundler/worker.ts +278 -0
- package/src/compat/cache/build-flags.ts +81 -0
- package/src/compat/cache/build-prerender-errors.ts +163 -0
- package/src/compat/cache/custom-handler.ts +159 -0
- package/src/compat/cache/fetch-patch.ts +745 -0
- package/src/compat/cache/handler.ts +100 -0
- package/src/compat/cache/modern-handler.ts +275 -0
- package/src/compat/cache/resume-data-cache.ts +143 -0
- package/src/compat/cache/revalidate.ts +759 -0
- package/src/compat/cache/runtime-error.ts +124 -0
- package/src/compat/cache/use-cache-transform.ts +961 -0
- package/src/compat/cache/use-cache.ts +1695 -0
- package/src/compat/cache-control.ts +269 -0
- package/src/compat/client/base-path.ts +64 -0
- package/src/compat/client/css-order.ts +36 -0
- package/src/compat/client/errors/control-flow.ts +92 -0
- package/src/compat/client/errors/error-boundary.ts +222 -0
- package/src/compat/client/errors/global-error.ts +238 -0
- package/src/compat/client/errors/install.ts +217 -0
- package/src/compat/client/errors/lazy.ts +53 -0
- package/src/compat/client/errors/primitive-throw.ts +126 -0
- package/src/compat/client/errors/soft-refresh.ts +14 -0
- package/src/compat/client/link-status.ts +86 -0
- package/src/compat/client/nav-compat-runtime.ts +57 -0
- package/src/compat/client/nav-compat.ts +42 -0
- package/src/compat/client/navigation-scroll.ts +154 -0
- package/src/compat/client/optimistic-routing.ts +206 -0
- package/src/compat/client/prefetch-cache.ts +111 -0
- package/src/compat/client/route-announcer.ts +72 -0
- package/src/compat/client/segment-cache-policy.ts +159 -0
- package/src/compat/client/segment-cache.ts +1077 -0
- package/src/compat/client/segment-prefetch.ts +375 -0
- package/src/compat/client/trailing-slash.ts +24 -0
- package/src/compat/css/chunking.ts +254 -0
- package/src/compat/css/inline-css.ts +73 -0
- package/src/compat/css/lightningcss.ts +90 -0
- package/src/compat/css/modules.ts +373 -0
- package/src/compat/css/nonce.ts +30 -0
- package/src/compat/css/sass-plugin.ts +65 -0
- package/src/compat/css/sass.ts +392 -0
- package/src/compat/css/styled-jsx-runtime.ts +80 -0
- package/src/compat/css/styled-jsx.ts +49 -0
- package/src/compat/edge-runtime.ts +71 -0
- package/src/compat/export/client.ts +112 -0
- package/src/compat/export/index.ts +272 -0
- package/src/compat/export/standalone.ts +207 -0
- package/src/compat/image-optimizer/cache.ts +119 -0
- package/src/compat/image-optimizer/detect.ts +143 -0
- package/src/compat/image-optimizer/index.ts +601 -0
- package/src/compat/image-optimizer/source.ts +243 -0
- package/src/compat/index.ts +458 -0
- package/src/compat/lifecycle/after-scope.ts +86 -0
- package/src/compat/lifecycle/after.ts +173 -0
- package/src/compat/lifecycle/error-funnel.ts +306 -0
- package/src/compat/lifecycle/error-serialize.ts +87 -0
- package/src/compat/lifecycle/error-ui.ts +167 -0
- package/src/compat/lifecycle/instrumentation-client.ts +138 -0
- package/src/compat/lifecycle/instrumentation.ts +277 -0
- package/src/compat/lifecycle/node-console.ts +19 -0
- package/src/compat/lifecycle/testmode.ts +263 -0
- package/src/compat/mdx/compile.ts +219 -0
- package/src/compat/mdx/next-mdx-stub.ts +46 -0
- package/src/compat/mdx/plugin.ts +37 -0
- package/src/compat/metadata-route-artifacts.ts +458 -0
- package/src/compat/metadata.ts +295 -0
- package/src/compat/middleware/manifest.ts +210 -0
- package/src/compat/misc/action-return.ts +173 -0
- package/src/compat/next/cache.ts +211 -0
- package/src/compat/next/canonical-url.ts +35 -0
- package/src/compat/next/client-cache.ts +57 -0
- package/src/compat/next/client-navigation.ts +313 -0
- package/src/compat/next/client-only.ts +3 -0
- package/src/compat/next/client-script.tsx +215 -0
- package/src/compat/next/client-server.ts +39 -0
- package/src/compat/next/config-loader.ts +569 -0
- package/src/compat/next/config.ts +29 -0
- package/src/compat/next/constants.cjs +6 -0
- package/src/compat/next/constants.ts +6 -0
- package/src/compat/next/custom-server.ts +236 -0
- package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
- package/src/compat/next/dynamic.tsx +46 -0
- package/src/compat/next/error.tsx +148 -0
- package/src/compat/next/font/cache.ts +171 -0
- package/src/compat/next/font/google.ts +2 -0
- package/src/compat/next/font/index.ts +8 -0
- package/src/compat/next/font/local.ts +5 -0
- package/src/compat/next/font/runtime-client.ts +71 -0
- package/src/compat/next/font/runtime.ts +974 -0
- package/src/compat/next/font/shared.ts +281 -0
- package/src/compat/next/form.tsx +156 -0
- package/src/compat/next/head.tsx +10 -0
- package/src/compat/next/headers.ts +247 -0
- package/src/compat/next/image/config.ts +196 -0
- package/src/compat/next/image/optimizer.ts +96 -0
- package/src/compat/next/image/patterns.ts +103 -0
- package/src/compat/next/image/shared.ts +141 -0
- package/src/compat/next/image/static-metadata.ts +283 -0
- package/src/compat/next/image/validate.ts +269 -0
- package/src/compat/next/image-client.tsx +215 -0
- package/src/compat/next/image-props.ts +575 -0
- package/src/compat/next/image-usage.ts +102 -0
- package/src/compat/next/image.tsx +56 -0
- package/src/compat/next/index.ts +1 -0
- package/src/compat/next/legacy-image.tsx +97 -0
- package/src/compat/next/link-usage.ts +29 -0
- package/src/compat/next/link-validation-transform.ts +200 -0
- package/src/compat/next/link.tsx +466 -0
- package/src/compat/next/navigation.cjs +21 -0
- package/src/compat/next/navigation.ts +188 -0
- package/src/compat/next/offline.ts +51 -0
- package/src/compat/next/og.ts +324 -0
- package/src/compat/next/optimistic-route-state.ts +188 -0
- package/src/compat/next/preferred-region.ts +39 -0
- package/src/compat/next/redirects.ts +131 -0
- package/src/compat/next/resource-hints.ts +136 -0
- package/src/compat/next/rewrites.ts +350 -0
- package/src/compat/next/root-params.ts +142 -0
- package/src/compat/next/router.cjs +49 -0
- package/src/compat/next/router.ts +143 -0
- package/src/compat/next/script.tsx +355 -0
- package/src/compat/next/server-only.ts +3 -0
- package/src/compat/next/server.ts +28 -0
- package/src/compat/next/svgr.ts +58 -0
- package/src/compat/next/telemetry.ts +77 -0
- package/src/compat/next/user-agent.ts +100 -0
- package/src/compat/next/web-vitals.ts +56 -0
- package/src/compat/otel/api.ts +95 -0
- package/src/compat/otel/client-trace-metadata.ts +71 -0
- package/src/compat/otel/fetch-span.ts +77 -0
- package/src/compat/otel/tracer.ts +944 -0
- package/src/compat/pages/client-plugin.ts +108 -0
- package/src/compat/pages/index.ts +527 -0
- package/src/compat/pages/router-state.ts +94 -0
- package/src/compat/ppr/io.ts +38 -0
- package/src/compat/ppr/missing-root-params.ts +105 -0
- package/src/compat/ppr/root-params-scan.ts +164 -0
- package/src/compat/ppr/root-params-transform.ts +75 -0
- package/src/compat/ppr/root-params.ts +129 -0
- package/src/compat/ppr/segment-config-incompat.ts +34 -0
- package/src/compat/protocol.ts +202 -0
- package/src/compat/react/client.ts +59 -0
- package/src/compat/react/compiler-runtime.ts +60 -0
- package/src/compat/react/dom-client.ts +115 -0
- package/src/compat/react/dom-react-server.ts +20 -0
- package/src/compat/react/dom-server.ts +40 -0
- package/src/compat/react/dom.ts +154 -0
- package/src/compat/react/preact.ts +522 -0
- package/src/compat/react/react-server.ts +84 -0
- package/src/compat/react/router-shim.ts +26 -0
- package/src/compat/react/server-component-use.ts +48 -0
- package/src/compat/react/server-inserted-html.ts +87 -0
- package/src/compat/react/server.ts +156 -0
- package/src/compat/react/view-transition.ts +60 -0
- package/src/compat/register/actions.ts +875 -0
- package/src/compat/register/boot.ts +141 -0
- package/src/compat/register/build-tier.ts +11 -0
- package/src/compat/register/build.ts +182 -0
- package/src/compat/register/bundler.ts +587 -0
- package/src/compat/register/cache.ts +85 -0
- package/src/compat/register/client-errors.ts +18 -0
- package/src/compat/register/config.ts +17 -0
- package/src/compat/register/css-extras.ts +120 -0
- package/src/compat/register/edge-runtime.ts +6 -0
- package/src/compat/register/errors.ts +46 -0
- package/src/compat/register/export.ts +23 -0
- package/src/compat/register/font.ts +36 -0
- package/src/compat/register/hooks.ts +34 -0
- package/src/compat/register/image.ts +133 -0
- package/src/compat/register/index.ts +111 -0
- package/src/compat/register/instrumentation-client.ts +35 -0
- package/src/compat/register/lifecycle.ts +86 -0
- package/src/compat/register/mdx.ts +48 -0
- package/src/compat/register/middleware.ts +36 -0
- package/src/compat/register/misc.ts +44 -0
- package/src/compat/register/otel.ts +288 -0
- package/src/compat/register/pages-api.ts +473 -0
- package/src/compat/register/ppr.ts +56 -0
- package/src/compat/register/protocol.ts +57 -0
- package/src/compat/register/proxy.ts +127 -0
- package/src/compat/register/render.ts +268 -0
- package/src/compat/register/routing.ts +410 -0
- package/src/compat/register/segment.ts +1903 -0
- package/src/compat/register/static-image.ts +21 -0
- package/src/compat/register/typed-routes.ts +35 -0
- package/src/compat/register/usecache.ts +131 -0
- package/src/compat/register/validation.ts +56 -0
- package/src/compat/segment/loading-boundary.ts +113 -0
- package/src/compat/segment/page-slot.ts +200 -0
- package/src/compat/segment/tree.ts +481 -0
- package/src/compat/segment/vary-key.ts +102 -0
- package/src/compat/segment/vary-params.ts +551 -0
- package/src/compat/static-params.ts +33 -0
- package/src/compat/tsconfig-defaults.ts +301 -0
- package/src/compat/typecheck/index.ts +1481 -0
- package/src/compat/typecheck/worker.ts +26 -0
- package/src/compat/typed-routes/index.ts +92 -0
- package/src/compat/typed-routes/manifest.ts +356 -0
- package/src/compat/typed-routes/typegen.ts +566 -0
- package/src/compat/validation/errors.ts +159 -0
- package/src/compat/validation/index.ts +1770 -0
- package/src/compat/validation/prerender-diagnostics.ts +1508 -0
- package/src/compat-bootstrap.ts +67 -0
- package/src/config.ts +218 -0
- package/src/css/build.ts +697 -0
- package/src/css/index.ts +2 -0
- package/src/css/postcss.ts +236 -0
- package/src/css/worker.ts +34 -0
- package/src/dev/client-actions.ts +35 -0
- package/src/dev/client-chunk-store.ts +92 -0
- package/src/dev/client-key-cache.ts +178 -0
- package/src/dev/global-css-cache.ts +212 -0
- package/src/dev/imports.ts +2430 -0
- package/src/dev/module-cache.ts +721 -0
- package/src/dev/module-generations.ts +38 -0
- package/src/dev/module-transform.ts +188 -0
- package/src/dev/node-module-bundle-cache.ts +63 -0
- package/src/dev/restart-cache.ts +10 -0
- package/src/dev/route-bundle-key-cache.ts +154 -0
- package/src/dev/route-facts-cache.ts +223 -0
- package/src/dev/server.ts +1710 -0
- package/src/dynamic/source.ts +307 -0
- package/src/dynamic/tree-shake.ts +262 -0
- package/src/env.ts +92 -0
- package/src/extensions.ts +1898 -0
- package/src/index.ts +34 -0
- package/src/internal.ts +43 -0
- package/src/islands/boundary-error.ts +8 -0
- package/src/islands/static-children.ts +37 -0
- package/src/islands/static-slots.ts +106 -0
- package/src/ppr-postpone.ts +24 -0
- package/src/ppr.ts +784 -0
- package/src/proxy.ts +752 -0
- package/src/render/hooks.ts +384 -0
- package/src/render/index.ts +1 -0
- package/src/render/island-context.ts +47 -0
- package/src/render/metadata.ts +857 -0
- package/src/render/renderer.ts +7391 -0
- package/src/render/resource-hints.ts +44 -0
- package/src/render/slots.tsx +679 -0
- package/src/request/context.ts +396 -0
- package/src/resolve/engine.ts +219 -0
- package/src/resolve/imports.ts +1104 -0
- package/src/resolve/scan-facts.ts +474 -0
- package/src/resolve/source-text.ts +86 -0
- package/src/routing/forwarded.ts +41 -0
- package/src/routing/handler.ts +271 -0
- package/src/routing/href.ts +203 -0
- package/src/routing/metadata.ts +1018 -0
- package/src/routing/request-runtime.ts +43 -0
- package/src/routing/routes.ts +2560 -0
- package/src/routing/slots.ts +432 -0
- package/src/runtime/server.ts +3453 -0
- package/src/runtime/vendor.ts +1160 -0
- package/src/style-modules.d.ts +9 -0
- package/src/typegen.ts +151 -0
- package/src/types.ts +725 -0
- package/src/utils/ansi.ts +9 -0
- package/src/utils/content-type.ts +31 -0
- package/src/utils/decode.ts +7 -0
- package/src/utils/dev-profile.ts +31 -0
- package/src/utils/error-log.ts +29 -0
- package/src/utils/fs-cache.ts +31 -0
- package/src/utils/fs.ts +119 -0
- package/src/utils/html.ts +46 -0
- package/src/utils/serialize.ts +378 -0
- package/src/utils/source.ts +35 -0
- package/src/utils/verbose.ts +39 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// tsconfig.json configuration defaults (COMPAT).
|
|
2
|
+
//
|
|
3
|
+
// Mirrors Next's `writeConfigurationDefaults`: on build, missing suggested options are added and
|
|
4
|
+
// mandatory options are forced into the app's tsconfig.json, logging the same "suggested values" /
|
|
5
|
+
// "mandatory changes" summaries the suites assert on. Notably, when the app uses `module: "preserve"`,
|
|
6
|
+
// `moduleResolution`, `esModuleInterop` and `resolveJsonModule` are implied and must NOT be added or
|
|
7
|
+
// mentioned.
|
|
8
|
+
//
|
|
9
|
+
// Deliberate deviations from Next, all no-op-preserving: configs with comments (JSONC) are left untouched
|
|
10
|
+
// (bailing is safe because a failed parse only skips the rewrite), and the test-glob exclusions are not
|
|
11
|
+
// applied.
|
|
12
|
+
//
|
|
13
|
+
// When no tsconfig.json exists but the project contains TypeScript sources, one is created from scratch.
|
|
14
|
+
|
|
15
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
16
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
17
|
+
import { createRequire } from 'node:module';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import type { ResolvedConfig } from '../config';
|
|
20
|
+
import { getNextConfig } from './next/config-loader';
|
|
21
|
+
|
|
22
|
+
interface SuggestedOption {
|
|
23
|
+
suggested: unknown;
|
|
24
|
+
reason?: string;
|
|
25
|
+
}
|
|
26
|
+
interface RequiredOption {
|
|
27
|
+
parsedValue?: unknown;
|
|
28
|
+
parsedValues?: unknown[];
|
|
29
|
+
value: unknown;
|
|
30
|
+
reason: string;
|
|
31
|
+
}
|
|
32
|
+
type DesiredOption = SuggestedOption | RequiredOption;
|
|
33
|
+
|
|
34
|
+
interface TsconfigShape {
|
|
35
|
+
compilerOptions?: Record<string, unknown>;
|
|
36
|
+
include?: unknown;
|
|
37
|
+
exclude?: unknown;
|
|
38
|
+
[key: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Whether the project carries any .ts/.tsx source (bounded walk skipping
|
|
42
|
+
// node_modules/dot-dirs) — Next's TS-detection gate for first-time setup.
|
|
43
|
+
function hasTypescriptSources(root: string, depth = 0): boolean {
|
|
44
|
+
if (depth > 6) return false;
|
|
45
|
+
let entries: import('node:fs').Dirent[];
|
|
46
|
+
try {
|
|
47
|
+
entries = readdirSync(root, { withFileTypes: true });
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
|
|
53
|
+
if (entry.isFile() && /\.(ts|tsx|mts|cts)$/.test(entry.name) && !entry.name.endsWith('.d.ts')) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
if (entry.isDirectory() && hasTypescriptSources(path.join(root, entry.name), depth + 1)) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The app's typescript version, else pnext's own. Read from package.json rather
|
|
64
|
+
// than `ts.version` so the 8 MB compiler never loads for a version string —
|
|
65
|
+
// nothing outside the typecheck step should pull `typescript` in at all.
|
|
66
|
+
function appTypescriptVersion(root: string): string {
|
|
67
|
+
for (const base of [root, import.meta.dirname]) {
|
|
68
|
+
try {
|
|
69
|
+
const require = createRequire(path.join(base, 'noop.js'));
|
|
70
|
+
const pkg = require('typescript/package.json') as { version?: string };
|
|
71
|
+
if (typeof pkg.version === 'string') return pkg.version;
|
|
72
|
+
} catch {
|
|
73
|
+
// keep looking
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return '5.9.0';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function versionGte(version: string, major: number, minor: number): boolean {
|
|
80
|
+
const [maj = 0, min = 0] = version.split('.').map(part => Number.parseInt(part, 10));
|
|
81
|
+
return maj > major || (maj === major && min >= minor);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function getDesiredCompilerOptions(
|
|
85
|
+
typescriptVersion: string,
|
|
86
|
+
userTsConfig: TsconfigShape,
|
|
87
|
+
): Record<string, DesiredOption> {
|
|
88
|
+
const configuredModule =
|
|
89
|
+
typeof userTsConfig.compilerOptions?.module === 'string'
|
|
90
|
+
? userTsConfig.compilerOptions.module.toLowerCase()
|
|
91
|
+
: undefined;
|
|
92
|
+
const preferBundlerResolution =
|
|
93
|
+
versionGte(typescriptVersion, 5, 0) &&
|
|
94
|
+
configuredModule !== 'commonjs' &&
|
|
95
|
+
configuredModule !== 'amd';
|
|
96
|
+
const modulePreserve = versionGte(typescriptVersion, 5, 4) && configuredModule === 'preserve';
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
target: {
|
|
100
|
+
suggested: 'ES2017',
|
|
101
|
+
reason: 'For top-level `await`. Note: Next.js only polyfills for the esmodules target.',
|
|
102
|
+
},
|
|
103
|
+
lib: { suggested: ['dom', 'dom.iterable', 'esnext'] },
|
|
104
|
+
allowJs: { suggested: true },
|
|
105
|
+
skipLibCheck: { suggested: true },
|
|
106
|
+
strict: { suggested: false },
|
|
107
|
+
noEmit: { suggested: true },
|
|
108
|
+
incremental: { suggested: true },
|
|
109
|
+
module: {
|
|
110
|
+
parsedValue: 'esnext',
|
|
111
|
+
parsedValues: [
|
|
112
|
+
...(versionGte(typescriptVersion, 5, 4) ? ['preserve'] : []),
|
|
113
|
+
'es2020',
|
|
114
|
+
'esnext',
|
|
115
|
+
'commonjs',
|
|
116
|
+
'amd',
|
|
117
|
+
'nodenext',
|
|
118
|
+
'node16',
|
|
119
|
+
],
|
|
120
|
+
value: 'esnext',
|
|
121
|
+
reason: 'for dynamic import() support',
|
|
122
|
+
},
|
|
123
|
+
// `module: "preserve"` implies moduleResolution: bundler, esModuleInterop
|
|
124
|
+
// and resolveJsonModule — the app does not need (and must not be told to
|
|
125
|
+
// add) any of them.
|
|
126
|
+
...(modulePreserve
|
|
127
|
+
? {}
|
|
128
|
+
: {
|
|
129
|
+
esModuleInterop: { value: true, reason: 'requirement for SWC / babel' },
|
|
130
|
+
moduleResolution: {
|
|
131
|
+
parsedValue: preferBundlerResolution ? 'bundler' : 'node',
|
|
132
|
+
parsedValues: preferBundlerResolution
|
|
133
|
+
? ['node16', 'nodenext', 'bundler']
|
|
134
|
+
: ['node', 'node12', 'node16', 'nodenext'],
|
|
135
|
+
value: preferBundlerResolution ? 'bundler' : 'node',
|
|
136
|
+
reason: preferBundlerResolution
|
|
137
|
+
? 'to match modern bundler resolution'
|
|
138
|
+
: 'to match webpack resolution',
|
|
139
|
+
},
|
|
140
|
+
resolveJsonModule: { value: true, reason: 'to match webpack resolution' },
|
|
141
|
+
}),
|
|
142
|
+
...(userTsConfig.compilerOptions?.verbatimModuleSyntax === true
|
|
143
|
+
? {}
|
|
144
|
+
: { isolatedModules: { value: true, reason: 'requirement for SWC / Babel' } }),
|
|
145
|
+
jsx: {
|
|
146
|
+
parsedValue: 'react-jsx',
|
|
147
|
+
value: 'react-jsx',
|
|
148
|
+
reason: 'next.js uses the React automatic runtime',
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// `<distDir>/types/**` plus the dev-mode variant, shortest first (Next sorts by
|
|
154
|
+
// length so dev/build runs produce identical include arrays).
|
|
155
|
+
function typeDefinitionGlobPatterns(distDir: string): string[] {
|
|
156
|
+
return [`${distDir}/types/**/*.ts`, `${distDir}/dev/types/**/*.ts`].sort(
|
|
157
|
+
(a, b) => a.length - b.length,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Patch the app's tsconfig.json with Next's suggested/mandatory compiler
|
|
163
|
+
* options and log the changes the way `next build` does. No-op when the config
|
|
164
|
+
* is absent, extends another config, is unparseable, or already satisfies
|
|
165
|
+
* every requirement.
|
|
166
|
+
*/
|
|
167
|
+
export async function writeTsconfigDefaults(config: ResolvedConfig): Promise<void> {
|
|
168
|
+
const tsConfigPath = path.join(config.root, 'tsconfig.json');
|
|
169
|
+
let isFirstTimeSetup = false;
|
|
170
|
+
if (!existsSync(tsConfigPath)) {
|
|
171
|
+
if (!hasTypescriptSources(config.root)) return;
|
|
172
|
+
isFirstTimeSetup = true;
|
|
173
|
+
await writeFile(tsConfigPath, '{}\n');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let userTsConfig: TsconfigShape;
|
|
177
|
+
try {
|
|
178
|
+
userTsConfig = JSON.parse(await readFile(tsConfigPath, 'utf8')) as TsconfigShape;
|
|
179
|
+
} catch {
|
|
180
|
+
return; // JSONC / invalid — leave the user's file alone
|
|
181
|
+
}
|
|
182
|
+
if (userTsConfig === null || typeof userTsConfig !== 'object') return;
|
|
183
|
+
// Automatic setup would clobber inherited options; Next bails here too.
|
|
184
|
+
if ('extends' in userTsConfig || 'references' in userTsConfig) return;
|
|
185
|
+
|
|
186
|
+
if (userTsConfig.compilerOptions == null) userTsConfig.compilerOptions = {};
|
|
187
|
+
const compilerOptions = userTsConfig.compilerOptions;
|
|
188
|
+
|
|
189
|
+
const desired = getDesiredCompilerOptions(appTypescriptVersion(config.root), userTsConfig);
|
|
190
|
+
|
|
191
|
+
const suggestedActions: string[] = [];
|
|
192
|
+
const requiredActions: string[] = [];
|
|
193
|
+
for (const [optionKey, check] of Object.entries(desired)) {
|
|
194
|
+
if ('suggested' in check) {
|
|
195
|
+
if (!(optionKey in compilerOptions)) {
|
|
196
|
+
compilerOptions[optionKey] = check.suggested;
|
|
197
|
+
suggestedActions.push(
|
|
198
|
+
`${optionKey} was set to ${JSON.stringify(check.suggested)}` +
|
|
199
|
+
(check.reason ? ` (${check.reason})` : ''),
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
let existingValue = compilerOptions[optionKey];
|
|
205
|
+
if (typeof existingValue === 'string') existingValue = existingValue.toLowerCase();
|
|
206
|
+
const satisfied = check.parsedValues
|
|
207
|
+
? check.parsedValues.includes(existingValue)
|
|
208
|
+
: (check.parsedValue ?? check.value) === existingValue;
|
|
209
|
+
if (!satisfied) {
|
|
210
|
+
compilerOptions[optionKey] = check.value;
|
|
211
|
+
requiredActions.push(`${optionKey} was set to ${String(check.value)} (${check.reason})`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const hasAppDir =
|
|
216
|
+
existsSync(path.join(config.root, 'app')) || existsSync(path.join(config.root, 'src', 'app'));
|
|
217
|
+
const hasPagesDir =
|
|
218
|
+
existsSync(path.join(config.root, 'pages')) ||
|
|
219
|
+
existsSync(path.join(config.root, 'src', 'pages'));
|
|
220
|
+
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
221
|
+
const strictRouteTypes = process.env.__NEXT_EXPERIMENTAL_STRICT_ROUTE_TYPES === 'true';
|
|
222
|
+
const distDir =
|
|
223
|
+
typeof getNextConfig().distDir === 'string' ? (getNextConfig().distDir as string) : '.next';
|
|
224
|
+
const nextTypes = typeDefinitionGlobPatterns(distDir);
|
|
225
|
+
|
|
226
|
+
if (!('include' in userTsConfig)) {
|
|
227
|
+
const defaultInclude =
|
|
228
|
+
hasAppDir && !strictRouteTypes
|
|
229
|
+
? ['next-env.d.ts', ...nextTypes, '**/*.mts', '**/*.ts', '**/*.tsx']
|
|
230
|
+
: ['next-env.d.ts', '**/*.mts', '**/*.ts', '**/*.tsx'];
|
|
231
|
+
userTsConfig.include = defaultInclude;
|
|
232
|
+
suggestedActions.push(
|
|
233
|
+
`include was set to [${defaultInclude.map(type => `'${type}'`).join(', ')}]`,
|
|
234
|
+
);
|
|
235
|
+
} else if (hasAppDir && !strictRouteTypes && Array.isArray(userTsConfig.include)) {
|
|
236
|
+
for (const type of nextTypes) {
|
|
237
|
+
if (!userTsConfig.include.includes(type)) {
|
|
238
|
+
userTsConfig.include.push(type);
|
|
239
|
+
suggestedActions.push(`include was updated to add '${type}'`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (hasAppDir) {
|
|
245
|
+
const plugins = [
|
|
246
|
+
...(Array.isArray(userTsConfig.plugins) ? (userTsConfig.plugins as unknown[]) : []),
|
|
247
|
+
...(Array.isArray(compilerOptions.plugins) ? (compilerOptions.plugins as unknown[]) : []),
|
|
248
|
+
] as { name?: string }[];
|
|
249
|
+
if (!plugins.some(plugin => plugin?.name === 'next')) {
|
|
250
|
+
if (!Array.isArray(compilerOptions.plugins)) compilerOptions.plugins = [];
|
|
251
|
+
(compilerOptions.plugins as unknown[]).push({ name: 'next' });
|
|
252
|
+
suggestedActions.push(`plugins was updated to add { name: 'next' }`);
|
|
253
|
+
}
|
|
254
|
+
if (
|
|
255
|
+
hasPagesDir &&
|
|
256
|
+
!compilerOptions.strict &&
|
|
257
|
+
!('strictNullChecks' in compilerOptions)
|
|
258
|
+
) {
|
|
259
|
+
compilerOptions.strictNullChecks = true;
|
|
260
|
+
suggestedActions.push('strictNullChecks was set to true');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (!('exclude' in userTsConfig)) {
|
|
265
|
+
userTsConfig.exclude = ['node_modules'];
|
|
266
|
+
suggestedActions.push(`exclude was set to ['node_modules']`);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (suggestedActions.length === 0 && requiredActions.length === 0) return;
|
|
270
|
+
|
|
271
|
+
await writeFile(tsConfigPath, `${JSON.stringify(userTsConfig, null, 2)}\n`);
|
|
272
|
+
|
|
273
|
+
if (isFirstTimeSetup) {
|
|
274
|
+
console.log(
|
|
275
|
+
'\nWe detected TypeScript in your project and created a tsconfig.json file for you.',
|
|
276
|
+
);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const lines = [
|
|
281
|
+
'',
|
|
282
|
+
`We detected TypeScript in your project and reconfigured your tsconfig.json file for you.${
|
|
283
|
+
compilerOptions.strict ? '' : ' Strict-mode is set to false by default.'
|
|
284
|
+
}`,
|
|
285
|
+
];
|
|
286
|
+
if (suggestedActions.length > 0) {
|
|
287
|
+
lines.push(
|
|
288
|
+
`The following suggested values were added to your tsconfig.json. These values can be changed to fit your project's needs:\n`,
|
|
289
|
+
...suggestedActions.map(action => `\t- ${action}`),
|
|
290
|
+
'',
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
if (requiredActions.length > 0) {
|
|
294
|
+
lines.push(
|
|
295
|
+
`The following mandatory changes were made to your tsconfig.json:\n`,
|
|
296
|
+
...requiredActions.map(action => `\t- ${action}`),
|
|
297
|
+
'',
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
console.log(lines.join('\n'));
|
|
301
|
+
}
|