tanmi-dock 0.4.0-beta.1

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/dist/commands/clean.d.ts +10 -0
  4. package/dist/commands/clean.d.ts.map +1 -0
  5. package/dist/commands/clean.js +215 -0
  6. package/dist/commands/clean.js.map +1 -0
  7. package/dist/commands/config.d.ts +10 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +105 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +7 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +127 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +7 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +153 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/link.d.ts +7 -0
  20. package/dist/commands/link.d.ts.map +1 -0
  21. package/dist/commands/link.js +522 -0
  22. package/dist/commands/link.js.map +1 -0
  23. package/dist/commands/migrate.d.ts +7 -0
  24. package/dist/commands/migrate.d.ts.map +1 -0
  25. package/dist/commands/migrate.js +137 -0
  26. package/dist/commands/migrate.js.map +1 -0
  27. package/dist/commands/projects.d.ts +7 -0
  28. package/dist/commands/projects.d.ts.map +1 -0
  29. package/dist/commands/projects.js +126 -0
  30. package/dist/commands/projects.js.map +1 -0
  31. package/dist/commands/repair.d.ts +7 -0
  32. package/dist/commands/repair.d.ts.map +1 -0
  33. package/dist/commands/repair.js +256 -0
  34. package/dist/commands/repair.js.map +1 -0
  35. package/dist/commands/status.d.ts +7 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +172 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/unlink.d.ts +7 -0
  40. package/dist/commands/unlink.d.ts.map +1 -0
  41. package/dist/commands/unlink.js +104 -0
  42. package/dist/commands/unlink.js.map +1 -0
  43. package/dist/commands/verify.d.ts +7 -0
  44. package/dist/commands/verify.d.ts.map +1 -0
  45. package/dist/commands/verify.js +190 -0
  46. package/dist/commands/verify.js.map +1 -0
  47. package/dist/core/codepac.d.ts +79 -0
  48. package/dist/core/codepac.d.ts.map +1 -0
  49. package/dist/core/codepac.js +188 -0
  50. package/dist/core/codepac.js.map +1 -0
  51. package/dist/core/config.d.ts +70 -0
  52. package/dist/core/config.d.ts.map +1 -0
  53. package/dist/core/config.js +210 -0
  54. package/dist/core/config.js.map +1 -0
  55. package/dist/core/guard.d.ts +18 -0
  56. package/dist/core/guard.d.ts.map +1 -0
  57. package/dist/core/guard.js +82 -0
  58. package/dist/core/guard.js.map +1 -0
  59. package/dist/core/linker.d.ts +76 -0
  60. package/dist/core/linker.d.ts.map +1 -0
  61. package/dist/core/linker.js +263 -0
  62. package/dist/core/linker.js.map +1 -0
  63. package/dist/core/parser.d.ts +43 -0
  64. package/dist/core/parser.d.ts.map +1 -0
  65. package/dist/core/parser.js +133 -0
  66. package/dist/core/parser.js.map +1 -0
  67. package/dist/core/platform.d.ts +100 -0
  68. package/dist/core/platform.d.ts.map +1 -0
  69. package/dist/core/platform.js +193 -0
  70. package/dist/core/platform.js.map +1 -0
  71. package/dist/core/registry.d.ts +181 -0
  72. package/dist/core/registry.d.ts.map +1 -0
  73. package/dist/core/registry.js +443 -0
  74. package/dist/core/registry.js.map +1 -0
  75. package/dist/core/store.d.ts +77 -0
  76. package/dist/core/store.d.ts.map +1 -0
  77. package/dist/core/store.js +226 -0
  78. package/dist/core/store.js.map +1 -0
  79. package/dist/core/transaction.d.ts +106 -0
  80. package/dist/core/transaction.d.ts.map +1 -0
  81. package/dist/core/transaction.js +295 -0
  82. package/dist/core/transaction.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +84 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/types/index.d.ts +174 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +47 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/utils/disk.d.ts +57 -0
  92. package/dist/utils/disk.d.ts.map +1 -0
  93. package/dist/utils/disk.js +313 -0
  94. package/dist/utils/disk.js.map +1 -0
  95. package/dist/utils/exit-codes.d.ts +42 -0
  96. package/dist/utils/exit-codes.d.ts.map +1 -0
  97. package/dist/utils/exit-codes.js +91 -0
  98. package/dist/utils/exit-codes.js.map +1 -0
  99. package/dist/utils/fs-utils.d.ts +44 -0
  100. package/dist/utils/fs-utils.d.ts.map +1 -0
  101. package/dist/utils/fs-utils.js +107 -0
  102. package/dist/utils/fs-utils.js.map +1 -0
  103. package/dist/utils/global-lock.d.ts +28 -0
  104. package/dist/utils/global-lock.d.ts.map +1 -0
  105. package/dist/utils/global-lock.js +89 -0
  106. package/dist/utils/global-lock.js.map +1 -0
  107. package/dist/utils/lock.d.ts +26 -0
  108. package/dist/utils/lock.d.ts.map +1 -0
  109. package/dist/utils/lock.js +68 -0
  110. package/dist/utils/lock.js.map +1 -0
  111. package/dist/utils/logger.d.ts +98 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +190 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/prompt.d.ts +32 -0
  116. package/dist/utils/prompt.d.ts.map +1 -0
  117. package/dist/utils/prompt.js +131 -0
  118. package/dist/utils/prompt.js.map +1 -0
  119. package/package.json +73 -0
