@absolutejs/absolute 0.20.0-beta.6 → 0.20.0-beta.60

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 (179) hide show
  1. package/README.md +205 -0
  2. package/dist/angular/browser.js +392 -405
  3. package/dist/angular/browser.js.map +3 -3
  4. package/dist/angular/components/core/streamingSlotRegistrar.js +7 -7
  5. package/dist/angular/components/core/streamingSlotRegistry.js +4 -4
  6. package/dist/angular/index.js +379 -321
  7. package/dist/angular/index.js.map +8 -7
  8. package/dist/angular/server.js +133 -61
  9. package/dist/angular/server.js.map +8 -7
  10. package/dist/build.js +2336 -1347
  11. package/dist/build.js.map +22 -17
  12. package/dist/cli/config/client.js +12 -12
  13. package/dist/cli/config/server.js +1140 -1091
  14. package/dist/cli/index.js +9621 -2093
  15. package/dist/client/chunks/angularPatch-arh4sr68.js +157 -0
  16. package/dist/client/chunks/angularPatch-arh4sr68.js.map +10 -0
  17. package/dist/client/chunks/index-5py90ctf.js +87 -0
  18. package/dist/client/chunks/index-5py90ctf.js.map +10 -0
  19. package/dist/client/chunks/index-m35nbkdp.js +374 -0
  20. package/dist/client/chunks/index-m35nbkdp.js.map +12 -0
  21. package/dist/client/chunks/index-qxjc7kc5.js +12 -0
  22. package/dist/client/chunks/index-qxjc7kc5.js.map +9 -0
  23. package/dist/client/chunks/islands-xj2n8nwf.js +281 -0
  24. package/dist/client/chunks/islands-xj2n8nwf.js.map +14 -0
  25. package/dist/client/chunks/react-pdg4325x.js +65 -0
  26. package/dist/client/chunks/react-pdg4325x.js.map +10 -0
  27. package/dist/client/chunks/svelte-s0c964kb.js +19 -0
  28. package/dist/client/chunks/svelte-s0c964kb.js.map +10 -0
  29. package/dist/client/chunks/vue-rdskrnyg.js +24 -0
  30. package/dist/client/chunks/vue-rdskrnyg.js.map +10 -0
  31. package/dist/client/index.js +73 -841
  32. package/dist/client/index.js.map +7 -20
  33. package/dist/core/streamingSlotRegistrar.js +15 -13
  34. package/dist/core/streamingSlotRegistrar.js.map +2 -2
  35. package/dist/core/streamingSlotRegistry.js +11 -9
  36. package/dist/core/streamingSlotRegistry.js.map +2 -2
  37. package/dist/dev/client/hmrClient.ts +35 -3
  38. package/dist/dev/client/hmrTiming.ts +6 -0
  39. package/dist/dev/client/syncDevtools.ts +237 -0
  40. package/dist/dev/serverBootstrap.js +28 -0
  41. package/dist/image-client/imageClient.js +7 -7
  42. package/dist/index.js +3748 -2361
  43. package/dist/index.js.map +38 -30
  44. package/dist/islands/browser.js +11 -25
  45. package/dist/islands/browser.js.map +2 -2
  46. package/dist/islands/index.js +55 -52
  47. package/dist/islands/index.js.map +5 -4
  48. package/dist/mobile/browser.js +429 -20
  49. package/dist/mobile/browser.js.map +8 -5
  50. package/dist/mobile/index.js +10626 -3132
  51. package/dist/mobile/index.js.map +47 -18
  52. package/dist/mobile/remoteMacAgentEntry.js +1374 -14
  53. package/dist/mobile/shellAuth.js +36 -0
  54. package/dist/mobile/shellBootstrap.js +1800 -0
  55. package/dist/mobile/shellExpoAuth.js +163 -0
  56. package/dist/mobile/shellExpoDevices.js +77 -0
  57. package/dist/mobile/shellExpoSync.js +104 -0
  58. package/dist/mobile/shellSync.js +184 -0
  59. package/dist/mobile/shellUpdate.js +456 -0
  60. package/dist/mobile/uiPrimitives.js +264 -0
  61. package/dist/react/browser.js +17 -59
  62. package/dist/react/browser.js.map +2 -2
  63. package/dist/react/components/browser/index.js +107 -107
  64. package/dist/react/components/index.js +118 -116
  65. package/dist/react/components/index.js.map +2 -2
  66. package/dist/react/hooks/index.js +11 -25
  67. package/dist/react/hooks/index.js.map +2 -2
  68. package/dist/react/index.js +110 -67
  69. package/dist/react/index.js.map +8 -7
  70. package/dist/react/jsxDevRuntimeCompat.js +11 -9
  71. package/dist/react/jsxDevRuntimeCompat.js.map +2 -2
  72. package/dist/react/jsxRuntimeCompat.js +11 -9
  73. package/dist/react/jsxRuntimeCompat.js.map +2 -2
  74. package/dist/react/router/browser.js +9 -7
  75. package/dist/react/router/browser.js.map +2 -2
  76. package/dist/react/router/index.js +9 -7
  77. package/dist/react/router/index.js.map +2 -2
  78. package/dist/react/server.js +67 -11
  79. package/dist/react/server.js.map +7 -6
  80. package/dist/src/build/pwa.d.ts +16 -0
  81. package/dist/src/cli/config/server.d.ts +1 -1
  82. package/dist/src/cli/instanceStatus.d.ts +1 -0
  83. package/dist/src/cli/scripts/dev.d.ts +2 -0
  84. package/dist/src/client/browserTranslation.d.ts +19 -0
  85. package/dist/src/client/index.d.ts +1 -0
  86. package/dist/src/core/browserTranslation.d.ts +6 -0
  87. package/dist/src/core/devBuild.d.ts +1 -0
  88. package/dist/src/core/prepare.d.ts +376 -0
  89. package/dist/src/dev/clientManager.d.ts +1 -0
  90. package/dist/src/dev/devCert.d.ts +6 -4
  91. package/dist/src/dev/serverEntryCopies.d.ts +3 -0
  92. package/dist/src/ember/browser.d.ts +0 -16
  93. package/dist/src/mobile/adaptiveShell.d.ts +27 -0
  94. package/dist/src/mobile/androidEmulatorController.d.ts +8 -1
  95. package/dist/src/mobile/androidRelease.d.ts +9 -2
  96. package/dist/src/mobile/androidTestReport.d.ts +14 -0
  97. package/dist/src/mobile/androidUpgradeConformance.d.ts +47 -0
  98. package/dist/src/mobile/androidWebView.d.ts +1 -0
  99. package/dist/src/mobile/browser.d.ts +2 -0
  100. package/dist/src/mobile/capacitorBundle.d.ts +18 -0
  101. package/dist/src/mobile/ciWorkflow.d.ts +26 -0
  102. package/dist/src/mobile/config.d.ts +9 -1
  103. package/dist/src/mobile/devDeviceAdapter.d.ts +3 -0
  104. package/dist/src/mobile/deviceCapabilities.d.ts +49 -0
  105. package/dist/src/mobile/expoBridge.d.ts +91 -0
  106. package/dist/src/mobile/expoDevController.d.ts +56 -0
  107. package/dist/src/mobile/expoProject.d.ts +16 -0
  108. package/dist/src/mobile/index.d.ts +23 -0
  109. package/dist/src/mobile/iosDeviceAcceptance.d.ts +32 -0
  110. package/dist/src/mobile/iosPhysicalDeviceTransport.d.ts +16 -0
  111. package/dist/src/mobile/iosRelease.d.ts +63 -3
  112. package/dist/src/mobile/iosSimulatorController.d.ts +20 -2
  113. package/dist/src/mobile/iosTestReport.d.ts +24 -0
  114. package/dist/src/mobile/mobileBundleInspection.d.ts +63 -0
  115. package/dist/src/mobile/mobileInspect.d.ts +142 -0
  116. package/dist/src/mobile/mobilePreview.d.ts +174 -0
  117. package/dist/src/mobile/mobilePreviewClient.d.ts +1 -0
  118. package/dist/src/mobile/nativeAuth.d.ts +6 -0
  119. package/dist/src/mobile/nativeBackgroundSync.d.ts +4 -0
  120. package/dist/src/mobile/nativeDeviceCapabilities.d.ts +6 -0
  121. package/dist/src/mobile/nativeRoute.d.ts +13 -0
  122. package/dist/src/mobile/nativeTestReport.d.ts +91 -0
  123. package/dist/src/mobile/nativeUpdates.d.ts +4 -0
  124. package/dist/src/mobile/navigationLifecycle.d.ts +36 -0
  125. package/dist/src/mobile/navigationState.d.ts +53 -0
  126. package/dist/src/mobile/pageProtocol.d.ts +2 -0
  127. package/dist/src/mobile/releaseDoctor.d.ts +23 -1
  128. package/dist/src/mobile/remoteMacProtocol.d.ts +134 -1
  129. package/dist/src/mobile/remoteMacWire.d.ts +1 -1
  130. package/dist/src/mobile/shellAuth.d.ts +8 -1
  131. package/dist/src/mobile/shellBootstrap.d.ts +15 -2
  132. package/dist/src/mobile/shellExpoAuth.d.ts +12 -0
  133. package/dist/src/mobile/shellExpoDevices.d.ts +3 -0
  134. package/dist/src/mobile/shellExpoSync.d.ts +18 -0
  135. package/dist/src/mobile/shellHttp.d.ts +2 -0
  136. package/dist/src/mobile/shellPush.d.ts +11 -0
  137. package/dist/src/mobile/shellSync.d.ts +46 -1
  138. package/dist/src/mobile/shellUpdate.d.ts +2 -0
  139. package/dist/src/mobile/syncRemediation.d.ts +10 -0
  140. package/dist/src/mobile/syncSchema.d.ts +9 -0
  141. package/dist/src/mobile/transport.d.ts +14 -0
  142. package/dist/src/mobile/uiPrimitives.d.ts +37 -0
  143. package/dist/src/mobile/updateClient.d.ts +40 -0
  144. package/dist/src/mobile/updateProtocol.d.ts +51 -0
  145. package/dist/src/mobile/updatePublisher.d.ts +66 -0
  146. package/dist/src/mobile/updateRollout.d.ts +16 -0
  147. package/dist/src/mobile/updateRuntime.d.ts +27 -0
  148. package/dist/src/mobile/updateSigning.d.ts +20 -0
  149. package/dist/src/plugins/hmr.d.ts +3 -0
  150. package/dist/src/plugins/imageOptimizer.d.ts +1 -1
  151. package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
  152. package/dist/src/utils/imageProcessing.d.ts +3 -0
  153. package/dist/src/utils/loadConfig.d.ts +1 -0
  154. package/dist/src/utils/logger.d.ts +1 -0
  155. package/dist/src/utils/startupBanner.d.ts +1 -0
  156. package/dist/src/utils/userAgentFunctions.d.ts +1 -1
  157. package/dist/src/vue/browser.d.ts +1 -0
  158. package/dist/src/vue/browserTranslation.d.ts +5 -0
  159. package/dist/src/vue/index.d.ts +1 -0
  160. package/dist/svelte/browser.js +12 -26
  161. package/dist/svelte/browser.js.map +2 -2
  162. package/dist/svelte/index.js +104 -61
  163. package/dist/svelte/index.js.map +8 -7
  164. package/dist/svelte/server.js +84 -28
  165. package/dist/svelte/server.js.map +7 -6
  166. package/dist/types/build.d.ts +62 -3
  167. package/dist/types/cli.d.ts +1 -0
  168. package/dist/types/messages.d.ts +1 -1
  169. package/dist/vue/browser.js +116 -56
  170. package/dist/vue/browser.js.map +5 -3
  171. package/dist/vue/components/Image.js +9 -7
  172. package/dist/vue/components/Image.js.map +2 -2
  173. package/dist/vue/components/index.js +11 -9
  174. package/dist/vue/components/index.js.map +2 -2
  175. package/dist/vue/index.js +211 -94
  176. package/dist/vue/index.js.map +10 -7
  177. package/dist/vue/server.js +69 -13
  178. package/dist/vue/server.js.map +7 -6
  179. package/package.json +40 -14
