From 8aee9f8fbbf91fb9f54e84d921b0c1c441f2030d Mon Sep 17 00:00:00 2001 From: Saya Date: Wed, 8 Jun 2022 14:43:12 +0800 Subject: [PATCH 1/2] feat(core): resolve tokens and preflights together --- packages/core/src/generator/index.ts | 48 +++++++++++++++++----------- test/generate-async.test.ts | 48 ++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 19 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..08392a1cfc 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 preflightResolution = 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 @@ -201,6 +200,17 @@ export class UnoGenerator { ) } + await Promise.all([ + ...tokenPromises, + preflightResolution(), + ]) + + 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]) + }) +}) From ef6f9b539df0d5e1649e166a62a6da05cfbf9935 Mon Sep 17 00:00:00 2001 From: Saya Date: Wed, 8 Jun 2022 14:58:04 +0800 Subject: [PATCH 2/2] rename --- packages/core/src/generator/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/generator/index.ts b/packages/core/src/generator/index.ts index 08392a1cfc..b569c51922 100644 --- a/packages/core/src/generator/index.ts +++ b/packages/core/src/generator/index.ts @@ -166,7 +166,7 @@ export class UnoGenerator { } }) - const preflightResolution = async () => { + const preflightPromise = (async () => { if (!preflights) return @@ -198,11 +198,11 @@ export class UnoGenerator { }, )), ) - } + })() await Promise.all([ ...tokenPromises, - preflightResolution(), + preflightPromise, ]) const layers = this.config.sortLayers(Array