@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 CHANGED
@@ -37,7 +37,3 @@ indent_size = 4
37
37
  [*.{ts,tsx,cts,mts}]
38
38
  indent_size = 4
39
39
  indent_style = tab
40
-
41
- [*.{xml,plist,svg}]
42
- indent_size = 4
43
- indent_style = tab
package/README.md CHANGED
@@ -1,6 +1,4 @@
1
- [![](https://img.shields.io/npm/v/%40standard-config%2Fprettier)](https://www.npmjs.com/package/@standard-config/prettier)
2
- [![](https://img.shields.io/github/actions/workflow/status/standard-config/prettier/test.yaml)](https://github.com/standard-config/prettier/actions/workflows/test.yaml)
3
- [![](https://img.shields.io/codecov/c/github/standard-config/prettier)](https://codecov.io/github/standard-config/prettier)
1
+ [![](https://img.shields.io/npm/v/%40standard-config%2Fprettier)](https://www.npmjs.com/package/@standard-config/prettier) [![](https://img.shields.io/github/actions/workflow/status/standard-config/prettier/test.yaml)](https://github.com/standard-config/prettier/actions/workflows/test.yaml) [![](https://img.shields.io/codecov/c/github/standard-config/prettier)](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 configs like `package.json`, `tsconfig.json`, `.oxlintrc.json`, and more.
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
- var clone_default = defineClone({ circles: true });
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 clone_default({
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-packagejson", "prettier-plugin-expand-json"],
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 = clone_default(baseConfig);
332
- for (const [key, value] of Object.entries(clone_default(extensionConfig))) {
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 = clone_default(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-packagejson",
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
@@ -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.9.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.2.0",
39
- "prettier-plugin-packagejson": "^3.0.0",
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.3.2",
50
- "@standard-config/oxlint": "1.0.3",
51
- "@standard-config/tsconfig": "2.0.2",
52
- "@types/node": "22.19.10",
53
- "@vitest/coverage-v8": "4.0.18",
54
- "eslint": "9.39.2",
55
- "husky": "9.1.7",
56
- "jiti": "2.6.1",
57
- "oxlint": "1.43.0",
58
- "oxlint-tsgolint": "0.11.5",
59
- "prettier": "3.8.1",
60
- "publint": "0.3.17",
61
- "tsdown": "0.20.3",
62
- "typescript": "5.9.3",
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 --type-aware --type-check && eslint --fix .",
73
- "lint:check": "oxlint --deny-warnings --report-unused-disable-directives --type-aware --type-check && eslint .",
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"