@absolutejs/absolute 0.20.0-beta.0 → 0.20.0-beta.2

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.
Files changed (91) hide show
  1. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  2. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  3. package/dist/angular/index.js +14 -1
  4. package/dist/angular/index.js.map +3 -3
  5. package/dist/angular/server.js +14 -1
  6. package/dist/angular/server.js.map +3 -3
  7. package/dist/build.js +206 -47
  8. package/dist/build.js.map +20 -19
  9. package/dist/cli/config/server.js +2 -2
  10. package/dist/cli/index.js +16506 -11326
  11. package/dist/dev/client/cssUtils.ts +98 -41
  12. package/dist/dev/client/handlers/html.ts +75 -15
  13. package/dist/dev/client/handlers/htmx.ts +43 -8
  14. package/dist/dev/client/handlers/react.ts +114 -32
  15. package/dist/dev/client/handlers/rebuild.ts +28 -8
  16. package/dist/dev/client/handlers/svelte.ts +33 -50
  17. package/dist/dev/client/handlers/vue.ts +36 -45
  18. package/dist/dev/client/hmrClient.ts +38 -6
  19. package/dist/dev/client/hmrTiming.ts +141 -0
  20. package/dist/dev/serverBootstrap.js +20 -11
  21. package/dist/index.js +953 -423
  22. package/dist/index.js.map +27 -23
  23. package/dist/mobile/browser.js.map +1 -1
  24. package/dist/mobile/index.js +2667 -260
  25. package/dist/mobile/index.js.map +27 -7
  26. package/dist/react/index.js +16 -3
  27. package/dist/react/index.js.map +4 -4
  28. package/dist/react/jsxDevRuntimeCompat.js +22 -2
  29. package/dist/react/jsxDevRuntimeCompat.js.map +5 -4
  30. package/dist/react/jsxRuntimeCompat.js +90 -0
  31. package/dist/react/jsxRuntimeCompat.js.map +10 -0
  32. package/dist/react/server.js +16 -3
  33. package/dist/react/server.js.map +4 -4
  34. package/dist/src/build/compileVue.d.ts +1 -1
  35. package/dist/src/build/resolveBuildMode.d.ts +7 -0
  36. package/dist/src/cli/scripts/dev.d.ts +4 -1
  37. package/dist/src/cli/scripts/mobile.d.ts +1 -0
  38. package/dist/src/cli/utils.d.ts +2 -2
  39. package/dist/src/core/build.d.ts +1 -1
  40. package/dist/src/dev/clientManager.d.ts +7 -0
  41. package/dist/src/dev/configResolver.d.ts +2 -0
  42. package/dist/src/dev/moduleMapper.d.ts +1 -1
  43. package/dist/src/dev/moduleServer.d.ts +2 -1
  44. package/dist/src/dev/pathUtils.d.ts +1 -1
  45. package/dist/src/dev/reactComponentClassifier.d.ts +1 -1
  46. package/dist/src/mobile/androidConformance.d.ts +42 -0
  47. package/dist/src/mobile/androidEmulatorController.d.ts +100 -0
  48. package/dist/src/mobile/androidNativeWatcher.d.ts +19 -0
  49. package/dist/src/mobile/androidRelease.d.ts +51 -0
  50. package/dist/src/mobile/androidWebView.d.ts +46 -0
  51. package/dist/src/mobile/associationFiles.d.ts +49 -0
  52. package/dist/src/mobile/buildMetadata.d.ts +10 -0
  53. package/dist/src/mobile/buildPipeline.d.ts +8 -0
  54. package/dist/src/mobile/buildRelease.d.ts +24 -0
  55. package/dist/src/mobile/capacitorBundle.d.ts +28 -0
  56. package/dist/src/mobile/capacitorProject.d.ts +9 -0
  57. package/dist/src/mobile/client.d.ts +1 -1
  58. package/dist/src/mobile/config.d.ts +17 -0
  59. package/dist/src/mobile/emulatorDoctor.d.ts +25 -0
  60. package/dist/src/mobile/emulatorInstaller.d.ts +41 -0
  61. package/dist/src/mobile/index.d.ts +14 -0
  62. package/dist/src/mobile/iosRelease.d.ts +61 -0
  63. package/dist/src/mobile/materializedBundle.d.ts +14 -0
  64. package/dist/src/mobile/nativeDeepLinks.d.ts +5 -0
  65. package/dist/src/mobile/releaseArtifact.d.ts +1 -0
  66. package/dist/src/mobile/releaseDoctor.d.ts +13 -0
  67. package/dist/src/mobile/releasePublisher.d.ts +130 -0
  68. package/dist/src/mobile/routeMatcher.d.ts +3 -0
  69. package/dist/src/mobile/routeMetadataTransform.d.ts +13 -0
  70. package/dist/src/mobile/shellBootstrap.d.ts +1 -0
  71. package/dist/src/mobile/transport.d.ts +31 -0
  72. package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
  73. package/dist/src/react/jsxDevRuntimeCompat.d.ts +1 -1
  74. package/dist/src/react/jsxRuntimeCompat.d.ts +7 -0
  75. package/dist/src/react/pageHandler.d.ts +3 -0
  76. package/dist/src/utils/loadConfig.d.ts +1 -0
  77. package/dist/src/utils/logger.d.ts +2 -0
  78. package/dist/src/utils/userAgentFunctions.d.ts +1 -1
  79. package/dist/svelte/index.js +14 -1
  80. package/dist/svelte/index.js.map +3 -3
  81. package/dist/svelte/server.js +14 -1
  82. package/dist/svelte/server.js.map +3 -3
  83. package/dist/types/build.d.ts +45 -0
  84. package/dist/types/cli.d.ts +2 -0
  85. package/dist/types/globals.d.ts +14 -0
  86. package/dist/types/messages.d.ts +12 -0
  87. package/dist/vue/index.js +14 -1
  88. package/dist/vue/index.js.map +3 -3
  89. package/dist/vue/server.js +14 -1
  90. package/dist/vue/server.js.map +3 -3
  91. package/package.json +35 -7
