Skip to content

Commit 3517afc

Browse files
Ensuring plugins options defined in config files can override default options
1 parent 7375b81 commit 3517afc

5 files changed

+56
-51
lines changed

src/bin.ts

+15-11
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ const makeBin = (): Bin => {
139139
.action(async (options, files) => {
140140
const { run } = await import("./index.js");
141141
const baseOptions = await normalizeOptions(options, files);
142-
const pluginsOptions = {};
143-
return run(baseOptions, pluginsOptions);
142+
const pluginsDefaultOptions = {};
143+
const pluginsCustomOptions = {};
144+
return run(baseOptions, pluginsDefaultOptions, pluginsCustomOptions);
144145
})
145146
);
146147
};
@@ -151,7 +152,7 @@ const makePluggableBin = async (): Promise<Bin> => {
151152
const argv = process.argv.slice(2);
152153
const args = parseArgv(argv);
153154
const formatOptions = normalizeFormatOptions(args);
154-
const pluginsStaticOptions: PluginsOptions = {};
155+
const pluginsDefaultOptions: PluginsOptions = {};
155156
const pluginsNames = formatOptions.plugins || [];
156157
const optionsNames: string[] = [];
157158

@@ -161,7 +162,7 @@ const makePluggableBin = async (): Promise<Bin> => {
161162

162163
for (const option in plugin.options) {
163164
optionsNames.push(option);
164-
Object.assign(pluginsStaticOptions, plugin.defaultOptions);
165+
Object.assign(pluginsDefaultOptions, plugin.defaultOptions);
165166

166167
const schema = plugin.options[option];
167168
const type = schema.type;
@@ -177,34 +178,37 @@ const makePluggableBin = async (): Promise<Bin> => {
177178
const description = `${descriptionInfo}\n${descriptionDefault}`.trim();
178179
const variadic = !!schema.array;
179180
const args = variadic ? "<int...>" : "<int>";
180-
bin = bin.option(`--${toKebabCase(option)} ${args}`, description, { deprecated, section, default: initial });
181+
pluginsDefaultOptions[option] = initial;
182+
bin = bin.option(`--${toKebabCase(option)} ${args}`, description, { deprecated, section });
181183
} else if (type === "boolean") {
182184
//TODO: Support schema.array
183185
const descriptionDefault = initial ? 'Defaults to "true"' : 'Defaults to "false"';
184186
const description = `${descriptionInfo}\n${descriptionDefault}`.trim();
185-
bin = bin.option(`--${toKebabCase(option)}`, description, { deprecated, section, default: initial });
187+
pluginsDefaultOptions[option] = initial;
188+
bin = bin.option(`--${toKebabCase(option)}`, description, { deprecated, section });
186189
} else if (type === "string" || type === "path") {
187190
const descriptionDefault = initial ? `Defaults to "${initial}"` : "";
188191
const description = `${descriptionInfo}\n${descriptionDefault}`.trim();
189192
const variadic = !!schema.array;
190193
const args = variadic ? "<value...>" : "<value>";
191-
bin = bin.option(`--${toKebabCase(option)} ${args}`, description, { deprecated, section, default: initial });
194+
pluginsDefaultOptions[option] = initial;
195+
bin = bin.option(`--${toKebabCase(option)} ${args}`, description, { deprecated, section });
192196
} else if (type === "choice") {
193197
const descriptionDefault = initial ? `Defaults to "${initial}"` : "";
194198
const description = `${descriptionInfo}\n${descriptionDefault}`.trim();
195199
const values = schema.choices.map((choice) => choice.value);
196200
const args = values.length ? `<${values.join("|")}>` : "<value>";
197-
bin = bin.option(`--${toKebabCase(option)} ${args}`, description, { deprecated, section, default: initial });
201+
pluginsDefaultOptions[option] = initial;
202+
bin = bin.option(`--${toKebabCase(option)} ${args}`, description, { deprecated, section });
198203
}
199204
}
200205
}
201206

202207
bin = bin.action(async (options, files) => {
203208
const { run } = await import("./index.js");
204209
const baseOptions = await normalizeOptions(options, files);
205-
const pluginsDynamicOptions = normalizePluginOptions(options, optionsNames);
206-
const pluginsOptions = { ...pluginsStaticOptions, ...pluginsDynamicOptions };
207-
return run(baseOptions, pluginsOptions);
210+
const pluginsCustomOptions = normalizePluginOptions(options, optionsNames);
211+
return run(baseOptions, pluginsDefaultOptions, pluginsCustomOptions);
208212
});
209213

210214
return bin;

src/index.ts

+10-10
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@ import { castArray, getExpandedFoldersPaths, getFoldersChildrenPaths, getPlugins
1515
import { fastRelativePath, isString, isUndefined, negate, pluralize, uniq } from "./utils.js";
1616
import type { FormatOptions, Options, PluginsOptions } from "./types.js";
1717

18-
async function run(options: Options, pluginsOptions): Promise<void> {
18+
async function run(options: Options, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<void> {
1919
const stdin = await getStdin();
2020
if (isString(stdin)) {
21-
return runStdin(options, pluginsOptions);
21+
return runStdin(options, pluginsDefaultOptions, pluginsCustomOptions);
2222
} else {
23-
return runGlobs(options, pluginsOptions);
23+
return runGlobs(options, pluginsDefaultOptions, pluginsCustomOptions);
2424
}
2525
}
2626

27-
async function runStdin(options: Options, pluginsOptions: PluginsOptions): Promise<void> {
27+
async function runStdin(options: Options, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<void> {
2828
const logger = new Logger(options.logLevel);
2929
const prettier = await import("./prettier_serial.js");
3030

3131
const fileName = options.stdinFilepath || "stdin";
3232
const fileContent = (await getStdin()) || "";
3333

3434
try {
35-
const formatted = await prettier.format(fileName, fileContent, options.formatOptions, options.contextOptions, pluginsOptions);
35+
const formatted = await prettier.format(fileName, fileContent, options.formatOptions, options.contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
3636
logger.always(formatted);
3737
process.exitCode = options.check && formatted !== fileContent ? 1 : 0;
3838
} catch (error) {
@@ -41,7 +41,7 @@ async function runStdin(options: Options, pluginsOptions: PluginsOptions): Promi
4141
}
4242
}
4343

44-
async function runGlobs(options: Options, pluginsOptions: PluginsOptions): Promise<void> {
44+
async function runGlobs(options: Options, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<void> {
4545
const logger = new Logger(options.logLevel);
4646
const spinner = options.check ? logger.spinner.log() : undefined;
4747

@@ -93,7 +93,7 @@ async function runGlobs(options: Options, pluginsOptions: PluginsOptions): Promi
9393

9494
const cliContextConfig = options.contextOptions;
9595
const cliFormatConfig = options.formatOptions;
96-
const cacheVersion = stringify({ prettierVersion, cliVersion, pluginsNames, pluginsVersions, editorConfigs, ignoreContents, prettierConfigs, ignoreManualFilesPaths, ignoreManualFilesContents, prettierManualFilesPaths, prettierManualFilesContents, cliContextConfig, cliFormatConfig, pluginsOptions }); // prettier-ignore
96+
const cacheVersion = stringify({ prettierVersion, cliVersion, pluginsNames, pluginsVersions, editorConfigs, ignoreContents, prettierConfigs, ignoreManualFilesPaths, ignoreManualFilesContents, prettierManualFilesPaths, prettierManualFilesContents, cliContextConfig, cliFormatConfig, pluginsDefaultOptions, pluginsCustomOptions }); // prettier-ignore
9797

9898
const shouldCache = isUndefined(cliContextConfig.cursorOffset);
9999
const cache = shouldCache ? new Cache(cacheVersion, projectPath, options, logger) : undefined;
@@ -114,11 +114,11 @@ async function runGlobs(options: Options, pluginsOptions: PluginsOptions): Promi
114114
};
115115
try {
116116
if (options.check || options.list) {
117-
return await prettier.checkWithPath(filePath, getFormatOptions, cliContextConfig, pluginsOptions);
117+
return await prettier.checkWithPath(filePath, getFormatOptions, cliContextConfig, pluginsDefaultOptions, pluginsCustomOptions);
118118
} else if (options.write) {
119-
return await prettier.writeWithPath(filePath, getFormatOptions, cliContextConfig, pluginsOptions);
119+
return await prettier.writeWithPath(filePath, getFormatOptions, cliContextConfig, pluginsDefaultOptions, pluginsCustomOptions);
120120
} else {
121-
return await prettier.formatWithPath(filePath, getFormatOptions, cliContextConfig, pluginsOptions);
121+
return await prettier.formatWithPath(filePath, getFormatOptions, cliContextConfig, pluginsDefaultOptions, pluginsCustomOptions);
122122
}
123123
} finally {
124124
spinner?.update(fastRelativePath(rootPath, filePath));

src/prettier_cached.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ function makeCached(options: Options, cache: Cache, prettier: Prettier): Prettie
99
format: prettier.format,
1010
write: prettier.write,
1111

12-
async checkWithPath(filePath, formatOptions, contextOptions, pluginsOptions) {
12+
async checkWithPath(filePath, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
1313
const data = await cache.get(filePath);
1414
if (isBoolean(data?.formatted)) return data.formatted;
1515
const fileContent = data?.content?.toString() ?? (await readFile(filePath, "utf8"));
16-
const formatted = await prettier.check(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
16+
const formatted = await prettier.check(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
1717
await data?.save(formatted, fileContent);
1818
return formatted;
1919
},
2020

21-
async formatWithPath(filePath, formatOptions, contextOptions, pluginsOptions) {
21+
async formatWithPath(filePath, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
2222
const data = await cache.get(filePath);
2323
const fileContent = data?.content?.toString() ?? (await readFile(filePath, "utf8"));
2424
if (data?.formatted) return fileContent;
25-
const fileContentFormatted = await prettier.format(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
25+
const fileContentFormatted = await prettier.format(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
2626
if (fileContent === fileContentFormatted) {
2727
await data?.save(true, fileContent);
2828
return fileContent;
@@ -32,11 +32,11 @@ function makeCached(options: Options, cache: Cache, prettier: Prettier): Prettie
3232
}
3333
},
3434

35-
async writeWithPath(filePath, formatOptions, contextOptions, pluginsOptions) {
35+
async writeWithPath(filePath, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
3636
const data = await cache.get(filePath);
3737
if (data?.formatted) return true;
3838
const fileContent = data?.content?.toString() ?? (await readFile(filePath, "utf8"));
39-
const fileContentFormatted = await prettier.format(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
39+
const fileContentFormatted = await prettier.format(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
4040
if (fileContent === fileContentFormatted) {
4141
await data?.save(true, fileContent);
4242
return true;

src/prettier_parallel.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ function makeParallel(options: Options): Prettier {
1212
});
1313

1414
return {
15-
async check(filePath, fileContent, formatOptions, contextOptions, pluginsOptions) {
16-
return pool.exec("check", [filePath, fileContent, await resolve(formatOptions), contextOptions, pluginsOptions]);
15+
async check(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
16+
return pool.exec("check", [filePath, fileContent, await resolve(formatOptions), contextOptions, pluginsDefaultOptions, pluginsCustomOptions]);
1717
},
18-
async checkWithPath(filePath, formatOptions, contextOptions, pluginsOptions) {
19-
return pool.exec("checkWithPath", [filePath, await resolve(formatOptions), contextOptions, pluginsOptions]);
18+
async checkWithPath(filePath, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
19+
return pool.exec("checkWithPath", [filePath, await resolve(formatOptions), contextOptions, pluginsDefaultOptions, pluginsCustomOptions]);
2020
},
21-
async format(filePath, fileContent, formatOptions, contextOptions, pluginsOptions) {
22-
return pool.exec("format", [filePath, fileContent, await resolve(formatOptions), contextOptions, pluginsOptions]);
21+
async format(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
22+
return pool.exec("format", [filePath, fileContent, await resolve(formatOptions), contextOptions, pluginsDefaultOptions, pluginsCustomOptions]);
2323
},
24-
async formatWithPath(filePath, formatOptions, contextOptions, pluginsOptions) {
25-
return pool.exec("formatWithPath", [filePath, await resolve(formatOptions), contextOptions, pluginsOptions]);
24+
async formatWithPath(filePath, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
25+
return pool.exec("formatWithPath", [filePath, await resolve(formatOptions), contextOptions, pluginsDefaultOptions, pluginsCustomOptions]);
2626
},
27-
async write(filePath, fileContent, formatOptions, contextOptions, pluginsOptions) {
28-
return pool.exec("write", [filePath, fileContent, await resolve(formatOptions), contextOptions, pluginsOptions]);
27+
async write(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
28+
return pool.exec("write", [filePath, fileContent, await resolve(formatOptions), contextOptions, pluginsDefaultOptions, pluginsCustomOptions]);
2929
},
30-
async writeWithPath(filePath, formatOptions, contextOptions, pluginsOptions) {
31-
return pool.exec("writeWithPath", [filePath, await resolve(formatOptions), contextOptions, pluginsOptions]);
30+
async writeWithPath(filePath, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions) {
31+
return pool.exec("writeWithPath", [filePath, await resolve(formatOptions), contextOptions, pluginsDefaultOptions, pluginsCustomOptions]);
3232
},
3333
};
3434
}

src/prettier_serial.ts

+13-12
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,25 @@ import prettier from "prettier/standalone";
44
import { getPlugins, getPluginsBuiltin, resolve } from "./utils.js";
55
import type { ContextOptions, LazyFormatOptions, PluginsOptions } from "./types.js";
66

7-
async function check(filePath: string, fileContent: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsOptions: PluginsOptions ): Promise<boolean> {
8-
const fileContentFormatted = await format(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
7+
async function check(filePath: string, fileContent: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions ): Promise<boolean> {
8+
const fileContentFormatted = await format(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
99
return fileContent === fileContentFormatted;
1010
}
1111

12-
async function checkWithPath(filePath: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsOptions: PluginsOptions): Promise<boolean> {
12+
async function checkWithPath(filePath: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<boolean> {
1313
const fileContent = await readFile(filePath, "utf8");
14-
return check(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
14+
return check(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
1515
}
1616

17-
async function format(filePath: string, fileContent: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsOptions: PluginsOptions): Promise<string> {
17+
async function format(filePath: string, fileContent: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<string> {
1818
formatOptions = await resolve(formatOptions);
1919
const pluginsBuiltin = await getPluginsBuiltin();
2020
const plugins = await getPlugins(formatOptions.plugins || []);
2121

2222
const options = {
23+
...pluginsDefaultOptions,
2324
...formatOptions,
24-
...pluginsOptions,
25+
...pluginsCustomOptions,
2526
...contextOptions,
2627
filepath: filePath,
2728
plugins: [
@@ -39,21 +40,21 @@ async function format(filePath: string, fileContent: string, formatOptions: Lazy
3940
return result.formatted;
4041
}
4142

42-
async function formatWithPath(filePath: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsOptions: PluginsOptions): Promise<string> {
43+
async function formatWithPath(filePath: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<string> {
4344
const fileContent = await readFile(filePath, "utf8");
44-
return format(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
45+
return format(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
4546
}
4647

47-
async function write(filePath: string, fileContent: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsOptions: PluginsOptions): Promise<boolean> {
48-
const fileContentFormatted = await format(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
48+
async function write(filePath: string, fileContent: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<boolean> {
49+
const fileContentFormatted = await format(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
4950
if (fileContent === fileContentFormatted) return true;
5051
await writeFile(filePath, fileContentFormatted, "utf8");
5152
return false;
5253
}
5354

54-
async function writeWithPath(filePath: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsOptions: PluginsOptions): Promise<boolean> {
55+
async function writeWithPath(filePath: string, formatOptions: LazyFormatOptions, contextOptions: ContextOptions, pluginsDefaultOptions: PluginsOptions, pluginsCustomOptions: PluginsOptions): Promise<boolean> {
5556
const fileContent = await readFile(filePath, "utf8");
56-
return write(filePath, fileContent, formatOptions, contextOptions, pluginsOptions);
57+
return write(filePath, fileContent, formatOptions, contextOptions, pluginsDefaultOptions, pluginsCustomOptions);
5758
}
5859

5960
export { check, checkWithPath, format, formatWithPath, write, writeWithPath };

0 commit comments

Comments
 (0)