@absolutejs/absolute 0.20.0-beta.7 → 0.20.0-beta.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +205 -0
- package/dist/angular/browser.js +392 -405
- package/dist/angular/browser.js.map +3 -3
- package/dist/angular/components/core/streamingSlotRegistrar.js +7 -7
- package/dist/angular/components/core/streamingSlotRegistry.js +4 -4
- package/dist/angular/index.js +379 -321
- package/dist/angular/index.js.map +8 -7
- package/dist/angular/server.js +133 -61
- package/dist/angular/server.js.map +8 -7
- package/dist/build.js +2629 -1416
- package/dist/build.js.map +26 -19
- package/dist/cli/config/client.js +12 -12
- package/dist/cli/config/server.js +1140 -1091
- package/dist/cli/index.js +41579 -15184
- package/dist/client/chunks/angularPatch-arh4sr68.js +157 -0
- package/dist/client/chunks/angularPatch-arh4sr68.js.map +10 -0
- package/dist/client/chunks/index-5py90ctf.js +87 -0
- package/dist/client/chunks/index-5py90ctf.js.map +10 -0
- package/dist/client/chunks/index-m35nbkdp.js +374 -0
- package/dist/client/chunks/index-m35nbkdp.js.map +12 -0
- package/dist/client/chunks/index-qxjc7kc5.js +12 -0
- package/dist/client/chunks/index-qxjc7kc5.js.map +9 -0
- package/dist/client/chunks/islands-xj2n8nwf.js +281 -0
- package/dist/client/chunks/islands-xj2n8nwf.js.map +14 -0
- package/dist/client/chunks/react-pdg4325x.js +65 -0
- package/dist/client/chunks/react-pdg4325x.js.map +10 -0
- package/dist/client/chunks/svelte-s0c964kb.js +19 -0
- package/dist/client/chunks/svelte-s0c964kb.js.map +10 -0
- package/dist/client/chunks/vue-rdskrnyg.js +24 -0
- package/dist/client/chunks/vue-rdskrnyg.js.map +10 -0
- package/dist/client/index.js +73 -841
- package/dist/client/index.js.map +7 -20
- package/dist/core/streamingSlotRegistrar.js +15 -13
- package/dist/core/streamingSlotRegistrar.js.map +2 -2
- package/dist/core/streamingSlotRegistry.js +11 -9
- package/dist/core/streamingSlotRegistry.js.map +2 -2
- package/dist/dev/client/hmrClient.ts +35 -3
- package/dist/dev/client/hmrTiming.ts +6 -0
- package/dist/dev/client/syncDevtools.ts +237 -0
- package/dist/dev/serverBootstrap.js +572 -6
- package/dist/image-client/imageClient.js +7 -7
- package/dist/index.js +4157 -2440
- package/dist/index.js.map +43 -32
- package/dist/islands/browser.js +11 -25
- package/dist/islands/browser.js.map +2 -2
- package/dist/islands/index.js +55 -52
- package/dist/islands/index.js.map +5 -4
- package/dist/mobile/browser.js +429 -20
- package/dist/mobile/browser.js.map +8 -5
- package/dist/mobile/index.js +37077 -4967
- package/dist/mobile/index.js.map +100 -18
- package/dist/mobile/mobilePreviewClient.ts +246 -0
- package/dist/mobile/remoteMacAgentEntry.js +1899 -14
- package/dist/mobile/shellAuth.js +20 -9
- package/dist/mobile/shellBootstrap.js +6801 -120
- package/dist/mobile/shellExpoAuth.js +179 -0
- package/dist/mobile/shellExpoDevices.js +93 -0
- package/dist/mobile/shellExpoSync.js +120 -0
- package/dist/mobile/shellSync.js +152 -3
- package/dist/mobile/shellUpdate.js +559 -0
- package/dist/mobile/uiPrimitives.js +280 -0
- package/dist/react/browser.js +17 -59
- package/dist/react/browser.js.map +2 -2
- package/dist/react/components/browser/index.js +107 -107
- package/dist/react/components/index.js +118 -116
- package/dist/react/components/index.js.map +2 -2
- package/dist/react/hooks/index.js +11 -25
- package/dist/react/hooks/index.js.map +2 -2
- package/dist/react/index.js +110 -67
- package/dist/react/index.js.map +8 -7
- package/dist/react/jsxDevRuntimeCompat.js +11 -9
- package/dist/react/jsxDevRuntimeCompat.js.map +2 -2
- package/dist/react/jsxRuntimeCompat.js +11 -9
- package/dist/react/jsxRuntimeCompat.js.map +2 -2
- package/dist/react/router/browser.js +9 -7
- package/dist/react/router/browser.js.map +2 -2
- package/dist/react/router/index.js +9 -7
- package/dist/react/router/index.js.map +2 -2
- package/dist/react/server.js +67 -11
- package/dist/react/server.js.map +7 -6
- package/dist/src/build/chainInlineSourcemaps.d.ts +2 -0
- package/dist/src/build/pwa.d.ts +16 -0
- package/dist/src/build/vueCompileCache.d.ts +43 -0
- package/dist/src/cli/config/server.d.ts +1 -1
- package/dist/src/cli/instanceStatus.d.ts +1 -0
- package/dist/src/cli/scripts/dev.d.ts +2 -0
- package/dist/src/client/browserTranslation.d.ts +19 -0
- package/dist/src/client/index.d.ts +1 -0
- package/dist/src/core/browserTranslation.d.ts +6 -0
- package/dist/src/core/devBuild.d.ts +1 -0
- package/dist/src/core/prepare.d.ts +376 -0
- package/dist/src/dev/bootLifecycle.d.ts +11 -0
- package/dist/src/dev/clientManager.d.ts +1 -0
- package/dist/src/dev/devCert.d.ts +6 -4
- package/dist/src/dev/earlyListener.d.ts +41 -0
- package/dist/src/dev/serverEntryCopies.d.ts +3 -0
- package/dist/src/ember/browser.d.ts +0 -16
- package/dist/src/mobile/adaptiveShell.d.ts +27 -0
- package/dist/src/mobile/androidEmulatorController.d.ts +8 -1
- package/dist/src/mobile/androidRelease.d.ts +9 -2
- package/dist/src/mobile/androidTestReport.d.ts +14 -0
- package/dist/src/mobile/androidUpgradeConformance.d.ts +47 -0
- package/dist/src/mobile/androidWebView.d.ts +1 -0
- package/dist/src/mobile/browser.d.ts +2 -0
- package/dist/src/mobile/capacitorBundle.d.ts +33 -1
- package/dist/src/mobile/ciWorkflow.d.ts +26 -0
- package/dist/src/mobile/config.d.ts +22 -1
- package/dist/src/mobile/devDeviceAdapter.d.ts +3 -0
- package/dist/src/mobile/deviceCapabilities.d.ts +49 -0
- package/dist/src/mobile/expoBridge.d.ts +91 -0
- package/dist/src/mobile/expoCodeSigning.d.ts +14 -0
- package/dist/src/mobile/expoDevController.d.ts +64 -0
- package/dist/src/mobile/expoNativeObservability.d.ts +3 -0
- package/dist/src/mobile/expoProject.d.ts +16 -0
- package/dist/src/mobile/expoUpdate.d.ts +27 -0
- package/dist/src/mobile/index.d.ts +29 -0
- package/dist/src/mobile/iosDeviceAcceptance.d.ts +32 -0
- package/dist/src/mobile/iosPhysicalDeviceTransport.d.ts +16 -0
- package/dist/src/mobile/iosRelease.d.ts +63 -3
- package/dist/src/mobile/iosSimulatorController.d.ts +20 -2
- package/dist/src/mobile/iosTestReport.d.ts +24 -0
- package/dist/src/mobile/mobileBundleInspection.d.ts +63 -0
- package/dist/src/mobile/mobileInspect.d.ts +156 -0
- package/dist/src/mobile/mobilePreview.d.ts +174 -0
- package/dist/src/mobile/mobilePreviewClient.d.ts +1 -0
- package/dist/src/mobile/nativeAuth.d.ts +6 -0
- package/dist/src/mobile/nativeBackgroundSync.d.ts +4 -0
- package/dist/src/mobile/nativeDeviceCapabilities.d.ts +6 -0
- package/dist/src/mobile/nativeObservability.d.ts +4 -0
- package/dist/src/mobile/nativeRoute.d.ts +13 -0
- package/dist/src/mobile/nativeTestReport.d.ts +91 -0
- package/dist/src/mobile/nativeUpdates.d.ts +4 -0
- package/dist/src/mobile/navigationLifecycle.d.ts +36 -0
- package/dist/src/mobile/navigationState.d.ts +53 -0
- package/dist/src/mobile/pageProtocol.d.ts +2 -0
- package/dist/src/mobile/releaseDoctor.d.ts +23 -1
- package/dist/src/mobile/remoteMacProtocol.d.ts +134 -1
- package/dist/src/mobile/remoteMacWire.d.ts +1 -1
- package/dist/src/mobile/shellAuth.d.ts +5 -1
- package/dist/src/mobile/shellBootstrap.d.ts +12 -2
- package/dist/src/mobile/shellExpoAuth.d.ts +12 -0
- package/dist/src/mobile/shellExpoDevices.d.ts +3 -0
- package/dist/src/mobile/shellExpoSync.d.ts +18 -0
- package/dist/src/mobile/shellHttp.d.ts +2 -0
- package/dist/src/mobile/shellNativeObservability.d.ts +21 -0
- package/dist/src/mobile/shellObservability.d.ts +11 -0
- package/dist/src/mobile/shellPush.d.ts +11 -0
- package/dist/src/mobile/shellSync.d.ts +37 -4
- package/dist/src/mobile/shellUpdate.d.ts +2 -0
- package/dist/src/mobile/syncRemediation.d.ts +10 -0
- package/dist/src/mobile/syncSchema.d.ts +9 -0
- package/dist/src/mobile/transport.d.ts +21 -0
- package/dist/src/mobile/uiPrimitives.d.ts +37 -0
- package/dist/src/mobile/updateClient.d.ts +44 -0
- package/dist/src/mobile/updateProtocol.d.ts +51 -0
- package/dist/src/mobile/updatePublisher.d.ts +66 -0
- package/dist/src/mobile/updateRollout.d.ts +16 -0
- package/dist/src/mobile/updateRuntime.d.ts +37 -0
- package/dist/src/mobile/updateSigning.d.ts +20 -0
- package/dist/src/plugins/hmr.d.ts +3 -0
- package/dist/src/plugins/imageOptimizer.d.ts +1 -1
- package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
- package/dist/src/utils/imageProcessing.d.ts +3 -0
- package/dist/src/utils/loadConfig.d.ts +1 -0
- package/dist/src/utils/logger.d.ts +1 -0
- package/dist/src/utils/startupBanner.d.ts +1 -0
- package/dist/src/utils/startupTimings.d.ts +4 -0
- package/dist/src/utils/userAgentFunctions.d.ts +1 -1
- package/dist/src/vue/browser.d.ts +1 -0
- package/dist/src/vue/browserTranslation.d.ts +5 -0
- package/dist/src/vue/index.d.ts +1 -0
- package/dist/svelte/browser.js +12 -26
- package/dist/svelte/browser.js.map +2 -2
- package/dist/svelte/index.js +104 -61
- package/dist/svelte/index.js.map +8 -7
- package/dist/svelte/server.js +84 -28
- package/dist/svelte/server.js.map +7 -6
- package/dist/types/build.d.ts +83 -3
- package/dist/types/cli.d.ts +1 -0
- package/dist/types/globals.d.ts +15 -0
- package/dist/types/messages.d.ts +1 -1
- package/dist/vue/browser.js +116 -56
- package/dist/vue/browser.js.map +5 -3
- package/dist/vue/components/Image.js +9 -7
- package/dist/vue/components/Image.js.map +2 -2
- package/dist/vue/components/index.js +11 -9
- package/dist/vue/components/index.js.map +2 -2
- package/dist/vue/index.js +211 -94
- package/dist/vue/index.js.map +10 -7
- package/dist/vue/server.js +69 -13
- package/dist/vue/server.js.map +7 -6
- package/package.json +46 -15
|
@@ -15,6 +15,9 @@ const isHmrTarget = (value: unknown): value is HMRClientTarget =>
|
|
|
15
15
|
value === 'capacitor-android' ||
|
|
16
16
|
value === 'capacitor-ios' ||
|
|
17
17
|
value === 'capacitor-native' ||
|
|
18
|
+
value === 'expo-android' ||
|
|
19
|
+
value === 'expo-ios' ||
|
|
20
|
+
value === 'mobile-preview' ||
|
|
18
21
|
value === 'web';
|
|
19
22
|
|
|
20
23
|
const isHmrKind = (value: unknown): value is HMRApplyKind =>
|
|
@@ -69,6 +72,9 @@ export const absoluteHmrClientTarget = () => {
|
|
|
69
72
|
const marker = new URLSearchParams(search).get('__absolute_target');
|
|
70
73
|
if (marker === 'capacitor-android') return marker;
|
|
71
74
|
if (marker === 'capacitor-ios') return marker;
|
|
75
|
+
if (marker === 'expo-android') return marker;
|
|
76
|
+
if (marker === 'expo-ios') return marker;
|
|
77
|
+
if (marker === 'mobile-preview') return marker;
|
|
72
78
|
}
|
|
73
79
|
}
|
|
74
80
|
const capacitor = Reflect.get(globalThis, 'Capacitor');
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import type {} from '../../types/globals';
|
|
2
|
+
import {
|
|
3
|
+
discardSyncRuntimeDeadLetter,
|
|
4
|
+
inspectSyncRuntime,
|
|
5
|
+
rebaseSyncRuntimeDeadLetter,
|
|
6
|
+
retrySyncRuntimeDeadLetter,
|
|
7
|
+
type SyncRuntimeInspection
|
|
8
|
+
} from '@absolutejs/sync/client/runtime';
|
|
9
|
+
|
|
10
|
+
export type SyncDevtoolsBridge = {
|
|
11
|
+
discard: (operationId: string) => Promise<void>;
|
|
12
|
+
inspect: () => Promise<SyncRuntimeInspection>;
|
|
13
|
+
rebase: (operationId: string, args: unknown) => Promise<string>;
|
|
14
|
+
retry: (operationId: string) => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const DEVTOOLS_ID = 'absolutejs-sync-devtools';
|
|
18
|
+
const REFRESH_INTERVAL_MS = 1_500;
|
|
19
|
+
const bridge: SyncDevtoolsBridge = {
|
|
20
|
+
discard: discardSyncRuntimeDeadLetter,
|
|
21
|
+
inspect: inspectSyncRuntime,
|
|
22
|
+
rebase: rebaseSyncRuntimeDeadLetter,
|
|
23
|
+
retry: retrySyncRuntimeDeadLetter
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const time = (value: number | undefined) =>
|
|
27
|
+
value === undefined ? '—' : new Date(value).toLocaleTimeString();
|
|
28
|
+
|
|
29
|
+
const styles = `
|
|
30
|
+
:host { all: initial; color-scheme: light dark; }
|
|
31
|
+
button { font: inherit; }
|
|
32
|
+
.trigger { position:fixed;right:max(12px,env(safe-area-inset-right));bottom:max(12px,env(safe-area-inset-bottom));z-index:2147483645;border:0;border-radius:999px;padding:9px 13px;background:#111827;color:#fff;box-shadow:0 4px 18px #0006;font:600 12px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace; }
|
|
33
|
+
.trigger[data-alert=true] { background:#b91c1c; }
|
|
34
|
+
.panel { position:fixed;inset:max(12px,env(safe-area-inset-top)) max(12px,env(safe-area-inset-right)) max(56px,env(safe-area-inset-bottom)) auto;z-index:2147483645;width:min(420px,calc(100vw - 24px));max-height:calc(100vh - 80px);overflow:auto;border:1px solid #64748b66;border-radius:14px;background:#fffffff2;color:#111827;box-shadow:0 16px 48px #0008;font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;backdrop-filter:blur(12px); }
|
|
35
|
+
[hidden] { display:none!important; }
|
|
36
|
+
header { position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid #64748b44;background:inherit; }
|
|
37
|
+
h2 { margin:0;font-size:14px; }
|
|
38
|
+
.close,.action { border:1px solid #64748b66;border-radius:7px;background:transparent;color:inherit;padding:5px 8px; }
|
|
39
|
+
.body { padding:12px 14px; }
|
|
40
|
+
.metrics { display:grid;grid-template-columns:repeat(2,1fr);gap:7px;margin-bottom:12px; }
|
|
41
|
+
.metric { padding:8px;border-radius:8px;background:#64748b18; }
|
|
42
|
+
.metric strong { display:block;font-size:16px; }
|
|
43
|
+
.empty { color:#64748b; }
|
|
44
|
+
.letter { margin-top:9px;padding:10px;border:1px solid #ef444466;border-radius:9px;overflow-wrap:anywhere; }
|
|
45
|
+
.letter strong { display:block; }
|
|
46
|
+
.meta { color:#64748b;margin:4px 0 8px; }
|
|
47
|
+
.actions { display:flex;flex-wrap:wrap;gap:6px; }
|
|
48
|
+
.danger { color:#b91c1c; }
|
|
49
|
+
.notice { margin-bottom:9px;padding:8px;border-radius:7px;background:#f59e0b22; }
|
|
50
|
+
@media (prefers-color-scheme:dark) { .panel { background:#111827f2;color:#f8fafc; } .empty,.meta { color:#94a3b8; } .danger { color:#fca5a5; } }
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
const renderInspection = (
|
|
54
|
+
body: HTMLElement,
|
|
55
|
+
inspection: SyncRuntimeInspection,
|
|
56
|
+
notice?: string
|
|
57
|
+
) => {
|
|
58
|
+
body.replaceChildren();
|
|
59
|
+
if (notice) {
|
|
60
|
+
const message = document.createElement('div');
|
|
61
|
+
message.className = 'notice';
|
|
62
|
+
message.textContent = notice;
|
|
63
|
+
body.appendChild(message);
|
|
64
|
+
}
|
|
65
|
+
const metrics = document.createElement('div');
|
|
66
|
+
metrics.className = 'metrics';
|
|
67
|
+
for (const [label, value] of [
|
|
68
|
+
['Pending', inspection.pending],
|
|
69
|
+
['Dead letters', inspection.deadLetters.length],
|
|
70
|
+
['Conflicts', inspection.conflicts],
|
|
71
|
+
['Auto-resolved', inspection.automaticResolutions]
|
|
72
|
+
] as const) {
|
|
73
|
+
const metric = document.createElement('div');
|
|
74
|
+
metric.className = 'metric';
|
|
75
|
+
const strong = document.createElement('strong');
|
|
76
|
+
strong.textContent = String(value);
|
|
77
|
+
metric.append(strong, label);
|
|
78
|
+
metrics.appendChild(metric);
|
|
79
|
+
}
|
|
80
|
+
body.appendChild(metrics);
|
|
81
|
+
const activity = document.createElement('div');
|
|
82
|
+
activity.className = 'meta';
|
|
83
|
+
activity.textContent = `Clients ${inspection.clients} · last push ${time(inspection.lastSuccessfulPushAt)} · last pull ${time(inspection.lastSuccessfulPullAt)}`;
|
|
84
|
+
body.appendChild(activity);
|
|
85
|
+
if (inspection.deadLetters.length === 0) {
|
|
86
|
+
const empty = document.createElement('div');
|
|
87
|
+
empty.className = 'empty';
|
|
88
|
+
empty.textContent = 'No mutations need manual remediation.';
|
|
89
|
+
body.appendChild(empty);
|
|
90
|
+
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
for (const deadLetter of inspection.deadLetters) {
|
|
94
|
+
const item = document.createElement('section');
|
|
95
|
+
item.className = 'letter';
|
|
96
|
+
const title = document.createElement('strong');
|
|
97
|
+
title.textContent = deadLetter.name;
|
|
98
|
+
const metadata = document.createElement('div');
|
|
99
|
+
metadata.className = 'meta';
|
|
100
|
+
metadata.textContent = `${deadLetter.kind ?? 'rejected'}${deadLetter.code ? ` · ${deadLetter.code}` : ''} · attempts ${deadLetter.attempts} · ${time(deadLetter.deadLetteredAt)}`;
|
|
101
|
+
const detail = document.createElement('div');
|
|
102
|
+
detail.textContent =
|
|
103
|
+
deadLetter.message ?? 'The server rejected this mutation.';
|
|
104
|
+
const actions = document.createElement('div');
|
|
105
|
+
actions.className = 'actions';
|
|
106
|
+
for (const [action, label] of [
|
|
107
|
+
['retry', 'Retry unchanged'],
|
|
108
|
+
['rebase', 'Rebase with new args'],
|
|
109
|
+
['discard', 'Discard']
|
|
110
|
+
] as const) {
|
|
111
|
+
const button = document.createElement('button');
|
|
112
|
+
button.className = `action${action === 'discard' ? ' danger' : ''}`;
|
|
113
|
+
button.dataset.action = action;
|
|
114
|
+
button.dataset.operationId = deadLetter.operationId;
|
|
115
|
+
button.textContent = label;
|
|
116
|
+
actions.appendChild(button);
|
|
117
|
+
}
|
|
118
|
+
item.append(title, metadata, detail, actions);
|
|
119
|
+
body.appendChild(item);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/** Install the development-only, framework-neutral native Sync panel. */
|
|
124
|
+
export const installAbsoluteNativeSyncDevtools = (
|
|
125
|
+
devtoolsBridge: SyncDevtoolsBridge = bridge
|
|
126
|
+
) => {
|
|
127
|
+
if (typeof document === 'undefined' || !document.body)
|
|
128
|
+
return () => undefined;
|
|
129
|
+
if (document.getElementById(DEVTOOLS_ID)) return () => undefined;
|
|
130
|
+
const host = document.createElement('aside');
|
|
131
|
+
host.id = DEVTOOLS_ID;
|
|
132
|
+
host.dataset.hmrOverlay = 'true';
|
|
133
|
+
const root = host.attachShadow({ mode: 'open' });
|
|
134
|
+
const style = document.createElement('style');
|
|
135
|
+
style.textContent = styles;
|
|
136
|
+
const trigger = document.createElement('button');
|
|
137
|
+
trigger.className = 'trigger';
|
|
138
|
+
trigger.textContent = 'Sync';
|
|
139
|
+
trigger.type = 'button';
|
|
140
|
+
const panel = document.createElement('section');
|
|
141
|
+
panel.className = 'panel';
|
|
142
|
+
panel.hidden = true;
|
|
143
|
+
const header = document.createElement('header');
|
|
144
|
+
const title = document.createElement('h2');
|
|
145
|
+
title.textContent = 'AbsoluteJS Sync';
|
|
146
|
+
const close = document.createElement('button');
|
|
147
|
+
close.className = 'close';
|
|
148
|
+
close.textContent = 'Close';
|
|
149
|
+
close.type = 'button';
|
|
150
|
+
header.append(title, close);
|
|
151
|
+
const body = document.createElement('div');
|
|
152
|
+
body.className = 'body';
|
|
153
|
+
panel.append(header, body);
|
|
154
|
+
root.append(style, trigger, panel);
|
|
155
|
+
document.body.appendChild(host);
|
|
156
|
+
let active = true;
|
|
157
|
+
let notice: string | undefined;
|
|
158
|
+
const refresh = async () => {
|
|
159
|
+
try {
|
|
160
|
+
const inspection = await devtoolsBridge.inspect();
|
|
161
|
+
if (!active) return;
|
|
162
|
+
trigger.dataset.alert = String(inspection.deadLetters.length > 0);
|
|
163
|
+
trigger.textContent = inspection.deadLetters.length
|
|
164
|
+
? `Sync · ${inspection.deadLetters.length}`
|
|
165
|
+
: 'Sync';
|
|
166
|
+
if (!panel.hidden) renderInspection(body, inspection, notice);
|
|
167
|
+
notice = undefined;
|
|
168
|
+
} catch {
|
|
169
|
+
if (!active || panel.hidden) return;
|
|
170
|
+
notice = 'Sync diagnostics are temporarily unavailable.';
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
trigger.addEventListener('click', () => {
|
|
174
|
+
panel.hidden = !panel.hidden;
|
|
175
|
+
if (!panel.hidden) void refresh();
|
|
176
|
+
});
|
|
177
|
+
close.addEventListener('click', () => {
|
|
178
|
+
panel.hidden = true;
|
|
179
|
+
});
|
|
180
|
+
const remediate = async (
|
|
181
|
+
action: string | undefined,
|
|
182
|
+
operationId: string
|
|
183
|
+
) => {
|
|
184
|
+
try {
|
|
185
|
+
if (action === 'retry') await devtoolsBridge.retry(operationId);
|
|
186
|
+
else if (action === 'discard') {
|
|
187
|
+
if (
|
|
188
|
+
!globalThis.confirm(
|
|
189
|
+
'Discard this local mutation permanently?'
|
|
190
|
+
)
|
|
191
|
+
)
|
|
192
|
+
return;
|
|
193
|
+
await devtoolsBridge.discard(operationId);
|
|
194
|
+
} else if (action === 'rebase') {
|
|
195
|
+
const serialized = globalThis.prompt(
|
|
196
|
+
'New mutation arguments as JSON. This creates a new operation intent:'
|
|
197
|
+
);
|
|
198
|
+
if (serialized === null) return;
|
|
199
|
+
let args: unknown;
|
|
200
|
+
try {
|
|
201
|
+
args = JSON.parse(serialized);
|
|
202
|
+
} catch {
|
|
203
|
+
notice = 'Rebase cancelled: arguments were not valid JSON.';
|
|
204
|
+
await refresh();
|
|
205
|
+
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (
|
|
209
|
+
!globalThis.confirm(
|
|
210
|
+
'Create a new mutation with these arguments?'
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
return;
|
|
214
|
+
await devtoolsBridge.rebase(operationId, args);
|
|
215
|
+
}
|
|
216
|
+
notice = 'Sync remediation applied.';
|
|
217
|
+
} catch {
|
|
218
|
+
notice =
|
|
219
|
+
'Sync remediation failed. The local mutation was retained.';
|
|
220
|
+
}
|
|
221
|
+
await refresh();
|
|
222
|
+
};
|
|
223
|
+
body.addEventListener('click', (event) => {
|
|
224
|
+
if (!(event.target instanceof HTMLButtonElement)) return;
|
|
225
|
+
const { action, operationId } = event.target.dataset;
|
|
226
|
+
if (!operationId) return;
|
|
227
|
+
void remediate(action, operationId);
|
|
228
|
+
});
|
|
229
|
+
const interval = setInterval(() => void refresh(), REFRESH_INTERVAL_MS);
|
|
230
|
+
void refresh();
|
|
231
|
+
|
|
232
|
+
return () => {
|
|
233
|
+
active = false;
|
|
234
|
+
clearInterval(interval);
|
|
235
|
+
host.remove();
|
|
236
|
+
};
|
|
237
|
+
};
|