@@ -0,0 +1,61 @@
1
+ import type { NormalizedAbsoluteMobileConfig } from './config';
2
+ import { type AbsoluteMobileHost } from './emulatorDoctor';
3
+ export declare const ABSOLUTE_IOS_RELEASE_FORMAT: 1;
4
+ export type AbsoluteIosReleaseMetadata = {
5
+ appBuild: string;
6
+ appId: string;
7
+ artifact: 'App.ipa';
8
+ buildNumber?: number;
9
+ bytes: number;
10
+ engine: 'capacitor';
11
+ format: typeof ABSOLUTE_IOS_RELEASE_FORMAT;
12
+ marketingVersion: string;
13
+ platform: 'ios';
14
+ releaseId: string;
15
+ runtime: string;
16
+ sha256: string;
17
+ signed: boolean;
18
+ type: 'ipa';
19
+ };
20
+ type CommandOptions = {
21
+ cwd?: string;
22
+ env?: Record<string, string | undefined>;
23
+ };
24
+ type CommandResult = {
25
+ exitCode: number;
26
+ stderr: string;
27
+ stdout: string;
28
+ };
29
+ export type BuildAbsoluteIosReleaseOptions = {
30
+ allowUnsigned?: boolean;
31
+ capture?: (command: string[], options?: CommandOptions) => CommandResult;
32
+ config: NormalizedAbsoluteMobileConfig;
33
+ host?: AbsoluteMobileHost;
34
+ outputDirectory?: string;
35
+ prepareBuildNumber?: (buildIdentity: string) => Promise<number>;
36
+ projectRoot: string;
37
+ run?: (command: string[], options?: CommandOptions) => Promise<number>;
38
+ buildNumber?: number;
39
+ };
40
+ export declare const fingerprintAbsoluteIosNativeProject: (nativeDirectory: string) => Promise<string>;
41
+ export declare const buildAbsoluteIosRelease: (options: BuildAbsoluteIosReleaseOptions) => Promise<{
42
+ artifactPath: string;
43
+ metadata: {
44
+ artifact: "App.ipa";
45
+ sha256: string;
46
+ type: "ipa";
47
+ format: typeof ABSOLUTE_IOS_RELEASE_FORMAT;
48
+ bytes: number;
49
+ runtime: string;
50
+ releaseId: string;
51
+ appBuild: string;
52
+ appId: string;
53
+ platform: "ios";
54
+ engine: "capacitor";
55
+ signed: boolean;
56
+ buildNumber?: number | undefined;
57
+ marketingVersion: string;
58
+ };
59
+ releaseRoot: string;
60
+ }>;
61
+ export {};
@@ -20,3 +20,17 @@ export declare const materializeAbsoluteMobileCompatibilityBundle: (input: Absol
20
20
  format: 1;
21
21
  releases: AbsoluteMobileCompatibilityArtifact[];
22
22
  }>;
