Skip to content

Commit b515e95

Browse files
committed
Hoist common lists of attributes
1 parent 493aeeb commit b515e95

3 files changed

Lines changed: 60 additions & 27 deletions

File tree

src/create-plugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ export function createPlugin(base: Base, transforms: TransformOptions<any>[]) {
1414
for (let opts of transforms) {
1515
for (let [name, meta] of Object.entries(opts.parsers)) {
1616
parsers[name] = createParser(base, name, opts.transform, {
17-
staticAttrs: meta.staticAttrs ?? [],
18-
dynamicAttrs: meta.dynamicAttrs ?? [],
17+
staticAttrs: meta.staticAttrs ?? opts.staticAttrs ?? [],
18+
dynamicAttrs: meta.dynamicAttrs ?? opts.dynamicAttrs ?? [],
1919
})
2020
}
2121

src/index.ts

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,11 +1013,13 @@ export { options } from './options.js'
10131013
type HtmlNode = { type: 'attribute'; name: string; value: string } | { kind: 'attribute'; name: string; value: string }
10141014

10151015
let html = defineTransform<HtmlNode>({
1016+
staticAttrs: ['class'],
1017+
10161018
parsers: {
1017-
html: { staticAttrs: ['class'] },
1018-
lwc: { staticAttrs: ['class'] },
1019-
angular: { staticAttrs: ['class'], dynamicAttrs: ['[ngClass]'] },
1020-
vue: { staticAttrs: ['class'], dynamicAttrs: [':class', 'v-bind:class'] },
1019+
html: {},
1020+
lwc: {},
1021+
angular: { dynamicAttrs: ['[ngClass]'] },
1022+
vue: { dynamicAttrs: [':class', 'v-bind:class'] },
10211023
},
10221024

10231025
transform: transformHtml,
@@ -1031,8 +1033,10 @@ type GlimmerNode =
10311033
| { type: 'AttrNode'; name: string; value: GlimmerNode }
10321034

10331035
let glimmer = defineTransform<GlimmerNode>({
1036+
staticAttrs: ['class'],
1037+
10341038
parsers: {
1035-
glimmer: { staticAttrs: ['class'] },
1039+
glimmer: {},
10361040
},
10371041

10381042
transform: transformGlimmer,
@@ -1056,18 +1060,21 @@ let css = defineTransform<CssNode>({
10561060
})
10571061

10581062
let js = defineTransform<import('@babel/types').Node>({
1063+
staticAttrs: ['class', 'className'],
1064+
10591065
parsers: {
1060-
babel: { staticAttrs: ['class', 'className'] },
1061-
'babel-flow': { staticAttrs: ['class', 'className'] },
1062-
flow: { staticAttrs: ['class', 'className'] },
1063-
hermes: { staticAttrs: ['class', 'className'] },
1064-
typescript: { staticAttrs: ['class', 'className'] },
1065-
'babel-ts': { staticAttrs: ['class', 'className'] },
1066-
oxc: { staticAttrs: ['class', 'className'] },
1067-
'oxc-ts': { staticAttrs: ['class', 'className'] },
1068-
acorn: { staticAttrs: ['class', 'className'] },
1069-
meriyah: { staticAttrs: ['class', 'className'] },
1070-
__js_expression: { staticAttrs: ['class', 'className'] },
1066+
babel: {},
1067+
'babel-flow': {},
1068+
'babel-ts': {},
1069+
__js_expression: {},
1070+
typescript: {},
1071+
meriyah: {},
1072+
acorn: {},
1073+
flow: {},
1074+
oxc: {},
1075+
'oxc-ts': {},
1076+
hermes: {},
1077+
10711078
...(base.parsers.astroExpressionParser
10721079
? {
10731080
astroExpressionParser: {
@@ -1086,8 +1093,10 @@ type SvelteNode = import('svelte/compiler').AST.SvelteNode & {
10861093
}
10871094

10881095
let svelte = defineTransform<SvelteNode>({
1096+
staticAttrs: ['class'],
1097+
10891098
parsers: {
1090-
svelte: { staticAttrs: ['class'] },
1099+
svelte: {},
10911100
},
10921101

10931102
printers: {
@@ -1129,11 +1138,11 @@ type AstroNode =
11291138
| { type: 'attribute'; kind: 'expression'; name: string; value: unknown }
11301139

11311140
let astro = defineTransform<AstroNode>({
1141+
staticAttrs: ['class', 'className'],
1142+
dynamicAttrs: ['class:list', 'className'],
1143+
11321144
parsers: {
1133-
astro: {
1134-
staticAttrs: ['class', 'className'],
1135-
dynamicAttrs: ['class:list', 'className'],
1136-
},
1145+
astro: {},
11371146
},
11381147

11391148
transform: transformAstro,
@@ -1142,7 +1151,11 @@ let astro = defineTransform<AstroNode>({
11421151
type MarkoNode = import('@marko/compiler').types.Node
11431152

11441153
let marko = defineTransform<MarkoNode>({
1145-
parsers: { marko: { staticAttrs: ['class'] } },
1154+
staticAttrs: ['class'],
1155+
1156+
parsers: {
1157+
marko: {},
1158+
},
11461159

11471160
transform: transformMarko,
11481161
})
@@ -1169,7 +1182,11 @@ type TwigNode =
11691182
| TwigCallExpression
11701183

11711184
let twig = defineTransform<TwigNode>({
1172-
parsers: { twig: { staticAttrs: ['class'] } },
1185+
staticAttrs: ['class'],
1186+
1187+
parsers: {
1188+
twig: {},
1189+
},
11731190

11741191
transform: transformTwig,
11751192
})
@@ -1180,7 +1197,11 @@ interface PugNode {
11801197
}
11811198

11821199
let pug = defineTransform({
1183-
parsers: { pug: { staticAttrs: ['class'] } },
1200+
staticAttrs: ['class'],
1201+
1202+
parsers: {
1203+
pug: {},
1204+
},
11841205

11851206
transform: transformPug,
11861207
})
@@ -1194,7 +1215,9 @@ type LiquidNode =
11941215
| Liquid.LiquidExpression
11951216

11961217
let liquid = defineTransform<LiquidNode>({
1197-
parsers: { 'liquid-html': { staticAttrs: ['class'] } },
1218+
staticAttrs: ['class'],
1219+
1220+
parsers: { 'liquid-html': {} },
11981221

11991222
transform: transformLiquid,
12001223
})

src/transform.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ export function defineTransform<T>(opts: TransformOptions<T>) {
66
}
77

88
export interface TransformOptions<T> {
9+
/**
10+
* Static attributes that are supported by default
11+
*/
12+
staticAttrs?: string[]
13+
14+
/**
15+
* Dynamic / expression attributes that are supported by default
16+
*/
17+
dynamicAttrs?: string[]
18+
919
/**
1020
* A list of supported parser names
1121
*/

0 commit comments

Comments
 (0)