Skip to content

Commit f666488

Browse files
authored
Resolve Prettier options from packageFolder option (#81)
1 parent f763016 commit f666488

File tree

107 files changed

+9350
-11400
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+9350
-11400
lines changed

.changeset/wild-years-visit.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@codama/renderers-js': patch
3+
---
4+
5+
Resolve Prettier options from packageFolder option

src/utils/formatCode.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { mapRenderMapContentAsync, RenderMap } from '@codama/renderers-core';
2+
import { format, Plugin, resolveConfig } from 'prettier';
3+
import * as estreePlugin from 'prettier/plugins/estree';
4+
import * as typeScriptPlugin from 'prettier/plugins/typescript';
5+
6+
import { Fragment } from './fragment';
7+
import { RenderOptions } from './options';
8+
9+
export type PrettierOptions = Parameters<typeof format>[1];
10+
11+
const DEFAULT_PRETTIER_OPTIONS: PrettierOptions = {
12+
arrowParens: 'always',
13+
parser: 'typescript',
14+
plugins: [estreePlugin as Plugin<unknown>, typeScriptPlugin],
15+
printWidth: 80,
16+
semi: true,
17+
singleQuote: true,
18+
tabWidth: 2,
19+
trailingComma: 'es5',
20+
useTabs: false,
21+
};
22+
23+
export async function formatCode(
24+
renderMap: RenderMap<Fragment>,
25+
options: Pick<RenderOptions, 'formatCode' | 'packageFolder' | 'prettierOptions'>,
26+
): Promise<RenderMap<Fragment>> {
27+
const shouldFormatCode = options.formatCode ?? true;
28+
if (!shouldFormatCode) return renderMap;
29+
30+
const prettierOptions: PrettierOptions = {
31+
...DEFAULT_PRETTIER_OPTIONS,
32+
...(await resolvePrettierOptions(options.packageFolder)),
33+
...options.prettierOptions,
34+
};
35+
36+
return await mapRenderMapContentAsync(renderMap, code => format(code, prettierOptions));
37+
}
38+
39+
async function resolvePrettierOptions(packageFolder: string | undefined): Promise<PrettierOptions | null> {
40+
if (!__NODEJS__) {
41+
// In a non-NodeJS environment, we cannot load config files.
42+
return null;
43+
}
44+
45+
if (!packageFolder) return null;
46+
return await resolveConfig(packageFolder);
47+
}

src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export * from './async';
22
export * from './codecs';
33
export * from './customData';
4+
export * from './formatCode';
45
export * from './fragment';
56
export * from './importMap';
67
export * from './linkOverrides';

src/utils/options.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import type { CamelCaseString } from '@codama/nodes';
22
import type { LinkableDictionary } from '@codama/visitors-core';
3-
import type { format } from 'prettier/standalone';
43

54
import type { TypeManifestVisitor } from '../visitors';
65
import type { CustomDataOptions, ParsedCustomDataOptions } from './customData';
6+
import { PrettierOptions } from './formatCode';
77
import type { GetImportFromFunction, LinkOverrides } from './linkOverrides';
88
import type { NameApi, NameTransformers } from './nameTransformers';
99

10-
type PrettierOptions = Parameters<typeof format>[1];
11-
1210
export type RenderOptions = GetRenderMapOptions & {
1311
deleteFolderBeforeRendering?: boolean;
1412
formatCode?: boolean;

src/visitors/renderVisitor.ts

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,9 @@
1-
import { deleteDirectory, mapRenderMapContentAsync, writeRenderMap } from '@codama/renderers-core';
1+
import { deleteDirectory, writeRenderMap } from '@codama/renderers-core';
22
import { rootNodeVisitor, visit } from '@codama/visitors-core';
3-
import { Plugin } from 'prettier';
4-
import * as estreePlugin from 'prettier/plugins/estree';
5-
import * as typeScriptPlugin from 'prettier/plugins/typescript';
6-
import { format } from 'prettier/standalone';
73

8-
import { RenderOptions, syncPackageJson } from '../utils';
4+
import { formatCode, RenderOptions, syncPackageJson } from '../utils';
95
import { getRenderMapVisitor } from './getRenderMapVisitor';
106

11-
type PrettierOptions = Parameters<typeof format>[1];
12-
13-
const DEFAULT_PRETTIER_OPTIONS: PrettierOptions = {
14-
arrowParens: 'always',
15-
parser: 'typescript',
16-
plugins: [estreePlugin as Plugin<unknown>, typeScriptPlugin],
17-
printWidth: 80,
18-
semi: true,
19-
singleQuote: true,
20-
tabWidth: 2,
21-
trailingComma: 'es5',
22-
useTabs: false,
23-
};
24-
257
export function renderVisitor(path: string, options: RenderOptions = {}) {
268
return rootNodeVisitor(async root => {
279
// Delete existing generated folder.
@@ -32,15 +14,13 @@ export function renderVisitor(path: string, options: RenderOptions = {}) {
3214
// Render the new files.
3315
let renderMap = visit(root, getRenderMapVisitor(options));
3416

35-
// Format the code.
36-
if (options.formatCode ?? true) {
37-
const prettierOptions = { ...DEFAULT_PRETTIER_OPTIONS, ...options.prettierOptions };
38-
renderMap = await mapRenderMapContentAsync(renderMap, code => format(code, prettierOptions));
39-
}
17+
// Format the code, if requested.
18+
renderMap = await formatCode(renderMap, options);
4019

4120
// Create or update package.json dependencies, if requested.
4221
syncPackageJson(renderMap, options);
4322

23+
// Write the rendered files to the output directory.
4424
writeRenderMap(renderMap, path);
4525
});
4626
}

test/e2e/anchor/.prettierrc.json

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

test/e2e/anchor/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
"lint": "eslint --ext js,ts,tsx src && prettier --check src test",
1111
"lint:fix": "eslint --fix --ext js,ts,tsx src && prettier --write src test"
1212
},
13+
"dependencies": {
14+
"@solana/kit": "^5.0.0"
15+
},
1316
"license": "MIT",
1417
"ava": {
1518
"typescript": {
@@ -18,6 +21,5 @@
1821
"test/": "dist/test/"
1922
}
2023
}
21-
},
22-
"packageManager": "pnpm@9.1.0"
24+
}
2325
}

0 commit comments

Comments
 (0)