@remix-run/assets 0.6.0 → 0.7.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 +101 -13
- package/dist/assets.d.ts +2 -1
- package/dist/assets.d.ts.map +1 -1
- package/dist/lib/asset-server.d.ts +41 -19
- package/dist/lib/asset-server.d.ts.map +1 -1
- package/dist/lib/asset-server.js +98 -41
- package/dist/lib/compilation-error.d.ts +1 -1
- package/dist/lib/compilation-error.d.ts.map +1 -1
- package/dist/lib/files/compiler.d.ts +1 -1
- package/dist/lib/files/compiler.d.ts.map +1 -1
- package/dist/lib/files/compiler.js +26 -29
- package/dist/lib/files/config.d.ts +6 -0
- package/dist/lib/files/config.d.ts.map +1 -1
- package/dist/lib/files/config.js +9 -0
- package/dist/lib/fingerprint.d.ts +0 -4
- package/dist/lib/fingerprint.d.ts.map +1 -1
- package/dist/lib/fingerprint.js +0 -4
- package/dist/lib/hmr.d.ts +7 -0
- package/dist/lib/hmr.d.ts.map +1 -1
- package/dist/lib/hmr.js +198 -25
- package/dist/lib/routes.d.ts +1 -0
- package/dist/lib/routes.d.ts.map +1 -1
- package/dist/lib/routes.js +1 -1
- package/dist/lib/scripts/compiler.d.ts +8 -2
- package/dist/lib/scripts/compiler.d.ts.map +1 -1
- package/dist/lib/scripts/compiler.js +186 -36
- package/dist/lib/scripts/emit.d.ts +2 -1
- package/dist/lib/scripts/emit.d.ts.map +1 -1
- package/dist/lib/scripts/emit.js +25 -16
- package/dist/lib/scripts/resolve.d.ts +7 -1
- package/dist/lib/scripts/resolve.d.ts.map +1 -1
- package/dist/lib/scripts/resolve.js +110 -3
- package/dist/lib/scripts/specifiers.d.ts +2 -0
- package/dist/lib/scripts/specifiers.d.ts.map +1 -0
- package/dist/lib/scripts/specifiers.js +9 -0
- package/dist/lib/scripts/transform.d.ts +2 -3
- package/dist/lib/scripts/transform.d.ts.map +1 -1
- package/dist/lib/scripts/transform.js +2 -16
- package/dist/lib/styles/compiler.d.ts +0 -1
- package/dist/lib/styles/compiler.d.ts.map +1 -1
- package/dist/lib/styles/compiler.js +105 -25
- package/dist/lib/styles/emit.d.ts +2 -1
- package/dist/lib/styles/emit.d.ts.map +1 -1
- package/dist/lib/styles/emit.js +12 -10
- package/dist/lib/styles/resolve.d.ts +0 -1
- package/dist/lib/styles/resolve.d.ts.map +1 -1
- package/dist/lib/styles/resolve.js +0 -1
- package/dist/lib/styles/transform.d.ts +0 -2
- package/dist/lib/styles/transform.d.ts.map +1 -1
- package/dist/lib/styles/transform.js +0 -7
- package/dist/lib/virtual-store.d.ts +8 -0
- package/dist/lib/virtual-store.d.ts.map +1 -0
- package/dist/lib/virtual-store.js +100 -0
- package/package.json +6 -5
- package/src/assets.ts +7 -1
- package/src/lib/asset-server.ts +175 -73
- package/src/lib/compilation-error.ts +1 -0
- package/src/lib/files/compiler.ts +30 -40
- package/src/lib/files/config.ts +17 -0
- package/src/lib/fingerprint.ts +0 -9
- package/src/lib/hmr.ts +210 -26
- package/src/lib/routes.ts +1 -1
- package/src/lib/scripts/compiler.ts +238 -52
- package/src/lib/scripts/emit.ts +34 -19
- package/src/lib/scripts/resolve.ts +166 -4
- package/src/lib/scripts/specifiers.ts +11 -0
- package/src/lib/scripts/transform.ts +4 -23
- package/src/lib/styles/compiler.ts +137 -39
- package/src/lib/styles/emit.ts +18 -13
- package/src/lib/styles/resolve.ts +0 -2
- package/src/lib/styles/transform.ts +0 -10
- package/src/lib/virtual-store.ts +124 -0
package/dist/lib/asset-server.js
CHANGED
|
@@ -15,6 +15,7 @@ import { createResponseForStyle, createStyleCompiler, isStyleFilePath } from './
|
|
|
15
15
|
import { resolveScriptTarget, resolveStyleTarget } from './target.js';
|
|
16
16
|
import { createAssetServerWatcher } from './watch.js';
|
|
17
17
|
import { createAssetInspector } from './inspection.js';
|
|
18
|
+
import { getVirtualStoreMountConfigs } from './virtual-store.js';
|
|
18
19
|
const scriptExtensionSet = new Set(supportedScriptExtensions);
|
|
19
20
|
const defaultMounts = {
|
|
20
21
|
app: 'app',
|
|
@@ -32,7 +33,7 @@ export function getInternalWatchTargets(assetServer) {
|
|
|
32
33
|
* Create an asset server instance
|
|
33
34
|
*
|
|
34
35
|
* Compiles TypeScript/JavaScript scripts and CSS styles on demand with optional
|
|
35
|
-
*
|
|
36
|
+
* content-based URL fingerprinting, caching, and configurable directory mounts.
|
|
36
37
|
*
|
|
37
38
|
* @param options Server configuration
|
|
38
39
|
* @returns A {@link AssetServer} with `fetch()`, `getHref()`, and `getPreloads()` methods
|
|
@@ -82,8 +83,8 @@ export function createAssetServer(options) {
|
|
|
82
83
|
});
|
|
83
84
|
let sendHmrPayload = resolvedOptions.hmr ? createHmrPayloadSender() : null;
|
|
84
85
|
let hmrPathnames = getHmrPathnames(resolvedOptions.basePath);
|
|
86
|
+
let hmrDataKey = `remix/assets@1:${resolvedOptions.basePath}`;
|
|
85
87
|
let scriptCompiler = createScriptCompiler({
|
|
86
|
-
buildId: resolvedOptions.buildId,
|
|
87
88
|
define: resolvedOptions.define,
|
|
88
89
|
external: resolvedOptions.external,
|
|
89
90
|
fingerprintAssets: resolvedOptions.fingerprintAssets,
|
|
@@ -117,7 +118,6 @@ export function createAssetServer(options) {
|
|
|
117
118
|
watchMode: resolvedOptions.watchOptions !== null,
|
|
118
119
|
});
|
|
119
120
|
let styleCompiler = createStyleCompiler({
|
|
120
|
-
buildId: resolvedOptions.buildId,
|
|
121
121
|
fingerprintAssets: resolvedOptions.fingerprintAssets,
|
|
122
122
|
getServedFileUrl: (identityPath, options) => {
|
|
123
123
|
if (!fileCompiler) {
|
|
@@ -168,8 +168,8 @@ export function createAssetServer(options) {
|
|
|
168
168
|
});
|
|
169
169
|
if (resolvedOptions.files.extensions.length > 0) {
|
|
170
170
|
fileCompiler = createFileCompiler({
|
|
171
|
-
buildId: resolvedOptions.buildId,
|
|
172
171
|
cache: resolvedOptions.files.cache,
|
|
172
|
+
cacheKey: resolvedOptions.files.cacheKey,
|
|
173
173
|
extensions: resolvedOptions.files.extensions,
|
|
174
174
|
fingerprintAssets: resolvedOptions.fingerprintAssets,
|
|
175
175
|
globalTransforms: resolvedOptions.files.globalTransforms,
|
|
@@ -217,9 +217,9 @@ export function createAssetServer(options) {
|
|
|
217
217
|
for (let event of events) {
|
|
218
218
|
let normalizedFilePath = normalizeFilePath(event.filePath);
|
|
219
219
|
let scriptUpdates = await scriptCompiler.classifyHmrFileEvent(normalizedFilePath, event.event);
|
|
220
|
-
let scriptPayload =
|
|
220
|
+
let scriptPayload = await createScriptHmrPayloadWithImportMaps(scriptUpdates);
|
|
221
221
|
if (scriptPayload) {
|
|
222
|
-
browserHmrEvents.push(createBrowserHmrEvent(scriptPayload, getScriptHmrUpdateFiles(scriptUpdates)));
|
|
222
|
+
browserHmrEvents.push(createBrowserHmrEvent(scriptPayload, getScriptHmrUpdateFiles(scriptUpdates), hmrDataKey));
|
|
223
223
|
}
|
|
224
224
|
let styleUpdates = await styleCompiler.classifyHmrFileEvent(normalizedFilePath, event.event);
|
|
225
225
|
for (let styleUpdate of styleUpdates) {
|
|
@@ -232,11 +232,34 @@ export function createAssetServer(options) {
|
|
|
232
232
|
type: 'css',
|
|
233
233
|
},
|
|
234
234
|
],
|
|
235
|
-
}, [styleUpdate.filePath]));
|
|
235
|
+
}, [styleUpdate.filePath], hmrDataKey));
|
|
236
236
|
}
|
|
237
237
|
await fileCompiler?.handleFileEvent(normalizedFilePath, event.event);
|
|
238
238
|
}
|
|
239
239
|
return browserHmrEvents;
|
|
240
|
+
async function createScriptHmrPayloadWithImportMaps(updates) {
|
|
241
|
+
let payload = createScriptHmrPayload(updates);
|
|
242
|
+
if (!payload || payload.type === 'browser:reload')
|
|
243
|
+
return payload;
|
|
244
|
+
let acceptedUpdates = updates.filter((update) => update.accepted);
|
|
245
|
+
let importMaps = await Promise.all(acceptedUpdates.map(async (update) => {
|
|
246
|
+
try {
|
|
247
|
+
return await scriptCompiler.getImportMap(update.acceptedFilePath);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
if (!isAssetServerCompilationError(error))
|
|
251
|
+
throw error;
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
}));
|
|
255
|
+
return {
|
|
256
|
+
...payload,
|
|
257
|
+
updates: payload.updates.map((update, index) => ({
|
|
258
|
+
...update,
|
|
259
|
+
...(importMaps[index] ? { importMap: importMaps[index] } : null),
|
|
260
|
+
})),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
240
263
|
}
|
|
241
264
|
function updateBrowserHmrWatchedFiles(delta) {
|
|
242
265
|
browserHmrChannelPromise
|
|
@@ -262,7 +285,7 @@ export function createAssetServer(options) {
|
|
|
262
285
|
if (requestPathname === hmrPathnames.client) {
|
|
263
286
|
let browserHmrChannel = await browserHmrChannelPromise;
|
|
264
287
|
assertBrowserEventUrl(browserHmrChannel?.url);
|
|
265
|
-
return createHmrClientResponse(browserHmrChannel.url, request.method);
|
|
288
|
+
return await createHmrClientResponse(browserHmrChannel.url, hmrDataKey, resolvedOptions.hmrModuleImporter, request.method, scriptCompiler);
|
|
266
289
|
}
|
|
267
290
|
}
|
|
268
291
|
let requestUrl = new URL(request.url);
|
|
@@ -292,7 +315,10 @@ export function createAssetServer(options) {
|
|
|
292
315
|
}
|
|
293
316
|
let compiledStyle = styleResult.style;
|
|
294
317
|
if (parsedRequestPathname.requestedFingerprint !== null) {
|
|
295
|
-
|
|
318
|
+
let fingerprint = parsedRequestPathname.isSourceMapRequest
|
|
319
|
+
? compiledStyle.sourceMap?.fingerprint
|
|
320
|
+
: compiledStyle.fingerprint;
|
|
321
|
+
if (fingerprint !== parsedRequestPathname.requestedFingerprint)
|
|
296
322
|
return null;
|
|
297
323
|
}
|
|
298
324
|
return createResponseForStyle(compiledStyle, {
|
|
@@ -347,7 +373,10 @@ export function createAssetServer(options) {
|
|
|
347
373
|
}
|
|
348
374
|
let compiledScript = scriptResult.script;
|
|
349
375
|
if (parsedRequestPathname.requestedFingerprint !== null) {
|
|
350
|
-
|
|
376
|
+
let fingerprint = parsedRequestPathname.isSourceMapRequest
|
|
377
|
+
? compiledScript.sourceMap?.fingerprint
|
|
378
|
+
: compiledScript.fingerprint;
|
|
379
|
+
if (fingerprint !== parsedRequestPathname.requestedFingerprint)
|
|
351
380
|
return null;
|
|
352
381
|
}
|
|
353
382
|
return createResponseForScript(compiledScript, {
|
|
@@ -398,6 +427,14 @@ export function createAssetServer(options) {
|
|
|
398
427
|
}
|
|
399
428
|
return scriptCompiler.getHref(filePath);
|
|
400
429
|
},
|
|
430
|
+
async getScriptEntry(filePath) {
|
|
431
|
+
let [href, preloads, importMap] = await Promise.all([
|
|
432
|
+
assetServer.getHref(filePath),
|
|
433
|
+
assetServer.getPreloads(filePath),
|
|
434
|
+
assetServer.getImportMap(filePath),
|
|
435
|
+
]);
|
|
436
|
+
return { href, preloads, importMap };
|
|
437
|
+
},
|
|
401
438
|
async getPreloads(filePath) {
|
|
402
439
|
let filePaths = Array.isArray(filePath) ? filePath : [filePath];
|
|
403
440
|
let fileAssetFiles = [];
|
|
@@ -452,6 +489,16 @@ export function createAssetServer(options) {
|
|
|
452
489
|
});
|
|
453
490
|
return mergePreloadLayers(await Promise.all(preloadLayerGroupPromises));
|
|
454
491
|
},
|
|
492
|
+
async getImportMap(filePath) {
|
|
493
|
+
let filePaths = Array.isArray(filePath) ? filePath : [filePath];
|
|
494
|
+
for (let nextFilePath of filePaths) {
|
|
495
|
+
let typeCheckFilePath = stripFilePathUrlSuffix(nextFilePath);
|
|
496
|
+
if (!isScriptFilePath(typeCheckFilePath)) {
|
|
497
|
+
throw new TypeError(`assetServer.getImportMap() only supports script files: ${nextFilePath}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return scriptCompiler.getImportMap(filePath);
|
|
501
|
+
},
|
|
455
502
|
async close() {
|
|
456
503
|
if (closed)
|
|
457
504
|
return;
|
|
@@ -508,8 +555,13 @@ function getHmrPathnames(basePath) {
|
|
|
508
555
|
events: `${hmrBase}/events`,
|
|
509
556
|
};
|
|
510
557
|
}
|
|
511
|
-
function createHmrClientResponse(eventPathname, method) {
|
|
512
|
-
|
|
558
|
+
async function createHmrClientResponse(eventPathname, dataKey, moduleImporter, method, scriptCompiler) {
|
|
559
|
+
let moduleImporterHref = moduleImporter
|
|
560
|
+
? await scriptCompiler.resolveSpecifierFromRoot(moduleImporter)
|
|
561
|
+
: null;
|
|
562
|
+
return new Response(method === 'HEAD'
|
|
563
|
+
? null
|
|
564
|
+
: createHmrClientSource({ dataKey, eventPathname, moduleImporter: moduleImporterHref }), {
|
|
513
565
|
headers: {
|
|
514
566
|
'Cache-Control': 'no-cache',
|
|
515
567
|
'Content-Type': 'application/javascript; charset=utf-8',
|
|
@@ -524,7 +576,7 @@ function assertBrowserEventUrl(url) {
|
|
|
524
576
|
function createHmrPayloadSender() {
|
|
525
577
|
return () => { };
|
|
526
578
|
}
|
|
527
|
-
function createBrowserHmrEvent(payload, files) {
|
|
579
|
+
function createBrowserHmrEvent(payload, files, dataKey) {
|
|
528
580
|
if (payload.type === 'browser:reload') {
|
|
529
581
|
return {
|
|
530
582
|
...(files.length === 0 ? {} : { files: [...files] }),
|
|
@@ -532,10 +584,14 @@ function createBrowserHmrEvent(payload, files) {
|
|
|
532
584
|
};
|
|
533
585
|
}
|
|
534
586
|
return {
|
|
587
|
+
data: {
|
|
588
|
+
[dataKey]: {
|
|
589
|
+
timestamp: payload.timestamp,
|
|
590
|
+
updates: payload.updates,
|
|
591
|
+
},
|
|
592
|
+
},
|
|
535
593
|
...(files.length === 0 ? {} : { files: [...files] }),
|
|
536
|
-
timestamp: payload.timestamp,
|
|
537
594
|
type: 'update',
|
|
538
|
-
updates: payload.updates,
|
|
539
595
|
};
|
|
540
596
|
}
|
|
541
597
|
function getScriptHmrUpdateFiles(updates) {
|
|
@@ -556,7 +612,9 @@ export function createScriptHmrPayload(updates) {
|
|
|
556
612
|
timestamp,
|
|
557
613
|
type: 'browser:update',
|
|
558
614
|
updates: acceptedUpdates.map((update) => ({
|
|
559
|
-
...(update.
|
|
615
|
+
...(update.acceptedUrlPathname === update.path
|
|
616
|
+
? {}
|
|
617
|
+
: { acceptedPath: update.acceptedUrlPathname }),
|
|
560
618
|
path: update.path,
|
|
561
619
|
type: 'js',
|
|
562
620
|
})),
|
|
@@ -603,14 +661,14 @@ function resolveAssetServerOptions(options) {
|
|
|
603
661
|
let rootDir = normalizeFilePath(fs.realpathSync(path.resolve(options.rootDir ?? process.cwd())));
|
|
604
662
|
let basePath = normalizeBasePath(options.basePath);
|
|
605
663
|
let scriptOptions = options.scripts ?? {};
|
|
606
|
-
let
|
|
664
|
+
let fingerprintAssets = normalizeFingerprintOptions({
|
|
607
665
|
fingerprint: options.fingerprint,
|
|
608
666
|
watch: options.watch,
|
|
609
667
|
});
|
|
610
668
|
let watchOptions = normalizeWatchOptions(options.watch);
|
|
611
|
-
let
|
|
669
|
+
let hmr = normalizeHmrOptions(options.hmr);
|
|
612
670
|
let mounts = options.mounts ?? defaultMounts;
|
|
613
|
-
if (
|
|
671
|
+
if (hmr.channel && watchOptions === null) {
|
|
614
672
|
throw new TypeError('hmr requires watch mode');
|
|
615
673
|
}
|
|
616
674
|
if (Object.keys(mounts).length === 0) {
|
|
@@ -620,13 +678,13 @@ function resolveAssetServerOptions(options) {
|
|
|
620
678
|
allowFiles: options.allowFiles,
|
|
621
679
|
allowPackages: options.allowPackages,
|
|
622
680
|
basePath,
|
|
623
|
-
buildId: fingerprintOptions.buildId,
|
|
624
681
|
define: scriptOptions.define,
|
|
625
682
|
denyFiles: options.denyFiles,
|
|
626
683
|
external: scriptOptions.external ?? [],
|
|
627
684
|
files: normalizeFilesOptions(options.files),
|
|
628
|
-
fingerprintAssets
|
|
629
|
-
hmr:
|
|
685
|
+
fingerprintAssets,
|
|
686
|
+
hmr: hmr.channel,
|
|
687
|
+
hmrModuleImporter: hmr.moduleImporter,
|
|
630
688
|
minify: options.minify ?? false,
|
|
631
689
|
mounts,
|
|
632
690
|
loaders: scriptOptions.loaders ?? [],
|
|
@@ -638,6 +696,7 @@ function resolveAssetServerOptions(options) {
|
|
|
638
696
|
rootDir,
|
|
639
697
|
},
|
|
640
698
|
...getInjectedPackageMountConfigs(),
|
|
699
|
+
...getVirtualStoreMountConfigs({ mounts, rootDir }),
|
|
641
700
|
]),
|
|
642
701
|
sourceMapSourcePaths: options.sourceMapSourcePaths ?? 'url',
|
|
643
702
|
sourceMaps: options.sourceMaps,
|
|
@@ -646,13 +705,19 @@ function resolveAssetServerOptions(options) {
|
|
|
646
705
|
watchOptions,
|
|
647
706
|
};
|
|
648
707
|
}
|
|
649
|
-
function
|
|
650
|
-
if (
|
|
651
|
-
return null;
|
|
652
|
-
if (typeof
|
|
653
|
-
|
|
708
|
+
function normalizeHmrOptions(options) {
|
|
709
|
+
if (options === undefined)
|
|
710
|
+
return { channel: null, moduleImporter: null };
|
|
711
|
+
if (typeof options === 'function')
|
|
712
|
+
return { channel: options, moduleImporter: null };
|
|
713
|
+
if (!options || typeof options !== 'object' || typeof options.channel !== 'function') {
|
|
714
|
+
throw new TypeError('hmr must be a function or an object with a channel function');
|
|
715
|
+
}
|
|
716
|
+
if (options.moduleImporter !== undefined &&
|
|
717
|
+
(typeof options.moduleImporter !== 'string' || options.moduleImporter.trim().length === 0)) {
|
|
718
|
+
throw new TypeError('hmr.moduleImporter must be a non-empty string');
|
|
654
719
|
}
|
|
655
|
-
return
|
|
720
|
+
return { channel: options.channel, moduleImporter: options.moduleImporter ?? null };
|
|
656
721
|
}
|
|
657
722
|
function createBrowserHmrChannel(createChannel, handleFileEvents, isClosed, setUnsubscribe) {
|
|
658
723
|
if (!createChannel)
|
|
@@ -700,24 +765,16 @@ function normalizeBasePath(basePath) {
|
|
|
700
765
|
return normalizePathname(basePath || '/').replace(/\/+$/, '') || '/';
|
|
701
766
|
}
|
|
702
767
|
function normalizeFingerprintOptions(options) {
|
|
703
|
-
if (
|
|
704
|
-
|
|
705
|
-
enabled: false,
|
|
706
|
-
};
|
|
707
|
-
}
|
|
708
|
-
if (typeof options.fingerprint.buildId !== 'string') {
|
|
709
|
-
throw new TypeError('fingerprint.buildId must be a string');
|
|
768
|
+
if (options.fingerprint !== undefined && typeof options.fingerprint !== 'boolean') {
|
|
769
|
+
throw new TypeError('fingerprint must be a boolean');
|
|
710
770
|
}
|
|
711
|
-
if (options.fingerprint
|
|
712
|
-
|
|
771
|
+
if (!options.fingerprint) {
|
|
772
|
+
return false;
|
|
713
773
|
}
|
|
714
774
|
if (options.watch !== false) {
|
|
715
775
|
throw new TypeError('fingerprint cannot be used with watch mode');
|
|
716
776
|
}
|
|
717
|
-
return
|
|
718
|
-
enabled: true,
|
|
719
|
-
buildId: options.fingerprint.buildId,
|
|
720
|
-
};
|
|
777
|
+
return true;
|
|
721
778
|
}
|
|
722
779
|
function normalizeWatchOptions(options) {
|
|
723
780
|
if (options === false)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type AssetServerCompilationErrorCode = 'FILE_NOT_FOUND' | 'FILE_NOT_ALLOWED' | 'FILE_NOT_SUPPORTED' | 'FILE_OUTSIDE_MOUNTS' | 'FILE_TRANSFORM_QUERY_INVALID' | 'FILE_TRANSFORM_NOT_SUPPORTED' | 'FILE_TRANSFORM_RESULT_INVALID' | 'FILE_TRANSFORM_FAILED' | 'COMMONJS_NOT_SUPPORTED' | 'TRANSFORM_FAILED' | 'LOADER_FAILED' | 'EMIT_FAILED' | 'IMPORT_RESOLUTION_FAILED' | 'IMPORT_NOT_SUPPORTED' | 'IMPORT_NOT_ALLOWED' | 'IMPORT_OUTSIDE_MOUNTS' | 'URL_RESOLUTION_FAILED' | 'URL_NOT_SUPPORTED' | 'URL_NOT_ALLOWED' | 'URL_OUTSIDE_MOUNTS';
|
|
1
|
+
type AssetServerCompilationErrorCode = 'FILE_NOT_FOUND' | 'FILE_NOT_ALLOWED' | 'FILE_NOT_SUPPORTED' | 'FILE_OUTSIDE_MOUNTS' | 'FILE_TRANSFORM_QUERY_INVALID' | 'FILE_TRANSFORM_NOT_SUPPORTED' | 'FILE_TRANSFORM_RESULT_INVALID' | 'FILE_TRANSFORM_FAILED' | 'COMMONJS_NOT_SUPPORTED' | 'TRANSFORM_FAILED' | 'LOADER_FAILED' | 'EMIT_FAILED' | 'IMPORT_RESOLUTION_FAILED' | 'IMPORT_NOT_SUPPORTED' | 'IMPORT_NOT_ALLOWED' | 'IMPORT_OUTSIDE_MOUNTS' | 'IMPORT_RESOLUTION_NOT_DIRECTORY_UNIFORM' | 'URL_RESOLUTION_FAILED' | 'URL_NOT_SUPPORTED' | 'URL_NOT_ALLOWED' | 'URL_OUTSIDE_MOUNTS';
|
|
2
2
|
/**
|
|
3
3
|
* Internal error used by the request-time asset compilation pipeline.
|
|
4
4
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compilation-error.d.ts","sourceRoot":"","sources":["../../src/lib/compilation-error.ts"],"names":[],"mappings":"AAAA,KAAK,+BAA+B,GAChC,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,GACrB,8BAA8B,GAC9B,8BAA8B,GAC9B,+BAA+B,GAC/B,uBAAuB,GACvB,wBAAwB,GACxB,kBAAkB,GAClB,eAAe,GACf,aAAa,GACb,0BAA0B,GAC1B,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,CAAA;AAExB;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,IAAI,EAAE,+BAA+B,CAAA;IAErC,YACE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,IAAI,EAAE,+BAA+B,CAAA;KACtC,EAKF;CACF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,2BAA2B,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,+BAA+B,CAAA;CACtC,GACA,2BAA2B,CAE7B"}
|
|
1
|
+
{"version":3,"file":"compilation-error.d.ts","sourceRoot":"","sources":["../../src/lib/compilation-error.ts"],"names":[],"mappings":"AAAA,KAAK,+BAA+B,GAChC,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,GACrB,8BAA8B,GAC9B,8BAA8B,GAC9B,+BAA+B,GAC/B,uBAAuB,GACvB,wBAAwB,GACxB,kBAAkB,GAClB,eAAe,GACf,aAAa,GACb,0BAA0B,GAC1B,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,yCAAyC,GACzC,uBAAuB,GACvB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,CAAA;AAExB;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,IAAI,EAAE,+BAA+B,CAAA;IAErC,YACE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,IAAI,EAAE,+BAA+B,CAAA;KACtC,EAKF;CACF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,2BAA2B,CAEtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,+BAA+B,CAAA;CACtC,GACA,2BAA2B,CAE7B"}
|
|
@@ -25,8 +25,8 @@ type FileGetHrefOptions = {
|
|
|
25
25
|
transform: readonly string[] | null;
|
|
26
26
|
};
|
|
27
27
|
type FileCompilerOptions = {
|
|
28
|
-
buildId?: string;
|
|
29
28
|
cache?: FileStorage;
|
|
29
|
+
cacheKey?: string;
|
|
30
30
|
extensions: readonly string[];
|
|
31
31
|
fingerprintAssets: boolean;
|
|
32
32
|
globalTransforms: readonly {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/lib/files/compiler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAU1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAA;AAU7F,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B,CAAA;AAID,KAAK,iBAAiB,GAAG,WAAW,CAAA;AAEpC,KAAK,aAAa,GACd;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;CACrB,GACD;IACE,IAAI,EAAE,iBAAiB,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAEL,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CACpC,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB,
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/lib/files/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
import { IfNoneMatch } from '@remix-run/headers/if-none-match';
|
|
6
6
|
import { detectContentType } from '@remix-run/mime';
|
|
7
7
|
import { createAssetServerCompilationError, isAssetServerCompilationError, } from '../compilation-error.js';
|
|
8
|
-
import { formatFingerprintedPathname,
|
|
8
|
+
import { formatFingerprintedPathname, hashContent } from '../fingerprint.js';
|
|
9
9
|
import { normalizeFilePath, resolveFilePath } from '../paths.js';
|
|
10
10
|
import { parseAssetTransformInvocations } from './config.js';
|
|
11
11
|
import { createSourceFileStore } from './store.js';
|
|
@@ -19,7 +19,7 @@ export function createFileCompiler(options) {
|
|
|
19
19
|
let transformedAssetMetadataByCacheKey = new Map();
|
|
20
20
|
let transformedCacheKeysByIdentityPath = new Map();
|
|
21
21
|
let transformedEmitInFlightByCacheKey = new Map();
|
|
22
|
-
let
|
|
22
|
+
let cacheKey = resolvedOptions.cacheKey ?? crypto.randomUUID();
|
|
23
23
|
let resolveArgs = {
|
|
24
24
|
extensions: resolvedOptions.extensionSet,
|
|
25
25
|
isAllowed: resolvedOptions.isAllowed,
|
|
@@ -30,8 +30,8 @@ export function createFileCompiler(options) {
|
|
|
30
30
|
let resolvedFile = resolveServedFileOrThrow(resolveInputFilePath(filePath), resolveArgs);
|
|
31
31
|
let record = getFreshSourceFileRecord(resolvedFile.identityPath);
|
|
32
32
|
if (shouldUseTransformPipeline(getOptions.transform)) {
|
|
33
|
-
let
|
|
34
|
-
let notModified = getNotModifiedFile(transformedAssetMetadataByCacheKey.get(
|
|
33
|
+
let transformedCacheKey = getTransformedRecordCacheKey(cacheKey, record, getOptions.transform);
|
|
34
|
+
let notModified = getNotModifiedFile(transformedAssetMetadataByCacheKey.get(transformedCacheKey), getOptions);
|
|
35
35
|
if (notModified)
|
|
36
36
|
return notModified;
|
|
37
37
|
let transformedFile = await getOrCreateTransformedFile(record, getOptions.transform);
|
|
@@ -62,9 +62,13 @@ export function createFileCompiler(options) {
|
|
|
62
62
|
async getHref(filePath, hrefOptions) {
|
|
63
63
|
let resolvedFile = resolveServedFileOrThrow(resolveInputFilePath(filePath), resolveArgs);
|
|
64
64
|
let record = getFreshSourceFileRecord(resolvedFile.identityPath);
|
|
65
|
-
let href =
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
let href = resolvedFile.stableUrlPathname;
|
|
66
|
+
if (resolvedOptions.fingerprintAssets) {
|
|
67
|
+
let emittedFile = shouldUseTransformPipeline(hrefOptions.transform)
|
|
68
|
+
? await getOrCreateTransformedFile(record, hrefOptions.transform)
|
|
69
|
+
: await getOrCreateSourceFile(record);
|
|
70
|
+
href = formatFingerprintedPathname(href, emittedFile.fingerprint);
|
|
71
|
+
}
|
|
68
72
|
if (shouldUseTransformPipeline(hrefOptions.transform)) {
|
|
69
73
|
return appendTransformQuery(href, hrefOptions.transform);
|
|
70
74
|
}
|
|
@@ -138,15 +142,15 @@ export function createFileCompiler(options) {
|
|
|
138
142
|
}
|
|
139
143
|
async function getOrCreateTransformedFile(record, transformQuery) {
|
|
140
144
|
let parsedTransforms = parseRequestTransforms(transformQuery, resolvedOptions.transforms, resolvedOptions.maxRequestTransforms);
|
|
141
|
-
let
|
|
142
|
-
let existing = transformedEmitInFlightByCacheKey.get(
|
|
145
|
+
let transformedCacheKey = getTransformedRecordCacheKey(cacheKey, record, transformQuery);
|
|
146
|
+
let existing = transformedEmitInFlightByCacheKey.get(transformedCacheKey);
|
|
143
147
|
if (existing)
|
|
144
148
|
return existing;
|
|
145
149
|
let promise = (async () => {
|
|
146
|
-
let
|
|
147
|
-
let cachedFile = await getCachedTransformedFile(cacheKey, record.identityPath, sourceFile.fingerprint);
|
|
150
|
+
let cachedFile = await getCachedTransformedFile(transformedCacheKey, record.identityPath);
|
|
148
151
|
if (cachedFile)
|
|
149
152
|
return cachedFile;
|
|
153
|
+
let sourceFile = await getOrCreateSourceFile(record);
|
|
150
154
|
let transformedFile = await applyTransforms(record.identityPath, sourceFile, parsedTransforms);
|
|
151
155
|
if (transformedFile === null) {
|
|
152
156
|
return sourceFile;
|
|
@@ -154,19 +158,18 @@ export function createFileCompiler(options) {
|
|
|
154
158
|
let emittedFile = await createEmittedFile(transformedFile.body, {
|
|
155
159
|
extension: transformedFile.extension,
|
|
156
160
|
filePath: record.identityPath,
|
|
157
|
-
fingerprint: sourceFile.fingerprint,
|
|
158
161
|
});
|
|
159
|
-
rememberTransformedAssetMetadata(
|
|
160
|
-
await setCachedTransformedFile(
|
|
162
|
+
rememberTransformedAssetMetadata(transformedCacheKey, record.identityPath, toEmittedFileMetadata(emittedFile));
|
|
163
|
+
await setCachedTransformedFile(transformedCacheKey, record.identityPath, emittedFile);
|
|
161
164
|
return emittedFile;
|
|
162
165
|
})();
|
|
163
|
-
transformedEmitInFlightByCacheKey.set(
|
|
166
|
+
transformedEmitInFlightByCacheKey.set(transformedCacheKey, promise);
|
|
164
167
|
try {
|
|
165
168
|
return await promise;
|
|
166
169
|
}
|
|
167
170
|
finally {
|
|
168
|
-
if (transformedEmitInFlightByCacheKey.get(
|
|
169
|
-
transformedEmitInFlightByCacheKey.delete(
|
|
171
|
+
if (transformedEmitInFlightByCacheKey.get(transformedCacheKey) === promise) {
|
|
172
|
+
transformedEmitInFlightByCacheKey.delete(transformedCacheKey);
|
|
170
173
|
}
|
|
171
174
|
}
|
|
172
175
|
}
|
|
@@ -174,12 +177,6 @@ export function createFileCompiler(options) {
|
|
|
174
177
|
return createEmittedFile(body, {
|
|
175
178
|
extension: path.extname(identityPath).toLowerCase(),
|
|
176
179
|
filePath: identityPath,
|
|
177
|
-
fingerprint: resolvedOptions.fingerprintAssets && resolvedOptions.buildId
|
|
178
|
-
? await generateFingerprint({
|
|
179
|
-
buildId: resolvedOptions.buildId,
|
|
180
|
-
content: body,
|
|
181
|
-
})
|
|
182
|
-
: null,
|
|
183
180
|
});
|
|
184
181
|
}
|
|
185
182
|
function createEmittedFileFromMetadata(body, metadata) {
|
|
@@ -253,7 +250,7 @@ export function createFileCompiler(options) {
|
|
|
253
250
|
return null;
|
|
254
251
|
return { body: currentBody, extension: currentExtension };
|
|
255
252
|
}
|
|
256
|
-
async function getCachedTransformedFile(cacheKey, identityPath
|
|
253
|
+
async function getCachedTransformedFile(cacheKey, identityPath) {
|
|
257
254
|
if (!resolvedOptions.cache)
|
|
258
255
|
return null;
|
|
259
256
|
let file = await resolvedOptions.cache.get(cacheKey);
|
|
@@ -264,7 +261,6 @@ export function createFileCompiler(options) {
|
|
|
264
261
|
(await createEmittedFileMetadata(body, {
|
|
265
262
|
extension: path.extname(file.name).toLowerCase(),
|
|
266
263
|
filePath: identityPath,
|
|
267
|
-
fingerprint,
|
|
268
264
|
}));
|
|
269
265
|
rememberTransformedAssetMetadata(cacheKey, identityPath, metadata);
|
|
270
266
|
return {
|
|
@@ -303,14 +299,15 @@ export function createFileCompiler(options) {
|
|
|
303
299
|
transformedCacheKeysByIdentityPath.set(identityPath, cacheKeys);
|
|
304
300
|
}
|
|
305
301
|
async function createEmittedFileMetadata(body, options) {
|
|
302
|
+
let contentHash = await hashContent(body);
|
|
306
303
|
let contentType = detectContentType(`file${options.extension}`) ??
|
|
307
304
|
detectContentType(options.filePath) ??
|
|
308
305
|
'application/octet-stream';
|
|
309
306
|
return {
|
|
310
307
|
contentType,
|
|
311
|
-
etag: `W/"${
|
|
308
|
+
etag: `W/"${contentHash}"`,
|
|
312
309
|
extension: options.extension,
|
|
313
|
-
fingerprint:
|
|
310
|
+
fingerprint: resolvedOptions.fingerprintAssets ? contentHash : null,
|
|
314
311
|
};
|
|
315
312
|
}
|
|
316
313
|
}
|
|
@@ -361,9 +358,9 @@ export function isServedFilePath(filePath, extensions) {
|
|
|
361
358
|
function getRecordCacheKey(record) {
|
|
362
359
|
return `${record.identityPath}\0${record.invalidationVersion}`;
|
|
363
360
|
}
|
|
364
|
-
function getTransformedRecordCacheKey(
|
|
361
|
+
function getTransformedRecordCacheKey(cacheKey, record, transformQuery) {
|
|
365
362
|
return [
|
|
366
|
-
encodeCacheKeyPart(
|
|
363
|
+
encodeCacheKeyPart(cacheKey),
|
|
367
364
|
encodeCacheKeyPart(record.identityPath),
|
|
368
365
|
String(record.invalidationVersion),
|
|
369
366
|
encodeCacheKeyPart(JSON.stringify(transformQuery ?? [])),
|
|
@@ -73,9 +73,15 @@ export interface AssetServerFilesOptions<transforms extends AssetRequestTransfor
|
|
|
73
73
|
* Optional backing store for cached transformed file outputs.
|
|
74
74
|
*/
|
|
75
75
|
cache?: FileStorage;
|
|
76
|
+
/**
|
|
77
|
+
* Optional namespace for cached transformed file outputs. Use a stable value such as a
|
|
78
|
+
* commit SHA to reuse transformed files across server restarts for the same deployment.
|
|
79
|
+
*/
|
|
80
|
+
cacheKey?: string;
|
|
76
81
|
}
|
|
77
82
|
export interface ResolvedAssetServerFilesOptions {
|
|
78
83
|
cache?: FileStorage;
|
|
84
|
+
cacheKey?: string;
|
|
79
85
|
extensions: readonly string[];
|
|
80
86
|
globalTransforms: readonly ResolvedAssetGlobalTransform[];
|
|
81
87
|
hasTransforms: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/files/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/files/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/files/config.js
CHANGED
|
@@ -96,8 +96,17 @@ export function normalizeFilesOptions(files) {
|
|
|
96
96
|
throw new TypeError('files.cache must implement the FileStorage interface');
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
+
if (files.cacheKey !== undefined) {
|
|
100
|
+
if (typeof files.cacheKey !== 'string') {
|
|
101
|
+
throw new TypeError('files.cacheKey must be a string');
|
|
102
|
+
}
|
|
103
|
+
if (files.cacheKey.length === 0) {
|
|
104
|
+
throw new TypeError('files.cacheKey must be a non-empty string');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
99
107
|
return {
|
|
100
108
|
cache: files.cache,
|
|
109
|
+
cacheKey: files.cacheKey,
|
|
101
110
|
extensions: normalizedExtensions,
|
|
102
111
|
globalTransforms: normalizedGlobalTransforms,
|
|
103
112
|
hasTransforms: normalizedTransforms.size > 0 || normalizedGlobalTransforms.length > 0,
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
export declare function hashContent(content: string | Uint8Array<ArrayBufferLike>): Promise<string>;
|
|
2
|
-
export declare function generateFingerprint(args: {
|
|
3
|
-
buildId: string;
|
|
4
|
-
content: string | Uint8Array<ArrayBufferLike>;
|
|
5
|
-
}): Promise<string>;
|
|
6
2
|
export declare function parseFingerprintSuffix(pathname: string): {
|
|
7
3
|
pathname: string;
|
|
8
4
|
requestedFingerprint: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhG;AAED,
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CACpC,CAyBA;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAahG;AAED,wBAAgB,iCAAiC,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7F"}
|
package/dist/lib/fingerprint.js
CHANGED
|
@@ -5,10 +5,6 @@ export async function hashContent(content) {
|
|
|
5
5
|
let hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
|
|
6
6
|
return Buffer.from(hashBuffer).toString('base64url').slice(0, 6);
|
|
7
7
|
}
|
|
8
|
-
export async function generateFingerprint(args) {
|
|
9
|
-
let content = typeof args.content === 'string' ? args.content : Buffer.from(args.content).toString('base64');
|
|
10
|
-
return hashContent(JSON.stringify([content, args.buildId]));
|
|
11
|
-
}
|
|
12
8
|
export function parseFingerprintSuffix(pathname) {
|
|
13
9
|
let lastSlashIndex = pathname.lastIndexOf('/');
|
|
14
10
|
let directory = lastSlashIndex >= 0 ? pathname.slice(0, lastSlashIndex + 1) : '';
|
package/dist/lib/hmr.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export type HmrPayload = {
|
|
|
13
13
|
updates: Array<{
|
|
14
14
|
/** Importing module whose dependency-accept handler accepts this update. */
|
|
15
15
|
acceptedPath?: string;
|
|
16
|
+
/** Import map entries required before this update can be evaluated. */
|
|
17
|
+
importMap?: {
|
|
18
|
+
imports: Record<string, string>;
|
|
19
|
+
scopes?: Record<string, Record<string, string>>;
|
|
20
|
+
};
|
|
16
21
|
/** Public URL of the changed JavaScript module. */
|
|
17
22
|
path: string;
|
|
18
23
|
/** Identifies a JavaScript module update. */
|
|
@@ -32,6 +37,8 @@ export type HmrPayload = {
|
|
|
32
37
|
type: 'browser:reload';
|
|
33
38
|
};
|
|
34
39
|
export declare function createHmrClientSource(options: {
|
|
40
|
+
dataKey: string;
|
|
35
41
|
eventPathname: string;
|
|
42
|
+
moduleImporter: string | null;
|
|
36
43
|
}): string;
|
|
37
44
|
//# sourceMappingURL=hmr.d.ts.map
|
package/dist/lib/hmr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/lib/hmr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAClB;IACE,8DAA8D;IAC9D,IAAI,EAAE,eAAe,CAAA;CACtB,GACD;IACE,iEAAiE;IACjE,OAAO,EAAE,KAAK,CACV;QACE,4EAA4E;QAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,mDAAmD;QACnD,IAAI,EAAE,MAAM,CAAA;QACZ,6CAA6C;QAC7C,IAAI,EAAE,IAAI,CAAA;KACX,GACD;QACE,4CAA4C;QAC5C,IAAI,EAAE,MAAM,CAAA;QACZ,sCAAsC;QACtC,IAAI,EAAE,KAAK,CAAA;KACZ,CACJ,CAAA;IACD,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,IAAI,EAAE,gBAAgB,CAAA;CACvB,GACD;IACE,mFAAmF;IACnF,IAAI,EAAE,gBAAgB,CAAA;CACvB,CAAA;AAEL,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/lib/hmr.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAClB;IACE,8DAA8D;IAC9D,IAAI,EAAE,eAAe,CAAA;CACtB,GACD;IACE,iEAAiE;IACjE,OAAO,EAAE,KAAK,CACV;QACE,4EAA4E;QAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,uEAAuE;QACvE,SAAS,CAAC,EAAE;YACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;SAChD,CAAA;QACD,mDAAmD;QACnD,IAAI,EAAE,MAAM,CAAA;QACZ,6CAA6C;QAC7C,IAAI,EAAE,IAAI,CAAA;KACX,GACD;QACE,4CAA4C;QAC5C,IAAI,EAAE,MAAM,CAAA;QACZ,sCAAsC;QACtC,IAAI,EAAE,KAAK,CAAA;KACZ,CACJ,CAAA;IACD,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,IAAI,EAAE,gBAAgB,CAAA;CACvB,GACD;IACE,mFAAmF;IACnF,IAAI,EAAE,gBAAgB,CAAA;CACvB,CAAA;AAEL,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,GAAG,MAAM,CAmhBT"}
|