cls-extended 1.1.2 β†’ 1.1.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/README.md CHANGED
@@ -12,7 +12,7 @@ Zero-runtime Tailwind CSS responsive class transformer. Write cleaner responsive
12
12
  - πŸ”§ **Universal** - Works with Vite, Webpack, Rollup, esbuild, Rspack, Rolldown, and Farm
13
13
  - πŸ“¦ **Tiny Bundle** - ~8KB package
14
14
  - πŸ”’ **Type Safe** - Full TypeScript support with intelligent autocomplete
15
- - πŸ—ΊοΈ **Source Maps** - Maintains accurate debugging information
15
+
16
16
 
17
17
  ## Installation
18
18
 
@@ -4,4 +4,5 @@ import { UnpluginInstance } from "unplugin";
4
4
  //#region src/adapters/vite.d.ts
5
5
  declare const vitePlugin: UnpluginInstance<Options | undefined, false>["vite"];
6
6
  //#endregion
7
- export { vitePlugin as default };
7
+ export { vitePlugin as default };
8
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","names":[],"sources":["../../src/adapters/vite.ts"],"mappings":";;;;cAIM,UAAA,EAAY,gBAAA,CAAiB,OAAA"}
@@ -4,4 +4,5 @@ import unplugin from "../unplugin-factory.js";
4
4
  const vitePlugin = unplugin.vite;
5
5
 
6
6
  //#endregion
7
- export { vitePlugin as default };
7
+ export { vitePlugin as default };
8
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","names":[],"sources":["../../src/adapters/vite.ts"],"sourcesContent":["import type { UnpluginInstance } from \"unplugin\";\nimport type { Options } from \"../core/options\";\nimport unplugin from \"../unplugin-factory\";\n\nconst vitePlugin: UnpluginInstance<Options | undefined, false>[\"vite\"] =\n unplugin.vite;\n\nexport default vitePlugin;\n"],"mappings":";;;AAIA,MAAM,aACJ,SAAS"}
@@ -3,4 +3,5 @@ import unplugin from "../unplugin-factory.js";
3
3
  //#region src/adapters/webpack.d.ts
4
4
  declare const _default: typeof unplugin.webpack;
5
5
  //#endregion
6
- export { _default as default };
6
+ export { _default as default };
7
+ //# sourceMappingURL=webpack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack.d.ts","names":[],"sources":["../../src/adapters/webpack.ts"],"mappings":";;;cAA2C,QAAA,SAED,QAAA,CAAS,OAAA"}
@@ -4,4 +4,5 @@ import unplugin from "../unplugin-factory.js";
4
4
  var webpack_default = unplugin.webpack;
5
5
 
6
6
  //#endregion
7
- export { webpack_default as default };
7
+ export { webpack_default as default };
8
+ //# sourceMappingURL=webpack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack.js","names":[],"sources":["../../src/adapters/webpack.ts"],"sourcesContent":["import unplugin from \"../unplugin-factory\";\n\nexport default unplugin.webpack as typeof unplugin.webpack;\n"],"mappings":";;;AAEA,sBAAe,SAAS"}
package/dist/api.d.ts CHANGED
@@ -10,4 +10,5 @@ type ResponsiveClasses = Partial<Record<ResponsiveBreakpoint, string>>;
10
10
  */
11
11
  declare function cls(baseClasses: string, responsiveClasses?: ResponsiveClasses): string;
12
12
  //#endregion
13
- export { ResponsiveBreakpoint, ResponsiveClasses, cls };
13
+ export { ResponsiveBreakpoint, ResponsiveClasses, cls };
14
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","names":[],"sources":["../src/api.ts"],"mappings":";KAAY,oBAAA;AAAA,KACA,iBAAA,GAAoB,OAAA,CAAQ,MAAA,CAAO,oBAAA;;;;;AAA/C;;;iBASgB,GAAA,CACd,WAAA,UACA,iBAAA,GAAoB,iBAAA"}
package/dist/api.js CHANGED
@@ -17,4 +17,5 @@ function cls(baseClasses, responsiveClasses) {
17
17
  }
