eslint-plugin-react-x 1.22.2-next.9 → 1.22.2

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/index.js CHANGED
@@ -42,7 +42,7 @@ var ts__default = /*#__PURE__*/_interopDefault(ts);
42
42
 
43
43
  // package.json
44
44
  var name = "eslint-plugin-react-x";
45
- var version = "1.22.2-next.9";
45
+ var version = "1.22.2";
46
46
  var createRule = shared.createRuleForPlugin("x");
47
47
 
48
48
  // src/rules/avoid-shorthand-boolean.ts
@@ -327,12 +327,10 @@ var no_array_index_key_default = createRule({
327
327
  name: RULE_NAME5,
328
328
  create(context) {
329
329
  const indexParamNames = [];
330
+ const isCreateOrCloneElementCall = eff.or(core.isCreateElementCall(context), core.isCloneElementCall(context));
330
331
  function isArrayIndex(node) {
331
332
  return node.type === types.AST_NODE_TYPES.Identifier && indexParamNames.some(eff.O.exists((name2) => name2 === node.name));
332
333
  }
333
- function isCreateOrCloneElementCall(node) {
334
- return core.isCreateElementCall(node, context) || core.isCloneElementCall(node, context);
335
- }
336
334
  function getReportDescriptor(node) {
337
335
  if (isArrayIndex(node)) return [{ messageId: "noArrayIndexKey", node }];
338
336
  if (AST11__namespace.isOneOf([types.AST_NODE_TYPES.TemplateLiteral, types.AST_NODE_TYPES.BinaryExpression])(node)) {
@@ -1862,9 +1860,15 @@ var no_set_state_in_component_did_mount_default = createRule({
1862
1860
  eff.O.Do,
1863
1861
  eff.O.bind("clazz", () => AST11__namespace.traverseUpGuard(node, core.isClassComponent)),
1864
1862
  eff.O.bind("method", ({ clazz }) => AST11__namespace.traverseUpStop(node, clazz, isComponentDidMount)),
1863
+ eff.O.bind("methodScope", ({ method }) => eff.O.some(context.sourceCode.getScope(method))),
1865
1864
  eff.O.bind("upperScope", () => eff.O.fromNullable(context.sourceCode.getScope(node).upper)),
1866
1865
  eff.O.filter(
1867
- ({ clazz, method, upperScope }) => method.parent === clazz.body && upperScope === context.sourceCode.getScope(method)
1866
+ ({
1867
+ clazz,
1868
+ method,
1869
+ methodScope,
1870
+ upperScope
1871
+ }) => method.parent === clazz.body && upperScope === methodScope
1868
1872
  ),
1869
1873
  eff.O.map(() => ({
1870
1874
  messageId: "noSetStateInComponentDidMount",
@@ -2156,39 +2160,40 @@ var no_unstable_context_value_default = createRule({
2156
2160
  name: RULE_NAME40,
2157
2161
  create(context) {
2158
2162
  const { ctx, listeners } = core.useComponentCollector(context);
2159
- const possibleValueConstructions = /* @__PURE__ */ new Map();
2163
+ const constructions = /* @__PURE__ */ new Map();
2160
2164
  return {
2161
2165
  ...listeners,
2162
2166
  JSXOpeningElement(node) {
2163
2167
  const openingElementName = node.name;
2164
2168
  if (openingElementName.type !== types.AST_NODE_TYPES.JSXMemberExpression) return;
2165
2169
  if (openingElementName.property.name !== "Provider") return;
2166
- const maybeJSXValueAttribute = eff.O.fromNullable(
2167
- node.attributes.find((attribute) => {
2168
- return attribute.type === types.AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2169
- })
2170
+ const constructionEntry = eff.F.pipe(
2171
+ eff.O.Do,
2172
+ eff.O.bind("function", ctx.getCurrentFunction),
2173
+ eff.O.bind("attribute", () => eff.O.fromNullable(
2174
+ node.attributes.find((attribute) => {
2175
+ return attribute.type === types.AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2176
+ })
2177
+ )),
2178
+ eff.O.bind("value", ({ attribute }) => "value" in attribute ? eff.O.some(attribute.value) : eff.O.none()),
2179
+ eff.O.bind("valueExpression", ({ value }) => value?.type === types.AST_NODE_TYPES.JSXExpressionContainer ? eff.O.some(value.expression) : eff.O.none()),
2180
+ eff.O.bind("construction", ({ valueExpression }) => {
2181
+ const initialScope = context.sourceCode.getScope(valueExpression);
2182
+ return eff.O.some(VAR__namespace.inspectConstruction(valueExpression, initialScope));
2183
+ }),
2184
+ eff.O.filter(({ construction }) => construction._tag !== "None")
2170
2185
  );
2171
- if (eff.O.isNone(maybeJSXValueAttribute) || !("value" in maybeJSXValueAttribute.value)) return;
2172
- const valueNode = maybeJSXValueAttribute.value.value;
2173
- if (valueNode?.type !== types.AST_NODE_TYPES.JSXExpressionContainer) return;
2174
- const valueExpression = valueNode.expression;
2175
- const initialScope = context.sourceCode.getScope(valueExpression);
2176
- const construction = VAR__namespace.inspectConstruction(valueExpression, initialScope);
2177
- if (construction._tag === "None") return;
2178
- eff.O.map(
2179
- ctx.getCurrentFunction(),
2180
- ([_, currentFn]) => possibleValueConstructions.set(currentFn, [
2181
- ...possibleValueConstructions.get(currentFn) ?? [],
2186
+ for (const { construction, function: [_, fNode] } of eff.O.toArray(constructionEntry)) {
2187
+ constructions.set(fNode, [
2188
+ ...constructions.get(fNode) ?? [],
2182
2189
  construction
2183
- ])
2184
- );
2190
+ ]);
2191
+ }
2185
2192
  },
2186
2193
  "Program:exit"(node) {
2187
2194
  const components = ctx.getAllComponents(node).values();
2188
2195
  for (const { node: component } of components) {
2189
- const constructions = possibleValueConstructions.get(component);
2190
- if (!constructions) continue;
2191
- for (const construction of constructions) {
2196
+ for (const construction of constructions.get(component) ?? []) {
2192
2197
  if (construction._tag === "None") continue;
2193
2198
  const { node: constructionNode, _tag } = construction;
2194
2199
  const messageId = _tag.startsWith("Function") ? "noUnstableContextValueWithFunction" : "noUnstableContextValueWithIdentifier";
@@ -2225,7 +2230,7 @@ var no_unstable_default_props_default = createRule({
2225
2230
  name: RULE_NAME41,
2226
2231
  create(context) {
2227
2232
  const { ctx, listeners } = core.useComponentCollector(context);
2228
- const possibleDestructuringDeclarators = /* @__PURE__ */ new WeakMap();
2233
+ const declarators = /* @__PURE__ */ new WeakMap();
2229
2234
  return {
2230
2235
  ...listeners,
2231
2236
  "Program:exit"(node) {
@@ -2235,10 +2240,7 @@ var no_unstable_default_props_default = createRule({
2235
2240
  const [props] = params;
2236
2241
  if (!props) continue;
2237
2242
  const properties = tsPattern.match(props).with({ type: types.AST_NODE_TYPES.ObjectPattern }, ({ properties: properties2 }) => properties2).with({ type: types.AST_NODE_TYPES.Identifier }, ({ name: name2 }) => {
2238
- const variableDeclarators = possibleDestructuringDeclarators.get(component);
2239
- if (!variableDeclarators) return [];
2240
- const declarators = variableDeclarators.filter((d) => d.init.name === name2);
2241
- return declarators.flatMap((d) => d.id.properties);
2243
+ return declarators.get(component)?.filter((d) => d.init.name === name2).flatMap((d) => d.id.properties) ?? [];
2242
2244
  }).otherwise(() => []);
2243
2245
  for (const prop of properties) {
2244
2246
  if (prop.type !== types.AST_NODE_TYPES.Property || prop.value.type !== types.AST_NODE_TYPES.AssignmentPattern) continue;
@@ -2263,13 +2265,10 @@ var no_unstable_default_props_default = createRule({
2263
2265
  }
2264
2266
  },
2265
2267
  "VariableDeclarator[id.type='ObjectPattern'][init.type='Identifier']"(node) {
2266
- eff.O.map(
2267
- ctx.getCurrentFunction(),
2268
- ([_, currentFn]) => possibleDestructuringDeclarators.set(currentFn, [
2269
- ...possibleDestructuringDeclarators.get(currentFn) ?? [],
2270
- node
2271
- ])
2272
- );
2268
+ for (const [_, currentFn] of eff.O.toArray(ctx.getCurrentFunction())) {
2269
+ const prevDeclarators = declarators.get(currentFn) ?? [];
2270
+ declarators.set(currentFn, [...prevDeclarators, node]);
2271
+ }
2273
2272
  }
2274
2273
  };
2275
2274
  },
@@ -2397,7 +2396,9 @@ var no_unused_class_component_members_default = createRule({
2397
2396
  if (node.init && AST11__namespace.isThisExpression(node.init) && node.id.type === types.AST_NODE_TYPES.ObjectPattern) {
2398
2397
  for (const prop of node.id.properties) {
2399
2398
  if (prop.type === types.AST_NODE_TYPES.Property && AST11__namespace.isKeyLiteralLike(prop, prop.key)) {
2400
- eff.O.map(getName3(prop.key), (name2) => propertyUsages.get(currentClass)?.add(name2));
2399
+ for (const name2 of eff.O.toArray(getName3(prop.key))) {
2400
+ propertyUsages.get(currentClass)?.add(name2);
2401
+ }
2401
2402
  }
2402
2403
  }
2403
2404
  }
@@ -2864,10 +2865,8 @@ var use_jsx_vars_default = createRule({
2864
2865
  meta: {
2865
2866
  type: "problem",
2866
2867
  docs: {
2867
- description: (
2868
- // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2869
- "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used."
2870
- ),
2868
+ // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2869
+ description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
2871
2870
  [Symbol.for("rule_features")]: RULE_FEATURES49
2872
2871
  },
2873
2872
  messages: {
@@ -2890,9 +2889,9 @@ var use_jsx_vars_default = createRule({
2890
2889
  return {
2891
2890
  JSXOpeningElement(node) {
2892
2891
  if (node.name.type === types.AST_NODE_TYPES.JSXIdentifier && /^[a-z]/u.test(node.name.name)) return;
2893
- eff.O.map(getName5(node.name), (name2) => {
2892
+ for (const name2 of eff.O.toArray(getName5(node.name))) {
2894
2893
  context.sourceCode.markVariableAsUsed(name2, node);
2895
- });
2894
+ }
2896
2895
  }
2897
2896
  };
2898
2897
  },
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- import { F, O, isString, or, isNullable } from '@eslint-react/eff';
1
+ import { F, O, or, isString, isNullable } from '@eslint-react/eff';
2
2
  import * as JSX7 from '@eslint-react/jsx';
3
3
  import { createRuleForPlugin, normalizeSettings, decodeSettings, unsafeReadSettings } from '@eslint-react/shared';
4
4
  import * as AST11 from '@eslint-react/ast';
5
- import { isForwardRefCall, isThisSetState, isClassComponent, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isCloneElementCall, isCreateRefCall, isComponentName, useComponentCollector, ERFunctionComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, ERClassComponentFlag, isFragmentElement, isCreateElementCall, isInitializedFromReact } from '@eslint-react/core';
5
+ import { isForwardRefCall, isThisSetState, isClassComponent, isCreateElementCall, isCloneElementCall, isChildrenCount, isChildrenForEach, isChildrenMap, isChildrenOnly, isChildrenToArray, useComponentCollectorLegacy, isCreateRefCall, isComponentName, useComponentCollector, ERFunctionComponentFlag, isChildrenToArrayCall, ERComponentHint, isDirectValueOfRenderPropertyLoose, isDeclaredInRenderPropLoose, isInsideCreateElementProps, isInsideRenderMethod, ERClassComponentFlag, isFragmentElement, isInitializedFromReact } from '@eslint-react/core';
6
6
  import { AST_NODE_TYPES } from '@typescript-eslint/types';
7
7
  import { isMatching, P, match } from 'ts-pattern';
8
8
  import { compare } from 'compare-versions';
@@ -15,7 +15,7 @@ import { getTypeImmutability, isUnknown, isImmutable, isReadonlyShallow, isReado
15
15
 
16
16
  // package.json
17
17
  var name = "eslint-plugin-react-x";
18
- var version = "1.22.2-next.9";
18
+ var version = "1.22.2";
19
19
  var createRule = createRuleForPlugin("x");
20
20
 
21
21
  // src/rules/avoid-shorthand-boolean.ts
@@ -300,12 +300,10 @@ var no_array_index_key_default = createRule({
300
300
  name: RULE_NAME5,
301
301
  create(context) {
302
302
  const indexParamNames = [];
303
+ const isCreateOrCloneElementCall = or(isCreateElementCall(context), isCloneElementCall(context));
303
304
  function isArrayIndex(node) {
304
305
  return node.type === AST_NODE_TYPES.Identifier && indexParamNames.some(O.exists((name2) => name2 === node.name));
305
306
  }
306
- function isCreateOrCloneElementCall(node) {
307
- return isCreateElementCall(node, context) || isCloneElementCall(node, context);
308
- }
309
307
  function getReportDescriptor(node) {
310
308
  if (isArrayIndex(node)) return [{ messageId: "noArrayIndexKey", node }];
311
309
  if (AST11.isOneOf([AST_NODE_TYPES.TemplateLiteral, AST_NODE_TYPES.BinaryExpression])(node)) {
@@ -1835,9 +1833,15 @@ var no_set_state_in_component_did_mount_default = createRule({
1835
1833
  O.Do,
1836
1834
  O.bind("clazz", () => AST11.traverseUpGuard(node, isClassComponent)),
1837
1835
  O.bind("method", ({ clazz }) => AST11.traverseUpStop(node, clazz, isComponentDidMount)),
1836
+ O.bind("methodScope", ({ method }) => O.some(context.sourceCode.getScope(method))),
1838
1837
  O.bind("upperScope", () => O.fromNullable(context.sourceCode.getScope(node).upper)),
1839
1838
  O.filter(
1840
- ({ clazz, method, upperScope }) => method.parent === clazz.body && upperScope === context.sourceCode.getScope(method)
1839
+ ({
1840
+ clazz,
1841
+ method,
1842
+ methodScope,
1843
+ upperScope
1844
+ }) => method.parent === clazz.body && upperScope === methodScope
1841
1845
  ),
1842
1846
  O.map(() => ({
1843
1847
  messageId: "noSetStateInComponentDidMount",
@@ -2129,39 +2133,40 @@ var no_unstable_context_value_default = createRule({
2129
2133
  name: RULE_NAME40,
2130
2134
  create(context) {
2131
2135
  const { ctx, listeners } = useComponentCollector(context);
2132
- const possibleValueConstructions = /* @__PURE__ */ new Map();
2136
+ const constructions = /* @__PURE__ */ new Map();
2133
2137
  return {
2134
2138
  ...listeners,
2135
2139
  JSXOpeningElement(node) {
2136
2140
  const openingElementName = node.name;
2137
2141
  if (openingElementName.type !== AST_NODE_TYPES.JSXMemberExpression) return;
2138
2142
  if (openingElementName.property.name !== "Provider") return;
2139
- const maybeJSXValueAttribute = O.fromNullable(
2140
- node.attributes.find((attribute) => {
2141
- return attribute.type === AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2142
- })
2143
+ const constructionEntry = F.pipe(
2144
+ O.Do,
2145
+ O.bind("function", ctx.getCurrentFunction),
2146
+ O.bind("attribute", () => O.fromNullable(
2147
+ node.attributes.find((attribute) => {
2148
+ return attribute.type === AST_NODE_TYPES.JSXAttribute && attribute.name.name === "value";
2149
+ })
2150
+ )),
2151
+ O.bind("value", ({ attribute }) => "value" in attribute ? O.some(attribute.value) : O.none()),
2152
+ O.bind("valueExpression", ({ value }) => value?.type === AST_NODE_TYPES.JSXExpressionContainer ? O.some(value.expression) : O.none()),
2153
+ O.bind("construction", ({ valueExpression }) => {
2154
+ const initialScope = context.sourceCode.getScope(valueExpression);
2155
+ return O.some(VAR.inspectConstruction(valueExpression, initialScope));
2156
+ }),
2157
+ O.filter(({ construction }) => construction._tag !== "None")
2143
2158
  );
2144
- if (O.isNone(maybeJSXValueAttribute) || !("value" in maybeJSXValueAttribute.value)) return;
2145
- const valueNode = maybeJSXValueAttribute.value.value;
2146
- if (valueNode?.type !== AST_NODE_TYPES.JSXExpressionContainer) return;
2147
- const valueExpression = valueNode.expression;
2148
- const initialScope = context.sourceCode.getScope(valueExpression);
2149
- const construction = VAR.inspectConstruction(valueExpression, initialScope);
2150
- if (construction._tag === "None") return;
2151
- O.map(
2152
- ctx.getCurrentFunction(),
2153
- ([_, currentFn]) => possibleValueConstructions.set(currentFn, [
2154
- ...possibleValueConstructions.get(currentFn) ?? [],
2159
+ for (const { construction, function: [_, fNode] } of O.toArray(constructionEntry)) {
2160
+ constructions.set(fNode, [
2161
+ ...constructions.get(fNode) ?? [],
2155
2162
  construction
2156
- ])
2157
- );
2163
+ ]);
2164
+ }
2158
2165
  },
2159
2166
  "Program:exit"(node) {
2160
2167
  const components = ctx.getAllComponents(node).values();
2161
2168
  for (const { node: component } of components) {
2162
- const constructions = possibleValueConstructions.get(component);
2163
- if (!constructions) continue;
2164
- for (const construction of constructions) {
2169
+ for (const construction of constructions.get(component) ?? []) {
2165
2170
  if (construction._tag === "None") continue;
2166
2171
  const { node: constructionNode, _tag } = construction;
2167
2172
  const messageId = _tag.startsWith("Function") ? "noUnstableContextValueWithFunction" : "noUnstableContextValueWithIdentifier";
@@ -2198,7 +2203,7 @@ var no_unstable_default_props_default = createRule({
2198
2203
  name: RULE_NAME41,
2199
2204
  create(context) {
2200
2205
  const { ctx, listeners } = useComponentCollector(context);
2201
- const possibleDestructuringDeclarators = /* @__PURE__ */ new WeakMap();
2206
+ const declarators = /* @__PURE__ */ new WeakMap();
2202
2207
  return {
2203
2208
  ...listeners,
2204
2209
  "Program:exit"(node) {
@@ -2208,10 +2213,7 @@ var no_unstable_default_props_default = createRule({
2208
2213
  const [props] = params;
2209
2214
  if (!props) continue;
2210
2215
  const properties = match(props).with({ type: AST_NODE_TYPES.ObjectPattern }, ({ properties: properties2 }) => properties2).with({ type: AST_NODE_TYPES.Identifier }, ({ name: name2 }) => {
2211
- const variableDeclarators = possibleDestructuringDeclarators.get(component);
2212
- if (!variableDeclarators) return [];
2213
- const declarators = variableDeclarators.filter((d) => d.init.name === name2);
2214
- return declarators.flatMap((d) => d.id.properties);
2216
+ return declarators.get(component)?.filter((d) => d.init.name === name2).flatMap((d) => d.id.properties) ?? [];
2215
2217
  }).otherwise(() => []);
2216
2218
  for (const prop of properties) {
2217
2219
  if (prop.type !== AST_NODE_TYPES.Property || prop.value.type !== AST_NODE_TYPES.AssignmentPattern) continue;
@@ -2236,13 +2238,10 @@ var no_unstable_default_props_default = createRule({
2236
2238
  }
2237
2239
  },
2238
2240
  "VariableDeclarator[id.type='ObjectPattern'][init.type='Identifier']"(node) {
2239
- O.map(
2240
- ctx.getCurrentFunction(),
2241
- ([_, currentFn]) => possibleDestructuringDeclarators.set(currentFn, [
2242
- ...possibleDestructuringDeclarators.get(currentFn) ?? [],
2243
- node
2244
- ])
2245
- );
2241
+ for (const [_, currentFn] of O.toArray(ctx.getCurrentFunction())) {
2242
+ const prevDeclarators = declarators.get(currentFn) ?? [];
2243
+ declarators.set(currentFn, [...prevDeclarators, node]);
2244
+ }
2246
2245
  }
2247
2246
  };
2248
2247
  },
@@ -2370,7 +2369,9 @@ var no_unused_class_component_members_default = createRule({
2370
2369
  if (node.init && AST11.isThisExpression(node.init) && node.id.type === AST_NODE_TYPES.ObjectPattern) {
2371
2370
  for (const prop of node.id.properties) {
2372
2371
  if (prop.type === AST_NODE_TYPES.Property && AST11.isKeyLiteralLike(prop, prop.key)) {
2373
- O.map(getName3(prop.key), (name2) => propertyUsages.get(currentClass)?.add(name2));
2372
+ for (const name2 of O.toArray(getName3(prop.key))) {
2373
+ propertyUsages.get(currentClass)?.add(name2);
2374
+ }
2374
2375
  }
2375
2376
  }
2376
2377
  }
@@ -2837,10 +2838,8 @@ var use_jsx_vars_default = createRule({
2837
2838
  meta: {
2838
2839
  type: "problem",
2839
2840
  docs: {
2840
- description: (
2841
- // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2842
- "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used."
2843
- ),
2841
+ // eslint-disable-next-line eslint-plugin/require-meta-docs-description
2842
+ description: "helpes `eslint/no-unused-vars` to correctly mark JSX variables as used.",
2844
2843
  [Symbol.for("rule_features")]: RULE_FEATURES49
2845
2844
  },
2846
2845
  messages: {
@@ -2863,9 +2862,9 @@ var use_jsx_vars_default = createRule({
2863
2862
  return {
2864
2863
  JSXOpeningElement(node) {
2865
2864
  if (node.name.type === AST_NODE_TYPES.JSXIdentifier && /^[a-z]/u.test(node.name.name)) return;
2866
- O.map(getName5(node.name), (name2) => {
2865
+ for (const name2 of O.toArray(getName5(node.name))) {
2867
2866
  context.sourceCode.markVariableAsUsed(name2, node);
2868
- });
2867
+ }
2869
2868
  }
2870
2869
  };
2871
2870
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-react-x",
3
- "version": "1.22.2-next.9",
3
+ "version": "1.22.2",
4
4
  "description": "A set of composable ESLint rules for libraries and frameworks that use React as a UI runtime.",
5
5
  "keywords": [
6
6
  "react",
@@ -49,13 +49,13 @@
49
49
  "string-ts": "^2.2.0",
50
50
  "ts-api-utils": "^2.0.0",
51
51
  "ts-pattern": "^5.6.0",
52
- "@eslint-react/ast": "1.22.2-next.9",
53
- "@eslint-react/core": "1.22.2-next.9",
54
- "@eslint-react/jsx": "1.22.2-next.9",
55
- "@eslint-react/eff": "1.22.2-next.9",
56
- "@eslint-react/shared": "1.22.2-next.9",
57
- "@eslint-react/types": "1.22.2-next.9",
58
- "@eslint-react/var": "1.22.2-next.9"
52
+ "@eslint-react/ast": "1.22.2",
53
+ "@eslint-react/core": "1.22.2",
54
+ "@eslint-react/eff": "1.22.2",
55
+ "@eslint-react/jsx": "1.22.2",
56
+ "@eslint-react/types": "1.22.2",
57
+ "@eslint-react/var": "1.22.2",
58
+ "@eslint-react/shared": "1.22.2"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/react": "^19.0.2",