@@ -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
+ };
@@ -2,6 +2,32 @@
2
2
  // src/dev/serverBootstrap.ts
3
3
  import { copyFileSync, existsSync, readdirSync, unlinkSync } from "fs";
4
4
  import { dirname, extname, join, resolve } from "path";
5
+
6
+ // src/dev/serverEntryCopies.ts
7
+ var ENTRY_COPY_OWNER_PATTERN = /^\.absolutejs-hmr-(\d+)-(?:bootstrap-)?\d+\.[^.]+$/;
8
+ var absoluteServerEntryCopyOwnerPid = (name) => {
9
+ const match = ENTRY_COPY_OWNER_PATTERN.exec(name);
10
+ if (!match)
11
+ return null;
12
+ const pid = Number(match[1]);
13
+ return Number.isSafeInteger(pid) && pid > 0 ? pid : null;
14
+ };
15
+ var isProcessAlive = (pid) => {
16
+ try {
17
+ process.kill(pid, 0);
18
+ return true;
19
+ } catch (error) {
20
+ return !(error instanceof Error && ("code" in error) && error.code === "ESRCH");
21
+ }
22
+ };
23
+ var isStaleAbsoluteServerEntryCopy = (name, currentPid = process.pid, ownerIsAlive = isProcessAlive) => {
24
+ const ownerPid = absoluteServerEntryCopyOwnerPid(name);
25
+ if (ownerPid === null)
26
+ return false;
27
+ return ownerPid === currentPid || !ownerIsAlive(ownerPid);
28
+ };
29
+
30
+ // src/dev/serverBootstrap.ts
5
31
  var originalEntry = process.env.ABSOLUTE_SERVER_ENTRY;
