@absolutejs/absolute 0.19.0-beta.999 → 0.20.0-beta.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/LICENSE +21 -13
- package/README.md +48 -2
- package/dist/angular/browser.js +82 -77
- package/dist/angular/browser.js.map +11 -11
- package/dist/angular/components/constants.js +43 -0
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/angular/hmrPreserveCore.ts +132 -134
- package/dist/angular/index.js +1719 -844
- package/dist/angular/index.js.map +34 -26
- package/dist/angular/server.js +1620 -768
- package/dist/angular/server.js.map +28 -20
- package/dist/build.js +4935 -2593
- package/dist/build.js.map +72 -57
- package/dist/cli/config/client.js +578 -0
- package/dist/cli/config/server.js +39587 -0
- package/dist/cli/htmx/htmx.min.js +1 -0
- package/dist/cli/index.js +16828 -3511
- package/dist/client/index.js +49 -46
- package/dist/client/index.js.map +12 -12
- package/dist/core/streamingSlotRegistrar.js +1 -19
- package/dist/core/streamingSlotRegistrar.js.map +2 -2
- package/dist/core/streamingSlotRegistry.js +1 -19
- package/dist/core/streamingSlotRegistry.js.map +2 -2
- package/dist/dev/client/cssUtils.ts +98 -41
- package/dist/dev/client/domState.ts +2 -0
- package/dist/dev/client/errorOverlay.ts +14 -13
- package/dist/dev/client/handlers/angularHmrShim.ts +20 -20
- package/dist/dev/client/handlers/angularRemount.ts +74 -55
- package/dist/dev/client/handlers/angularRemountWiring.ts +1 -2
- package/dist/dev/client/handlers/html.ts +144 -41
- package/dist/dev/client/handlers/htmx.ts +43 -8
- package/dist/dev/client/handlers/react.ts +114 -32
- package/dist/dev/client/handlers/rebuild.ts +28 -8
- package/dist/dev/client/handlers/svelte.ts +92 -51
- package/dist/dev/client/handlers/vue.ts +36 -45
- package/dist/dev/client/hmrClient.ts +101 -26
- package/dist/dev/client/hmrTiming.ts +141 -0
- package/dist/dev/client/hmrToast.ts +22 -24
- package/dist/dev/client/reactRefreshSetup.ts +4 -0
- package/dist/dev/client/vendor/reactRefreshRuntime.d.ts +12 -0
- package/dist/dev/client/vendor/reactRefreshRuntime.js +313 -0
- package/dist/dev/serverBootstrap.js +45 -0
- package/dist/index.js +7153 -3224
- package/dist/index.js.map +118 -86
- package/dist/islands/browser.js +1 -19
- package/dist/islands/browser.js.map +3 -3
- package/dist/islands/index.js +709 -120
- package/dist/islands/index.js.map +18 -13
- package/dist/mobile/browser.js +428 -0
- package/dist/mobile/browser.js.map +12 -0
- package/dist/mobile/index.js +3058 -0
- package/dist/mobile/index.js.map +35 -0
- package/dist/react/browser.js +13 -62
- package/dist/react/browser.js.map +5 -6
- package/dist/react/components/browser/index.js +23 -13
- package/dist/react/components/index.js +30 -34
- package/dist/react/components/index.js.map +8 -7
- package/dist/react/hooks/index.js +1 -19
- package/dist/react/hooks/index.js.map +3 -3
- package/dist/react/index.js +1643 -679
- package/dist/react/index.js.map +29 -20
- package/dist/react/jsxDevRuntimeCompat.js +22 -20
- package/dist/react/jsxDevRuntimeCompat.js.map +5 -4
- package/dist/react/jsxRuntimeCompat.js +90 -0
- package/dist/react/jsxRuntimeCompat.js.map +10 -0
- package/dist/react/router/browser.js +77 -0
- package/dist/react/router/browser.js.map +10 -0
- package/dist/react/router/index.js +77 -0
- package/dist/react/router/index.js.map +10 -0
- package/dist/react/server.js +950 -565
- package/dist/react/server.js.map +16 -11
- package/dist/src/angular/components/constants.d.ts +21 -0
- package/dist/src/angular/hmrPreserveCore.d.ts +7 -20
- package/dist/src/angular/islands.d.ts +1 -1
- package/dist/src/angular/pageHandler.d.ts +2 -0
- package/dist/src/angular/ssrRender.d.ts +4 -1
- package/dist/src/build/bunStringRawUnicodePlugin.d.ts +12 -0
- package/dist/src/build/chainInlineSourcemaps.d.ts +1 -0
- package/dist/src/build/compileAngular.d.ts +5 -7
- package/dist/src/build/compileSvelte.d.ts +3 -0
- package/dist/src/build/compileVue.d.ts +3 -1
- package/dist/src/build/generateReactIndexes.d.ts +1 -0
- package/dist/src/build/islandRegistryTransform.d.ts +17 -0
- package/dist/src/build/maskLiterals.d.ts +28 -0
- package/dist/src/build/parseVueSpaRoutes.d.ts +5 -0
- package/dist/src/build/resolveBuildMode.d.ts +7 -0
- package/dist/src/build/serverExternals.d.ts +14 -0
- package/dist/src/build/spaSideManifests.d.ts +16 -0
- package/dist/src/build/tailwindCompiler.d.ts +0 -1
- package/dist/src/cli/add/dependencies.d.ts +13 -0
- package/dist/src/cli/config/absolute/AbsoluteConfigPanel.d.ts +6 -0
- package/dist/src/cli/config/absolute/editAbsoluteConfig.d.ts +5 -0
- package/dist/src/cli/config/absolute/resolveAbsoluteConfig.d.ts +19 -0
- package/dist/src/cli/config/auth/AuthPanel.d.ts +6 -0
- package/dist/src/cli/config/auth/authCatalog.d.ts +10 -0
- package/dist/src/cli/config/auth/authScaffolds.d.ts +16 -0
- package/dist/src/cli/config/auth/editAuthConfig.d.ts +5 -0
- package/dist/src/cli/config/auth/resolveAuthSettings.d.ts +14 -0
- package/dist/src/cli/config/auth/resolveAuthState.d.ts +2 -0
- package/dist/src/cli/config/auth/scaffoldAuthFeature.d.ts +6 -0
- package/dist/src/cli/config/client.d.ts +1 -0
- package/dist/src/cli/config/configCert.d.ts +12 -0
- package/dist/src/cli/config/eslint/EslintPanel.d.ts +6 -0
- package/dist/src/cli/config/eslint/configAst.d.ts +18 -0
- package/dist/src/cli/config/eslint/editConfigRule.d.ts +6 -0
- package/dist/src/cli/config/eslint/eslintStyles.d.ts +1 -0
- package/dist/src/cli/config/eslint/resolveConfig.d.ts +3 -0
- package/dist/src/cli/config/eslint/serializeValue.d.ts +9 -0
- package/dist/src/cli/config/guards.d.ts +4 -0
- package/dist/src/cli/config/integrations/IntegrationsPanel.d.ts +6 -0
- package/dist/src/cli/config/packageJson/PackageJsonPanel.d.ts +6 -0
- package/dist/src/cli/config/packageJson/editPackageJson.d.ts +9 -0
- package/dist/src/cli/config/packageJson/resolvePackageJson.d.ts +8 -0
- package/dist/src/cli/config/page/ConfigShell.d.ts +6 -0
- package/dist/src/cli/config/page/FieldEditor.d.ts +9 -0
- package/dist/src/cli/config/page/PanelHost.d.ts +6 -0
- package/dist/src/cli/config/page/configStyles.d.ts +1 -0
- package/dist/src/cli/config/panels.d.ts +7 -0
- package/dist/src/cli/config/prettier/PrettierPanel.d.ts +6 -0
- package/dist/src/cli/config/prettier/editPrettier.d.ts +5 -0
- package/dist/src/cli/config/prettier/resolvePrettier.d.ts +11 -0
- package/dist/src/cli/config/schema/fromJsonSchema.d.ts +3 -0
- package/dist/src/cli/config/schema/fromType.d.ts +1 -0
- package/dist/src/cli/config/schema/serialize.d.ts +1 -0
- package/dist/src/cli/config/server.d.ts +527 -0
- package/dist/src/cli/config/tsconfig/TsconfigPanel.d.ts +6 -0
- package/dist/src/cli/config/tsconfig/editTsconfig.d.ts +5 -0
- package/dist/src/cli/config/tsconfig/resolveTsconfig.d.ts +8 -0
- package/dist/src/cli/config/tsconfig/tsconfigStyles.d.ts +1 -0
- package/dist/src/cli/discoverInstances.d.ts +5 -0
- package/dist/src/cli/elysiaOpenApiTypeboxPlugin.d.ts +8 -0
- package/dist/src/cli/generate/componentTemplates.d.ts +7 -0
- package/dist/src/cli/generate/context.d.ts +30 -0
- package/dist/src/cli/generate/cssStrategy.d.ts +20 -0
- package/dist/src/cli/generate/frameworkKey.d.ts +3 -0
- package/dist/src/cli/generate/frameworks.d.ts +40 -0
- package/dist/src/cli/generate/generateApi.d.ts +3 -0
- package/dist/src/cli/generate/generateComponent.d.ts +4 -0
- package/dist/src/cli/generate/generatePage.d.ts +4 -0
- package/dist/src/cli/generate/naming.d.ts +5 -0
- package/dist/src/cli/generate/navData.d.ts +10 -0
- package/dist/src/cli/generate/outcome.d.ts +17 -0
- package/dist/src/cli/generate/pageTemplates.d.ts +11 -0
- package/dist/src/cli/generate/routeWiring.d.ts +40 -0
- package/dist/src/cli/generate/staticNav.d.ts +5 -0
- package/dist/src/cli/heapDiff.d.ts +1 -0
- package/dist/src/cli/htmx/install.d.ts +6 -0
- package/dist/src/cli/inspectData.d.ts +12 -0
- package/dist/src/cli/inspectTui.d.ts +1 -0
- package/dist/src/cli/instanceStatus.d.ts +22 -0
- package/dist/src/cli/integrations/addPlugin.d.ts +8 -0
- package/dist/src/cli/integrations/catalog.d.ts +20 -0
- package/dist/src/cli/psTui.d.ts +1 -0
- package/dist/src/cli/scripts/add.d.ts +1 -0
- package/dist/src/cli/scripts/analyze.d.ts +1 -0
- package/dist/src/cli/scripts/api.d.ts +1 -0
- package/dist/src/cli/scripts/build.d.ts +1 -1
- package/dist/src/cli/scripts/db.d.ts +20 -0
- package/dist/src/cli/scripts/dev.d.ts +5 -1
- package/dist/src/cli/scripts/doctor.d.ts +1 -0
- package/dist/src/cli/scripts/env.d.ts +7 -0
- package/dist/src/cli/scripts/eslint.d.ts +37 -2
- package/dist/src/cli/scripts/eslintChunked.d.ts +37 -0
- package/dist/src/cli/scripts/generate.d.ts +1 -0
- package/dist/src/cli/scripts/htmx.d.ts +1 -0
- package/dist/src/cli/scripts/inspect.d.ts +1 -0
- package/dist/src/cli/scripts/islands.d.ts +1 -0
- package/dist/src/cli/scripts/lintProof.d.ts +42 -0
- package/dist/src/cli/scripts/logs.d.ts +1 -0
- package/dist/src/cli/scripts/ls.d.ts +1 -0
- package/dist/src/cli/scripts/mem.d.ts +1 -0
- package/dist/src/cli/scripts/mobile.d.ts +1 -0
- package/dist/src/cli/scripts/prettier.d.ts +2 -0
- package/dist/src/cli/scripts/ps.d.ts +1 -0
- package/dist/src/cli/scripts/remove.d.ts +1 -0
- package/dist/src/cli/scripts/routes.d.ts +1 -0
- package/dist/src/cli/scripts/start.d.ts +6 -1
- package/dist/src/cli/scripts/tunnelRelay.d.ts +9 -0
- package/dist/src/cli/scripts/workspace.d.ts +3 -1
- package/dist/src/cli/serverBundleExternals.d.ts +2 -0
- package/dist/src/cli/tuiPrimitives.d.ts +14 -0
- package/dist/src/cli/typeGraphCoherence.d.ts +32 -0
- package/dist/src/cli/utils.d.ts +3 -1
- package/dist/src/cli/workspaceTui.d.ts +2 -1
- package/dist/src/client/hydrators/react.d.ts +1 -1
- package/dist/src/client/hydrators/svelte.d.ts +1 -1
- package/dist/src/client/hydrators/vue.d.ts +1 -1
- package/dist/src/client/islandStore.d.ts +3 -3
- package/dist/src/client/preserveIslandMarkup.d.ts +4 -1
- package/dist/src/constants.d.ts +21 -0
- package/dist/src/core/angularServerModule.d.ts +1 -0
- package/dist/src/core/build.d.ts +11 -3
- package/dist/src/core/devRouteRegistrationCallsite.d.ts +1 -5
- package/dist/src/core/index.d.ts +1 -0
- package/dist/src/core/pageResponseCache.d.ts +23 -0
- package/dist/src/core/prepare.d.ts +192 -154
- package/dist/src/core/requestContext.d.ts +18 -0
- package/dist/src/dev/angular/fastHmrCompiler.d.ts +5 -3
- package/dist/src/dev/angular/hmrCompiler.d.ts +1 -1
- package/dist/src/dev/angular/resolveOwningComponents.d.ts +1 -1
- package/dist/src/dev/clientManager.d.ts +10 -1
- package/dist/src/dev/configResolver.d.ts +2 -0
- package/dist/src/dev/moduleMapper.d.ts +1 -1
- package/dist/src/dev/moduleServer.d.ts +2 -1
- package/dist/src/dev/pathUtils.d.ts +1 -1
- package/dist/src/dev/reactComponentClassifier.d.ts +1 -1
- package/dist/src/dev/rebuildTrigger.d.ts +4 -0
- package/dist/src/dev/requestInspector.d.ts +31 -0
- package/dist/src/dev/serverBootstrap.d.ts +1 -0
- package/dist/src/dev/serverEntryWatcher.d.ts +3 -3
- package/dist/src/dev/tunnel/client.d.ts +20 -0
- package/dist/src/dev/tunnel/protocol.d.ts +85 -0
- package/dist/src/dev/tunnel/relay.d.ts +28 -0
- package/dist/src/dev/webSocket.d.ts +1 -1
- package/dist/src/mobile/androidConformance.d.ts +42 -0
- package/dist/src/mobile/androidEmulatorController.d.ts +99 -0
- package/dist/src/mobile/androidNativeWatcher.d.ts +19 -0
- package/dist/src/mobile/androidRelease.d.ts +47 -0
- package/dist/src/mobile/androidWebView.d.ts +46 -0
- package/dist/src/mobile/artifactStore.d.ts +47 -0
- package/dist/src/mobile/associationFiles.d.ts +49 -0
- package/dist/src/mobile/browser.d.ts +2 -0
- package/dist/src/mobile/buildMetadata.d.ts +10 -0
- package/dist/src/mobile/buildPipeline.d.ts +8 -0
- package/dist/src/mobile/buildRelease.d.ts +24 -0
- package/dist/src/mobile/capacitorBundle.d.ts +28 -0
- package/dist/src/mobile/capacitorProject.d.ts +9 -0
- package/dist/src/mobile/client.d.ts +35 -0
- package/dist/src/mobile/compatibilityDispatcher.d.ts +26 -0
- package/dist/src/mobile/config.d.ts +16 -0
- package/dist/src/mobile/emulatorDoctor.d.ts +25 -0
- package/dist/src/mobile/emulatorInstaller.d.ts +41 -0
- package/dist/src/mobile/index.d.ts +19 -0
- package/dist/src/mobile/materializedBundle.d.ts +36 -0
- package/dist/src/mobile/nativeDeepLinks.d.ts +5 -0
- package/dist/src/mobile/pageProtocol.d.ts +89 -0
- package/dist/src/mobile/producerContext.d.ts +4 -0
- package/dist/src/mobile/producerContextState.d.ts +10 -0
- package/dist/src/mobile/releaseArtifact.d.ts +75 -0
- package/dist/src/mobile/releaseDoctor.d.ts +13 -0
- package/dist/src/mobile/routeMatcher.d.ts +3 -0
- package/dist/src/mobile/routeMetadataTransform.d.ts +13 -0
- package/dist/src/mobile/shellBootstrap.d.ts +1 -0
- package/dist/src/mobile/transport.d.ts +31 -0
- package/dist/src/plugins/devtoolsJson.d.ts +6 -47
- package/dist/src/plugins/hmr.d.ts +22 -96
- package/dist/src/plugins/imageOptimizer.d.ts +150 -62
- package/dist/src/plugins/networking.d.ts +2 -2
- package/dist/src/plugins/openApiPlugin.d.ts +4 -0
- package/dist/src/plugins/telemetryPlugin.d.ts +36 -0
- package/dist/src/react/browser.d.ts +0 -2
- package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
- package/dist/src/react/index.d.ts +0 -2
- package/dist/src/react/jsxDevRuntimeCompat.d.ts +1 -1
- package/dist/src/react/jsxRuntimeCompat.d.ts +7 -0
- package/dist/src/react/pageHandler.d.ts +8 -0
- package/dist/src/react/router/UniversalRouter.d.ts +43 -0
- package/dist/src/react/router/browser.d.ts +2 -0
- package/dist/src/react/router/index.d.ts +2 -0
- package/dist/src/svelte/pageHandler.d.ts +5 -0
- package/dist/src/svelte/router/hashMode.d.ts +1 -6
- package/dist/src/svelte/router/matchPath.d.ts +4 -24
- package/dist/src/svelte/router/page.svelte.d.ts +1 -10
- package/dist/src/svelte/router/prefetchCache.d.ts +2 -6
- package/dist/src/utils/cleanup.d.ts +1 -0
- package/dist/src/utils/defineConvention.d.ts +2 -2
- package/dist/src/utils/defineEnv.d.ts +4 -4
- package/dist/src/utils/formatBytes.d.ts +2 -0
- package/dist/src/utils/generatedDir.d.ts +1 -1
- package/dist/src/utils/iconVersion.d.ts +5 -0
- package/dist/src/utils/imageProcessing.d.ts +1 -1
- package/dist/src/utils/index.d.ts +2 -0
- package/dist/src/utils/inlinePageCss.d.ts +9 -0
- package/dist/src/utils/instanceRegistry.d.ts +13 -0
- package/dist/src/utils/isTestSourcePath.d.ts +1 -0
- package/dist/src/utils/jsonLd.d.ts +1 -1
- package/dist/src/utils/loadConfig.d.ts +11 -3
- package/dist/src/utils/logger.d.ts +2 -0
- package/dist/src/utils/portScan.d.ts +22 -0
- package/dist/src/utils/projectRoot.d.ts +17 -0
- package/dist/src/utils/resolveConvention.d.ts +1 -1
- package/dist/src/utils/resolveDevPort.d.ts +4 -1
- package/dist/src/utils/runtimeMode.d.ts +1 -1
- package/dist/src/utils/spaRouteCss.d.ts +10 -0
- package/dist/src/utils/spaRouteManifest.d.ts +8 -0
- package/dist/src/utils/stripStringsAndComments.d.ts +18 -0
- package/dist/src/utils/userAgentFunctions.d.ts +1 -1
- package/dist/src/utils/vueCompiler.d.ts +1 -0
- package/dist/src/vue/components/Image.d.ts +2 -2
- package/dist/src/vue/defineVuePage.d.ts +1 -11
- package/dist/src/vue/index.d.ts +3 -0
- package/dist/src/vue/pageHandler.d.ts +5 -0
- package/dist/src/vue/resolveGeneratedVueModulePath.d.ts +1 -0
- package/dist/src/vue/teleports.d.ts +2 -0
- package/dist/src/vue/useResource.d.ts +65 -0
- package/dist/svelte/browser.js +1 -19
- package/dist/svelte/browser.js.map +3 -3
- package/dist/svelte/components/Head.svelte +7 -1
- package/dist/svelte/index.js +1281 -543
- package/dist/svelte/index.js.map +27 -19
- package/dist/svelte/router/Link.svelte.d.ts +3 -3
- package/dist/svelte/router/Route.svelte.d.ts +5 -5
- package/dist/svelte/router/Router.svelte.d.ts +3 -3
- package/dist/svelte/router/hashMode.ts +6 -12
- package/dist/svelte/router/matchPath.ts +44 -61
- package/dist/svelte/router/page.d.ts +1 -10
- package/dist/svelte/router/page.js +6 -6
- package/dist/svelte/router/prefetchCache.ts +21 -23
- package/dist/svelte/router/viewTransitions.ts +22 -12
- package/dist/svelte/server.js +697 -565
- package/dist/svelte/server.js.map +14 -11
- package/dist/types/absoluteConfig.d.ts +22 -0
- package/dist/types/angular.d.ts +4 -1
- package/dist/types/authPanel.d.ts +62 -0
- package/dist/types/build.d.ts +116 -0
- package/dist/types/cli.d.ts +57 -0
- package/dist/types/config.d.ts +52 -0
- package/dist/types/eslintConfig.d.ts +68 -0
- package/dist/types/globals.d.ts +31 -10
- package/dist/types/image.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/integrationsPanel.d.ts +29 -0
- package/dist/types/messages.d.ts +12 -0
- package/dist/types/packageJson.d.ts +74 -0
- package/dist/types/packageJsonPanel.d.ts +29 -0
- package/dist/types/prettier.d.ts +26 -0
- package/dist/types/tsconfig.d.ts +31 -0
- package/dist/types/vue.d.ts +13 -15
- package/dist/vue/browser.js +14 -36
- package/dist/vue/browser.js.map +5 -5
- package/dist/vue/components/Image.js +3 -20
- package/dist/vue/components/Image.js.map +3 -3
- package/dist/vue/components/index.js +3 -20
- package/dist/vue/components/index.js.map +3 -3
- package/dist/vue/index.js +1573 -620
- package/dist/vue/index.js.map +34 -22
- package/dist/vue/server.js +800 -520
- package/dist/vue/server.js.map +17 -11
- package/package.json +145 -68
- package/dist/src/react/UniversalRouter.d.ts +0 -12
package/dist/react/server.js
CHANGED
|
@@ -3,7 +3,6 @@ var __create = Object.create;
|
|
|
3
3
|
var __getProtoOf = Object.getPrototypeOf;
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
7
|
function __accessProp(key) {
|
|
9
8
|
return this[key];
|
|
@@ -30,23 +29,6 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
30
29
|
cache.set(mod, to);
|
|
31
30
|
return to;
|
|
32
31
|
};
|
|
33
|
-
var __toCommonJS = (from) => {
|
|
34
|
-
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
35
|
-
if (entry)
|
|
36
|
-
return entry;
|
|
37
|
-
entry = __defProp({}, "__esModule", { value: true });
|
|
38
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
39
|
-
for (var key of __getOwnPropNames(from))
|
|
40
|
-
if (!__hasOwnProp.call(entry, key))
|
|
41
|
-
__defProp(entry, key, {
|
|
42
|
-
get: __accessProp.bind(from, key),
|
|
43
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
__moduleCache.set(from, entry);
|
|
47
|
-
return entry;
|
|
48
|
-
};
|
|
49
|
-
var __moduleCache;
|
|
50
32
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
51
33
|
var __returnValue = (v) => v;
|
|
52
34
|
function __exportSetter(name, newValue) {
|
|
@@ -78,25 +60,6 @@ var __legacyMetadataTS = (k, v) => {
|
|
|
78
60
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
79
61
|
var __require = import.meta.require;
|
|
80
62
|
|
|
81
|
-
// src/constants.ts
|
|
82
|
-
var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
|
|
83
|
-
var init_constants = __esm(() => {
|
|
84
|
-
IMAGE_DEFAULT_DEVICE_SIZES = [
|
|
85
|
-
640,
|
|
86
|
-
750,
|
|
87
|
-
828,
|
|
88
|
-
1080,
|
|
89
|
-
1200,
|
|
90
|
-
1920,
|
|
91
|
-
2048,
|
|
92
|
-
3840
|
|
93
|
-
];
|
|
94
|
-
IMAGE_DEFAULT_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384];
|
|
95
|
-
MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
|
|
96
|
-
MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
|
|
97
|
-
TWO_THIRDS = 2 / 3;
|
|
98
|
-
});
|
|
99
|
-
|
|
100
63
|
// src/core/devRouteRegistrationCallsite.ts
|
|
101
64
|
var exports_devRouteRegistrationCallsite = {};
|
|
102
65
|
__export(exports_devRouteRegistrationCallsite, {
|
|
@@ -107,22 +70,20 @@ __export(exports_devRouteRegistrationCallsite, {
|
|
|
107
70
|
});
|
|
108
71
|
import { AsyncLocalStorage } from "async_hooks";
|
|
109
72
|
import { Elysia } from "elysia";
|
|
110
|
-
var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, ROUTE_METHOD_NAMES, PAGE_HANDLER_NAMES, pageHandlerWrappers, handlerSourceMentionsPageHelper = (handler) => {
|
|
73
|
+
var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, NODE_ENV_KEY = "NODE_ENV", ROUTE_METHOD_NAMES, PAGE_HANDLER_NAMES, pageHandlerWrappers, isPageHandlerFunction = (value) => typeof value === "function", handlerSourceMentionsPageHelper = (handler) => {
|
|
111
74
|
const source = handler.toString();
|
|
112
75
|
return PAGE_HANDLER_NAMES.some((name) => source.includes(name));
|
|
76
|
+
}, getOriginalPageHandlerSource = (handler) => {
|
|
77
|
+
if (!isPageHandlerFunction(handler))
|
|
78
|
+
return;
|
|
79
|
+
const info = pageHandlerWrappers.get(handler);
|
|
80
|
+
return (info?.originalHandler ?? handler).toString();
|
|
113
81
|
}, isPageHandler = (handler) => {
|
|
114
|
-
if (
|
|
82
|
+
if (!isPageHandlerFunction(handler))
|
|
115
83
|
return false;
|
|
116
|
-
|
|
117
|
-
if (pageHandlerWrappers.has(fn))
|
|
84
|
+
if (pageHandlerWrappers.has(handler))
|
|
118
85
|
return true;
|
|
119
|
-
return handlerSourceMentionsPageHelper(
|
|
120
|
-
}, getOriginalPageHandlerSource = (handler) => {
|
|
121
|
-
if (typeof handler !== "function")
|
|
122
|
-
return;
|
|
123
|
-
const fn = handler;
|
|
124
|
-
const info = pageHandlerWrappers.get(fn);
|
|
125
|
-
return (info?.originalHandler ?? fn).toString();
|
|
86
|
+
return handlerSourceMentionsPageHelper(handler);
|
|
126
87
|
}, isObjectRecord3 = (value) => Boolean(value) && typeof value === "object", isAsyncLocalStorage2 = (value) => isObjectRecord3(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function", isRouteMethod = (value) => typeof value === "function", getRouteCallsiteStorage = () => {
|
|
127
88
|
const value = Reflect.get(globalThis, ROUTE_CALLSITE_STORAGE_KEY);
|
|
128
89
|
if (value === null || typeof value === "undefined") {
|
|
@@ -156,17 +117,22 @@ var ROUTE_CALLSITE_STORAGE_KEY, ROUTE_CALLSITE_PATCHED_KEY, ROUTE_METHOD_NAMES,
|
|
|
156
117
|
return function wrappedRouteHandler(...args) {
|
|
157
118
|
return storage.run({ callsite }, () => Reflect.apply(routeHandler, this, args));
|
|
158
119
|
};
|
|
159
|
-
}, createPatchedRouteMethod = (originalMethod, methodName) => function patchedRouteMethod(path,
|
|
120
|
+
}, createPatchedRouteMethod = (originalMethod, methodName) => function patchedRouteMethod(path, ...routeArguments) {
|
|
121
|
+
const handlerIndex = routeArguments.length >= 2 ? 1 : 0;
|
|
122
|
+
const handler = routeArguments[handlerIndex];
|
|
160
123
|
const callsite = captureRouteRegistrationCallsite();
|
|
161
124
|
const wrapped = wrapRouteHandlerWithCallsite(handler, callsite);
|
|
162
|
-
if (methodName === "get" &&
|
|
125
|
+
if (methodName === "get" && isPageHandlerFunction(handler) && isPageHandlerFunction(wrapped) && handlerSourceMentionsPageHelper(handler)) {
|
|
163
126
|
pageHandlerWrappers.set(wrapped, {
|
|
164
127
|
originalHandler: handler
|
|
165
128
|
});
|
|
166
129
|
}
|
|
167
|
-
|
|
130
|
+
routeArguments[handlerIndex] = wrapped;
|
|
131
|
+
return Reflect.apply(originalMethod, this, [path, ...routeArguments]);
|
|
168
132
|
}, getCurrentRouteRegistrationCallsite = () => getRouteCallsiteStorage()?.getStore()?.callsite, patchElysiaRouteRegistrationCallsites = () => {
|
|
169
|
-
if (
|
|
133
|
+
if (process.env[NODE_ENV_KEY] === "production") {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
170
136
|
if (Reflect.get(globalThis, ROUTE_CALLSITE_PATCHED_KEY) === true) {
|
|
171
137
|
return;
|
|
172
138
|
}
|
|
@@ -203,6 +169,43 @@ var init_devRouteRegistrationCallsite = __esm(() => {
|
|
|
203
169
|
pageHandlerWrappers = new WeakMap;
|
|
204
170
|
});
|
|
205
171
|
|
|
172
|
+
// src/core/pageResponseCache.ts
|
|
173
|
+
import { createHash } from "crypto";
|
|
174
|
+
var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
|
|
175
|
+
const headers = new Headers(extra);
|
|
176
|
+
headers.set("content-type", HTML_CONTENT_TYPE);
|
|
177
|
+
headers.set(STREAMING_PAGE_HEADER, "1");
|
|
178
|
+
return headers;
|
|
179
|
+
}, computeEtag = (html) => `W/"${createHash("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request, options) => {
|
|
180
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
181
|
+
if (!contentType.includes(HTML_CONTENT_TYPE))
|
|
182
|
+
return response;
|
|
183
|
+
const isStreaming = response.headers.get(STREAMING_PAGE_HEADER) === "1";
|
|
184
|
+
if (isStreaming && !options?.bufferStreamForEtag || !response.body) {
|
|
185
|
+
response.headers.delete(STREAMING_PAGE_HEADER);
|
|
186
|
+
response.headers.set("cache-control", "no-cache");
|
|
187
|
+
return response;
|
|
188
|
+
}
|
|
189
|
+
const html = await response.text();
|
|
190
|
+
const etag = computeEtag(html);
|
|
191
|
+
if (request?.headers.get("if-none-match") === etag) {
|
|
192
|
+
return new Response(null, {
|
|
193
|
+
headers: { "cache-control": "no-cache", etag },
|
|
194
|
+
status: 304
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const headers = new Headers(response.headers);
|
|
198
|
+
headers.delete(STREAMING_PAGE_HEADER);
|
|
199
|
+
headers.set("cache-control", "no-cache");
|
|
200
|
+
headers.set("etag", etag);
|
|
201
|
+
return new Response(html, {
|
|
202
|
+
headers,
|
|
203
|
+
status: response.status,
|
|
204
|
+
statusText: response.statusText
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
var init_pageResponseCache = () => {};
|
|
208
|
+
|
|
206
209
|
// src/client/streamSwap.ts
|
|
207
210
|
var streamSwapRuntime = () => {
|
|
208
211
|
const absoluteWindow = window;
|
|
@@ -312,6 +315,26 @@ var streamSwapRuntime = () => {
|
|
|
312
315
|
return value.slice(start + 1, end);
|
|
313
316
|
}, getStreamSwapRuntimeScript = () => `(function(){${stripFunctionWrapper(streamSwapRuntime.toString())}})();`;
|
|
314
317
|
|
|
318
|
+
// src/constants.ts
|
|
319
|
+
var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240, MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
|
|
320
|
+
var init_constants = __esm(() => {
|
|
321
|
+
TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
|
|
322
|
+
IMAGE_DEFAULT_DEVICE_SIZES = [
|
|
323
|
+
640,
|
|
324
|
+
750,
|
|
325
|
+
828,
|
|
326
|
+
1080,
|
|
327
|
+
1200,
|
|
328
|
+
1920,
|
|
329
|
+
2048,
|
|
330
|
+
3840
|
|
331
|
+
];
|
|
332
|
+
IMAGE_DEFAULT_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384];
|
|
333
|
+
MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
|
|
334
|
+
MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
|
|
335
|
+
TWO_THIRDS = 2 / 3;
|
|
336
|
+
});
|
|
337
|
+
|
|
315
338
|
// src/utils/escapeScriptContent.ts
|
|
316
339
|
var ESCAPE_LOOKUP, ESCAPE_REGEX, escapeScriptContent = (content) => content.replace(ESCAPE_REGEX, (char) => {
|
|
317
340
|
const escaped = ESCAPE_LOOKUP[char];
|
|
@@ -345,7 +368,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
|
|
|
345
368
|
getStreamingSlotsRuntimeScript()
|
|
346
369
|
].filter(Boolean).join(";");
|
|
347
370
|
return `<script${createNonceAttr(nonce)}>${escapeScriptContent(runtimeBody)}</script>`;
|
|
348
|
-
}, toUint8 = (value, encoder) => encoder.encode(value),
|
|
371
|
+
}, toUint8 = (value, encoder) => encoder.encode(value), isRecord2 = (value) => Boolean(value) && typeof value === "object", isSafeHtmlLike = (value) => isRecord2(value) && typeof value.changingThisBreaksApplicationSecurity === "string", normalizeSafeHtml = (value) => {
|
|
349
372
|
if (isSafeHtmlLike(value)) {
|
|
350
373
|
return value.changingThisBreaksApplicationSecurity;
|
|
351
374
|
}
|
|
@@ -406,7 +429,7 @@ var SLOT_ID_PREFIX = "abs-slot-", CLOSING_BODY_TAG = "</body>", CLOSING_HEAD_TAG
|
|
|
406
429
|
}, createTimeoutError = (slot, timeoutMs) => {
|
|
407
430
|
const error = Object.assign(new Error(`Streaming slot "${slot.id}" timed out after ${timeoutMs}ms`), { __absTimeout: true });
|
|
408
431
|
return error;
|
|
409
|
-
}, isSlotPatchPayloadObject = (value) =>
|
|
432
|
+
}, isSlotPatchPayloadObject = (value) => isRecord2(value) && ("html" in value), isTimeoutError = (error) => isRecord2(error) && error.__absTimeout === true, toStreamingSlot = (slot, policy) => ({
|
|
410
433
|
errorHtml: slot.errorHtml === undefined ? policy.errorHtml : slot.errorHtml,
|
|
411
434
|
fallbackHtml: normalizeSlotText(slot.fallbackHtml, policy.fallbackHtml),
|
|
412
435
|
id: slot.id ?? createStreamingSlotId(),
|
|
@@ -988,6 +1011,19 @@ var colors2, frameworkColors, formatPath = (filePath) => {
|
|
|
988
1011
|
const errorMsg = error instanceof Error ? error.message : error;
|
|
989
1012
|
const fullMessage = `${colors2.red}error${colors2.reset} ${message}${errorMsg ? `: ${errorMsg}` : ""}`;
|
|
990
1013
|
console.error(`${timestamp} ${tag} ${fullMessage}`);
|
|
1014
|
+
}, logHmrClientUpdate = (path, framework, duration, target, serverMs, clientMs, outcome = "applied", kind) => {
|
|
1015
|
+
const timestamp = `${colors2.dim}${formatTimestamp()}${colors2.reset}`;
|
|
1016
|
+
const targetLabel = target.startsWith("capacitor-") ? target.slice("capacitor-".length) : target;
|
|
1017
|
+
const tag = `${colors2.cyan}[hmr:${targetLabel}]${colors2.reset}`;
|
|
1018
|
+
const pathColor = framework ? getFrameworkColor(framework) : colors2.white;
|
|
1019
|
+
const breakdown = serverMs === undefined || clientMs === undefined ? "" : `; server ${serverMs}ms, client ${clientMs}ms`;
|
|
1020
|
+
let action = "failed after";
|
|
1021
|
+
if (outcome === "applied")
|
|
1022
|
+
action = "applied in";
|
|
1023
|
+
else if (outcome === "reloaded")
|
|
1024
|
+
action = "falling back to reload after";
|
|
1025
|
+
const kindLabel = kind ? `${kind} ` : "";
|
|
1026
|
+
console.log(`${timestamp} ${tag} ${framework ?? "update"} ${kindLabel}${pathColor}${formatPath(path)}${colors2.reset} ${colors2.dim}${action} ${duration}ms${breakdown}${colors2.reset}`);
|
|
991
1027
|
}, logHmrUpdate = (path, framework, duration) => {
|
|
992
1028
|
log("hmr update", { duration, framework, path });
|
|
993
1029
|
}, logInfo = (message) => {
|
|
@@ -1091,168 +1127,504 @@ var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-
|
|
|
1091
1127
|
return normalizeSlug(str).split(/[-_]/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()).join("");
|
|
1092
1128
|
};
|
|
1093
1129
|
|
|
1094
|
-
// src/
|
|
1095
|
-
|
|
1096
|
-
var
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
const value = Reflect.get(globalThis, STREAMING_SLOT_REGISTRAR_KEY);
|
|
1100
|
-
if (typeof value === "function" || value === null) {
|
|
1130
|
+
// src/utils/resolveConvention.ts
|
|
1131
|
+
import { basename } from "path";
|
|
1132
|
+
var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boolean(value) && typeof value === "object", getMap = () => {
|
|
1133
|
+
const value = Reflect.get(globalThis, CONVENTIONS_KEY);
|
|
1134
|
+
if (isConventionsMap(value))
|
|
1101
1135
|
return value;
|
|
1102
|
-
}
|
|
1103
|
-
return;
|
|
1104
|
-
}
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
};
|
|
1120
|
-
var hasRegisteredStreamingSlotRegistrar = () => typeof getRegisteredStreamingSlotRegistrar() === "function";
|
|
1121
|
-
var isStreamingSlotCollectionActive = () => getCollectionController()?.isCollecting() === true;
|
|
1122
|
-
var registerStreamingSlot = (slot) => {
|
|
1123
|
-
getRegisteredStreamingSlotRegistrar()?.(slot);
|
|
1124
|
-
};
|
|
1125
|
-
var setStreamingSlotCollectionController = (controller) => {
|
|
1126
|
-
Reflect.set(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY, controller);
|
|
1127
|
-
};
|
|
1128
|
-
var setStreamingSlotRegistrar = (nextRegistrar) => {
|
|
1129
|
-
Reflect.set(globalThis, STREAMING_SLOT_REGISTRAR_KEY, nextRegistrar);
|
|
1130
|
-
};
|
|
1131
|
-
var setStreamingSlotWarningController = (controller) => {
|
|
1132
|
-
Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY, controller);
|
|
1133
|
-
};
|
|
1134
|
-
var warnMissingStreamingSlotCollector = (primitiveName) => {
|
|
1135
|
-
if (isStreamingSlotCollectionActive()) {
|
|
1136
|
+
const empty = {};
|
|
1137
|
+
return empty;
|
|
1138
|
+
}, derivePageName = (pagePath) => {
|
|
1139
|
+
const base = basename(pagePath);
|
|
1140
|
+
const dotIndex = base.indexOf(".");
|
|
1141
|
+
const name = dotIndex > 0 ? base.slice(0, dotIndex) : base;
|
|
1142
|
+
return toPascal(name);
|
|
1143
|
+
}, normalizeConventionPageName = (name) => toPascal(name).replace(/\d+$/, ""), hasErrorConvention = (framework) => {
|
|
1144
|
+
const conventions = getMap()[framework];
|
|
1145
|
+
if (!conventions)
|
|
1146
|
+
return false;
|
|
1147
|
+
if (conventions.defaults?.error)
|
|
1148
|
+
return true;
|
|
1149
|
+
return Object.values(conventions.pages ?? {}).some((page) => Boolean(page.error));
|
|
1150
|
+
}, resolveErrorConventionPath = (framework, pageName) => {
|
|
1151
|
+
const conventions = getMap()[framework];
|
|
1152
|
+
if (!conventions)
|
|
1136
1153
|
return;
|
|
1154
|
+
const exact = conventions.pages?.[pageName]?.error;
|
|
1155
|
+
if (exact)
|
|
1156
|
+
return exact;
|
|
1157
|
+
const normalizedPageName = normalizeConventionPageName(pageName);
|
|
1158
|
+
for (const [candidate, page] of Object.entries(conventions.pages ?? {})) {
|
|
1159
|
+
if (normalizeConventionPageName(candidate) === normalizedPageName) {
|
|
1160
|
+
return page.error ?? conventions.defaults?.error;
|
|
1161
|
+
}
|
|
1137
1162
|
}
|
|
1138
|
-
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
|
|
1144
|
-
var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
|
|
1145
|
-
var getStorageGlobal = () => {
|
|
1146
|
-
const value = Reflect.get(globalThis, STREAMING_SLOT_STORAGE_KEY);
|
|
1147
|
-
if (value === null || typeof value === "undefined") {
|
|
1148
|
-
return value;
|
|
1149
|
-
}
|
|
1150
|
-
return isAsyncLocalStorage(value) ? value : undefined;
|
|
1151
|
-
};
|
|
1152
|
-
var isServerRuntime = () => typeof process !== "undefined" && typeof process.versions?.node === "string";
|
|
1153
|
-
var ensureAsyncLocalStorage = async () => {
|
|
1154
|
-
const storage = getStorageGlobal();
|
|
1155
|
-
if (typeof storage !== "undefined") {
|
|
1156
|
-
return storage;
|
|
1157
|
-
}
|
|
1158
|
-
if (!isServerRuntime()) {
|
|
1159
|
-
Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, null);
|
|
1160
|
-
return getStorageGlobal();
|
|
1161
|
-
}
|
|
1162
|
-
const mod = await import("async_hooks");
|
|
1163
|
-
Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, new mod.AsyncLocalStorage);
|
|
1164
|
-
return getStorageGlobal();
|
|
1165
|
-
};
|
|
1166
|
-
var getActiveSlotStore = () => {
|
|
1167
|
-
const storage = getStorageGlobal();
|
|
1168
|
-
if (!storage)
|
|
1169
|
-
return;
|
|
1170
|
-
return storage.getStore();
|
|
1171
|
-
};
|
|
1172
|
-
var registerStreamingSlot2 = (slot) => {
|
|
1173
|
-
const store = getActiveSlotStore();
|
|
1174
|
-
if (!store)
|
|
1175
|
-
return;
|
|
1176
|
-
store.set(slot.id, slot);
|
|
1177
|
-
};
|
|
1178
|
-
setStreamingSlotRegistrar(registerStreamingSlot2);
|
|
1179
|
-
setStreamingSlotCollectionController({
|
|
1180
|
-
isCollecting: () => getActiveSlotStore() !== undefined
|
|
1181
|
-
});
|
|
1182
|
-
var hasActiveStreamingSlotRegistry = () => getActiveSlotStore() !== undefined;
|
|
1183
|
-
var runWithStreamingSlotRegistry = async (task) => {
|
|
1184
|
-
const storage = await ensureAsyncLocalStorage();
|
|
1185
|
-
if (!storage) {
|
|
1186
|
-
const slots = [];
|
|
1163
|
+
return conventions.defaults?.error;
|
|
1164
|
+
}, resolveNotFoundConventionPath = (framework) => getMap()[framework]?.defaults?.notFound, setConventions = (map) => {
|
|
1165
|
+
Reflect.set(globalThis, CONVENTIONS_KEY, map);
|
|
1166
|
+
}, isDev = () => true, buildErrorProps = (error) => {
|
|
1167
|
+
if (error instanceof Error) {
|
|
1187
1168
|
return {
|
|
1188
|
-
|
|
1189
|
-
|
|
1169
|
+
message: error.message,
|
|
1170
|
+
name: error.name,
|
|
1171
|
+
...isDev() && error.stack ? { stack: error.stack } : {}
|
|
1190
1172
|
};
|
|
1191
1173
|
}
|
|
1192
|
-
return
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1174
|
+
return { message: String(error), name: "Error" };
|
|
1175
|
+
}, renderReactError = async (conventionPath, errorProps) => {
|
|
1176
|
+
const { createElement } = await import("react");
|
|
1177
|
+
const { renderToReadableStream } = await import("react-dom/server");
|
|
1178
|
+
const mod = await import(conventionPath);
|
|
1179
|
+
const ErrorComponent = mod.default;
|
|
1180
|
+
if (typeof ErrorComponent !== "function")
|
|
1181
|
+
return null;
|
|
1182
|
+
const element = createElement(ErrorComponent, errorProps);
|
|
1183
|
+
const stream = await renderToReadableStream(element);
|
|
1184
|
+
return new Response(stream, {
|
|
1185
|
+
headers: { "Content-Type": "text/html" },
|
|
1186
|
+
status: 500
|
|
1199
1187
|
});
|
|
1188
|
+
}, renderSvelteError = async (conventionPath, errorProps) => {
|
|
1189
|
+
const { render } = await import("svelte/server");
|
|
1190
|
+
const mod = await import(conventionPath);
|
|
1191
|
+
const ErrorComponent = mod.default;
|
|
1192
|
+
if (!ErrorComponent)
|
|
1193
|
+
return null;
|
|
1194
|
+
const { head, body } = render(ErrorComponent, {
|
|
1195
|
+
props: errorProps
|
|
1196
|
+
});
|
|
1197
|
+
const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
|
|
1198
|
+
return new Response(html, {
|
|
1199
|
+
headers: { "Content-Type": "text/html" },
|
|
1200
|
+
status: 500
|
|
1201
|
+
});
|
|
1202
|
+
}, unescapeVueStyles = (ssrBody) => {
|
|
1203
|
+
let styles = "";
|
|
1204
|
+
const body = ssrBody.replace(/<style>([\s\S]*?)<\/style>/g, (_, css) => {
|
|
1205
|
+
styles += `<style>${css.replace(/"/g, '"').replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}</style>`;
|
|
1206
|
+
return "";
|
|
1207
|
+
});
|
|
1208
|
+
return { body, styles };
|
|
1209
|
+
}, renderVueError = async (conventionPath, errorProps) => {
|
|
1210
|
+
const { createSSRApp, h } = await import("vue");
|
|
1211
|
+
const { renderToString } = await import("vue/server-renderer");
|
|
1212
|
+
const mod = await import(conventionPath);
|
|
1213
|
+
const ErrorComponent = mod.default;
|
|
1214
|
+
if (!ErrorComponent)
|
|
1215
|
+
return null;
|
|
1216
|
+
const app = createSSRApp({
|
|
1217
|
+
render: () => h(ErrorComponent, errorProps)
|
|
1218
|
+
});
|
|
1219
|
+
const rawBody = await renderToString(app);
|
|
1220
|
+
const { styles, body } = unescapeVueStyles(rawBody);
|
|
1221
|
+
const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
|
|
1222
|
+
return new Response(html, {
|
|
1223
|
+
headers: { "Content-Type": "text/html" },
|
|
1224
|
+
status: 500
|
|
1225
|
+
});
|
|
1226
|
+
}, renderAngularError = async (conventionPath, errorProps) => {
|
|
1227
|
+
const mod = await import(conventionPath);
|
|
1228
|
+
const renderFn = mod.default;
|
|
1229
|
+
if (typeof renderFn !== "function")
|
|
1230
|
+
return null;
|
|
1231
|
+
const html = renderFn(errorProps);
|
|
1232
|
+
return new Response(html, {
|
|
1233
|
+
headers: { "Content-Type": "text/html" },
|
|
1234
|
+
status: 500
|
|
1235
|
+
});
|
|
1236
|
+
}, escapeHtml = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"), replaceErrorTokens = (template, errorProps) => template.replace(/\{\{\s*name\s*\}\}/g, escapeHtml(errorProps.name)).replace(/\{\{\s*message\s*\}\}/g, escapeHtml(errorProps.message)).replace(/\{\{\s*stack\s*\}\}/g, errorProps.stack ? escapeHtml(errorProps.stack) : ""), renderHtmlError = async (conventionPath, errorProps) => {
|
|
1237
|
+
const template = await Bun.file(conventionPath).text();
|
|
1238
|
+
const html = replaceErrorTokens(template, errorProps);
|
|
1239
|
+
return new Response(html, {
|
|
1240
|
+
headers: { "Content-Type": "text/html" },
|
|
1241
|
+
status: 500
|
|
1242
|
+
});
|
|
1243
|
+
}, logConventionRenderError = (framework, label, renderError) => {
|
|
1244
|
+
const message = renderError instanceof Error ? renderError.message : "";
|
|
1245
|
+
if (message.includes("Cannot find module") || message.includes("Cannot find package") || message.includes("not found in module")) {
|
|
1246
|
+
console.error(`[SSR] Convention ${label} page for ${framework} failed: missing framework package. Ensure the ${framework} runtime is installed (e.g. bun add ${framework === "react" ? "react react-dom" : framework}).`);
|
|
1247
|
+
return;
|
|
1248
|
+
}
|
|
1249
|
+
console.error(`[SSR] Failed to render ${framework} convention ${label} page:`, renderError);
|
|
1250
|
+
}, renderEmberError = async () => null, renderEmberNotFound = async () => null, ERROR_RENDERERS, tryFrameworkErrorConvention = async (framework, pageName, errorProps, error) => {
|
|
1251
|
+
let conventionPath = resolveErrorConventionPath(framework, pageName);
|
|
1252
|
+
if (!conventionPath && error instanceof Error && error.stack) {
|
|
1253
|
+
for (const match of error.stack.matchAll(/^\s*at\s+([A-Za-z_$][\w$]*)/gm)) {
|
|
1254
|
+
const [, candidate] = match;
|
|
1255
|
+
if (!candidate)
|
|
1256
|
+
continue;
|
|
1257
|
+
conventionPath = resolveErrorConventionPath(framework, candidate);
|
|
1258
|
+
if (conventionPath)
|
|
1259
|
+
break;
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
if (!conventionPath)
|
|
1263
|
+
return null;
|
|
1264
|
+
const renderer = ERROR_RENDERERS[framework];
|
|
1265
|
+
if (!renderer)
|
|
1266
|
+
return null;
|
|
1267
|
+
try {
|
|
1268
|
+
return await renderer(conventionPath, errorProps);
|
|
1269
|
+
} catch (renderError) {
|
|
1270
|
+
logConventionRenderError(framework, "error", renderError);
|
|
1271
|
+
}
|
|
1272
|
+
return null;
|
|
1273
|
+
}, renderConventionError = async (framework, pageName, error) => {
|
|
1274
|
+
const errorProps = buildErrorProps(error);
|
|
1275
|
+
const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
|
|
1276
|
+
if (frameworkResponse)
|
|
1277
|
+
return frameworkResponse;
|
|
1278
|
+
if (framework !== "html") {
|
|
1279
|
+
const htmlResponse = await tryFrameworkErrorConvention("html", pageName, errorProps, error);
|
|
1280
|
+
if (htmlResponse)
|
|
1281
|
+
return htmlResponse;
|
|
1282
|
+
}
|
|
1283
|
+
return null;
|
|
1284
|
+
}, renderReactNotFound = async (conventionPath) => {
|
|
1285
|
+
const { createElement } = await import("react");
|
|
1286
|
+
const { renderToReadableStream } = await import("react-dom/server");
|
|
1287
|
+
const mod = await import(conventionPath);
|
|
1288
|
+
const NotFoundComponent = mod.default;
|
|
1289
|
+
if (typeof NotFoundComponent !== "function")
|
|
1290
|
+
return null;
|
|
1291
|
+
const element = createElement(NotFoundComponent);
|
|
1292
|
+
const stream = await renderToReadableStream(element);
|
|
1293
|
+
return new Response(stream, {
|
|
1294
|
+
headers: { "Content-Type": "text/html" },
|
|
1295
|
+
status: 404
|
|
1296
|
+
});
|
|
1297
|
+
}, renderSvelteNotFound = async (conventionPath) => {
|
|
1298
|
+
const { render } = await import("svelte/server");
|
|
1299
|
+
const mod = await import(conventionPath);
|
|
1300
|
+
const NotFoundComponent = mod.default;
|
|
1301
|
+
if (!NotFoundComponent)
|
|
1302
|
+
return null;
|
|
1303
|
+
const { head, body } = render(NotFoundComponent);
|
|
1304
|
+
const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
|
|
1305
|
+
return new Response(html, {
|
|
1306
|
+
headers: { "Content-Type": "text/html" },
|
|
1307
|
+
status: 404
|
|
1308
|
+
});
|
|
1309
|
+
}, renderVueNotFound = async (conventionPath) => {
|
|
1310
|
+
const { createSSRApp, h } = await import("vue");
|
|
1311
|
+
const { renderToString } = await import("vue/server-renderer");
|
|
1312
|
+
const mod = await import(conventionPath);
|
|
1313
|
+
const NotFoundComponent = mod.default;
|
|
1314
|
+
if (!NotFoundComponent)
|
|
1315
|
+
return null;
|
|
1316
|
+
const app = createSSRApp({
|
|
1317
|
+
render: () => h(NotFoundComponent)
|
|
1318
|
+
});
|
|
1319
|
+
const rawBody = await renderToString(app);
|
|
1320
|
+
const { styles, body } = unescapeVueStyles(rawBody);
|
|
1321
|
+
const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
|
|
1322
|
+
return new Response(html, {
|
|
1323
|
+
headers: { "Content-Type": "text/html" },
|
|
1324
|
+
status: 404
|
|
1325
|
+
});
|
|
1326
|
+
}, renderAngularNotFound = async (conventionPath) => {
|
|
1327
|
+
const mod = await import(conventionPath);
|
|
1328
|
+
const renderFn = mod.default;
|
|
1329
|
+
if (typeof renderFn !== "function")
|
|
1330
|
+
return null;
|
|
1331
|
+
const html = renderFn();
|
|
1332
|
+
return new Response(html, {
|
|
1333
|
+
headers: { "Content-Type": "text/html" },
|
|
1334
|
+
status: 404
|
|
1335
|
+
});
|
|
1336
|
+
}, renderHtmlNotFound = async (conventionPath) => {
|
|
1337
|
+
const html = await Bun.file(conventionPath).text();
|
|
1338
|
+
return new Response(html, {
|
|
1339
|
+
headers: { "Content-Type": "text/html" },
|
|
1340
|
+
status: 404
|
|
1341
|
+
});
|
|
1342
|
+
}, NOT_FOUND_RENDERERS, renderConventionNotFound = async (framework) => {
|
|
1343
|
+
const conventionPath = resolveNotFoundConventionPath(framework);
|
|
1344
|
+
if (!conventionPath)
|
|
1345
|
+
return null;
|
|
1346
|
+
const renderer = NOT_FOUND_RENDERERS[framework];
|
|
1347
|
+
if (!renderer)
|
|
1348
|
+
return null;
|
|
1349
|
+
try {
|
|
1350
|
+
return await renderer(conventionPath);
|
|
1351
|
+
} catch (renderError) {
|
|
1352
|
+
logConventionRenderError(framework, "not-found", renderError);
|
|
1353
|
+
}
|
|
1354
|
+
return null;
|
|
1355
|
+
}, NOT_FOUND_PRIORITY, renderFirstNotFound = async () => {
|
|
1356
|
+
const renderNext = async (frameworks2) => {
|
|
1357
|
+
const [framework, ...remaining] = frameworks2;
|
|
1358
|
+
if (!framework) {
|
|
1359
|
+
return null;
|
|
1360
|
+
}
|
|
1361
|
+
if (!getMap()[framework]?.defaults?.notFound) {
|
|
1362
|
+
return renderNext(remaining);
|
|
1363
|
+
}
|
|
1364
|
+
const response = await renderConventionNotFound(framework);
|
|
1365
|
+
if (response) {
|
|
1366
|
+
return response;
|
|
1367
|
+
}
|
|
1368
|
+
return renderNext(remaining);
|
|
1369
|
+
};
|
|
1370
|
+
return renderNext(NOT_FOUND_PRIORITY);
|
|
1371
|
+
};
|
|
1372
|
+
var init_resolveConvention = __esm(() => {
|
|
1373
|
+
ERROR_RENDERERS = {
|
|
1374
|
+
angular: renderAngularError,
|
|
1375
|
+
ember: renderEmberError,
|
|
1376
|
+
html: renderHtmlError,
|
|
1377
|
+
react: renderReactError,
|
|
1378
|
+
svelte: renderSvelteError,
|
|
1379
|
+
vue: renderVueError
|
|
1380
|
+
};
|
|
1381
|
+
NOT_FOUND_RENDERERS = {
|
|
1382
|
+
angular: renderAngularNotFound,
|
|
1383
|
+
ember: renderEmberNotFound,
|
|
1384
|
+
html: renderHtmlNotFound,
|
|
1385
|
+
react: renderReactNotFound,
|
|
1386
|
+
svelte: renderSvelteNotFound,
|
|
1387
|
+
vue: renderVueNotFound
|
|
1388
|
+
};
|
|
1389
|
+
NOT_FOUND_PRIORITY = [
|
|
1390
|
+
"react",
|
|
1391
|
+
"svelte",
|
|
1392
|
+
"vue",
|
|
1393
|
+
"angular",
|
|
1394
|
+
"html"
|
|
1395
|
+
];
|
|
1396
|
+
});
|
|
1397
|
+
|
|
1398
|
+
// src/utils/spaRouteManifest.ts
|
|
1399
|
+
import { basename as basename2 } from "path";
|
|
1400
|
+
var SPA_ROUTES_KEY = "__absoluteSpaRoutes", setSpaRouteManifest = (hosts) => {
|
|
1401
|
+
Reflect.set(globalThis, SPA_ROUTES_KEY, hosts);
|
|
1402
|
+
}, isRuntimeSpaHost = (value) => typeof value === "object" && value !== null && typeof Reflect.get(value, "framework") === "string", getSpaRouteManifest = () => {
|
|
1403
|
+
const value = Reflect.get(globalThis, SPA_ROUTES_KEY);
|
|
1404
|
+
return Array.isArray(value) ? value.filter(isRuntimeSpaHost) : [];
|
|
1405
|
+
}, normalizePath = (path) => {
|
|
1406
|
+
const withLeadingSlash = path.startsWith("/") ? path : `/${path}`;
|
|
1407
|
+
const trimmed = withLeadingSlash.replace(/\/+$/, "");
|
|
1408
|
+
return trimmed || "/";
|
|
1409
|
+
}, fullRoutePath = (baseHref, routePath) => {
|
|
1410
|
+
const base = normalizePath(baseHref);
|
|
1411
|
+
const route = normalizePath(routePath);
|
|
1412
|
+
if (base !== "/" && (route === base || route.startsWith(`${base}/`))) {
|
|
1413
|
+
return route;
|
|
1414
|
+
}
|
|
1415
|
+
if (base === "/")
|
|
1416
|
+
return route;
|
|
1417
|
+
return normalizePath(`${base}/${route.replace(/^\/+/, "")}`);
|
|
1418
|
+
}, routePattern = (path) => {
|
|
1419
|
+
const segments = normalizePath(path).split("/").filter(Boolean);
|
|
1420
|
+
let expression = "^";
|
|
1421
|
+
for (const segment of segments) {
|
|
1422
|
+
if (segment === "*" || segment === "**") {
|
|
1423
|
+
expression += "(?:/.*)?";
|
|
1424
|
+
continue;
|
|
1425
|
+
}
|
|
1426
|
+
const parameter = /^:[A-Za-z_$][A-Za-z0-9_$]*(?:\((.*)\))?(\?)?$/.exec(segment);
|
|
1427
|
+
if (parameter) {
|
|
1428
|
+
const valuePattern = parameter[1] || "[^/]+";
|
|
1429
|
+
expression += parameter[2] ? `(?:/${valuePattern})?` : `/${valuePattern}`;
|
|
1430
|
+
continue;
|
|
1431
|
+
}
|
|
1432
|
+
expression += `/${segment.replace(/[.+?^${}()|[\]\\]/g, "\\$&")}`;
|
|
1433
|
+
}
|
|
1434
|
+
return new RegExp(`${expression || "^/"}/?$`);
|
|
1435
|
+
}, sourcePageName = (sourceFile) => basename2(sourceFile).replace(/\.[^.]+$/, "").toLowerCase(), isKnownSpaRoute = (framework, pageName, request) => {
|
|
1436
|
+
if (!request)
|
|
1437
|
+
return true;
|
|
1438
|
+
let pathname;
|
|
1439
|
+
try {
|
|
1440
|
+
pathname = normalizePath(new URL(request.url).pathname);
|
|
1441
|
+
} catch {
|
|
1442
|
+
return true;
|
|
1443
|
+
}
|
|
1444
|
+
const hosts = getSpaRouteManifest().filter((host) => {
|
|
1445
|
+
if (host.framework !== framework)
|
|
1446
|
+
return false;
|
|
1447
|
+
if (sourcePageName(host.sourceFile) !== pageName.toLowerCase())
|
|
1448
|
+
return false;
|
|
1449
|
+
const base = normalizePath(host.baseHref);
|
|
1450
|
+
return base === "/" || pathname === base || pathname.startsWith(`${base}/`);
|
|
1451
|
+
});
|
|
1452
|
+
if (hosts.length === 0)
|
|
1453
|
+
return true;
|
|
1454
|
+
return hosts.some((host) => host.routes.some((route) => routePattern(fullRoutePath(host.baseHref, route.path)).test(pathname)));
|
|
1455
|
+
}, renderSpaNotFound = async (framework, pageName, request) => {
|
|
1456
|
+
if (isKnownSpaRoute(framework, pageName, request))
|
|
1457
|
+
return null;
|
|
1458
|
+
return await renderFirstNotFound() ?? new Response("Not found", {
|
|
1459
|
+
headers: { "Content-Type": "text/plain" },
|
|
1460
|
+
status: 404
|
|
1461
|
+
});
|
|
1462
|
+
};
|
|
1463
|
+
var init_spaRouteManifest = __esm(() => {
|
|
1464
|
+
init_resolveConvention();
|
|
1465
|
+
});
|
|
1466
|
+
|
|
1467
|
+
// src/core/streamingSlotRegistrar.ts
|
|
1468
|
+
var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
|
|
1469
|
+
var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
|
|
1470
|
+
var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
|
|
1471
|
+
var getRegisteredStreamingSlotRegistrar = () => {
|
|
1472
|
+
const value = Reflect.get(globalThis, STREAMING_SLOT_REGISTRAR_KEY);
|
|
1473
|
+
if (typeof value === "function" || value === null) {
|
|
1474
|
+
return value;
|
|
1475
|
+
}
|
|
1476
|
+
return;
|
|
1477
|
+
};
|
|
1478
|
+
var isObjectRecord = (value) => Boolean(value) && typeof value === "object";
|
|
1479
|
+
var isStreamingSlotWarningController = (value) => isObjectRecord(value) && ("maybeWarn" in value) && typeof value.maybeWarn === "function";
|
|
1480
|
+
var isStreamingSlotCollectionController = (value) => isObjectRecord(value) && ("isCollecting" in value) && typeof value.isCollecting === "function";
|
|
1481
|
+
var getWarningController = () => {
|
|
1482
|
+
const value = Reflect.get(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY);
|
|
1483
|
+
if (value === null || typeof value === "undefined")
|
|
1484
|
+
return;
|
|
1485
|
+
return isStreamingSlotWarningController(value) ? value : undefined;
|
|
1486
|
+
};
|
|
1487
|
+
var getCollectionController = () => {
|
|
1488
|
+
const value = Reflect.get(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY);
|
|
1489
|
+
if (value === null || typeof value === "undefined")
|
|
1490
|
+
return;
|
|
1491
|
+
return isStreamingSlotCollectionController(value) ? value : undefined;
|
|
1492
|
+
};
|
|
1493
|
+
var hasRegisteredStreamingSlotRegistrar = () => typeof getRegisteredStreamingSlotRegistrar() === "function";
|
|
1494
|
+
var isStreamingSlotCollectionActive = () => getCollectionController()?.isCollecting() === true;
|
|
1495
|
+
var registerStreamingSlot = (slot) => {
|
|
1496
|
+
getRegisteredStreamingSlotRegistrar()?.(slot);
|
|
1497
|
+
};
|
|
1498
|
+
var setStreamingSlotCollectionController = (controller) => {
|
|
1499
|
+
Reflect.set(globalThis, STREAMING_SLOT_COLLECTION_STORAGE_KEY, controller);
|
|
1500
|
+
};
|
|
1501
|
+
var setStreamingSlotRegistrar = (nextRegistrar) => {
|
|
1502
|
+
Reflect.set(globalThis, STREAMING_SLOT_REGISTRAR_KEY, nextRegistrar);
|
|
1503
|
+
};
|
|
1504
|
+
var setStreamingSlotWarningController = (controller) => {
|
|
1505
|
+
Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY, controller);
|
|
1506
|
+
};
|
|
1507
|
+
var warnMissingStreamingSlotCollector = (primitiveName) => {
|
|
1508
|
+
if (isStreamingSlotCollectionActive()) {
|
|
1509
|
+
return;
|
|
1510
|
+
}
|
|
1511
|
+
getWarningController()?.maybeWarn(primitiveName);
|
|
1512
|
+
};
|
|
1513
|
+
|
|
1514
|
+
// src/core/streamingSlotRegistry.ts
|
|
1515
|
+
var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
|
|
1516
|
+
var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
|
|
1517
|
+
var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
|
|
1518
|
+
var getStorageGlobal = () => {
|
|
1519
|
+
const value = Reflect.get(globalThis, STREAMING_SLOT_STORAGE_KEY);
|
|
1520
|
+
if (value === null || typeof value === "undefined") {
|
|
1521
|
+
return value;
|
|
1522
|
+
}
|
|
1523
|
+
return isAsyncLocalStorage(value) ? value : undefined;
|
|
1524
|
+
};
|
|
1525
|
+
var isServerRuntime = () => typeof process !== "undefined" && typeof process.versions?.node === "string";
|
|
1526
|
+
var ensureAsyncLocalStorage = async () => {
|
|
1527
|
+
const storage = getStorageGlobal();
|
|
1528
|
+
if (typeof storage !== "undefined") {
|
|
1529
|
+
return storage;
|
|
1530
|
+
}
|
|
1531
|
+
if (!isServerRuntime()) {
|
|
1532
|
+
Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, null);
|
|
1533
|
+
return getStorageGlobal();
|
|
1534
|
+
}
|
|
1535
|
+
const mod = await import("async_hooks");
|
|
1536
|
+
Reflect.set(globalThis, STREAMING_SLOT_STORAGE_KEY, new mod.AsyncLocalStorage);
|
|
1537
|
+
return getStorageGlobal();
|
|
1538
|
+
};
|
|
1539
|
+
var getActiveSlotStore = () => {
|
|
1540
|
+
const storage = getStorageGlobal();
|
|
1541
|
+
if (!storage)
|
|
1542
|
+
return;
|
|
1543
|
+
return storage.getStore();
|
|
1544
|
+
};
|
|
1545
|
+
var registerStreamingSlot2 = (slot) => {
|
|
1546
|
+
const store = getActiveSlotStore();
|
|
1547
|
+
if (!store)
|
|
1548
|
+
return;
|
|
1549
|
+
store.set(slot.id, slot);
|
|
1550
|
+
};
|
|
1551
|
+
setStreamingSlotRegistrar(registerStreamingSlot2);
|
|
1552
|
+
setStreamingSlotCollectionController({
|
|
1553
|
+
isCollecting: () => getActiveSlotStore() !== undefined
|
|
1554
|
+
});
|
|
1555
|
+
var hasActiveStreamingSlotRegistry = () => getActiveSlotStore() !== undefined;
|
|
1556
|
+
var runWithStreamingSlotRegistry = async (task) => {
|
|
1557
|
+
const storage = await ensureAsyncLocalStorage();
|
|
1558
|
+
if (!storage) {
|
|
1559
|
+
const slots = [];
|
|
1560
|
+
return {
|
|
1561
|
+
result: await task(),
|
|
1562
|
+
slots
|
|
1563
|
+
};
|
|
1564
|
+
}
|
|
1565
|
+
return storage.run(new Map, async () => {
|
|
1566
|
+
const result = await task();
|
|
1567
|
+
const store = storage.getStore();
|
|
1568
|
+
return {
|
|
1569
|
+
result,
|
|
1570
|
+
slots: store ? [...store.values()] : []
|
|
1571
|
+
};
|
|
1572
|
+
});
|
|
1573
|
+
};
|
|
1574
|
+
|
|
1575
|
+
// src/core/islandPageContext.ts
|
|
1576
|
+
var BOOTSTRAP_MANIFEST_KEY = "BootstrapClient";
|
|
1577
|
+
var ISLAND_MARKER = 'data-island="true"';
|
|
1578
|
+
var MANIFEST_MARKER = "__ABSOLUTE_MANIFEST__";
|
|
1579
|
+
var ISLAND_STATE_MARKER = "__ABS_ISLAND_STATE__";
|
|
1580
|
+
var CLOSING_HEAD_TAG = "</head>";
|
|
1581
|
+
var buildIslandsHeadMarkup = (manifest) => {
|
|
1582
|
+
const manifestScript = `<script>window.__ABSOLUTE_MANIFEST__ = ${JSON.stringify(manifest)}</script>`;
|
|
1583
|
+
const islandStateScript = `<script>window.__ABS_ISLAND_STATE__ = ${JSON.stringify(globalThis.__ABS_ISLAND_STATE__ ?? {})}</script>`;
|
|
1584
|
+
const bootstrapPath = manifest[BOOTSTRAP_MANIFEST_KEY];
|
|
1585
|
+
const bootstrapScript = bootstrapPath ? `<script type="module" src="${bootstrapPath}"></script>` : "";
|
|
1586
|
+
return `${manifestScript}${islandStateScript}${bootstrapScript}`;
|
|
1587
|
+
};
|
|
1588
|
+
var injectHeadMarkup = (html, markup) => {
|
|
1589
|
+
const closingHeadIndex = html.indexOf("</head>");
|
|
1590
|
+
if (closingHeadIndex >= 0) {
|
|
1591
|
+
return `${html.slice(0, closingHeadIndex)}${markup}${html.slice(closingHeadIndex)}`;
|
|
1592
|
+
}
|
|
1593
|
+
const openingBodyIndex = html.indexOf("<body");
|
|
1594
|
+
if (openingBodyIndex >= 0) {
|
|
1595
|
+
const bodyStart = html.indexOf(">", openingBodyIndex);
|
|
1596
|
+
if (bodyStart >= 0) {
|
|
1597
|
+
return `${html.slice(0, openingBodyIndex)}<head>${markup}</head>${html.slice(openingBodyIndex)}`;
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
return `<!DOCTYPE html><html><head>${markup}</head><body>${html}</body></html>`;
|
|
1601
|
+
};
|
|
1602
|
+
var streamChunkToString = (value, decoder) => typeof value === "string" ? value : decoder.decode(value, { stream: true });
|
|
1603
|
+
var flushSafePendingText = (controller, encoder, pending, lookbehind) => {
|
|
1604
|
+
if (pending.length <= lookbehind) {
|
|
1605
|
+
return pending;
|
|
1606
|
+
}
|
|
1607
|
+
const safeText = pending.slice(0, pending.length - lookbehind);
|
|
1608
|
+
controller.enqueue(encoder.encode(safeText));
|
|
1609
|
+
return pending.slice(-lookbehind);
|
|
1610
|
+
};
|
|
1611
|
+
var updateInjectedState = (consumed, injected, pending) => {
|
|
1612
|
+
if (consumed.done) {
|
|
1613
|
+
return { done: true, injected, pending };
|
|
1614
|
+
}
|
|
1615
|
+
return {
|
|
1616
|
+
done: false,
|
|
1617
|
+
injected: consumed.injected,
|
|
1618
|
+
pending: consumed.pending
|
|
1619
|
+
};
|
|
1620
|
+
};
|
|
1621
|
+
var readStreamChunk = async (reader) => {
|
|
1622
|
+
const { done, value } = await reader.read();
|
|
1623
|
+
if (done || !value) {
|
|
1624
|
+
return { done, value: undefined };
|
|
1625
|
+
}
|
|
1626
|
+
return { done, value };
|
|
1200
1627
|
};
|
|
1201
|
-
|
|
1202
|
-
// src/core/islandPageContext.ts
|
|
1203
|
-
init_constants();
|
|
1204
|
-
var BOOTSTRAP_MANIFEST_KEY = "BootstrapClient";
|
|
1205
|
-
var ISLAND_MARKER = 'data-island="true"';
|
|
1206
|
-
var MANIFEST_MARKER = "__ABSOLUTE_MANIFEST__";
|
|
1207
|
-
var ISLAND_STATE_MARKER = "__ABS_ISLAND_STATE__";
|
|
1208
|
-
var CLOSING_HEAD_TAG = "</head>";
|
|
1209
|
-
var buildIslandsHeadMarkup = (manifest) => {
|
|
1210
|
-
const manifestScript = `<script>window.__ABSOLUTE_MANIFEST__ = ${JSON.stringify(manifest)}</script>`;
|
|
1211
|
-
const islandStateScript = `<script>window.__ABS_ISLAND_STATE__ = ${JSON.stringify(globalThis.__ABS_ISLAND_STATE__ ?? {})}</script>`;
|
|
1212
|
-
const bootstrapPath = manifest[BOOTSTRAP_MANIFEST_KEY];
|
|
1213
|
-
const bootstrapScript = bootstrapPath ? `<script type="module" src="${bootstrapPath}"></script>` : "";
|
|
1214
|
-
return `${manifestScript}${islandStateScript}${bootstrapScript}`;
|
|
1215
|
-
};
|
|
1216
|
-
var injectHeadMarkup = (html, markup) => {
|
|
1217
|
-
const closingHeadIndex = html.indexOf("</head>");
|
|
1218
|
-
if (closingHeadIndex >= 0) {
|
|
1219
|
-
return `${html.slice(0, closingHeadIndex)}${markup}${html.slice(closingHeadIndex)}`;
|
|
1220
|
-
}
|
|
1221
|
-
const openingBodyIndex = html.indexOf("<body");
|
|
1222
|
-
if (openingBodyIndex >= 0) {
|
|
1223
|
-
const bodyStart = html.indexOf(">", openingBodyIndex);
|
|
1224
|
-
if (bodyStart >= 0) {
|
|
1225
|
-
return `${html.slice(0, openingBodyIndex)}<head>${markup}</head>${html.slice(openingBodyIndex)}`;
|
|
1226
|
-
}
|
|
1227
|
-
}
|
|
1228
|
-
return `<!DOCTYPE html><html><head>${markup}</head><body>${html}</body></html>`;
|
|
1229
|
-
};
|
|
1230
|
-
var streamChunkToString = (value, decoder) => typeof value === "string" ? value : decoder.decode(value, { stream: true });
|
|
1231
|
-
var flushSafePendingText = (controller, encoder, pending, lookbehind) => {
|
|
1232
|
-
if (pending.length <= lookbehind) {
|
|
1233
|
-
return pending;
|
|
1234
|
-
}
|
|
1235
|
-
const safeText = pending.slice(0, pending.length - lookbehind);
|
|
1236
|
-
controller.enqueue(encoder.encode(safeText));
|
|
1237
|
-
return pending.slice(-lookbehind);
|
|
1238
|
-
};
|
|
1239
|
-
var updateInjectedState = (consumed, injected, pending) => {
|
|
1240
|
-
if (consumed.done) {
|
|
1241
|
-
return { done: true, injected, pending };
|
|
1242
|
-
}
|
|
1243
|
-
return {
|
|
1244
|
-
done: false,
|
|
1245
|
-
injected: consumed.injected,
|
|
1246
|
-
pending: consumed.pending
|
|
1247
|
-
};
|
|
1248
|
-
};
|
|
1249
|
-
var readStreamChunk = async (reader) => {
|
|
1250
|
-
const { done, value } = await reader.read();
|
|
1251
|
-
if (done || !value) {
|
|
1252
|
-
return { done, value: undefined };
|
|
1253
|
-
}
|
|
1254
|
-
return { done, value };
|
|
1255
|
-
};
|
|
1256
1628
|
var pipeStreamWithHeadInjection = (stream, markup) => {
|
|
1257
1629
|
const encoder = new TextEncoder;
|
|
1258
1630
|
const decoder = new TextDecoder;
|
|
@@ -1321,61 +1693,69 @@ var pipeStreamWithHeadInjection = (stream, markup) => {
|
|
|
1321
1693
|
var pipeStreamWithIslandMarkerDetection = (stream, markup) => {
|
|
1322
1694
|
const encoder = new TextEncoder;
|
|
1323
1695
|
const decoder = new TextDecoder;
|
|
1324
|
-
const
|
|
1325
|
-
const
|
|
1326
|
-
if (
|
|
1327
|
-
controller.enqueue(encoder.encode(
|
|
1328
|
-
return { injected, pending: "" };
|
|
1696
|
+
const headLookbehind = CLOSING_HEAD_TAG.length - 1;
|
|
1697
|
+
const enqueue = (controller, text) => {
|
|
1698
|
+
if (text.length > 0) {
|
|
1699
|
+
controller.enqueue(encoder.encode(text));
|
|
1329
1700
|
}
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
const next = `${pending.slice(0, injectAt)}${markup}${pending.slice(injectAt)}`;
|
|
1335
|
-
controller.enqueue(encoder.encode(next));
|
|
1336
|
-
return { injected: true, pending: "" };
|
|
1701
|
+
};
|
|
1702
|
+
const processHolding = (controller, held) => {
|
|
1703
|
+
if (!held.includes(ISLAND_MARKER)) {
|
|
1704
|
+
return { held, injected: false, pending: "", sawHead: true };
|
|
1337
1705
|
}
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
pending: flushSafePendingText(controller, encoder, pending, lookbehind)
|
|
1341
|
-
};
|
|
1706
|
+
enqueue(controller, `${markup}${held}`);
|
|
1707
|
+
return { held: "", injected: true, pending: "", sawHead: true };
|
|
1342
1708
|
};
|
|
1343
|
-
const
|
|
1344
|
-
const
|
|
1345
|
-
if (
|
|
1346
|
-
|
|
1709
|
+
const processHead = (controller, pending) => {
|
|
1710
|
+
const headIndex = pending.indexOf(CLOSING_HEAD_TAG);
|
|
1711
|
+
if (headIndex < 0) {
|
|
1712
|
+
return {
|
|
1713
|
+
held: "",
|
|
1714
|
+
injected: false,
|
|
1715
|
+
pending: flushSafePendingText(controller, encoder, pending, headLookbehind),
|
|
1716
|
+
sawHead: false
|
|
1717
|
+
};
|
|
1347
1718
|
}
|
|
1348
|
-
controller.
|
|
1719
|
+
enqueue(controller, pending.slice(0, headIndex));
|
|
1720
|
+
return processHolding(controller, pending.slice(headIndex));
|
|
1349
1721
|
};
|
|
1350
|
-
const
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
return
|
|
1722
|
+
const processChunk = (controller, state, chunk) => {
|
|
1723
|
+
if (state.injected) {
|
|
1724
|
+
enqueue(controller, chunk);
|
|
1725
|
+
return state;
|
|
1354
1726
|
}
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
pending: processed.pending
|
|
1360
|
-
};
|
|
1727
|
+
if (!state.sawHead) {
|
|
1728
|
+
return processHead(controller, state.pending + chunk);
|
|
1729
|
+
}
|
|
1730
|
+
return processHolding(controller, state.held + chunk);
|
|
1361
1731
|
};
|
|
1362
|
-
const
|
|
1363
|
-
const
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1732
|
+
const finishMarkerStream = (controller, state) => {
|
|
1733
|
+
const tail = decoder.decode();
|
|
1734
|
+
const remainder = state.injected ? tail : (state.sawHead ? state.held : state.pending) + tail;
|
|
1735
|
+
enqueue(controller, remainder);
|
|
1736
|
+
controller.close();
|
|
1737
|
+
};
|
|
1738
|
+
const runMarkerLoop = (controller, reader) => {
|
|
1739
|
+
const consumeNext = async (state) => {
|
|
1740
|
+
const { done, value } = await readStreamChunk(reader);
|
|
1741
|
+
if (done || !value) {
|
|
1742
|
+
return state;
|
|
1368
1743
|
}
|
|
1369
|
-
return
|
|
1744
|
+
return consumeNext(processChunk(controller, state, streamChunkToString(value, decoder)));
|
|
1370
1745
|
};
|
|
1371
|
-
return
|
|
1746
|
+
return consumeNext({
|
|
1747
|
+
held: "",
|
|
1748
|
+
injected: false,
|
|
1749
|
+
pending: "",
|
|
1750
|
+
sawHead: false
|
|
1751
|
+
});
|
|
1372
1752
|
};
|
|
1373
1753
|
return new ReadableStream({
|
|
1374
1754
|
async start(controller) {
|
|
1375
1755
|
const reader = stream.getReader();
|
|
1376
1756
|
try {
|
|
1377
|
-
const
|
|
1378
|
-
|
|
1757
|
+
const finalState = await runMarkerLoop(controller, reader);
|
|
1758
|
+
finishMarkerStream(controller, finalState);
|
|
1379
1759
|
} catch (error) {
|
|
1380
1760
|
controller.error(error);
|
|
1381
1761
|
}
|
|
@@ -1405,17 +1785,291 @@ var injectIslandPageContextStream = (stream, options) => {
|
|
|
1405
1785
|
if (options?.hasIslands === false) {
|
|
1406
1786
|
return stream;
|
|
1407
1787
|
}
|
|
1408
|
-
return pipeStreamWithIslandMarkerDetection(stream, markup);
|
|
1409
|
-
};
|
|
1410
|
-
var setCurrentIslandManifest = (manifest) => {
|
|
1411
|
-
globalThis.__absoluteManifest = manifest;
|
|
1788
|
+
return pipeStreamWithIslandMarkerDetection(stream, markup);
|
|
1789
|
+
};
|
|
1790
|
+
var setCurrentIslandManifest = (manifest) => {
|
|
1791
|
+
globalThis.__absoluteManifest = manifest;
|
|
1792
|
+
};
|
|
1793
|
+
|
|
1794
|
+
// src/react/pageHandler.ts
|
|
1795
|
+
init_devRouteRegistrationCallsite();
|
|
1796
|
+
|
|
1797
|
+
// src/core/requestContext.ts
|
|
1798
|
+
import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
|
|
1799
|
+
import { Elysia as Elysia2 } from "elysia";
|
|
1800
|
+
var REQUEST_STORAGE_KEY = Symbol.for("absolutejs.requestAsyncLocalStorage");
|
|
1801
|
+
var isAbsoluteRequestStorage = (value) => typeof value === "object" && value !== null && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
|
|
1802
|
+
var getRequestStorage = () => {
|
|
1803
|
+
const value = Reflect.get(globalThis, REQUEST_STORAGE_KEY);
|
|
1804
|
+
return isAbsoluteRequestStorage(value) ? value : undefined;
|
|
1805
|
+
};
|
|
1806
|
+
var ensureRequestStorage = () => {
|
|
1807
|
+
const existing = getRequestStorage();
|
|
1808
|
+
if (existing)
|
|
1809
|
+
return existing;
|
|
1810
|
+
const storage = new AsyncLocalStorage2;
|
|
1811
|
+
Reflect.set(globalThis, REQUEST_STORAGE_KEY, storage);
|
|
1812
|
+
return storage;
|
|
1813
|
+
};
|
|
1814
|
+
var absoluteRequestContext = new Elysia2({
|
|
1815
|
+
name: "absolutejs-request-context"
|
|
1816
|
+
}).request(({ request }) => {
|
|
1817
|
+
ensureRequestStorage().enterWith({ request });
|
|
1818
|
+
}).as("global");
|
|
1819
|
+
var getCurrentAbsoluteRequest = () => getRequestStorage()?.getStore()?.request;
|
|
1820
|
+
var runWithAbsoluteRequest = (request, callback) => ensureRequestStorage().run({ request }, callback);
|
|
1821
|
+
|
|
1822
|
+
// src/mobile/producerContextState.ts
|
|
1823
|
+
var ABSOLUTE_MOBILE_PRODUCER_STORAGE_KEY = Symbol.for("absolutejs.mobileProducerAsyncLocalStorage");
|
|
1824
|
+
var frameworks = new Set([
|
|
1825
|
+
"angular",
|
|
1826
|
+
"ember",
|
|
1827
|
+
"html",
|
|
1828
|
+
"htmx",
|
|
1829
|
+
"react",
|
|
1830
|
+
"svelte",
|
|
1831
|
+
"vue"
|
|
1832
|
+
]);
|
|
1833
|
+
var isCompatibilityPage = (value) => typeof value === "object" && value !== null && ("bundleHash" in value) && typeof value.bundleHash === "string" && ("contract" in value) && typeof value.contract === "string" && ("framework" in value) && typeof value.framework === "string" && frameworks.has(value.framework) && ("pageId" in value) && typeof value.pageId === "string" && ("propsSchemaHash" in value) && typeof value.propsSchemaHash === "string";
|
|
1834
|
+
var getCurrentAbsoluteMobileProducerContext = () => {
|
|
1835
|
+
const value = Reflect.get(globalThis, ABSOLUTE_MOBILE_PRODUCER_STORAGE_KEY);
|
|
1836
|
+
if (typeof value !== "object" || value === null || !("getStore" in value) || typeof value.getStore !== "function") {
|
|
1837
|
+
return;
|
|
1838
|
+
}
|
|
1839
|
+
const context = value.getStore();
|
|
1840
|
+
if (typeof context !== "object" || context === null || !("page" in context) || !isCompatibilityPage(context.page) || !("releaseId" in context) || typeof context.releaseId !== "string") {
|
|
1841
|
+
return;
|
|
1842
|
+
}
|
|
1843
|
+
return { page: context.page, releaseId: context.releaseId };
|
|
1844
|
+
};
|
|
1845
|
+
|
|
1846
|
+
// src/mobile/pageProtocol.ts
|
|
1847
|
+
var ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE = "application/vnd.absolute.page+json";
|
|
1848
|
+
var ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION = 1;
|
|
1849
|
+
var BAD_REQUEST_STATUS = 400;
|
|
1850
|
+
var OK_STATUS = 200;
|
|
1851
|
+
var SERVER_ERROR_STATUS = 500;
|
|
1852
|
+
var UPGRADE_REQUIRED_STATUS = 426;
|
|
1853
|
+
var MOBILE_PAGE_REQUEST_HEADERS = {
|
|
1854
|
+
appBuild: "x-absolute-mobile-app-build",
|
|
1855
|
+
pageBundle: "x-absolute-mobile-page-bundle",
|
|
1856
|
+
pageContracts: "x-absolute-mobile-page-contracts",
|
|
1857
|
+
pageId: "x-absolute-mobile-page-id",
|
|
1858
|
+
protocol: "x-absolute-mobile-protocol",
|
|
1859
|
+
runtime: "x-absolute-mobile-runtime"
|
|
1860
|
+
};
|
|
1861
|
+
var parseMediaType = (value) => value.split(";", 1)[0]?.trim().toLowerCase();
|
|
1862
|
+
var acceptsAbsoluteMobilePage = (request) => {
|
|
1863
|
+
if (!request)
|
|
1864
|
+
return false;
|
|
1865
|
+
return (request.headers.get("accept") ?? "").split(",").some((value) => parseMediaType(value) === ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE);
|
|
1866
|
+
};
|
|
1867
|
+
var readRequiredHeader = (request, name) => {
|
|
1868
|
+
const value = request.headers.get(name)?.trim();
|
|
1869
|
+
return value ? value : undefined;
|
|
1870
|
+
};
|
|
1871
|
+
var parseAbsoluteMobilePageRequest = (request) => {
|
|
1872
|
+
if (!request || !acceptsAbsoluteMobilePage(request)) {
|
|
1873
|
+
return { kind: "not-mobile" };
|
|
1874
|
+
}
|
|
1875
|
+
const protocolValue = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.protocol);
|
|
1876
|
+
const runtime = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.runtime);
|
|
1877
|
+
const appBuild = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.appBuild);
|
|
1878
|
+
const pageBundle = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.pageBundle);
|
|
1879
|
+
const pageContractsValue = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.pageContracts);
|
|
1880
|
+
const pageId = readRequiredHeader(request, MOBILE_PAGE_REQUEST_HEADERS.pageId);
|
|
1881
|
+
if (!protocolValue || !/^\d+$/.test(protocolValue)) {
|
|
1882
|
+
return {
|
|
1883
|
+
kind: "invalid",
|
|
1884
|
+
message: `Missing or invalid ${MOBILE_PAGE_REQUEST_HEADERS.protocol} header.`
|
|
1885
|
+
};
|
|
1886
|
+
}
|
|
1887
|
+
if (!runtime) {
|
|
1888
|
+
return {
|
|
1889
|
+
kind: "invalid",
|
|
1890
|
+
message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.runtime} header.`
|
|
1891
|
+
};
|
|
1892
|
+
}
|
|
1893
|
+
if (!appBuild) {
|
|
1894
|
+
return {
|
|
1895
|
+
kind: "invalid",
|
|
1896
|
+
message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.appBuild} header.`
|
|
1897
|
+
};
|
|
1898
|
+
}
|
|
1899
|
+
if (!pageBundle) {
|
|
1900
|
+
return {
|
|
1901
|
+
kind: "invalid",
|
|
1902
|
+
message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.pageBundle} header.`
|
|
1903
|
+
};
|
|
1904
|
+
}
|
|
1905
|
+
if (!pageContractsValue) {
|
|
1906
|
+
return {
|
|
1907
|
+
kind: "invalid",
|
|
1908
|
+
message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.pageContracts} header.`
|
|
1909
|
+
};
|
|
1910
|
+
}
|
|
1911
|
+
if (!pageId) {
|
|
1912
|
+
return {
|
|
1913
|
+
kind: "invalid",
|
|
1914
|
+
message: `Missing ${MOBILE_PAGE_REQUEST_HEADERS.pageId} header.`
|
|
1915
|
+
};
|
|
1916
|
+
}
|
|
1917
|
+
const pageContracts = [
|
|
1918
|
+
...new Set(pageContractsValue.split(",").map((value) => value.trim()).filter(Boolean))
|
|
1919
|
+
];
|
|
1920
|
+
if (pageContracts.length === 0) {
|
|
1921
|
+
return {
|
|
1922
|
+
kind: "invalid",
|
|
1923
|
+
message: `${MOBILE_PAGE_REQUEST_HEADERS.pageContracts} must contain at least one contract.`
|
|
1924
|
+
};
|
|
1925
|
+
}
|
|
1926
|
+
return {
|
|
1927
|
+
client: {
|
|
1928
|
+
appBuild,
|
|
1929
|
+
pageBundle,
|
|
1930
|
+
pageContracts,
|
|
1931
|
+
pageId,
|
|
1932
|
+
protocol: Number(protocolValue),
|
|
1933
|
+
runtime
|
|
1934
|
+
},
|
|
1935
|
+
kind: "mobile"
|
|
1936
|
+
};
|
|
1937
|
+
};
|
|
1938
|
+
var responseHeaders = () => {
|
|
1939
|
+
const headers = new Headers({
|
|
1940
|
+
"cache-control": "no-store",
|
|
1941
|
+
"content-type": `${ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE}; version=${ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION}`
|
|
1942
|
+
});
|
|
1943
|
+
headerVaryValues.forEach((value) => headers.append("vary", value));
|
|
1944
|
+
return headers;
|
|
1945
|
+
};
|
|
1946
|
+
var headerVaryValues = [
|
|
1947
|
+
"Accept",
|
|
1948
|
+
MOBILE_PAGE_REQUEST_HEADERS.protocol,
|
|
1949
|
+
MOBILE_PAGE_REQUEST_HEADERS.runtime,
|
|
1950
|
+
MOBILE_PAGE_REQUEST_HEADERS.appBuild,
|
|
1951
|
+
MOBILE_PAGE_REQUEST_HEADERS.pageBundle,
|
|
1952
|
+
MOBILE_PAGE_REQUEST_HEADERS.pageContracts,
|
|
1953
|
+
MOBILE_PAGE_REQUEST_HEADERS.pageId
|
|
1954
|
+
];
|
|
1955
|
+
var envelopeResponse = (response, status) => new Response(JSON.stringify({
|
|
1956
|
+
protocol: ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION,
|
|
1957
|
+
response
|
|
1958
|
+
}), { headers: responseHeaders(), status });
|
|
1959
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1960
|
+
var normalizeJsonValue = (value) => {
|
|
1961
|
+
const serialized = JSON.stringify(value);
|
|
1962
|
+
if (serialized === undefined) {
|
|
1963
|
+
throw new TypeError("Mobile page props must be JSON-serializable.");
|
|
1964
|
+
}
|
|
1965
|
+
const parsed = JSON.parse(serialized);
|
|
1966
|
+
if (!isRecord(parsed)) {
|
|
1967
|
+
throw new TypeError("Mobile page props must serialize to an object.");
|
|
1968
|
+
}
|
|
1969
|
+
return parsed;
|
|
1970
|
+
};
|
|
1971
|
+
var finalizeArchivedMobilePage = (context, input) => {
|
|
1972
|
+
const { page } = context;
|
|
1973
|
+
if (page.pageId !== input.compatibility.pageId || page.framework !== input.compatibility.framework) {
|
|
1974
|
+
return envelopeResponse({
|
|
1975
|
+
kind: "invalid-request",
|
|
1976
|
+
message: "Archived producer page identity does not match its release artifact."
|
|
1977
|
+
}, BAD_REQUEST_STATUS);
|
|
1978
|
+
}
|
|
1979
|
+
try {
|
|
1980
|
+
const [currentRepresentation] = input.compatibility.representations;
|
|
1981
|
+
if (!currentRepresentation) {
|
|
1982
|
+
throw new TypeError("Mobile page has no current representation.");
|
|
1983
|
+
}
|
|
1984
|
+
return envelopeResponse({
|
|
1985
|
+
contract: page.contract,
|
|
1986
|
+
framework: page.framework,
|
|
1987
|
+
kind: "page",
|
|
1988
|
+
pageId: page.pageId,
|
|
1989
|
+
props: normalizeJsonValue(currentRepresentation.mapProps(input.props)),
|
|
1990
|
+
status: input.status ?? OK_STATUS
|
|
1991
|
+
}, input.status ?? OK_STATUS);
|
|
1992
|
+
} catch (error) {
|
|
1993
|
+
console.error(`[Mobile] Archived producer ${context.releaseId} failed for ${page.pageId}:`, error);
|
|
1994
|
+
return createAbsoluteMobilePageErrorResponse(page.pageId);
|
|
1995
|
+
}
|
|
1996
|
+
};
|
|
1997
|
+
var createAbsoluteMobileInvalidRequestResponse = (message) => envelopeResponse({ kind: "invalid-request", message }, BAD_REQUEST_STATUS);
|
|
1998
|
+
var createAbsoluteMobilePageErrorResponse = (pageId) => envelopeResponse({
|
|
1999
|
+
code: "representation-failed",
|
|
2000
|
+
kind: "error",
|
|
2001
|
+
pageId,
|
|
2002
|
+
status: SERVER_ERROR_STATUS
|
|
2003
|
+
}, SERVER_ERROR_STATUS);
|
|
2004
|
+
var createAbsoluteMobileUpgradeResponse = (result) => envelopeResponse(result, UPGRADE_REQUIRED_STATUS);
|
|
2005
|
+
var finalizeAbsoluteMobilePage = (input) => {
|
|
2006
|
+
const parsed = parseAbsoluteMobilePageRequest(input.request);
|
|
2007
|
+
if (parsed.kind === "not-mobile")
|
|
2008
|
+
return;
|
|
2009
|
+
if (parsed.kind === "invalid") {
|
|
2010
|
+
return envelopeResponse({ kind: "invalid-request", message: parsed.message }, BAD_REQUEST_STATUS);
|
|
2011
|
+
}
|
|
2012
|
+
const { client } = parsed;
|
|
2013
|
+
if (client.pageId !== input.compatibility.pageId) {
|
|
2014
|
+
return envelopeResponse({
|
|
2015
|
+
kind: "invalid-request",
|
|
2016
|
+
message: `Requested mobile page ${client.pageId} does not match ${input.compatibility.pageId}.`
|
|
2017
|
+
}, BAD_REQUEST_STATUS);
|
|
2018
|
+
}
|
|
2019
|
+
const producerContext = getCurrentAbsoluteMobileProducerContext();
|
|
2020
|
+
if (producerContext)
|
|
2021
|
+
return finalizeArchivedMobilePage(producerContext, input);
|
|
2022
|
+
if (client.protocol !== ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION) {
|
|
2023
|
+
return envelopeResponse({
|
|
2024
|
+
kind: "upgrade-required",
|
|
2025
|
+
pageId: input.compatibility.pageId,
|
|
2026
|
+
reason: "protocol"
|
|
2027
|
+
}, UPGRADE_REQUIRED_STATUS);
|
|
2028
|
+
}
|
|
2029
|
+
if (!input.compatibility.runtimes.includes(client.runtime)) {
|
|
2030
|
+
return envelopeResponse({
|
|
2031
|
+
kind: "upgrade-required",
|
|
2032
|
+
pageId: input.compatibility.pageId,
|
|
2033
|
+
reason: "runtime",
|
|
2034
|
+
supportedRuntimes: [...input.compatibility.runtimes]
|
|
2035
|
+
}, UPGRADE_REQUIRED_STATUS);
|
|
2036
|
+
}
|
|
2037
|
+
const clientContracts = new Set(client.pageContracts);
|
|
2038
|
+
const representation = input.compatibility.representations.find(({ contract }) => clientContracts.has(contract));
|
|
2039
|
+
if (!representation) {
|
|
2040
|
+
return envelopeResponse({
|
|
2041
|
+
kind: "upgrade-required",
|
|
2042
|
+
pageId: input.compatibility.pageId,
|
|
2043
|
+
reason: "page-contract",
|
|
2044
|
+
supportedContracts: input.compatibility.representations.map(({ contract }) => contract)
|
|
2045
|
+
}, UPGRADE_REQUIRED_STATUS);
|
|
2046
|
+
}
|
|
2047
|
+
try {
|
|
2048
|
+
return envelopeResponse({
|
|
2049
|
+
contract: representation.contract,
|
|
2050
|
+
framework: input.compatibility.framework,
|
|
2051
|
+
kind: "page",
|
|
2052
|
+
pageId: input.compatibility.pageId,
|
|
2053
|
+
props: normalizeJsonValue(representation.mapProps(input.props)),
|
|
2054
|
+
status: input.status ?? OK_STATUS
|
|
2055
|
+
}, input.status ?? OK_STATUS);
|
|
2056
|
+
} catch (error) {
|
|
2057
|
+
console.error(`[Mobile] Failed to produce ${input.compatibility.pageId} representation ${representation.contract}:`, error);
|
|
2058
|
+
return envelopeResponse({
|
|
2059
|
+
code: "representation-failed",
|
|
2060
|
+
kind: "error",
|
|
2061
|
+
pageId: input.compatibility.pageId,
|
|
2062
|
+
status: SERVER_ERROR_STATUS
|
|
2063
|
+
}, SERVER_ERROR_STATUS);
|
|
2064
|
+
}
|
|
1412
2065
|
};
|
|
1413
2066
|
|
|
1414
2067
|
// src/react/pageHandler.ts
|
|
1415
|
-
|
|
2068
|
+
init_pageResponseCache();
|
|
1416
2069
|
|
|
1417
2070
|
// src/core/responseEnhancers.ts
|
|
1418
2071
|
init_streamingSlots();
|
|
2072
|
+
init_pageResponseCache();
|
|
1419
2073
|
var toResponse = async (responseLike) => responseLike;
|
|
1420
2074
|
var cloneHeaders = (response) => {
|
|
1421
2075
|
const headers = new Headers(response.headers);
|
|
@@ -1439,8 +2093,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
|
|
|
1439
2093
|
runtimePlacement,
|
|
1440
2094
|
runtimePreludeScript
|
|
1441
2095
|
});
|
|
2096
|
+
const headers = cloneHeaders(response);
|
|
2097
|
+
headers.set(STREAMING_PAGE_HEADER, "1");
|
|
1442
2098
|
return new Response(body, {
|
|
1443
|
-
headers
|
|
2099
|
+
headers,
|
|
1444
2100
|
status: response.status,
|
|
1445
2101
|
statusText: response.statusText
|
|
1446
2102
|
});
|
|
@@ -1465,7 +2121,7 @@ var withRegisteredStreamingSlots = async (renderResponse, options = {}) => {
|
|
|
1465
2121
|
|
|
1466
2122
|
// src/core/streamingSlotWarningScope.ts
|
|
1467
2123
|
init_logger();
|
|
1468
|
-
import { AsyncLocalStorage as
|
|
2124
|
+
import { AsyncLocalStorage as AsyncLocalStorage3 } from "async_hooks";
|
|
1469
2125
|
var STREAMING_SLOT_WARNING_STORAGE_KEY2 = Symbol.for("absolutejs.streamingSlotWarningAsyncLocalStorage");
|
|
1470
2126
|
var isObjectRecord4 = (value) => Boolean(value) && typeof value === "object";
|
|
1471
2127
|
var isAsyncLocalStorage3 = (value) => isObjectRecord4(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
|
|
@@ -1481,7 +2137,7 @@ var ensureWarningStorage = () => {
|
|
|
1481
2137
|
if (existing) {
|
|
1482
2138
|
return existing;
|
|
1483
2139
|
}
|
|
1484
|
-
const storage = new
|
|
2140
|
+
const storage = new AsyncLocalStorage3;
|
|
1485
2141
|
Reflect.set(globalThis, STREAMING_SLOT_WARNING_STORAGE_KEY2, storage);
|
|
1486
2142
|
return storage;
|
|
1487
2143
|
};
|
|
@@ -1520,303 +2176,11 @@ var captureStreamingSlotWarningCallsite = () => {
|
|
|
1520
2176
|
return extractCallsiteFromStack(stack);
|
|
1521
2177
|
};
|
|
1522
2178
|
var runWithStreamingSlotWarningScope = (task, metadata) => ensureWarningStorage().run({ handlerCallsite: metadata?.handlerCallsite, hasWarned: false }, task);
|
|
1523
|
-
// src/utils/resolveConvention.ts
|
|
1524
|
-
import { basename } from "path";
|
|
1525
|
-
var CONVENTIONS_KEY = "__absoluteConventions";
|
|
1526
|
-
var isConventionsMap = (value) => Boolean(value) && typeof value === "object";
|
|
1527
|
-
var getMap = () => {
|
|
1528
|
-
const value = Reflect.get(globalThis, CONVENTIONS_KEY);
|
|
1529
|
-
if (isConventionsMap(value))
|
|
1530
|
-
return value;
|
|
1531
|
-
const empty = {};
|
|
1532
|
-
return empty;
|
|
1533
|
-
};
|
|
1534
|
-
var derivePageName = (pagePath) => {
|
|
1535
|
-
const base = basename(pagePath);
|
|
1536
|
-
const dotIndex = base.indexOf(".");
|
|
1537
|
-
const name = dotIndex > 0 ? base.slice(0, dotIndex) : base;
|
|
1538
|
-
return toPascal(name);
|
|
1539
|
-
};
|
|
1540
|
-
var normalizeConventionPageName = (name) => toPascal(name).replace(/\d+$/, "");
|
|
1541
|
-
var resolveErrorConventionPath = (framework, pageName) => {
|
|
1542
|
-
const conventions = getMap()[framework];
|
|
1543
|
-
if (!conventions)
|
|
1544
|
-
return;
|
|
1545
|
-
const exact = conventions.pages?.[pageName]?.error;
|
|
1546
|
-
if (exact)
|
|
1547
|
-
return exact;
|
|
1548
|
-
const normalizedPageName = normalizeConventionPageName(pageName);
|
|
1549
|
-
for (const [candidate, page] of Object.entries(conventions.pages ?? {})) {
|
|
1550
|
-
if (normalizeConventionPageName(candidate) === normalizedPageName) {
|
|
1551
|
-
return page.error ?? conventions.defaults?.error;
|
|
1552
|
-
}
|
|
1553
|
-
}
|
|
1554
|
-
return conventions.defaults?.error;
|
|
1555
|
-
};
|
|
1556
|
-
var resolveNotFoundConventionPath = (framework) => getMap()[framework]?.defaults?.notFound;
|
|
1557
|
-
var hasErrorConvention = (framework) => {
|
|
1558
|
-
const conventions = getMap()[framework];
|
|
1559
|
-
if (!conventions)
|
|
1560
|
-
return false;
|
|
1561
|
-
if (conventions.defaults?.error)
|
|
1562
|
-
return true;
|
|
1563
|
-
return Object.values(conventions.pages ?? {}).some((page) => Boolean(page.error));
|
|
1564
|
-
};
|
|
1565
|
-
var setConventions = (map) => {
|
|
1566
|
-
Reflect.set(globalThis, CONVENTIONS_KEY, map);
|
|
1567
|
-
};
|
|
1568
|
-
var isDev = () => true;
|
|
1569
|
-
var buildErrorProps = (error) => {
|
|
1570
|
-
if (error instanceof Error) {
|
|
1571
|
-
return {
|
|
1572
|
-
name: error.name,
|
|
1573
|
-
message: error.message,
|
|
1574
|
-
...isDev() && error.stack ? { stack: error.stack } : {}
|
|
1575
|
-
};
|
|
1576
|
-
}
|
|
1577
|
-
return { name: "Error", message: String(error) };
|
|
1578
|
-
};
|
|
1579
|
-
var renderReactError = async (conventionPath, errorProps) => {
|
|
1580
|
-
const { createElement } = await import("react");
|
|
1581
|
-
const { renderToReadableStream } = await import("react-dom/server");
|
|
1582
|
-
const mod = await import(conventionPath);
|
|
1583
|
-
const ErrorComponent = mod.default;
|
|
1584
|
-
if (typeof ErrorComponent !== "function")
|
|
1585
|
-
return null;
|
|
1586
|
-
const element = createElement(ErrorComponent, errorProps);
|
|
1587
|
-
const stream = await renderToReadableStream(element);
|
|
1588
|
-
return new Response(stream, {
|
|
1589
|
-
headers: { "Content-Type": "text/html" },
|
|
1590
|
-
status: 500
|
|
1591
|
-
});
|
|
1592
|
-
};
|
|
1593
|
-
var renderSvelteError = async (conventionPath, errorProps) => {
|
|
1594
|
-
const { render } = await import("svelte/server");
|
|
1595
|
-
const mod = await import(conventionPath);
|
|
1596
|
-
const ErrorComponent = mod.default;
|
|
1597
|
-
if (!ErrorComponent)
|
|
1598
|
-
return null;
|
|
1599
|
-
const { head, body } = render(ErrorComponent, {
|
|
1600
|
-
props: errorProps
|
|
1601
|
-
});
|
|
1602
|
-
const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
|
|
1603
|
-
return new Response(html, {
|
|
1604
|
-
headers: { "Content-Type": "text/html" },
|
|
1605
|
-
status: 500
|
|
1606
|
-
});
|
|
1607
|
-
};
|
|
1608
|
-
var unescapeVueStyles = (ssrBody) => {
|
|
1609
|
-
let styles = "";
|
|
1610
|
-
const body = ssrBody.replace(/<style>([\s\S]*?)<\/style>/g, (_, css) => {
|
|
1611
|
-
styles += `<style>${css.replace(/"/g, '"').replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}</style>`;
|
|
1612
|
-
return "";
|
|
1613
|
-
});
|
|
1614
|
-
return { body, styles };
|
|
1615
|
-
};
|
|
1616
|
-
var renderVueError = async (conventionPath, errorProps) => {
|
|
1617
|
-
const { createSSRApp, h } = await import("vue");
|
|
1618
|
-
const { renderToString } = await import("vue/server-renderer");
|
|
1619
|
-
const mod = await import(conventionPath);
|
|
1620
|
-
const ErrorComponent = mod.default;
|
|
1621
|
-
if (!ErrorComponent)
|
|
1622
|
-
return null;
|
|
1623
|
-
const app = createSSRApp({
|
|
1624
|
-
render: () => h(ErrorComponent, errorProps)
|
|
1625
|
-
});
|
|
1626
|
-
const rawBody = await renderToString(app);
|
|
1627
|
-
const { styles, body } = unescapeVueStyles(rawBody);
|
|
1628
|
-
const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
|
|
1629
|
-
return new Response(html, {
|
|
1630
|
-
headers: { "Content-Type": "text/html" },
|
|
1631
|
-
status: 500
|
|
1632
|
-
});
|
|
1633
|
-
};
|
|
1634
|
-
var renderAngularError = async (conventionPath, errorProps) => {
|
|
1635
|
-
const mod = await import(conventionPath);
|
|
1636
|
-
const renderFn = mod.default;
|
|
1637
|
-
if (typeof renderFn !== "function")
|
|
1638
|
-
return null;
|
|
1639
|
-
const html = renderFn(errorProps);
|
|
1640
|
-
return new Response(html, {
|
|
1641
|
-
headers: { "Content-Type": "text/html" },
|
|
1642
|
-
status: 500
|
|
1643
|
-
});
|
|
1644
|
-
};
|
|
1645
|
-
var escapeHtml = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
1646
|
-
var replaceErrorTokens = (template, errorProps) => template.replace(/\{\{\s*name\s*\}\}/g, escapeHtml(errorProps.name)).replace(/\{\{\s*message\s*\}\}/g, escapeHtml(errorProps.message)).replace(/\{\{\s*stack\s*\}\}/g, errorProps.stack ? escapeHtml(errorProps.stack) : "");
|
|
1647
|
-
var renderHtmlError = async (conventionPath, errorProps) => {
|
|
1648
|
-
const template = await Bun.file(conventionPath).text();
|
|
1649
|
-
const html = replaceErrorTokens(template, errorProps);
|
|
1650
|
-
return new Response(html, {
|
|
1651
|
-
headers: { "Content-Type": "text/html" },
|
|
1652
|
-
status: 500
|
|
1653
|
-
});
|
|
1654
|
-
};
|
|
1655
|
-
var logConventionRenderError = (framework, label, renderError) => {
|
|
1656
|
-
const message = renderError instanceof Error ? renderError.message : "";
|
|
1657
|
-
if (message.includes("Cannot find module") || message.includes("Cannot find package") || message.includes("not found in module")) {
|
|
1658
|
-
console.error(`[SSR] Convention ${label} page for ${framework} failed: missing framework package. Ensure the ${framework} runtime is installed (e.g. bun add ${framework === "react" ? "react react-dom" : framework}).`);
|
|
1659
|
-
return;
|
|
1660
|
-
}
|
|
1661
|
-
console.error(`[SSR] Failed to render ${framework} convention ${label} page:`, renderError);
|
|
1662
|
-
};
|
|
1663
|
-
var renderEmberError = async () => null;
|
|
1664
|
-
var renderEmberNotFound = async () => null;
|
|
1665
|
-
var ERROR_RENDERERS = {
|
|
1666
|
-
angular: renderAngularError,
|
|
1667
|
-
ember: renderEmberError,
|
|
1668
|
-
html: renderHtmlError,
|
|
1669
|
-
react: renderReactError,
|
|
1670
|
-
svelte: renderSvelteError,
|
|
1671
|
-
vue: renderVueError
|
|
1672
|
-
};
|
|
1673
|
-
var tryFrameworkErrorConvention = async (framework, pageName, errorProps, error) => {
|
|
1674
|
-
let conventionPath = resolveErrorConventionPath(framework, pageName);
|
|
1675
|
-
if (!conventionPath && error instanceof Error && error.stack) {
|
|
1676
|
-
for (const match of error.stack.matchAll(/^\s*at\s+([A-Za-z_$][\w$]*)/gm)) {
|
|
1677
|
-
const candidate = match[1];
|
|
1678
|
-
if (!candidate)
|
|
1679
|
-
continue;
|
|
1680
|
-
conventionPath = resolveErrorConventionPath(framework, candidate);
|
|
1681
|
-
if (conventionPath)
|
|
1682
|
-
break;
|
|
1683
|
-
}
|
|
1684
|
-
}
|
|
1685
|
-
if (!conventionPath)
|
|
1686
|
-
return null;
|
|
1687
|
-
const renderer = ERROR_RENDERERS[framework];
|
|
1688
|
-
if (!renderer)
|
|
1689
|
-
return null;
|
|
1690
|
-
try {
|
|
1691
|
-
return await renderer(conventionPath, errorProps);
|
|
1692
|
-
} catch (renderError) {
|
|
1693
|
-
logConventionRenderError(framework, "error", renderError);
|
|
1694
|
-
}
|
|
1695
|
-
return null;
|
|
1696
|
-
};
|
|
1697
|
-
var renderConventionError = async (framework, pageName, error) => {
|
|
1698
|
-
const errorProps = buildErrorProps(error);
|
|
1699
|
-
const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
|
|
1700
|
-
if (frameworkResponse)
|
|
1701
|
-
return frameworkResponse;
|
|
1702
|
-
if (framework !== "html") {
|
|
1703
|
-
const htmlResponse = await tryFrameworkErrorConvention("html", pageName, errorProps, error);
|
|
1704
|
-
if (htmlResponse)
|
|
1705
|
-
return htmlResponse;
|
|
1706
|
-
}
|
|
1707
|
-
return null;
|
|
1708
|
-
};
|
|
1709
|
-
var renderReactNotFound = async (conventionPath) => {
|
|
1710
|
-
const { createElement } = await import("react");
|
|
1711
|
-
const { renderToReadableStream } = await import("react-dom/server");
|
|
1712
|
-
const mod = await import(conventionPath);
|
|
1713
|
-
const NotFoundComponent = mod.default;
|
|
1714
|
-
if (typeof NotFoundComponent !== "function")
|
|
1715
|
-
return null;
|
|
1716
|
-
const element = createElement(NotFoundComponent);
|
|
1717
|
-
const stream = await renderToReadableStream(element);
|
|
1718
|
-
return new Response(stream, {
|
|
1719
|
-
headers: { "Content-Type": "text/html" },
|
|
1720
|
-
status: 404
|
|
1721
|
-
});
|
|
1722
|
-
};
|
|
1723
|
-
var renderSvelteNotFound = async (conventionPath) => {
|
|
1724
|
-
const { render } = await import("svelte/server");
|
|
1725
|
-
const mod = await import(conventionPath);
|
|
1726
|
-
const NotFoundComponent = mod.default;
|
|
1727
|
-
if (!NotFoundComponent)
|
|
1728
|
-
return null;
|
|
1729
|
-
const { head, body } = render(NotFoundComponent);
|
|
1730
|
-
const html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;
|
|
1731
|
-
return new Response(html, {
|
|
1732
|
-
headers: { "Content-Type": "text/html" },
|
|
1733
|
-
status: 404
|
|
1734
|
-
});
|
|
1735
|
-
};
|
|
1736
|
-
var renderVueNotFound = async (conventionPath) => {
|
|
1737
|
-
const { createSSRApp, h } = await import("vue");
|
|
1738
|
-
const { renderToString } = await import("vue/server-renderer");
|
|
1739
|
-
const mod = await import(conventionPath);
|
|
1740
|
-
const NotFoundComponent = mod.default;
|
|
1741
|
-
if (!NotFoundComponent)
|
|
1742
|
-
return null;
|
|
1743
|
-
const app = createSSRApp({
|
|
1744
|
-
render: () => h(NotFoundComponent)
|
|
1745
|
-
});
|
|
1746
|
-
const rawBody = await renderToString(app);
|
|
1747
|
-
const { styles, body } = unescapeVueStyles(rawBody);
|
|
1748
|
-
const html = `<!DOCTYPE html><html><head>${styles}</head><body><div id="root">${body}</div></body></html>`;
|
|
1749
|
-
return new Response(html, {
|
|
1750
|
-
headers: { "Content-Type": "text/html" },
|
|
1751
|
-
status: 404
|
|
1752
|
-
});
|
|
1753
|
-
};
|
|
1754
|
-
var renderAngularNotFound = async (conventionPath) => {
|
|
1755
|
-
const mod = await import(conventionPath);
|
|
1756
|
-
const renderFn = mod.default;
|
|
1757
|
-
if (typeof renderFn !== "function")
|
|
1758
|
-
return null;
|
|
1759
|
-
const html = renderFn();
|
|
1760
|
-
return new Response(html, {
|
|
1761
|
-
headers: { "Content-Type": "text/html" },
|
|
1762
|
-
status: 404
|
|
1763
|
-
});
|
|
1764
|
-
};
|
|
1765
|
-
var renderHtmlNotFound = async (conventionPath) => {
|
|
1766
|
-
const html = await Bun.file(conventionPath).text();
|
|
1767
|
-
return new Response(html, {
|
|
1768
|
-
headers: { "Content-Type": "text/html" },
|
|
1769
|
-
status: 404
|
|
1770
|
-
});
|
|
1771
|
-
};
|
|
1772
|
-
var NOT_FOUND_RENDERERS = {
|
|
1773
|
-
angular: renderAngularNotFound,
|
|
1774
|
-
ember: renderEmberNotFound,
|
|
1775
|
-
html: renderHtmlNotFound,
|
|
1776
|
-
react: renderReactNotFound,
|
|
1777
|
-
svelte: renderSvelteNotFound,
|
|
1778
|
-
vue: renderVueNotFound
|
|
1779
|
-
};
|
|
1780
|
-
var renderConventionNotFound = async (framework) => {
|
|
1781
|
-
const conventionPath = resolveNotFoundConventionPath(framework);
|
|
1782
|
-
if (!conventionPath)
|
|
1783
|
-
return null;
|
|
1784
|
-
const renderer = NOT_FOUND_RENDERERS[framework];
|
|
1785
|
-
if (!renderer)
|
|
1786
|
-
return null;
|
|
1787
|
-
try {
|
|
1788
|
-
return await renderer(conventionPath);
|
|
1789
|
-
} catch (renderError) {
|
|
1790
|
-
logConventionRenderError(framework, "not-found", renderError);
|
|
1791
|
-
}
|
|
1792
|
-
return null;
|
|
1793
|
-
};
|
|
1794
|
-
var NOT_FOUND_PRIORITY = [
|
|
1795
|
-
"react",
|
|
1796
|
-
"svelte",
|
|
1797
|
-
"vue",
|
|
1798
|
-
"angular",
|
|
1799
|
-
"html"
|
|
1800
|
-
];
|
|
1801
|
-
var renderFirstNotFound = async () => {
|
|
1802
|
-
const renderNext = async (frameworks) => {
|
|
1803
|
-
const [framework, ...remaining] = frameworks;
|
|
1804
|
-
if (!framework) {
|
|
1805
|
-
return null;
|
|
1806
|
-
}
|
|
1807
|
-
if (!getMap()[framework]?.defaults?.notFound) {
|
|
1808
|
-
return renderNext(remaining);
|
|
1809
|
-
}
|
|
1810
|
-
const response = await renderConventionNotFound(framework);
|
|
1811
|
-
if (response) {
|
|
1812
|
-
return response;
|
|
1813
|
-
}
|
|
1814
|
-
return renderNext(remaining);
|
|
1815
|
-
};
|
|
1816
|
-
return renderNext(NOT_FOUND_PRIORITY);
|
|
1817
|
-
};
|
|
1818
2179
|
|
|
1819
2180
|
// src/react/pageHandler.ts
|
|
2181
|
+
init_spaRouteManifest();
|
|
2182
|
+
init_resolveConvention();
|
|
2183
|
+
var withRequestUrl = (props, url) => Object.assign(Object.create(null), props, { url });
|
|
1820
2184
|
var resolveRequestPathname = (request) => {
|
|
1821
2185
|
if (!request)
|
|
1822
2186
|
return;
|
|
@@ -1832,17 +2196,34 @@ var buildRefreshSetup = () => {
|
|
|
1832
2196
|
return "window.__REFRESH_BUFFER__=[];" + "window.$RefreshReg$=function(t,i){window.__REFRESH_BUFFER__.push([t,i])};" + "window.$RefreshSig$=function(){return function(t){return t}};";
|
|
1833
2197
|
};
|
|
1834
2198
|
var handleReactPageRequest = async (input) => {
|
|
1835
|
-
const Page = input
|
|
2199
|
+
const { Page } = input;
|
|
1836
2200
|
const resolvedIndex = input.index;
|
|
1837
2201
|
const options = input;
|
|
1838
2202
|
const userProps = input.props;
|
|
1839
|
-
const
|
|
1840
|
-
const
|
|
1841
|
-
|
|
1842
|
-
url: requestPathname
|
|
1843
|
-
} : userProps;
|
|
2203
|
+
const request = input.request ?? getCurrentAbsoluteRequest();
|
|
2204
|
+
const requestPathname = resolveRequestPathname(request);
|
|
2205
|
+
const maybeProps = requestPathname !== undefined && (!userProps || !("url" in userProps)) ? withRequestUrl(userProps, requestPathname) : userProps;
|
|
1844
2206
|
const pageName = Page.name || Page.displayName || "";
|
|
2207
|
+
const pageId = input.__absoluteMobile?.pageId ?? (pageName || resolvedIndex);
|
|
2208
|
+
const currentContract = input.__absoluteMobile?.contract ?? `react:${pageId}:${ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION}`;
|
|
2209
|
+
const mobileResponse = finalizeAbsoluteMobilePage({
|
|
2210
|
+
compatibility: {
|
|
2211
|
+
framework: "react",
|
|
2212
|
+
pageId,
|
|
2213
|
+
representations: [
|
|
2214
|
+
{ contract: currentContract, mapProps: (props) => props }
|
|
2215
|
+
],
|
|
2216
|
+
runtimes: [String(ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION)]
|
|
2217
|
+
},
|
|
2218
|
+
props: maybeProps ?? Object.create(null),
|
|
2219
|
+
request
|
|
2220
|
+
});
|
|
2221
|
+
if (mobileResponse)
|
|
2222
|
+
return mobileResponse;
|
|
1845
2223
|
try {
|
|
2224
|
+
const spaNotFound = await renderSpaNotFound("react", pageName, request);
|
|
2225
|
+
if (spaNotFound)
|
|
2226
|
+
return withPageCacheHeaders(spaNotFound, request);
|
|
1846
2227
|
const handlerCallsite = options?.collectStreamingSlots === true ? undefined : getCurrentRouteRegistrationCallsite() ?? captureStreamingSlotWarningCallsite();
|
|
1847
2228
|
const renderPageResponse = async () => {
|
|
1848
2229
|
const { createElement } = await import("react");
|
|
@@ -1865,24 +2246,28 @@ var handleReactPageRequest = async (input) => {
|
|
|
1865
2246
|
});
|
|
1866
2247
|
}
|
|
1867
2248
|
return new Response(htmlStream, {
|
|
1868
|
-
headers:
|
|
2249
|
+
headers: streamingPageHeaders()
|
|
1869
2250
|
});
|
|
1870
2251
|
};
|
|
1871
|
-
|
|
2252
|
+
const pageResponse = await runWithStreamingSlotWarningScope(() => options?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, options) : renderPageResponse(), { handlerCallsite });
|
|
2253
|
+
return withPageCacheHeaders(pageResponse, request, {
|
|
2254
|
+
bufferStreamForEtag: input.bufferStreamForEtag
|
|
2255
|
+
});
|
|
1872
2256
|
} catch (error) {
|
|
1873
2257
|
console.error("[SSR] React render error:", error);
|
|
1874
2258
|
const conventionResponse = await renderConventionError("react", pageName, error);
|
|
1875
|
-
if (conventionResponse)
|
|
1876
|
-
return conventionResponse;
|
|
1877
|
-
|
|
2259
|
+
if (conventionResponse) {
|
|
2260
|
+
return withPageCacheHeaders(conventionResponse, request);
|
|
2261
|
+
}
|
|
2262
|
+
return withPageCacheHeaders(new Response(ssrErrorPage("react", error), {
|
|
1878
2263
|
headers: { "Content-Type": "text/html" },
|
|
1879
2264
|
status: 500
|
|
1880
|
-
});
|
|
2265
|
+
}), request);
|
|
1881
2266
|
}
|
|
1882
2267
|
};
|
|
1883
2268
|
export {
|
|
1884
2269
|
handleReactPageRequest
|
|
1885
2270
|
};
|
|
1886
2271
|
|
|
1887
|
-
//# debugId=
|
|
2272
|
+
//# debugId=823109CB5C4C5BF664756E2164756E21
|
|
1888
2273
|
//# sourceMappingURL=server.js.map
|