@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,215 @@
|
|
|
1
|
+
import type { JSX } from 'preact';
|
|
2
|
+
import { useEffect } from 'preact/compat';
|
|
3
|
+
import { registerResourceHint } from '../../render/resource-hints';
|
|
4
|
+
|
|
5
|
+
export type ScriptStrategy = 'beforeInteractive' | 'afterInteractive' | 'lazyOnload' | 'worker';
|
|
6
|
+
|
|
7
|
+
export type ScriptProps = Omit<JSX.ScriptHTMLAttributes<HTMLScriptElement>, 'src'> & {
|
|
8
|
+
src?: string;
|
|
9
|
+
strategy?: ScriptStrategy;
|
|
10
|
+
onLoad?: (event: Event) => void;
|
|
11
|
+
onReady?: () => void;
|
|
12
|
+
onError?: (event: Event) => void;
|
|
13
|
+
children?: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Client runtime for next/script. Mirrors Next's imperative loader: scripts are created and appended to
|
|
18
|
+
* the document rather than rendered inline so that load ordering, onLoad/onReady callbacks and -
|
|
19
|
+
* crucially - deduplication all behave like the real thing.
|
|
20
|
+
*
|
|
21
|
+
* `LoadCache` is keyed by `id ?? src` (Next's cache key), so two `<Script id="x">` execute the
|
|
22
|
+
* underlying script exactly once, and the cache survives soft navigations so the same src/id is never
|
|
23
|
+
* re-run.
|
|
24
|
+
*/
|
|
25
|
+
const LoadCache = new Set<string>();
|
|
26
|
+
const ScriptCache = new Map<string, Promise<void>>();
|
|
27
|
+
|
|
28
|
+
const SKIP_PROPS = new Set([
|
|
29
|
+
'src',
|
|
30
|
+
'strategy',
|
|
31
|
+
'onLoad',
|
|
32
|
+
'onReady',
|
|
33
|
+
'onError',
|
|
34
|
+
'children',
|
|
35
|
+
'dangerouslySetInnerHTML',
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
function applyAttrs(el: HTMLScriptElement, props: ScriptProps) {
|
|
39
|
+
for (const [key, value] of Object.entries(props)) {
|
|
40
|
+
if (SKIP_PROPS.has(key) || key.startsWith('on')) continue;
|
|
41
|
+
if (value == null || value === false || typeof value === 'function') continue;
|
|
42
|
+
const name = key === 'className' ? 'class' : key === 'htmlFor' ? 'for' : key.toLowerCase();
|
|
43
|
+
el.setAttribute(name, value === true ? '' : String(value));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function inlineHtml(props: ScriptProps): string | undefined {
|
|
48
|
+
if (typeof props.children === 'string') return props.children;
|
|
49
|
+
const dangerous = props.dangerouslySetInnerHTML as { __html?: unknown } | undefined;
|
|
50
|
+
if (dangerous && typeof dangerous.__html === 'string') return dangerous.__html;
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Imperatively load/execute a script, deduping on `id ?? src`. `onReady` fires *after* the script has
|
|
56
|
+
* finished loading (for src) or executing (inline) - never on mere ref-mount - and re-fires for a cached
|
|
57
|
+
* script without re-running it, matching Next.
|
|
58
|
+
*/
|
|
59
|
+
function loadScript(props: ScriptProps): void {
|
|
60
|
+
const { src, id, onLoad, onReady, onError } = props;
|
|
61
|
+
const cacheKey = (typeof id === 'string' && id) || src;
|
|
62
|
+
|
|
63
|
+
if (cacheKey && LoadCache.has(cacheKey)) {
|
|
64
|
+
const pending = ScriptCache.get(cacheKey);
|
|
65
|
+
if (pending) pending.then(() => onReady?.()).catch(() => undefined);
|
|
66
|
+
else onReady?.();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (cacheKey) LoadCache.add(cacheKey);
|
|
70
|
+
|
|
71
|
+
const el = document.createElement('script');
|
|
72
|
+
applyAttrs(el, props);
|
|
73
|
+
if (typeof id === 'string') el.id = id;
|
|
74
|
+
|
|
75
|
+
if (src) {
|
|
76
|
+
const promise = new Promise<void>((resolve, reject) => {
|
|
77
|
+
el.addEventListener('load', event => {
|
|
78
|
+
onLoad?.(event);
|
|
79
|
+
resolve();
|
|
80
|
+
});
|
|
81
|
+
el.addEventListener('error', event => {
|
|
82
|
+
onError?.(event);
|
|
83
|
+
reject(event instanceof Error ? event : new Error('next/script failed to load'));
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
if (cacheKey) ScriptCache.set(cacheKey, promise);
|
|
87
|
+
promise.then(() => onReady?.()).catch(() => undefined);
|
|
88
|
+
el.src = src;
|
|
89
|
+
// Append the executing tag only once the resource is warm (Next appends from its mount effect AFTER
|
|
90
|
+
// ReactDOM.preload has resolved the src). Then the tag's own fetch is a cache hit and it executes
|
|
91
|
+
// within a tick of entering the DOM, so a consumer that reads the script's side effects right after
|
|
92
|
+
// observing the tag sees the executed state. Appending eagerly makes the tag observable while the
|
|
93
|
+
// script is still downloading, so that read races ahead of execution. The document already carries an
|
|
94
|
+
// SSR preload link for this src, so the download is already in flight regardless of when hydration
|
|
95
|
+
// runs - this warm-up link just yields a load event to gate on and dedupes onto that same fetch.
|
|
96
|
+
warmThenAppend(el, src, props);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const html = inlineHtml(props);
|
|
101
|
+
if (html !== undefined) {
|
|
102
|
+
el.innerHTML = html;
|
|
103
|
+
// A script element created via createElement + appended to the document
|
|
104
|
+
// executes synchronously here, so onReady is safe to fire immediately after.
|
|
105
|
+
document.body.appendChild(el);
|
|
106
|
+
onReady?.();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Append `el` (a `<script src>`) only after `src` is downloaded, so the tag is
|
|
112
|
+
* observable in the DOM only once its execution is a cache hit (a tick away).
|
|
113
|
+
* Mirrors Next's preload-then-append ordering. A throwaway `<link rel=preload>`
|
|
114
|
+
* gives us the load signal and dedupes onto the resource's existing fetch (the
|
|
115
|
+
* SSR preload / the script's own fetch); on any failure we append anyway so a
|
|
116
|
+
* blocked-preload environment still runs the script.
|
|
117
|
+
*/
|
|
118
|
+
function warmThenAppend(el: HTMLScriptElement, src: string, props: ScriptProps): void {
|
|
119
|
+
const append = () => {
|
|
120
|
+
if (el.isConnected) return;
|
|
121
|
+
document.body.appendChild(el);
|
|
122
|
+
};
|
|
123
|
+
let warm: HTMLLinkElement;
|
|
124
|
+
try {
|
|
125
|
+
warm = document.createElement('link');
|
|
126
|
+
warm.rel = 'preload';
|
|
127
|
+
warm.as = 'script';
|
|
128
|
+
warm.href = src;
|
|
129
|
+
if (typeof props.crossOrigin === 'string') warm.crossOrigin = props.crossOrigin;
|
|
130
|
+
if (typeof props.nonce === 'string') warm.nonce = props.nonce;
|
|
131
|
+
} catch {
|
|
132
|
+
append();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const done = () => {
|
|
136
|
+
warm.remove();
|
|
137
|
+
append();
|
|
138
|
+
};
|
|
139
|
+
warm.addEventListener('load', done, { once: true });
|
|
140
|
+
warm.addEventListener('error', done, { once: true });
|
|
141
|
+
document.head.appendChild(warm);
|
|
142
|
+
// Safety net: never leave the script unappended if the link never settles
|
|
143
|
+
// (some browsers do not fire load for an already-cached preload).
|
|
144
|
+
setTimeout(append, 1500);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export default function Script(props: ScriptProps) {
|
|
148
|
+
const strategy = props.strategy ?? 'afterInteractive';
|
|
149
|
+
|
|
150
|
+
// Next's app-router Script preloads an EXTERNAL before/afterInteractive script while the document
|
|
151
|
+
// renders (ReactDOM.preload) and only appends the executing tag from its mount effect. Without the
|
|
152
|
+
// preload the browser starts fetching only once the effect runs, so third-party code the page is
|
|
153
|
+
// expected to have already run lands too late. registerResourceHint is server-only, so this is exactly
|
|
154
|
+
// the SSR-side half of Next's behavior; the mount effect below still owns execution and dedup.
|
|
155
|
+
// lazyOnload is deliberately excluded - Next does not preload something fetched minutes later either.
|
|
156
|
+
if (
|
|
157
|
+
(!process.browser && typeof window === 'undefined') &&
|
|
158
|
+
props.src &&
|
|
159
|
+
(strategy === 'afterInteractive' || strategy === 'beforeInteractive')
|
|
160
|
+
) {
|
|
161
|
+
registerResourceHint({
|
|
162
|
+
rel: 'preload',
|
|
163
|
+
as: 'script',
|
|
164
|
+
url: props.src,
|
|
165
|
+
...(typeof props.nonce === 'string' || typeof props.crossOrigin === 'string'
|
|
166
|
+
? {
|
|
167
|
+
attributes: {
|
|
168
|
+
...(typeof props.nonce === 'string' ? { nonce: props.nonce } : {}),
|
|
169
|
+
...(typeof props.crossOrigin === 'string' ? { crossorigin: props.crossOrigin } : {}),
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
: {}),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
useEffect(() => {
|
|
177
|
+
if (strategy === 'worker') return;
|
|
178
|
+
|
|
179
|
+
if (strategy === 'lazyOnload') {
|
|
180
|
+
let cancelled = false;
|
|
181
|
+
const run = () => {
|
|
182
|
+
if (!cancelled) loadScript(props);
|
|
183
|
+
};
|
|
184
|
+
if (typeof requestIdleCallback === 'function') {
|
|
185
|
+
const handle = requestIdleCallback(run);
|
|
186
|
+
return () => {
|
|
187
|
+
cancelled = true;
|
|
188
|
+
if (typeof cancelIdleCallback === 'function') cancelIdleCallback(handle);
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const timer = setTimeout(run, 1);
|
|
192
|
+
return () => {
|
|
193
|
+
cancelled = true;
|
|
194
|
+
clearTimeout(timer);
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// afterInteractive + beforeInteractive: load as soon as the island mounts.
|
|
199
|
+
loadScript(props);
|
|
200
|
+
return undefined;
|
|
201
|
+
}, [strategy, props.src, props.id]);
|
|
202
|
+
|
|
203
|
+
if (strategy === 'worker') {
|
|
204
|
+
const { onLoad: _onLoad, onReady: _onReady, onError: _onError, children, strategy: _s, ...rest } =
|
|
205
|
+
props;
|
|
206
|
+
const html = typeof children === 'string' ? children : inlineHtml(props);
|
|
207
|
+
const inline =
|
|
208
|
+
html !== undefined ? { dangerouslySetInnerHTML: { __html: html } } : {};
|
|
209
|
+
return <script {...rest} type="text/partytown" data-nscript="worker" {...inline} />;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export { Script };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Client-safe `next/server` variant (COMPAT).
|
|
2
|
+
//
|
|
3
|
+
// The server entry imports request-scope and prerender machinery that all pull in `node:async_hooks`,
|
|
4
|
+
// which esbuild cannot resolve for a browser bundle. A `'use client'` component may still import
|
|
5
|
+
// `next/server`, so - mirroring the next/cache and next/navigation client/server alias split - the
|
|
6
|
+
// client target aliases `next/server` here. The request-scope APIs are server-only in Next anyway;
|
|
7
|
+
// client-side they degrade to inert stubs, since the real dynamic-marking happens during SSR and
|
|
8
|
+
// control-flow like redirect/notFound is driven by the client error runtime after hydration.
|
|
9
|
+
|
|
10
|
+
export { NextRequest, NextResponse } from '../../api/server';
|
|
11
|
+
export type { NextRequestGeo } from '../../api/server';
|
|
12
|
+
export type { NextFetchEvent } from '../../types';
|
|
13
|
+
export type { ProxyConfig } from '../../proxy';
|
|
14
|
+
export { URLPattern, userAgent, userAgentFromString } from './user-agent';
|
|
15
|
+
export type { UserAgent } from './user-agent';
|
|
16
|
+
|
|
17
|
+
/** Browser-safe placeholder; OG rendering only runs on the server. */
|
|
18
|
+
export class ImageResponse extends Response {
|
|
19
|
+
constructor(_element: unknown, options: ResponseInit = {}) {
|
|
20
|
+
super(null, options);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type AfterTask<T> = Promise<T> | (() => T | Promise<T>);
|
|
25
|
+
|
|
26
|
+
/** Client stub: dynamic marking is a server concern; resolve immediately. */
|
|
27
|
+
export function connection(): Promise<Record<never, never>> {
|
|
28
|
+
return Promise.resolve({});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Client stub: `after()` callbacks only run server-side; no-op in the browser. */
|
|
32
|
+
export function after<T>(_task: AfterTask<T>): void {
|
|
33
|
+
// intentionally empty
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Client stub: IO postpone only fires during a server prerender. */
|
|
37
|
+
export function io(): Promise<void> {
|
|
38
|
+
return Promise.resolve();
|
|
39
|
+
}
|