18
18
 
19
19
  //#endregion
20
- export { cls };
20
+ export { cls };
21
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","names":[],"sources":["../src/api.ts"],"sourcesContent":["export type ResponsiveBreakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\nexport type ResponsiveClasses = Partial<Record<ResponsiveBreakpoint, string>>;\n\n/**\n * Transform responsive Tailwind classes at build time\n *\n * @example\n * tw('text-xl font-bold', { md: 'text-2xl', lg: 'text-3xl' })\n * // Compiles to: \"text-xl font-bold md:text-2xl lg:text-3xl\"\n */\nexport function cls(\n baseClasses: string,\n responsiveClasses?: ResponsiveClasses,\n): string {\n // This function is replaced at build time by the plugin\n // Runtime fallback for development without the plugin\n if (!responsiveClasses) return baseClasses;\n\n const parts = [baseClasses];\n for (const [breakpoint, classes] of Object.entries(responsiveClasses)) {\n const prefixed = classes\n .split(/\\s+/)\n .filter(Boolean)\n .map((cls) => `${breakpoint}:${cls}`)\n .join(\" \");\n parts.push(prefixed);\n }\n return parts.join(\" \");\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IACd,aACA,mBACQ;AAGR,KAAI,CAAC,kBAAmB,QAAO;CAE/B,MAAM,QAAQ,CAAC,YAAY;AAC3B,MAAK,MAAM,CAAC,YAAY,YAAY,OAAO,QAAQ,kBAAkB,EAAE;EACrE,MAAM,WAAW,QACd,MAAM,MAAM,CACZ,OAAO,QAAQ,CACf,KAAK,QAAQ,GAAG,WAAW,GAAG,MAAM,CACpC,KAAK,IAAI;AACZ,QAAM,KAAK,SAAS;;AAEtB,QAAO,MAAM,KAAK,IAAI"}
@@ -31,4 +31,5 @@ interface Options {
31
31
  type OptionsResolved = Required<Options>;
32
32
  declare function resolveOptions(options?: Options): OptionsResolved;
33
33
  //#endregion
34
- export { Options, OptionsResolved, resolveOptions };
34
+ export { Options, OptionsResolved, resolveOptions };
35
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","names":[],"sources":["../../src/core/options.ts"],"mappings":";;;UAEiB,OAAA;;AAAjB;;;EAKE,OAAA,GAAU,aAAA;EAMA;;;;EAAV,OAAA,GAAU,aAAA;EANA;;;;EAYV,SAAA;EAMc;;;;EAAd,WAAA,GAAc,MAAA;EASW;;;;EAHzB,cAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,QAAA,CAAS,OAAA;AAAA,iBAEvB,cAAA,CAAe,OAAA,GAAS,OAAA,GAAe,eAAA"}
@@ -16,4 +16,5 @@ function resolveOptions(options = {}) {
16
16
  }
17
17
 
18
18
  //#endregion
19
- export { resolveOptions };
19
+ export { resolveOptions };
20
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../src/core/options.ts"],"sourcesContent":["import type { FilterPattern } from 'unplugin'\n\nexport interface Options {\n /**\n * Files to include in processing\n * @default [/\\.[jt]sx?$/]\n */\n include?: FilterPattern;\n\n /**\n * Files to exclude from processing\n * @default [/node_modules/]\n */\n exclude?: FilterPattern;\n\n /**\n * Enable source map generation\n * @default true\n */\n sourcemap?: boolean;\n\n /**\n * Custom Tailwind breakpoints\n * @default { sm: '640px', md: '768px', lg: '1024px', xl: '1280px', '2xl': '1536px' }\n */\n breakpoints?: Record<string, string>;\n\n /**\n * Enable additional variant support (hover, focus, dark, etc.)\n * @default false\n */\n enableVariants?: boolean;\n}\n\nexport type OptionsResolved = Required<Options>;\n\nexport function resolveOptions(options: Options = {}): OptionsResolved {\n return {\n include: options.include ?? [/\\.[jt]sx?$/],\n exclude: options.exclude ?? [/node_modules/],\n sourcemap: options.sourcemap ?? true,\n breakpoints: options.breakpoints ?? {\n sm: \"640px\",\n md: \"768px\",\n lg: \"1024px\",\n xl: \"1280px\",\n \"2xl\": \"1536px\",\n },\n enableVariants: options.enableVariants ?? false,\n };\n}\n"],"mappings":";AAoCA,SAAgB,eAAe,UAAmB,EAAE,EAAmB;AACrE,QAAO;EACL,SAAS,QAAQ,WAAW,CAAC,aAAa;EAC1C,SAAS,QAAQ,WAAW,CAAC,eAAe;EAC5C,WAAW,QAAQ,aAAa;EAChC,aAAa,QAAQ,eAAe;GAClC,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,OAAO;GACR;EACD,gBAAgB,QAAQ,kBAAkB;EAC3C"}
@@ -7,4 +7,5 @@ interface ClsCallExpression {
7
7
  }
8
8
  declare function findClsCalls(code: string): ClsCallExpression[];
9
9
  //#endregion
10
- export { ClsCallExpression, findClsCalls };
10
+ export { ClsCallExpression, findClsCalls };
11
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","names":[],"sources":["../../src/core/parser.ts"],"mappings":";UAGiB,iBAAA;EACf,WAAA;EACA,iBAAA,EAAmB,MAAA;EACnB,KAAA;EACA,GAAA;AAAA;AAAA,iBAGc,YAAA,CAAa,IAAA,WAAe,iBAAA"}
@@ -54,4 +54,5 @@ function findClsCalls(code) {
54
54
  }
55
55
 
56
56
  //#endregion
57
- export { findClsCalls };
57
+ export { findClsCalls };
58
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","names":[],"sources":["../../src/core/parser.ts"],"sourcesContent":["import { parse } from \"@babel/parser\";\nimport type * as t from \"@babel/types\";\n\nexport interface ClsCallExpression {\n baseClasses: string;\n responsiveClasses: Record<string, string>;\n start: number;\n end: number;\n}\n\nexport function findClsCalls(code: string): ClsCallExpression[] {\n let ast: t.File;\n try {\n ast = parse(code, {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"],\n });\n } catch {\n return [];\n }\n\n const clsCalls: ClsCallExpression[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function traverse(node: any) {\n if (!node || typeof node !== \"object\") return;\n\n // Check if it's a CallExpression\n if (node.type === \"CallExpression\") {\n const callee = node.callee;\n\n // Check if it's tw() or tw.something()\n const isTwCall =\n (callee.type === \"Identifier\" && callee.name === \"tw\") ||\n (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"tw\");\n\n if (isTwCall) {\n const args = node.arguments;\n\n // Must have at least 1 argument (base classes)\n if (args.length === 0) return;\n\n // First argument: base classes (string literal)\n const baseArg = args[0];\n if (baseArg.type !== \"StringLiteral\") return;\n\n const baseClasses = baseArg.value;\n\n // Second argument: responsive classes (object expression)\n const responsiveClasses: Record<string, string> = {};\n\n if (args.length > 1) {\n const responsiveArg = args[1];\n\n if (responsiveArg.type === \"ObjectExpression\") {\n for (const prop of responsiveArg.properties) {\n if (\n prop.type === \"ObjectProperty\" &&\n prop.value.type === \"StringLiteral\"\n ) {\n let key: string | undefined;\n if (prop.key.type === \"Identifier\") {\n key = prop.key.name;\n } else if (prop.key.type === \"StringLiteral\") {\n key = prop.key.value;\n }\n if (key) {\n responsiveClasses[key] = prop.value.value;\n }\n }\n }\n }\n }\n\n clsCalls.push({\n baseClasses,\n responsiveClasses,\n start: node.start!,\n end: node.end!,\n });\n }\n }\n\n // Traverse all properties\n for (const key in node) {\n if (key === \"loc\" || key === \"range\" || key === \"tokens\") continue;\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n traverse(item);\n }\n } else if (value && typeof value === \"object\") {\n traverse(value);\n }\n }\n }\n\n traverse(ast);\n return clsCalls;\n}\n"],"mappings":";;;AAUA,SAAgB,aAAa,MAAmC;CAC9D,IAAI;AACJ,KAAI;AACF,QAAM,MAAM,MAAM;GAChB,YAAY;GACZ,SAAS,CAAC,OAAO,aAAa;GAC/B,CAAC;SACI;AACN,SAAO,EAAE;;CAGX,MAAM,WAAgC,EAAE;CAGxC,SAAS,SAAS,MAAW;AAC3B,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAGvC,MAAI,KAAK,SAAS,kBAAkB;GAClC,MAAM,SAAS,KAAK;AASpB,OALG,OAAO,SAAS,gBAAgB,OAAO,SAAS,QAChD,OAAO,SAAS,sBACf,OAAO,OAAO,SAAS,gBACvB,OAAO,OAAO,SAAS,MAEb;IACZ,MAAM,OAAO,KAAK;AAGlB,QAAI,KAAK,WAAW,EAAG;IAGvB,MAAM,UAAU,KAAK;AACrB,QAAI,QAAQ,SAAS,gBAAiB;IAEtC,MAAM,cAAc,QAAQ;IAG5B,MAAM,oBAA4C,EAAE;AAEpD,QAAI,KAAK,SAAS,GAAG;KACnB,MAAM,gBAAgB,KAAK;AAE3B,SAAI,cAAc,SAAS,oBACzB;WAAK,MAAM,QAAQ,cAAc,WAC/B,KACE,KAAK,SAAS,oBACd,KAAK,MAAM,SAAS,iBACpB;OACA,IAAI;AACJ,WAAI,KAAK,IAAI,SAAS,aACpB,OAAM,KAAK,IAAI;gBACN,KAAK,IAAI,SAAS,gBAC3B,OAAM,KAAK,IAAI;AAEjB,WAAI,IACF,mBAAkB,OAAO,KAAK,MAAM;;;;AAO9C,aAAS,KAAK;KACZ;KACA;KACA,OAAO,KAAK;KACZ,KAAK,KAAK;KACX,CAAC;;;AAKN,OAAK,MAAM,OAAO,MAAM;AACtB,OAAI,QAAQ,SAAS,QAAQ,WAAW,QAAQ,SAAU;GAC1D,MAAM,QAAQ,KAAK;AACnB,OAAI,MAAM,QAAQ,MAAM,CACtB,MAAK,MAAM,QAAQ,MACjB,UAAS,KAAK;YAEP,SAAS,OAAO,UAAU,SACnC,UAAS,MAAM;;;AAKrB,UAAS,IAAI;AACb,QAAO"}
@@ -7,4 +7,5 @@ interface TransformResult {
7
7
  }
8
8
  declare function transformClsCalls(code: string, _id: string, options: OptionsResolved): TransformResult | null;
9
9
  //#endregion
10
- export { TransformResult, transformClsCalls };
10
+ export { TransformResult, transformClsCalls };
11
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","names":[],"sources":["../../src/core/transform.ts"],"mappings":";;;UAIiB,eAAA;EACf,IAAA;EAEA,GAAA;AAAA;AAAA,iBAGc,iBAAA,CACd,IAAA,UACA,GAAA,UACA,OAAA,EAAS,eAAA,GACR,eAAA"}
@@ -30,4 +30,5 @@ function generateClassString(call, options) {
30
30
  }
31
31
 
32
32
  //#endregion
33
- export { transformClsCalls };
33
+ export { transformClsCalls };
34
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","names":[],"sources":["../../src/core/transform.ts"],"sourcesContent":["import MagicString from \"magic-string\";\nimport type { OptionsResolved } from \"./options\";\nimport { findClsCalls, type ClsCallExpression } from \"./parser\";\n\nexport interface TransformResult {\n code: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n map: any;\n}\n\nexport function transformClsCalls(\n code: string,\n _id: string,\n options: OptionsResolved,\n): TransformResult | null {\n // Find all tw() calls\n const twCalls = findClsCalls(code);\n\n if (twCalls.length === 0) {\n return null;\n }\n\n const s = new MagicString(code);\n\n // Process each tw() call\n for (const call of twCalls) {\n const transformedString = generateClassString(call, options);\n\n // Replace the entire tw() call with a static string\n s.overwrite(call.start, call.end, `\"${transformedString}\"`);\n }\n\n return {\n code: s.toString(),\n map: options.sourcemap ? s.generateMap({ hires: true }) : null,\n };\n}\n\nfunction generateClassString(\n call: ClsCallExpression,\n options: OptionsResolved,\n): string {\n const { baseClasses, responsiveClasses } = call;\n const parts: string[] = [baseClasses];\n\n // Process responsive classes\n for (const [breakpoint, classes] of Object.entries(responsiveClasses)) {\n // Validate breakpoint\n if (!options.breakpoints[breakpoint] && !options.enableVariants) {\n console.warn(`Unknown breakpoint: ${breakpoint}`);\n continue;\n }\n\n // Split classes and prefix each one\n const prefixedClasses = classes\n .split(/\\s+/)\n .filter(Boolean)\n .map((cls) => `${breakpoint}:${cls}`)\n .join(\" \");\n\n parts.push(prefixedClasses);\n }\n\n return parts.filter(Boolean).join(\" \");\n}\n"],"mappings":";;;;AAUA,SAAgB,kBACd,MACA,KACA,SACwB;CAExB,MAAM,UAAU,aAAa,KAAK;AAElC,KAAI,QAAQ,WAAW,EACrB,QAAO;CAGT,MAAM,IAAI,IAAI,YAAY,KAAK;AAG/B,MAAK,MAAM,QAAQ,SAAS;EAC1B,MAAM,oBAAoB,oBAAoB,MAAM,QAAQ;AAG5D,IAAE,UAAU,KAAK,OAAO,KAAK,KAAK,IAAI,kBAAkB,GAAG;;AAG7D,QAAO;EACL,MAAM,EAAE,UAAU;EAClB,KAAK,QAAQ,YAAY,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC,GAAG;EAC3D;;AAGH,SAAS,oBACP,MACA,SACQ;CACR,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,QAAkB,CAAC,YAAY;AAGrC,MAAK,MAAM,CAAC,YAAY,YAAY,OAAO,QAAQ,kBAAkB,EAAE;AAErE,MAAI,CAAC,QAAQ,YAAY,eAAe,CAAC,QAAQ,gBAAgB;AAC/D,WAAQ,KAAK,uBAAuB,aAAa;AACjD;;EAIF,MAAM,kBAAkB,QACrB,MAAM,MAAM,CACZ,OAAO,QAAQ,CACf,KAAK,QAAQ,GAAG,WAAW,GAAG,MAAM,CACpC,KAAK,IAAI;AAEZ,QAAM,KAAK,gBAAgB;;AAG7B,QAAO,MAAM,OAAO,QAAQ,CAAC,KAAK,IAAI"}
@@ -4,4 +4,5 @@ import { UnpluginInstance } from "unplugin";
4
4
  //#region src/unplugin-factory.d.ts