23
+ export declare const readAbsoluteMobileMaterializedReleases: (root: string) => Promise<{
24
+ artifact: {
25
+ releaseId: string;
26
+ pages: import("./releaseArtifact").AbsoluteMobileCompatibilityPage[];
27
+ routes: import("./releaseArtifact").AbsoluteMobileCompatibilityRoute[];
28
+ format: typeof import("./releaseArtifact").ABSOLUTE_MOBILE_COMPATIBILITY_FORMAT;
29
+ runtime: string;
30
+ appBuild: string;
31
+ appId: string;
32
+ generation: number;
33
+ producer: import("./releaseArtifact").AbsoluteMobileCompatibilityProducer;
34
+ };
35
+ producer: Bun.BunFile;
36
+ }[]>;
@@ -0,0 +1,5 @@
1
+ import type { MobilePlatform } from '../../types/build';
2
+ import type { NormalizedAbsoluteMobileConfig } from './config';
3
+ export declare const applyAbsoluteNativeDeepLinks: (config: NormalizedAbsoluteMobileConfig, platforms?: readonly MobilePlatform[]) => Promise<{
4
+ changed: MobilePlatform[];
5
+ }>;
@@ -3,6 +3,7 @@ export declare const ABSOLUTE_MOBILE_COMPATIBILITY_FORMAT: 1;
3
3
  export declare const ABSOLUTE_MOBILE_RETAINED_GENERATIONS = 3;
