11import { Scanner } from '@tailwindcss/oxide'
22import fs from 'fs'
3- import { JsTransformerConfig , JsTransformOptions } from 'metro-transform-worker'
3+ import type { JsTransformerConfig , JsTransformOptions , TransformResponse } from 'metro-transform-worker'
44import path from 'path'
55import { name } from '../../package.json'
66import { compileVirtual } from './compileVirtual'
77import { getSources } from './getSources'
88import { injectThemes } from './injectThemes'
99import { Platform , UniwindConfig } from './types'
10+ import { areSetsEqual } from './utils'
1011
1112let worker : typeof import ( 'metro-transform-worker' )
1213
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+
1926export 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