From c8cd80596987bddc660e907a08ef87ee0f5c97a1 Mon Sep 17 00:00:00 2001 From: Saya Date: Wed, 8 Jun 2022 15:27:47 +0800 Subject: [PATCH] feat(core): resolve tokens and preflights together (#1078) --- packages/core/src/generator/index.ts | 50 +++++++++++++++++----------- test/generate-async.test.ts | 48 ++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 test/generate-async.test.ts diff --git a/packages/core/src/generator/index.ts b/packages/core/src/generator/index.ts index 23500e6989..b569c51922 100644 --- a/packages/core/src/generator/index.ts +++ b/packages/core/src/generator/index.ts @@ -143,8 +143,9 @@ export class UnoGenerator { const layerSet = new Set(['default']) const matched = new Set() const sheet = new Map() + let preflightsMap: Record = {} - await Promise.all(Array.from(tokens).map(async (raw) => { + const tokenPromises = Array.from(tokens).map(async (raw) => { if (matched.has(raw)) return @@ -156,36 +157,34 @@ export class UnoGenerator { for (const item of payload) { const parent = item[3] || '' + const layer = item[4]?.layer if (!sheet.has(parent)) sheet.set(parent, []) sheet.get(parent)!.push(item) - if (item[4]?.layer) - layerSet.add(item[4].layer) + if (layer) + layerSet.add(layer) } - })) - - if (preflights) { - this.config.preflights.forEach((i) => { - if (i.layer) - layerSet.add(i.layer) - }) - } + }) - const layerCache: Record = {} - const layers = this.config.sortLayers(Array - .from(layerSet) - .sort((a, b) => ((this.config.layers[a] ?? 0) - (this.config.layers[b] ?? 0)) || a.localeCompare(b)), - ) + const preflightPromise = (async () => { + if (!preflights) + return - let preflightsMap: Record = {} - if (preflights) { const preflightContext: PreflightContext = { generator: this, theme: this.config.theme, } + const preflightLayerSet = new Set(['default']) + this.config.preflights.forEach(({ layer }) => { + if (layer) { + layerSet.add(layer) + preflightLayerSet.add(layer) + } + }) + preflightsMap = Object.fromEntries( - await Promise.all(layers.map( + await Promise.all(Array.from(preflightLayerSet).map( async (layer) => { const preflights = await Promise.all( this.config.preflights @@ -199,8 +198,19 @@ export class UnoGenerator { }, )), ) - } + })() + + await Promise.all([ + ...tokenPromises, + preflightPromise, + ]) + const layers = this.config.sortLayers(Array + .from(layerSet) + .sort((a, b) => ((this.config.layers[a] ?? 0) - (this.config.layers[b] ?? 0)) || a.localeCompare(b)), + ) + + const layerCache: Record = {} const getLayer = (layer: string) => { if (layerCache[layer]) return layerCache[layer] diff --git a/test/generate-async.test.ts b/test/generate-async.test.ts new file mode 100644 index 0000000000..aa6160f628 --- /dev/null +++ b/test/generate-async.test.ts @@ -0,0 +1,48 @@ +import { createGenerator } from '@unocss/core' +import { describe, expect, test } from 'vitest' + +describe('generate-async', () => { + test('rule-first', async () => { + const order: number[] = [] + const uno = createGenerator({ + rules: [ + [/^rule$/, () => new Promise(resolve => setTimeout(() => { + order.push(1) + resolve('/* rule */') + }, 10))], + ], + preflights: [ + { + getCSS: () => new Promise(resolve => setTimeout(() => { + order.push(2) + resolve('/* preflight */') + }, 20)), + }, + ], + }) + await uno.generate('rule') + expect(order).eql([1, 2]) + }) + + test('preflight-first', async () => { + const order: number[] = [] + const uno = createGenerator({ + rules: [ + [/^rule$/, () => new Promise(resolve => setTimeout(() => { + order.push(2) + resolve('/* rule */') + }, 20))], + ], + preflights: [ + { + getCSS: () => new Promise(resolve => setTimeout(() => { + order.push(1) + resolve('/* preflight */') + }, 10)), + }, + ], + }) + await uno.generate('rule') + expect(order).eql([1, 2]) + }) +})