Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions @types/prettier/plugins/estree.d.ts

This file was deleted.

1 change: 0 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ const customRules = {
rules: {
'jsdoc/check-param-names': 'off',
'jsdoc/newline-after-description': 'off',
'jsdoc/require-jsdoc': ['error', { publicOnly: true }],
'jsdoc/require-param': 'off',
'jsdoc/require-param-type': 'off',
'jsdoc/require-returns': 'off',
Expand Down
6 changes: 0 additions & 6 deletions src/config.ts

This file was deleted.

22 changes: 22 additions & 0 deletions src/languages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type { SupportLanguage } from 'prettier';

import { PARSER_NAME } from './utils/index.js';

export const languages: SupportLanguage[] = [
{
aliases: ['gjs', 'glimmer-js'],
extensions: ['.gjs'],
group: 'JavaScript',
name: 'Ember Template Tag (gjs)',
parsers: [PARSER_NAME],
vscodeLanguageIds: ['glimmer-js'],
},
{
aliases: ['gts', 'glimmer-ts'],
extensions: ['.gts'],
group: 'TypeScript',
name: 'Ember Template Tag (gts)',
parsers: [PARSER_NAME],
vscodeLanguageIds: ['glimmer-ts'],
},
];
47 changes: 4 additions & 43 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,4 @@
import type { Node } from '@babel/types';
import type { Parser, Plugin, Printer, SupportLanguage } from 'prettier';

import { PARSER_NAME, PRINTER_NAME } from './config.js';
import { options } from './options.js';
import { parser } from './parse/index.js';
import { printer } from './print/index.js';

const languages: SupportLanguage[] = [
{
name: 'Ember Template Tag (gjs)',
aliases: ['gjs', 'glimmer-js'],
extensions: ['.gjs'],
vscodeLanguageIds: ['glimmer-js'],
parsers: [PARSER_NAME],
group: 'JavaScript',
},
{
name: 'Ember Template Tag (gts)',
aliases: ['gts', 'glimmer-ts'],
extensions: ['.gts'],
vscodeLanguageIds: ['glimmer-ts'],
parsers: [PARSER_NAME],
group: 'TypeScript',
},
];

const parsers: Record<string, Parser<Node | undefined>> = {
[PARSER_NAME]: parser,
};

const printers: Record<string, Printer<Node | undefined>> = {
[PRINTER_NAME]: printer,
};

const plugin: Plugin<Node | undefined> = {
languages,
parsers,
printers,
options,
};

export default plugin;
export { languages } from './languages.js';
export { options } from './options.js';
export { parsers } from './parsers.js';
export { printers } from './printers.js';
20 changes: 4 additions & 16 deletions src/options.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,28 @@
import type { Node } from '@babel/types';
import type {
BooleanSupportOption,
ParserOptions,
SupportOptions,
} from 'prettier';

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

const templateExportDefault: BooleanSupportOption = {
category: 'Format',
type: 'boolean',
default: false,
description:
'Prepend default export template tags with "export default". Since 0.1.0.',
type: 'boolean',
};

/**
* Extracts a valid `templateSingleQuote` option out of the provided options. If
* `templateSingleQuote` is defined, it will be used, otherwise the value for
* `singleQuote` will be inherited.
*/
export function getTemplateSingleQuote(options: Options): boolean {
const { singleQuote, templateSingleQuote } = options;
return typeof templateSingleQuote === 'boolean'
? templateSingleQuote
: singleQuote;
}

const templateSingleQuote: BooleanSupportOption = {
category: 'Format',
type: 'boolean',
description:
'Use single quotes instead of double quotes within template tags. Since 0.0.3.',
type: 'boolean',
};

export const options: SupportOptions = {
Expand Down
27 changes: 27 additions & 0 deletions src/parsers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import type { File } from '@babel/types';
import type { Parser, ParserOptions } from 'prettier';
import { parsers as prettierParsers } from 'prettier/plugins/babel';

import { convertAst, preprocess } from './parsers/index.js';
import { assert } from './utils/assert.js';
import { type NodeType, PARSER_NAME, PRINTER_NAME } from './utils/index.js';

const parser = prettierParsers['babel-ts'] as Parser<NodeType>;

async function parse(text: string, options: ParserOptions<NodeType>) {
const { code, templates } = preprocess(text, options.filepath);

const ast = await parser.parse(code, options);
assert('expected ast', ast);
convertAst(ast as File, { parser, templates });

return ast;
}

export const parsers: Record<string, Parser<NodeType>> = {
[PARSER_NAME]: {
...parser,
astFormat: PRINTER_NAME,
parse,
},
};
37 changes: 10 additions & 27 deletions src/parse/index.ts → src/parsers/convert-ast.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@ import traverse from '@babel/traverse';
import type {
BlockStatement,
File,
Node,
ObjectExpression,
StaticBlock,
} from '@babel/types';
import type { Parser } from 'prettier';
import { parsers as babelParsers } from 'prettier/plugins/babel.js';

import { PRINTER_NAME } from '../config.js';
import type { Options } from '../options.js';
import { assert } from '../utils/assert.js';
import { preprocess, type Template } from './preprocess.js';
import type { NodeType } from '../utils/index.js';
import type { Template } from './preprocess.js';

const typescript = babelParsers['babel-ts'] as Parser<Node | undefined>;
type Data = {
parser: Parser<NodeType>;
templates: Template[];
};

/** Converts a node into a GlimmerTemplate node */
function convertNode(
Expand Down Expand Up @@ -49,7 +48,9 @@ function findCorrectCommentBlockIndex(
}

/** Traverses the AST and replaces the transformed template parts with other AST */
function convertAst(ast: File, templates: Template[]): void {
export function convertAst(ast: File, data: Data): void {
const { parser, templates } = data;

traverse(ast, {
enter(path) {
if (templates.length === 0) {
Expand All @@ -62,10 +63,7 @@ function convertAst(ast: File, templates: Template[]): void {
case 'BlockStatement':
case 'ObjectExpression':
case 'StaticBlock': {
const [start, end] = [
typescript.locStart(node),
typescript.locEnd(node),
];
const [start, end] = [parser.locStart(node), parser.locEnd(node)];

const templateIndex = templates.findIndex((template) => {
const { utf16Range } = template;
Expand Down Expand Up @@ -119,18 +117,3 @@ function convertAst(ast: File, templates: Template[]): void {
);
}
}

export const parser: Parser<Node | undefined> = {
...typescript,
astFormat: PRINTER_NAME,

async parse(code: string, options: Options): Promise<Node> {
const preprocessed = preprocess(code, options.filepath);

const ast = await typescript.parse(preprocessed.code, options);
assert('expected ast', ast);
convertAst(ast as File, preprocessed.templates);

return ast;
},
};
2 changes: 2 additions & 0 deletions src/parsers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { convertAst } from './convert-ast.js';
export { preprocess } from './preprocess.js';
File renamed without changes.
49 changes: 0 additions & 49 deletions src/print/ambiguity.ts

This file was deleted.

Loading