Skip to content

Commit 7dd8379

Browse files
committed
feat: add cache to metro-transformer
1 parent 9b9473d commit 7dd8379

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

packages/uniwind/src/metro/metro-transformer.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { Scanner } from '@tailwindcss/oxide'
22
import fs from 'fs'
3-
import { JsTransformerConfig, JsTransformOptions } from 'metro-transform-worker'
3+
import type { JsTransformerConfig, JsTransformOptions, TransformResponse } from 'metro-transform-worker'
44
import path from 'path'
55
import { name } from '../../package.json'
66
import { compileVirtual } from './compileVirtual'
77
import { getSources } from './getSources'
88
import { injectThemes } from './injectThemes'
99
import { Platform, UniwindConfig } from './types'
10+
import { areSetsEqual } from './utils'
1011

1112
let worker: typeof import('metro-transform-worker')
1213

@@ -16,6 +17,12 @@ try {
1617
worker = require('metro-transform-worker')
1718
}
1819

20+
const uniwindCache = {
21+
css: '',
22+
candidates: new Set<string>(),
23+
cachedTransforms: new Map<Platform, TransformResponse>(),
24+
}
25+
1926
export const transform = async (
2027
config: JsTransformerConfig & {
2128
uniwind: UniwindConfig
@@ -50,16 +57,27 @@ export const transform = async (
5057
})
5158
const css = fs.readFileSync(filePath, 'utf-8')
5259
const sources = getSources(css, path.dirname(cssPath))
60+
const platform = options.platform as Platform
61+
const cached = uniwindCache.cachedTransforms.get(platform)
5362
const candidates = new Scanner({ sources }).scan()
63+
const candidatesSet = new Set(candidates)
64+
65+
if (cached && uniwindCache.css === css && areSetsEqual(uniwindCache.candidates, candidatesSet)) {
66+
return cached
67+
}
68+
69+
uniwindCache.css = css
70+
uniwindCache.candidates = candidatesSet
71+
5472
const virtualCode = await compileVirtual({
5573
css,
56-
platform: options.platform as Platform,
74+
platform,
5775
themes: config.uniwind.themes,
5876
polyfills: config.uniwind.polyfills,
5977
candidates,
6078
cssPath,
6179
})
62-
const isWeb = options.platform === Platform.Web
80+
const isWeb = platform === Platform.Web
6381

6482
data = Buffer.from(
6583
isWeb
@@ -80,6 +98,7 @@ export const transform = async (
8098
options,
8199
)
82100

101+
uniwindCache.cachedTransforms.set(platform, transform)
83102
transform.output[0].data.css = {
84103
skipCache: true,
85104
code: '',

0 commit comments

Comments
 (0)