5
5
  declare const unplugin: UnpluginInstance<Options | undefined, false>;
6
6
  //#endregion
7
- export { type Options, unplugin as default };
7
+ export { type Options, unplugin as default };
8
+ //# sourceMappingURL=unplugin-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unplugin-factory.d.ts","names":[],"sources":["../src/unplugin-factory.ts"],"mappings":";;;;cAIM,QAAA,EAAU,gBAAA,CAAiB,OAAA"}
@@ -21,4 +21,5 @@ const unplugin = createUnplugin((rawOptions = {}) => {
21
21
  });
22
22
 
23
23
  //#endregion
24
- export { unplugin as default };
24
+ export { unplugin as default };
25
+ //# sourceMappingURL=unplugin-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unplugin-factory.js","names":[],"sources":["../src/unplugin-factory.ts"],"sourcesContent":["import { createUnplugin, type UnpluginInstance } from \"unplugin\";\nimport { resolveOptions, type Options } from \"./core/options\";\nimport { transformClsCalls } from \"./core/transform\";\n\nconst unplugin: UnpluginInstance<Options | undefined, false> = createUnplugin(\n (rawOptions = {}) => {\n const options = resolveOptions(rawOptions);\n\n const name = \"cls-extended\";\n return {\n name,\n\n transform: {\n filter: {\n id: { include: options.include, exclude: options.exclude },\n },\n handler(code, id) {\n // Only process files that might contain tw()\n if (!code.includes(\"tw(\")) {\n return null;\n }\n\n // Perform transformation\n return transformClsCalls(code, id, options);\n },\n },\n };\n },\n);\n\nexport default unplugin;\nexport type { Options } from \"./core/options\";\n"],"mappings":";;;;;AAIA,MAAM,WAAyD,gBAC5D,aAAa,EAAE,KAAK;CACnB,MAAM,UAAU,eAAe,WAAW;AAG1C,QAAO;EACL,MAFW;EAIX,WAAW;GACT,QAAQ,EACN,IAAI;IAAE,SAAS,QAAQ;IAAS,SAAS,QAAQ;IAAS,EAC3D;GACD,QAAQ,MAAM,IAAI;AAEhB,QAAI,CAAC,KAAK,SAAS,MAAM,CACvB,QAAO;AAIT,WAAO,kBAAkB,MAAM,IAAI,QAAQ;;GAE9C;EACF;EAEJ"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cls-extended",
3
3
  "type": "module",