6
32
  if (!originalEntry) {
7
33
  throw new Error("ABSOLUTE_SERVER_ENTRY is required by the AbsoluteJS dev bootstrap");
@@ -24,6 +50,8 @@ if (!isHotReevaluation) {
24
50
  if (!name.startsWith(copyPrefix) || !name.endsWith(entryExtension)) {
25
51
  continue;
26
52
  }
53
+ if (!isStaleAbsoluteServerEntryCopy(name))
54
+ continue;
27
55
  removeEntryCopy(join(entryDir, name));
28
56
  }
29
57
  }
@@ -58,12 +58,12 @@ var generateSrcSet = (src, width, sizes, deviceSizes, imageSizes) => {
58
58
  return devSizes.map((sizeWidth) => `${buildOptimizedUrl(src, sizeWidth, quality)} ${sizeWidth}w`).join(", ");
59
59
  };
60
60
  export {
61
- getAllSizes,
62
- generateSrcSet,
63
- generateBlurSvg,
64
- buildOptimizedUrl,
65
- OPTIMIZATION_ENDPOINT,
66
- DEFAULT_QUALITY,
61
+ DEFAULT_DEVICE_SIZES,
67
62
  DEFAULT_IMAGE_SIZES,
68
- DEFAULT_DEVICE_SIZES
63
+ DEFAULT_QUALITY,
64
+ OPTIMIZATION_ENDPOINT,
65
+ buildOptimizedUrl,
66
+ generateBlurSvg,
67
+ generateSrcSet,
68
+ getAllSizes
69
69
  };