Skip to content

Commit 5d3d83a

Browse files
Merge pull request #367 from ijlee2/refactor-code-part-3
Refactored code (Part 3)
2 parents b6b7940 + 67b9fb4 commit 5d3d83a

27 files changed

Lines changed: 441 additions & 418 deletions

@types/prettier/plugins/estree.d.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

eslint.config.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ const customRules = {
2828
rules: {
2929
'jsdoc/check-param-names': 'off',
3030
'jsdoc/newline-after-description': 'off',
31-
'jsdoc/require-jsdoc': ['error', { publicOnly: true }],
3231
'jsdoc/require-param': 'off',
3332
'jsdoc/require-param-type': 'off',
3433
'jsdoc/require-returns': 'off',

src/config.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/languages.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { SupportLanguage } from 'prettier';
2+
3+
import { PARSER_NAME } from './utils/index.js';
4+
5+
export const languages: SupportLanguage[] = [
6+
{
7+
aliases: ['gjs', 'glimmer-js'],
8+
extensions: ['.gjs'],
9+
group: 'JavaScript',
10+
name: 'Ember Template Tag (gjs)',
11+
parsers: [PARSER_NAME],
12+
vscodeLanguageIds: ['glimmer-js'],
13+
},
14+
{
15+
aliases: ['gts', 'glimmer-ts'],
16+
extensions: ['.gts'],
17+
group: 'TypeScript',
18+
name: 'Ember Template Tag (gts)',
19+
parsers: [PARSER_NAME],
20+
vscodeLanguageIds: ['glimmer-ts'],
21+
},
22+
];

src/main.ts

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,4 @@
1-
import type { Node } from '@babel/types';
2-
import type { Parser, Plugin, Printer, SupportLanguage } from 'prettier';
3-
4-
import { PARSER_NAME, PRINTER_NAME } from './config.js';
5-
import { options } from './options.js';
6-
import { parser } from './parse/index.js';
7-
import { printer } from './print/index.js';
8-
9-
const languages: SupportLanguage[] = [
10-
{
11-
name: 'Ember Template Tag (gjs)',
12-
aliases: ['gjs', 'glimmer-js'],
13-
extensions: ['.gjs'],
14-
vscodeLanguageIds: ['glimmer-js'],
15-
parsers: [PARSER_NAME],
16-
group: 'JavaScript',
17-
},
18-
{
19-
name: 'Ember Template Tag (gts)',
20-
aliases: ['gts', 'glimmer-ts'],
21-
extensions: ['.gts'],
22-
vscodeLanguageIds: ['glimmer-ts'],
23-
parsers: [PARSER_NAME],
24-
group: 'TypeScript',
25-
},
26-
];
27-
28-
const parsers: Record<string, Parser<Node | undefined>> = {
29-
[PARSER_NAME]: parser,
30-
};
31-
32-
const printers: Record<string, Printer<Node | undefined>> = {
33-
[PRINTER_NAME]: printer,
34-
};
35-
36-
const plugin: Plugin<Node | undefined> = {
37-
languages,
38-
parsers,
39-
printers,
40-
options,
41-
};
42-
43-
export default plugin;
1+
export { languages } from './languages.js';
2+
export { options } from './options.js';
3+
export { parsers } from './parsers.js';
4+
export { printers } from './printers.js';

src/options.ts

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,28 @@
1-
import type { Node } from '@babel/types';
21
import type {
32
BooleanSupportOption,
43
ParserOptions,
54
SupportOptions,
65
} from 'prettier';
76

8-
export interface Options extends ParserOptions<Node | undefined> {
7+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
8+
export interface PluginOptions<T = any> extends ParserOptions<T> {
99
templateExportDefault?: boolean;
1010
templateSingleQuote?: boolean;
1111
}
1212

1313
const templateExportDefault: BooleanSupportOption = {
1414
category: 'Format',
15-
type: 'boolean',
1615
default: false,
1716
description:
1817
'Prepend default export template tags with "export default". Since 0.1.0.',
18+
type: 'boolean',
1919
};
2020

21-
/**
22-
* Extracts a valid `templateSingleQuote` option out of the provided options. If
23-
* `templateSingleQuote` is defined, it will be used, otherwise the value for
24-
* `singleQuote` will be inherited.
25-
*/
26-
export function getTemplateSingleQuote(options: Options): boolean {
27-
const { singleQuote, templateSingleQuote } = options;
28-
return typeof templateSingleQuote === 'boolean'
29-
? templateSingleQuote
30-
: singleQuote;
31-
}
32-
3321
const templateSingleQuote: BooleanSupportOption = {
3422
category: 'Format',
35-
type: 'boolean',
3623
description:
3724
'Use single quotes instead of double quotes within template tags. Since 0.0.3.',
25+
type: 'boolean',
3826
};
3927

4028
export const options: SupportOptions = {

src/parsers.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { File } from '@babel/types';
2+
import type { Parser, ParserOptions } from 'prettier';
3+
import { parsers as prettierParsers } from 'prettier/plugins/babel';
4+
5+
import { convertAst, preprocess } from './parsers/index.js';
6+
import { assert } from './utils/assert.js';
7+
import { type NodeType, PARSER_NAME, PRINTER_NAME } from './utils/index.js';
8+
9+
const parser = prettierParsers['babel-ts'] as Parser<NodeType>;
10+
11+
async function parse(text: string, options: ParserOptions<NodeType>) {
12+
const { code, templates } = preprocess(text, options.filepath);
13+
14+
const ast = await parser.parse(code, options);
15+
assert('expected ast', ast);
16+
convertAst(ast as File, { parser, templates });
17+
18+
return ast;
19+
}
20+
21+
export const parsers: Record<string, Parser<NodeType>> = {
22+
[PARSER_NAME]: {
23+
...parser,
24+
astFormat: PRINTER_NAME,
25+
parse,
26+
},
27+
};
Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@ import traverse from '@babel/traverse';
22
import type {
33
BlockStatement,
44
File,
5-
Node,
65
ObjectExpression,
76
StaticBlock,
87
} from '@babel/types';
98
import type { Parser } from 'prettier';
10-
import { parsers as babelParsers } from 'prettier/plugins/babel.js';
119

12-
import { PRINTER_NAME } from '../config.js';
13-
import type { Options } from '../options.js';
14-
import { assert } from '../utils/assert.js';
15-
import { preprocess, type Template } from './preprocess.js';
10+
import type { NodeType } from '../utils/index.js';
11+
import type { Template } from './preprocess.js';
1612

17-
const typescript = babelParsers['babel-ts'] as Parser<Node | undefined>;
13+
type Data = {
14+
parser: Parser<NodeType>;
15+
templates: Template[];
16+
};
1817

1918
/** Converts a node into a GlimmerTemplate node */
2019
function convertNode(
@@ -49,7 +48,9 @@ function findCorrectCommentBlockIndex(
4948
}
5049

5150
/** Traverses the AST and replaces the transformed template parts with other AST */
52-
function convertAst(ast: File, templates: Template[]): void {
51+
export function convertAst(ast: File, data: Data): void {
52+
const { parser, templates } = data;
53+
5354
traverse(ast, {
5455
enter(path) {
5556
if (templates.length === 0) {
@@ -62,10 +63,7 @@ function convertAst(ast: File, templates: Template[]): void {
6263
case 'BlockStatement':
6364
case 'ObjectExpression':
6465
case 'StaticBlock': {
65-
const [start, end] = [
66-
typescript.locStart(node),
67-
typescript.locEnd(node),
68-
];
66+
const [start, end] = [parser.locStart(node), parser.locEnd(node)];
6967

7068
const templateIndex = templates.findIndex((template) => {
7169
const { utf16Range } = template;
@@ -119,18 +117,3 @@ function convertAst(ast: File, templates: Template[]): void {
119117
);
120118
}
121119
}
122-
123-
export const parser: Parser<Node | undefined> = {
124-
...typescript,
125-
astFormat: PRINTER_NAME,
126-
127-
async parse(code: string, options: Options): Promise<Node> {
128-
const preprocessed = preprocess(code, options.filepath);
129-
130-
const ast = await typescript.parse(preprocessed.code, options);
131-
assert('expected ast', ast);
132-
convertAst(ast as File, preprocessed.templates);
133-
134-
return ast;
135-
},
136-
};

src/parsers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { convertAst } from './convert-ast.js';
2+
export { preprocess } from './preprocess.js';

0 commit comments

Comments
 (0)