@storm-software/eslint 0.144.1 → 0.144.3

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/dist/preset.js CHANGED
@@ -350,7 +350,7 @@ async function formatters(options = {}, stylistic2 = {}) {
350
350
  useTabs: indent === "tab"
351
351
  }, options.dprintOptions ?? {});
352
352
  const pluginFormat = await interopDefault(import("eslint-plugin-format"));
353
- const configs2 = [
353
+ const configs3 = [
354
354
  {
355
355
  name: "storm/formatter/setup",
356
356
  plugins: {
@@ -359,7 +359,7 @@ async function formatters(options = {}, stylistic2 = {}) {
359
359
  }
360
360
  ];
361
361
  if (options.css) {
362
- configs2.push({
362
+ configs3.push({
363
363
  files: [
364
364
  GLOB_CSS,
365
365
  GLOB_POSTCSS
@@ -411,7 +411,7 @@ async function formatters(options = {}, stylistic2 = {}) {
411
411
  });
412
412
  }
413
413
  if (options.html) {
414
- configs2.push({
414
+ configs3.push({
415
415
  files: [
416
416
  GLOB_HTML
417
417
  ],
@@ -430,7 +430,7 @@ async function formatters(options = {}, stylistic2 = {}) {
430
430
  });
431
431
  }
432
432
  if (options.xml) {
433
- configs2.push({
433
+ configs3.push({
434
434
  files: [
435
435
  GLOB_XML
436
436
  ],
@@ -455,7 +455,7 @@ async function formatters(options = {}, stylistic2 = {}) {
455
455
  });
456
456
  }
457
457
  if (options.svg) {
458
- configs2.push({
458
+ configs3.push({
459
459
  files: [
460
460
  GLOB_SVG
461
461
  ],
@@ -481,7 +481,7 @@ async function formatters(options = {}, stylistic2 = {}) {
481
481
  }
482
482
  if (options.markdown) {
483
483
  const formater = options.markdown === true ? "prettier" : options.markdown;
484
- configs2.push({
484
+ configs3.push({
485
485
  files: [
486
486
  GLOB_MARKDOWN
487
487
  ],
@@ -504,7 +504,7 @@ async function formatters(options = {}, stylistic2 = {}) {
504
504
  });
505
505
  }
506
506
  if (options.astro) {
507
- configs2.push({
507
+ configs3.push({
508
508
  files: [
509
509
  GLOB_ASTRO
510
510
  ],
@@ -524,7 +524,7 @@ async function formatters(options = {}, stylistic2 = {}) {
524
524
  ]
525
525
  }
526
526
  });
527
- configs2.push({
527
+ configs3.push({
528
528
  files: [
529
529
  GLOB_ASTRO,
530
530
  GLOB_ASTRO_TS
@@ -542,7 +542,7 @@ async function formatters(options = {}, stylistic2 = {}) {
542
542
  });
543
543
  }
544
544
  if (options.graphql) {
545
- configs2.push({
545
+ configs3.push({
546
546
  files: [
547
547
  GLOB_GRAPHQL
548
548
  ],
@@ -560,7 +560,7 @@ async function formatters(options = {}, stylistic2 = {}) {
560
560
  }
561
561
  });
562
562
  }
563
- return configs2;
563
+ return configs3;
564
564
  }
565
565
  __name(formatters, "formatters");
566
566
 
@@ -810,6 +810,704 @@ import * as pluginImport from "eslint-plugin-import-x";
810
810
  import { default as default4 } from "eslint-plugin-n";
811
811
  import { default as default5 } from "eslint-plugin-no-secrets";
812
812
  import { default as default6 } from "eslint-plugin-perfectionist";
813
+
814
+ // ../../node_modules/.pnpm/eslint-plugin-pnpm@0.3.0_patch_hash=72dcde755c336eeca3e6170de1106fd85ecb66171e060788f80_167ca0fed09ad05248614e7080eb405f/node_modules/eslint-plugin-pnpm/dist/index.mjs
815
+ import * as jsoncParser from "jsonc-eslint-parser";
816
+ import * as yamlParser from "yaml-eslint-parser";
817
+ import fs, { existsSync, readFileSync } from "node:fs";
818
+ import process from "node:process";
819
+ import { findUpSync } from "find-up-simple";
820
+ import { parsePnpmWorkspaceYaml } from "pnpm-workspace-yaml";
821
+ import { basename, normalize, resolve, dirname } from "pathe";
822
+ import { globSync } from "tinyglobby";
823
+ var name = "eslint-plugin-pnpm";
824
+ var version = "0.3.0";
825
+ var blobUrl = "https://github.com/antfu/eslint-plugin-pnpm/blob/main/src/rules/";
826
+ function RuleCreator(urlCreator) {
827
+ return /* @__PURE__ */ __name(function createNamedRule({
828
+ name: name2,
829
+ meta,
830
+ ...rule
831
+ }) {
832
+ return createRule({
833
+ meta: {
834
+ ...meta,
835
+ docs: {
836
+ ...meta.docs,
837
+ url: urlCreator(name2)
838
+ }
839
+ },
840
+ ...rule
841
+ });
842
+ }, "createNamedRule");
843
+ }
844
+ __name(RuleCreator, "RuleCreator");
845
+ function createRule({
846
+ create,
847
+ defaultOptions,
848
+ meta
849
+ }) {
850
+ return {
851
+ create: /* @__PURE__ */ __name((context) => {
852
+ const optionsWithDefault = context.options.map((options, index) => {
853
+ return {
854
+ ...defaultOptions[index] || {},
855
+ ...options || {}
856
+ };
857
+ });
858
+ return create(context, optionsWithDefault);
859
+ }, "create"),
860
+ defaultOptions,
861
+ meta
862
+ };
863
+ }
864
+ __name(createRule, "createRule");
865
+ var createEslintRule = RuleCreator(
866
+ (ruleName) => `${blobUrl}${ruleName}.test.ts`
867
+ );
868
+ function getPackageJsonRootNode(context) {
869
+ if (!context.filename.endsWith("package.json"))
870
+ return;
871
+ const ast = context.sourceCode.ast;
872
+ const root = ast.body[0];
873
+ if (root.expression.type === "JSONObjectExpression")
874
+ return root.expression;
875
+ }
876
+ __name(getPackageJsonRootNode, "getPackageJsonRootNode");
877
+ function* iterateDependencies(context, fields) {
878
+ const root = getPackageJsonRootNode(context);
879
+ if (!root)
880
+ return;
881
+ for (const fieldName of fields) {
882
+ const path = fieldName.split(".");
883
+ let node2 = root;
884
+ for (let i = 0; i < path.length; i++) {
885
+ const item = node2.properties.find((property) => property.key.type === "JSONLiteral" && property.key.value === path[i]);
886
+ if (!item?.value || item.value.type !== "JSONObjectExpression") {
887
+ node2 = void 0;
888
+ break;
889
+ }
890
+ node2 = item.value;
891
+ }
892
+ if (!node2 || node2 === root)
893
+ continue;
894
+ for (const property of node2.properties) {
895
+ if (property.value.type !== "JSONLiteral" || property.key.type !== "JSONLiteral")
896
+ continue;
897
+ if (typeof property.value.value !== "string")
898
+ continue;
899
+ const packageName = String(property.key.value);
900
+ const specifier = String(property.value.value);
901
+ yield {
902
+ packageName,
903
+ specifier,
904
+ property
905
+ };
906
+ }
907
+ }
908
+ }
909
+ __name(iterateDependencies, "iterateDependencies");
910
+ function readPnpmWorkspace() {
911
+ const filepath = findUpSync("pnpm-workspace.yaml", { cwd: process.cwd() });
912
+ if (!filepath)
913
+ throw new Error("pnpm-workspace.yaml not found");
914
+ const content = fs.readFileSync(filepath, "utf-8");
915
+ const workspace2 = parsePnpmWorkspaceYaml(content);
916
+ let queueTimer;
917
+ const queue = [];
918
+ const write = /* @__PURE__ */ __name(() => {
919
+ fs.writeFileSync(filepath, workspace2.toString());
920
+ }, "write");
921
+ const hasQueue = /* @__PURE__ */ __name(() => queueTimer != null, "hasQueue");
922
+ const queueChange = /* @__PURE__ */ __name((fn, order) => {
923
+ if (order === "pre")
924
+ queue.unshift(fn);
925
+ else
926
+ queue.push(fn);
927
+ if (queueTimer != null)
928
+ clearTimeout(queueTimer);
929
+ queueTimer = setTimeout(() => {
930
+ queueTimer = void 0;
931
+ const clone = [...queue];
932
+ queue.length = 0;
933
+ for (const fn2 of clone)
934
+ fn2(workspace2);
935
+ if (workspace2.hasChanged())
936
+ write();
937
+ }, 1e3);
938
+ }, "queueChange");
939
+ return {
940
+ filepath,
941
+ ...workspace2,
942
+ hasQueue,
943
+ queueChange
944
+ };
945
+ }
946
+ __name(readPnpmWorkspace, "readPnpmWorkspace");
947
+ var WORKSPACE_CACHE_TIME = 1e4;
948
+ var workspaceLastRead;
949
+ var workspace;
950
+ function getPnpmWorkspace() {
951
+ if (workspaceLastRead && workspace && !workspace.hasQueue() && Date.now() - workspaceLastRead > WORKSPACE_CACHE_TIME) {
952
+ workspace = void 0;
953
+ }
954
+ if (!workspace) {
955
+ workspace = readPnpmWorkspace();
956
+ workspaceLastRead = Date.now();
957
+ }
958
+ return workspace;
959
+ }
960
+ __name(getPnpmWorkspace, "getPnpmWorkspace");
961
+ var RULE_NAME$4 = "json-enforce-catalog";
962
+ var DEFAULT_FIELDS$1 = [
963
+ "dependencies",
964
+ "devDependencies"
965
+ ];
966
+ var IGNORED_DEPENDENCIES = [
967
+ "typescript"
968
+ ];
969
+ var enforceCatalog = createEslintRule({
970
+ name: RULE_NAME$4,
971
+ meta: {
972
+ type: "layout",
973
+ docs: {
974
+ description: 'Enforce using "catalog:" in `package.json`'
975
+ },
976
+ fixable: "code",
977
+ schema: [
978
+ {
979
+ type: "object",
980
+ properties: {
981
+ allowedProtocols: {
982
+ type: "array",
983
+ description: "Allowed protocols in specifier to not be converted to catalog",
984
+ items: {
985
+ type: "string"
986
+ }
987
+ },
988
+ autofix: {
989
+ type: "boolean",
990
+ description: "Whether to autofix the linting error",
991
+ default: true
992
+ },
993
+ defaultCatalog: {
994
+ type: "string",
995
+ description: "Default catalog to use when moving version to catalog with autofix"
996
+ },
997
+ reuseExistingCatalog: {
998
+ type: "boolean",
999
+ description: "Whether to reuse existing catalog when moving version to catalog with autofix",
1000
+ default: true
1001
+ },
1002
+ conflicts: {
1003
+ type: "string",
1004
+ description: "Strategy to handle conflicts when adding packages to catalogs",
1005
+ enum: ["new-catalog", "overrides", "error"],
1006
+ default: "new-catalog"
1007
+ },
1008
+ fields: {
1009
+ type: "array",
1010
+ description: "Fields to check for catalog",
1011
+ items: { type: "string" },
1012
+ default: DEFAULT_FIELDS$1
1013
+ },
1014
+ ignore: {
1015
+ type: "array",
1016
+ description: "A list of dependencies to ignore",
1017
+ items: { type: "string" },
1018
+ default: IGNORED_DEPENDENCIES
1019
+ }
1020
+ },
1021
+ additionalProperties: false
1022
+ }
1023
+ ],
1024
+ messages: {
1025
+ expectCatalog: 'Expect to use catalog instead of plain specifier, got "{{specifier}}" for package "{{packageName}}".'
1026
+ }
1027
+ },
1028
+ defaultOptions: [{}],
1029
+ create(context, [options]) {
1030
+ const {
1031
+ allowedProtocols = ["workspace", "link", "file"],
1032
+ defaultCatalog = "default",
1033
+ autofix = true,
1034
+ reuseExistingCatalog = true,
1035
+ conflicts = "new-catalog",
1036
+ fields = DEFAULT_FIELDS$1,
1037
+ ignore = IGNORED_DEPENDENCIES
1038
+ } = options || {};
1039
+ for (const { packageName, specifier, property } of iterateDependencies(context, fields)) {
1040
+ if (ignore?.some((i) => i === packageName))
1041
+ continue;
1042
+ if (specifier.startsWith("catalog:"))
1043
+ continue;
1044
+ if (allowedProtocols?.some((p) => specifier.startsWith(p)))
1045
+ continue;
1046
+ const workspace2 = getPnpmWorkspace();
1047
+ if (!workspace2)
1048
+ return {};
1049
+ let targetCatalog = reuseExistingCatalog ? workspace2.getPackageCatalogs(packageName)[0] || defaultCatalog : defaultCatalog;
1050
+ const resolvedConflicts = workspace2.hasSpecifierConflicts(
1051
+ targetCatalog,
1052
+ packageName,
1053
+ specifier
1054
+ );
1055
+ let shouldFix = autofix;
1056
+ if (conflicts === "error") {
1057
+ if (resolvedConflicts.conflicts) {
1058
+ shouldFix = false;
1059
+ }
1060
+ }
1061
+ if (conflicts === "new-catalog" && resolvedConflicts.conflicts) {
1062
+ targetCatalog = resolvedConflicts.newCatalogName;
1063
+ }
1064
+ context.report({
1065
+ node: property.value,
1066
+ messageId: "expectCatalog",
1067
+ data: {
1068
+ specifier,
1069
+ packageName
1070
+ },
1071
+ fix: shouldFix ? (fixer) => {
1072
+ workspace2.queueChange(() => {
1073
+ workspace2.setPackage(targetCatalog, packageName, specifier);
1074
+ });
1075
+ return fixer.replaceText(
1076
+ property.value,
1077
+ targetCatalog === "default" ? JSON.stringify("catalog:") : JSON.stringify(`catalog:${targetCatalog}`)
1078
+ );
1079
+ } : void 0
1080
+ });
1081
+ }
1082
+ return {};
1083
+ }
1084
+ });
1085
+ var RULE_NAME$3 = "json-prefer-workspace-settings";
1086
+ var preferWorkspaceSettings = createEslintRule({
1087
+ name: RULE_NAME$3,
1088
+ meta: {
1089
+ type: "layout",
1090
+ docs: {
1091
+ description: "Prefer having pnpm settings in `pnpm-workspace.yaml` instead of `package.json`. This would requires pnpm v10.6+, see https://github.com/orgs/pnpm/discussions/9037."
1092
+ },
1093
+ fixable: "code",
1094
+ schema: [
1095
+ {
1096
+ type: "object",
1097
+ properties: {
1098
+ autofix: {
1099
+ type: "boolean",
1100
+ description: "Whether to autofix the linting error",
1101
+ default: true
1102
+ }
1103
+ },
1104
+ additionalProperties: false
1105
+ }
1106
+ ],
1107
+ messages: {
1108
+ unexpectedPnpmSettings: "Unexpected pnpm settings in package.json, should move to pnpm-workspace.yaml"
1109
+ }
1110
+ },
1111
+ defaultOptions: [{}],
1112
+ create(context, [options = {}]) {
1113
+ const {
1114
+ autofix = true
1115
+ } = options || {};
1116
+ const root = getPackageJsonRootNode(context);
1117
+ if (!root)
1118
+ return {};
1119
+ const pnpmNode = root.properties.find((property) => property.key.type === "JSONLiteral" && property.key.value === "pnpm");
1120
+ if (!pnpmNode)
1121
+ return {};
1122
+ const workspace2 = getPnpmWorkspace();
1123
+ if (!workspace2)
1124
+ return {};
1125
+ context.report({
1126
+ node: pnpmNode,
1127
+ messageId: "unexpectedPnpmSettings",
1128
+ fix: autofix ? (fixer) => {
1129
+ const json = JSON.parse(context.sourceCode.text);
1130
+ const pnpmSettings = json.pnpm;
1131
+ const flatValueParis = [];
1132
+ function traverse(value, paths) {
1133
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1134
+ for (const key in value) {
1135
+ traverse(value[key], [...paths, key]);
1136
+ }
1137
+ } else {
1138
+ flatValueParis.push([paths, value]);
1139
+ }
1140
+ }
1141
+ __name(traverse, "traverse");
1142
+ traverse(pnpmSettings, []);
1143
+ workspace2.queueChange(() => {
1144
+ for (const [paths, value] of flatValueParis) {
1145
+ workspace2.setPath(paths, value);
1146
+ }
1147
+ });
1148
+ let start = pnpmNode.range[0];
1149
+ let end = pnpmNode.range[1];
1150
+ const before = context.sourceCode.getTokenBefore(pnpmNode);
1151
+ if (before)
1152
+ start = before.range[1];
1153
+ const after = context.sourceCode.getTokenAfter(pnpmNode);
1154
+ if (after?.type === "Punctuator" && after.value === ",")
1155
+ end = after.range[1];
1156
+ return fixer.removeRange([start, end]);
1157
+ } : void 0
1158
+ });
1159
+ return {};
1160
+ }
1161
+ });
1162
+ var RULE_NAME$2 = "json-valid-catalog";
1163
+ var DEFAULT_FIELDS = [
1164
+ "dependencies",
1165
+ "devDependencies",
1166
+ "optionalDependencies",
1167
+ "peerDependencies",
1168
+ "resolutions",
1169
+ "overrides",
1170
+ "pnpm.overrides"
1171
+ ];
1172
+ var validCatalog = createEslintRule({
1173
+ name: RULE_NAME$2,
1174
+ meta: {
1175
+ type: "layout",
1176
+ docs: {
1177
+ description: "Enforce using valid catalog in `package.json`"
1178
+ },
1179
+ fixable: "code",
1180
+ schema: [
1181
+ {
1182
+ type: "object",
1183
+ properties: {
1184
+ autoInsert: {
1185
+ type: "boolean",
1186
+ description: "Whether to auto insert to catalog if missing",
1187
+ default: true
1188
+ },
1189
+ autoInsertDefaultSpecifier: {
1190
+ type: "string",
1191
+ description: "Default specifier to use when auto inserting to catalog",
1192
+ default: "^0.0.0"
1193
+ },
1194
+ autofix: {
1195
+ type: "boolean",
1196
+ description: "Whether to autofix the linting error",
1197
+ default: true
1198
+ },
1199
+ enforceNoConflict: {
1200
+ type: "boolean",
1201
+ description: "Whether to enforce no conflicts when adding packages to catalogs (will create version-specific catalogs)",
1202
+ default: true
1203
+ },
1204
+ fields: {
1205
+ type: "array",
1206
+ description: "Fields to check for catalog",
1207
+ default: DEFAULT_FIELDS
1208
+ }
1209
+ },
1210
+ additionalProperties: false
1211
+ }
1212
+ ],
1213
+ messages: {
1214
+ invalidCatalog: 'Catalog "{{specifier}}" for package "{{packageName}}" is not defined in `pnpm-workspace.yaml`.'
1215
+ }
1216
+ },
1217
+ defaultOptions: [{}],
1218
+ create(context, [options = {}]) {
1219
+ const {
1220
+ autoInsert = true,
1221
+ autofix = true,
1222
+ autoInsertDefaultSpecifier = "^0.0.0",
1223
+ fields = DEFAULT_FIELDS
1224
+ } = options || {};
1225
+ for (const { packageName, specifier, property } of iterateDependencies(context, fields)) {
1226
+ if (!specifier.startsWith("catalog:"))
1227
+ continue;
1228
+ const workspace2 = getPnpmWorkspace();
1229
+ if (!workspace2)
1230
+ return {};
1231
+ const currentCatalog = specifier.replace(/^catalog:/, "").trim() || "default";
1232
+ const existingCatalogs = workspace2.getPackageCatalogs(packageName);
1233
+ if (!existingCatalogs.includes(currentCatalog)) {
1234
+ context.report({
1235
+ node: property.value,
1236
+ messageId: "invalidCatalog",
1237
+ data: {
1238
+ specifier,
1239
+ packageName
1240
+ },
1241
+ fix: !autofix || !autoInsert && !existingCatalogs.length ? void 0 : (fixer) => {
1242
+ let catalog = existingCatalogs[0];
1243
+ if (!catalog && autoInsert) {
1244
+ catalog = currentCatalog;
1245
+ workspace2.queueChange(() => {
1246
+ workspace2.setPackage(catalog, packageName, autoInsertDefaultSpecifier);
1247
+ }, "pre");
1248
+ }
1249
+ return fixer.replaceText(
1250
+ property.value,
1251
+ catalog === "default" ? JSON.stringify("catalog:") : JSON.stringify(`catalog:${catalog}`)
1252
+ );
1253
+ }
1254
+ });
1255
+ }
1256
+ }
1257
+ return {};
1258
+ }
1259
+ });
1260
+ var rules$2 = {
1261
+ "json-enforce-catalog": enforceCatalog,
1262
+ "json-valid-catalog": validCatalog,
1263
+ "json-prefer-workspace-settings": preferWorkspaceSettings
1264
+ };
1265
+ var RULE_NAME$1 = "yaml-no-duplicate-catalog-item";
1266
+ var noDuplicateCatalogItem = createEslintRule({
1267
+ name: RULE_NAME$1,
1268
+ meta: {
1269
+ type: "problem",
1270
+ docs: {
1271
+ description: "Disallow unused catalogs in `pnpm-workspace.yaml`"
1272
+ },
1273
+ fixable: "code",
1274
+ schema: [
1275
+ {
1276
+ type: "object",
1277
+ properties: {
1278
+ allow: {
1279
+ type: "array",
1280
+ items: { type: "string" }
1281
+ }
1282
+ },
1283
+ additionalProperties: false
1284
+ }
1285
+ ],
1286
+ messages: {
1287
+ duplicateCatalogItem: 'Catalog item "{{name}}" is already defined in the "{{existingCatalog}}" catalog. You may want to remove one of them.'
1288
+ }
1289
+ },
1290
+ defaultOptions: [{}],
1291
+ create(context, [options = {}]) {
1292
+ if (basename(context.filename) !== "pnpm-workspace.yaml")
1293
+ return {};
1294
+ const workspace2 = getPnpmWorkspace();
1295
+ if (!workspace2 || normalize(workspace2.filepath) !== normalize(context.filename))
1296
+ return {};
1297
+ if (workspace2.hasChanged() || workspace2.hasQueue())
1298
+ return {};
1299
+ const { allow = [] } = options;
1300
+ workspace2.setContent(context.sourceCode.text);
1301
+ const json = workspace2.toJSON() || {};
1302
+ const exists = /* @__PURE__ */ new Map();
1303
+ const catalogs = {
1304
+ ...json.catalogs,
1305
+ default: json.catalog
1306
+ };
1307
+ const doc = workspace2.getDocument();
1308
+ for (const [catalog, object] of Object.entries(catalogs)) {
1309
+ if (!object)
1310
+ continue;
1311
+ for (const key of Object.keys(object)) {
1312
+ if (allow.includes(key))
1313
+ continue;
1314
+ if (exists.has(key)) {
1315
+ const existingCatalog = exists.get(key);
1316
+ const node2 = doc.getIn(catalog === "default" ? ["catalog", key] : ["catalogs", catalog, key], true);
1317
+ const start = context.sourceCode.getLocFromIndex(node2.range[0]);
1318
+ const end = context.sourceCode.getLocFromIndex(node2.range[1]);
1319
+ context.report({
1320
+ loc: {
1321
+ start,
1322
+ end
1323
+ },
1324
+ messageId: "duplicateCatalogItem",
1325
+ data: {
1326
+ name: key,
1327
+ currentCatalog: catalog,
1328
+ existingCatalog
1329
+ }
1330
+ });
1331
+ } else {
1332
+ exists.set(key, catalog);
1333
+ }
1334
+ }
1335
+ }
1336
+ return {};
1337
+ }
1338
+ });
1339
+ var RULE_NAME = "yaml-no-unused-catalog-item";
1340
+ var noUnusedCatalogItem = createEslintRule({
1341
+ name: RULE_NAME,
1342
+ meta: {
1343
+ type: "problem",
1344
+ docs: {
1345
+ description: "Disallow unused catalogs in `pnpm-workspace.yaml`"
1346
+ },
1347
+ fixable: "code",
1348
+ schema: [],
1349
+ messages: {
1350
+ unusedCatalogItem: 'Catalog item "{{catalogItem}}" is not used in any package.json.'
1351
+ }
1352
+ },
1353
+ defaultOptions: [],
1354
+ create(context) {
1355
+ if (basename(context.filename) !== "pnpm-workspace.yaml")
1356
+ return {};
1357
+ const workspace2 = getPnpmWorkspace();
1358
+ if (!workspace2 || normalize(workspace2.filepath) !== normalize(context.filename))
1359
+ return {};
1360
+ if (workspace2.hasChanged() || workspace2.hasQueue())
1361
+ return {};
1362
+ workspace2.setContent(context.sourceCode.text);
1363
+ const parsed = workspace2.toJSON() || {};
1364
+ const root = resolve(dirname(context.filename));
1365
+ const entries = /* @__PURE__ */ new Map();
1366
+ const doc = workspace2.getDocument();
1367
+ const catalogs = {
1368
+ default: doc.getIn(["catalog"])
1369
+ };
1370
+ for (const item of doc.getIn(["catalogs"])?.items || [])
1371
+ catalogs[String(item.key)] = item.value;
1372
+ for (const [catalog, map] of Object.entries(catalogs)) {
1373
+ if (!map)
1374
+ continue;
1375
+ for (const item of map.items) {
1376
+ entries.set(`${String(item.key)}:${catalog}`, item);
1377
+ }
1378
+ }
1379
+ if (entries.size === 0)
1380
+ return {};
1381
+ const dirs = parsed.packages ? globSync(parsed.packages, {
1382
+ cwd: root,
1383
+ dot: false,
1384
+ ignore: [
1385
+ "**/node_modules/**",
1386
+ "**/dist/**",
1387
+ "**/build/**",
1388
+ "**/dist/**",
1389
+ "**/dist/**"
1390
+ ],
1391
+ absolute: true,
1392
+ expandDirectories: false,
1393
+ onlyDirectories: true
1394
+ }) : [];
1395
+ dirs.push(root);
1396
+ const packages = dirs.map((dir) => resolve(dir, "package.json")).filter((x) => existsSync(x)).sort();
1397
+ const FIELDS = [
1398
+ "dependencies",
1399
+ "devDependencies",
1400
+ "peerDependencies",
1401
+ "optionalDependencies",
1402
+ "overrides",
1403
+ "resolutions",
1404
+ "pnpm.overrides"
1405
+ ];
1406
+ for (const path of packages) {
1407
+ const pkg = JSON.parse(readFileSync(path, "utf-8"));
1408
+ for (const field of FIELDS) {
1409
+ const map = getObjectPath(pkg, field.split("."));
1410
+ if (!map)
1411
+ continue;
1412
+ for (const [name2, value] of Object.entries(map)) {
1413
+ if (!value.startsWith("catalog:"))
1414
+ continue;
1415
+ const catalog = value.slice(8) || "default";
1416
+ const key = `${name2}:${catalog}`;
1417
+ entries.delete(key);
1418
+ }
1419
+ }
1420
+ }
1421
+ if (entries.size > 0) {
1422
+ for (const [key, value] of Array.from(entries.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {
1423
+ const start = context.sourceCode.getLocFromIndex(value.key.range[0]);
1424
+ const end = context.sourceCode.getLocFromIndex(value.value.range.at(-1));
1425
+ context.report({
1426
+ loc: {
1427
+ start,
1428
+ end
1429
+ },
1430
+ messageId: "unusedCatalogItem",
1431
+ data: { catalogItem: key }
1432
+ });
1433
+ }
1434
+ }
1435
+ return {};
1436
+ }
1437
+ });
1438
+ function getObjectPath(obj, path) {
1439
+ let current = obj;
1440
+ for (const key of path) {
1441
+ current = current[key];
1442
+ if (!current)
1443
+ return void 0;
1444
+ }
1445
+ return current;
1446
+ }
1447
+ __name(getObjectPath, "getObjectPath");
1448
+ var rules$1 = {
1449
+ "yaml-no-unused-catalog-item": noUnusedCatalogItem,
1450
+ "yaml-no-duplicate-catalog-item": noDuplicateCatalogItem
1451
+ };
1452
+ var rules = {
1453
+ ...rules$2,
1454
+ ...rules$1
1455
+ };
1456
+ var plugin = {
1457
+ meta: {
1458
+ name,
1459
+ version
1460
+ },
1461
+ rules
1462
+ };
1463
+ var configsJson = [
1464
+ {
1465
+ name: "pnpm/package.json",
1466
+ files: [
1467
+ "package.json",
1468
+ "**/package.json"
1469
+ ],
1470
+ languageOptions: {
1471
+ parser: jsoncParser
1472
+ },
1473
+ plugins: {
1474
+ pnpm: plugin
1475
+ },
1476
+ rules: {
1477
+ "pnpm/json-enforce-catalog": "error",
1478
+ "pnpm/json-valid-catalog": "error",
1479
+ "pnpm/json-prefer-workspace-settings": "error"
1480
+ }
1481
+ }
1482
+ ];
1483
+ var configsYaml = [
1484
+ {
1485
+ name: "pnpm/pnpm-workspace-yaml",
1486
+ files: ["pnpm-workspace.yaml"],
1487
+ languageOptions: {
1488
+ parser: yamlParser
1489
+ },
1490
+ plugins: {
1491
+ pnpm: plugin
1492
+ },
1493
+ rules: {
1494
+ "pnpm/yaml-no-unused-catalog-item": "error",
1495
+ "pnpm/yaml-no-duplicate-catalog-item": "error"
1496
+ }
1497
+ }
1498
+ ];
1499
+ var configs = {
1500
+ recommended: [
1501
+ ...configsJson
1502
+ // Yaml support is still experimental
1503
+ // ...configsYaml,
1504
+ ],
1505
+ json: configsJson,
1506
+ yaml: configsYaml
1507
+ };
1508
+ plugin.configs = configs;
1509
+
1510
+ // src/plugins.ts
813
1511
  import { default as default7 } from "eslint-plugin-prettier";
814
1512
  import { default as default8 } from "eslint-plugin-unicorn";
815
1513
  import { default as default9 } from "eslint-plugin-unused-imports";
@@ -2705,19 +3403,26 @@ __name(perfectionist, "perfectionist");
2705
3403
 
2706
3404
  // src/configs/pnpm.ts
2707
3405
  async function pnpm(options = {}) {
2708
- const { overrides = {}, skipPackages = [
3406
+ const { overrides = {}, ignore = [
2709
3407
  "typescript"
2710
3408
  ] } = options;
2711
- const [pluginPnpm, parserJsonc] = await Promise.all([
2712
- interopDefault(import("./dist-JAA754SN.js")),
2713
- interopDefault(import("jsonc-eslint-parser"))
3409
+ await ensurePackages([
3410
+ "jsonc-eslint-parser",
3411
+ "yaml-eslint-parser"
3412
+ ]);
3413
+ const [parserJsonc, parserYaml] = await Promise.all([
3414
+ interopDefault(import("jsonc-eslint-parser")),
3415
+ interopDefault(import("yaml-eslint-parser"))
2714
3416
  ]);
2715
3417
  return [
2716
3418
  {
2717
- name: "storm/pnpm",
3419
+ name: "storm/pnpm/setup",
2718
3420
  plugins: {
2719
- pnpm: pluginPnpm
2720
- },
3421
+ pnpm: plugin
3422
+ }
3423
+ },
3424
+ {
3425
+ name: "storm/pnpm/package-json",
2721
3426
  ignores: [
2722
3427
  "**/node_modules/**",
2723
3428
  "**/dist/**"
@@ -2730,14 +3435,46 @@ async function pnpm(options = {}) {
2730
3435
  parser: parserJsonc
2731
3436
  },
2732
3437
  rules: {
2733
- "pnpm/enforce-catalog": [
3438
+ "pnpm/json-enforce-catalog": [
2734
3439
  "error",
2735
3440
  {
2736
- skipPackages
3441
+ ignore,
3442
+ autofix: true,
3443
+ allowedProtocols: [
3444
+ "workspace",
3445
+ "link",
3446
+ "file"
3447
+ ],
3448
+ defaultCatalog: "default",
3449
+ reuseExistingCatalog: true,
3450
+ conflicts: "new-catalog",
3451
+ fields: [
3452
+ "dependencies",
3453
+ "devDependencies"
3454
+ ]
2737
3455
  }
2738
3456
  ],
2739
- "pnpm/valid-catalog": "error",
2740
- "pnpm/prefer-workspace-settings": "error",
3457
+ "pnpm/json-valid-catalog": "error",
3458
+ "pnpm/json-prefer-workspace-settings": "error",
3459
+ ...overrides
3460
+ }
3461
+ },
3462
+ {
3463
+ name: "storm/pnpm/pnpm-workspace-yaml",
3464
+ ignores: [
3465
+ "**/node_modules/**",
3466
+ "**/dist/**"
3467
+ ],
3468
+ files: [
3469
+ "pnpm-workspace.yaml",
3470
+ "**/pnpm-workspace.yaml"
3471
+ ],
3472
+ languageOptions: {
3473
+ parser: parserYaml
3474
+ },
3475
+ rules: {
3476
+ "pnpm/yaml-no-unused-catalog-item": "error",
3477
+ "pnpm/yaml-no-duplicate-catalog-item": "error",
2741
3478
  ...overrides
2742
3479
  }
2743
3480
  }
@@ -2975,15 +3712,15 @@ async function reactNative(options = {}) {
2975
3712
  __name(reactNative, "reactNative");
2976
3713
 
2977
3714
  // src/configs/regexp.ts
2978
- import { configs } from "eslint-plugin-regexp";
3715
+ import { configs as configs2 } from "eslint-plugin-regexp";
2979
3716
  async function regexp(options = {}) {
2980
- const config2 = configs["flat/recommended"];
2981
- const rules = {
3717
+ const config2 = configs2["flat/recommended"];
3718
+ const rules2 = {
2982
3719
  ...config2.rules
2983
3720
  };
2984
3721
  if (options.level === "warn") {
2985
- for (const key in rules) {
2986
- if (rules[key] === "error") rules[key] = "warn";
3722
+ for (const key in rules2) {
3723
+ if (rules2[key] === "error") rules2[key] = "warn";
2987
3724
  }
2988
3725
  }
2989
3726
  return [
@@ -2991,7 +3728,7 @@ async function regexp(options = {}) {
2991
3728
  ...config2,
2992
3729
  name: "storm/regexp/rules",
2993
3730
  rules: {
2994
- ...rules,
3731
+ ...rules2,
2995
3732
  "regexp/no-unused-capturing-group": [
2996
3733
  "error",
2997
3734
  {
@@ -3910,17 +4647,17 @@ function getStormConfig(options, ...userConfigs) {
3910
4647
  }
3911
4648
  const stylisticOptions = !options.stylistic ? false : typeof options.stylistic === "object" ? options.stylistic : {};
3912
4649
  if (stylisticOptions && !("jsx" in stylisticOptions)) stylisticOptions.jsx = enableJsx;
3913
- const configs2 = [];
4650
+ const configs3 = [];
3914
4651
  if (enableGitignore) {
3915
4652
  if (typeof enableGitignore !== "boolean") {
3916
- configs2.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [
4653
+ configs3.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [
3917
4654
  r({
3918
4655
  name: "storm/gitignore",
3919
4656
  ...enableGitignore
3920
4657
  })
3921
4658
  ]));
3922
4659
  } else {
3923
- configs2.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [
4660
+ configs3.push(interopDefault(import("eslint-config-flat-gitignore")).then((r) => [
3924
4661
  r({
3925
4662
  name: "storm/gitignore",
3926
4663
  strict: false
@@ -3933,7 +4670,7 @@ function getStormConfig(options, ...userConfigs) {
3933
4670
  if (!tsconfigPath) {
3934
4671
  tsconfigPath = getTsConfigPath();
3935
4672
  }
3936
- configs2.push(ignores(options.ignores), javascript({
4673
+ configs3.push(ignores(options.ignores), javascript({
3937
4674
  repositoryName,
3938
4675
  globals,
3939
4676
  lineEndings,
@@ -3947,19 +4684,19 @@ function getStormConfig(options, ...userConfigs) {
3947
4684
  json: options.jsonc !== false
3948
4685
  }));
3949
4686
  if (!stylisticOptions) {
3950
- configs2.push(prettier());
4687
+ configs3.push(prettier());
3951
4688
  }
3952
4689
  if (enableCSpell) {
3953
- configs2.push(cspell(resolveSubOptions(options, "cspell")));
4690
+ configs3.push(cspell(resolveSubOptions(options, "cspell")));
3954
4691
  }
3955
4692
  if (enableUnicorn) {
3956
- configs2.push(unicorn(enableUnicorn === true ? {} : enableUnicorn));
4693
+ configs3.push(unicorn(enableUnicorn === true ? {} : enableUnicorn));
3957
4694
  }
3958
4695
  if (enableJsx) {
3959
- configs2.push(jsx());
4696
+ configs3.push(jsx());
3960
4697
  }
3961
4698
  if (enableTypeScript) {
3962
- configs2.push(typescript({
4699
+ configs3.push(typescript({
3963
4700
  ...typescriptOptions,
3964
4701
  componentExts,
3965
4702
  overrides: getOverrides(options, "typescript"),
@@ -3967,7 +4704,7 @@ function getStormConfig(options, ...userConfigs) {
3967
4704
  }));
3968
4705
  }
3969
4706
  if (stylisticOptions) {
3970
- configs2.push(stylistic({
4707
+ configs3.push(stylistic({
3971
4708
  ...stylisticOptions,
3972
4709
  lineEndings,
3973
4710
  lessOpinionated: options.lessOpinionated,
@@ -3975,90 +4712,90 @@ function getStormConfig(options, ...userConfigs) {
3975
4712
  }));
3976
4713
  }
3977
4714
  if (enableRegexp) {
3978
- configs2.push(regexp(typeof enableRegexp === "boolean" ? {} : enableRegexp));
4715
+ configs3.push(regexp(typeof enableRegexp === "boolean" ? {} : enableRegexp));
3979
4716
  }
3980
4717
  if (options.test ?? true) {
3981
- configs2.push(test({
4718
+ configs3.push(test({
3982
4719
  isInEditor,
3983
4720
  overrides: getOverrides(options, "test")
3984
4721
  }));
3985
4722
  }
3986
4723
  if (enableGraphQL) {
3987
- configs2.push(graphql(resolveSubOptions(options, "graphql")));
4724
+ configs3.push(graphql(resolveSubOptions(options, "graphql")));
3988
4725
  }
3989
4726
  if (enableReact) {
3990
- configs2.push(react({
4727
+ configs3.push(react({
3991
4728
  ...typescriptOptions,
3992
4729
  overrides: getOverrides(options, "react"),
3993
4730
  tsconfigPath
3994
4731
  }));
3995
4732
  }
3996
4733
  if (enableReactNative) {
3997
- configs2.push(reactNative({
4734
+ configs3.push(reactNative({
3998
4735
  ...resolveSubOptions(options, "react-native"),
3999
4736
  overrides: getOverrides(options, "react-native")
4000
4737
  }));
4001
4738
  }
4002
4739
  if (enableNext) {
4003
- configs2.push(next(resolveSubOptions(options, "next")));
4740
+ configs3.push(next(resolveSubOptions(options, "next")));
4004
4741
  }
4005
4742
  if (enableStorybook) {
4006
- configs2.push(storybook(resolveSubOptions(options, "storybook")));
4743
+ configs3.push(storybook(resolveSubOptions(options, "storybook")));
4007
4744
  }
4008
4745
  if (enableUnoCSS) {
4009
- configs2.push(unocss({
4746
+ configs3.push(unocss({
4010
4747
  ...resolveSubOptions(options, "unocss"),
4011
4748
  overrides: getOverrides(options, "unocss")
4012
4749
  }));
4013
4750
  }
4014
4751
  if (enableAstro) {
4015
- configs2.push(astro({
4752
+ configs3.push(astro({
4016
4753
  overrides: getOverrides(options, "astro"),
4017
4754
  stylistic: stylisticOptions
4018
4755
  }));
4019
4756
  }
4020
4757
  if (options.pnpm ?? true) {
4021
- configs2.push(pnpm({
4758
+ configs3.push(pnpm({
4022
4759
  overrides: getOverrides(options, "pnpm"),
4023
- skipPackages: typeof options.pnpm !== "boolean" ? options.pnpm?.skipPackages : void 0
4760
+ ignore: typeof options.pnpm !== "boolean" ? options.pnpm?.ignore : void 0
4024
4761
  }));
4025
4762
  }
4026
4763
  if (options.jsonc ?? true) {
4027
- configs2.push(jsonc({
4764
+ configs3.push(jsonc({
4028
4765
  overrides: getOverrides(options, "jsonc"),
4029
4766
  stylistic: stylisticOptions
4030
4767
  }), sortTsconfig());
4031
4768
  if (stylisticOptions) {
4032
- configs2.push(sortPackageJson());
4769
+ configs3.push(sortPackageJson());
4033
4770
  }
4034
4771
  }
4035
4772
  if (options.yaml ?? true) {
4036
- configs2.push(yaml({
4773
+ configs3.push(yaml({
4037
4774
  overrides: getOverrides(options, "yaml"),
4038
4775
  stylistic: stylisticOptions
4039
4776
  }));
4040
4777
  }
4041
4778
  if (options.toml ?? true) {
4042
- configs2.push(toml({
4779
+ configs3.push(toml({
4043
4780
  overrides: getOverrides(options, "toml"),
4044
4781
  stylistic: stylisticOptions
4045
4782
  }));
4046
4783
  }
4047
4784
  if (options.markdown ?? true) {
4048
- configs2.push(markdown({
4785
+ configs3.push(markdown({
4049
4786
  componentExts,
4050
4787
  overrides: getOverrides(options, "markdown")
4051
4788
  }));
4052
4789
  }
4053
4790
  if (options.mdx ?? true) {
4054
- configs2.push(mdx({
4791
+ configs3.push(mdx({
4055
4792
  overrides: getOverrides(options, "mdx")
4056
4793
  }));
4057
4794
  }
4058
4795
  if (options.formatters) {
4059
- configs2.push(formatters(options.formatters, typeof stylisticOptions === "boolean" ? {} : stylisticOptions));
4796
+ configs3.push(formatters(options.formatters, typeof stylisticOptions === "boolean" ? {} : stylisticOptions));
4060
4797
  }
4061
- configs2.push(disables());
4798
+ configs3.push(disables());
4062
4799
  if ("files" in options) {
4063
4800
  throw new Error('[@storm-software/eslint] The first argument should not contain the "files" property as the options are supposed to be global. Place it in the second or later config instead.');
4064
4801
  }
@@ -4068,11 +4805,11 @@ function getStormConfig(options, ...userConfigs) {
4068
4805
  }
4069
4806
  return acc;
4070
4807
  }, {});
4071
- if (Object.keys(fusedConfig).length) configs2.push([
4808
+ if (Object.keys(fusedConfig).length) configs3.push([
4072
4809
  fusedConfig
4073
4810
  ]);
4074
4811
  let composer = new FlatConfigComposer();
4075
- composer = composer.append(...configs2, ...userConfigs);
4812
+ composer = composer.append(...configs3, ...userConfigs);
4076
4813
  if (autoRenamePlugins) {
4077
4814
  composer = composer.renamePlugins(defaultPluginRenaming);
4078
4815
  }