Skip to content

Commit 9a24025

Browse files
committed
Move Svelte AST printer into transform definition
1 parent d596fd1 commit 9a24025

3 files changed

Lines changed: 75 additions & 59 deletions

File tree

src/create-plugin.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Parser, ParserOptions } from 'prettier'
1+
import type { AstPath, Parser, ParserOptions, Printer } from 'prettier'
22
import { getTailwindConfig } from './config'
33
import { createMatcher } from './options'
44
import type { loadPlugins } from './plugins'
@@ -9,6 +9,7 @@ type Base = Awaited<ReturnType<typeof loadPlugins>>
99

1010
export function createPlugin(base: Base, transforms: TransformOptions<any>[]) {
1111
let parsers: Record<string, Parser<any>> = Object.create(null)
12+
let printers: Record<string, Printer<any>> = Object.create(null)
1213

1314
for (let opts of transforms) {
1415
for (let [name, meta] of Object.entries(opts.parsers)) {
@@ -17,9 +18,15 @@ export function createPlugin(base: Base, transforms: TransformOptions<any>[]) {
1718
dynamicAttrs: meta.dynamicAttrs ?? [],
1819
})
1920
}
21+
22+
for (let [name, meta] of Object.entries(opts.printers ?? {})) {
23+
if (!opts.reprint) continue
24+
25+
printers[name] = createPrinter(base, name, opts.reprint)
26+
}
2027
}
2128

22-
return { parsers }
29+
return { parsers, printers }
2330
}
2431

2532
function createParser(
@@ -73,3 +80,32 @@ function createParser(
7380
},
7481
}
7582
}
83+
84+
function createPrinter(
85+
base: Base,
86+
name: string,
87+
reprint: (path: AstPath<any>, options: ParserOptions<any>) => void,
88+
): Printer<any> {
89+
let original = base.printers[name]
90+
let printer = { ...original }
91+
92+
printer.print = new Proxy(original.print, {
93+
apply(target, thisArg, args) {
94+
let [path, options] = args as Parameters<typeof original.print>
95+
reprint(path, options)
96+
return Reflect.apply(target, thisArg, args)
97+
},
98+
})
99+
100+
if (original.embed) {
101+
printer.embed = new Proxy(original.embed, {
102+
apply(target, thisArg, args) {
103+
let [path, options] = args as Parameters<typeof original.embed>
104+
reprint(path, options as any)
105+
return Reflect.apply(target, thisArg, args)
106+
},
107+
})
108+
}
109+
110+
return printer
111+
}

src/index.ts

Lines changed: 23 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import * as astTypes from 'ast-types'
55
import jsesc from 'jsesc'
66
// @ts-ignore
77
import lineColumn from 'line-column'
8-
import type { Printer } from 'prettier'
98
import * as prettierParserAngular from 'prettier/plugins/angular'
109
import * as prettierParserBabel from 'prettier/plugins/babel'
1110
// @ts-ignore
@@ -1011,61 +1010,6 @@ function transformSvelte(ast: any, env: TransformerEnv) {
10111010

10121011
export { options } from './options.js'
10131012

1014-
export const printers: Record<string, Printer> = (function () {
1015-
let printers: Record<string, Printer> = {}
1016-
1017-
if (base.printers['svelte-ast']) {
1018-
function mutateOriginalText(path: any, options: any) {
1019-
if (options.__mutatedOriginalText) {
1020-
return
1021-
}
1022-
1023-
options.__mutatedOriginalText = true
1024-
1025-
let changes: any[] = path.stack[0].changes
1026-
1027-
if (changes?.length) {
1028-
let finder = lineColumn(options.originalText)
1029-
1030-
changes = changes.map((change) => {
1031-
return {
1032-
...change,
1033-
start: finder.toIndex(change.start.line, change.start.column + 1),
1034-
end: finder.toIndex(change.end.line, change.end.column + 1),
1035-
}
1036-
})
1037-
1038-
options.originalText = spliceChangesIntoString(options.originalText, changes)
1039-
}
1040-
}
1041-
1042-
let original = base.printers['svelte-ast']
1043-
let printer = { ...original }
1044-
1045-
printer.print = new Proxy(original.print, {
1046-
apply(target, thisArg, args) {
1047-
let [path, options] = args as Parameters<typeof original.print>
1048-
mutateOriginalText(path, options)
1049-
return Reflect.apply(target, thisArg, args)
1050-
},
1051-
})
1052-
1053-
if (original.embed) {
1054-
printer.embed = new Proxy(original.embed, {
1055-
apply(target, thisArg, args) {
1056-
let [path, options] = args as Parameters<typeof original.embed>
1057-
mutateOriginalText(path, options)
1058-
return Reflect.apply(target, thisArg, args)
1059-
},
1060-
})
1061-
}
1062-
1063-
printers['svelte-ast'] = printer
1064-
}
1065-
1066-
return printers
1067-
})()
1068-
10691013
let html = defineTransform({
10701014
parsers: {
10711015
html: { staticAttrs: ['class'] },
@@ -1121,7 +1065,29 @@ let svelte = defineTransform({
11211065
svelte: { staticAttrs: ['class'] },
11221066
},
11231067

1068+
printers: {
1069+
'svelte-ast': {},
1070+
},
1071+
11241072
transform: transformSvelte,
1073+
1074+
reprint(path, options) {
1075+
if (options.__mutatedOriginalText) return
1076+
options.__mutatedOriginalText = true
1077+
1078+
let changes: any[] = path.stack[0].changes
1079+
if (!changes?.length) return
1080+
1081+
let finder = lineColumn(options.originalText)
1082+
1083+
changes = changes.map((change) => ({
1084+
...change,
1085+
start: finder.toIndex(change.start.line, change.start.column + 1),
1086+
end: finder.toIndex(change.end.line, change.end.column + 1),
1087+
}))
1088+
1089+
options.originalText = spliceChangesIntoString(options.originalText, changes)
1090+
},
11251091
})
11261092

11271093
let astro = defineTransform({
@@ -1159,7 +1125,7 @@ let liquid = defineTransform({
11591125
transform: transformLiquid,
11601126
})
11611127

1162-
export const { parsers } = createPlugin(base, [
1128+
export const { parsers, printers } = createPlugin(base, [
11631129
html,
11641130
glimmer,
11651131
css,

src/transform.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { AstPath, ParserOptions } from 'prettier'
12
import type { TransformerEnv } from './types'
23

34
export function defineTransform<T>(opts: TransformOptions<T>) {
@@ -23,11 +24,24 @@ export interface TransformOptions<T> {
2324
}
2425
>
2526

27+
/**
28+
* A list of supported parser names
29+
*/
30+
printers?: Record<string, {}>
31+
2632
/**
2733
* Transform entire ASTs
2834
*
2935
* @param ast The AST to transform
3036
* @param env Provides options and mechanisms to sort classes
3137
*/
3238
transform(ast: T, env: TransformerEnv): void
39+
40+
/**
41+
* Transform entire ASTs
42+
*
43+
* @param ast The AST to transform
44+
* @param env Provides options and mechanisms to sort classes
45+
*/
46+
reprint?(path: AstPath<T>, options: ParserOptions<T>): void
3347
}

0 commit comments

Comments
 (0)