Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 25 additions & 10 deletions packages/uniwind/src/bundler/adapters/metro/metro.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import { resolve } from 'node:path'

import { UniwindBundlerConfig } from '@/bundler/config'
import type { UniwindConfig } from '@/bundler/types'
import { Platform } from '@/common/consts'
import type { MetroConfig } from 'metro-config'

import { cacheStore, patchMetroGraphToSupportUncachedModules } from './patches'
import { nativeResolver, webResolver } from './resolvers'

import type { UniwindConfig } from '@/bundler/types'
import type { MetroConfig } from 'metro-config'
import type { CustomResolver } from 'metro-resolver'
Comment on lines +1 to +11

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not really common in this repo to separate imports


export const withUniwindConfig = <T extends MetroConfig>(
config: T,
uniwindConfig: UniwindConfig,
Expand All @@ -22,15 +27,25 @@ export const withUniwindConfig = <T extends MetroConfig>(
},
resolver: {
...config.resolver,
sourceExts: [
...config.resolver?.sourceExts ?? [],
'css',
],
assetExts: config.resolver?.assetExts?.filter(
ext => ext !== 'css',
),
sourceExts: [...(config.resolver?.sourceExts ?? []), 'css'],
assetExts: config.resolver?.assetExts?.filter((ext) => ext !== 'css'),
Comment thread
Brentlok marked this conversation as resolved.
Comment on lines -25 to +31

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this is reformated?

resolveRequest: (context, moduleName, platform) => {
const resolver = config.resolver?.resolveRequest ?? context.resolveRequest
const baseResolver = config.resolver?.resolveRequest ?? context.resolveRequest
// Pin every `uniwind` specifier to a single physical copy. In monorepos
// (bun/pnpm) uniwind can be installed as multiple peer-hash copies; mixing
// them both crashes Hermes ("Maximum call stack size exceeded" via
// get NativeModules recursion, when the react-native shim redirects across
// copies) and splits uniwind's theme runtime across instances (no styling,
// colorKit "invalid" color errors). Resolving every `uniwind` request from
// a single origin (the project root) collapses them to one instance.
// Wrapping `resolver` — not just this resolveRequest — ensures the platform
// resolvers' internal `react-native` -> `uniwind/components` redirects are
// pinned too.
Comment on lines +34 to +43

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment seems to be too long

const pinnedOrigin = resolve(config.projectRoot ?? process.cwd(), 'index.js')
const resolver: CustomResolver = (ctx, name, plat) =>
name.split('/')[0] === 'uniwind' && ctx.originModulePath !== pinnedOrigin
? baseResolver({ ...ctx, originModulePath: pinnedOrigin }, name, plat)
: baseResolver(ctx, name, plat)
const platformResolver = platform === Platform.Web ? webResolver : nativeResolver
const resolved = platformResolver({
context,
Expand Down