@wular/pnext 0.0.3 → 0.0.6
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 +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1961
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1887
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +442 -186
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +833 -848
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// full tier that re-assign a value set here re-assign the SAME implementation, so the two tiers cannot
|
|
16
16
|
// disagree.
|
|
17
17
|
|
|
18
|
-
import type { ResolvedConfig } from '../../config'
|
|
18
|
+
import type { ResolvedConfig } from '../../config'
|
|
19
19
|
import {
|
|
20
20
|
getProxyExtensions,
|
|
21
21
|
onExtensionHostReset,
|
|
@@ -26,13 +26,13 @@ import {
|
|
|
26
26
|
setCssExtensions,
|
|
27
27
|
setImportAliasExtensions,
|
|
28
28
|
setProxyExtensions,
|
|
29
|
-
} from '../../extensions'
|
|
30
|
-
import { findProxyFiles } from '../../proxy'
|
|
29
|
+
} from '../../extensions'
|
|
30
|
+
import { findProxyFiles } from '../../routing/proxy'
|
|
31
31
|
import {
|
|
32
32
|
packageNameOfSpecifier,
|
|
33
33
|
resolvePackageSpecifier,
|
|
34
34
|
setModuleAliases,
|
|
35
|
-
} from '../../resolve/imports'
|
|
35
|
+
} from '../../resolve/imports'
|
|
36
36
|
import {
|
|
37
37
|
compatAliases,
|
|
38
38
|
missingCompatImportError,
|
|
@@ -41,58 +41,58 @@ import {
|
|
|
41
41
|
reactCompatEnabled,
|
|
42
42
|
reactCompilerOptions,
|
|
43
43
|
reactServerLayerAliases,
|
|
44
|
-
} from '../
|
|
45
|
-
import { transpilePackages } from '../bundler/config'
|
|
46
|
-
import { materializeNextCssSources, nextCssResolveDependency } from '../css/modules'
|
|
47
|
-
import { getNextConfig } from '../next/config-loader'
|
|
48
|
-
import { registerLifecycleBootHooks } from './lifecycle'
|
|
49
|
-
import { registerRoutingExtensions } from './routing'
|
|
44
|
+
} from '../aliases'
|
|
45
|
+
import { transpilePackages } from '../bundler/config'
|
|
46
|
+
import { materializeNextCssSources, nextCssResolveDependency } from '../css/modules'
|
|
47
|
+
import { getNextConfig } from '../next/config-loader'
|
|
48
|
+
import { registerLifecycleBootHooks } from './lifecycle'
|
|
49
|
+
import { registerRoutingExtensions } from './routing'
|
|
50
50
|
|
|
51
51
|
/** Proxy entrypoint basenames Next supports (`middleware` is the legacy name). */
|
|
52
|
-
const NEXT_PROXY_NAMES = ['proxy', 'middleware']
|
|
52
|
+
const NEXT_PROXY_NAMES = ['proxy', 'middleware']
|
|
53
53
|
|
|
54
54
|
// Extensions core already carries as page/convention files (base list in
|
|
55
55
|
// routes.ts). Registering one of these is a no-op, so we filter them out and
|
|
56
56
|
// only register the genuinely-extra ones a configured pageExtensions adds.
|
|
57
|
-
const CORE_BASE_PAGE_EXTENSIONS = new Set(['tsx', 'ts', 'jsx', 'js', 'mjs'])
|
|
57
|
+
const CORE_BASE_PAGE_EXTENSIONS = new Set(['tsx', 'ts', 'jsx', 'js', 'mjs'])
|
|
58
58
|
|
|
59
|
-
let registered = false
|
|
59
|
+
let registered = false
|
|
60
60
|
// Host-scoped guard: a fresh host must be registered into again.
|
|
61
|
-
onExtensionHostReset(() => (registered = false))
|
|
61
|
+
onExtensionHostReset(() => (registered = false))
|
|
62
62
|
|
|
63
63
|
export function registerCompatBootExtensions(config: ResolvedConfig): void {
|
|
64
|
-
if (registered) return
|
|
65
|
-
registered = true
|
|
64
|
+
if (registered) return
|
|
65
|
+
registered = true
|
|
66
66
|
|
|
67
67
|
setCompatModeExtensions({
|
|
68
68
|
nextEnabled: nextCompatEnabled,
|
|
69
69
|
reactEnabled: reactCompatEnabled,
|
|
70
70
|
reactCompilerOptions,
|
|
71
|
-
})
|
|
71
|
+
})
|
|
72
72
|
setImportAliasExtensions({
|
|
73
73
|
aliases: compatAliases,
|
|
74
74
|
clientSsrAliases: cfg => nextCompatAliases(cfg, 'server'),
|
|
75
75
|
missingImportError: missingCompatImportError,
|
|
76
76
|
reactServerLayerAliases,
|
|
77
|
-
})
|
|
77
|
+
})
|
|
78
78
|
// Route scanning (client-reference/boundary detection) resolves imports statically, with no per-call
|
|
79
79
|
// config to consult - register the same bare-specifier aliases the bundler uses so a server component
|
|
80
80
|
// importing e.g. `next/form` still resolves to its compat file and gets walked for 'use client'
|
|
81
81
|
// detection.
|
|
82
|
-
setModuleAliases(compatAliases(config, 'server'))
|
|
83
|
-
registerRoutingExtensions(config)
|
|
84
|
-
registerLifecycleBootHooks(config)
|
|
82
|
+
setModuleAliases(compatAliases(config, 'server'))
|
|
83
|
+
registerRoutingExtensions(config)
|
|
84
|
+
registerLifecycleBootHooks(config)
|
|
85
85
|
|
|
86
|
-
if (!nextCompatEnabled(config)) return
|
|
86
|
+
if (!nextCompatEnabled(config)) return
|
|
87
87
|
|
|
88
|
-
registerCompatPageExtensions()
|
|
89
|
-
setBundlerExtensions({ resolveRouteDependency: resolveTranspiledRouteDependency() })
|
|
90
|
-
materializeNextCssSources(config)
|
|
88
|
+
registerCompatPageExtensions()
|
|
89
|
+
setBundlerExtensions({ resolveRouteDependency: resolveTranspiledRouteDependency() })
|
|
90
|
+
materializeNextCssSources(config)
|
|
91
91
|
setCssExtensions({
|
|
92
92
|
extraCssExtensions: () => ['.scss', '.sass'],
|
|
93
93
|
resolveCssDependency: nextCssResolveDependency(config),
|
|
94
|
-
})
|
|
95
|
-
setProxyExtensions({ names: NEXT_PROXY_NAMES, validateFiles: validateProxyFiles })
|
|
94
|
+
})
|
|
95
|
+
setProxyExtensions({ names: NEXT_PROXY_NAMES, validateFiles: validateProxyFiles })
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
/**
|
|
@@ -103,30 +103,30 @@ export function registerCompatBootExtensions(config: ResolvedConfig): void {
|
|
|
103
103
|
* matching MDX compilation is wired later, in register-mdx.
|
|
104
104
|
*/
|
|
105
105
|
function registerCompatPageExtensions(): void {
|
|
106
|
-
const configured = getNextConfig().pageExtensions
|
|
106
|
+
const configured = getNextConfig().pageExtensions
|
|
107
107
|
if (Array.isArray(configured)) {
|
|
108
108
|
const extras = configured.filter(
|
|
109
109
|
(ext): ext is string =>
|
|
110
110
|
typeof ext === 'string' && ext.length > 0 && !CORE_BASE_PAGE_EXTENSIONS.has(ext),
|
|
111
|
-
)
|
|
112
|
-
if (extras.length > 0) registerPageExtensions(...extras)
|
|
111
|
+
)
|
|
112
|
+
if (extras.length > 0) registerPageExtensions(...extras)
|
|
113
113
|
}
|
|
114
114
|
// Imported markdown is loadable even when not routable: `pageExtensions:
|
|
115
115
|
// ['mdx']` still allows `import Doc from './x.md'` through @next/mdx's
|
|
116
|
-
// /\.mdx?$/ rule, and the server runtime compiles both (
|
|
116
|
+
// /\.mdx?$/ rule, and the server runtime compiles both (runtime/modules,
|
|
117
117
|
// transformSource). Without this the Bun load plugin never claims `.md` and
|
|
118
118
|
// the import falls through to the file loader (default export = the path).
|
|
119
|
-
registerLoadableExtensions('mdx', 'md')
|
|
119
|
+
registerLoadableExtensions('mdx', 'md')
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
/** B7 `transpilePackages` resolution used by the route scanner's module walk. */
|
|
123
123
|
function resolveTranspiledRouteDependency() {
|
|
124
|
-
const transpile = new Set(transpilePackages())
|
|
124
|
+
const transpile = new Set(transpilePackages())
|
|
125
125
|
return (root: string, fromFile: string, specifier: string): string | undefined => {
|
|
126
|
-
const packageName = packageNameOfSpecifier(specifier)
|
|
127
|
-
if (!packageName || !transpile.has(packageName)) return undefined
|
|
128
|
-
return resolvePackageSpecifier(root, fromFile, specifier, ['import', 'browser', 'default'])
|
|
129
|
-
}
|
|
126
|
+
const packageName = packageNameOfSpecifier(specifier)
|
|
127
|
+
if (!packageName || !transpile.has(packageName)) return undefined
|
|
128
|
+
return resolvePackageSpecifier(root, fromFile, specifier, ['import', 'browser', 'default'])
|
|
129
|
+
}
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
/**
|
|
@@ -134,8 +134,8 @@ function resolveTranspiledRouteDependency() {
|
|
|
134
134
|
* implementation - for everyone else this is the whole cost of proxy support at boot.
|
|
135
135
|
*/
|
|
136
136
|
async function validateProxyFiles(config: ResolvedConfig): Promise<void> {
|
|
137
|
-
if (findProxyFiles(config, NEXT_PROXY_NAMES).length === 0) return
|
|
138
|
-
const { registerProxyExtensions } = await import('./proxy')
|
|
139
|
-
registerProxyExtensions(config)
|
|
140
|
-
await getProxyExtensions().validateFiles(config)
|
|
137
|
+
if (findProxyFiles(config, NEXT_PROXY_NAMES).length === 0) return
|
|
138
|
+
const { registerProxyExtensions } = await import('./proxy')
|
|
139
|
+
registerProxyExtensions(config)
|
|
140
|
+
await getProxyExtensions().validateFiles(config)
|
|
141
141
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
// fattest part of the full tier. Kept behind one dynamic import so registerCompatExtensions can skip
|
|
5
5
|
// loading them entirely when it is only being asked to serve; the call order is unchanged either way.
|
|
6
6
|
|
|
7
|
-
export { registerBuildCompatExtensions } from './build'
|
|
8
|
-
export { registerTypedRoutesExtensions } from './typed-routes'
|
|
9
|
-
export { registerValidationExtensions } from './validation'
|
|
10
|
-
export { registerMiddlewareExtensions } from './middleware'
|
|
11
|
-
export { registerExportExtensions } from './export'
|
|
7
|
+
export { registerBuildCompatExtensions } from './build'
|
|
8
|
+
export { registerTypedRoutesExtensions } from './typed-routes'
|
|
9
|
+
export { registerValidationExtensions } from './validation'
|
|
10
|
+
export { registerMiddlewareExtensions } from './middleware'
|
|
11
|
+
export { registerExportExtensions } from './export'
|
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
|
2
|
-
import path from 'node:path'
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
3
|
import {
|
|
4
4
|
registerBuildCompleteHooks,
|
|
5
5
|
setBuildCompatExtensions,
|
|
6
6
|
setCompatModeExtensions,
|
|
7
|
-
} from '../../extensions'
|
|
8
|
-
import type { BuildManifest } from '../../types'
|
|
9
|
-
import type { ResolvedConfig } from '../../config'
|
|
10
|
-
import { nextCompatEnabled, reactCompatEnabled, reactCompilerOptions } from '../
|
|
11
|
-
import { warnNextMetadataBuildIssues } from '../metadata'
|
|
12
|
-
import { getNextConfig } from '../next/config-loader'
|
|
13
|
-
import { preferredRegionForRoute } from '../next/preferred-region'
|
|
14
|
-
import { deploymentId } from '../bundler/config'
|
|
15
|
-
import { aliasGenerateStaticParams } from '../static-params'
|
|
16
|
-
import { takeCacheLifeStash } from '../cache/use-cache'
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
} from '../../extensions'
|
|
8
|
+
import type { BuildManifest } from '../../types'
|
|
9
|
+
import type { ResolvedConfig } from '../../config'
|
|
10
|
+
import { nextCompatEnabled, reactCompatEnabled, reactCompilerOptions } from '../aliases'
|
|
11
|
+
import { warnNextMetadataBuildIssues } from '../metadata'
|
|
12
|
+
import { getNextConfig } from '../next/config-loader'
|
|
13
|
+
import { preferredRegionForRoute } from '../next/preferred-region'
|
|
14
|
+
import { deploymentId } from '../bundler/config'
|
|
15
|
+
import { aliasGenerateStaticParams } from '../static-params'
|
|
16
|
+
import { takeCacheLifeStash } from '../cache/use-cache'
|
|
17
|
+
import {
|
|
18
|
+
varyNamesFor,
|
|
19
|
+
withVaryParamsTracking,
|
|
20
|
+
type ResponseVaryParams,
|
|
21
|
+
} from '../segment/vary-params'
|
|
22
|
+
import { takeFontHeaderPreloads, fontLinkHeaderValue } from '../next/font/runtime'
|
|
23
|
+
import { takeResourceHintHeader } from '../next/resource-hints'
|
|
20
24
|
import {
|
|
21
25
|
bodySegmentFile,
|
|
22
26
|
buildRootTreePrefetch,
|
|
@@ -27,41 +31,38 @@ import {
|
|
|
27
31
|
segmentDir,
|
|
28
32
|
segmentMetaFile,
|
|
29
33
|
treeSegmentFile,
|
|
30
|
-
} from '../segment/tree'
|
|
31
|
-
import { runBuildCompleteAdapter } from '../
|
|
34
|
+
} from '../segment/tree'
|
|
35
|
+
import { runBuildCompleteAdapter } from '../export/build-complete'
|
|
32
36
|
|
|
33
37
|
export function registerBuildCompatExtensions(): void {
|
|
34
38
|
registerBuildCompleteHooks(({ config, manifest }) =>
|
|
35
39
|
writeFunctionsConfigManifest(config.outPath, manifest),
|
|
36
|
-
)
|
|
37
|
-
registerBuildCompleteHooks(({ config }) => writeRequiredServerFilesManifest(config))
|
|
38
|
-
registerBuildCompleteHooks(({ config }) => writeTraceBuildFile(config))
|
|
40
|
+
)
|
|
41
|
+
registerBuildCompleteHooks(({ config }) => writeRequiredServerFilesManifest(config))
|
|
42
|
+
registerBuildCompleteHooks(({ config }) => writeTraceBuildFile(config))
|
|
39
43
|
// Next's `adapterPath` / NEXT_ADAPTER_PATH deployment-adapter hook.
|
|
40
|
-
registerBuildCompleteHooks(({ config, manifest }) =>
|
|
41
|
-
runBuildCompleteAdapter(config, manifest),
|
|
42
|
-
);
|
|
44
|
+
registerBuildCompleteHooks(({ config, manifest }) => runBuildCompleteAdapter(config, manifest))
|
|
43
45
|
setCompatModeExtensions({
|
|
44
46
|
nextEnabled: nextCompatEnabled,
|
|
45
47
|
reactEnabled: reactCompatEnabled,
|
|
46
48
|
reactCompilerOptions,
|
|
47
|
-
})
|
|
49
|
+
})
|
|
48
50
|
setBuildCompatExtensions({
|
|
49
51
|
warnMetadataIssues: ({ appPath, routes, staticMetadataFiles }) =>
|
|
50
52
|
warnNextMetadataBuildIssues(appPath, routes, staticMetadataFiles),
|
|
51
53
|
nextOutputExport: () => getNextConfig().output === 'export',
|
|
52
54
|
nextOutputMode: () => {
|
|
53
|
-
const output = getNextConfig().output
|
|
54
|
-
return output === 'export' || output === 'standalone' ? output : undefined
|
|
55
|
+
const output = getNextConfig().output
|
|
56
|
+
return output === 'export' || output === 'standalone' ? output : undefined
|
|
55
57
|
},
|
|
56
58
|
nextScriptWorkersEnabled: () => {
|
|
57
59
|
const experimental = getNextConfig().experimental as
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return experimental?.nextScriptWorkers === true;
|
|
60
|
+
{ nextScriptWorkers?: boolean } | undefined
|
|
61
|
+
return experimental?.nextScriptWorkers === true
|
|
61
62
|
},
|
|
62
63
|
defaultExpireTimeSeconds: () => {
|
|
63
|
-
const expireTime = getNextConfig().expireTime
|
|
64
|
-
return typeof expireTime === 'number' ? expireTime : undefined
|
|
64
|
+
const expireTime = getNextConfig().expireTime
|
|
65
|
+
return typeof expireTime === 'number' ? expireTime : undefined
|
|
65
66
|
},
|
|
66
67
|
withVaryParamsTracking,
|
|
67
68
|
varyNamesFor: (vary, kind) => varyNamesFor(vary as ResponseVaryParams, kind),
|
|
@@ -71,11 +72,11 @@ export function registerBuildCompatExtensions(): void {
|
|
|
71
72
|
// preload()/preconnect() hints recorded on the prerender's work unit
|
|
72
73
|
// (capped by reactMaxHeadersLength). Static HITs replay it from the
|
|
73
74
|
// manifest since no response finalizer runs for them.
|
|
74
|
-
const fontValues = takeFontHeaderPreloads().map(fontLinkHeaderValue)
|
|
75
|
-
const hintValue = takeResourceHintHeader()
|
|
76
|
-
const values = [...fontValues, ...(hintValue ? [hintValue] : [])]
|
|
77
|
-
if (values.length === 0) return undefined
|
|
78
|
-
return values.join(', ')
|
|
75
|
+
const fontValues = takeFontHeaderPreloads().map(fontLinkHeaderValue)
|
|
76
|
+
const hintValue = takeResourceHintHeader()
|
|
77
|
+
const values = [...fontValues, ...(hintValue ? [hintValue] : [])]
|
|
78
|
+
if (values.length === 0) return undefined
|
|
79
|
+
return values.join(', ')
|
|
79
80
|
},
|
|
80
81
|
normalizeStaticParamsModule: aliasGenerateStaticParams,
|
|
81
82
|
defaultDynamicStaleTimeSeconds: DEFAULT_DYNAMIC_STALE_TIME_SECONDS,
|
|
@@ -87,12 +88,12 @@ export function registerBuildCompatExtensions(): void {
|
|
|
87
88
|
treeSegmentFile,
|
|
88
89
|
bodySegmentFile,
|
|
89
90
|
segmentMetaFile,
|
|
90
|
-
})
|
|
91
|
+
})
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
interface FunctionsConfigManifest {
|
|
94
|
-
version: number
|
|
95
|
-
functions: Record<string, Record<string, unknown
|
|
95
|
+
version: number
|
|
96
|
+
functions: Record<string, Record<string, unknown>>
|
|
96
97
|
}
|
|
97
98
|
|
|
98
99
|
/**
|
|
@@ -103,28 +104,28 @@ interface FunctionsConfigManifest {
|
|
|
103
104
|
* nothing that probes it changes behavior.
|
|
104
105
|
*/
|
|
105
106
|
async function writeRequiredServerFilesManifest(config: ResolvedConfig): Promise<void> {
|
|
106
|
-
if (!nextCompatEnabled(config)) return
|
|
107
|
-
const id = deploymentId()
|
|
108
|
-
if (!id) return
|
|
109
|
-
const outDir = path.join(config.root, '.next')
|
|
110
|
-
await mkdir(outDir, { recursive: true })
|
|
107
|
+
if (!nextCompatEnabled(config)) return
|
|
108
|
+
const id = deploymentId()
|
|
109
|
+
if (!id) return
|
|
110
|
+
const outDir = path.join(config.root, '.next')
|
|
111
|
+
await mkdir(outDir, { recursive: true })
|
|
111
112
|
await writeFile(
|
|
112
113
|
path.join(outDir, 'required-server-files.json'),
|
|
113
114
|
JSON.stringify({ version: 1, config: { deploymentId: id } }, null, 2),
|
|
114
|
-
)
|
|
115
|
+
)
|
|
115
116
|
}
|
|
116
117
|
|
|
117
118
|
// Anchored on globalThis so the timestamp survives the module being loaded
|
|
118
119
|
// twice (built copy vs. original) during a single build process.
|
|
119
|
-
const traceBuildGlobal = globalThis as unknown as { __pnextBuildStartedAt?: number }
|
|
120
|
-
traceBuildGlobal.__pnextBuildStartedAt ??= performance.now()
|
|
120
|
+
const traceBuildGlobal = globalThis as unknown as { __pnextBuildStartedAt?: number }
|
|
121
|
+
traceBuildGlobal.__pnextBuildStartedAt ??= performance.now()
|
|
121
122
|
|
|
122
123
|
interface TraceEvent {
|
|
123
|
-
name: string
|
|
124
|
-
id: number
|
|
125
|
-
traceId: string
|
|
126
|
-
duration: number
|
|
127
|
-
parentId?: number
|
|
124
|
+
name: string
|
|
125
|
+
id: number
|
|
126
|
+
traceId: string
|
|
127
|
+
duration: number
|
|
128
|
+
parentId?: number
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
/**
|
|
@@ -134,9 +135,12 @@ interface TraceEvent {
|
|
|
134
135
|
* so real timings are approximated rather than instrumented per-phase.
|
|
135
136
|
*/
|
|
136
137
|
async function writeTraceBuildFile(config: ResolvedConfig): Promise<void> {
|
|
137
|
-
if (!nextCompatEnabled(config)) return
|
|
138
|
-
const traceId = randomTraceId()
|
|
139
|
-
const totalDuration = Math.max(
|
|
138
|
+
if (!nextCompatEnabled(config)) return
|
|
139
|
+
const traceId = randomTraceId()
|
|
140
|
+
const totalDuration = Math.max(
|
|
141
|
+
1,
|
|
142
|
+
performance.now() - (traceBuildGlobal.__pnextBuildStartedAt ?? 0),
|
|
143
|
+
)
|
|
140
144
|
const events: TraceEvent[] = [
|
|
141
145
|
{ name: 'next-build', id: 1, traceId, duration: totalDuration },
|
|
142
146
|
{ name: 'run-webpack', id: 2, parentId: 1, traceId, duration: totalDuration * 0.4 },
|
|
@@ -145,38 +149,38 @@ async function writeTraceBuildFile(config: ResolvedConfig): Promise<void> {
|
|
|
145
149
|
{ name: 'static-generation', id: 5, parentId: 1, traceId, duration: totalDuration * 0.2 },
|
|
146
150
|
{ name: 'collect-build-traces', id: 6, parentId: 1, traceId, duration: totalDuration * 0.05 },
|
|
147
151
|
{ name: 'telemetry-flush', id: 7, parentId: 1, traceId, duration: 1 },
|
|
148
|
-
]
|
|
149
|
-
const outDir = path.join(config.root, '.next')
|
|
150
|
-
await mkdir(outDir, { recursive: true })
|
|
151
|
-
await writeFile(path.join(outDir, 'trace-build'), `${JSON.stringify(events)}\n`)
|
|
152
|
+
]
|
|
153
|
+
const outDir = path.join(config.root, '.next')
|
|
154
|
+
await mkdir(outDir, { recursive: true })
|
|
155
|
+
await writeFile(path.join(outDir, 'trace-build'), `${JSON.stringify(events)}\n`)
|
|
152
156
|
}
|
|
153
157
|
|
|
154
158
|
function randomTraceId(): string {
|
|
155
|
-
return Array.from({ length: 16 }, () => Math.floor(Math.random() * 16).toString(16)).join('')
|
|
159
|
+
return Array.from({ length: 16 }, () => Math.floor(Math.random() * 16).toString(16)).join('')
|
|
156
160
|
}
|
|
157
161
|
|
|
158
162
|
async function writeFunctionsConfigManifest(
|
|
159
163
|
outPath: string,
|
|
160
164
|
manifest: BuildManifest,
|
|
161
165
|
): Promise<void> {
|
|
162
|
-
const routes = manifest.routes.filter(route => route.maxDuration !== undefined)
|
|
163
|
-
if (routes.length === 0) return
|
|
166
|
+
const routes = manifest.routes.filter(route => route.maxDuration !== undefined)
|
|
167
|
+
if (routes.length === 0) return
|
|
164
168
|
|
|
165
|
-
const file = path.join(outPath, 'server', 'functions-config-manifest.json')
|
|
166
|
-
let current: FunctionsConfigManifest = { version: 1, functions: {} }
|
|
169
|
+
const file = path.join(outPath, 'server', 'functions-config-manifest.json')
|
|
170
|
+
let current: FunctionsConfigManifest = { version: 1, functions: {} }
|
|
167
171
|
try {
|
|
168
|
-
current = JSON.parse(await readFile(file, 'utf8')) as FunctionsConfigManifest
|
|
172
|
+
current = JSON.parse(await readFile(file, 'utf8')) as FunctionsConfigManifest
|
|
169
173
|
} catch {
|
|
170
|
-
current = { version: 1, functions: {} }
|
|
174
|
+
current = { version: 1, functions: {} }
|
|
171
175
|
}
|
|
172
176
|
for (const route of routes) {
|
|
173
|
-
const regions = preferredRegionForRoute(route)
|
|
177
|
+
const regions = preferredRegionForRoute(route)
|
|
174
178
|
current.functions[route.route || '/'] = {
|
|
175
179
|
...(current.functions[route.route || '/'] ?? {}),
|
|
176
180
|
maxDuration: route.maxDuration,
|
|
177
181
|
...(regions ? { regions } : {}),
|
|
178
|
-
}
|
|
182
|
+
}
|
|
179
183
|
}
|
|
180
|
-
await mkdir(path.dirname(file), { recursive: true })
|
|
181
|
-
await writeFile(file, `${JSON.stringify(current, null, 2)}\n`)
|
|
184
|
+
await mkdir(path.dirname(file), { recursive: true })
|
|
185
|
+
await writeFile(file, `${JSON.stringify(current, null, 2)}\n`)
|
|
182
186
|
}
|