@averay/codeformat 0.2.2 → 0.2.4

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.
Files changed (77) hide show
  1. package/dist/bin/codeformat.d.ts +2 -0
  2. package/dist/bin/codeformat.js +22 -0
  3. package/dist/bin/codeformat.js.map +1 -0
  4. package/dist/bin/tools/eslint.d.ts +13 -0
  5. package/dist/bin/tools/eslint.js +15 -0
  6. package/dist/bin/tools/eslint.js.map +1 -0
  7. package/dist/bin/tools/index.d.ts +5 -0
  8. package/dist/bin/tools/index.js +6 -0
  9. package/dist/bin/tools/index.js.map +1 -0
  10. package/dist/bin/tools/phpCsFixer.d.ts +16 -0
  11. package/dist/bin/tools/phpCsFixer.js +16 -0
  12. package/dist/bin/tools/phpCsFixer.js.map +1 -0
  13. package/dist/bin/tools/prettier.d.ts +13 -0
  14. package/dist/bin/tools/prettier.js +19 -0
  15. package/dist/bin/tools/prettier.js.map +1 -0
  16. package/dist/bin/tools/stylelint.d.ts +13 -0
  17. package/dist/bin/tools/stylelint.js +15 -0
  18. package/dist/bin/tools/stylelint.js.map +1 -0
  19. package/dist/bin/tools/tsc.d.ts +10 -0
  20. package/dist/bin/tools/tsc.js +11 -0
  21. package/dist/bin/tools/tsc.js.map +1 -0
  22. package/dist/bin/utils/Cli.d.ts +20 -0
  23. package/dist/bin/utils/Cli.js +58 -0
  24. package/dist/bin/utils/Cli.js.map +1 -0
  25. package/dist/bin/utils/Output.d.ts +9 -0
  26. package/dist/bin/utils/Output.js +29 -0
  27. package/dist/bin/utils/Output.js.map +1 -0
  28. package/dist/bin/utils/ToolRunner.d.ts +10 -0
  29. package/dist/bin/utils/ToolRunner.js +49 -0
  30. package/dist/bin/utils/ToolRunner.js.map +1 -0
  31. package/dist/bin/utils/filesystem.d.ts +2 -0
  32. package/dist/bin/utils/filesystem.js +15 -0
  33. package/dist/bin/utils/filesystem.js.map +1 -0
  34. package/dist/bin/utils/runners.d.ts +5 -0
  35. package/dist/bin/utils/runners.js +9 -0
  36. package/dist/bin/utils/runners.js.map +1 -0
  37. package/dist/bin/utils/types.d.ts +18 -0
  38. package/dist/bin/utils/types.js +2 -0
  39. package/dist/bin/utils/types.js.map +1 -0
  40. package/dist/lib/convertWarnsToErrors.d.ts +22 -0
  41. package/dist/lib/convertWarnsToErrors.js +34 -0
  42. package/dist/lib/convertWarnsToErrors.js.map +1 -0
  43. package/dist/lib/cssPatterns.d.ts +8 -0
  44. package/dist/lib/cssPatterns.js +17 -0
  45. package/dist/lib/cssPatterns.js.map +1 -0
  46. package/dist/rulesets/eslint/ruleset-shared.d.ts +356 -0
  47. package/dist/rulesets/eslint/ruleset-shared.js +340 -0
  48. package/dist/rulesets/eslint/ruleset-shared.js.map +1 -0
  49. package/dist/rulesets/eslint/ruleset-typescript.d.ts +5 -0
  50. package/dist/rulesets/eslint/ruleset-typescript.js +232 -0
  51. package/dist/rulesets/eslint/ruleset-typescript.js.map +1 -0
  52. package/dist/rulesets/stylelint/ruleset-css.d.ts +20 -0
  53. package/dist/rulesets/stylelint/ruleset-css.js +34 -0
  54. package/dist/rulesets/stylelint/ruleset-css.js.map +1 -0
  55. package/dist/rulesets/stylelint/ruleset-scss.d.ts +27 -0
  56. package/dist/rulesets/stylelint/ruleset-scss.js +42 -0
  57. package/dist/rulesets/stylelint/ruleset-scss.js.map +1 -0
  58. package/dist/src/extensions.d.ts +7 -0
  59. package/dist/src/extensions.js +7 -0
  60. package/dist/src/extensions.js.map +1 -0
  61. package/dist/src/index.d.ts +4 -0
  62. package/dist/src/index.js +5 -0
  63. package/dist/src/index.js.map +1 -0
  64. package/dist/src/makeEslintConfig.d.ts +13 -0
  65. package/dist/src/makeEslintConfig.js +80 -0
  66. package/dist/src/makeEslintConfig.js.map +1 -0
  67. package/dist/src/makeStylelintConfig.d.ts +64 -0
  68. package/dist/src/makeStylelintConfig.js +39 -0
  69. package/dist/src/makeStylelintConfig.js.map +1 -0
  70. package/lib/cssPatterns.ts +15 -2
  71. package/package.json +17 -12
  72. package/rulesets/stylelint/ruleset-css.ts +1 -0
  73. package/rulesets/stylelint/ruleset-scss.ts +20 -5
  74. package/src/makeStylelintConfig.ts +2 -1
  75. package/tsconfig.build.json +13 -0
  76. package/tsconfig.json +1 -0
  77. package/types.d.ts +6 -0