@@ -0,0 +1,190 @@
1
+ /**
2
+ * 日志输出工具
3
+ * - 无 emoji,保持简洁
4
+ * - 中文输出
5
+ * - 状态标记:[ok] [warn] [err] [info]
6
+ */
7
+ // ANSI 颜色码
8
+ const colors = {
9
+ reset: '\x1b[0m',
10
+ bold: '\x1b[1m',
11
+ dim: '\x1b[2m',
12
+ red: '\x1b[31m',
13
+ green: '\x1b[32m',
14
+ yellow: '\x1b[33m',
15
+ blue: '\x1b[34m',
16
+ magenta: '\x1b[35m',
17
+ cyan: '\x1b[36m',
18
+ white: '\x1b[37m',
19
+ gray: '\x1b[90m',
20
+ };
21
+ /**
22
+ * 检测是否支持颜色
23
+ */
24
+ function supportsColor() {
25
+ if (process.env.NO_COLOR)
26
+ return false;
27
+ if (process.env.FORCE_COLOR)
28
+ return true;
29
+ return process.stdout.isTTY ?? false;
30
+ }
31
+ const useColor = supportsColor();
32
+ function colorize(text, color) {
33
+ if (!useColor)
34
+ return text;
35
+ return `${colors[color]}${text}${colors.reset}`;
36
+ }
37
+ /**
38
+ * 普通信息
39
+ */
40
+ export function info(message) {
41
+ console.log(message);
42
+ }
43
+ /**
44
+ * 成功信息 - 绿色 [ok]
45
+ */
46
+ export function success(message) {
47
+ console.log(`${colorize('[ok]', 'green')} ${message}`);
48
+ }
49
+ /**
50
+ * 警告信息 - 黄色 [warn]
51
+ */
52
+ export function warn(message) {
53
+ console.log(`${colorize('[warn]', 'yellow')} ${message}`);
54
+ }
55
+ /**
56
+ * 错误信息 - 红色 [err]
57
+ */
58
+ export function error(message) {
59
+ console.error(`${colorize('[err]', 'red')} ${message}`);
60
+ }
61
+ /**
62
+ * 调试信息 - 灰色,仅在 DEBUG 环境变量时输出
63
+ */
64
+ export function debug(message) {
65
+ if (process.env.DEBUG) {
66
+ console.log(`${colorize('[debug]', 'gray')} ${message}`);
67
+ }
68
+ }
69
+ /**
70
+ * 详细信息 - 灰色,仅在 VERBOSE 或 DEBUG 环境变量时输出
71
+ */
72
+ export function verbose(message) {
73
+ if (process.env.VERBOSE === '1' || process.env.DEBUG === '1') {
74
+ console.log(`${colorize('[verbose]', 'gray')} ${message}`);
75
+ }
76
+ }
77
+ /**
78
+ * 详细 JSON 输出
79
+ */
80
+ export function verboseJson(label, data) {
81
+ if (process.env.VERBOSE === '1' || process.env.DEBUG === '1') {
82
+ console.log(`${colorize('[verbose]', 'gray')} ${label}:`);
83
+ console.log(JSON.stringify(data, null, 2));
84
+ }
85
+ }
86
+ /**
87
+ * 检查是否启用 verbose 模式
88
+ */
89
+ export function isVerbose() {
90
+ return process.env.VERBOSE === '1' || process.env.DEBUG === '1';
91
+ }
92
+ /**
93
+ * 提示信息 - 蓝色 [info]
94
+ */
95
+ export function hint(message) {
96
+ console.log(`${colorize('[info]', 'blue')} ${message}`);
97
+ }
98
+ /**
99
+ * 进度显示
100
+ */
101
+ export function progress(current, total, message) {
102
+ console.log(`[${current}/${total}] ${message}`);
103
+ }
104
+ /**
105
+ * 进度条显示
106
+ */
107
+ export function progressBar(current, total, width = 20) {
108
+ const percent = Math.round((current / total) * 100);
109
+ const filled = Math.round((current / total) * width);
110
+ const empty = width - filled;
111
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
112
+ process.stdout.write(`\r 进度: ${bar} ${percent}%`);
113
+ if (current >= total) {
114
+ console.log(); // 换行
115
+ }
116
+ }
117
+ /**
118
+ * 树状结构输出
119
+ */
120
+ export function tree(items, prefix = '') {
121
+ items.forEach((item, index) => {
122
+ const isLast = index === items.length - 1;
123
+ const connector = isLast ? '+-- ' : '+-- ';
124
+ const childPrefix = isLast ? ' ' : '| ';
125
+ let label = item.label;
126
+ if (item.warn) {
127
+ label = `${label} ${colorize('[warn]', 'yellow')}`;
128
+ }
129
+ console.log(`${prefix}${connector}${label}`);
130
+ if (item.children && item.children.length > 0) {
131
+ tree(item.children, prefix + childPrefix);
132
+ }
133
+ });
134
+ }
135
+ /**
136
+ * 简单表格输出
137
+ */
138
+ export function table(rows, padding = 2) {
139
+ if (rows.length === 0)
140
+ return;
141
+ // 计算每列最大宽度
142
+ const colWidths = [];
143
+ for (const row of rows) {
144
+ row.forEach((cell, i) => {
145
+ colWidths[i] = Math.max(colWidths[i] || 0, cell.length);
146
+ });
147
+ }
148
+ // 输出
149
+ for (const row of rows) {
150
+ const line = row.map((cell, i) => cell.padEnd(colWidths[i] + padding)).join('');
151
+ console.log(line);
152
+ }
153
+ }
154
+ /**
155
+ * 分隔线
156
+ */
157
+ export function separator(char = '-', length = 40) {
158
+ console.log(char.repeat(length));
159
+ }
160
+ /**
161
+ * 空行
162
+ */
163
+ export function blank() {
164
+ console.log();
165
+ }
166
+ /**
167
+ * 标题
168
+ */
169
+ export function title(text) {
170
+ console.log(colorize(text, 'bold'));
171
+ }
172
+ export default {
173
+ info,
174
+ success,
175
+ warn,
176
+ error,
177
+ debug,
178
+ verbose,
179
+ verboseJson,
180
+ isVerbose,
181
+ hint,
182
+ progress,
183
+ progressBar,
184
+ tree,
185
+ table,
186
+ separator,
187
+ blank,
188
+ title,
189
+ };
190
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare function selectOption<T extends string>(message: string, choices: {
2
+ name: string;
3
+ value: T;
4
+ description?: string;
5
+ }[]): Promise<T>;
6
+ export declare function confirmAction(message: string, defaultValue?: boolean): Promise<boolean>;
7
+ export declare function inputText(message: string, defaultValue?: string, validate?: (value: string) => boolean | string): Promise<string>;
8
+ export declare function selectFromList<T>(message: string, items: T[], display: (item: T) => string): Promise<T>;
9
+ /**
10
+ * 交互式选择平台
11
+ * @param remembered 上次选择的平台 values,用于默认勾选
12
+ * @returns 选中的平台 value 列表 (如 ['macOS', 'iOS', 'macOS-asan'])
13
+ */
14
+ export declare function selectPlatforms(remembered?: string[]): Promise<string[]>;
15
+ /**
16
+ * 解析 CLI -p 参数为平台 values
17
+ * @param keys CLI 参数 keys (如 ['mac', 'ios'])
18
+ * @returns 平台 values (如 ['macOS', 'iOS'])
19
+ */
20
+ export declare function parsePlatformArgs(keys: string[]): string[];
21
+ /**
22
+ * 通用多选框
23
+ * @param message 提示信息
24
+ * @param choices 选项列表
25
+ * @returns 选中的值列表
26
+ */
27
+ export declare function checkboxSelect<T extends string>(message: string, choices: {
28
+ name: string;
29
+ value: T;
30
+ checked?: boolean;
31
+ }[]): Promise<T[]>;
32
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1D,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,UAAQ,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,GAC7C,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CAOZ;AAID;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoF9E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAe1D;AAID;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,EACnD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,GACvD,OAAO,CAAC,CAAC,EAAE,CAAC,CAUd"}
@@ -0,0 +1,131 @@
1
+ import { select, confirm, input, checkbox, Separator } from '@inquirer/prompts';
2
+ import { PLATFORM_OPTIONS } from '../core/platform.js';
3
+ export async function selectOption(message, choices) {
4
+ return select({ message, choices });
5
+ }
6
+ export async function confirmAction(message, defaultValue = false) {
7
+ return confirm({ message, default: defaultValue });
8
+ }
9
+ export async function inputText(message, defaultValue, validate) {
10
+ return input({ message, default: defaultValue, validate });
11
+ }
12
+ export async function selectFromList(message, items, display) {
13
+ const choices = items.map((item, i) => ({
14
+ name: display(item),
15
+ value: i,
16
+ }));
17
+ const index = await select({ message, choices });
18
+ return items[index];
19
+ }
20
+ // ============ 平台选择 ============
21
+ /**
22
+ * 交互式选择平台
23
+ * @param remembered 上次选择的平台 values,用于默认勾选
24
+ * @returns 选中的平台 value 列表 (如 ['macOS', 'iOS', 'macOS-asan'])
25
+ */
26
+ export async function selectPlatforms(remembered) {
27
+ const rememberedSet = new Set(remembered ?? []);
28
+ const choices = [];
29
+ for (const platform of PLATFORM_OPTIONS) {
30
+ // 主平台选项
31
+ choices.push({
32
+ name: platform.key,
33
+ value: platform.value,
34
+ checked: rememberedSet.has(platform.value),
35
+ });
36
+ // ASAN 子选项
37
+ if (platform.asan) {
38
+ choices.push({
39
+ name: ` └─ ${platform.key}-asan`,
40
+ value: platform.asan,
41
+ checked: rememberedSet.has(platform.asan),
42
+ });
43
+ }
44
+ // HWASAN 子选项 (仅 android)
45
+ if (platform.hwasan) {
46
+ choices.push({
47
+ name: ` └─ ${platform.key}-hwasan`,
48
+ value: platform.hwasan,
49
+ checked: rememberedSet.has(platform.hwasan),
50
+ });
51
+ }
52
+ }
53
+ // 分隔符
54
+ choices.push(new Separator('──────────────'));
55
+ // 自定义输入选项
56
+ choices.push({
57
+ name: '[+] 自定义输入...',
58
+ value: '__CUSTOM__',
59
+ checked: false,
60
+ });
61
+ // 选择
62
+ const selected = await checkbox({
63
+ message: '请选择需要的平台:',
64
+ choices: choices,
65
+ pageSize: 15,
66
+ });
67
+ // 处理结果
68
+ const result = [];
69
+ let needCustomInput = false;
70
+ for (const value of selected) {
71
+ if (value === '__CUSTOM__') {
72
+ needCustomInput = true;
73
+ }
74
+ else {
75
+ result.push(value);
76
+ }
77
+ }
78
+ // 自定义输入
79
+ if (needCustomInput) {
80
+ const customInput = await input({
81
+ message: '请输入自定义平台 (空格或逗号分隔):',
82
+ });
83
+ if (customInput.trim()) {
84
+ const customPlatforms = customInput
85
+ .split(/[\s,]+/)
86
+ .map((p) => p.trim())
87
+ .filter((p) => p.length > 0);
88
+ result.push(...customPlatforms);
89
+ }
90
+ }
91
+ return result;
92
+ }
93
+ /**
94
+ * 解析 CLI -p 参数为平台 values
95
+ * @param keys CLI 参数 keys (如 ['mac', 'ios'])
96
+ * @returns 平台 values (如 ['macOS', 'iOS'])
97
+ */
98
+ export function parsePlatformArgs(keys) {
99
+ const result = [];
100
+ for (const key of keys) {
101
+ // 查找匹配的平台
102
+ const platform = PLATFORM_OPTIONS.find((p) => p.key === key);
103
+ if (platform) {
104
+ result.push(platform.value);
105
+ }
106
+ else {
107
+ // 不认识的 key 直接作为 value 使用 (自定义平台)
108
+ result.push(key);
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ // ============ 通用多选 ============
114
+ /**
115
+ * 通用多选框
116
+ * @param message 提示信息
117
+ * @param choices 选项列表
118
+ * @returns 选中的值列表
119
+ */
120
+ export async function checkboxSelect(message, choices) {
121
+ return checkbox({
122
+ message,
123
+ choices: choices.map((c) => ({
124
+ name: c.name,
125
+ value: c.value,
126
+ checked: c.checked ?? false,
127
+ })),
128
+ pageSize: 20,
129
+ });
130
+ }
131
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "tanmi-dock",
3
+ "version": "0.4.0-beta.1",
4
+ "description": "集中型第三方库链接管理工具",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "tanmi-dock": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/tanmika/TanmiDock.git"
18
+ },
19
+ "homepage": "https://github.com/tanmika/TanmiDock#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/tanmika/TanmiDock/issues"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsx src/index.ts",
29
+ "lint": "eslint src/ tests/",
30
+ "lint:fix": "eslint src/ tests/ --fix",
31
+ "format": "prettier --write src/ tests/",
32
+ "format:check": "prettier --check src/ tests/",
33
+ "start": "node dist/index.js",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "test:coverage": "vitest run --coverage"
37
+ },
38
+ "keywords": [
39
+ "symlink",
40
+ "3rdparty",
41
+ "dependency",
42
+ "storage"
43
+ ],
44
+ "author": "tanmika",
45
+ "license": "MIT",
46
+ "dependencies": {
47
+ "@inquirer/prompts": "^8.1.0",
48
+ "commander": "^12.1.0",
49
+ "p-limit": "^7.2.0",
50
+ "proper-lockfile": "^4.1.2",
51
+ "semver": "^7.7.3"
52
+ },
53
+ "devDependencies": {
54
+ "@eslint/js": "^9.39.2",
55
+ "@types/node": "^22.10.0",
56
+ "@types/proper-lockfile": "^4.1.4",
57
+ "@types/semver": "^7.7.1",
58
+ "@typescript-eslint/eslint-plugin": "^8.51.0",
59
+ "@typescript-eslint/parser": "^8.51.0",
60
+ "@vitest/coverage-v8": "^4.0.16",
61
+ "eslint": "^9.39.2",
62
+ "eslint-config-prettier": "^10.1.8",
63
+ "eslint-plugin-prettier": "^5.5.4",
64
+ "prettier": "^3.7.4",
65
+ "tsx": "^4.19.0",
66
+ "typescript": "^5.7.0",
67
+ "typescript-eslint": "^8.51.0",
68
+ "vitest": "^4.0.16"
69
+ },
70
+ "engines": {
71
+ "node": ">=18.0.0"
72
+ }
73
+ }