Skip to content

Commit d6c2229

Browse files
authored
Fix error when using Angular pipes (#86)
1 parent 287d55b commit d6c2229

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

src/index.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import prettier from 'prettier'
22
import prettierParserHTML from 'prettier/parser-html'
3+
import prettierParserAngular from 'prettier/parser-angular'
34
import prettierParserPostCSS from 'prettier/parser-postcss'
45
import prettierParserBabel from 'prettier/parser-babel'
56
import prettierParserEspree from 'prettier/parser-espree'
@@ -177,13 +178,13 @@ function createParser(original, transform) {
177178
contextMap.set(tailwindConfigPath, { context, hash })
178179
}
179180

180-
transform(ast, { env: { context, generateRules } })
181+
transform(ast, { env: { context, generateRules, parsers, options } })
181182
return ast
182183
},
183184
}
184185
}
185186

186-
function transformHtml(attributes, computedAttributes = []) {
187+
function transformHtml(attributes, computedAttributes = [], computedType = 'js') {
187188
let transform = (ast, { env }) => {
188189
for (let attr of ast.attrs ?? []) {
189190
if (attributes.includes(attr.name)) {
@@ -193,6 +194,24 @@ function transformHtml(attributes, computedAttributes = []) {
193194
continue
194195
}
195196

197+
if (computedType === 'angular') {
198+
let directiveAst = prettierParserAngular.parsers.__ng_directive.parse(
199+
attr.value,
200+
env.parsers,
201+
env.options
202+
)
203+
visit(directiveAst, {
204+
StringLiteral(node) {
205+
if (!node.value) return
206+
attr.value =
207+
attr.value.slice(0, node.start + 1) +
208+
sortClasses(node.value, { env }) +
209+
attr.value.slice(node.end - 1)
210+
},
211+
})
212+
continue
213+
}
214+
196215
let ast = recast.parse(`let __prettier_temp__ = ${attr.value}`, {
197216
parser: prettierParserBabel.parsers['babel-ts'],
198217
})
@@ -409,7 +428,7 @@ export const parsers = {
409428
lwc: createParser(prettierParserHTML.parsers.lwc, transformHtml(['class'])),
410429
angular: createParser(
411430
prettierParserHTML.parsers.angular,
412-
transformHtml(['class'], ['[ngClass]'])
431+
transformHtml(['class'], ['[ngClass]'], 'angular')
413432
),
414433
vue: createParser(prettierParserHTML.parsers.vue, transformHtml(['class'], [':class'])),
415434
css: createParser(prettierParserPostCSS.parsers.css, transformCss),

tests/test.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,18 @@ let tests = {
158158
lwc: html,
159159
vue: [...vue, t`<div :class="\`${yes} \${someVar} ${yes} \${'${yes}'}\`"></div>`],
160160
angular: [
161-
...vue.map((test) => test.map((t) => t.replace(/:class=/g, '[ngClass]='))),
162-
t`<div [ngClass]='\`${yes} \${someVar} ${yes} \${"${yes}"}\`'></div>`,
161+
...html,
162+
t`<div [ngClass]="'${yes}'"></div>`,
163+
t`<!-- <div [ngClass]="'${no}'"></div> -->`,
164+
t`<div [ngClass]></div>`,
165+
t`<div [ngClass]=""></div>`,
166+
t`<div [ngClass]="'${yes}' + '${yes}'"></div>`,
167+
t`<div [ngClass]="['${yes}', '${yes}']"></div>`,
168+
t`<div [ngClass]="[cond ? '${yes}' : '${yes}']"></div>`,
169+
t`<div [ngClass]="[someVar ?? '${yes}']"></div>`,
170+
t`<div [ngClass]="{ '${yes}': true }"></div>`,
171+
t`<div [ngClass]="clsx('${yes}')"></div>`,
172+
t`<div [ngClass]="{ '${yes}': (some.thing | urlPipe: { option: true } | async), '${yes}': true }"></div>`,
163173
],
164174
css: [...css, t`@apply ${yes} !important;`],
165175
scss: [...css, t`@apply ${yes} #{!important};`],

0 commit comments

Comments
 (0)