From 7800d39dce27fe5ad43a3c6f308e2a075e32d7b7 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Sat, 2 Jul 2022 18:32:12 +0800 Subject: [PATCH] feat(core): `layer` for preset --- packages/core/src/config.ts | 30 ++++++++++++++++---------- packages/core/src/generator/index.ts | 5 +++-- packages/core/src/types.ts | 6 +++++- test/__snapshots__/prefix.test.ts.snap | 3 ++- test/prefix.test.ts | 11 ++++++++-- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index 988aaa0636..cec533db74 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -1,4 +1,4 @@ -import type { Postprocessor, Preprocessor, Preset, ResolvedConfig, Shortcut, ThemeExtender, UserConfig, UserConfigDefaults, UserShortcuts } from './types' +import type { Postprocessor, Preprocessor, Preset, ResolvedConfig, Rule, Shortcut, ThemeExtender, UserConfig, UserConfigDefaults, UserShortcuts } from './types' import { clone, isStaticRule, mergeDeep, normalizeVariant, toArray, uniq } from './utils' import { extractorSplit } from './extractors' import { DEAFULT_LAYERS } from './constants' @@ -12,17 +12,25 @@ export function resolveShortcuts(shortcuts: UserShortcuts): Shortcut[] { } export function resolvePreset(preset: Preset): Preset { - if (preset.prefix) { - preset.rules?.forEach((i) => { - if (i[2]) { - if (i[2].prefix == null) - i[2].prefix = preset.prefix - } - else { - i[2] = { prefix: preset.prefix } - } - }) + const shortcuts = preset.shortcuts + ? resolveShortcuts(preset.shortcuts) + : undefined + preset.shortcuts = shortcuts as any + + if (preset.prefix || preset.layer) { + const apply = (i: Rule | Shortcut) => { + if (!i[2]) + i[2] = {} + const meta = i[2] + if (meta.prefix == null && preset.prefix) + meta.prefix = preset.prefix + if (meta.layer == null && preset.layer) + meta.prefix = preset.layer + } + shortcuts?.forEach(apply) + preset.rules?.forEach(apply) } + return preset } diff --git a/packages/core/src/generator/index.ts b/packages/core/src/generator/index.ts index a5f856ef5d..a7f73f0d3e 100644 --- a/packages/core/src/generator/index.ts +++ b/packages/core/src/generator/index.ts @@ -509,8 +509,9 @@ export class UnoGenerator { let meta: RuleMeta | undefined let result: string | string[] | undefined for (const s of this.config.shortcuts) { + const unprefixed = s[2]?.prefix ? input.slice(s[2].prefix.length) : input if (isStaticShortcut(s)) { - if (s[0] === input) { + if (s[0] === unprefixed) { meta = meta || s[2] result = s[1] recordShortcut(s) @@ -518,7 +519,7 @@ export class UnoGenerator { } } else { - const match = input.match(s[0]) + const match = unprefixed.match(s[0]) if (match) result = s[1](match, context) if (result) { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index d49078cbbd..f222e7f21e 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -455,9 +455,13 @@ export interface Preset extends ConfigBase { */ options?: PresetOptions /** - * Apply prefix to all utilities + * Apply prefix to all utilities and shortcuts */ prefix?: string + /** + * Apply layer to all utilities and shortcuts + */ + layer?: string } export interface GeneratorOptions { diff --git a/test/__snapshots__/prefix.test.ts.snap b/test/__snapshots__/prefix.test.ts.snap index 3e5d89beee..f5af671697 100644 --- a/test/__snapshots__/prefix.test.ts.snap +++ b/test/__snapshots__/prefix.test.ts.snap @@ -4,5 +4,6 @@ exports[`prefix > preset prefix 2`] = ` "/* layer: default */ .hover\\\\:foo-p4:hover{padding:1rem;} .foo-text-red{--un-text-opacity:1;color:rgba(248,113,113,var(--un-text-opacity));} -.bar-bar{color:bar;}" +.bar-bar, +.bar-shortcut{color:bar;}" `; diff --git a/test/prefix.test.ts b/test/prefix.test.ts index b12313e810..0455adb6cd 100644 --- a/test/prefix.test.ts +++ b/test/prefix.test.ts @@ -11,15 +11,21 @@ describe('prefix', () => { rules: [ ['bar', { color: 'bar' }, { prefix: 'bar-' }], ], + shortcuts: [ + ['shortcut', 'bar-bar', { prefix: 'bar-' }], + ], }) const { css, matched } = await uno.generate(new Set([ 'text-red', - 'foo-text-red', 'hover:p4', - 'hover:foo-p4', 'bar', + 'shortcut', + // expected + 'foo-text-red', + 'hover:foo-p4', 'bar-bar', + 'bar-shortcut', ]), { preflights: false }) expect(matched).toMatchInlineSnapshot(` @@ -27,6 +33,7 @@ describe('prefix', () => { "bar-bar", "foo-text-red", "hover:foo-p4", + "bar-shortcut", } `)