4
4
  export type AbsoluteMobileCompatibilityPage = {
5
5
  bundleHash: string;
6
+ bundlePath: string;
6
7
  contract: string;
7
8
  framework: AbsoluteMobilePageFramework;
8
9
  pageId: string;
@@ -0,0 +1,13 @@
1
+ import type { NormalizedAbsoluteMobileConfig } from './config';
2
+ export type AbsoluteMobileReleaseCheck = {
3
+ detail: string;
4
+ id: string;
5
+ path?: string;
6
+ remediation?: string;
7
+ status: 'fail' | 'pass';
8
+ };
9
+ export type AbsoluteMobileReleaseDoctorResult = {
10
+ checks: AbsoluteMobileReleaseCheck[];
11
+ ready: boolean;
12
+ };
13
+ export declare const inspectAbsoluteMobileRelease: (config: NormalizedAbsoluteMobileConfig, projectRoot: string) => Promise<AbsoluteMobileReleaseDoctorResult>;
@@ -0,0 +1,130 @@
1
+ import type { AbsoluteAndroidReleaseMetadata } from './androidRelease';
2
+ import type { AbsoluteIosReleaseMetadata } from './iosRelease';
3
+ export type AbsoluteGooglePlayReleaseTarget = {
4
+ changesNotSentForReview?: boolean;
5
+ inAppUpdatePriority?: number;
6
+ name?: string;
7
+ releaseNotes?: readonly {
8
+ language: string;
9
+ text: string;
10
+ }[];
11
+ reviewBehavior?: 'CANCEL_IN_REVIEW_AND_SUBMIT' | 'ERROR_IF_IN_REVIEW';
12
+ status?: 'completed' | 'draft' | 'halted' | 'inProgress';
13
+ track: string;
14
+ userFraction?: number;
15
+ };
16
+ export type AbsoluteAppStoreConnectReleaseTarget = {
17
+ groups?: readonly string[];
18
+ submitForReview?: boolean;
19
+ whatsNew?: readonly {
20
+ locale: string;
21
+ text: string;
22
+ }[];
23
+ };
24
+ export type AbsoluteNativeReleasePublication = {
25
+ channel?: {
26
+ channel: string;
27
+ releaseId: string;
28
+ };
29
+ record: {
30
+ metadata: AbsoluteAndroidReleaseMetadata | AbsoluteIosReleaseMetadata;
31
+ };
32
+ reused: boolean;
33
+ googlePlay?: {
34
+ receipt: {
35
+ intent: {
36
+ track: string;
37
+ };
38
+ packageName: string;
39
+ provider: 'google-play';
40
+ releaseId: string;
41
+ sha256: string;
42
+ stage: string;
43
+ versionCode?: string;
44
+ };
45
+ reused: boolean;
46
+ };
47
+ appStoreConnect?: {
48
+ receipt: {
49
+ appleAppId: string;
50
+ buildId?: string;
51
+ buildNumber: number;
52
+ intent: {
53
+ groups: string[];
54
+ submitForReview: boolean;
55
+ };
56
+ marketingVersion: string;
57
+ provider: 'app-store-connect';
58
+ releaseId: string;
59
+ sha256: string;
60
+ stage: string;
61
+ };
62
+ reused: boolean;
63
+ };
64
+ };
65
+ export type AbsoluteNativeReleasePublisher = {
66
+ prepareAndroidRelease?: (options: {
67
+ buildIdentity: string;
68
+ googlePlay?: AbsoluteGooglePlayReleaseTarget;
69
+ packageName: string;
70
+ signal?: AbortSignal;
71
+ }) => Promise<{
72
+ versionCode?: number;
73
+ }>;
74
+ prepareIosRelease?: (options: {
75
+ buildIdentity: string;
76
+ bundleId: string;
77
+ marketingVersion: string;
78
+ signal?: AbortSignal;
79
+ }) => Promise<{
80
+ buildNumber: number;
81
+ }>;
82
+ publish: (options: {
83
+ allowUnsigned?: boolean;
84
+ appStoreConnect?: AbsoluteAppStoreConnectReleaseTarget;
85
+ channel?: string;
86
+ googlePlay?: AbsoluteGooglePlayReleaseTarget;
87
+ releaseRoot: string;
88
+ signal?: AbortSignal;
89
+ }) => Promise<AbsoluteNativeReleasePublication>;
90
+ };
91
+ export declare const prepareAbsoluteIosRelease: (publisher: AbsoluteNativeReleasePublisher, options: {
92
+ buildIdentity: string;
93
+ bundleId: string;
94
+ marketingVersion: string;
95
+ signal?: AbortSignal;
96
+ }) => Promise<number>;
97
+ type PrepareAbsoluteAndroidReleaseOptions = {
98
+ buildIdentity: string;
99
+ googlePlay: AbsoluteGooglePlayReleaseTarget;
100
+ packageName: string;
101
+ signal?: AbortSignal;
102
+ };
103
+ export declare const prepareAbsoluteAndroidRelease: (publisher: AbsoluteNativeReleasePublisher, options: PrepareAbsoluteAndroidReleaseOptions) => Promise<number>;
104
+ export type PublishAbsoluteAndroidReleaseOptions = {
105
+ allowUnsigned?: boolean;
106
+ channel?: string;
107
+ googlePlay?: AbsoluteGooglePlayReleaseTarget;
108
+ modulePath: string;
109
+ projectRoot: string;
110
+ release: {
111
+ metadata: AbsoluteAndroidReleaseMetadata;
112
+ releaseRoot: string;
113
+ };
114
+ signal?: AbortSignal;
115
+ };
116
+ export declare const loadAbsoluteNativeReleasePublisher: (projectRoot: string, requestedModulePath: string) => Promise<AbsoluteNativeReleasePublisher>;
117
+ export declare const publishAbsoluteAndroidRelease: (options: PublishAbsoluteAndroidReleaseOptions) => Promise<AbsoluteNativeReleasePublication>;
118
+ export declare const publishAbsoluteIosRelease: (options: {
119
+ allowUnsigned?: boolean;
120
+ appStoreConnect?: AbsoluteAppStoreConnectReleaseTarget;
121
+ channel?: string;
122
+ modulePath: string;
123
+ projectRoot: string;
124
+ release: {
125
+ metadata: AbsoluteIosReleaseMetadata;
126
+ releaseRoot: string;
127
+ };
128
+ signal?: AbortSignal;
129
+ }) => Promise<AbsoluteNativeReleasePublication>;
130
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { AbsoluteMobileCompatibilityRoute } from './releaseArtifact';
2
+ export declare const matchesAbsoluteMobileRoutePattern: (pattern: string, pathname: string) => boolean;
3
+ export declare const resolveAbsoluteMobileRoute: (routes: readonly AbsoluteMobileCompatibilityRoute[], pathname: string, method?: "GET" | "HEAD") => AbsoluteMobileCompatibilityRoute | undefined;
@@ -0,0 +1,13 @@
1
+ import type { BunPlugin } from 'bun';
2
+ import { type AbsoluteMobileBuildPageMetadata } from './buildMetadata';
3
+ type MobileRouteTransformOptions = {
4
+ entry: string;
5
+ projectRoot?: string;
6
+ };
7
+ export declare const ABSOLUTE_MOBILE_TRANSFORM_PROTOCOL: 1;
8
+ export declare const createAbsoluteMobileRouteMetadataPlugin: (options: MobileRouteTransformOptions) => BunPlugin;
9
+ export declare const inspectAbsoluteMobileRouteMetadata: (options: MobileRouteTransformOptions) => {
10
+ file: string;
11
+ metadata: AbsoluteMobileBuildPageMetadata;
12
+ }[];
13
+ export {};
@@ -0,0 +1 @@
1
+ export declare const startAbsoluteMobileShell: () => Promise<void>;
@@ -0,0 +1,31 @@
1
+ import { type AbsoluteMobilePageActivationOptions } from './client';
2
+ import type { AbsoluteMobileCompatibilityPage, AbsoluteMobileCompatibilityRoute } from './releaseArtifact';
3
+ export declare const ABSOLUTE_MOBILE_CLIENT_MANIFEST_FORMAT: 1;
4
+ export type AbsoluteMobileClientPage = AbsoluteMobileCompatibilityPage & {
5
+ localBundlePath: string;
6
+ };
7
+ export type AbsoluteMobileClientManifest = {
8
+ appBuild: string;
9
+ appId: string;
10
+ appName: string;
11
+ deepLinkHosts: string[];
12
+ deepLinkScheme?: string;
13
+ entry: string;
14
+ format: typeof ABSOLUTE_MOBILE_CLIENT_MANIFEST_FORMAT;
15
+ pages: AbsoluteMobileClientPage[];
16
+ productionOrigin: string;
17
+ routes: AbsoluteMobileCompatibilityRoute[];
18
+ runtime: string;
19
+ };
20
+ export type AbsoluteMobileTransportOptions = {
21
+ fetch?: typeof globalThis.fetch;
22
+ headers?: HeadersInit;
23
+ };
24
+ export declare const createAbsoluteMobilePageRequest: (manifest: AbsoluteMobileClientManifest, path: string, options?: AbsoluteMobileTransportOptions) => Request;
25
+ export declare const fetchAbsoluteMobilePage: (manifest: AbsoluteMobileClientManifest, path: string, options?: AbsoluteMobileTransportOptions) => Promise<unknown>;
26
+ export declare const navigateAbsoluteMobilePage: (manifest: AbsoluteMobileClientManifest, path: string, options: AbsoluteMobileTransportOptions & AbsoluteMobilePageActivationOptions) => Promise<import("./pageProtocol").AbsoluteMobileUpgradeRequiredResult | {
27
+ contract: string;
28
+ kind: "rendered";
29
+ pageId: string;
30
+ }>;
31
+ export declare const resolveAbsoluteMobileDeepLink: (manifest: AbsoluteMobileClientManifest, value: string) => string;
@@ -1,5 +1,5 @@
1
1
  import { Breakpoint, Breakpoints } from '../../../types/mediaQuery';
2
- export declare const UserAgentProvider: import("react").Provider<"other" | "bot" | "phone" | "tablet" | "tv" | "console" | "car" | "iot" | "desktop" | null>;
2
+ export declare const UserAgentProvider: import("react").Provider<"console" | "other" | "bot" | "phone" | "tablet" | "tv" | "car" | "iot" | "desktop" | null>;
3
3
  export declare const useMediaQuery: (customBreakpoints?: Breakpoints) => {
4
4
  breakpoint: string;
5
5
  isSizeOrGreater: (target: Breakpoint) => boolean;
@@ -1,4 +1,4 @@
1
- import { Fragment, jsx } from 'react/jsx-runtime';
1
+ import { Fragment, jsx } from './jsxRuntimeCompat';
2
2
  type JSXType = Parameters<typeof jsx>[0];
3
3
  type JSXKey = Parameters<typeof jsx>[2];
4
4
  type JSXProps = Parameters<typeof jsx>[1] & {
@@ -0,0 +1,7 @@
1
+ import { Fragment, jsx as reactJsx } from 'react/jsx-runtime';
2
+ type JSXType = Parameters<typeof reactJsx>[0];
3
+ type JSXProps = Parameters<typeof reactJsx>[1];
4
+ type JSXKey = Parameters<typeof reactJsx>[2];
5
+ export { Fragment };
6
+ export declare const jsx: (type: JSXType, props: JSXProps, key?: JSXKey) => import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
7
+ export declare const jsxs: (type: JSXType, props: JSXProps, key?: JSXKey) => import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
@@ -1,4 +1,5 @@
1
1
  import type { ComponentType as ReactComponent } from 'react';
2
+ import type { AbsoluteMobileBuildPageMetadata } from '../mobile/buildMetadata';
2
3
  import { type StreamingSlotEnhancerOptions } from '../core/responseEnhancers';
3
4
  type ReactPageRenderOptions = StreamingSlotEnhancerOptions & {
4
5
  collectStreamingSlots?: boolean;
@@ -9,6 +10,8 @@ type ReactPageRenderOptions = StreamingSlotEnhancerOptions & {
9
10
  bufferStreamForEtag?: boolean;
10
11
  };
11
12
  export type ReactPageRequestInput<Props extends Record<string, unknown> = Record<never, never>> = ReactPageRenderOptions & {
13
+ /** @internal Build-generated mobile identity. Application code must not set this. */
14
+ __absoluteMobile?: AbsoluteMobileBuildPageMetadata;
12
15
  Page: ReactComponent<Props>;
13
16
  index: string;
14
17
  /** The incoming Elysia request. When provided, the request's pathname
@@ -20,6 +20,7 @@ export declare const loadConfig: (configPath?: string) => Promise<{
20
20
  emberDirectory?: string;
21
21
  htmlDirectory?: string;
22
22
  htmxDirectory?: string;
23
+ mobile?: import("..").MobileConfig;
23
24
  stylesConfig?: string | import("..").StylesConfig;
24
25
  stylePreprocessors?: import("..").StylePreprocessorConfig;
25
26
  postcss?: import("..").PostCSSConfig;
@@ -3,6 +3,7 @@
3
3
  * Provides formatted output with ANSI colors and timestamps
4
4
  */
5
5
  import { formatTimestamp } from './startupBanner';
6
+ import type { HMRApplyKind, HMRApplyOutcome, HMRClientTarget } from '../../types/messages';
6
7
  export { formatTimestamp };
7
8
  /**
8
9
  * Startup banner
@@ -30,6 +31,7 @@ export declare const logError: (message: string, error?: Error | string) => void
30
31
  * HMR update message
31
32
  * Format: "10:30:45 AM [hmr] hmr update /pages/App.tsx"
32
33
  */
34
+ export declare const logHmrClientUpdate: (path: string, framework: string | undefined, duration: number, target: HMRClientTarget, serverMs?: number, clientMs?: number, outcome?: HMRApplyOutcome, kind?: HMRApplyKind) => void;
33
35
  export declare const logHmrUpdate: (path: string, framework?: string, duration?: number) => void;
34
36
  /**
35
37
  * Generic info message
@@ -1 +1 @@
1
- export declare const getUserAgentType: (userAgent: string) => "other" | "bot" | "phone" | "tablet" | "tv" | "console" | "car" | "iot" | "desktop";
1
+ export declare const getUserAgentType: (userAgent: string) => "console" | "other" | "bot" | "phone" | "tablet" | "tv" | "car" | "iot" | "desktop";
@@ -1976,6 +1976,19 @@ var colors2, frameworkColors, formatPath = (filePath) => {
1976
1976
  const errorMsg = error instanceof Error ? error.message : error;
1977
1977
  const fullMessage = `${colors2.red}error${colors2.reset} ${message}${errorMsg ? `: ${errorMsg}` : ""}`;
1978
1978
  console.error(`${timestamp} ${tag} ${fullMessage}`);
1979
+ }, logHmrClientUpdate = (path, framework, duration, target, serverMs, clientMs, outcome = "applied", kind) => {
1980
+ const timestamp = `${colors2.dim}${formatTimestamp()}${colors2.reset}`;
1981
+ const targetLabel = target.startsWith("capacitor-") ? target.slice("capacitor-".length) : target;
1982
+ const tag = `${colors2.cyan}[hmr:${targetLabel}]${colors2.reset}`;
1983
+ const pathColor = framework ? getFrameworkColor(framework) : colors2.white;
1984
+ const breakdown = serverMs === undefined || clientMs === undefined ? "" : `; server ${serverMs}ms, client ${clientMs}ms`;
1985
+ let action = "failed after";
1986
+ if (outcome === "applied")
1987
+ action = "applied in";
1988
+ else if (outcome === "reloaded")
1989
+ action = "falling back to reload after";
1990
+ const kindLabel = kind ? `${kind} ` : "";
1991
+ console.log(`${timestamp} ${tag} ${framework ?? "update"} ${kindLabel}${pathColor}${formatPath(path)}${colors2.reset} ${colors2.dim}${action} ${duration}ms${breakdown}${colors2.reset}`);
1979
1992
  }, logHmrUpdate = (path, framework, duration) => {
1980
1993
  log("hmr update", { duration, framework, path });
1981
1994
  }, logInfo = (message) => {
@@ -4726,5 +4739,5 @@ export {
4726
4739
  createTypedIsland
4727
4740
  };
4728
4741
 
4729
- //# debugId=58FB2DF95ACA563C64756E2164756E21
4742
+ //# debugId=8B013C6A3D2007D964756E2164756E21
4730
4743
  //# sourceMappingURL=index.js.map