@wular/pnext 0.0.4 → 0.0.7
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 +22 -16
- package/bin/pnext +6 -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 +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- 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 +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -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 +802 -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 +32 -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 +2022 -1995
- package/src/{api → client}/router/types.ts +98 -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 -1897
- 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 +86 -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 +2087 -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} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- 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 +87 -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 +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +954 -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 +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -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/reference/overview.md +0 -35
- 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
package/src/utils/ansi.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
function color(open: string, close: string) {
|
|
2
|
-
return (value: string) => (process.stdout.isTTY ? `${open}${value}${close}` : value)
|
|
2
|
+
return (value: string) => (process.stdout.isTTY ? `${open}${value}${close}` : value)
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
/** Mid-gray for subordinate text. Readable on both light and dark terminals. */
|
|
6
|
-
export const dim = color('\x1b[38;5;244m', '\x1b[39m')
|
|
7
|
-
export const bold = color('\x1b[1m', '\x1b[22m')
|
|
8
|
-
export const cyan = color('\x1b[36m', '\x1b[39m')
|
|
9
|
-
export const green = color('\x1b[32m', '\x1b[39m')
|
|
6
|
+
export const dim = color('\x1b[38;5;244m', '\x1b[39m')
|
|
7
|
+
export const bold = color('\x1b[1m', '\x1b[22m')
|
|
8
|
+
export const cyan = color('\x1b[36m', '\x1b[39m')
|
|
9
|
+
export const green = color('\x1b[32m', '\x1b[39m')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function escapeRegex(value: string) {
|
|
2
|
-
return value.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
|
|
2
|
+
return value.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -11,25 +11,28 @@ export function specifierSniffTokens(keys: Iterable<string>): string[] {
|
|
|
11
11
|
const heads = [
|
|
12
12
|
...new Set(
|
|
13
13
|
[...keys].map(key => {
|
|
14
|
-
const head = key
|
|
15
|
-
|
|
14
|
+
const head = key
|
|
15
|
+
.split('/')
|
|
16
|
+
.slice(0, key.startsWith('@') ? 2 : 1)
|
|
17
|
+
.join('/')
|
|
18
|
+
return head.replace(/\*.*$/, '')
|
|
16
19
|
}),
|
|
17
20
|
),
|
|
18
|
-
]
|
|
19
|
-
return heads.filter(head => !heads.some(other => other !== head && head.startsWith(other)))
|
|
21
|
+
]
|
|
22
|
+
return heads.filter(head => !heads.some(other => other !== head && head.startsWith(other)))
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
export function uniqueIdentifier(source: string, base: string, ...used: string[]) {
|
|
23
|
-
const usedNames = new Set(used)
|
|
24
|
-
let name = base
|
|
25
|
-
let index = 0
|
|
26
|
+
const usedNames = new Set(used)
|
|
27
|
+
let name = base
|
|
28
|
+
let index = 0
|
|
26
29
|
while (source.includes(name) || usedNames.has(name)) {
|
|
27
|
-
index += 1
|
|
28
|
-
name = `${base}${index}
|
|
30
|
+
index += 1
|
|
31
|
+
name = `${base}${index}`
|
|
29
32
|
}
|
|
30
|
-
return name
|
|
33
|
+
return name
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
export function isIdentifier(value: string) {
|
|
34
|
-
return /^[A-Za-z_$][\w$]*$/.test(value)
|
|
37
|
+
return /^[A-Za-z_$][\w$]*$/.test(value)
|
|
35
38
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
1
|
+
import path from 'node:path'
|
|
2
2
|
|
|
3
3
|
const contentTypes: Record<string, string> = {
|
|
4
4
|
'.avif': 'image/avif',
|
|
@@ -24,8 +24,8 @@ const contentTypes: Record<string, string> = {
|
|
|
24
24
|
'.webp': 'image/webp',
|
|
25
25
|
'.woff': 'font/woff',
|
|
26
26
|
'.woff2': 'font/woff2',
|
|
27
|
-
}
|
|
27
|
+
}
|
|
28
28
|
|
|
29
29
|
export function contentType(file: string): string {
|
|
30
|
-
return contentTypes[path.extname(file).toLowerCase()] ?? 'application/octet-stream'
|
|
30
|
+
return contentTypes[path.extname(file).toLowerCase()] ?? 'application/octet-stream'
|
|
31
31
|
}
|
package/src/utils/decode.ts
CHANGED
package/src/utils/dev-profile.ts
CHANGED
|
@@ -3,29 +3,29 @@
|
|
|
3
3
|
* straight to stdout inflated every enclosing span it sat inside - the measurement changed what it
|
|
4
4
|
* measured. Lines accumulate here and the request handler flushes them in one write.
|
|
5
5
|
*/
|
|
6
|
-
const SINK = Symbol.for('pnext.devProfileSink')
|
|
6
|
+
const SINK = Symbol.for('pnext.devProfileSink')
|
|
7
7
|
|
|
8
8
|
function sink(): string[] {
|
|
9
|
-
const store = globalThis as Record<PropertyKey, unknown
|
|
10
|
-
return (store[SINK] ??= []) as string[]
|
|
9
|
+
const store = globalThis as Record<PropertyKey, unknown>
|
|
10
|
+
return (store[SINK] ??= []) as string[]
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export function recordDevProfileLine(line: string) {
|
|
14
|
-
sink().push(line)
|
|
14
|
+
sink().push(line)
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/** Emit and clear everything buffered so far (one write per request). */
|
|
18
18
|
export function flushDevProfileLines() {
|
|
19
|
-
const lines = sink()
|
|
20
|
-
if (lines.length === 0) return
|
|
21
|
-
const out = lines.join('\n')
|
|
22
|
-
lines.length = 0
|
|
23
|
-
console.log(out)
|
|
19
|
+
const lines = sink()
|
|
20
|
+
if (lines.length === 0) return
|
|
21
|
+
const out = lines.join('\n')
|
|
22
|
+
lines.length = 0
|
|
23
|
+
console.log(out)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export function formatProfileDuration(durationMs: number) {
|
|
27
|
-
const ms = Math.max(0, durationMs)
|
|
28
|
-
if (ms < 10) return `${ms.toFixed(2)}ms
|
|
29
|
-
if (ms < 1000) return `${ms.toFixed(1)}ms
|
|
30
|
-
return `${(ms / 1000).toFixed(ms < 10000 ? 2 : 1)}s
|
|
27
|
+
const ms = Math.max(0, durationMs)
|
|
28
|
+
if (ms < 10) return `${ms.toFixed(2)}ms`
|
|
29
|
+
if (ms < 1000) return `${ms.toFixed(1)}ms`
|
|
30
|
+
return `${(ms / 1000).toFixed(ms < 10000 ? 2 : 1)}s`
|
|
31
31
|
}
|
package/src/utils/error-log.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// without a WeakSet keyed to a work unit - an error thrown outside any work-unit scope is still deduped. A
|
|
7
7
|
// non-Error throw cannot carry the tag; those are always logged.
|
|
8
8
|
|
|
9
|
-
const ERROR_LOGGED = Symbol.for('pnext.errorLogged')
|
|
9
|
+
const ERROR_LOGGED = Symbol.for('pnext.errorLogged')
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Mark `error` as logged. Returns true when this call was the FIRST to mark it (the caller should log), false
|
|
@@ -15,15 +15,15 @@ const ERROR_LOGGED = Symbol.for('pnext.errorLogged');
|
|
|
15
15
|
*/
|
|
16
16
|
export function markErrorLogged(error: unknown): boolean {
|
|
17
17
|
if (error === null || (typeof error !== 'object' && typeof error !== 'function')) {
|
|
18
|
-
return true
|
|
18
|
+
return true
|
|
19
19
|
}
|
|
20
|
-
const holder = error as Record<symbol, unknown
|
|
21
|
-
if (holder[ERROR_LOGGED]) return false
|
|
20
|
+
const holder = error as Record<symbol, unknown>
|
|
21
|
+
if (holder[ERROR_LOGGED]) return false
|
|
22
22
|
Object.defineProperty(error, ERROR_LOGGED, {
|
|
23
23
|
value: true,
|
|
24
24
|
enumerable: false,
|
|
25
25
|
configurable: true,
|
|
26
26
|
writable: true,
|
|
27
|
-
})
|
|
28
|
-
return true
|
|
27
|
+
})
|
|
28
|
+
return true
|
|
29
29
|
}
|
package/src/utils/esbuild.ts
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
// Lazy esbuild facade: importing 'esbuild' eagerly costs ~2.7 MB RSS and its
|
|
2
2
|
// first build()/transform() call spawns a resident ~10-45 MB service child, so
|
|
3
3
|
// the library must not load until something actually compiles.
|
|
4
|
-
import type * as Esbuild from 'esbuild'
|
|
5
|
-
import { loadNative } from './native-require'
|
|
4
|
+
import type * as Esbuild from 'esbuild'
|
|
5
|
+
import { loadNative } from './native-require'
|
|
6
6
|
|
|
7
|
-
let esbuild: typeof Esbuild | undefined
|
|
7
|
+
let esbuild: typeof Esbuild | undefined
|
|
8
8
|
|
|
9
9
|
function load(): typeof Esbuild {
|
|
10
10
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
-
return (esbuild ??= loadNative(() => require('esbuild') as typeof Esbuild))
|
|
11
|
+
return (esbuild ??= loadNative(() => require('esbuild') as typeof Esbuild))
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
// In-flight compiles, so a stop() never kills the service child out from under
|
|
15
15
|
// one: esbuild drops the pending call's promise and it never settles.
|
|
16
|
-
let inFlight = 0
|
|
17
|
-
let stopWhenIdle = false
|
|
16
|
+
let inFlight = 0
|
|
17
|
+
let stopWhenIdle = false
|
|
18
18
|
|
|
19
19
|
function track<T>(promise: Promise<T>): Promise<T> {
|
|
20
|
-
inFlight += 1
|
|
20
|
+
inFlight += 1
|
|
21
21
|
return promise.finally(() => {
|
|
22
|
-
inFlight -= 1
|
|
22
|
+
inFlight -= 1
|
|
23
23
|
if (inFlight === 0 && stopWhenIdle) {
|
|
24
|
-
stopWhenIdle = false
|
|
25
|
-
void esbuild?.stop()
|
|
24
|
+
stopWhenIdle = false
|
|
25
|
+
void esbuild?.stop()
|
|
26
26
|
}
|
|
27
|
-
})
|
|
27
|
+
})
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
export const build: typeof Esbuild.build = options => track(load().build(options))
|
|
30
|
+
export const build: typeof Esbuild.build = options => track(load().build(options))
|
|
31
31
|
|
|
32
32
|
export const transform: typeof Esbuild.transform = (input, options) =>
|
|
33
|
-
track(load().transform(input, options))
|
|
33
|
+
track(load().transform(input, options))
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Spawn the resident service child ahead of the first real compile. Fire-and-forget: the spawn and
|
|
@@ -38,7 +38,7 @@ export const transform: typeof Esbuild.transform = (input, options) =>
|
|
|
38
38
|
* which compiles nothing before it listens) can absorb a cost the first compile would otherwise pay.
|
|
39
39
|
*/
|
|
40
40
|
export function warmEsbuildService(): void {
|
|
41
|
-
void transform('', { loader: 'js' }).catch(() => undefined)
|
|
41
|
+
void transform('', { loader: 'js' }).catch(() => undefined)
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/**
|
|
@@ -49,10 +49,10 @@ export function warmEsbuildService(): void {
|
|
|
49
49
|
* server boot, and killing the service mid-build hangs it forever.
|
|
50
50
|
*/
|
|
51
51
|
export function stopEsbuildService(): void {
|
|
52
|
-
if (!esbuild) return
|
|
52
|
+
if (!esbuild) return
|
|
53
53
|
if (inFlight > 0) {
|
|
54
|
-
stopWhenIdle = true
|
|
55
|
-
return
|
|
54
|
+
stopWhenIdle = true
|
|
55
|
+
return
|
|
56
56
|
}
|
|
57
|
-
void esbuild.stop()
|
|
57
|
+
void esbuild.stop()
|
|
58
58
|
}
|
package/src/utils/fs-cache.ts
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { existsSync, readdirSync } from 'node:fs'
|
|
2
|
-
import path from 'node:path'
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
3
|
|
|
4
|
-
const NODE_MODULES = `${path.sep}node_modules${path.sep}
|
|
4
|
+
const NODE_MODULES = `${path.sep}node_modules${path.sep}`
|
|
5
5
|
|
|
6
6
|
// One cached dirent listing per directory replaces per-file stat probes.
|
|
7
7
|
// node_modules only: installed layouts are process-immutable, app paths are not.
|
|
8
|
-
const dirents = new Map<string, Set<string> | undefined>()
|
|
8
|
+
const dirents = new Map<string, Set<string> | undefined>()
|
|
9
9
|
|
|
10
10
|
function direntsFor(dir: string) {
|
|
11
|
-
if (dirents.has(dir)) return dirents.get(dir)
|
|
12
|
-
let names: Set<string> | undefined
|
|
11
|
+
if (dirents.has(dir)) return dirents.get(dir)
|
|
12
|
+
let names: Set<string> | undefined
|
|
13
13
|
try {
|
|
14
|
-
names = new Set(readdirSync(dir))
|
|
14
|
+
names = new Set(readdirSync(dir))
|
|
15
15
|
} catch {
|
|
16
|
-
names = undefined
|
|
16
|
+
names = undefined
|
|
17
17
|
}
|
|
18
|
-
dirents.set(dir, names)
|
|
19
|
-
return names
|
|
18
|
+
dirents.set(dir, names)
|
|
19
|
+
return names
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/** `existsSync`, served from the dirent cache for node_modules paths. */
|
|
23
23
|
export function cachedExistsSync(file: string): boolean {
|
|
24
|
-
if (!file.includes(NODE_MODULES)) return existsSync(file)
|
|
25
|
-
return direntsFor(path.dirname(file))?.has(path.basename(file)) ?? false
|
|
24
|
+
if (!file.includes(NODE_MODULES)) return existsSync(file)
|
|
25
|
+
return direntsFor(path.dirname(file))?.has(path.basename(file)) ?? false
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/** Structural-save invalidation: a file added or deleted changes the answers. */
|
|
29
29
|
export function clearNodeModulesFsCache(): void {
|
|
30
|
-
dirents.clear()
|
|
30
|
+
dirents.clear()
|
|
31
31
|
}
|
package/src/utils/fs.ts
CHANGED
|
@@ -1,45 +1,46 @@
|
|
|
1
|
-
import { existsSync, readdirSync } from 'node:fs'
|
|
2
|
-
import { mkdir, readdir, rename, rm, stat, readFile, writeFile } from 'node:fs/promises'
|
|
3
|
-
import path from 'node:path'
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { mkdir, readdir, rename, rm, stat, readFile, writeFile } from 'node:fs/promises'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
4
5
|
|
|
5
6
|
// Write-then-rename so a concurrent import never observes a truncated file; Bun caches a failed load for the
|
|
6
7
|
// life of the process. The temp name must be unique per CALL, not per process: two writers of the same output
|
|
7
8
|
// (two routes demanding one vendor bundle, a re-write after a cache eviction) otherwise share a name and the
|
|
8
9
|
// second rename hits ENOENT once the first moved it away. Losing that race is harmless - both wrote the same
|
|
9
10
|
// content-keyed bytes - so a rename whose temp is gone only fails if the destination is missing too.
|
|
10
|
-
let atomicWriteSequence = 0
|
|
11
|
+
let atomicWriteSequence = 0
|
|
11
12
|
export async function writeFileAtomic(file: string, contents: string) {
|
|
12
|
-
const temp = `${file}.${process.pid.toString(36)}.${(++atomicWriteSequence).toString(36)}.tmp
|
|
13
|
-
await writeFile(temp, contents)
|
|
13
|
+
const temp = `${file}.${process.pid.toString(36)}.${(++atomicWriteSequence).toString(36)}.tmp`
|
|
14
|
+
await writeFile(temp, contents)
|
|
14
15
|
try {
|
|
15
|
-
await rename(temp, file)
|
|
16
|
+
await rename(temp, file)
|
|
16
17
|
} catch (error) {
|
|
17
|
-
if (!existsSync(file)) throw error
|
|
18
|
+
if (!existsSync(file)) throw error
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
export async function listFiles(root: string): Promise<string[]> {
|
|
22
|
-
if (!existsSync(root)) return []
|
|
23
|
-
const entries = await readdir(root, { withFileTypes: true })
|
|
23
|
+
if (!existsSync(root)) return []
|
|
24
|
+
const entries = await readdir(root, { withFileTypes: true })
|
|
24
25
|
// Subdirectories are walked concurrently — a depth-first await chain spends
|
|
25
26
|
// the whole walk waiting on one readdir at a time (0.6 s on a ~1k-file app).
|
|
26
27
|
// Results stay in readdir order so callers keep a stable file order.
|
|
27
28
|
const branches = await Promise.all(
|
|
28
29
|
entries.map(entry => {
|
|
29
|
-
const entryPath = path.join(root, entry.name)
|
|
30
|
-
if (entry.isDirectory()) return listFiles(entryPath)
|
|
31
|
-
return Promise.resolve(entry.isFile() ? [entryPath] : [])
|
|
30
|
+
const entryPath = path.join(root, entry.name)
|
|
31
|
+
if (entry.isDirectory()) return listFiles(entryPath)
|
|
32
|
+
return Promise.resolve(entry.isFile() ? [entryPath] : [])
|
|
32
33
|
}),
|
|
33
|
-
)
|
|
34
|
-
return branches.flat()
|
|
34
|
+
)
|
|
35
|
+
return branches.flat()
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
interface DirListing {
|
|
38
|
-
files: Set<string
|
|
39
|
-
dirs: string[]
|
|
39
|
+
files: Set<string>
|
|
40
|
+
dirs: string[]
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
let dirListings: Map<string, DirListing> | undefined
|
|
43
|
+
let dirListings: Map<string, DirListing> | undefined
|
|
43
44
|
|
|
44
45
|
/**
|
|
45
46
|
* Memoize directory listings for the duration of `run`. A route scan asks the
|
|
@@ -48,84 +49,91 @@ let dirListings: Map<string, DirListing> | undefined;
|
|
|
48
49
|
* reads the directory fresh, so request-time callers never see a stale tree.
|
|
49
50
|
*/
|
|
50
51
|
export function withDirCache<T>(run: () => T): T {
|
|
51
|
-
if (dirListings) return run()
|
|
52
|
-
dirListings = new Map()
|
|
52
|
+
if (dirListings) return run()
|
|
53
|
+
dirListings = new Map()
|
|
53
54
|
try {
|
|
54
|
-
return run()
|
|
55
|
+
return run()
|
|
55
56
|
} finally {
|
|
56
|
-
dirListings = undefined
|
|
57
|
+
dirListings = undefined
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
/** File and subdirectory names of `dir` (both empty when it does not exist). */
|
|
61
62
|
export function readDirListing(dir: string): DirListing {
|
|
62
|
-
const cached = dirListings?.get(dir)
|
|
63
|
-
if (cached) return cached
|
|
64
|
-
let listing: DirListing
|
|
63
|
+
const cached = dirListings?.get(dir)
|
|
64
|
+
if (cached) return cached
|
|
65
|
+
let listing: DirListing
|
|
65
66
|
try {
|
|
66
|
-
const entries = readdirSync(dir, { withFileTypes: true })
|
|
67
|
+
const entries = readdirSync(dir, { withFileTypes: true })
|
|
67
68
|
listing = {
|
|
68
69
|
files: new Set(entries.filter(entry => !entry.isDirectory()).map(entry => entry.name)),
|
|
69
70
|
dirs: entries
|
|
70
71
|
.filter(entry => entry.isDirectory())
|
|
71
72
|
.map(entry => entry.name)
|
|
72
73
|
.sort(),
|
|
73
|
-
}
|
|
74
|
+
}
|
|
74
75
|
} catch {
|
|
75
|
-
listing = { files: new Set(), dirs: [] }
|
|
76
|
+
listing = { files: new Set(), dirs: [] }
|
|
76
77
|
}
|
|
77
|
-
dirListings?.set(dir, listing)
|
|
78
|
-
return listing
|
|
78
|
+
dirListings?.set(dir, listing)
|
|
79
|
+
return listing
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
/** listFiles for callers already running synchronously (route fact scans). */
|
|
82
83
|
export function listFilesSync(root: string): string[] {
|
|
83
|
-
if (!existsSync(root)) return []
|
|
84
|
-
const out: string[] = []
|
|
84
|
+
if (!existsSync(root)) return []
|
|
85
|
+
const out: string[] = []
|
|
85
86
|
|
|
86
87
|
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
87
|
-
const entryPath = path.join(root, entry.name)
|
|
88
|
-
if (entry.isDirectory()) out.push(...listFilesSync(entryPath))
|
|
89
|
-
else if (entry.isFile()) out.push(entryPath)
|
|
88
|
+
const entryPath = path.join(root, entry.name)
|
|
89
|
+
if (entry.isDirectory()) out.push(...listFilesSync(entryPath))
|
|
90
|
+
else if (entry.isFile()) out.push(entryPath)
|
|
90
91
|
}
|
|
91
92
|
|
|
92
|
-
return out
|
|
93
|
+
return out
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
/** Empty `dir`, leaving the named top-level entries (and their contents) in place. */
|
|
96
97
|
export async function ensureEmptyDir(dir: string, keep: readonly string[] = []) {
|
|
97
98
|
if (keep.length === 0) {
|
|
98
|
-
await rm(dir, { recursive: true, force: true })
|
|
99
|
-
await mkdir(dir, { recursive: true })
|
|
100
|
-
return
|
|
99
|
+
await rm(dir, { recursive: true, force: true })
|
|
100
|
+
await mkdir(dir, { recursive: true })
|
|
101
|
+
return
|
|
101
102
|
}
|
|
102
|
-
await mkdir(dir, { recursive: true })
|
|
103
|
-
const preserved = new Set(keep)
|
|
104
|
-
const entries = await readdir(dir).catch(() => [] as string[])
|
|
103
|
+
await mkdir(dir, { recursive: true })
|
|
104
|
+
const preserved = new Set(keep)
|
|
105
|
+
const entries = await readdir(dir).catch(() => [] as string[])
|
|
105
106
|
await Promise.all(
|
|
106
107
|
entries
|
|
107
108
|
.filter(entry => !preserved.has(entry))
|
|
108
109
|
.map(entry => rm(path.join(dir, entry), { recursive: true, force: true })),
|
|
109
|
-
)
|
|
110
|
+
)
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
export async function ensureDir(dir: string) {
|
|
113
|
-
await mkdir(dir, { recursive: true })
|
|
114
|
+
await mkdir(dir, { recursive: true })
|
|
114
115
|
}
|
|
115
116
|
|
|
116
117
|
export async function writeText(file: string, value: string) {
|
|
117
|
-
await ensureDir(path.dirname(file))
|
|
118
|
-
await writeFile(file, value)
|
|
118
|
+
await ensureDir(path.dirname(file))
|
|
119
|
+
await writeFile(file, value)
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
export async function readText(file: string) {
|
|
122
|
-
return readFile(file, 'utf8')
|
|
123
|
+
return readFile(file, 'utf8')
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
export async function fileMtime(file: string) {
|
|
126
|
-
return (await stat(file)).mtimeMs
|
|
127
|
+
return (await stat(file)).mtimeMs
|
|
127
128
|
}
|
|
128
129
|
|
|
129
130
|
export function toPosixPath(value: string) {
|
|
130
|
-
return value.split(path.sep).join('/')
|
|
131
|
+
return value.split(path.sep).join('/')
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** '^' + pnext's own running version, read from its package.json (this module lives at src/utils/). */
|
|
135
|
+
export function pnextVersionRange() {
|
|
136
|
+
const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url))
|
|
137
|
+
const { version } = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version: string }
|
|
138
|
+
return `^${version}`
|
|
131
139
|
}
|
package/src/utils/html.ts
CHANGED
|
@@ -2,45 +2,41 @@ export function escapeHtml(value: unknown) {
|
|
|
2
2
|
return stringifyHtmlValue(value).replace(/[&<>"']/g, char => {
|
|
3
3
|
switch (char) {
|
|
4
4
|
case '&':
|
|
5
|
-
return '&'
|
|
5
|
+
return '&'
|
|
6
6
|
case '<':
|
|
7
|
-
return '<'
|
|
7
|
+
return '<'
|
|
8
8
|
case '>':
|
|
9
|
-
return '>'
|
|
9
|
+
return '>'
|
|
10
10
|
case '"':
|
|
11
|
-
return '"'
|
|
11
|
+
return '"'
|
|
12
12
|
case "'":
|
|
13
|
-
return '''
|
|
13
|
+
return '''
|
|
14
14
|
default:
|
|
15
|
-
return char
|
|
15
|
+
return char
|
|
16
16
|
}
|
|
17
|
-
})
|
|
17
|
+
})
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export function stringifyHtmlValue(value: unknown) {
|
|
21
|
-
if (value === undefined || value === null) return ''
|
|
22
|
-
if (typeof value === 'string') return value
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
typeof value === 'boolean' ||
|
|
26
|
-
typeof value === 'bigint'
|
|
27
|
-
) {
|
|
28
|
-
return String(value);
|
|
21
|
+
if (value === undefined || value === null) return ''
|
|
22
|
+
if (typeof value === 'string') return value
|
|
23
|
+
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
|
|
24
|
+
return String(value)
|
|
29
25
|
}
|
|
30
|
-
if (value instanceof URL) return value.href
|
|
31
|
-
if (value instanceof Date) return value.toISOString()
|
|
32
|
-
if (typeof value !== 'object') return ''
|
|
26
|
+
if (value instanceof URL) return value.href
|
|
27
|
+
if (value instanceof Date) return value.toISOString()
|
|
28
|
+
if (typeof value !== 'object') return ''
|
|
33
29
|
|
|
34
|
-
const stringifier = (value as { toString?: (this: object) => unknown }).toString
|
|
35
|
-
if (!stringifier || stringifier === Object.prototype.toString) return ''
|
|
36
|
-
const stringified = stringifier.call(value)
|
|
37
|
-
if (typeof stringified === 'string') return stringified
|
|
30
|
+
const stringifier = (value as { toString?: (this: object) => unknown }).toString
|
|
31
|
+
if (!stringifier || stringifier === Object.prototype.toString) return ''
|
|
32
|
+
const stringified = stringifier.call(value)
|
|
33
|
+
if (typeof stringified === 'string') return stringified
|
|
38
34
|
if (
|
|
39
35
|
typeof stringified === 'number' ||
|
|
40
36
|
typeof stringified === 'boolean' ||
|
|
41
37
|
typeof stringified === 'bigint'
|
|
42
38
|
) {
|
|
43
|
-
return String(stringified)
|
|
39
|
+
return String(stringified)
|
|
44
40
|
}
|
|
45
|
-
return ''
|
|
41
|
+
return ''
|
|
46
42
|
}
|
|
@@ -7,22 +7,22 @@
|
|
|
7
7
|
// these loaders read `process.versions.node` / `process.versions.pnp` while initializing - so the
|
|
8
8
|
// require throws. Load them against the real process instead; the module cache then holds a good copy
|
|
9
9
|
// for every later call.
|
|
10
|
-
import realProcess from 'node:process'
|
|
10
|
+
import realProcess from 'node:process'
|
|
11
11
|
|
|
12
12
|
export function loadNative<T>(load: () => T): T {
|
|
13
|
-
const globalObject = globalThis as typeof globalThis & { process?: NodeJS.Process }
|
|
14
|
-
if (globalObject.process === realProcess) return load()
|
|
15
|
-
const previous = Object.getOwnPropertyDescriptor(globalObject, 'process')
|
|
13
|
+
const globalObject = globalThis as typeof globalThis & { process?: NodeJS.Process }
|
|
14
|
+
if (globalObject.process === realProcess) return load()
|
|
15
|
+
const previous = Object.getOwnPropertyDescriptor(globalObject, 'process')
|
|
16
16
|
Object.defineProperty(globalObject, 'process', {
|
|
17
17
|
configurable: true,
|
|
18
18
|
enumerable: false,
|
|
19
19
|
writable: true,
|
|
20
20
|
value: realProcess,
|
|
21
|
-
})
|
|
21
|
+
})
|
|
22
22
|
try {
|
|
23
|
-
return load()
|
|
23
|
+
return load()
|
|
24
24
|
} finally {
|
|
25
|
-
if (previous) Object.defineProperty(globalObject, 'process', previous)
|
|
26
|
-
else delete (globalObject as { process?: NodeJS.Process }).process
|
|
25
|
+
if (previous) Object.defineProperty(globalObject, 'process', previous)
|
|
26
|
+
else delete (globalObject as { process?: NodeJS.Process }).process
|
|
27
27
|
}
|
|
28
28
|
}
|