@remix-run/assets 0.4.3 → 0.5.0
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 +322 -56
- package/dist/assets.d.ts +2 -1
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +2 -2
- package/dist/lib/access.d.ts +6 -2
- package/dist/lib/access.d.ts.map +1 -1
- package/dist/lib/access.js +300 -5
- package/dist/lib/asset-server.d.ts +118 -5
- package/dist/lib/asset-server.d.ts.map +1 -1
- package/dist/lib/asset-server.js +260 -24
- package/dist/lib/compilation-error.d.ts +1 -1
- package/dist/lib/compilation-error.d.ts.map +1 -1
- package/dist/lib/file-matcher.js +1 -1
- package/dist/lib/files/compiler.d.ts.map +1 -1
- package/dist/lib/files/compiler.js +7 -6
- package/dist/lib/files/config.js +1 -1
- package/dist/lib/hmr.d.ts +37 -0
- package/dist/lib/hmr.d.ts.map +1 -0
- package/dist/lib/hmr.js +357 -0
- package/dist/lib/injected-packages.d.ts.map +1 -1
- package/dist/lib/injected-packages.js +36 -13
- package/dist/lib/loaders.d.ts +57 -0
- package/dist/lib/loaders.d.ts.map +1 -0
- package/dist/lib/loaders.js +1 -0
- package/dist/lib/module-store.d.ts +24 -0
- package/dist/lib/module-store.d.ts.map +1 -1
- package/dist/lib/module-store.js +136 -11
- package/dist/lib/routes.d.ts.map +1 -1
- package/dist/lib/routes.js +13 -13
- package/dist/lib/scripts/compiler.d.ts +24 -1
- package/dist/lib/scripts/compiler.d.ts.map +1 -1
- package/dist/lib/scripts/compiler.js +183 -29
- package/dist/lib/scripts/conditions.d.ts +2 -0
- package/dist/lib/scripts/conditions.d.ts.map +1 -0
- package/dist/lib/scripts/conditions.js +1 -0
- package/dist/lib/scripts/emit.d.ts +3 -0
- package/dist/lib/scripts/emit.d.ts.map +1 -1
- package/dist/lib/scripts/emit.js +24 -5
- package/dist/lib/scripts/resolve.d.ts +4 -0
- package/dist/lib/scripts/resolve.d.ts.map +1 -1
- package/dist/lib/scripts/resolve.js +70 -5
- package/dist/lib/scripts/transform.d.ts +9 -0
- package/dist/lib/scripts/transform.d.ts.map +1 -1
- package/dist/lib/scripts/transform.js +222 -18
- package/dist/lib/source-maps.js +1 -1
- package/dist/lib/styles/compiler.d.ts +14 -1
- package/dist/lib/styles/compiler.d.ts.map +1 -1
- package/dist/lib/styles/compiler.js +78 -14
- package/dist/lib/styles/emit.js +4 -4
- package/dist/lib/styles/resolve.d.ts.map +1 -1
- package/dist/lib/styles/resolve.js +8 -7
- package/dist/lib/styles/transform.js +3 -3
- package/dist/lib/target.d.ts +1 -1
- package/dist/lib/target.d.ts.map +1 -1
- package/dist/lib/watch.js +1 -1
- package/dist/types/hmr.d.ts +36 -0
- package/package.json +17 -11
- package/src/assets.ts +2 -1
- package/src/lib/access.ts +386 -5
- package/src/lib/asset-server.ts +429 -18
- package/src/lib/compilation-error.ts +1 -0
- package/src/lib/files/compiler.ts +7 -3
- package/src/lib/hmr.ts +397 -0
- package/src/lib/injected-packages.ts +41 -11
- package/src/lib/loaders.ts +80 -0
- package/src/lib/module-store.ts +190 -9
- package/src/lib/routes.ts +24 -14
- package/src/lib/scripts/compiler.ts +248 -24
- package/src/lib/scripts/conditions.ts +1 -0
- package/src/lib/scripts/emit.ts +50 -5
- package/src/lib/scripts/resolve.ts +124 -2
- package/src/lib/scripts/transform.ts +290 -19
- package/src/lib/styles/compiler.ts +108 -8
- package/src/lib/styles/emit.ts +1 -1
- package/src/lib/styles/resolve.ts +11 -7
- package/src/types/hmr.d.ts +36 -0
package/dist/lib/hmr.js
ADDED
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
export function createHmrClientSource(options) {
|
|
2
|
+
return `
|
|
3
|
+
const contexts = new Map()
|
|
4
|
+
const dataByPath = new Map()
|
|
5
|
+
|
|
6
|
+
class RemixHmrContext {
|
|
7
|
+
constructor(path) {
|
|
8
|
+
this.path = path
|
|
9
|
+
this.data = dataByPath.get(path) ?? {}
|
|
10
|
+
this.acceptCallbacks = []
|
|
11
|
+
this.acceptDependencyCallbacks = []
|
|
12
|
+
this.disposeCallbacks = []
|
|
13
|
+
this.customEventCallbacks = new Map()
|
|
14
|
+
this.invalidated = false
|
|
15
|
+
this.updating = false
|
|
16
|
+
dataByPath.set(path, this.data)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
accept(deps, callback) {
|
|
20
|
+
if (typeof deps === 'string') {
|
|
21
|
+
this.acceptDependencyCallbacks.push({
|
|
22
|
+
deps: [normalizeAcceptedDependency(this.path, deps)],
|
|
23
|
+
callback: callback ?? (() => {}),
|
|
24
|
+
})
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (Array.isArray(deps)) {
|
|
29
|
+
this.acceptDependencyCallbacks.push({
|
|
30
|
+
deps: deps.map((dep) => normalizeAcceptedDependency(this.path, dep)),
|
|
31
|
+
callback: callback ?? (() => {}),
|
|
32
|
+
})
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
this.acceptCallbacks.push(deps ?? (() => {}))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
dispose(callback) {
|
|
40
|
+
this.disposeCallbacks.push(callback)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
invalidate(message) {
|
|
44
|
+
this.invalidated = true
|
|
45
|
+
if (this.updating) {
|
|
46
|
+
if (message) console.debug(message)
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
if (message) console.debug(message)
|
|
50
|
+
reloadPage()
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
on(event, callback) {
|
|
54
|
+
let callbacks = this.customEventCallbacks.get(event)
|
|
55
|
+
if (!callbacks) {
|
|
56
|
+
callbacks = []
|
|
57
|
+
this.customEventCallbacks.set(event, callbacks)
|
|
58
|
+
}
|
|
59
|
+
callbacks.push(callback)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function createHotContext(path) {
|
|
64
|
+
let context = new RemixHmrContext(path)
|
|
65
|
+
contexts.set(path, context)
|
|
66
|
+
return context
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let connected = false
|
|
70
|
+
let reconnectPending = false
|
|
71
|
+
let pageReloadTimer
|
|
72
|
+
let failedJavaScriptUpdates = new Map()
|
|
73
|
+
let stylesheetUpdatePromise = Promise.resolve()
|
|
74
|
+
|
|
75
|
+
let events = new EventSource(${JSON.stringify(options.eventPathname)})
|
|
76
|
+
|
|
77
|
+
events.onopen = () => {
|
|
78
|
+
console.debug('[remix] HMR connected')
|
|
79
|
+
if (reconnectPending) {
|
|
80
|
+
reconnectPending = false
|
|
81
|
+
console.log('[remix] HMR reconnected')
|
|
82
|
+
handleReconnect().catch((error) => {
|
|
83
|
+
console.error('[remix] HMR reconnect recovery failed', error)
|
|
84
|
+
reloadPage()
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
connected = true
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
events.onerror = () => {
|
|
91
|
+
if (!connected) return
|
|
92
|
+
connected = false
|
|
93
|
+
reconnectPending = true
|
|
94
|
+
console.log('[remix] HMR connection lost, retrying...')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
events.onmessage = (event) => {
|
|
98
|
+
let payload = JSON.parse(event.data)
|
|
99
|
+
handlePayload(payload).catch((error) => {
|
|
100
|
+
console.error('[remix] HMR update failed', error)
|
|
101
|
+
if (payload.type !== 'browser:update' || payload.updates.some((update) => update.type !== 'js')) {
|
|
102
|
+
reloadPage()
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function handlePayload(payload) {
|
|
108
|
+
if (payload.type === 'browser:reload') {
|
|
109
|
+
reloadPage()
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (payload.type === 'server:update') {
|
|
114
|
+
await retryFailedJavaScriptUpdates(payload)
|
|
115
|
+
await dispatchCustomEvent(payload.type, payload)
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (payload.type === 'browser:update') {
|
|
120
|
+
for (let update of payload.updates) {
|
|
121
|
+
if (update.type === 'css') {
|
|
122
|
+
let updated = await queueStylesheetUpdate(update.path, payload.timestamp)
|
|
123
|
+
if (updated) console.debug('[remix] HMR updated stylesheet', update.path)
|
|
124
|
+
continue
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
let updated = await updateJavaScriptModule(
|
|
129
|
+
update.path,
|
|
130
|
+
update.acceptedPath ?? update.path,
|
|
131
|
+
payload.timestamp,
|
|
132
|
+
)
|
|
133
|
+
failedJavaScriptUpdates.delete(update.path)
|
|
134
|
+
if (updated) console.debug('[remix] HMR accepted update', update.path)
|
|
135
|
+
} catch (error) {
|
|
136
|
+
failedJavaScriptUpdates.set(update.path, update.acceptedPath ?? update.path)
|
|
137
|
+
throw error
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function handleReconnect() {
|
|
144
|
+
let data = { timestamp: Date.now() }
|
|
145
|
+
await reloadCurrentStylesheets(data)
|
|
146
|
+
await retryFailedJavaScriptUpdates(data)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function retryFailedJavaScriptUpdates(data) {
|
|
150
|
+
if (failedJavaScriptUpdates.size === 0) return
|
|
151
|
+
|
|
152
|
+
let timestamp = getTimestamp(data)
|
|
153
|
+
for (let [path, acceptedPath] of Array.from(failedJavaScriptUpdates)) {
|
|
154
|
+
try {
|
|
155
|
+
let updated = await updateJavaScriptModule(path, acceptedPath, timestamp)
|
|
156
|
+
failedJavaScriptUpdates.delete(path)
|
|
157
|
+
if (updated) console.debug('[remix] HMR recovered update', path)
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error('[remix] HMR recovery update failed', error)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async function reloadCurrentStylesheets(data) {
|
|
165
|
+
let timestamp = getTimestamp(data)
|
|
166
|
+
let paths = new Set()
|
|
167
|
+
for (let link of document.querySelectorAll('link[rel="stylesheet"]')) {
|
|
168
|
+
if (link.dataset.remixHmrStylesheet === 'true') continue
|
|
169
|
+
let url = new URL(link.href)
|
|
170
|
+
if (url.origin !== location.origin) continue
|
|
171
|
+
paths.add(url.pathname)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for (let path of paths) {
|
|
175
|
+
await queueStylesheetUpdate(path, timestamp)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function getTimestamp(data) {
|
|
180
|
+
if (data && typeof data === 'object' && typeof data.timestamp === 'number') {
|
|
181
|
+
return data.timestamp
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return Date.now()
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function updateJavaScriptModule(path, acceptedPath, timestamp) {
|
|
188
|
+
let previousContext = contexts.get(path)
|
|
189
|
+
if (!previousContext) return false
|
|
190
|
+
|
|
191
|
+
let isSelfUpdate = path === acceptedPath
|
|
192
|
+
let dependencyCallbacks = getAcceptDependencyCallbacks(previousContext, acceptedPath)
|
|
193
|
+
|
|
194
|
+
if (
|
|
195
|
+
isSelfUpdate ? previousContext.acceptCallbacks.length === 0 : dependencyCallbacks.length === 0
|
|
196
|
+
) {
|
|
197
|
+
console.log('[remix] HMR no accept handler, reloading page', path)
|
|
198
|
+
reloadPage()
|
|
199
|
+
return false
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (isSelfUpdate) {
|
|
203
|
+
for (let callback of previousContext.disposeCallbacks) {
|
|
204
|
+
await callback(previousContext.data)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
let updatedModule = await import(withTimestamp(path, timestamp))
|
|
208
|
+
previousContext.invalidated = false
|
|
209
|
+
previousContext.updating = true
|
|
210
|
+
try {
|
|
211
|
+
for (let callback of previousContext.acceptCallbacks) {
|
|
212
|
+
await callback(updatedModule)
|
|
213
|
+
}
|
|
214
|
+
} finally {
|
|
215
|
+
previousContext.updating = false
|
|
216
|
+
}
|
|
217
|
+
if (previousContext.invalidated) {
|
|
218
|
+
await propagateInvalidatedJavaScriptModule(path, timestamp)
|
|
219
|
+
}
|
|
220
|
+
return true
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
let acceptedContext = contexts.get(acceptedPath)
|
|
224
|
+
if (acceptedContext) {
|
|
225
|
+
for (let callback of acceptedContext.disposeCallbacks) {
|
|
226
|
+
await callback(acceptedContext.data)
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
let updatedModule = await import(withTimestamp(acceptedPath, timestamp))
|
|
231
|
+
previousContext.invalidated = false
|
|
232
|
+
previousContext.updating = true
|
|
233
|
+
try {
|
|
234
|
+
for (let { deps, callback } of dependencyCallbacks) {
|
|
235
|
+
if (deps.length === 1) {
|
|
236
|
+
await callback(updatedModule)
|
|
237
|
+
} else {
|
|
238
|
+
await callback(deps.map((dep) => (dep === acceptedPath ? updatedModule : undefined)))
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
} finally {
|
|
242
|
+
previousContext.updating = false
|
|
243
|
+
}
|
|
244
|
+
if (previousContext.invalidated) {
|
|
245
|
+
await propagateInvalidatedJavaScriptModule(path, timestamp)
|
|
246
|
+
}
|
|
247
|
+
return true
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async function propagateInvalidatedJavaScriptModule(path, timestamp) {
|
|
251
|
+
let updated = false
|
|
252
|
+
for (let [importerPath, importerContext] of contexts) {
|
|
253
|
+
if (importerPath === path) continue
|
|
254
|
+
let callbacks = getAcceptDependencyCallbacks(importerContext, path)
|
|
255
|
+
if (callbacks.length === 0) continue
|
|
256
|
+
|
|
257
|
+
for (let callback of importerContext.disposeCallbacks) {
|
|
258
|
+
await callback(importerContext.data)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
let updatedModule = await import(withTimestamp(path, timestamp))
|
|
262
|
+
importerContext.invalidated = false
|
|
263
|
+
importerContext.updating = true
|
|
264
|
+
try {
|
|
265
|
+
for (let { deps, callback } of callbacks) {
|
|
266
|
+
if (deps.length === 1) {
|
|
267
|
+
await callback(updatedModule)
|
|
268
|
+
} else {
|
|
269
|
+
await callback(deps.map((dep) => (dep === path ? updatedModule : undefined)))
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
} finally {
|
|
273
|
+
importerContext.updating = false
|
|
274
|
+
}
|
|
275
|
+
updated = true
|
|
276
|
+
|
|
277
|
+
if (importerContext.invalidated) {
|
|
278
|
+
reloadPage()
|
|
279
|
+
return
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (!updated) reloadPage()
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function getAcceptDependencyCallbacks(context, acceptedPath) {
|
|
287
|
+
return context.acceptDependencyCallbacks.filter(({ deps }) => deps.includes(acceptedPath))
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function normalizeAcceptedDependency(importerPath, dep) {
|
|
291
|
+
if (dep.startsWith('/')) return dep
|
|
292
|
+
return new URL(dep, new URL(importerPath, window.location.href)).pathname
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function dispatchCustomEvent(event, data) {
|
|
296
|
+
for (let context of contexts.values()) {
|
|
297
|
+
let callbacks = context.customEventCallbacks.get(event) ?? []
|
|
298
|
+
for (let callback of callbacks) {
|
|
299
|
+
await callback(data)
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async function reloadStylesheet(path, timestamp) {
|
|
305
|
+
let links = document.querySelectorAll('link[rel="stylesheet"]')
|
|
306
|
+
let updates = []
|
|
307
|
+
for (let link of links) {
|
|
308
|
+
let url = new URL(link.href)
|
|
309
|
+
if (url.pathname !== path) continue
|
|
310
|
+
if (link.dataset.remixHmrStylesheet === 'true') continue
|
|
311
|
+
|
|
312
|
+
updates.push(loadStylesheet(link, path, timestamp))
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (updates.length === 0) return false
|
|
316
|
+
return (await Promise.all(updates)).some(Boolean)
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async function queueStylesheetUpdate(path, timestamp) {
|
|
320
|
+
let update = stylesheetUpdatePromise.then(() => reloadStylesheet(path, timestamp))
|
|
321
|
+
stylesheetUpdatePromise = update.catch(() => {})
|
|
322
|
+
return update
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function loadStylesheet(link, path, timestamp) {
|
|
326
|
+
return new Promise((resolve) => {
|
|
327
|
+
let next = link.cloneNode()
|
|
328
|
+
next.dataset.remixHmrStylesheet = 'true'
|
|
329
|
+
next.href = withTimestamp(path, timestamp)
|
|
330
|
+
next.onload = () => {
|
|
331
|
+
delete next.dataset.remixHmrStylesheet
|
|
332
|
+
link.remove()
|
|
333
|
+
resolve(true)
|
|
334
|
+
}
|
|
335
|
+
next.onerror = () => {
|
|
336
|
+
next.remove()
|
|
337
|
+
resolve(false)
|
|
338
|
+
}
|
|
339
|
+
link.after(next)
|
|
340
|
+
})
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function withTimestamp(path, timestamp) {
|
|
344
|
+
let url = new URL(path, location.href)
|
|
345
|
+
url.searchParams.set('t', String(timestamp))
|
|
346
|
+
return url.pathname + url.search
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function reloadPage() {
|
|
350
|
+
if (pageReloadTimer) clearTimeout(pageReloadTimer)
|
|
351
|
+
pageReloadTimer = setTimeout(() => {
|
|
352
|
+
console.debug('[remix] HMR reloading page')
|
|
353
|
+
window.location.href = window.location.href
|
|
354
|
+
}, 20)
|
|
355
|
+
}
|
|
356
|
+
`.trimStart();
|
|
357
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injected-packages.d.ts","sourceRoot":"","sources":["../../src/lib/injected-packages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"injected-packages.d.ts","sourceRoot":"","sources":["../../src/lib/injected-packages.ts"],"names":[],"mappings":"AAiBA,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWnE;AAED,wBAAgB,8BAA8B,IAAI;IAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;CAChB,EAAE,CAYF;AAED,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnF;AAED,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED,wBAAgB,oCAAoC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASrF;AAED,wBAAgB,uCAAuC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYxF;AAWD,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
|
-
import { getFilePathDirectory, normalizeFilePath } from
|
|
3
|
+
import { getFilePathDirectory, normalizeFilePath } from './paths.js';
|
|
4
4
|
const injectedPackageNames = ['@oxc-project/runtime'];
|
|
5
|
+
const authoredInjectedPackageNames = ['@oxc-project/runtime'];
|
|
6
|
+
const generatedInjectedPackageSpecifiers = [];
|
|
5
7
|
const injectedPackagesBasePath = '/__@remix/injected';
|
|
6
8
|
const resolvedInjectedPackages = new Map();
|
|
7
9
|
export function isInjectedPackageFilePath(filePath) {
|
|
@@ -17,16 +19,22 @@ export function isInjectedPackageFilePath(filePath) {
|
|
|
17
19
|
export function getInjectedPackageRouteConfigs() {
|
|
18
20
|
return injectedPackageNames.map((packageName) => {
|
|
19
21
|
let { packageRoot } = getResolvedInjectedPackage(packageName);
|
|
22
|
+
let { filePattern, routeRoot } = getInjectedPackageRoute(packageRoot, packageName);
|
|
20
23
|
return {
|
|
21
24
|
fileMap: {
|
|
22
|
-
[getInjectedPackageRoutePattern(packageName)]:
|
|
25
|
+
[getInjectedPackageRoutePattern(packageName)]: filePattern,
|
|
23
26
|
},
|
|
24
|
-
rootDir:
|
|
27
|
+
rootDir: routeRoot,
|
|
25
28
|
};
|
|
26
29
|
});
|
|
27
30
|
}
|
|
28
31
|
export function getInjectedPackageNameForSpecifier(specifier) {
|
|
29
|
-
for (let
|
|
32
|
+
for (let injectedSpecifier of generatedInjectedPackageSpecifiers) {
|
|
33
|
+
if (specifier === injectedSpecifier) {
|
|
34
|
+
return getPackageName(injectedSpecifier);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
for (let packageName of authoredInjectedPackageNames) {
|
|
30
38
|
if (specifier === packageName || specifier.startsWith(`${packageName}/`)) {
|
|
31
39
|
return packageName;
|
|
32
40
|
}
|
|
@@ -34,17 +42,19 @@ export function getInjectedPackageNameForSpecifier(specifier) {
|
|
|
34
42
|
return null;
|
|
35
43
|
}
|
|
36
44
|
export function mayContainInjectedPackageSpecifier(sourceText) {
|
|
37
|
-
return
|
|
45
|
+
return authoredInjectedPackageNames.some((packageName) => sourceText.includes(packageName));
|
|
38
46
|
}
|
|
39
47
|
export function maskAuthoredInjectedPackageSpecifier(specifier) {
|
|
40
|
-
let packageName
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
48
|
+
for (let packageName of authoredInjectedPackageNames) {
|
|
49
|
+
if (specifier !== packageName && !specifier.startsWith(`${packageName}/`))
|
|
50
|
+
continue;
|
|
51
|
+
let maskedPackageName = getMaskedInjectedPackageName(packageName);
|
|
52
|
+
return `${maskedPackageName}${specifier.slice(packageName.length)}`;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
45
55
|
}
|
|
46
56
|
export function restoreAuthoredInjectedPackageSpecifier(specifier) {
|
|
47
|
-
for (let packageName of
|
|
57
|
+
for (let packageName of authoredInjectedPackageNames) {
|
|
48
58
|
let maskedPackageName = getMaskedInjectedPackageName(packageName);
|
|
49
59
|
if (specifier === maskedPackageName) {
|
|
50
60
|
return packageName;
|
|
@@ -58,6 +68,10 @@ export function restoreAuthoredInjectedPackageSpecifier(specifier) {
|
|
|
58
68
|
function getMaskedInjectedPackageName(packageName) {
|
|
59
69
|
return `~${packageName.slice(1)}`;
|
|
60
70
|
}
|
|
71
|
+
function getPackageName(specifier) {
|
|
72
|
+
let parts = specifier.split('/');
|
|
73
|
+
return parts[0]?.startsWith('@') ? `${parts[0]}/${parts[1]}` : (parts[0] ?? specifier);
|
|
74
|
+
}
|
|
61
75
|
export function getInjectedPackageImporterPath() {
|
|
62
76
|
return normalizeFilePath(fileURLToPath(import.meta.url));
|
|
63
77
|
}
|
|
@@ -77,10 +91,19 @@ function getResolvedInjectedPackage(packageName) {
|
|
|
77
91
|
function getInjectedPackageRoutePattern(packageName) {
|
|
78
92
|
return `${injectedPackagesBasePath}/${packageName}/*path`;
|
|
79
93
|
}
|
|
80
|
-
function
|
|
94
|
+
function getInjectedPackageRoute(packageRoot, packageName) {
|
|
95
|
+
if (!packageRoot.endsWith(`/${packageName}`)) {
|
|
96
|
+
return {
|
|
97
|
+
filePattern: `${packageRoot.slice(getFilePathDirectory(packageRoot).length + 1)}/*path`,
|
|
98
|
+
routeRoot: getFilePathDirectory(packageRoot),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
81
101
|
let routeRoot = packageRoot;
|
|
82
102
|
for (let _segment of packageName.split('/')) {
|
|
83
103
|
routeRoot = getFilePathDirectory(routeRoot);
|
|
84
104
|
}
|
|
85
|
-
return
|
|
105
|
+
return {
|
|
106
|
+
filePattern: `${packageName}/*path`,
|
|
107
|
+
routeRoot,
|
|
108
|
+
};
|
|
86
109
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
type ModuleFloat16Array = typeof globalThis extends {
|
|
2
|
+
Float16Array: {
|
|
3
|
+
prototype: infer array;
|
|
4
|
+
};
|
|
5
|
+
} ? array : never;
|
|
6
|
+
type ModuleTypedArray = Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | Int8Array | Int16Array | Int32Array | BigUint64Array | BigInt64Array | ModuleFloat16Array | Float32Array | Float64Array;
|
|
7
|
+
type ModuleLoadSource = string | ArrayBuffer | ModuleTypedArray;
|
|
8
|
+
/**
|
|
9
|
+
* Synchronously loads a module or delegates to the next configured loader.
|
|
10
|
+
*
|
|
11
|
+
* Loaders follow Node's synchronous `load` hook signature and chaining contract. The asset server
|
|
12
|
+
* passes them JavaScript after its TypeScript/JavaScript transform and before HMR analysis and
|
|
13
|
+
* minification. Each loader must delegate to `nextLoad` or return `shortCircuit: true`.
|
|
14
|
+
*
|
|
15
|
+
* @param url Resolved `file:` URL for the module being compiled.
|
|
16
|
+
* @param context Format, conditions, attributes, and public asset URL for this load.
|
|
17
|
+
* @param nextLoad Next loader in the chain, ending with the asset server's compiled JavaScript.
|
|
18
|
+
* @returns A Node-compatible load result containing ES module source.
|
|
19
|
+
*/
|
|
20
|
+
export type ModuleLoader = (url: string, context: ModuleLoadContext, nextLoad: NextModuleLoader) => ModuleLoadResult;
|
|
21
|
+
/**
|
|
22
|
+
* Continues loading through the remaining loader chain.
|
|
23
|
+
*
|
|
24
|
+
* Omitted context fields retain their current values.
|
|
25
|
+
*
|
|
26
|
+
* @param url Current module URL. Loaders cannot change this URL.
|
|
27
|
+
* @param context Context fields to override for the remainder of this load.
|
|
28
|
+
* @returns The source produced by the remaining loaders or the asset compiler.
|
|
29
|
+
*/
|
|
30
|
+
export type NextModuleLoader = (url: string, context?: Partial<ModuleLoadContext>) => ModuleLoadResult;
|
|
31
|
+
/** State passed through a module loader chain. */
|
|
32
|
+
export interface ModuleLoadContext {
|
|
33
|
+
/** Package export conditions used while compiling this module. */
|
|
34
|
+
conditions: string[];
|
|
35
|
+
/** Current module format. Asset-server loaders must ultimately return `'module'`. */
|
|
36
|
+
format: string | null | undefined;
|
|
37
|
+
/** Import attributes supplied by the previous loader. Authored import attributes are unsupported. */
|
|
38
|
+
importAttributes: Record<string, string | undefined>;
|
|
39
|
+
/**
|
|
40
|
+
* Stable public URL path used to request this module from the asset server.
|
|
41
|
+
*
|
|
42
|
+
* Unlike Node's standard load context, this field is provided so loaders can use the browser
|
|
43
|
+
* module identity rather than its private filesystem URL.
|
|
44
|
+
*/
|
|
45
|
+
moduleUrl?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Source returned by a module loader. */
|
|
48
|
+
export interface ModuleLoadResult {
|
|
49
|
+
/** Loaded module format. Must be `'module'` for asset-server scripts. */
|
|
50
|
+
format: string | null | undefined;
|
|
51
|
+
/** Whether this result intentionally ends the loader chain without calling `nextLoad`. */
|
|
52
|
+
shortCircuit?: boolean;
|
|
53
|
+
/** Compiled JavaScript source, optionally rewritten by the loader. */
|
|
54
|
+
source?: ModuleLoadSource;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=loaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../../src/lib/loaders.ts"],"names":[],"mappings":"AAAA,KAAK,kBAAkB,GAAG,OAAO,UAAU,SAAS;IAClD,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,KAAK,CAAA;KAAE,CAAA;CACzC,GACG,KAAK,GACL,KAAK,CAAA;AAET,KAAK,gBAAgB,GACjB,UAAU,GACV,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,SAAS,GACT,UAAU,GACV,UAAU,GACV,cAAc,GACd,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,YAAY,CAAA;AAEhB,KAAK,gBAAgB,GAAG,MAAM,GAAG,WAAW,GAAG,gBAAgB,CAAA;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,gBAAgB,KACvB,gBAAgB,CAAA;AAErB;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,KACjC,gBAAgB,CAAA;AAErB,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,qFAAqF;IACrF,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,qGAAqG;IACrG,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACpD;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,0FAA0F;IAC1F,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sEAAsE;IACtE,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -8,11 +8,21 @@ export type FileSnapshot = {
|
|
|
8
8
|
size: bigint;
|
|
9
9
|
};
|
|
10
10
|
export type ModuleSnapshot = ReadonlyMap<string, FileSnapshot>;
|
|
11
|
+
type ModuleLinksState = {
|
|
12
|
+
acceptedDependencies: ReadonlySet<string>;
|
|
13
|
+
dependencies: ReadonlySet<string>;
|
|
14
|
+
};
|
|
11
15
|
type ModuleRecordState<transformed, resolved, emitted> = {
|
|
16
|
+
emittedVersion?: number;
|
|
17
|
+
hmrUpdateTimestamp?: number;
|
|
12
18
|
identityPath: string;
|
|
13
19
|
invalidationVersion: number;
|
|
14
20
|
transformed?: transformed;
|
|
21
|
+
transformedVersion?: number;
|
|
15
22
|
resolved?: resolved;
|
|
23
|
+
resolvedVersion?: number;
|
|
24
|
+
lastResolved?: resolved;
|
|
25
|
+
links: ModuleLinksState;
|
|
16
26
|
emitted?: emitted;
|
|
17
27
|
emittedSnapshot?: ModuleSnapshot;
|
|
18
28
|
staleEmitted?: emitted;
|
|
@@ -23,6 +33,14 @@ type ModuleRecordState<transformed, resolved, emitted> = {
|
|
|
23
33
|
export type ModuleRecord<transformed, resolved, emitted> = Readonly<ModuleRecordState<transformed, resolved, emitted>>;
|
|
24
34
|
export type ModuleStore<transformed, resolved, emitted> = {
|
|
25
35
|
get(identityPath: string): ModuleRecord<transformed, resolved, emitted>;
|
|
36
|
+
getAcceptedImporters(identityPath: string): ReadonlySet<string>;
|
|
37
|
+
getHmrUpdateTimestamp(identityPath: string): number | undefined;
|
|
38
|
+
getImporters(identityPath: string): ReadonlySet<string>;
|
|
39
|
+
getLastResolved(identityPath: string): resolved | undefined;
|
|
40
|
+
isEmittedFresh(record: ModuleRecord<transformed, resolved, emitted>): boolean;
|
|
41
|
+
isResolvedFresh(record: ModuleRecord<transformed, resolved, emitted>): boolean;
|
|
42
|
+
isTransformedFresh(record: ModuleRecord<transformed, resolved, emitted>): boolean;
|
|
43
|
+
setHmrUpdateTimestamp(identityPath: string, timestamp: number): void;
|
|
26
44
|
clearTransformed(identityPath: string, tracking: readonly ModuleTracking[]): void;
|
|
27
45
|
setTransformed(identityPath: string, transformed: transformed, tracking: readonly ModuleTracking[]): void;
|
|
28
46
|
setResolved(identityPath: string, resolved: resolved, tracking: readonly ModuleTracking[]): void;
|
|
@@ -32,10 +50,16 @@ export type ModuleStore<transformed, resolved, emitted> = {
|
|
|
32
50
|
invalidateAll(): void;
|
|
33
51
|
};
|
|
34
52
|
export declare function createModuleStore<transformed, resolved, emitted>(options?: {
|
|
53
|
+
getAcceptedDependencies?: (resolved: resolved) => readonly string[];
|
|
54
|
+
getDependencies?: (resolved: resolved) => readonly string[];
|
|
35
55
|
onWatchDirectoriesChange?: (delta: {
|
|
36
56
|
add: string[];
|
|
37
57
|
remove: string[];
|
|
38
58
|
}) => void;
|
|
59
|
+
onWatchFilesChange?: (delta: {
|
|
60
|
+
add: string[];
|
|
61
|
+
remove: string[];
|
|
62
|
+
}) => void;
|
|
39
63
|
}): ModuleStore<transformed, resolved, emitted>;
|
|
40
64
|
export {};
|
|
41
65
|
//# sourceMappingURL=module-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-store.d.ts","sourceRoot":"","sources":["../../src/lib/module-store.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;AAE9D,KAAK,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,IAAI;IACvD,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,oBAAoB,CAAC,EAAE,cAAc,CAAA;IACrC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,CACjE,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAClD,CAAA;
|
|
1
|
+
{"version":3,"file":"module-store.d.ts","sourceRoot":"","sources":["../../src/lib/module-store.ts"],"names":[],"mappings":"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"}
|