Skip to content

Commit

Permalink
Simplify virtual content rendering
Browse files Browse the repository at this point in the history
This is followup to #2198.

Now that virtual responses are passed directly through the host build environment, we don't need to parse speciiers to get the parameters for virtual content rendering.
  • Loading branch information
ef4 committed Dec 19, 2024
1 parent 4070ba7 commit 10e48ba
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 13 deletions.
2 changes: 1 addition & 1 deletion packages/core/src/node-resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export class NodeRequestAdapter implements RequestAdapter<Resolution<NodeResolut
virtual,
result: {
type: 'virtual' as const,
content: virtualContent(virtual.specifier, this.resolver).src,
content: virtualContent(virtual, this.resolver).src,
filename: virtual.specifier,
},
};
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/virtual-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ export interface VirtualContentResult {
// this produces the corresponding contents. It's a static, stateless function
// because we recognize that that process that did resolution might not be the
// same one that loads the content.
export function virtualContent(filename: string, resolver: Resolver): VirtualContentResult {
export function virtualContent(response: VirtualResponse, resolver: Resolver): VirtualContentResult {
let filename = response.specifier;
let entrypoint = decodeEntrypoint(filename);
if (entrypoint) {
return renderEntrypoint(resolver, entrypoint);
Expand Down
2 changes: 1 addition & 1 deletion packages/vite/src/esbuild-request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export class EsBuildRequestAdapter implements RequestAdapter<Resolution<OnResolv
return {
type: 'found',
filename: virtual.specifier,
result: { path: virtual.specifier, namespace: 'embroider-virtual' },
result: { path: virtual.specifier, namespace: 'embroider-virtual', pluginData: { virtual } },
virtual,
};
}
Expand Down
16 changes: 13 additions & 3 deletions packages/vite/src/esbuild-resolver.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Plugin as EsBuildPlugin, OnLoadResult, PluginBuild, ResolveResult } from 'esbuild';
import { transformAsync } from '@babel/core';
import core, { ModuleRequest } from '@embroider/core';
import core, { ModuleRequest, type VirtualResponse } from '@embroider/core';
const { ResolverLoader, virtualContent, needsSyntheticComponentJS, isInComponents } = core;
import fs from 'fs-extra';
const { readFileSync } = fs;
Expand All @@ -25,12 +25,22 @@ export function esBuildResolver(): EsBuildPlugin {
return result.code!;
}

async function onLoad({ path, namespace }: { path: string; namespace: string }): Promise<OnLoadResult> {
async function onLoad({
path,
namespace,
pluginData,
}: {
path: string;
namespace: string;
pluginData?: { virtual: VirtualResponse };
}): Promise<OnLoadResult> {
let src: string;
if (namespace === 'embroider-template-only-component') {
src = templateOnlyComponent;
} else if (namespace === 'embroider-virtual') {
src = virtualContent(path, resolverLoader.resolver).src;
// castin because response in our namespace are supposed to always have
// this pluginData.
src = virtualContent(pluginData!.virtual, resolverLoader.resolver).src;
} else {
src = readFileSync(path, 'utf8');
}
Expand Down
14 changes: 9 additions & 5 deletions packages/vite/src/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export function resolver(): Plugin {
}
}

async function ensureResolve(context: PluginContext, specifier: string): Promise<string> {
async function ensureVirtualResolve(context: PluginContext, specifier: string): Promise<ResponseMeta> {
let result = await resolveId(
context,
specifier,
Expand All @@ -68,16 +68,20 @@ export function resolver(): Plugin {
throw new Error(`bug: expected to resolve ${specifier}`);
}
if (typeof result === 'string') {
return result;
throw new Error(`bug: expected to get a PartialResolvedId`);
}
return result.id;
let meta = result.meta?.['embroider-resolver'] as ResponseMeta | undefined;
if (!meta) {
throw new Error(`bug: no response meta for ${specifier}`);
}
return meta;
}

async function emitVirtualFile(context: PluginContext, fileName: string): Promise<void> {
context.emitFile({
type: 'asset',
fileName,
source: virtualContent(await ensureResolve(context, fileName), resolverLoader.resolver).src,
source: virtualContent((await ensureVirtualResolve(context, fileName)).virtual, resolverLoader.resolver).src,
});
}

Expand Down Expand Up @@ -137,7 +141,7 @@ export function resolver(): Plugin {
load(id) {
let meta = responseMetas.get(normalizePath(id));
if (meta?.virtual) {
let { src, watches } = virtualContent(cleanUrl(id), resolverLoader.resolver);
let { src, watches } = virtualContent(meta.virtual, resolverLoader.resolver);
virtualDeps.set(id, watches);
server?.watcher.add(watches);
return src;
Expand Down
6 changes: 4 additions & 2 deletions packages/webpack/src/virtual-loader.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ResolverLoader, virtualContent } from '@embroider/core';
import { ResolverLoader, virtualContent, type VirtualResponse } from '@embroider/core';
import type { LoaderContext } from 'webpack';

let resolverLoader: ResolverLoader | undefined;
Expand All @@ -20,7 +20,9 @@ export default function virtualLoader(this: LoaderContext<unknown>): string | un
}
let { resolver } = setup(appRoot);
this.resourcePath = filename;
return virtualContent(filename, resolver).src;
// @ts-expect-error unimplemented
let virtual: VirtualResponse = fixmeImplementVirtualResponse();
return virtualContent(virtual, resolver).src;
}
throw new Error(`@embroider/webpack/src/virtual-loader received unexpected request: ${this.query}`);
}

0 comments on commit 10e48ba

Please sign in to comment.