@standard-config/prettier 1.9.1 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +0 -4
- package/README.md +3 -4
- package/dist/index.mjs +16 -34
- package/dist/index.mjs.map +1 -1
- package/package.json +20 -23
package/.editorconfig
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
[](https://www.npmjs.com/package/@standard-config/prettier)
|
|
2
|
-
[](https://github.com/standard-config/prettier/actions/workflows/test.yaml)
|
|
3
|
-
[](https://codecov.io/github/standard-config/prettier)
|
|
1
|
+
[](https://www.npmjs.com/package/@standard-config/prettier) [](https://github.com/standard-config/prettier/actions/workflows/test.yaml) [](https://codecov.io/github/standard-config/prettier)
|
|
4
2
|
|
|
5
3
|
# @standard-config/prettier
|
|
6
4
|
|
|
@@ -9,7 +7,7 @@ TypeScript-first Prettier config with carefully considered details.
|
|
|
9
7
|
- Uses the [`oxc` parser](https://oxc.rs/docs/guide/usage/parser.html) for lightning-fast TypeScript and JavaScript formatting.
|
|
10
8
|
- Formats shell scripts out of the box, including `git` hook files.
|
|
11
9
|
- Formats HTML fragments in `README.md` and any other GitHub-Flavored Markdown document.
|
|
12
|
-
- Sorts all JSON files, with curated order patterns for common
|
|
10
|
+
- Sorts all JSON files, with curated order patterns for common config files like `package.json`, `tsconfig.json`, and more.
|
|
13
11
|
|
|
14
12
|
## Install
|
|
15
13
|
|
|
@@ -52,6 +50,7 @@ ln -s node_modules/@standard-config/prettier/.editorconfig
|
|
|
52
50
|
## Related
|
|
53
51
|
|
|
54
52
|
- [**@standard-config/oxlint**](https://github.com/standard-config/oxlint)
|
|
53
|
+
- [**@standard-config/tsconfig**](https://github.com/standard-config/tsconfig)
|
|
55
54
|
- [**prettier-plugin-expand-json**](https://github.com/porada/prettier-plugin-expand-json)
|
|
56
55
|
- [**prettier-plugin-markdown-html**](https://github.com/porada/prettier-plugin-markdown-html)
|
|
57
56
|
- [**prettier-plugin-yaml**](https://github.com/porada/prettier-plugin-yaml)
|
package/dist/index.mjs
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import defineClone from "rfdc";
|
|
2
1
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
|
|
4
2
|
//#region src/clone/index.ts
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
function clone(value) {
|
|
4
|
+
try {
|
|
5
|
+
value = structuredClone(value);
|
|
6
|
+
} catch {}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
7
9
|
//#endregion
|
|
8
10
|
//#region src/generate-config/index.ts
|
|
9
11
|
/**
|
|
@@ -20,10 +22,9 @@ var clone_default = defineClone({ circles: true });
|
|
|
20
22
|
function generateConfig(baseDefaults = {}, shellDefaults = {}) {
|
|
21
23
|
const { tabWidth = 4, useTabs = true } = baseDefaults;
|
|
22
24
|
const { shellTabWidth = 2, shellUseTabs = false } = shellDefaults;
|
|
23
|
-
return
|
|
25
|
+
return clone({
|
|
24
26
|
plugins: [
|
|
25
27
|
"@prettier/plugin-oxc",
|
|
26
|
-
"@prettier/plugin-xml",
|
|
27
28
|
"prettier-plugin-expand-json",
|
|
28
29
|
"prettier-plugin-markdown-html",
|
|
29
30
|
"prettier-plugin-sh",
|
|
@@ -120,6 +121,7 @@ function getFileTypeOverrides(baseDefaults = {}, shellDefaults = {}) {
|
|
|
120
121
|
files: ["*.md", "*.mdx"],
|
|
121
122
|
options: {
|
|
122
123
|
...baseDefaults,
|
|
124
|
+
proseWrap: "never",
|
|
123
125
|
useTabs: false
|
|
124
126
|
}
|
|
125
127
|
}),
|
|
@@ -146,21 +148,6 @@ function getFileTypeOverrides(baseDefaults = {}, shellDefaults = {}) {
|
|
|
146
148
|
parser: "oxc-ts"
|
|
147
149
|
}
|
|
148
150
|
},
|
|
149
|
-
{
|
|
150
|
-
files: [
|
|
151
|
-
"*.xml",
|
|
152
|
-
"*.plist",
|
|
153
|
-
"*.svg"
|
|
154
|
-
],
|
|
155
|
-
options: {
|
|
156
|
-
...baseDefaults,
|
|
157
|
-
parser: "xml",
|
|
158
|
-
printWidth: 80,
|
|
159
|
-
singleAttributePerLine: true,
|
|
160
|
-
xmlQuoteAttributes: "double",
|
|
161
|
-
xmlWhitespaceSensitivity: "ignore"
|
|
162
|
-
}
|
|
163
|
-
},
|
|
164
151
|
{
|
|
165
152
|
files: ["*.yaml", "*.yml"],
|
|
166
153
|
options: {
|
|
@@ -225,7 +212,7 @@ function getFileNameOverrides() {
|
|
|
225
212
|
{
|
|
226
213
|
files: ["package.json"],
|
|
227
214
|
options: {
|
|
228
|
-
plugins: ["prettier-plugin-
|
|
215
|
+
plugins: ["prettier-plugin-pkg", "prettier-plugin-expand-json"],
|
|
229
216
|
packageSortOrder: [
|
|
230
217
|
"$schema",
|
|
231
218
|
"name",
|
|
@@ -320,7 +307,6 @@ function getFileNameOverrides() {
|
|
|
320
307
|
}
|
|
321
308
|
];
|
|
322
309
|
}
|
|
323
|
-
|
|
324
310
|
//#endregion
|
|
325
311
|
//#region src/merge-config/index.ts
|
|
326
312
|
/**
|
|
@@ -328,17 +314,17 @@ function getFileNameOverrides() {
|
|
|
328
314
|
*/
|
|
329
315
|
function mergeConfig(baseConfig, extensionConfig) {
|
|
330
316
|
if (!(isObject(baseConfig) && isObject(extensionConfig))) throw new TypeError("Standard Config error: expected config to be an object");
|
|
331
|
-
const result =
|
|
332
|
-
for (const [key, value] of Object.entries(
|
|
317
|
+
const result = clone(baseConfig);
|
|
318
|
+
for (const [key, value] of Object.entries(extensionConfig)) {
|
|
333
319
|
if (value === void 0 || value === null) {
|
|
334
320
|
delete result[key];
|
|
335
321
|
continue;
|
|
336
322
|
}
|
|
337
323
|
if (isArray(value) && isArray(result[key])) {
|
|
338
|
-
result[key] = [...result[key], ...value];
|
|
324
|
+
result[key] = [...result[key], ...clone(value)];
|
|
339
325
|
continue;
|
|
340
326
|
}
|
|
341
|
-
result[key] = value;
|
|
327
|
+
result[key] = typeof value === "object" ? clone(value) : value;
|
|
342
328
|
}
|
|
343
329
|
return result;
|
|
344
330
|
}
|
|
@@ -348,7 +334,6 @@ function isArray(value) {
|
|
|
348
334
|
function isObject(value) {
|
|
349
335
|
return typeof value === "object" && value !== null;
|
|
350
336
|
}
|
|
351
|
-
|
|
352
337
|
//#endregion
|
|
353
338
|
//#region src/prioritize-keys/index.ts
|
|
354
339
|
/**
|
|
@@ -366,14 +351,13 @@ function createExclusionKey(keys) {
|
|
|
366
351
|
const escapedGroup = keys.filter((key) => key !== "*").map((key) => key.replaceAll(/[$()*+.?[\\\]^{}|]/g, String.raw`\$&`)).join("|");
|
|
367
352
|
return escapedGroup ? new RegExp(`^(?!(?:${escapedGroup})$).*$`) : /.*/;
|
|
368
353
|
}
|
|
369
|
-
|
|
370
354
|
//#endregion
|
|
371
355
|
//#region src/transform-config/index.ts
|
|
372
356
|
/**
|
|
373
357
|
* Convert Standard Config to an exportable, Prettier-compatible format.
|
|
374
358
|
*/
|
|
375
359
|
function transformConfig(config, pluginOverrides = {}) {
|
|
376
|
-
config =
|
|
360
|
+
config = clone(config);
|
|
377
361
|
const transform = (options) => {
|
|
378
362
|
if (options.jsonSortOrder) options.jsonSortOrder = transformJSONSortOrder(options.jsonSortOrder);
|
|
379
363
|
if (options.plugins) {
|
|
@@ -394,10 +378,9 @@ function transformPlugins(plugins, pluginOverrides) {
|
|
|
394
378
|
const pluginMap = {
|
|
395
379
|
...Object.fromEntries([
|
|
396
380
|
"@prettier/plugin-oxc",
|
|
397
|
-
"@prettier/plugin-xml",
|
|
398
381
|
"prettier-plugin-expand-json",
|
|
399
382
|
"prettier-plugin-markdown-html",
|
|
400
|
-
"prettier-plugin-
|
|
383
|
+
"prettier-plugin-pkg",
|
|
401
384
|
"prettier-plugin-sh",
|
|
402
385
|
"prettier-plugin-sort-json",
|
|
403
386
|
"prettier-plugin-yaml"
|
|
@@ -419,7 +402,6 @@ function transformPlugin(plugin) {
|
|
|
419
402
|
return plugin;
|
|
420
403
|
}
|
|
421
404
|
}
|
|
422
|
-
|
|
423
405
|
//#endregion
|
|
424
406
|
//#region src/define-config/index.ts
|
|
425
407
|
/**
|
|
@@ -435,7 +417,7 @@ function defineConfig(config = {}) {
|
|
|
435
417
|
shellUseTabs
|
|
436
418
|
}), extensionConfig), pluginOverrides);
|
|
437
419
|
}
|
|
438
|
-
|
|
439
420
|
//#endregion
|
|
440
421
|
export { defineConfig, prioritizeKeys };
|
|
422
|
+
|
|
441
423
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["clone","clone","clone"],"sources":["../src/clone/index.ts","../src/generate-config/index.ts","../src/merge-config/index.ts","../src/prioritize-keys/index.ts","../src/transform-config/index.ts","../src/define-config/index.ts"],"sourcesContent":["import defineClone from 'rfdc';\n\nexport default defineClone({ circles: true });\n","import type {\n\tIndentationOptions,\n\tShellIndentationOptions,\n\tStandardConfig,\n\tStandardConfigOverrides,\n} from '../types/index.d.ts';\nimport clone from '../clone/index.ts';\n\n/**\n * Generate the base Standard Config.\n *\n * Shell scripts can’t be reliably identified by name alone—they’re recognized\n * by the shebang, not the extension. As a result, shell formatting options\n * (two-space indentation) must be defined as the global defaults.\n *\n * This requires overriding those options for other file types individually\n * with what we consider the actual defaults (`baseDefaults`). `generateConfig`\n * is a factory that encapsulates this logic and returns the final config.\n */\nexport default function generateConfig(\n\tbaseDefaults: IndentationOptions = {},\n\tshellDefaults: ShellIndentationOptions = {}\n): StandardConfig {\n\tconst { tabWidth = 4, useTabs = true } = baseDefaults;\n\tconst { shellTabWidth = 2, shellUseTabs = false } = shellDefaults;\n\n\treturn clone({\n\t\tplugins: [\n\t\t\t'@prettier/plugin-oxc',\n\t\t\t'@prettier/plugin-xml',\n\t\t\t'prettier-plugin-expand-json',\n\t\t\t'prettier-plugin-markdown-html',\n\t\t\t'prettier-plugin-sh',\n\t\t\t'prettier-plugin-yaml',\n\t\t],\n\t\tbracketSpacing: true,\n\t\tprintWidth: 80,\n\t\tquoteProps: 'consistent',\n\t\tsingleQuote: true,\n\t\ttabWidth: shellTabWidth,\n\t\ttrailingComma: 'es5',\n\t\tuseTabs: shellUseTabs,\n\t\toverrides: [\n\t\t\t...getFileTypeOverrides(\n\t\t\t\t{ tabWidth, useTabs },\n\t\t\t\t{ tabWidth: shellTabWidth, useTabs: shellUseTabs }\n\t\t\t),\n\t\t\t...getFileNameOverrides(),\n\t\t],\n\t});\n}\n\nfunction getFileTypeOverrides(\n\tbaseDefaults: IndentationOptions = {},\n\tshellDefaults: IndentationOptions = {}\n): StandardConfigOverrides {\n\treturn [\n\t\t{\n\t\t\tfiles: ['*.css', '*.scss'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tprintWidth: 100,\n\t\t\t\tsingleQuote: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.graphql', '*.graphqls', '*.gql'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.html', '*.htm'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tprintWidth: 100,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.js', '*.jsx', '*.cjs', '*.mjs'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tparser: 'oxc',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.json', '*.jsonc', '*.json5'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.json', '*.jsonc', '*.json5'],\n\t\t\texcludeFiles: ['package.json'],\n\t\t\toptions: {\n\t\t\t\tplugins: [\n\t\t\t\t\t'prettier-plugin-sort-json',\n\t\t\t\t\t'prettier-plugin-expand-json',\n\t\t\t\t],\n\t\t\t\tjsonRecursiveSort: true,\n\t\t\t\tjsonSortOrder: ['$schema'],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * Tab-based indentation becomes inconvenient when rendered outside the\n\t\t * context of a code editor. In documentation, tabs in code blocks\n\t\t * require special handling that very few renderers support.\n\t\t *\n\t\t * At the time of writing, GitHub renders tabs correctly on the web, but\n\t\t * not in its mobile app. `npm`, often the point of discovery for\n\t\t * packages, does not provide any special handling for tabs either.\n\t\t *\n\t\t * To maximize the readability of code blocks in documentation, spaces\n\t\t * are the right compromise.\n\t\t */\n\t\t{\n\t\t\tfiles: ['*.md', '*.mdx'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tuseTabs: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.md'],\n\t\t\toptions: {\n\t\t\t\thtmlFragmentPrintWidth: Number.POSITIVE_INFINITY,\n\t\t\t\thtmlFragmentSingleAttributePerLine: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.sh'],\n\t\t\toptions: {\n\t\t\t\t...shellDefaults,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.ts', '*.tsx', '*.cts', '*.mts'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tparser: 'oxc-ts',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.xml', '*.plist', '*.svg'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tparser: 'xml',\n\t\t\t\tprintWidth: 80,\n\t\t\t\tsingleAttributePerLine: true,\n\t\t\t\txmlQuoteAttributes: 'double',\n\t\t\t\txmlWhitespaceSensitivity: 'ignore',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.yaml', '*.yml'],\n\t\t\toptions: {\n\t\t\t\tuseTabs: false,\n\t\t\t\tyamlCollectionStyle: 'block',\n\t\t\t},\n\t\t},\n\t];\n}\n\nfunction getFileNameOverrides(): StandardConfigOverrides {\n\treturn [\n\t\t{\n\t\t\tfiles: [\n\t\t\t\t'.oxfmtrc.json',\n\t\t\t\t'.oxfmtrc.jsonc',\n\t\t\t\t'.oxfmtrc.*.json',\n\t\t\t\t'.oxfmtrc.*.jsonc',\n\t\t\t],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: ['$schema', '*', 'overrides'],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * All `.oxlintrc.json` fields defined by the Oxlint documentation\n\t\t * are sorted, including nested fields.\n\t\t */\n\t\t{\n\t\t\tfiles: [\n\t\t\t\t'.oxlintrc.json',\n\t\t\t\t'.oxlintrc.jsonc',\n\t\t\t\t'.oxlintrc.*.json',\n\t\t\t\t'.oxlintrc.*.jsonc',\n\t\t\t],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: [\n\t\t\t\t\t'$schema',\n\t\t\t\t\t'files',\n\t\t\t\t\t'extends',\n\t\t\t\t\t'ignorePatterns',\n\t\t\t\t\t'plugins',\n\t\t\t\t\t'jsPlugins',\n\t\t\t\t\t'categories',\n\t\t\t\t\t'env',\n\t\t\t\t\t'globals',\n\t\t\t\t\t'settings',\n\t\t\t\t\t'rules',\n\t\t\t\t\t'overrides',\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * By default, Prettier uses a different parser for `package.json`\n\t\t * files, which causes most JSON plugins to skip them entirely.\n\t\t * This override ensures `package.json` is treated (and sorted)\n\t\t * like any other `*.json` file.\n\t\t *\n\t\t * All `package.json` fields defined in the `npm@11` specification\n\t\t * are sorted, along with additional commonly used fields.\n\t\t */\n\t\t{\n\t\t\tfiles: ['package.json'],\n\t\t\toptions: {\n\t\t\t\tplugins: [\n\t\t\t\t\t'prettier-plugin-packagejson',\n\t\t\t\t\t'prettier-plugin-expand-json',\n\t\t\t\t],\n\t\t\t\tpackageSortOrder: [\n\t\t\t\t\t'$schema',\n\t\t\t\t\t'name',\n\t\t\t\t\t'version',\n\t\t\t\t\t'private',\n\t\t\t\t\t'description',\n\t\t\t\t\t'license',\n\t\t\t\t\t'author',\n\t\t\t\t\t'contributors',\n\t\t\t\t\t'funding',\n\t\t\t\t\t'homepage',\n\t\t\t\t\t'repository',\n\t\t\t\t\t'bugs',\n\t\t\t\t\t'keywords',\n\t\t\t\t\t'workspaces',\n\t\t\t\t\t'directories',\n\t\t\t\t\t'files',\n\t\t\t\t\t'type',\n\t\t\t\t\t'browser',\n\t\t\t\t\t'sideEffects',\n\t\t\t\t\t'main',\n\t\t\t\t\t'module',\n\t\t\t\t\t'exports',\n\t\t\t\t\t'types',\n\t\t\t\t\t'typesVersions',\n\t\t\t\t\t'bin',\n\t\t\t\t\t'man',\n\t\t\t\t\t'imports',\n\t\t\t\t\t'engines',\n\t\t\t\t\t'os',\n\t\t\t\t\t'cpu',\n\t\t\t\t\t'libc',\n\t\t\t\t\t'gypfile',\n\t\t\t\t\t'packageManager',\n\t\t\t\t\t'devEngines',\n\t\t\t\t\t'dependencies',\n\t\t\t\t\t'bundleDependencies',\n\t\t\t\t\t'peerDependencies',\n\t\t\t\t\t'peerDependenciesMeta',\n\t\t\t\t\t'optionalDependencies',\n\t\t\t\t\t'devDependencies',\n\t\t\t\t\t'overrides',\n\t\t\t\t\t'pnpm',\n\t\t\t\t\t'config',\n\t\t\t\t\t'publishConfig',\n\t\t\t\t\t'scripts',\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * All `tsconfig.json` fields defined by the TypeScript documentation\n\t\t * are sorted, including nested fields.\n\t\t */\n\t\t{\n\t\t\tfiles: [\n\t\t\t\t'tsconfig.json',\n\t\t\t\t'tsconfig.*.json',\n\t\t\t\t'jsconfig.json',\n\t\t\t\t'jsconfig.*.json',\n\t\t\t],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: [\n\t\t\t\t\t'$schema',\n\t\t\t\t\t'extends',\n\t\t\t\t\t'enable',\n\t\t\t\t\t'references',\n\t\t\t\t\t'compilerOptions',\n\t\t\t\t\t'typeAcquisition',\n\t\t\t\t\t'files',\n\t\t\t\t\t'include',\n\t\t\t\t\t'exclude',\n\t\t\t\t\t'watchOptions',\n\t\t\t\t\t'watchDirectory',\n\t\t\t\t\t'watchFile',\n\t\t\t\t\t'fallbackPolling',\n\t\t\t\t\t'synchronousWatchDirectory',\n\t\t\t\t\t'compileOnSave',\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['.vscode/mcp.json'],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: ['$schema', 'command'],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['.vscode/sessions.json'],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: ['$schema', 'name', 'commands', 'active'],\n\t\t\t},\n\t\t},\n\t];\n}\n","import type { StandardConfig } from '../types/index.d.ts';\nimport clone from '../clone/index.ts';\n\n/**\n * Deep-merge two Standard Config objects.\n */\nexport default function mergeConfig(\n\tbaseConfig: StandardConfig,\n\textensionConfig: StandardConfig\n): StandardConfig {\n\tif (!(isObject(baseConfig) && isObject(extensionConfig))) {\n\t\tthrow new TypeError(\n\t\t\t'Standard Config error: expected config to be an object'\n\t\t);\n\t}\n\n\tconst result = clone(baseConfig);\n\n\tfor (const [key, value] of Object.entries(clone(extensionConfig))) {\n\t\tif (value === undefined || value === null) {\n\t\t\t/* oxlint-disable-next-line typescript/no-dynamic-delete */\n\t\t\tdelete result[key];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isArray(value) && isArray(result[key])) {\n\t\t\tresult[key] = [...result[key], ...value];\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult[key] = value;\n\t}\n\n\treturn result;\n}\n\nfunction isArray(value: unknown): value is unknown[] {\n\treturn Array.isArray(value);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null;\n}\n","import type { CategorySort } from 'prettier-plugin-sort-json';\n\n/**\n * @deprecated Use an array value for the `jsonSortOrder` property instead.\n */\nexport default function prioritizeKeys(...keys: ReadonlyArray<string>): string {\n\tconst sortKeys = [...new Set(keys)];\n\n\tif (!sortKeys.includes('*')) {\n\t\tsortKeys.push('*');\n\t}\n\n\t/* oxlint-disable-next-line typescript/no-restricted-types */\n\tconst order: Record<any, CategorySort | null> = {};\n\n\tfor (const key of sortKeys) {\n\t\tif (key === '*') {\n\t\t\t/* oxlint-disable-next-line typescript/no-unsafe-member-access */\n\t\t\torder[createExclusionKey(sortKeys) as any] = 'lexical';\n\t\t} else {\n\t\t\torder[key] = null;\n\t\t}\n\t}\n\n\treturn JSON.stringify(order);\n}\n\nfunction createExclusionKey(keys: ReadonlyArray<string>) {\n\tconst escapedGroup = keys\n\t\t.filter((key) => key !== '*')\n\t\t.map((key) => key.replaceAll(/[$()*+.?[\\\\\\]^{}|]/g, String.raw`\\$&`))\n\t\t.join('|');\n\n\treturn escapedGroup ? new RegExp(`^(?!(?:${escapedGroup})$).*$`) : /.*/;\n}\n","import type { Config as PrettierConfig } from 'prettier';\nimport type {\n\tPrettierPlugins,\n\tStandardConfig,\n\tStandardConfigPluginOverrides,\n\tStandardOptions,\n} from '../types/index.d.ts';\nimport { fileURLToPath } from 'node:url';\nimport clone from '../clone/index.ts';\nimport prioritizeKeys from '../prioritize-keys/index.ts';\n\n/**\n * Convert Standard Config to an exportable, Prettier-compatible format.\n */\nexport default function transformConfig(\n\tconfig: StandardConfig,\n\tpluginOverrides: StandardConfigPluginOverrides = {}\n): PrettierConfig {\n\t/* oxlint-disable-next-line eslint/no-param-reassign */\n\tconfig = clone(config);\n\n\tconst transform = (options: StandardOptions) => {\n\t\tif (options.jsonSortOrder) {\n\t\t\toptions.jsonSortOrder = transformJSONSortOrder(\n\t\t\t\toptions.jsonSortOrder\n\t\t\t);\n\t\t}\n\n\t\tif (options.plugins) {\n\t\t\tconst plugins = transformPlugins(options.plugins, pluginOverrides);\n\n\t\t\tif (plugins.length > 0) {\n\t\t\t\toptions.plugins = plugins;\n\t\t\t} else {\n\t\t\t\tdelete options.plugins;\n\t\t\t}\n\t\t}\n\t};\n\n\ttransform(config);\n\n\tif (config.overrides) {\n\t\tfor (const override of config.overrides) {\n\t\t\ttransform(override.options);\n\t\t}\n\t}\n\n\treturn config as PrettierConfig;\n}\n\nfunction transformJSONSortOrder(jsonSortOrder: string | string[]): string {\n\tif (Array.isArray(jsonSortOrder)) {\n\t\treturn prioritizeKeys(...jsonSortOrder);\n\t}\n\n\treturn jsonSortOrder;\n}\n\nfunction transformPlugins(\n\tplugins: PrettierPlugins,\n\tpluginOverrides: StandardConfigPluginOverrides\n): PrettierPlugins {\n\tconst pluginMap: StandardConfigPluginOverrides = {\n\t\t...Object.fromEntries(\n\t\t\t[\n\t\t\t\t'@prettier/plugin-oxc',\n\t\t\t\t'@prettier/plugin-xml',\n\t\t\t\t'prettier-plugin-expand-json',\n\t\t\t\t'prettier-plugin-markdown-html',\n\t\t\t\t'prettier-plugin-packagejson',\n\t\t\t\t'prettier-plugin-sh',\n\t\t\t\t'prettier-plugin-sort-json',\n\t\t\t\t'prettier-plugin-yaml',\n\t\t\t].map((name) => [name, transformPlugin(name)])\n\t\t),\n\t\t...pluginOverrides,\n\t};\n\n\tconst resolved: PrettierPlugins = [];\n\n\tfor (const plugin of plugins) {\n\t\tconst resolvedPlugin =\n\t\t\ttypeof plugin === 'string' && Object.hasOwn(pluginMap, plugin)\n\t\t\t\t? pluginMap[plugin]\n\t\t\t\t: plugin;\n\n\t\tif (resolvedPlugin) {\n\t\t\tresolved.push(resolvedPlugin);\n\t\t}\n\t}\n\n\treturn resolved;\n}\n\nfunction transformPlugin(plugin: string): string {\n\ttry {\n\t\treturn fileURLToPath(import.meta.resolve(plugin));\n\t} catch {\n\t\t/* v8 ignore next -- @preserve */\n\t\treturn plugin;\n\t}\n}\n","import type { Config as PrettierConfig } from 'prettier';\nimport type { StandardConfig } from '../types/index.d.ts';\nimport generateConfig from '../generate-config/index.ts';\nimport mergeConfig from '../merge-config/index.ts';\nimport transformConfig from '../transform-config/index.ts';\n\n/**\n * Combine Standard Config with optional config overrides.\n */\nexport default function defineConfig(\n\tconfig: StandardConfig = {}\n): PrettierConfig {\n\tconst {\n\t\tpluginOverrides,\n\t\tshellTabWidth,\n\t\tshellUseTabs,\n\t\ttabWidth,\n\t\tuseTabs,\n\t\t...extensionConfig\n\t} = config;\n\n\tconst baseConfig = generateConfig(\n\t\t{ tabWidth, useTabs },\n\t\t{ shellTabWidth, shellUseTabs }\n\t);\n\n\tconst extendedConfig = mergeConfig(baseConfig, extensionConfig);\n\treturn transformConfig(extendedConfig, pluginOverrides);\n}\n"],"mappings":";;;;AAEA,oBAAe,YAAY,EAAE,SAAS,MAAM,CAAC;;;;;;;;;;;;;;;ACiB7C,SAAwB,eACvB,eAAmC,EAAE,EACrC,gBAAyC,EAAE,EAC1B;CACjB,MAAM,EAAE,WAAW,GAAG,UAAU,SAAS;CACzC,MAAM,EAAE,gBAAgB,GAAG,eAAe,UAAU;AAEpD,QAAOA,cAAM;EACZ,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;GACA;EACD,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,UAAU;EACV,eAAe;EACf,SAAS;EACT,WAAW,CACV,GAAG,qBACF;GAAE;GAAU;GAAS,EACrB;GAAE,UAAU;GAAe,SAAS;GAAc,CAClD,EACD,GAAG,sBAAsB,CACzB;EACD,CAAC;;AAGH,SAAS,qBACR,eAAmC,EAAE,EACrC,gBAAoC,EAAE,EACZ;AAC1B,QAAO;EACN;GACC,OAAO,CAAC,SAAS,SAAS;GAC1B,SAAS;IACR,GAAG;IACH,YAAY;IACZ,aAAa;IACb;GACD;EACD;GACC,OAAO;IAAC;IAAa;IAAc;IAAQ;GAC3C,SAAS,EACR,GAAG,cACH;GACD;EACD;GACC,OAAO,CAAC,UAAU,QAAQ;GAC1B,SAAS;IACR,GAAG;IACH,YAAY;IACZ;GACD;EACD;GACC,OAAO;IAAC;IAAQ;IAAS;IAAS;IAAQ;GAC1C,SAAS;IACR,GAAG;IACH,QAAQ;IACR;GACD;EACD;GACC,OAAO;IAAC;IAAU;IAAW;IAAU;GACvC,SAAS,EACR,GAAG,cACH;GACD;EACD;GACC,OAAO;IAAC;IAAU;IAAW;IAAU;GACvC,cAAc,CAAC,eAAe;GAC9B,SAAS;IACR,SAAS,CACR,6BACA,8BACA;IACD,mBAAmB;IACnB,eAAe,CAAC,UAAU;IAC1B;GACD;;;;;;;;;;;;;;EAaD;GACC,OAAO,CAAC,QAAQ,QAAQ;GACxB,SAAS;IACR,GAAG;IACH,SAAS;IACT;GACD;EACD;GACC,OAAO,CAAC,OAAO;GACf,SAAS;IACR,wBAAwB,OAAO;IAC/B,oCAAoC;IACpC;GACD;EACD;GACC,OAAO,CAAC,OAAO;GACf,SAAS,EACR,GAAG,eACH;GACD;EACD;GACC,OAAO;IAAC;IAAQ;IAAS;IAAS;IAAQ;GAC1C,SAAS;IACR,GAAG;IACH,QAAQ;IACR;GACD;EACD;GACC,OAAO;IAAC;IAAS;IAAW;IAAQ;GACpC,SAAS;IACR,GAAG;IACH,QAAQ;IACR,YAAY;IACZ,wBAAwB;IACxB,oBAAoB;IACpB,0BAA0B;IAC1B;GACD;EACD;GACC,OAAO,CAAC,UAAU,QAAQ;GAC1B,SAAS;IACR,SAAS;IACT,qBAAqB;IACrB;GACD;EACD;;AAGF,SAAS,uBAAgD;AACxD,QAAO;EACN;GACC,OAAO;IACN;IACA;IACA;IACA;IACA;GACD,SAAS,EACR,eAAe;IAAC;IAAW;IAAK;IAAY,EAC5C;GACD;;;;;;EAKD;GACC,OAAO;IACN;IACA;IACA;IACA;IACA;GACD,SAAS,EACR,eAAe;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EACD;GACD;;;;;;;;;;;EAUD;GACC,OAAO,CAAC,eAAe;GACvB,SAAS;IACR,SAAS,CACR,+BACA,8BACA;IACD,kBAAkB;KACjB;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;IACD;GACD;;;;;;EAKD;GACC,OAAO;IACN;IACA;IACA;IACA;IACA;GACD,SAAS,EACR,eAAe;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EACD;GACD;EACD;GACC,OAAO,CAAC,mBAAmB;GAC3B,SAAS,EACR,eAAe,CAAC,WAAW,UAAU,EACrC;GACD;EACD;GACC,OAAO,CAAC,wBAAwB;GAChC,SAAS,EACR,eAAe;IAAC;IAAW;IAAQ;IAAY;IAAS,EACxD;GACD;EACD;;;;;;;;AClTF,SAAwB,YACvB,YACA,iBACiB;AACjB,KAAI,EAAE,SAAS,WAAW,IAAI,SAAS,gBAAgB,EACtD,OAAM,IAAI,UACT,yDACA;CAGF,MAAM,SAASC,cAAM,WAAW;AAEhC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQA,cAAM,gBAAgB,CAAC,EAAE;AAClE,MAAI,UAAU,UAAa,UAAU,MAAM;AAE1C,UAAO,OAAO;AACd;;AAGD,MAAI,QAAQ,MAAM,IAAI,QAAQ,OAAO,KAAK,EAAE;AAC3C,UAAO,OAAO,CAAC,GAAG,OAAO,MAAM,GAAG,MAAM;AACxC;;AAGD,SAAO,OAAO;;AAGf,QAAO;;AAGR,SAAS,QAAQ,OAAoC;AACpD,QAAO,MAAM,QAAQ,MAAM;;AAG5B,SAAS,SAAS,OAAkD;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU;;;;;;;;ACpC/C,SAAwB,eAAe,GAAG,MAAqC;CAC9E,MAAM,WAAW,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAEnC,KAAI,CAAC,SAAS,SAAS,IAAI,CAC1B,UAAS,KAAK,IAAI;CAInB,MAAM,QAA0C,EAAE;AAElD,MAAK,MAAM,OAAO,SACjB,KAAI,QAAQ,IAEX,OAAM,mBAAmB,SAAS,IAAW;KAE7C,OAAM,OAAO;AAIf,QAAO,KAAK,UAAU,MAAM;;AAG7B,SAAS,mBAAmB,MAA6B;CACxD,MAAM,eAAe,KACnB,QAAQ,QAAQ,QAAQ,IAAI,CAC5B,KAAK,QAAQ,IAAI,WAAW,uBAAuB,OAAO,GAAG,MAAM,CAAC,CACpE,KAAK,IAAI;AAEX,QAAO,eAAe,IAAI,OAAO,UAAU,aAAa,QAAQ,GAAG;;;;;;;;ACnBpE,SAAwB,gBACvB,QACA,kBAAiD,EAAE,EAClC;AAEjB,UAASC,cAAM,OAAO;CAEtB,MAAM,aAAa,YAA6B;AAC/C,MAAI,QAAQ,cACX,SAAQ,gBAAgB,uBACvB,QAAQ,cACR;AAGF,MAAI,QAAQ,SAAS;GACpB,MAAM,UAAU,iBAAiB,QAAQ,SAAS,gBAAgB;AAElE,OAAI,QAAQ,SAAS,EACpB,SAAQ,UAAU;OAElB,QAAO,QAAQ;;;AAKlB,WAAU,OAAO;AAEjB,KAAI,OAAO,UACV,MAAK,MAAM,YAAY,OAAO,UAC7B,WAAU,SAAS,QAAQ;AAI7B,QAAO;;AAGR,SAAS,uBAAuB,eAA0C;AACzE,KAAI,MAAM,QAAQ,cAAc,CAC/B,QAAO,eAAe,GAAG,cAAc;AAGxC,QAAO;;AAGR,SAAS,iBACR,SACA,iBACkB;CAClB,MAAM,YAA2C;EAChD,GAAG,OAAO,YACT;GACC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,KAAK,SAAS,CAAC,MAAM,gBAAgB,KAAK,CAAC,CAAC,CAC9C;EACD,GAAG;EACH;CAED,MAAM,WAA4B,EAAE;AAEpC,MAAK,MAAM,UAAU,SAAS;EAC7B,MAAM,iBACL,OAAO,WAAW,YAAY,OAAO,OAAO,WAAW,OAAO,GAC3D,UAAU,UACV;AAEJ,MAAI,eACH,UAAS,KAAK,eAAe;;AAI/B,QAAO;;AAGR,SAAS,gBAAgB,QAAwB;AAChD,KAAI;AACH,SAAO,cAAc,OAAO,KAAK,QAAQ,OAAO,CAAC;SAC1C;;AAEP,SAAO;;;;;;;;;AC1FT,SAAwB,aACvB,SAAyB,EAAE,EACV;CACjB,MAAM,EACL,iBACA,eACA,cACA,UACA,SACA,GAAG,oBACA;AAQJ,QAAO,gBADgB,YALJ,eAClB;EAAE;EAAU;EAAS,EACrB;EAAE;EAAe;EAAc,CAC/B,EAE8C,gBAAgB,EACxB,gBAAgB"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/clone/index.ts","../src/generate-config/index.ts","../src/merge-config/index.ts","../src/prioritize-keys/index.ts","../src/transform-config/index.ts","../src/define-config/index.ts"],"sourcesContent":["export default function clone<T>(value: T): T {\n\ttry {\n\t\t/* oxlint-disable-next-line eslint/no-param-reassign */\n\t\tvalue = structuredClone(value);\n\t} catch {}\n\n\treturn value;\n}\n","import type {\n\tIndentationOptions,\n\tShellIndentationOptions,\n\tStandardConfig,\n\tStandardConfigOverrides,\n} from '../types/index.d.ts';\nimport clone from '../clone/index.ts';\n\n/**\n * Generate the base Standard Config.\n *\n * Shell scripts can’t be reliably identified by name alone—they’re recognized\n * by the shebang, not the extension. As a result, shell formatting options\n * (two-space indentation) must be defined as the global defaults.\n *\n * This requires overriding those options for other file types individually\n * with what we consider the actual defaults (`baseDefaults`). `generateConfig`\n * is a factory that encapsulates this logic and returns the final config.\n */\nexport default function generateConfig(\n\tbaseDefaults: IndentationOptions = {},\n\tshellDefaults: ShellIndentationOptions = {}\n): StandardConfig {\n\tconst { tabWidth = 4, useTabs = true } = baseDefaults;\n\tconst { shellTabWidth = 2, shellUseTabs = false } = shellDefaults;\n\n\treturn clone({\n\t\tplugins: [\n\t\t\t'@prettier/plugin-oxc',\n\t\t\t'prettier-plugin-expand-json',\n\t\t\t'prettier-plugin-markdown-html',\n\t\t\t'prettier-plugin-sh',\n\t\t\t'prettier-plugin-yaml',\n\t\t],\n\t\tbracketSpacing: true,\n\t\tprintWidth: 80,\n\t\tquoteProps: 'consistent',\n\t\tsingleQuote: true,\n\t\ttabWidth: shellTabWidth,\n\t\ttrailingComma: 'es5',\n\t\tuseTabs: shellUseTabs,\n\t\toverrides: [\n\t\t\t...getFileTypeOverrides(\n\t\t\t\t{ tabWidth, useTabs },\n\t\t\t\t{ tabWidth: shellTabWidth, useTabs: shellUseTabs }\n\t\t\t),\n\t\t\t...getFileNameOverrides(),\n\t\t],\n\t});\n}\n\nfunction getFileTypeOverrides(\n\tbaseDefaults: IndentationOptions = {},\n\tshellDefaults: IndentationOptions = {}\n): StandardConfigOverrides {\n\treturn [\n\t\t{\n\t\t\tfiles: ['*.css', '*.scss'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tprintWidth: 100,\n\t\t\t\tsingleQuote: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.graphql', '*.graphqls', '*.gql'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.html', '*.htm'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tprintWidth: 100,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.js', '*.jsx', '*.cjs', '*.mjs'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tparser: 'oxc',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.json', '*.jsonc', '*.json5'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.json', '*.jsonc', '*.json5'],\n\t\t\texcludeFiles: ['package.json'],\n\t\t\toptions: {\n\t\t\t\tplugins: [\n\t\t\t\t\t'prettier-plugin-sort-json',\n\t\t\t\t\t'prettier-plugin-expand-json',\n\t\t\t\t],\n\t\t\t\tjsonRecursiveSort: true,\n\t\t\t\tjsonSortOrder: ['$schema'],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * Tab-based indentation becomes inconvenient when rendered outside the\n\t\t * context of a code editor. In documentation, tabs in code blocks\n\t\t * require special handling that very few renderers support.\n\t\t *\n\t\t * At the time of writing, GitHub renders tabs correctly on the web, but\n\t\t * not in its mobile app. `npm`, often the point of discovery for\n\t\t * packages, does not provide any special handling for tabs either.\n\t\t *\n\t\t * To maximize the readability of code blocks in documentation, spaces\n\t\t * are the right compromise.\n\t\t */\n\t\t{\n\t\t\tfiles: ['*.md', '*.mdx'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tproseWrap: 'never',\n\t\t\t\tuseTabs: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.md'],\n\t\t\toptions: {\n\t\t\t\thtmlFragmentPrintWidth: Number.POSITIVE_INFINITY,\n\t\t\t\thtmlFragmentSingleAttributePerLine: true,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.sh'],\n\t\t\toptions: {\n\t\t\t\t...shellDefaults,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.ts', '*.tsx', '*.cts', '*.mts'],\n\t\t\toptions: {\n\t\t\t\t...baseDefaults,\n\t\t\t\tparser: 'oxc-ts',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['*.yaml', '*.yml'],\n\t\t\toptions: {\n\t\t\t\tuseTabs: false,\n\t\t\t\tyamlCollectionStyle: 'block',\n\t\t\t},\n\t\t},\n\t];\n}\n\nfunction getFileNameOverrides(): StandardConfigOverrides {\n\treturn [\n\t\t{\n\t\t\tfiles: [\n\t\t\t\t'.oxfmtrc.json',\n\t\t\t\t'.oxfmtrc.jsonc',\n\t\t\t\t'.oxfmtrc.*.json',\n\t\t\t\t'.oxfmtrc.*.jsonc',\n\t\t\t],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: ['$schema', '*', 'overrides'],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * All `.oxlintrc.json` fields defined by the Oxlint documentation\n\t\t * are sorted, including nested fields.\n\t\t */\n\t\t{\n\t\t\tfiles: [\n\t\t\t\t'.oxlintrc.json',\n\t\t\t\t'.oxlintrc.jsonc',\n\t\t\t\t'.oxlintrc.*.json',\n\t\t\t\t'.oxlintrc.*.jsonc',\n\t\t\t],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: [\n\t\t\t\t\t'$schema',\n\t\t\t\t\t'files',\n\t\t\t\t\t'extends',\n\t\t\t\t\t'ignorePatterns',\n\t\t\t\t\t'plugins',\n\t\t\t\t\t'jsPlugins',\n\t\t\t\t\t'categories',\n\t\t\t\t\t'env',\n\t\t\t\t\t'globals',\n\t\t\t\t\t'settings',\n\t\t\t\t\t'rules',\n\t\t\t\t\t'overrides',\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * By default, Prettier uses a different parser for `package.json`\n\t\t * files, which causes most JSON plugins to skip them entirely.\n\t\t * This override ensures `package.json` is treated (and sorted)\n\t\t * like any other `*.json` file.\n\t\t *\n\t\t * All `package.json` fields defined in the `npm@11` specification\n\t\t * are sorted, along with additional commonly used fields.\n\t\t */\n\t\t{\n\t\t\tfiles: ['package.json'],\n\t\t\toptions: {\n\t\t\t\tplugins: [\n\t\t\t\t\t/* prettier-ignore */\n\t\t\t\t\t'prettier-plugin-pkg',\n\t\t\t\t\t'prettier-plugin-expand-json',\n\t\t\t\t],\n\t\t\t\tpackageSortOrder: [\n\t\t\t\t\t'$schema',\n\t\t\t\t\t'name',\n\t\t\t\t\t'version',\n\t\t\t\t\t'private',\n\t\t\t\t\t'description',\n\t\t\t\t\t'license',\n\t\t\t\t\t'author',\n\t\t\t\t\t'contributors',\n\t\t\t\t\t'funding',\n\t\t\t\t\t'homepage',\n\t\t\t\t\t'repository',\n\t\t\t\t\t'bugs',\n\t\t\t\t\t'keywords',\n\t\t\t\t\t'workspaces',\n\t\t\t\t\t'directories',\n\t\t\t\t\t'files',\n\t\t\t\t\t'type',\n\t\t\t\t\t'browser',\n\t\t\t\t\t'sideEffects',\n\t\t\t\t\t'main',\n\t\t\t\t\t'module',\n\t\t\t\t\t'exports',\n\t\t\t\t\t'types',\n\t\t\t\t\t'typesVersions',\n\t\t\t\t\t'bin',\n\t\t\t\t\t'man',\n\t\t\t\t\t'imports',\n\t\t\t\t\t'engines',\n\t\t\t\t\t'os',\n\t\t\t\t\t'cpu',\n\t\t\t\t\t'libc',\n\t\t\t\t\t'gypfile',\n\t\t\t\t\t'packageManager',\n\t\t\t\t\t'devEngines',\n\t\t\t\t\t'dependencies',\n\t\t\t\t\t'bundleDependencies',\n\t\t\t\t\t'peerDependencies',\n\t\t\t\t\t'peerDependenciesMeta',\n\t\t\t\t\t'optionalDependencies',\n\t\t\t\t\t'devDependencies',\n\t\t\t\t\t'overrides',\n\t\t\t\t\t'pnpm',\n\t\t\t\t\t'config',\n\t\t\t\t\t'publishConfig',\n\t\t\t\t\t'scripts',\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * All `tsconfig.json` fields defined by the TypeScript documentation\n\t\t * are sorted, including nested fields.\n\t\t */\n\t\t{\n\t\t\tfiles: [\n\t\t\t\t'tsconfig.json',\n\t\t\t\t'tsconfig.*.json',\n\t\t\t\t'jsconfig.json',\n\t\t\t\t'jsconfig.*.json',\n\t\t\t],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: [\n\t\t\t\t\t'$schema',\n\t\t\t\t\t'extends',\n\t\t\t\t\t'enable',\n\t\t\t\t\t'references',\n\t\t\t\t\t'compilerOptions',\n\t\t\t\t\t'typeAcquisition',\n\t\t\t\t\t'files',\n\t\t\t\t\t'include',\n\t\t\t\t\t'exclude',\n\t\t\t\t\t'watchOptions',\n\t\t\t\t\t'watchDirectory',\n\t\t\t\t\t'watchFile',\n\t\t\t\t\t'fallbackPolling',\n\t\t\t\t\t'synchronousWatchDirectory',\n\t\t\t\t\t'compileOnSave',\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['.vscode/mcp.json'],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: ['$schema', 'command'],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tfiles: ['.vscode/sessions.json'],\n\t\t\toptions: {\n\t\t\t\tjsonSortOrder: ['$schema', 'name', 'commands', 'active'],\n\t\t\t},\n\t\t},\n\t];\n}\n","import type { StandardConfig } from '../types/index.d.ts';\nimport clone from '../clone/index.ts';\n\n/**\n * Deep-merge two Standard Config objects.\n */\nexport default function mergeConfig(\n\tbaseConfig: StandardConfig,\n\textensionConfig: StandardConfig\n): StandardConfig {\n\tif (!(isObject(baseConfig) && isObject(extensionConfig))) {\n\t\tthrow new TypeError(\n\t\t\t'Standard Config error: expected config to be an object'\n\t\t);\n\t}\n\n\tconst result = clone(baseConfig);\n\n\tfor (const [key, value] of Object.entries(extensionConfig)) {\n\t\tif (value === undefined || value === null) {\n\t\t\t/* oxlint-disable-next-line typescript/no-dynamic-delete */\n\t\t\tdelete result[key];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isArray(value) && isArray(result[key])) {\n\t\t\tresult[key] = [...result[key], ...clone(value)];\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult[key] = typeof value === 'object' ? clone(value) : value;\n\t}\n\n\treturn result;\n}\n\nfunction isArray(value: unknown): value is unknown[] {\n\treturn Array.isArray(value);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null;\n}\n","import type { CategorySort } from 'prettier-plugin-sort-json';\n\n/**\n * @deprecated Use an array value for the `jsonSortOrder` property instead.\n */\nexport default function prioritizeKeys(...keys: ReadonlyArray<string>): string {\n\tconst sortKeys = [...new Set(keys)];\n\n\tif (!sortKeys.includes('*')) {\n\t\tsortKeys.push('*');\n\t}\n\n\t/* oxlint-disable-next-line typescript/no-restricted-types */\n\tconst order: Record<any, CategorySort | null> = {};\n\n\tfor (const key of sortKeys) {\n\t\tif (key === '*') {\n\t\t\t/* oxlint-disable-next-line typescript/no-unsafe-member-access */\n\t\t\torder[createExclusionKey(sortKeys) as any] = 'lexical';\n\t\t} else {\n\t\t\torder[key] = null;\n\t\t}\n\t}\n\n\treturn JSON.stringify(order);\n}\n\nfunction createExclusionKey(keys: ReadonlyArray<string>) {\n\tconst escapedGroup = keys\n\t\t.filter((key) => key !== '*')\n\t\t.map((key) => key.replaceAll(/[$()*+.?[\\\\\\]^{}|]/g, String.raw`\\$&`))\n\t\t.join('|');\n\n\treturn escapedGroup ? new RegExp(`^(?!(?:${escapedGroup})$).*$`) : /.*/;\n}\n","import type { Config as PrettierConfig } from 'prettier';\nimport type {\n\tPrettierPlugins,\n\tStandardConfig,\n\tStandardConfigPluginOverrides,\n\tStandardOptions,\n} from '../types/index.d.ts';\nimport { fileURLToPath } from 'node:url';\nimport clone from '../clone/index.ts';\nimport prioritizeKeys from '../prioritize-keys/index.ts';\n\n/**\n * Convert Standard Config to an exportable, Prettier-compatible format.\n */\nexport default function transformConfig(\n\tconfig: StandardConfig,\n\tpluginOverrides: StandardConfigPluginOverrides = {}\n): PrettierConfig {\n\t/* oxlint-disable-next-line eslint/no-param-reassign */\n\tconfig = clone(config);\n\n\tconst transform = (options: StandardOptions) => {\n\t\tif (options.jsonSortOrder) {\n\t\t\toptions.jsonSortOrder = transformJSONSortOrder(\n\t\t\t\toptions.jsonSortOrder\n\t\t\t);\n\t\t}\n\n\t\tif (options.plugins) {\n\t\t\tconst plugins = transformPlugins(options.plugins, pluginOverrides);\n\n\t\t\tif (plugins.length > 0) {\n\t\t\t\toptions.plugins = plugins;\n\t\t\t} else {\n\t\t\t\tdelete options.plugins;\n\t\t\t}\n\t\t}\n\t};\n\n\ttransform(config);\n\n\tif (config.overrides) {\n\t\tfor (const override of config.overrides) {\n\t\t\ttransform(override.options);\n\t\t}\n\t}\n\n\treturn config as PrettierConfig;\n}\n\nfunction transformJSONSortOrder(jsonSortOrder: string | string[]): string {\n\tif (Array.isArray(jsonSortOrder)) {\n\t\treturn prioritizeKeys(...jsonSortOrder);\n\t}\n\n\treturn jsonSortOrder;\n}\n\nfunction transformPlugins(\n\tplugins: PrettierPlugins,\n\tpluginOverrides: StandardConfigPluginOverrides\n): PrettierPlugins {\n\tconst pluginMap: StandardConfigPluginOverrides = {\n\t\t...Object.fromEntries(\n\t\t\t[\n\t\t\t\t'@prettier/plugin-oxc',\n\t\t\t\t'prettier-plugin-expand-json',\n\t\t\t\t'prettier-plugin-markdown-html',\n\t\t\t\t'prettier-plugin-pkg',\n\t\t\t\t'prettier-plugin-sh',\n\t\t\t\t'prettier-plugin-sort-json',\n\t\t\t\t'prettier-plugin-yaml',\n\t\t\t].map((name) => [name, transformPlugin(name)])\n\t\t),\n\t\t...pluginOverrides,\n\t};\n\n\tconst resolved: PrettierPlugins = [];\n\n\tfor (const plugin of plugins) {\n\t\tconst resolvedPlugin =\n\t\t\ttypeof plugin === 'string' && Object.hasOwn(pluginMap, plugin)\n\t\t\t\t? pluginMap[plugin]\n\t\t\t\t: plugin;\n\n\t\tif (resolvedPlugin) {\n\t\t\tresolved.push(resolvedPlugin);\n\t\t}\n\t}\n\n\treturn resolved;\n}\n\nfunction transformPlugin(plugin: string): string {\n\ttry {\n\t\treturn fileURLToPath(import.meta.resolve(plugin));\n\t} catch {\n\t\t/* v8 ignore next -- @preserve */\n\t\treturn plugin;\n\t}\n}\n","import type { Config as PrettierConfig } from 'prettier';\nimport type { StandardConfig } from '../types/index.d.ts';\nimport generateConfig from '../generate-config/index.ts';\nimport mergeConfig from '../merge-config/index.ts';\nimport transformConfig from '../transform-config/index.ts';\n\n/**\n * Combine Standard Config with optional config overrides.\n */\nexport default function defineConfig(\n\tconfig: StandardConfig = {}\n): PrettierConfig {\n\tconst {\n\t\tpluginOverrides,\n\t\tshellTabWidth,\n\t\tshellUseTabs,\n\t\ttabWidth,\n\t\tuseTabs,\n\t\t...extensionConfig\n\t} = config;\n\n\tconst baseConfig = generateConfig(\n\t\t{ tabWidth, useTabs },\n\t\t{ shellTabWidth, shellUseTabs }\n\t);\n\n\tconst extendedConfig = mergeConfig(baseConfig, extensionConfig);\n\treturn transformConfig(extendedConfig, pluginOverrides);\n}\n"],"mappings":";;AAAA,SAAwB,MAAS,OAAa;AAC7C,KAAI;AAEH,UAAQ,gBAAgB,MAAM;SACvB;AAER,QAAO;;;;;;;;;;;;;;;ACaR,SAAwB,eACvB,eAAmC,EAAE,EACrC,gBAAyC,EAAE,EAC1B;CACjB,MAAM,EAAE,WAAW,GAAG,UAAU,SAAS;CACzC,MAAM,EAAE,gBAAgB,GAAG,eAAe,UAAU;AAEpD,QAAO,MAAM;EACZ,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;EACD,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,UAAU;EACV,eAAe;EACf,SAAS;EACT,WAAW,CACV,GAAG,qBACF;GAAE;GAAU;GAAS,EACrB;GAAE,UAAU;GAAe,SAAS;GAAc,CAClD,EACD,GAAG,sBAAsB,CACzB;EACD,CAAC;;AAGH,SAAS,qBACR,eAAmC,EAAE,EACrC,gBAAoC,EAAE,EACZ;AAC1B,QAAO;EACN;GACC,OAAO,CAAC,SAAS,SAAS;GAC1B,SAAS;IACR,GAAG;IACH,YAAY;IACZ,aAAa;IACb;GACD;EACD;GACC,OAAO;IAAC;IAAa;IAAc;IAAQ;GAC3C,SAAS,EACR,GAAG,cACH;GACD;EACD;GACC,OAAO,CAAC,UAAU,QAAQ;GAC1B,SAAS;IACR,GAAG;IACH,YAAY;IACZ;GACD;EACD;GACC,OAAO;IAAC;IAAQ;IAAS;IAAS;IAAQ;GAC1C,SAAS;IACR,GAAG;IACH,QAAQ;IACR;GACD;EACD;GACC,OAAO;IAAC;IAAU;IAAW;IAAU;GACvC,SAAS,EACR,GAAG,cACH;GACD;EACD;GACC,OAAO;IAAC;IAAU;IAAW;IAAU;GACvC,cAAc,CAAC,eAAe;GAC9B,SAAS;IACR,SAAS,CACR,6BACA,8BACA;IACD,mBAAmB;IACnB,eAAe,CAAC,UAAU;IAC1B;GACD;;;;;;;;;;;;;;EAaD;GACC,OAAO,CAAC,QAAQ,QAAQ;GACxB,SAAS;IACR,GAAG;IACH,WAAW;IACX,SAAS;IACT;GACD;EACD;GACC,OAAO,CAAC,OAAO;GACf,SAAS;IACR,wBAAwB,OAAO;IAC/B,oCAAoC;IACpC;GACD;EACD;GACC,OAAO,CAAC,OAAO;GACf,SAAS,EACR,GAAG,eACH;GACD;EACD;GACC,OAAO;IAAC;IAAQ;IAAS;IAAS;IAAQ;GAC1C,SAAS;IACR,GAAG;IACH,QAAQ;IACR;GACD;EACD;GACC,OAAO,CAAC,UAAU,QAAQ;GAC1B,SAAS;IACR,SAAS;IACT,qBAAqB;IACrB;GACD;EACD;;AAGF,SAAS,uBAAgD;AACxD,QAAO;EACN;GACC,OAAO;IACN;IACA;IACA;IACA;IACA;GACD,SAAS,EACR,eAAe;IAAC;IAAW;IAAK;IAAY,EAC5C;GACD;;;;;;EAKD;GACC,OAAO;IACN;IACA;IACA;IACA;IACA;GACD,SAAS,EACR,eAAe;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EACD;GACD;;;;;;;;;;;EAUD;GACC,OAAO,CAAC,eAAe;GACvB,SAAS;IACR,SAAS,CAER,uBACA,8BACA;IACD,kBAAkB;KACjB;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;IACD;GACD;;;;;;EAKD;GACC,OAAO;IACN;IACA;IACA;IACA;IACA;GACD,SAAS,EACR,eAAe;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,EACD;GACD;EACD;GACC,OAAO,CAAC,mBAAmB;GAC3B,SAAS,EACR,eAAe,CAAC,WAAW,UAAU,EACrC;GACD;EACD;GACC,OAAO,CAAC,wBAAwB;GAChC,SAAS,EACR,eAAe;IAAC;IAAW;IAAQ;IAAY;IAAS,EACxD;GACD;EACD;;;;;;;ACxSF,SAAwB,YACvB,YACA,iBACiB;AACjB,KAAI,EAAE,SAAS,WAAW,IAAI,SAAS,gBAAgB,EACtD,OAAM,IAAI,UACT,yDACA;CAGF,MAAM,SAAS,MAAM,WAAW;AAEhC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,gBAAgB,EAAE;AAC3D,MAAI,UAAU,KAAA,KAAa,UAAU,MAAM;AAE1C,UAAO,OAAO;AACd;;AAGD,MAAI,QAAQ,MAAM,IAAI,QAAQ,OAAO,KAAK,EAAE;AAC3C,UAAO,OAAO,CAAC,GAAG,OAAO,MAAM,GAAG,MAAM,MAAM,CAAC;AAC/C;;AAGD,SAAO,OAAO,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG;;AAG1D,QAAO;;AAGR,SAAS,QAAQ,OAAoC;AACpD,QAAO,MAAM,QAAQ,MAAM;;AAG5B,SAAS,SAAS,OAAkD;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU;;;;;;;ACpC/C,SAAwB,eAAe,GAAG,MAAqC;CAC9E,MAAM,WAAW,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAEnC,KAAI,CAAC,SAAS,SAAS,IAAI,CAC1B,UAAS,KAAK,IAAI;CAInB,MAAM,QAA0C,EAAE;AAElD,MAAK,MAAM,OAAO,SACjB,KAAI,QAAQ,IAEX,OAAM,mBAAmB,SAAS,IAAW;KAE7C,OAAM,OAAO;AAIf,QAAO,KAAK,UAAU,MAAM;;AAG7B,SAAS,mBAAmB,MAA6B;CACxD,MAAM,eAAe,KACnB,QAAQ,QAAQ,QAAQ,IAAI,CAC5B,KAAK,QAAQ,IAAI,WAAW,uBAAuB,OAAO,GAAG,MAAM,CAAC,CACpE,KAAK,IAAI;AAEX,QAAO,eAAe,IAAI,OAAO,UAAU,aAAa,QAAQ,GAAG;;;;;;;ACnBpE,SAAwB,gBACvB,QACA,kBAAiD,EAAE,EAClC;AAEjB,UAAS,MAAM,OAAO;CAEtB,MAAM,aAAa,YAA6B;AAC/C,MAAI,QAAQ,cACX,SAAQ,gBAAgB,uBACvB,QAAQ,cACR;AAGF,MAAI,QAAQ,SAAS;GACpB,MAAM,UAAU,iBAAiB,QAAQ,SAAS,gBAAgB;AAElE,OAAI,QAAQ,SAAS,EACpB,SAAQ,UAAU;OAElB,QAAO,QAAQ;;;AAKlB,WAAU,OAAO;AAEjB,KAAI,OAAO,UACV,MAAK,MAAM,YAAY,OAAO,UAC7B,WAAU,SAAS,QAAQ;AAI7B,QAAO;;AAGR,SAAS,uBAAuB,eAA0C;AACzE,KAAI,MAAM,QAAQ,cAAc,CAC/B,QAAO,eAAe,GAAG,cAAc;AAGxC,QAAO;;AAGR,SAAS,iBACR,SACA,iBACkB;CAClB,MAAM,YAA2C;EAChD,GAAG,OAAO,YACT;GACC;GACA;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,KAAK,SAAS,CAAC,MAAM,gBAAgB,KAAK,CAAC,CAAC,CAC9C;EACD,GAAG;EACH;CAED,MAAM,WAA4B,EAAE;AAEpC,MAAK,MAAM,UAAU,SAAS;EAC7B,MAAM,iBACL,OAAO,WAAW,YAAY,OAAO,OAAO,WAAW,OAAO,GAC3D,UAAU,UACV;AAEJ,MAAI,eACH,UAAS,KAAK,eAAe;;AAI/B,QAAO;;AAGR,SAAS,gBAAgB,QAAwB;AAChD,KAAI;AACH,SAAO,cAAc,OAAO,KAAK,QAAQ,OAAO,CAAC;SAC1C;;AAEP,SAAO;;;;;;;;ACzFT,SAAwB,aACvB,SAAyB,EAAE,EACV;CACjB,MAAM,EACL,iBACA,eACA,cACA,UACA,SACA,GAAG,oBACA;AAQJ,QAAO,gBADgB,YALJ,eAClB;EAAE;EAAU;EAAS,EACrB;EAAE;EAAe;EAAc,CAC/B,EAE8C,gBAAgB,EACxB,gBAAgB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@standard-config/prettier",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "TypeScript-first Prettier config",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -33,34 +33,31 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@prettier/plugin-oxc": "^0.1.3",
|
|
36
|
-
"@prettier/plugin-xml": "^3.4.2",
|
|
37
36
|
"prettier-plugin-expand-json": "^1.0.4",
|
|
38
|
-
"prettier-plugin-markdown-html": "^1.
|
|
39
|
-
"prettier-plugin-
|
|
37
|
+
"prettier-plugin-markdown-html": "^1.3.0",
|
|
38
|
+
"prettier-plugin-pkg": "^0.21.2",
|
|
40
39
|
"prettier-plugin-sh": "^0.18.0",
|
|
41
40
|
"prettier-plugin-sort-json": "^4.2.0",
|
|
42
|
-
"prettier-plugin-yaml": "^1.1.2"
|
|
43
|
-
"rfdc": "^1.4.1"
|
|
41
|
+
"prettier-plugin-yaml": "^1.1.2"
|
|
44
42
|
},
|
|
45
43
|
"peerDependencies": {
|
|
46
44
|
"prettier": ">=3.7"
|
|
47
45
|
},
|
|
48
46
|
"devDependencies": {
|
|
49
|
-
"@standard-config/eslint": "1.
|
|
50
|
-
"@standard-config/oxlint": "1.0
|
|
51
|
-
"@standard-config/tsconfig": "2.0.2",
|
|
52
|
-
"@types/node": "22.19.
|
|
53
|
-
"@vitest/coverage-v8": "4.0.18",
|
|
54
|
-
"eslint": "
|
|
55
|
-
"husky": "9.1.7",
|
|
56
|
-
"
|
|
57
|
-
"oxlint": "
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"vitest": "4.0.18"
|
|
47
|
+
"@standard-config/eslint": "^1.6.1",
|
|
48
|
+
"@standard-config/oxlint": "^1.4.0",
|
|
49
|
+
"@standard-config/tsconfig": "^2.0.2",
|
|
50
|
+
"@types/node": "^22.19.15",
|
|
51
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
52
|
+
"eslint": "^10.0.3",
|
|
53
|
+
"husky": "^9.1.7",
|
|
54
|
+
"oxlint": "^1.51.0",
|
|
55
|
+
"oxlint-tsgolint": "^0.16.0",
|
|
56
|
+
"prettier": "^3.8.1",
|
|
57
|
+
"publint": "^0.3.18",
|
|
58
|
+
"tsdown": "^0.21.0",
|
|
59
|
+
"typescript": "^5.9.3",
|
|
60
|
+
"vitest": "^4.0.18"
|
|
64
61
|
},
|
|
65
62
|
"scripts": {
|
|
66
63
|
"build": "tsdown",
|
|
@@ -69,8 +66,8 @@
|
|
|
69
66
|
"fixtures:unscramble": "pnpm prettier --write fixtures && sleep 1",
|
|
70
67
|
"format": "prettier --ignore-unknown --log-level=warn --write .",
|
|
71
68
|
"format:check": "prettier --check --ignore-unknown .",
|
|
72
|
-
"lint": "oxlint --fix --report-unused-disable-directives
|
|
73
|
-
"lint:check": "oxlint --deny-warnings --report-unused-disable-directives --type-
|
|
69
|
+
"lint": "oxlint --fix --report-unused-disable-directives",
|
|
70
|
+
"lint:check": "oxlint --deny-warnings --report-unused-disable-directives --type-check",
|
|
74
71
|
"test": "vitest run",
|
|
75
72
|
"test:fixtures": "pnpm run '/^fixtures:/' && git diff --exit-code fixtures",
|
|
76
73
|
"typecheck": "tsc --noEmit"
|