@@ -0,0 +1,34 @@
1
+ import propertiesOrder from '@averay/css-properties-sort-order';
2
+ import recommended from 'stylelint-config-recommended';
3
+ import standard from 'stylelint-config-standard';
4
+ import patterns from "../../lib/cssPatterns.js";
5
+ export default {
6
+ ...recommended.rules,
7
+ ...standard.rules,
8
+ // Core rules
9
+ ...{
10
+ 'color-named': 'never',
11
+ 'function-url-no-scheme-relative': true,
12
+ },
13
+ // Disable Prettier conflicts
14
+ ...{
15
+ 'at-rule-empty-line-before': null,
16
+ 'comment-empty-line-before': null,
17
+ 'rule-empty-line-before': null,
18
+ },
19
+ // Patterns
20
+ ...{
21
+ 'container-name-pattern': patterns.bem,
22
+ 'custom-media-pattern': patterns.bem,
23
+ 'custom-property-pattern': patterns.bem,
24
+ 'keyframes-name-pattern': patterns.bem,
25
+ 'layer-name-pattern': patterns.bem,
26
+ 'selector-class-pattern': patterns.bemWithOptionalUnderscoresPrefix,
27
+ 'selector-id-pattern': patterns.kebab,
28
+ },
29
+ // Extensions
30
+ 'csstools/use-logical': 'always',
31
+ 'order/order': ['custom-properties', 'declarations'],
32
+ 'order/properties-order': [propertiesOrder, { unspecified: 'bottomAlphabetical' }],
33
+ };
34
+ //# sourceMappingURL=ruleset-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleset-css.js","sourceRoot":"","sources":["../../../rulesets/stylelint/ruleset-css.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mCAAmC,CAAC;AAChE,OAAO,WAAW,MAAM,8BAA8B,CAAC;AACvD,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AAEjD,OAAO,QAAQ,MAAM,0BAA0B,CAAC;AAEhD,eAAe;IACb,GAAG,WAAW,CAAC,KAAK;IACpB,GAAG,QAAQ,CAAC,KAAK;IAEjB,aAAa;IACb,GAAG;QACD,aAAa,EAAE,OAAO;QACtB,iCAAiC,EAAE,IAAI;KACxC;IAED,6BAA6B;IAC7B,GAAG;QACD,2BAA2B,EAAE,IAAI;QACjC,2BAA2B,EAAE,IAAI;QACjC,wBAAwB,EAAE,IAAI;KAC/B;IAED,WAAW;IACX,GAAG;QACD,wBAAwB,EAAE,QAAQ,CAAC,GAAG;QACtC,sBAAsB,EAAE,QAAQ,CAAC,GAAG;QACpC,yBAAyB,EAAE,QAAQ,CAAC,GAAG;QACvC,wBAAwB,EAAE,QAAQ,CAAC,GAAG;QACtC,oBAAoB,EAAE,QAAQ,CAAC,GAAG;QAClC,wBAAwB,EAAE,QAAQ,CAAC,gCAAgC;QACnE,qBAAqB,EAAE,QAAQ,CAAC,KAAK;KACtC;IAED,aAAa;IACb,sBAAsB,EAAE,QAAQ;IAChC,aAAa,EAAE,CAAC,mBAAmB,EAAE,cAAc,CAAC;IACpD,wBAAwB,EAAE,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACnF,CAAC"}
@@ -0,0 +1,27 @@
1
+ declare const _default: {
2
+ 'scss/at-if-no-null': null;
3
+ 'container-name-pattern': string;
4
+ 'custom-media-pattern': string;
5
+ 'custom-property-pattern': string;
6
+ 'keyframes-name-pattern': string;
7
+ 'layer-name-pattern': string;
8
+ 'scss/at-function-pattern': string;
9
+ 'scss/at-mixin-pattern': string;
10
+ 'scss/dollar-variable-pattern': string;
11
+ 'scss/percent-placeholder-pattern': string;
12
+ 'scss/at-else-closing-brace-newline-after': null;
13
+ 'scss/at-else-closing-brace-space-after': null;
14
+ 'scss/at-else-empty-line-before': null;
15
+ 'scss/at-else-if-parentheses-space-before': null;
16
+ 'scss/at-function-parentheses-space-before': null;
17
+ 'scss/at-if-closing-brace-newline-after': null;
18
+ 'scss/at-if-closing-brace-space-after': null;
19
+ 'scss/at-mixin-parentheses-space-before': null;
20
+ 'scss/dollar-variable-colon-newline-after': null;
21
+ 'scss/dollar-variable-colon-space-after': null;
22
+ 'scss/dollar-variable-colon-space-before': null;
23
+ 'scss/operator-no-newline-after': null;
24
+ 'scss/operator-no-newline-before': null;
25
+ 'scss/operator-no-unspaced': null;
26
+ };
27
+ export default _default;
@@ -0,0 +1,42 @@
1
+ import recommended from 'stylelint-config-recommended-scss';
2
+ import standard from 'stylelint-config-standard-scss';
3
+ import patterns, { patternOrScssInterpolation } from "../../lib/cssPatterns.js";
4
+ export default {
5
+ ...recommended.rules,
6
+ ...standard.rules,
7
+ // Disable Prettier conflicts
8
+ ...{
9
+ 'scss/at-else-closing-brace-newline-after': null,
10
+ 'scss/at-else-closing-brace-space-after': null,
11
+ 'scss/at-else-empty-line-before': null,
12
+ 'scss/at-else-if-parentheses-space-before': null,
13
+ 'scss/at-function-parentheses-space-before': null,
14
+ 'scss/at-if-closing-brace-newline-after': null,
15
+ 'scss/at-if-closing-brace-space-after': null,
16
+ 'scss/at-mixin-parentheses-space-before': null,
17
+ 'scss/dollar-variable-colon-newline-after': null,
18
+ 'scss/dollar-variable-colon-space-after': null,
19
+ 'scss/dollar-variable-colon-space-before': null,
20
+ 'scss/operator-no-newline-after': null,
21
+ 'scss/operator-no-newline-before': null,
22
+ 'scss/operator-no-unspaced': null,
23
+ },
24
+ // Naming patterns
25
+ ...{
26
+ 'scss/at-function-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
27
+ 'scss/at-mixin-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
28
+ 'scss/dollar-variable-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
29
+ 'scss/percent-placeholder-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
30
+ },
31
+ // Support interpolation for @ keywords
32
+ ...{
33
+ 'container-name-pattern': patternOrScssInterpolation(patterns.bem),
34
+ 'custom-media-pattern': patternOrScssInterpolation(patterns.bem),
35
+ 'custom-property-pattern': patternOrScssInterpolation(patterns.bem),
36
+ 'keyframes-name-pattern': patternOrScssInterpolation(patterns.bem),
37
+ 'layer-name-pattern': patternOrScssInterpolation(patterns.bem),
38
+ },
39
+ // Customise rulesets
40
+ 'scss/at-if-no-null': null,
41
+ };
42
+ //# sourceMappingURL=ruleset-scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleset-scss.js","sourceRoot":"","sources":["../../../rulesets/stylelint/ruleset-scss.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,mCAAmC,CAAC;AAC5D,OAAO,QAAQ,MAAM,gCAAgC,CAAC;AAEtD,OAAO,QAAQ,EAAE,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEhF,eAAe;IACb,GAAG,WAAW,CAAC,KAAK;IACpB,GAAG,QAAQ,CAAC,KAAK;IAEjB,6BAA6B;IAC7B,GAAG;QACD,0CAA0C,EAAE,IAAI;QAChD,wCAAwC,EAAE,IAAI;QAC9C,gCAAgC,EAAE,IAAI;QACtC,0CAA0C,EAAE,IAAI;QAChD,2CAA2C,EAAE,IAAI;QACjD,wCAAwC,EAAE,IAAI;QAC9C,sCAAsC,EAAE,IAAI;QAC5C,wCAAwC,EAAE,IAAI;QAC9C,0CAA0C,EAAE,IAAI;QAChD,wCAAwC,EAAE,IAAI;QAC9C,yCAAyC,EAAE,IAAI;QAC/C,gCAAgC,EAAE,IAAI;QACtC,iCAAiC,EAAE,IAAI;QACvC,2BAA2B,EAAE,IAAI;KAClC;IAED,kBAAkB;IAClB,GAAG;QACD,0BAA0B,EAAE,QAAQ,CAAC,qCAAqC;QAC1E,uBAAuB,EAAE,QAAQ,CAAC,qCAAqC;QACvE,8BAA8B,EAAE,QAAQ,CAAC,qCAAqC;QAC9E,kCAAkC,EAAE,QAAQ,CAAC,qCAAqC;KACnF;IAED,uCAAuC;IACvC,GAAG;QACD,wBAAwB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClE,sBAAsB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC;QAChE,yBAAyB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnE,wBAAwB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClE,oBAAoB,EAAE,0BAA0B,CAAC,QAAQ,CAAC,GAAG,CAAC;KAC/D;IAED,qBAAqB;IACrB,oBAAoB,EAAE,IAAI;CAC3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ js: string[];
3
+ ts: string[];
4
+ css: string[];
5
+ scss: string[];
6
+ };
7
+ export default _default;
@@ -0,0 +1,7 @@
1
+ export default {
2
+ js: ['js', 'jsx', 'cjs', 'cjs', 'mjs', 'mjsx'],
3
+ ts: ['ts', 'tsx', 'cts', 'cts', 'mts', 'mtsx'],
4
+ css: ['css'],
5
+ scss: ['scss'],
6
+ };
7
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/extensions.ts"],"names":[],"mappings":"AAAA,eAAe;IACb,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;IAC9C,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;IAE9C,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,IAAI,EAAE,CAAC,MAAM,CAAC;CACoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { default as globals } from 'globals';
2
+ export { default as extensions } from './extensions.ts';
3
+ export { default as makeEslintConfig } from './makeEslintConfig.ts';
4
+ export { default as makeStylelintConfig } from './makeStylelintConfig.ts';
@@ -0,0 +1,5 @@
1
+ export { default as globals } from 'globals';
2
+ export { default as extensions } from "./extensions.js";
3
+ export { default as makeEslintConfig } from "./makeEslintConfig.js";
4
+ export { default as makeStylelintConfig } from "./makeStylelintConfig.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type TSESLint } from '@typescript-eslint/utils';
2
+ interface Options {
3
+ /** The ECMA version to use. */
4
+ ecmaVersion?: TSESLint.FlatConfig.EcmaVersion;
5
+ /** The relative path to the project's `tsconfig.json` file. */
6
+ tsconfigPath?: string;
7
+ }
8
+ /**
9
+ * @param options Project-specific customisations.
10
+ * @returns The complete ESLint config.
11
+ */
12
+ export default function makeEslintConfig({ ecmaVersion, tsconfigPath, }?: Options): TSESLint.FlatConfig.Config[];
13
+ export {};
@@ -0,0 +1,80 @@
1
+ /* eslint sort-keys: "error" -- Organise rules */
2
+ import stylisticPlugin from '@stylistic/eslint-plugin';
3
+ import typescriptPlugin from '@typescript-eslint/eslint-plugin';
4
+ import typescriptParser from '@typescript-eslint/parser';
5
+ import prettierConfig from 'eslint-config-prettier';
6
+ import eslintCommentsPlugin from 'eslint-plugin-eslint-comments';
7
+ import importPlugin from 'eslint-plugin-import';
8
+ import jsdocPlugin from 'eslint-plugin-jsdoc';
9
+ import promisePlugin from 'eslint-plugin-promise';
10
+ import regexpPlugin from 'eslint-plugin-regexp';
11
+ import sonarjsPlugin from 'eslint-plugin-sonarjs';
12
+ import unicornPlugin from 'eslint-plugin-unicorn';
13
+ import convertWarnsToErrors from "../lib/convertWarnsToErrors.js";
14
+ import rulesetEslintShared from "../rulesets/eslint/ruleset-shared.js";
15
+ import rulesetEslintTypescript, { moduleDeclarations as rulesetEslintTypescriptModuleDeclarations, } from "../rulesets/eslint/ruleset-typescript.js";
16
+ import extensions from "./extensions.js";
17
+ /**
18
+ * @param options Project-specific customisations.
19
+ * @returns The complete ESLint config.
20
+ */
21
+ export default function makeEslintConfig({ ecmaVersion = 'latest', tsconfigPath, } = {}) {
22
+ return [
23
+ // JavaScript & TypeScript
24
+ {
25
+ files: [`**/*.{${[...extensions.js, ...extensions.ts].join(',')}}`],
26
+ languageOptions: {
27
+ parserOptions: {
28
+ ecmaVersion,
29
+ sourceType: 'module',
30
+ },
31
+ },
32
+ linterOptions: {
33
+ reportUnusedDisableDirectives: true,
34
+ },
35
+ plugins: {
36
+ '@stylistic': stylisticPlugin,
37
+ 'eslint-comments': eslintCommentsPlugin,
38
+ import: importPlugin,
39
+ jsdoc: jsdocPlugin,
40
+ promise: promisePlugin,
41
+ regexp: regexpPlugin,
42
+ sonarjs: sonarjsPlugin,
43
+ unicorn: unicornPlugin,
44
+ },
45
+ rules: convertWarnsToErrors(rulesetEslintShared),
46
+ settings: {
47
+ 'import/parsers': {
48
+ espree: extensions.js.map((extension) => `.${extension}`),
49
+ },
50
+ },
51
+ },
52
+ // TypeScript
53
+ {
54
+ files: [`**/*.{${extensions.ts.join(',')}}`],
55
+ languageOptions: {
56
+ parser: typescriptParser,
57
+ parserOptions: tsconfigPath == null ? {} : { project: tsconfigPath },
58
+ },
59
+ plugins: {
60
+ '@typescript-eslint': typescriptPlugin,
61
+ },
62
+ rules: convertWarnsToErrors(rulesetEslintTypescript),
63
+ settings: {
64
+ ...importPlugin.configs.typescript.settings,
65
+ 'import/parsers': {
66
+ '@typescript-eslint/parser': extensions.ts.map((extension) => `.${extension}`),
67
+ },
68
+ 'import/resolver': {
69
+ 'eslint-import-resolver-typescript': tsconfigPath == null ? {} : { project: tsconfigPath },
70
+ },
71
+ },
72
+ },
73
+ {
74
+ files: ['**/*.d.ts'],
75
+ rules: rulesetEslintTypescriptModuleDeclarations,
76
+ },
77
+ prettierConfig,
78
+ ];
79
+ }
80
+ //# sourceMappingURL=makeEslintConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeEslintConfig.js","sourceRoot":"","sources":["../../src/makeEslintConfig.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,eAAe,MAAM,0BAA0B,CAAC;AACvD,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AAEzD,OAAO,cAAc,MAAM,wBAAwB,CAAC;AACpD,OAAO,oBAAoB,MAAM,+BAA+B,CAAC;AACjE,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAC9C,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAElD,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAClE,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AACvE,OAAO,uBAAuB,EAAE,EAC9B,kBAAkB,IAAI,yCAAyC,GAChE,MAAM,0CAA0C,CAAC;AAElD,OAAO,UAAU,MAAM,iBAAiB,CAAC;AASzC;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,WAAW,GAAG,QAAQ,EACtB,YAAY,MACD,EAAE;IACb,OAAO;QACL,0BAA0B;QAC1B;YACE,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACnE,eAAe,EAAE;gBACf,aAAa,EAAE;oBACb,WAAW;oBACX,UAAU,EAAE,QAAQ;iBACrB;aACF;YACD,aAAa,EAAE;gBACb,6BAA6B,EAAE,IAAI;aACpC;YACD,OAAO,EAAE;gBACP,YAAY,EAAE,eAAe;gBAC7B,iBAAiB,EAAE,oBAAoB;gBACvC,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,aAAa;gBACtB,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,aAAa;aACvB;YACD,KAAK,EAAE,oBAAoB,CAAC,mBAAmB,CAAC;YAChD,QAAQ,EAAE;gBACR,gBAAgB,EAAE;oBAChB,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;iBAC1D;aACF;SACF;QAED,aAAa;QACb;YACE,KAAK,EAAE,CAAC,SAAS,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAC5C,eAAe,EAAE;gBACf,MAAM,EAAE,gBAAgB;gBACxB,aAAa,EAAE,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE;aACrE;YACD,OAAO,EAAE;gBACP,oBAAoB,EAAE,gBAAgB;aACvC;YACD,KAAK,EAAE,oBAAoB,CAAC,uBAAuB,CAAC;YACpD,QAAQ,EAAE;gBACR,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ;gBAC3C,gBAAgB,EAAE;oBAChB,2BAA2B,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;iBAC/E;gBACD,iBAAiB,EAAE;oBACjB,mCAAmC,EAAE,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE;iBAC3F;aACF;SACF;QACD;YACE,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,KAAK,EAAE,yCAAyC;SACjD;QAED,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { type Config, type CustomSyntax } from 'stylelint';
2
+ type ConfigRules = Config['rules'];
3
+ /**
4
+ * @returns The complete Stylelint config.
5
+ */
6
+ export default function makeStylelintConfig(cssRules?: ConfigRules, scssRules?: ConfigRules): {
7
+ defaultSeverity: "error";
8
+ ignoreFiles: string[];
9
+ plugins: import("stylelint").Plugin[];
10
+ reportDescriptionlessDisables: true;
11
+ reportInvalidScopeDisables: true;
12
+ reportNeedlessDisables: true;
13
+ rules: {
14
+ 'csstools/use-logical': string;
15
+ 'order/order': string[];
16
+ 'order/properties-order': (string[] | {
17
+ unspecified: string;
18
+ })[];
19
+ 'container-name-pattern': string;
20
+ 'custom-media-pattern': string;
21
+ 'custom-property-pattern': string;
22
+ 'keyframes-name-pattern': string;
23
+ 'layer-name-pattern': string;
24
+ 'selector-class-pattern': string;
25
+ 'selector-id-pattern': string;
26
+ 'at-rule-empty-line-before': null;
27
+ 'comment-empty-line-before': null;
28
+ 'rule-empty-line-before': null;
29
+ 'color-named': string;
30
+ 'function-url-no-scheme-relative': boolean;
31
+ };
32
+ overrides: {
33
+ customSyntax: CustomSyntax;
34
+ files: string[];
35
+ plugins: import("stylelint").Plugin[];
36
+ rules: {
37
+ 'scss/at-if-no-null': null;
38
+ 'container-name-pattern': string;
39
+ 'custom-media-pattern': string;
40
+ 'custom-property-pattern': string;
41
+ 'keyframes-name-pattern': string;
42
+ 'layer-name-pattern': string;
43
+ 'scss/at-function-pattern': string;
44
+ 'scss/at-mixin-pattern': string;
45
+ 'scss/dollar-variable-pattern': string;
46
+ 'scss/percent-placeholder-pattern': string;
47
+ 'scss/at-else-closing-brace-newline-after': null;
48
+ 'scss/at-else-closing-brace-space-after': null;
49
+ 'scss/at-else-empty-line-before': null;
50
+ 'scss/at-else-if-parentheses-space-before': null;
51
+ 'scss/at-function-parentheses-space-before': null;
52
+ 'scss/at-if-closing-brace-newline-after': null;
53
+ 'scss/at-if-closing-brace-space-after': null;
54
+ 'scss/at-mixin-parentheses-space-before': null;
55
+ 'scss/dollar-variable-colon-newline-after': null;
56
+ 'scss/dollar-variable-colon-space-after': null;
57
+ 'scss/dollar-variable-colon-space-before': null;
58
+ 'scss/operator-no-newline-after': null;
59
+ 'scss/operator-no-newline-before': null;
60
+ 'scss/operator-no-unspaced': null;
61
+ };
62
+ }[];
63
+ };
64
+ export {};
@@ -0,0 +1,39 @@
1
+ /* eslint sort-keys: "error" -- Organise rules */
2
+ import postcssScss from 'postcss-scss';
3
+ import orderPlugin from 'stylelint-order';
4
+ import scssPlugin from 'stylelint-scss';
5
+ import useLogicalPlugin from 'stylelint-use-logical';
6
+ import rulesetStylelintCss from "../rulesets/stylelint/ruleset-css.js";
7
+ import rulesetStylelintScss from "../rulesets/stylelint/ruleset-scss.js";
8
+ import extensions from "./extensions.js";
9
+ /**
10
+ * @returns The complete Stylelint config.
11
+ */
12
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type,@typescript-eslint/explicit-module-boundary-types -- Preserve specific object shape.
13
+ export default function makeStylelintConfig(cssRules = {}, scssRules = {}) {
14
+ return {
15
+ defaultSeverity: 'error',
16
+ ignoreFiles: ['**/*.min.*'],
17
+ plugins: [orderPlugin, useLogicalPlugin],
18
+ reportDescriptionlessDisables: true,
19
+ reportInvalidScopeDisables: true,
20
+ reportNeedlessDisables: true,
21
+ rules: {
22
+ ...rulesetStylelintCss,
23
+ ...cssRules,
24
+ },
25
+ // eslint-disable-next-line sort-keys -- Logically positioned.
26
+ overrides: [
27
+ {
28
+ customSyntax: postcssScss,
29
+ files: extensions.scss.map((ext) => `**/*.${ext}`), // Does not support glob braces
30
+ plugins: [scssPlugin],
31
+ rules: {
32
+ ...rulesetStylelintScss,
33
+ ...scssRules,
34
+ },
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ //# sourceMappingURL=makeStylelintConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeStylelintConfig.js","sourceRoot":"","sources":["../../src/makeStylelintConfig.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAErD,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AACvE,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AAEzE,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAIzC;;GAEG;AACH,iKAAiK;AACjK,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,WAAwB,EAAE,EAAE,YAAyB,EAAE;IACjG,OAAO;QACL,eAAe,EAAE,OAAO;QACxB,WAAW,EAAE,CAAC,YAAY,CAAC;QAC3B,OAAO,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC;QACxC,6BAA6B,EAAE,IAAI;QACnC,0BAA0B,EAAE,IAAI;QAChC,sBAAsB,EAAE,IAAI;QAC5B,KAAK,EAAE;YACL,GAAG,mBAAmB;YACtB,GAAG,QAAQ;SACZ;QAED,8DAA8D;QAC9D,SAAS,EAAE;YACT;gBACE,YAAY,EAAE,WAAsC;gBACpD,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,+BAA+B;gBACnF,OAAO,EAAE,CAAC,UAAU,CAAC;gBACrB,KAAK,EAAE;oBACL,GAAG,oBAAoB;oBACvB,GAAG,SAAS;iBACb;aACF;SACF;KACe,CAAC;AACrB,CAAC"}
@@ -1,7 +1,20 @@
1
1
  /* eslint require-unicode-regexp: 'off' -- Expressions are passed to Stylelint as strings so cannot use any flags in order to match their behaviour. */
2
- export default {
2
+
3
+ const patterns = {
3
4
  bem: /^[a-z]+(?:(?:-|--|__)[a-z]+)*$/.source,
4
5
  bemWithOptionalSingleUnderscorePrefix: /^_?[a-z]+(?:(?:-|--|__)[a-z]+)*$/.source,
5
6
  bemWithOptionalUnderscoresPrefix: /^(?:__)?[a-z]+(?:(?:-|--|__)[a-z]+)*$/.source,
6
7
  kebab: /^[a-z]+(?:-[a-z]+)*$/.source,
7
- } satisfies Record<string, string>;
8
+ } as const satisfies Record<string, string>;
9
+
10
+ export function patternOrScssInterpolation(pattern: string): string {
11
+ // Remove anchors
12
+ if (!pattern.startsWith('^') || !pattern.endsWith('$')) {
13
+ throw new Error('Pattern must use both start & end anchors.');
14
+ }
15
+ pattern = pattern.slice(1, -1);
16
+
17
+ return new RegExp(`^(?:#{[^}]+}|${pattern})$`).source;
18
+ }
19
+
20
+ export default patterns;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@averay/codeformat",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "author": "Adam Averay (https://adamaveray.com.au/)",
5
5
  "homepage": "https://github.com/adamaveray/codeformat",
6
6
  "repository": {
@@ -13,17 +13,21 @@
13
13
  "engines": {
14
14
  "bun": ">=1.2"
15
15
  },
16
- "source": "./src/index.ts",
17
16
  "bin": {
18
- "codeformat": "bin/codeformat.ts"
17
+ "codeformat": "dist/bin/codeformat.js"
19
18
  },
20
- "main": "./src/index.ts",
19
+ "main": "dist/src/index.js",
20
+ "types": "dist/src/index.d.ts",
21
21
  "scripts": {
22
+ "build": "rm -rf dist && bun run build:tsc && chmod +x dist/bin/*.js",
23
+ "build:tsc": "bun --bun x tsc --project tsconfig.build.json --outDir dist",
22
24
  "test": "bun test",
23
- "format": "bin/codeformat.ts fix",
24
- "lint": "bin/codeformat.ts check",
25
+ "format": "dist/bin/codeformat.js fix",
26
+ "lint": "dist/bin/codeformat.js check",
25
27
  "prepare": "bun --bun x husky",
26
- "release": "bun run lint && bun --bun x bumpp && bun publish"
28
+ "prepack": "bun run build",
29
+ "release": "bun run lint && bun --bun x bumpp && bun publish",
30
+ "watch": "bun run build:tsc --watch"
27
31
  },
28
32
  "dependencies": {
29
33
  "@averay/css-properties-sort-order": "^1.0.3",
@@ -32,8 +36,8 @@
32
36
  "@prettier/plugin-php": "^0.22.4",
33
37
  "@prettier/plugin-xml": "^3.4.1",
34
38
  "@stylistic/eslint-plugin": "^4.4.1",
35
- "@typescript-eslint/eslint-plugin": "^8.34.0",
36
- "@typescript-eslint/parser": "^8.34.0",
39
+ "@typescript-eslint/eslint-plugin": "^8.34.1",
40
+ "@typescript-eslint/parser": "^8.34.1",
37
41
  "eslint-config-prettier": "^10.1.5",
38
42
  "eslint-import-resolver-typescript": "^4.4.3",
39
43
  "eslint-plugin-eslint-comments": "^3.2.0",
@@ -41,7 +45,7 @@
41
45
  "eslint-plugin-jsdoc": "^51.0.1",
42
46
  "eslint-plugin-promise": "^7.2.1",
43
47
  "eslint-plugin-regexp": "^2.9.0",
44
- "eslint-plugin-sonarjs": "^3.0.2",
48
+ "eslint-plugin-sonarjs": "^3.0.3",
45
49
  "eslint-plugin-unicorn": "^59.0.1",
46
50
  "globals": "^16.2.0",
47
51
  "postcss-scss": "^4.0.9",
@@ -53,11 +57,12 @@
53
57
  "stylelint-config-standard-scss": "^15.0.1",
54
58
  "stylelint-order": "^7.0.0",
55
59
  "stylelint-scss": "^6.12.1",
56
- "typescript-eslint": "^8.34.0"
60
+ "stylelint-use-logical": "^2.1.2",
61
+ "typescript-eslint": "^8.34.1"
57
62
  },
58
63
  "devDependencies": {
59
64
  "@types/bun": "latest",
60
- "bumpp": "^10.1.1",
65
+ "bumpp": "^10.2.0",
61
66
  "husky": "^9.1.7",
62
67
  "typescript": "^5.8.3"
63
68
  }
@@ -33,6 +33,7 @@ export default {
33
33
  },
34
34
 
35
35
  // Extensions
36
+ 'csstools/use-logical': 'always',
36
37
  'order/order': ['custom-properties', 'declarations'],
37
38
  'order/properties-order': [propertiesOrder, { unspecified: 'bottomAlphabetical' }],
38
39
  };
@@ -1,7 +1,7 @@
1
1
  import recommended from 'stylelint-config-recommended-scss';
2
2
  import standard from 'stylelint-config-standard-scss';
3
3
 
4
- import patterns from '../../lib/cssPatterns.ts';
4
+ import patterns, { patternOrScssInterpolation } from '../../lib/cssPatterns.ts';
5
5
 
6
6
  export default {
7
7
  ...recommended.rules,
@@ -25,8 +25,23 @@ export default {
25
25
  'scss/operator-no-unspaced': null,
26
26
  },
27
27
 
28
- 'scss/at-function-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
29
- 'scss/at-mixin-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
30
- 'scss/dollar-variable-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
31
- 'scss/percent-placeholder-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
28
+ // Naming patterns
29
+ ...{
30
+ 'scss/at-function-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
31
+ 'scss/at-mixin-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
32
+ 'scss/dollar-variable-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
33
+ 'scss/percent-placeholder-pattern': patterns.bemWithOptionalSingleUnderscorePrefix,
34
+ },
35
+
36
+ // Support interpolation for @ keywords
37
+ ...{
38
+ 'container-name-pattern': patternOrScssInterpolation(patterns.bem),
39
+ 'custom-media-pattern': patternOrScssInterpolation(patterns.bem),
40
+ 'custom-property-pattern': patternOrScssInterpolation(patterns.bem),
41
+ 'keyframes-name-pattern': patternOrScssInterpolation(patterns.bem),
42
+ 'layer-name-pattern': patternOrScssInterpolation(patterns.bem),
43
+ },
44
+
45
+ // Customise rulesets
46
+ 'scss/at-if-no-null': null,
32
47
  };
@@ -4,6 +4,7 @@ import postcssScss from 'postcss-scss';
4
4
  import { type Config, type CustomSyntax } from 'stylelint';
5
5
  import orderPlugin from 'stylelint-order';
6
6
  import scssPlugin from 'stylelint-scss';
7
+ import useLogicalPlugin from 'stylelint-use-logical';
7
8
 
8
9
  import rulesetStylelintCss from '../rulesets/stylelint/ruleset-css.ts';
9
10
  import rulesetStylelintScss from '../rulesets/stylelint/ruleset-scss.ts';
@@ -20,7 +21,7 @@ export default function makeStylelintConfig(cssRules: ConfigRules = {}, scssRule
20
21
  return {
21
22
  defaultSeverity: 'error',
22
23
  ignoreFiles: ['**/*.min.*'],
23
- plugins: [orderPlugin],
24
+ plugins: [orderPlugin, useLogicalPlugin],
24
25
  reportDescriptionlessDisables: true,
25
26
  reportInvalidScopeDisables: true,
26
27
  reportNeedlessDisables: true,
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "declaration": true,
5
+ "module": "Node16",
6
+ "moduleResolution": "Node16",
7
+ "noEmit": false,
8
+ "rewriteRelativeImportExtensions": true,
9
+ "sourceMap": true
10
+ },
11
+ "include": ["bin/**/*.ts", "lib/**/*.ts", "rulesets/**/*.ts", "src/**/*.ts"],
12
+ "exclude": ["**/*.test.ts"]
13
+ }
package/tsconfig.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "extends": "./tsconfig.base.json",
3
+ "exclude": ["dist/**/*"],
3
4
  "compilerOptions": {
4
5
  "baseUrl": ".",
5
6
  "rootDir": "./",
package/types.d.ts CHANGED
@@ -95,3 +95,9 @@ declare module 'stylelint-scss' {
95
95
 
96
96
  export default {} as Plugin;
97
97
  }
98
+
99
+ declare module 'stylelint-use-logical' {
100
+ import { type Plugin } from 'stylelint';
101
+
102
+ export default {} as Plugin;
103
+ }