@nativescript/vite 8.0.0-alpha.67 → 8.0.0-alpha.69
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/configuration/angular.js +78 -182
- package/configuration/angular.js.map +1 -1
- package/configuration/base.js +10 -139
- package/configuration/base.js.map +1 -1
- package/helpers/app-css-refresh.d.ts +31 -0
- package/helpers/app-css-refresh.js +43 -0
- package/helpers/app-css-refresh.js.map +1 -0
- package/helpers/app-css-state.d.ts +9 -0
- package/helpers/app-css-state.js.map +1 -1
- package/helpers/main-entry.js +27 -24
- package/helpers/main-entry.js.map +1 -1
- package/helpers/ns-core-external-urls.d.ts +32 -0
- package/helpers/ns-core-external-urls.js +107 -0
- package/helpers/ns-core-external-urls.js.map +1 -0
- package/helpers/typescript-check.js +2 -2
- package/helpers/typescript-check.js.map +1 -1
- package/helpers/workers.d.ts +0 -8
- package/helpers/workers.js +43 -381
- package/helpers/workers.js.map +1 -1
- package/hmr/client/css-handler.js +14 -6
- package/hmr/client/css-handler.js.map +1 -1
- package/hmr/client/framework-client-strategy.d.ts +17 -9
- package/hmr/client/framework-client-strategy.js +3 -4
- package/hmr/client/framework-client-strategy.js.map +1 -1
- package/hmr/client/hmr-pending-overlay.js +2 -21
- package/hmr/client/hmr-pending-overlay.js.map +1 -1
- package/hmr/client/index.d.ts +9 -1
- package/hmr/client/index.js +34 -2621
- package/hmr/client/index.js.map +1 -1
- package/hmr/client/overlay-driver.d.ts +10 -0
- package/hmr/client/overlay-driver.js +33 -0
- package/hmr/client/overlay-driver.js.map +1 -0
- package/hmr/client/protocol-dispatch.d.ts +8 -0
- package/hmr/client/protocol-dispatch.js +308 -0
- package/hmr/client/protocol-dispatch.js.map +1 -0
- package/hmr/client/root-reset.d.ts +15 -0
- package/hmr/client/root-reset.js +358 -0
- package/hmr/client/root-reset.js.map +1 -0
- package/hmr/client/strategy-loader.d.ts +24 -0
- package/hmr/client/strategy-loader.js +83 -0
- package/hmr/client/strategy-loader.js.map +1 -0
- package/hmr/client/update-pipeline.d.ts +27 -0
- package/hmr/client/update-pipeline.js +464 -0
- package/hmr/client/update-pipeline.js.map +1 -0
- package/hmr/client/utils.d.ts +7 -0
- package/hmr/client/utils.js +12 -2
- package/hmr/client/utils.js.map +1 -1
- package/hmr/client/ws-transport.d.ts +21 -0
- package/hmr/client/ws-transport.js +344 -0
- package/hmr/client/ws-transport.js.map +1 -0
- package/hmr/frameworks/angular/build/angular-linker.js +4 -0
- package/hmr/frameworks/angular/build/angular-linker.js.map +1 -1
- package/hmr/frameworks/angular/build/linker-stats.d.ts +18 -0
- package/hmr/frameworks/angular/build/linker-stats.js +29 -0
- package/hmr/frameworks/angular/build/linker-stats.js.map +1 -0
- package/hmr/frameworks/angular/build/ts-fallback-transform.d.ts +5 -0
- package/hmr/frameworks/angular/build/ts-fallback-transform.js +138 -0
- package/hmr/frameworks/angular/build/ts-fallback-transform.js.map +1 -0
- package/hmr/frameworks/angular/build/worker-url-preserve.d.ts +5 -0
- package/hmr/frameworks/angular/build/worker-url-preserve.js +140 -0
- package/hmr/frameworks/angular/build/worker-url-preserve.js.map +1 -0
- package/hmr/frameworks/angular/client/index.js +28 -42
- package/hmr/frameworks/angular/client/index.js.map +1 -1
- package/hmr/frameworks/angular/server/ng-component-route.d.ts +43 -0
- package/hmr/frameworks/angular/server/ng-component-route.js +113 -0
- package/hmr/frameworks/angular/server/ng-component-route.js.map +1 -0
- package/hmr/frameworks/angular/server/strategy.js +22 -11
- package/hmr/frameworks/angular/server/strategy.js.map +1 -1
- package/hmr/frameworks/angular/server/websocket-angular-hot-update.d.ts +12 -0
- package/hmr/frameworks/angular/server/websocket-angular-hot-update.js +51 -9
- package/hmr/frameworks/angular/server/websocket-angular-hot-update.js.map +1 -1
- package/hmr/frameworks/react/client/strategy.d.ts +12 -0
- package/hmr/frameworks/react/client/strategy.js +27 -0
- package/hmr/frameworks/react/client/strategy.js.map +1 -0
- package/hmr/frameworks/solid/client/strategy.d.ts +7 -0
- package/hmr/frameworks/solid/client/strategy.js +391 -0
- package/hmr/frameworks/solid/client/strategy.js.map +1 -0
- package/hmr/frameworks/solid/server/strategy.js +2 -0
- package/hmr/frameworks/solid/server/strategy.js.map +1 -1
- package/hmr/frameworks/typescript/client/strategy.d.ts +7 -0
- package/hmr/frameworks/typescript/client/strategy.js +418 -0
- package/hmr/frameworks/typescript/client/strategy.js.map +1 -0
- package/hmr/frameworks/typescript/server/strategy.js +2 -0
- package/hmr/frameworks/typescript/server/strategy.js.map +1 -1
- package/hmr/frameworks/vue/client/index.d.ts +1 -1
- package/hmr/frameworks/vue/client/index.js +44 -323
- package/hmr/frameworks/vue/client/index.js.map +1 -1
- package/hmr/frameworks/vue/client/navigate-app.d.ts +3 -0
- package/hmr/frameworks/vue/client/navigate-app.js +178 -0
- package/hmr/frameworks/vue/client/navigate-app.js.map +1 -0
- package/hmr/frameworks/vue/client/strategy.d.ts +1 -1
- package/hmr/frameworks/vue/client/strategy.js +9 -14
- package/hmr/frameworks/vue/client/strategy.js.map +1 -1
- package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js +2 -20
- package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js.map +1 -1
- package/hmr/frameworks/vue/server/strategy.js +3 -0
- package/hmr/frameworks/vue/server/strategy.js.map +1 -1
- package/hmr/server/content-css-update.d.ts +54 -0
- package/hmr/server/content-css-update.js +78 -0
- package/hmr/server/content-css-update.js.map +1 -0
- package/hmr/server/css-connect-sync.d.ts +28 -0
- package/hmr/server/css-connect-sync.js +59 -0
- package/hmr/server/css-connect-sync.js.map +1 -0
- package/hmr/server/css-update-message.d.ts +23 -0
- package/hmr/server/css-update-message.js +41 -0
- package/hmr/server/css-update-message.js.map +1 -0
- package/hmr/server/framework-strategy.d.ts +42 -0
- package/hmr/server/socket-utils.d.ts +10 -0
- package/hmr/server/socket-utils.js +14 -0
- package/hmr/server/socket-utils.js.map +1 -0
- package/hmr/server/vite-plugin.js +35 -0
- package/hmr/server/vite-plugin.js.map +1 -1
- package/hmr/server/websocket-hmr-pending.d.ts +0 -8
- package/hmr/server/websocket-hmr-pending.js +0 -22
- package/hmr/server/websocket-hmr-pending.js.map +1 -1
- package/hmr/server/websocket-hot-update.d.ts +3 -0
- package/hmr/server/websocket-hot-update.js +30 -99
- package/hmr/server/websocket-hot-update.js.map +1 -1
- package/hmr/server/websocket-module-bindings.js +23 -5
- package/hmr/server/websocket-module-bindings.js.map +1 -1
- package/hmr/server/websocket-module-specifiers.d.ts +0 -5
- package/hmr/server/websocket-module-specifiers.js +0 -28
- package/hmr/server/websocket-module-specifiers.js.map +1 -1
- package/hmr/server/websocket-ns-m-paths.d.ts +18 -0
- package/hmr/server/websocket-ns-m-paths.js +79 -0
- package/hmr/server/websocket-ns-m-paths.js.map +1 -1
- package/hmr/server/websocket-ns-m-request.d.ts +2 -1
- package/hmr/server/websocket-ns-m-request.js +3 -2
- package/hmr/server/websocket-ns-m-request.js.map +1 -1
- package/hmr/server/websocket-ns-m.js +100 -374
- package/hmr/server/websocket-ns-m.js.map +1 -1
- package/hmr/server/websocket-served-module-helpers.d.ts +7 -0
- package/hmr/server/websocket-served-module-helpers.js +93 -69
- package/hmr/server/websocket-served-module-helpers.js.map +1 -1
- package/hmr/server/websocket.d.ts +0 -1
- package/hmr/server/websocket.js +41 -35
- package/hmr/server/websocket.js.map +1 -1
- package/hmr/shared/ns-globals.d.ts +0 -1
- package/hmr/shared/ns-globals.js.map +1 -1
- package/hmr/shared/protocol.d.ts +12 -0
- package/hmr/shared/protocol.js.map +1 -1
- package/hmr/shared/runtime/dev-overlay-ios.d.ts +87 -0
- package/hmr/shared/runtime/dev-overlay-ios.js +521 -0
- package/hmr/shared/runtime/dev-overlay-ios.js.map +1 -0
- package/hmr/shared/runtime/dev-overlay-shared.d.ts +58 -0
- package/hmr/shared/runtime/dev-overlay-shared.js +116 -0
- package/hmr/shared/runtime/dev-overlay-shared.js.map +1 -0
- package/hmr/shared/runtime/dev-overlay-tree.d.ts +59 -0
- package/hmr/shared/runtime/dev-overlay-tree.js +712 -0
- package/hmr/shared/runtime/dev-overlay-tree.js.map +1 -0
- package/hmr/shared/runtime/dev-overlay.d.ts +15 -107
- package/hmr/shared/runtime/dev-overlay.js +19 -1336
- package/hmr/shared/runtime/dev-overlay.js.map +1 -1
- package/hmr/shared/runtime/overlay-flag.d.ts +9 -0
- package/hmr/shared/runtime/overlay-flag.js +34 -0
- package/hmr/shared/runtime/overlay-flag.js.map +1 -0
- package/hmr/shared/runtime/root-placeholder.js +3 -2
- package/hmr/shared/runtime/root-placeholder.js.map +1 -1
- package/hmr/shared/runtime/session-bootstrap.js +2 -1
- package/hmr/shared/runtime/session-bootstrap.js.map +1 -1
- package/hmr/shared/runtime/vendor-resolve.d.ts +22 -0
- package/hmr/shared/runtime/vendor-resolve.js +45 -0
- package/hmr/shared/runtime/vendor-resolve.js.map +1 -0
- package/hmr/shared/vendor/manifest-collect.js +0 -3
- package/hmr/shared/vendor/manifest-collect.js.map +1 -1
- package/package.json +1 -3
- package/runtime/core-aliases-early.js +3 -2
- package/runtime/core-aliases-early.js.map +1 -1
- package/helpers/module-runner-patch.d.ts +0 -3
- package/helpers/module-runner-patch.js +0 -63
- package/helpers/module-runner-patch.js.map +0 -1
- package/hmr/server/websocket-css-hot-update.d.ts +0 -33
- package/hmr/server/websocket-css-hot-update.js +0 -65
- package/hmr/server/websocket-css-hot-update.js.map +0 -1
- package/hmr/shared/runtime/http-only-boot.d.ts +0 -2
- package/hmr/shared/runtime/http-only-boot.js +0 -172
- package/hmr/shared/runtime/http-only-boot.js.map +0 -1
- package/hmr/vendor-bootstrap.d.ts +0 -1
- package/hmr/vendor-bootstrap.js +0 -30
- package/hmr/vendor-bootstrap.js.map +0 -1
- package/shims/react-reconciler-constants.d.ts +0 -14
- package/shims/react-reconciler-constants.js +0 -21
- package/shims/react-reconciler-constants.js.map +0 -1
- package/shims/react-reconciler.d.ts +0 -8
- package/shims/react-reconciler.js +0 -15
- package/shims/react-reconciler.js.map +0 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket transport — connect/reconnect candidate loop plus the connection
|
|
3
|
+
* overlay state machine ('connecting' / 'reconnecting' / 'synchronizing' /
|
|
4
|
+
* 'offline').
|
|
5
|
+
*
|
|
6
|
+
* Protocol handling is injected via `setHmrMessageHandler` (wired by the
|
|
7
|
+
* client entry) so this module knows nothing about message shapes; it only
|
|
8
|
+
* owns socket lifecycle and the "is the connection healthy" UX.
|
|
9
|
+
*/
|
|
10
|
+
import { getHMRWsUrl, deriveHttpOrigin, setHttpOriginForVite, normalizeSpec, requestModuleFromServer, hmrMetrics, emitHmrModeBannerOnce, ENV_VERBOSE } from './utils.js';
|
|
11
|
+
import { getGlobalScope } from '../shared/runtime/global-scope.js';
|
|
12
|
+
import { getOverlayApi } from './overlay-driver.js';
|
|
13
|
+
import { getNsHotRegistry } from './hot-context.js';
|
|
14
|
+
const VERBOSE = ENV_VERBOSE;
|
|
15
|
+
function setConnectionOverlayStage(stage, detail) {
|
|
16
|
+
try {
|
|
17
|
+
const api = getOverlayApi();
|
|
18
|
+
if (api && typeof api.setConnectionStage === 'function') {
|
|
19
|
+
api.setConnectionStage(stage, { detail });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
}
|
|
24
|
+
function hideConnectionOverlay() {
|
|
25
|
+
try {
|
|
26
|
+
const api = getOverlayApi();
|
|
27
|
+
if (api && typeof api.hide === 'function') {
|
|
28
|
+
api.hide('healthy');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch { }
|
|
32
|
+
}
|
|
33
|
+
let connectionOverlayTimer = null;
|
|
34
|
+
let connectionOverlayVisible = false;
|
|
35
|
+
let hasOpenedHmrSocket = false;
|
|
36
|
+
let awaitingHealthyHmrMessage = false;
|
|
37
|
+
let pendingConnectionOverlayStage = 'connecting';
|
|
38
|
+
let pendingConnectionOverlayDetail = '';
|
|
39
|
+
// The stage currently PAINTED on screen (set only when we actually show
|
|
40
|
+
// the overlay, not when we merely schedule it). Used to suppress the
|
|
41
|
+
// sub-perceptible offline↔reconnecting flicker during the reconnect
|
|
42
|
+
// retry loop — see the deferral in `connectHmr`/`tryNext`.
|
|
43
|
+
let shownConnectionOverlayStage = null;
|
|
44
|
+
// While the terminal 'offline' frame is showing, a fresh reconnect
|
|
45
|
+
// attempt that is refused near-instantly (the norm when the dev server
|
|
46
|
+
// is down — especially on the Android emulator, where connection-refused
|
|
47
|
+
// returns in ~1ms) would flip the overlay to 'reconnecting' and straight
|
|
48
|
+
// back to 'offline', producing a jarring 1-frame flicker. We defer the
|
|
49
|
+
// 'reconnecting' frame by this much so an instant failure (→ back to
|
|
50
|
+
// 'offline') or a success (→ 'synchronizing') cancels it before it ever
|
|
51
|
+
// paints; only a genuinely in-flight attempt surfaces 'reconnecting'.
|
|
52
|
+
// On iOS real connect attempts exceed this threshold, so the behaviour
|
|
53
|
+
// there is unchanged.
|
|
54
|
+
const RECONNECTING_OVER_OFFLINE_DELAY_MS = 500;
|
|
55
|
+
function clearConnectionOverlayTimer() {
|
|
56
|
+
if (connectionOverlayTimer) {
|
|
57
|
+
clearTimeout(connectionOverlayTimer);
|
|
58
|
+
connectionOverlayTimer = null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function showConnectionOverlayNow(stage, detail) {
|
|
62
|
+
// Painting a stage now supersedes any scheduled (deferred) stage, so
|
|
63
|
+
// cancel the pending timer — otherwise a deferred 'reconnecting' could
|
|
64
|
+
// fire moments after we settle back on 'offline' and revive the flicker.
|
|
65
|
+
clearConnectionOverlayTimer();
|
|
66
|
+
pendingConnectionOverlayStage = stage;
|
|
67
|
+
pendingConnectionOverlayDetail = detail || '';
|
|
68
|
+
connectionOverlayVisible = true;
|
|
69
|
+
shownConnectionOverlayStage = stage;
|
|
70
|
+
setConnectionOverlayStage(stage, detail);
|
|
71
|
+
}
|
|
72
|
+
function scheduleConnectionOverlay(stage, detail, delayMs = 1200) {
|
|
73
|
+
pendingConnectionOverlayStage = stage;
|
|
74
|
+
pendingConnectionOverlayDetail = detail || '';
|
|
75
|
+
clearConnectionOverlayTimer();
|
|
76
|
+
connectionOverlayTimer = setTimeout(() => {
|
|
77
|
+
showConnectionOverlayNow(pendingConnectionOverlayStage, pendingConnectionOverlayDetail);
|
|
78
|
+
}, delayMs);
|
|
79
|
+
}
|
|
80
|
+
function updateConnectionOverlay(stage, detail) {
|
|
81
|
+
pendingConnectionOverlayStage = stage;
|
|
82
|
+
pendingConnectionOverlayDetail = detail || '';
|
|
83
|
+
if (connectionOverlayVisible) {
|
|
84
|
+
showConnectionOverlayNow(stage, detail);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function markHmrConnectionHealthy() {
|
|
88
|
+
awaitingHealthyHmrMessage = false;
|
|
89
|
+
clearConnectionOverlayTimer();
|
|
90
|
+
shownConnectionOverlayStage = null;
|
|
91
|
+
if (connectionOverlayVisible) {
|
|
92
|
+
connectionOverlayVisible = false;
|
|
93
|
+
hideConnectionOverlay();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Called by the protocol dispatcher for every parsed message. The first
|
|
98
|
+
* message after a (re)connect proves the pipe is healthy end-to-end, which is
|
|
99
|
+
* what dismisses the connection overlay — `onopen` alone doesn't (the server
|
|
100
|
+
* may accept the socket and still be mid-restart).
|
|
101
|
+
*/
|
|
102
|
+
export function noteHealthyHmrMessage() {
|
|
103
|
+
if (awaitingHealthyHmrMessage) {
|
|
104
|
+
markHmrConnectionHealthy();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
let hmrSocket = null;
|
|
108
|
+
let messageHandler = null;
|
|
109
|
+
/** Wire the protocol dispatcher. Must be set before `connectHmr()` runs. */
|
|
110
|
+
export function setHmrMessageHandler(handler) {
|
|
111
|
+
messageHandler = handler;
|
|
112
|
+
}
|
|
113
|
+
/** Best-effort send; silently drops when the socket isn't open. */
|
|
114
|
+
export function sendHmrMessage(payload) {
|
|
115
|
+
try {
|
|
116
|
+
hmrSocket?.send(JSON.stringify(payload));
|
|
117
|
+
}
|
|
118
|
+
catch { }
|
|
119
|
+
}
|
|
120
|
+
// Single reconnect timer. Overlapping close/timeout events used to each schedule
|
|
121
|
+
// their own `setTimeout(connectHmr, …)`, stacking multiple pending reconnects
|
|
122
|
+
// that could spawn (and leak) duplicate sockets/listeners. Route all reconnect
|
|
123
|
+
// scheduling through here so only one is ever pending.
|
|
124
|
+
let reconnectTimer = null;
|
|
125
|
+
function scheduleReconnect(delayMs) {
|
|
126
|
+
if (reconnectTimer)
|
|
127
|
+
clearTimeout(reconnectTimer);
|
|
128
|
+
reconnectTimer = setTimeout(() => {
|
|
129
|
+
reconnectTimer = null;
|
|
130
|
+
connectHmr();
|
|
131
|
+
}, delayMs);
|
|
132
|
+
}
|
|
133
|
+
// Public hook for NativeScript runtime to call from ImportModuleDynamicallyCallback later.
|
|
134
|
+
globalThis.__nsHmrRequestModule = async function (spec) {
|
|
135
|
+
let normalized = normalizeSpec(spec);
|
|
136
|
+
// Remove extension for transform lookup variants (server will try .ts/.js/.mjs)
|
|
137
|
+
normalized = normalized.replace(/\.(ts|js|tsx|jsx|mjs)$/i, '');
|
|
138
|
+
if (!normalized.startsWith('/'))
|
|
139
|
+
normalized = '/' + normalized;
|
|
140
|
+
if (normalized === '@') {
|
|
141
|
+
// Soft-handle instead of throwing to avoid breaking evaluation paths: return a safe empty module stub.
|
|
142
|
+
try {
|
|
143
|
+
const err = new Error('[hmr-fetch] anomalous @ spec');
|
|
144
|
+
const stack = err.stack || '';
|
|
145
|
+
hmrMetrics.invalidAtSpec = (hmrMetrics.invalidAtSpec || 0) + 1;
|
|
146
|
+
console.warn('[hmr-fetch] refusing to fetch bare @ spec; returning stub; original=', spec, 'stack=\n' + stack);
|
|
147
|
+
}
|
|
148
|
+
catch { }
|
|
149
|
+
return '/__invalid_at__.mjs';
|
|
150
|
+
}
|
|
151
|
+
const url = await requestModuleFromServer(normalized);
|
|
152
|
+
return url;
|
|
153
|
+
};
|
|
154
|
+
export function connectHmr() {
|
|
155
|
+
if (hmrSocket?.readyState === WebSocket.OPEN)
|
|
156
|
+
return;
|
|
157
|
+
if (hmrSocket?.readyState === WebSocket.CONNECTING) {
|
|
158
|
+
if (VERBOSE)
|
|
159
|
+
console.log('[hmr-client] Already connecting to HMR WebSocket, skipping');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// A reconnect fired (or a manual connect raced one) — cancel any other pending
|
|
163
|
+
// reconnect so we don't end up with overlapping connect attempts.
|
|
164
|
+
if (reconnectTimer) {
|
|
165
|
+
clearTimeout(reconnectTimer);
|
|
166
|
+
reconnectTimer = null;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
globalThis.__NS_HMR_CLIENT_SOCKET_READY__ = false;
|
|
170
|
+
}
|
|
171
|
+
catch { }
|
|
172
|
+
const overlayStage = hasOpenedHmrSocket ? 'reconnecting' : 'connecting';
|
|
173
|
+
const baseUrl = getHMRWsUrl() || 'ws://localhost:5173/ns-hmr';
|
|
174
|
+
const buildCandidates = (url) => {
|
|
175
|
+
const candidates = [];
|
|
176
|
+
try {
|
|
177
|
+
const u = new URL(url);
|
|
178
|
+
const proto = u.protocol === 'wss:' ? ['wss'] : ['ws'];
|
|
179
|
+
const defaultPort = u.port || '5173';
|
|
180
|
+
// Build ordered host candidates with preference to the active HTTP origin
|
|
181
|
+
const orderedHosts = [];
|
|
182
|
+
try {
|
|
183
|
+
const g = getGlobalScope();
|
|
184
|
+
const httpOrigin = g && typeof g.__NS_HTTP_ORIGIN__ === 'string' ? g.__NS_HTTP_ORIGIN__ : undefined;
|
|
185
|
+
if (httpOrigin) {
|
|
186
|
+
try {
|
|
187
|
+
const ho = new URL(httpOrigin);
|
|
188
|
+
orderedHosts.push({
|
|
189
|
+
host: ho.hostname,
|
|
190
|
+
port: ho.port || defaultPort,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch { }
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch { }
|
|
197
|
+
// From provided URL
|
|
198
|
+
orderedHosts.push({ host: u.hostname, port: defaultPort });
|
|
199
|
+
// Explicit override
|
|
200
|
+
try {
|
|
201
|
+
const h = globalThis.__NS_HMR_HOST;
|
|
202
|
+
if (h)
|
|
203
|
+
orderedHosts.push({ host: String(h), port: defaultPort });
|
|
204
|
+
}
|
|
205
|
+
catch { }
|
|
206
|
+
// Common fallbacks
|
|
207
|
+
orderedHosts.push({ host: '10.0.2.2', port: defaultPort });
|
|
208
|
+
orderedHosts.push({ host: 'localhost', port: defaultPort });
|
|
209
|
+
const seen = new Set();
|
|
210
|
+
for (const p of proto) {
|
|
211
|
+
for (const { host, port } of orderedHosts) {
|
|
212
|
+
const key = `${host}:${port}`;
|
|
213
|
+
if (seen.has(key))
|
|
214
|
+
continue;
|
|
215
|
+
seen.add(key);
|
|
216
|
+
const cand = `${p}://${host}:${port}${u.pathname || '/ns-hmr'}${u.search || ''}`;
|
|
217
|
+
candidates.push(cand);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
candidates.push(url);
|
|
223
|
+
}
|
|
224
|
+
// Deduplicate while preserving order
|
|
225
|
+
const seen = new Set();
|
|
226
|
+
return candidates.filter((c) => (seen.has(c) ? false : (seen.add(c), true)));
|
|
227
|
+
};
|
|
228
|
+
const candidates = buildCandidates(baseUrl);
|
|
229
|
+
let idx = 0;
|
|
230
|
+
const tryNext = () => {
|
|
231
|
+
if (idx >= candidates.length) {
|
|
232
|
+
showConnectionOverlayNow('offline', 'Waiting for the Vite websocket to come back.');
|
|
233
|
+
console.warn('[hmr-client] All WS candidates failed:', candidates.join(', '));
|
|
234
|
+
scheduleReconnect(1500);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const url = candidates[idx++];
|
|
238
|
+
const connectionDetail = `${overlayStage === 'reconnecting' ? 'Retrying' : 'Opening'} ${url}`;
|
|
239
|
+
if (overlayStage === 'reconnecting' && shownConnectionOverlayStage === 'offline') {
|
|
240
|
+
// Don't flip the visible 'offline' frame to 'reconnecting' for an
|
|
241
|
+
// attempt that may fail instantly — defer it so only a genuinely
|
|
242
|
+
// in-flight attempt surfaces. The deferred show is cancelled by
|
|
243
|
+
// showConnectionOverlayNow (offline re-show / synchronizing) the
|
|
244
|
+
// moment this attempt resolves. Keeps 'offline' stable instead of
|
|
245
|
+
// flickering once per retry. (Checking the PAINTED stage, not the
|
|
246
|
+
// pending one, so every candidate in the loop keeps deferring.)
|
|
247
|
+
scheduleConnectionOverlay(overlayStage, connectionDetail, RECONNECTING_OVER_OFFLINE_DELAY_MS);
|
|
248
|
+
}
|
|
249
|
+
else if (connectionOverlayVisible) {
|
|
250
|
+
updateConnectionOverlay(overlayStage, connectionDetail);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
scheduleConnectionOverlay(overlayStage, connectionDetail);
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
if (VERBOSE)
|
|
257
|
+
console.log('[hmr-client] Connecting to HMR WebSocket:', url);
|
|
258
|
+
const sock = new WebSocket(url);
|
|
259
|
+
hmrSocket = sock;
|
|
260
|
+
setHttpOriginForVite(deriveHttpOrigin(url));
|
|
261
|
+
let opened = false;
|
|
262
|
+
const timeout = setTimeout(() => {
|
|
263
|
+
if (!opened && sock.readyState !== WebSocket.OPEN) {
|
|
264
|
+
try {
|
|
265
|
+
sock.close();
|
|
266
|
+
}
|
|
267
|
+
catch { }
|
|
268
|
+
if (VERBOSE)
|
|
269
|
+
console.warn('[hmr-client] WS connect timeout, trying next…');
|
|
270
|
+
tryNext();
|
|
271
|
+
}
|
|
272
|
+
}, 3500);
|
|
273
|
+
sock.onopen = () => {
|
|
274
|
+
opened = true;
|
|
275
|
+
clearTimeout(timeout);
|
|
276
|
+
clearConnectionOverlayTimer();
|
|
277
|
+
hasOpenedHmrSocket = true;
|
|
278
|
+
awaitingHealthyHmrMessage = true;
|
|
279
|
+
try {
|
|
280
|
+
globalThis.__NS_HMR_CLIENT_SOCKET_READY__ = true;
|
|
281
|
+
}
|
|
282
|
+
catch { }
|
|
283
|
+
// Wire the JS hot registry's server channel to this socket so
|
|
284
|
+
// `import.meta.hot.send(event, data)` reaches Vite plugins as
|
|
285
|
+
// `{ type: 'custom', event, data }` (Vite wire protocol).
|
|
286
|
+
try {
|
|
287
|
+
getNsHotRegistry().setSendToServer((event, data) => {
|
|
288
|
+
try {
|
|
289
|
+
if (sock.readyState === WebSocket.OPEN) {
|
|
290
|
+
sock.send(JSON.stringify({ type: 'custom', event, data }));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch { }
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
catch { }
|
|
297
|
+
if (connectionOverlayVisible) {
|
|
298
|
+
showConnectionOverlayNow('synchronizing', 'Connected. Synchronizing the HMR graph.');
|
|
299
|
+
}
|
|
300
|
+
if (VERBOSE)
|
|
301
|
+
console.log('[hmr-client] Connected to HMR WebSocket');
|
|
302
|
+
// Print the active module reload mode once on first
|
|
303
|
+
// successful connect so the user can correlate HMR latency
|
|
304
|
+
// with runtime capability without grepping for protocol
|
|
305
|
+
// details. The banner is verbose-gated.
|
|
306
|
+
try {
|
|
307
|
+
emitHmrModeBannerOnce();
|
|
308
|
+
}
|
|
309
|
+
catch { }
|
|
310
|
+
};
|
|
311
|
+
sock.onmessage = (ev) => messageHandler?.(ev);
|
|
312
|
+
sock.onerror = (error) => {
|
|
313
|
+
clearTimeout(timeout);
|
|
314
|
+
console.warn('[hmr-client] WebSocket error:', (error && (error.message || error)) || error);
|
|
315
|
+
};
|
|
316
|
+
sock.onclose = (ev) => {
|
|
317
|
+
clearTimeout(timeout);
|
|
318
|
+
try {
|
|
319
|
+
globalThis.__NS_HMR_CLIENT_SOCKET_READY__ = false;
|
|
320
|
+
}
|
|
321
|
+
catch { }
|
|
322
|
+
if (!opened) {
|
|
323
|
+
// immediate failure during connect → try another candidate
|
|
324
|
+
if (VERBOSE)
|
|
325
|
+
console.warn('[hmr-client] WS close before open (code', ev?.code, '), trying next…');
|
|
326
|
+
tryNext();
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
if (VERBOSE)
|
|
330
|
+
console.log('[hmr-client] WebSocket closed (code', ev?.code, '), will reconnect…');
|
|
331
|
+
scheduleConnectionOverlay('reconnecting', 'The websocket closed. Waiting to reconnect.', 700);
|
|
332
|
+
// try to reconnect with full candidate list again
|
|
333
|
+
scheduleReconnect(1000);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
catch (e) {
|
|
338
|
+
console.warn('[hmr-client] Failed to connect WebSocket', e);
|
|
339
|
+
tryNext();
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
tryNext();
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=ws-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-transport.js","sourceRoot":"","sources":["../../../../../packages/vite/hmr/client/ws-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { runAngularLinker } from './shared-linker.js';
|
|
2
2
|
import { containsRealNgDeclare } from './util.js';
|
|
3
|
+
import { recordLinkerHit } from './linker-stats.js';
|
|
3
4
|
function normalizeAngularLinkerId(id) {
|
|
4
5
|
return id.split('?', 1)[0].replace(/\\/g, '/');
|
|
5
6
|
}
|
|
@@ -48,6 +49,7 @@ export function angularLinkerVitePlugin(projectRoot) {
|
|
|
48
49
|
return null;
|
|
49
50
|
const linked = await runAngularLinker(code, { filename: cleanId, projectRoot });
|
|
50
51
|
if (linked) {
|
|
52
|
+
recordLinkerHit('vite-load');
|
|
51
53
|
if (isDebug())
|
|
52
54
|
console.log('[ns-angular-linker][vite-load] linked', cleanId);
|
|
53
55
|
return { code: linked, map: null };
|
|
@@ -69,6 +71,7 @@ export function angularLinkerVitePlugin(projectRoot) {
|
|
|
69
71
|
try {
|
|
70
72
|
const linked = await runAngularLinker(code, { filename: cleanId, projectRoot, freshPlugin: true });
|
|
71
73
|
if (linked) {
|
|
74
|
+
recordLinkerHit('vite');
|
|
72
75
|
if (isDebug())
|
|
73
76
|
console.log('[ns-angular-linker][vite] linked', cleanId);
|
|
74
77
|
return { code: linked, map: null };
|
|
@@ -96,6 +99,7 @@ export function angularLinkerVitePluginPost(projectRoot) {
|
|
|
96
99
|
const filename = id.split('?', 1)[0];
|
|
97
100
|
const linked = await runAngularLinker(code, { filename, projectRoot });
|
|
98
101
|
if (linked) {
|
|
102
|
+
recordLinkerHit('vite-post');
|
|
99
103
|
if (isDebug())
|
|
100
104
|
console.log('[ns-angular-linker][vite-post] linked', filename);
|
|
101
105
|
return { code: linked, map: null };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-linker.js","sourceRoot":"","sources":["../../../../../../../packages/vite/hmr/frameworks/angular/build/angular-linker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"angular-linker.js","sourceRoot":"","sources":["../../../../../../../packages/vite/hmr/frameworks/angular/build/angular-linker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-layer hit counters for the stacked Angular linker passes.
|
|
3
|
+
*
|
|
4
|
+
* Five layers can each link partial declarations (vite pre, rollup pre,
|
|
5
|
+
* vite post, renderChunk, generateBundle). Some exist purely as safety nets
|
|
6
|
+
* and may never fire for a given flavor/build mode. Before any layer can be
|
|
7
|
+
* removed we need evidence across the flavor matrix — these counters make a
|
|
8
|
+
* build print exactly which layers did work, without grepping the per-file
|
|
9
|
+
* VITE_DEBUG_LOGS output.
|
|
10
|
+
*/
|
|
11
|
+
export declare function recordLinkerHit(layer: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Print a one-line summary of which linker layers linked anything this build.
|
|
14
|
+
* Called from the generateBundle-phase linker (the last layer to run). Prints
|
|
15
|
+
* only when at least one layer fired, or unconditionally under VITE_DEBUG_LOGS
|
|
16
|
+
* so a zero-hit matrix run is still observable.
|
|
17
|
+
*/
|
|
18
|
+
export declare function reportLinkerLayerStats(): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-layer hit counters for the stacked Angular linker passes.
|
|
3
|
+
*
|
|
4
|
+
* Five layers can each link partial declarations (vite pre, rollup pre,
|
|
5
|
+
* vite post, renderChunk, generateBundle). Some exist purely as safety nets
|
|
6
|
+
* and may never fire for a given flavor/build mode. Before any layer can be
|
|
7
|
+
* removed we need evidence across the flavor matrix — these counters make a
|
|
8
|
+
* build print exactly which layers did work, without grepping the per-file
|
|
9
|
+
* VITE_DEBUG_LOGS output.
|
|
10
|
+
*/
|
|
11
|
+
const layerHits = new Map();
|
|
12
|
+
export function recordLinkerHit(layer) {
|
|
13
|
+
layerHits.set(layer, (layerHits.get(layer) ?? 0) + 1);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Print a one-line summary of which linker layers linked anything this build.
|
|
17
|
+
* Called from the generateBundle-phase linker (the last layer to run). Prints
|
|
18
|
+
* only when at least one layer fired, or unconditionally under VITE_DEBUG_LOGS
|
|
19
|
+
* so a zero-hit matrix run is still observable.
|
|
20
|
+
*/
|
|
21
|
+
export function reportLinkerLayerStats() {
|
|
22
|
+
const debug = process.env.VITE_DEBUG_LOGS === '1' || process.env.VITE_DEBUG_LOGS === 'true';
|
|
23
|
+
const total = [...layerHits.values()].reduce((sum, n) => sum + n, 0);
|
|
24
|
+
if (total === 0 && !debug)
|
|
25
|
+
return;
|
|
26
|
+
const parts = ['vite-load', 'vite', 'vite-post', 'rollup-load', 'rollup', 'render', 'post'].map((layer) => `${layer}=${layerHits.get(layer) ?? 0}`);
|
|
27
|
+
console.log(`[ns-angular-linker] layer hits this build: ${parts.join(' ')}`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=linker-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linker-stats.js","sourceRoot":"","sources":["../../../../../../../packages/vite/hmr/frameworks/angular/build/linker-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;IAC5F,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO;IAClC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpJ,OAAO,CAAC,GAAG,CAAC,8CAA8C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Safety-net TypeScript fallback transform.
|
|
2
|
+
//
|
|
3
|
+
// Problem: In HMR mode (where `useAngularCompilationAPI = false`), the
|
|
4
|
+
// `@analogjs/vite-plugin-angular` `config` hook forcibly sets `oxc: false` on
|
|
5
|
+
// the Vite config (see `angular-vite-plugin.js`:
|
|
6
|
+
// `const oxc = pluginOptions.useAngularCompilationAPI ? undefined : (config.oxc ?? false);`).
|
|
7
|
+
// That disables Vite's built-in oxc TypeScript transformer for the whole dev
|
|
8
|
+
// session. The Analog plugin then expects its own `fileEmitter` to strip types
|
|
9
|
+
// from every `.ts` file in the project — but `fileEmitter` only knows about
|
|
10
|
+
// files that are part of the Angular TypeScript program (anything imported
|
|
11
|
+
// directly, or referenced via `templateUrl` / `styleUrls` from a decorated
|
|
12
|
+
// class).
|
|
13
|
+
//
|
|
14
|
+
// Worker entry files fall outside the program. They are only loaded via
|
|
15
|
+
// `new Worker(new URL('./foo.worker', import.meta.url))`, which is NOT an
|
|
16
|
+
// import — it's a URL constructor expression the device resolves at runtime.
|
|
17
|
+
// `fileEmitter(id)` returns nothing for those files, the Analog plugin's
|
|
18
|
+
// transform returns `undefined`, oxc doesn't run (because Analog disabled it),
|
|
19
|
+
// and the raw `.ts` source reaches the device with type annotations intact.
|
|
20
|
+
// V8's parser then chokes on the first `(x: Type)` parameter annotation with
|
|
21
|
+
// `SyntaxError: Unexpected token ':'`.
|
|
22
|
+
//
|
|
23
|
+
// The fix is a small post-enforce transform that re-runs Vite's own
|
|
24
|
+
// `transformWithOxc` on any `.ts`/`.tsx` file that still looks like raw
|
|
25
|
+
// TypeScript after the rest of the pipeline is done. For already-compiled
|
|
26
|
+
// Angular output (pure JS), the detection heuristic short-circuits and we
|
|
27
|
+
// never invoke oxc, so the fast path stays fast.
|
|
28
|
+
//
|
|
29
|
+
// Scope intentionally narrow:
|
|
30
|
+
// * `enforce: 'post'` — only sees final code after every other plugin had a
|
|
31
|
+
// chance to transform.
|
|
32
|
+
// * `apply: 'serve'` — dev/HMR only. Production builds use Rolldown which
|
|
33
|
+
// handles TS natively without needing this net.
|
|
34
|
+
// * Skips `node_modules` / `.vite` — third-party code has its own pipeline,
|
|
35
|
+
// and hitting every transitive dep would be wasteful.
|
|
36
|
+
// * Skips files containing Angular decorators (`@Component`, `@Injectable`,
|
|
37
|
+
// `@NgModule`, `@Directive`, `@Pipe`). Those files belong to the Angular
|
|
38
|
+
// program; if they fell through the Angular plugin we surface Angular's
|
|
39
|
+
// own `"contains Angular decorators but is not in the TypeScript program"`
|
|
40
|
+
// warning rather than silently transforming them with oxc (which would
|
|
41
|
+
// emit a `@oxc-project/runtime/helpers/decorate` import that the app does
|
|
42
|
+
// not depend on, breaking Vite's import-analysis pass).
|
|
43
|
+
// * Regex-based detection — catches the tokens V8 would actually reject.
|
|
44
|
+
// False positives (running oxc on valid JS) are harmless because oxc with
|
|
45
|
+
// `lang: 'ts'` is a no-op on JS; false negatives would only surface as the
|
|
46
|
+
// same error the fix is designed to prevent, so the detector errs toward
|
|
47
|
+
// running the transform when in doubt.
|
|
48
|
+
const TS_ONLY_SYNTAX_RE = new RegExp([
|
|
49
|
+
// `import type { … } from '…'` / `export type { … } from '…'`
|
|
50
|
+
String.raw `\b(?:import|export)\s+type\s`,
|
|
51
|
+
// `interface Foo { … }`
|
|
52
|
+
String.raw `\binterface\s+[A-Z_$][\w$]*\s*[<{]`,
|
|
53
|
+
// `type Foo = …`
|
|
54
|
+
String.raw `\btype\s+[A-Z_$][\w$]*\s*[<=]`,
|
|
55
|
+
// `as Type` assertions — restrict right-hand side to common primitives
|
|
56
|
+
// or PascalCase identifiers to avoid catching unrelated tokens.
|
|
57
|
+
String.raw `\bas\s+(?:string|number|boolean|any|unknown|never|void|[A-Z][\w$]*)\b`,
|
|
58
|
+
// Parameter / destructured type annotations: `(msg: any)`, `(x: T, y: U)`.
|
|
59
|
+
// Anchored to `(` or `,` so we don't match object literal keys like `{ a: 1 }`.
|
|
60
|
+
String.raw `[(,]\s*[\w$]+\s*\??\s*:\s*(?:string|number|boolean|any|unknown|never|void|null|undefined|object|[A-Z][\w$]*(?:<[^>]*>)?(?:\[\])?)\b`,
|
|
61
|
+
// Variable type annotations: `let x: T = …` / `const y: T`
|
|
62
|
+
String.raw `\b(?:const|let|var)\s+[\w$]+\s*:\s*[\w$<>[\]|&., ]+\s*[;=]`,
|
|
63
|
+
// Return type annotations on arrow functions: `): T =>`
|
|
64
|
+
String.raw `\)\s*:\s*(?:string|number|boolean|any|unknown|never|void|[A-Z][\w$]*(?:<[^>]*>)?)\s*(?:=>|\{)`,
|
|
65
|
+
].join('|'));
|
|
66
|
+
// Decorator shapes that mean "the Angular plugin owns this file, stay out of
|
|
67
|
+
// its way." We do NOT try to compile these ourselves even if the Angular
|
|
68
|
+
// plugin's `fileEmitter` didn't produce output for them — oxc would rewrite
|
|
69
|
+
// the decorators into `import _decorate from "@oxc-project/runtime/helpers/decorate"`
|
|
70
|
+
// calls, Vite's import-analysis would fail to resolve that helper package,
|
|
71
|
+
// and we'd turn a harmless "not in TypeScript program" warning into a fatal
|
|
72
|
+
// import error. Better to let Angular's own warning surface and leave the
|
|
73
|
+
// code untouched.
|
|
74
|
+
const ANGULAR_DECORATOR_RE = /@(?:Component|Directive|Injectable|NgModule|Pipe)\s*\(/;
|
|
75
|
+
const TS_FALLBACK_SKIP_ID_RE = /(?:^|\/)(?:node_modules|\.vite)\//;
|
|
76
|
+
export function tsFallbackTransformPlugin(opts) {
|
|
77
|
+
const { verbose } = opts || {};
|
|
78
|
+
// Cached after the first successful import so repeated transforms don't
|
|
79
|
+
// pay the dynamic-import cost. `null` = not loaded yet; `false` = load
|
|
80
|
+
// attempted and failed (older Vite with no oxc export — we'll skip).
|
|
81
|
+
let cachedTransformWithOxc = null;
|
|
82
|
+
return {
|
|
83
|
+
name: 'nativescript-ts-fallback-transform',
|
|
84
|
+
enforce: 'post',
|
|
85
|
+
apply: 'serve',
|
|
86
|
+
async transform(code, id) {
|
|
87
|
+
if (cachedTransformWithOxc === false)
|
|
88
|
+
return null;
|
|
89
|
+
const cleanId = id.split('?', 1)[0];
|
|
90
|
+
if (!cleanId || !/\.(m?ts|[jt]sx)$/.test(cleanId))
|
|
91
|
+
return null;
|
|
92
|
+
if (TS_FALLBACK_SKIP_ID_RE.test(cleanId))
|
|
93
|
+
return null;
|
|
94
|
+
if (ANGULAR_DECORATOR_RE.test(code))
|
|
95
|
+
return null;
|
|
96
|
+
if (!TS_ONLY_SYNTAX_RE.test(code))
|
|
97
|
+
return null;
|
|
98
|
+
if (cachedTransformWithOxc === null) {
|
|
99
|
+
try {
|
|
100
|
+
// Dynamic import keeps this plugin cross-version-safe: older
|
|
101
|
+
// Vite installs without `transformWithOxc` (pre-Rolldown
|
|
102
|
+
// builds) cleanly disable this fallback instead of crashing.
|
|
103
|
+
const vite = await import('vite');
|
|
104
|
+
if (typeof vite.transformWithOxc === 'function') {
|
|
105
|
+
cachedTransformWithOxc = vite.transformWithOxc;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
cachedTransformWithOxc = false;
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
cachedTransformWithOxc = false;
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const lang = cleanId.endsWith('tsx') ? 'tsx' : cleanId.endsWith('jsx') ? 'jsx' : 'ts';
|
|
119
|
+
const result = await cachedTransformWithOxc(code, cleanId, { lang });
|
|
120
|
+
if (!result || typeof result.code !== 'string')
|
|
121
|
+
return null;
|
|
122
|
+
if (verbose) {
|
|
123
|
+
// eslint-disable-next-line no-console
|
|
124
|
+
console.log(`[ns-ts-fallback] type-stripped ${cleanId}`);
|
|
125
|
+
}
|
|
126
|
+
return { code: result.code, map: result.map ?? null };
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (verbose) {
|
|
130
|
+
// eslint-disable-next-line no-console
|
|
131
|
+
console.warn(`[ns-ts-fallback] transformWithOxc failed for ${cleanId}:`, err);
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=ts-fallback-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-fallback-transform.js","sourceRoot":"","sources":["../../../../../../../packages/vite/hmr/frameworks/angular/build/ts-fallback-transform.ts"],"names":[],"mappings":"AAEA,4CAA4C;AAC5C,EAAE;AACF,uEAAuE;AACvE,8EAA8E;AAC9E,iDAAiD;AACjD,8FAA8F;AAC9F,6EAA6E;AAC7E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,2EAA2E;AAC3E,UAAU;AACV,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,6EAA6E;AAC7E,yEAAyE;AACzE,+EAA+E;AAC/E,4EAA4E;AAC5E,6EAA6E;AAC7E,uCAAuC;AACvC,EAAE;AACF,oEAAoE;AACpE,wEAAwE;AACxE,0EAA0E;AAC1E,0EAA0E;AAC1E,iDAAiD;AACjD,EAAE;AACF,8BAA8B;AAC9B,6EAA6E;AAC7E,0BAA0B;AAC1B,2EAA2E;AAC3E,mDAAmD;AACnD,6EAA6E;AAC7E,yDAAyD;AACzD,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,2DAA2D;AAC3D,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,0CAA0C;AAE1C,MAAM,iBAAiB,GAAG,IAAI,MAAM,CACnC;IACC,8DAA8D;IAC9D,MAAM,CAAC,GAAG,CAAA,8BAA8B;IACxC,wBAAwB;IACxB,MAAM,CAAC,GAAG,CAAA,oCAAoC;IAC9C,iBAAiB;IACjB,MAAM,CAAC,GAAG,CAAA,+BAA+B;IACzC,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,CAAC,GAAG,CAAA,uEAAuE;IACjF,2EAA2E;IAC3E,gFAAgF;IAChF,MAAM,CAAC,GAAG,CAAA,qIAAqI;IAC/I,2DAA2D;IAC3D,MAAM,CAAC,GAAG,CAAA,4DAA4D;IACtE,wDAAwD;IACxD,MAAM,CAAC,GAAG,CAAA,+FAA+F;CACzG,CAAC,IAAI,CAAC,GAAG,CAAC,CACX,CAAC;AAEF,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,sFAAsF;AACtF,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,kBAAkB;AAClB,MAAM,oBAAoB,GAAG,wDAAwD,CAAC;AAEtF,MAAM,sBAAsB,GAAG,mCAAmC,CAAC;AAMnE,MAAM,UAAU,yBAAyB,CAAC,IAAuC;IAChF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/B,wEAAwE;IACxE,uEAAuE;IACvE,qEAAqE;IACrE,IAAI,sBAAsB,GAAsG,IAAI,CAAC;IAErI,OAAO;QACN,IAAI,EAAE,oCAAoC;QAC1C,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,sBAAsB,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/D,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtD,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE/C,IAAI,sBAAsB,KAAK,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACJ,6DAA6D;oBAC7D,yDAAyD;oBACzD,6DAA6D;oBAC7D,MAAM,IAAI,GAAQ,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;wBACjD,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACP,sBAAsB,GAAG,KAAK,CAAC;wBAC/B,OAAO,IAAI,CAAC;oBACb,CAAC;gBACF,CAAC;gBAAC,MAAM,CAAC;oBACR,sBAAsB,GAAG,KAAK,CAAC;oBAC/B,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtF,MAAM,MAAM,GAAG,MAAO,sBAA8B,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC;gBAC5D,IAAI,OAAO,EAAE,CAAC;oBACb,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,OAAO,EAAE,CAAC;oBACb,sCAAsC;oBACtC,OAAO,CAAC,IAAI,CAAC,gDAAgD,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC/E,CAAC;gBACD,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC"}
|