Skip to content

Commit 230dfb6

Browse files
refactor: prefer upstream locals.
1 parent b31384e commit 230dfb6

2 files changed

Lines changed: 58 additions & 6 deletions

File tree

packages/css/src/loaderBridge.ts

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,19 @@ const loader: LoaderDefinitionFunction<KnightedCssBridgeLoaderOptions> = functio
3434

3535
export const pitch: PitchLoaderDefinitionFunction<KnightedCssBridgeLoaderOptions> =
3636
function pitch(remainingRequest) {
37+
const resolvedRemainingRequest = resolveRemainingRequest(this, remainingRequest)
38+
3739
if (isJsLikeResource(this.resourcePath) && hasCombinedQuery(this.resourceQuery)) {
3840
const callback = this.async()
3941
if (!callback) {
40-
return createCombinedJsBridgeModuleSync(this, remainingRequest)
42+
return createCombinedJsBridgeModuleSync(this, resolvedRemainingRequest)
4143
}
4244
readResourceSource(this)
4345
.then(source => {
4446
const cssRequests = collectCssModuleRequests(source).map(request =>
4547
buildBridgeCssRequest(request),
4648
)
47-
const upstreamRequest = buildUpstreamRequest(remainingRequest)
49+
const upstreamRequest = buildUpstreamRequest(resolvedRemainingRequest)
4850
callback(
4951
null,
5052
createCombinedJsBridgeModule({
@@ -58,7 +60,7 @@ export const pitch: PitchLoaderDefinitionFunction<KnightedCssBridgeLoaderOptions
5860
return
5961
}
6062
const localsRequest = buildProxyRequest(this)
61-
const upstreamRequest = buildUpstreamRequest(remainingRequest)
63+
const upstreamRequest = buildUpstreamRequest(resolvedRemainingRequest)
6264
const { emitCssModules } = resolveLoaderOptions(this)
6365
const combined = hasCombinedQuery(this.resourceQuery)
6466
const skipSyntheticDefault = hasNamedOnlyQueryFlag(this.resourceQuery)
@@ -78,9 +80,12 @@ export const pitch: PitchLoaderDefinitionFunction<KnightedCssBridgeLoaderOptions
7880
})
7981
: false
8082

83+
const resolvedUpstream = upstreamRequest || localsRequest
84+
const resolvedLocals = upstreamRequest || localsRequest
85+
8186
return createBridgeModule({
82-
localsRequest,
83-
upstreamRequest: upstreamRequest || localsRequest,
87+
localsRequest: resolvedLocals,
88+
upstreamRequest: resolvedUpstream,
8489
combined,
8590
emitDefault,
8691
emitCssModules,
@@ -268,7 +273,8 @@ function createBridgeModule(options: BridgeModuleOptions): string {
268273
`const __knightedDefault =\ntypeof __knightedUpstream.default !== 'undefined'\n ? __knightedUpstream.default\n : __knightedUpstream;`,
269274
`const __knightedResolveCss = ${resolveCssText.toString()};`,
270275
`const __knightedResolveCssModules = ${resolveCssModules.toString()};`,
271-
`const __knightedLocalsExport =\n __knightedResolveCssModules(__knightedLocals, __knightedLocals) ??\n __knightedLocals;`,
276+
`const __knightedUpstreamLocals =\n __knightedResolveCssModules(__knightedUpstream, __knightedUpstream);`,
277+
`const __knightedLocalsExport =\n __knightedUpstreamLocals ??\n __knightedResolveCssModules(__knightedLocals, __knightedLocals) ??\n __knightedLocals;`,
272278
`const __knightedCss = __knightedResolveCss(__knightedDefault, __knightedUpstream);`,
273279
`export const ${DEFAULT_EXPORT_NAME} = __knightedCss;`,
274280
]
@@ -312,6 +318,40 @@ function buildProxyRequest(ctx: LoaderContext<KnightedCssBridgeLoaderOptions>):
312318
return contextifyRequest(ctx, request)
313319
}
314320

321+
function resolveRemainingRequest(
322+
ctx: LoaderContext<KnightedCssBridgeLoaderOptions>,
323+
remainingRequest?: string,
324+
): string {
325+
const resolved = remainingRequest || ctx.remainingRequest
326+
if (resolved) return resolved
327+
const loaders = Array.isArray(ctx.loaders) ? ctx.loaders.slice(ctx.loaderIndex + 1) : []
328+
if (loaders.length > 0) {
329+
const loaderRequests = loaders
330+
.map(loader => {
331+
if (loader && typeof loader.request === 'string' && loader.request) {
332+
return loader.request
333+
}
334+
const path = loader && typeof loader.path === 'string' ? loader.path : ''
335+
const query = loader && typeof loader.query === 'string' ? loader.query : ''
336+
return path ? `${path}${query}` : ''
337+
})
338+
.filter(Boolean)
339+
if (loaderRequests.length > 0) {
340+
const resource = `${ctx.resourcePath}${ctx.resourceQuery ?? ''}`
341+
return [...loaderRequests, resource].join('!')
342+
}
343+
}
344+
if (typeof ctx.request === 'string' && typeof ctx.loaderIndex === 'number') {
345+
const parts = ctx.request.split('!').filter(Boolean)
346+
if (parts.length > 0) {
347+
const start = Math.min(ctx.loaderIndex + 1, parts.length)
348+
const next = parts.slice(start).join('!')
349+
if (next) return next
350+
}
351+
}
352+
return ''
353+
}
354+
315355
function rebuildProxyRequestFromRaw(
316356
ctx: LoaderContext<KnightedCssBridgeLoaderOptions>,
317357
rawRequest: string,

packages/css/test/loaderBridge.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,18 @@ test('resolveCssModules falls back to named exports', () => {
352352
})
353353
})
354354

355+
test('createBridgeModule prefers upstream locals when present', () => {
356+
const output = __loaderBridgeInternals.createBridgeModule({
357+
localsRequest: './styles.module.css?knighted-css',
358+
upstreamRequest: '!!css-loader!./styles.module.css?knighted-css',
359+
combined: false,
360+
emitDefault: false,
361+
emitCssModules: true,
362+
})
363+
assert.match(output, /__knightedResolveCssModules\(__knightedUpstream/)
364+
assert.match(output, /__knightedUpstreamLocals \?\?/)
365+
})
366+
355367
test('buildProxyRequest prefers raw requests', () => {
356368
const ctx = createMockContext({
357369
resourcePath: path.resolve(__dirname, 'fixtures/dialects/basic/styles.css'),

0 commit comments

Comments
 (0)