@@ -16,6 +16,8 @@ import * as fs from 'fs'
16
16
import requireFrom from 'import-from'
17
17
import requireFresh from 'import-fresh'
18
18
import objectHash from 'object-hash'
19
+ import * as svelte from 'prettier-plugin-svelte'
20
+ import lineColumn from 'line-column'
19
21
20
22
let contextMap = new Map ( )
21
23
@@ -290,13 +292,48 @@ function transformCss(ast, { env }) {
290
292
}
291
293
292
294
export const options = {
295
+ ...svelte . options ,
293
296
tailwindConfig : {
294
297
type : 'string' ,
295
298
category : 'Tailwind CSS' ,
296
299
description : 'TODO' ,
297
300
} ,
298
301
}
299
302
303
+ export const languages = svelte . languages
304
+ export const printers = {
305
+ 'svelte-ast' : {
306
+ ...svelte . printers [ 'svelte-ast' ] ,
307
+ print : ( path , options , print ) => {
308
+ if ( ! options . __mutatedOriginalText ) {
309
+ options . __mutatedOriginalText = true
310
+ let changes = path . stack [ 0 ] . changes
311
+ if ( changes ?. length ) {
312
+ let finder = lineColumn ( options . originalText )
313
+
314
+ for ( let change of changes ) {
315
+ let start = finder . toIndex (
316
+ change . loc . start . line ,
317
+ change . loc . start . column + 1
318
+ )
319
+ let end = finder . toIndex (
320
+ change . loc . end . line ,
321
+ change . loc . end . column + 1
322
+ )
323
+
324
+ options . originalText =
325
+ options . originalText . substring ( 0 , start ) +
326
+ change . text +
327
+ options . originalText . substring ( end )
328
+ }
329
+ }
330
+ }
331
+
332
+ return svelte . printers [ 'svelte-ast' ] . print ( path , options , print )
333
+ } ,
334
+ } ,
335
+ }
336
+
300
337
export const parsers = {
301
338
html : createParser ( prettierParserHTML . parsers . html , transformHtml ( [ 'class' ] ) ) ,
302
339
lwc : createParser ( prettierParserHTML . parsers . lwc , transformHtml ( [ 'class' ] ) ) ,
@@ -333,6 +370,58 @@ export const parsers = {
333
370
prettierParserMeriyah . parsers . meriyah ,
334
371
transformJavaScript
335
372
) ,
373
+ svelte : createParser ( svelte . parsers . svelte , ( ast , { env } ) => {
374
+ let changes = [ ]
375
+ transformSvelte ( ast . html , { env, changes } )
376
+ ast . changes = changes
377
+ } ) ,
378
+ }
379
+
380
+ function transformSvelte ( ast , { env, changes } ) {
381
+ for ( let attr of ast . attributes ?? [ ] ) {
382
+ if ( attr . name === 'class' ) {
383
+ for ( let i = 0 ; i < attr . value . length ; i ++ ) {
384
+ let value = attr . value [ i ]
385
+ if ( value . type === 'Text' ) {
386
+ let same = value . raw === value . data
387
+ value . raw = sortClasses ( value . raw , {
388
+ env,
389
+ ignoreFirst : i > 0 && ! / ^ \s / . test ( value . raw ) ,
390
+ ignoreLast : i < attr . value . length - 1 && ! / \s $ / . test ( value . raw ) ,
391
+ } )
392
+ value . data = same
393
+ ? value . raw
394
+ : sortClasses ( value . data , {
395
+ env,
396
+ ignoreFirst : i > 0 && ! / ^ \s / . test ( value . data ) ,
397
+ ignoreLast :
398
+ i < attr . value . length - 1 && ! / \s $ / . test ( value . data ) ,
399
+ } )
400
+ } else if ( value . type === 'MustacheTag' ) {
401
+ visit ( value . expression , {
402
+ Literal ( node ) {
403
+ if ( isStringLiteral ( node ) ) {
404
+ if ( sortStringLiteral ( node , { env } ) ) {
405
+ changes . push ( { text : node . raw , loc : node . loc } )
406
+ }
407
+ }
408
+ } ,
409
+ TemplateLiteral ( node ) {
410
+ if ( sortTemplateLiteral ( node , { env } ) ) {
411
+ for ( let quasi of node . quasis ) {
412
+ changes . push ( { text : quasi . value . raw , loc : quasi . loc } )
413
+ }
414
+ }
415
+ } ,
416
+ } )
417
+ }
418
+ }
419
+ }
420
+ }
421
+
422
+ for ( let child of ast . children ?? [ ] ) {
423
+ transformSvelte ( child , { env, changes } )
424
+ }
336
425
}
337
426
338
427
// https://lihautan.com/manipulating-ast-with-javascript/
0 commit comments