4
- "version": "1.1.2",
4
+ "version": "1.1.3",
5
5
  "exports": {
6
6
  ".": "./dist/index.js",
7
7
  "./adapters/vite": "./dist/adapters/vite.js",
@@ -51,23 +51,25 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@babel/types": "^7.29.0",
54
- "@eslint/js": "^9.39.2",
54
+ "@eslint/js": "catalog:",
55
55
  "@release-it/conventional-changelog": "^8.0.2",
56
+ "@repo/eslint-config": "workspace:*",
57
+ "@repo/typescript-config": "workspace:*",
56
58
  "@sxzz/eslint-config": "^7.6.0",
57
59
  "@sxzz/prettier-config": "^2.3.1",
58
60
  "@sxzz/test-utils": "^0.5.15",
59
- "@types/node": "^25.2.0",
61
+ "@types/node": "catalog:",
60
62
  "auto-changelog": "^2.5.0",
61
63
  "bumpp": "^10.4.0",
62
- "eslint": "^9.39.2",
63
- "globals": "^16.5.0",
64
+ "eslint": "catalog:",
65
+ "globals": "catalog:",
64
66
  "jiti": "^2.6.1",
65
67
  "prettier": "^3.8.1",
66
68
  "release-it": "^17.10.0",
67
69
  "tsdown": "^0.20.1",
68
70
  "tsdown-preset-sxzz": "^0.3.1",
69
- "typescript": "^5.9.3",
70
- "typescript-eslint": "^8.54.0",
71
+ "typescript": "catalog:",
72
+ "typescript-eslint": "catalog:",
71
73
  "vitest": "^4.0.18"
72
74
  },
73
75
  "keywords": [