tanmi-dock 0.7.2 → 0.7.3-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.
- package/dist/commands/CLAUDE.md +7 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +178 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +2 -0
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/projects.d.ts +7 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +126 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/repair.d.ts +16 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +364 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/verify.d.ts +11 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +266 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/CLAUDE.md +7 -0
- package/dist/utils/ios-paths.d.ts +26 -0
- package/dist/utils/ios-paths.d.ts.map +1 -0
- package/dist/utils/ios-paths.js +70 -0
- package/dist/utils/ios-paths.js.map +1 -0
- package/dist/utils/podfile.d.ts +42 -0
- package/dist/utils/podfile.d.ts.map +1 -0
- package/dist/utils/podfile.js +254 -0
- package/dist/utils/podfile.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Podfile 操作工具
|
|
3
|
+
* 用于自动修改 CocoaPods Podfile 以添加本地 pod 依赖
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { withFileLock } from './lock.js';
|
|
8
|
+
import * as logger from './logger.js';
|
|
9
|
+
// tanmi-dock 标记块
|
|
10
|
+
const MARKER_START = '# === tanmi-dock pods start ===';
|
|
11
|
+
const MARKER_END = '# === tanmi-dock pods end ===';
|
|
12
|
+
const MARKER_COMMENT = '# Auto-generated by tanmi-dock. Do not edit manually.';
|
|
13
|
+
/**
|
|
14
|
+
* 查找项目中的 Podfile
|
|
15
|
+
* @param projectPath 项目路径
|
|
16
|
+
* @param maxDepth 最大搜索深度
|
|
17
|
+
* @returns Podfile 路径列表,按深度排序(浅层在前)
|
|
18
|
+
*/
|
|
19
|
+
export async function findPodfiles(projectPath, maxDepth = 3) {
|
|
20
|
+
const podfiles = [];
|
|
21
|
+
async function search(dir, depth) {
|
|
22
|
+
if (depth > maxDepth)
|
|
23
|
+
return;
|
|
24
|
+
try {
|
|
25
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (entry.isFile() && entry.name === 'Podfile') {
|
|
28
|
+
podfiles.push({ path: path.join(dir, entry.name), depth });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (!entry.isDirectory())
|
|
32
|
+
continue;
|
|
33
|
+
// 跳过不需要搜索的目录
|
|
34
|
+
if (entry.name.startsWith('.') ||
|
|
35
|
+
entry.name === 'node_modules' ||
|
|
36
|
+
entry.name === 'build' ||
|
|
37
|
+
entry.name === 'dist' ||
|
|
38
|
+
entry.name === 'Pods' ||
|
|
39
|
+
entry.name.endsWith('.xcodeproj') ||
|
|
40
|
+
entry.name.endsWith('.xcworkspace')) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
await search(path.join(dir, entry.name), depth + 1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// 忽略无法访问的目录
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
await search(projectPath, 0);
|
|
51
|
+
// 按深度排序,浅层优先
|
|
52
|
+
return podfiles.sort((a, b) => a.depth - b.depth).map((p) => p.path);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 解析 Podfile 中已存在的 tanmi-dock pods
|
|
56
|
+
* @param content Podfile 内容
|
|
57
|
+
* @returns 已存在的 pod 名称到路径的映射
|
|
58
|
+
*/
|
|
59
|
+
export function parseTanmiDockPods(content) {
|
|
60
|
+
const pods = new Map();
|
|
61
|
+
// 查找 tanmi-dock 块
|
|
62
|
+
const startIdx = content.indexOf(MARKER_START);
|
|
63
|
+
const endIdx = content.indexOf(MARKER_END);
|
|
64
|
+
if (startIdx === -1 || endIdx === -1 || startIdx >= endIdx) {
|
|
65
|
+
return pods;
|
|
66
|
+
}
|
|
67
|
+
const block = content.slice(startIdx, endIdx);
|
|
68
|
+
// 解析 pod 声明: pod 'name', :path => 'path'
|
|
69
|
+
const podRegex = /pod\s+['"]([^'"]+)['"]\s*,\s*:path\s*=>\s*['"]([^'"]+)['"]/g;
|
|
70
|
+
let match;
|
|
71
|
+
while ((match = podRegex.exec(block)) !== null) {
|
|
72
|
+
pods.set(match[1], match[2]);
|
|
73
|
+
}
|
|
74
|
+
return pods;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 生成 tanmi-dock pods 块
|
|
78
|
+
* @param pods Pod 配置列表
|
|
79
|
+
* @returns 生成的块内容
|
|
80
|
+
*/
|
|
81
|
+
function generatePodBlock(pods) {
|
|
82
|
+
if (pods.length === 0) {
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
const lines = [MARKER_START, MARKER_COMMENT, ''];
|
|
86
|
+
for (const pod of pods) {
|
|
87
|
+
lines.push(` pod '${pod.libName}', :path => '${pod.podPath}'`);
|
|
88
|
+
}
|
|
89
|
+
lines.push('', MARKER_END);
|
|
90
|
+
return lines.join('\n');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 查找第一个 target 块的位置
|
|
94
|
+
* @param content Podfile 内容
|
|
95
|
+
* @returns 第一个 target 块的起始位置,未找到返回 -1
|
|
96
|
+
*/
|
|
97
|
+
function findFirstTargetPosition(content) {
|
|
98
|
+
// 匹配 target 'xxx' do 或 target "xxx" do,允许前面有空格
|
|
99
|
+
const targetRegex = /^[ \t]*target\s+['"][^'"]+['"]\s+do\b/m;
|
|
100
|
+
const match = targetRegex.exec(content);
|
|
101
|
+
return match ? match.index : -1;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 创建 Podfile 备份
|
|
105
|
+
* @param podfilePath Podfile 路径
|
|
106
|
+
* @returns 备份文件路径
|
|
107
|
+
*/
|
|
108
|
+
async function createBackup(podfilePath) {
|
|
109
|
+
const backupPath = `${podfilePath}.tanmi-backup`;
|
|
110
|
+
await fs.copyFile(podfilePath, backupPath);
|
|
111
|
+
return backupPath;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 修改 Podfile 添加/更新 pods
|
|
115
|
+
* @param podfilePath Podfile 路径
|
|
116
|
+
* @param pods 要添加的 Pod 配置列表
|
|
117
|
+
* @returns 修改结果
|
|
118
|
+
*/
|
|
119
|
+
export async function modifyPodfile(podfilePath, pods) {
|
|
120
|
+
// 使用自定义锁文件,避免和 CocoaPods 的 Podfile.lock 冲突
|
|
121
|
+
return withFileLock(podfilePath, async () => {
|
|
122
|
+
const content = await fs.readFile(podfilePath, 'utf-8');
|
|
123
|
+
const result = {
|
|
124
|
+
podfilePath,
|
|
125
|
+
added: [],
|
|
126
|
+
updated: [],
|
|
127
|
+
skipped: [],
|
|
128
|
+
backupPath: null,
|
|
129
|
+
};
|
|
130
|
+
if (pods.length === 0) {
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
// 解析已存在的 pods
|
|
134
|
+
const existingPods = parseTanmiDockPods(content);
|
|
135
|
+
// 分类:添加、更新、跳过
|
|
136
|
+
const podsToWrite = [];
|
|
137
|
+
for (const pod of pods) {
|
|
138
|
+
const existingPath = existingPods.get(pod.libName);
|
|
139
|
+
if (existingPath === undefined) {
|
|
140
|
+
// 新添加
|
|
141
|
+
result.added.push(pod.libName);
|
|
142
|
+
podsToWrite.push(pod);
|
|
143
|
+
}
|
|
144
|
+
else if (existingPath !== pod.podPath) {
|
|
145
|
+
// 路径不同,需要更新
|
|
146
|
+
result.updated.push(pod.libName);
|
|
147
|
+
podsToWrite.push(pod);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// 完全相同,跳过
|
|
151
|
+
result.skipped.push(pod.libName);
|
|
152
|
+
podsToWrite.push(pod); // 仍然需要保留在块中
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// 保留已存在但不在本次 pods 列表中的条目
|
|
156
|
+
for (const [libName, podPath] of existingPods) {
|
|
157
|
+
if (!pods.find((p) => p.libName === libName)) {
|
|
158
|
+
podsToWrite.push({ libName, podPath });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// 生成新块
|
|
162
|
+
const newBlock = generatePodBlock(podsToWrite);
|
|
163
|
+
// 创建备份
|
|
164
|
+
result.backupPath = await createBackup(podfilePath);
|
|
165
|
+
// 修改内容
|
|
166
|
+
let newContent;
|
|
167
|
+
const startIdx = content.indexOf(MARKER_START);
|
|
168
|
+
const endIdx = content.indexOf(MARKER_END);
|
|
169
|
+
if (startIdx !== -1 && endIdx !== -1 && startIdx < endIdx) {
|
|
170
|
+
// 已有 tanmi-dock 块,替换
|
|
171
|
+
newContent = content.slice(0, startIdx) + newBlock + content.slice(endIdx + MARKER_END.length);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// 没有 tanmi-dock 块,需要插入
|
|
175
|
+
// 在第一个 target 块之前插入
|
|
176
|
+
const targetPos = findFirstTargetPosition(content);
|
|
177
|
+
if (targetPos > 0) {
|
|
178
|
+
// 在第一个 target 之前插入
|
|
179
|
+
newContent = content.slice(0, targetPos) + newBlock + '\n\n' + content.slice(targetPos);
|
|
180
|
+
}
|
|
181
|
+
else if (targetPos === 0) {
|
|
182
|
+
// target 在文件开头
|
|
183
|
+
newContent = newBlock + '\n\n' + content;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// 没有 target 块,在文件末尾添加
|
|
187
|
+
newContent = content.trimEnd() + '\n\n' + newBlock + '\n';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// 写入文件
|
|
191
|
+
await fs.writeFile(podfilePath, newContent, 'utf-8');
|
|
192
|
+
logger.debug(`Podfile 已修改: ${podfilePath}`);
|
|
193
|
+
return result;
|
|
194
|
+
}, { lockfilePath: podfilePath + '.tanmi-lock' });
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 从 Podfile 中移除 tanmi-dock 块
|
|
198
|
+
* @param podfilePath Podfile 路径
|
|
199
|
+
* @returns 是否成功移除
|
|
200
|
+
*/
|
|
201
|
+
export async function removeTanmiDockBlock(podfilePath) {
|
|
202
|
+
// 使用自定义锁文件,避免和 CocoaPods 的 Podfile.lock 冲突
|
|
203
|
+
return withFileLock(podfilePath, async () => {
|
|
204
|
+
const content = await fs.readFile(podfilePath, 'utf-8');
|
|
205
|
+
const startIdx = content.indexOf(MARKER_START);
|
|
206
|
+
const endIdx = content.indexOf(MARKER_END);
|
|
207
|
+
if (startIdx === -1 || endIdx === -1 || startIdx >= endIdx) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
// 创建备份
|
|
211
|
+
await createBackup(podfilePath);
|
|
212
|
+
// 移除块(包括前后可能的空行)
|
|
213
|
+
let removeStart = startIdx;
|
|
214
|
+
let removeEnd = endIdx + MARKER_END.length;
|
|
215
|
+
// 移除块前的空行
|
|
216
|
+
while (removeStart > 0 && content[removeStart - 1] === '\n') {
|
|
217
|
+
removeStart--;
|
|
218
|
+
}
|
|
219
|
+
// 移除块后的空行
|
|
220
|
+
while (removeEnd < content.length && content[removeEnd] === '\n') {
|
|
221
|
+
removeEnd++;
|
|
222
|
+
}
|
|
223
|
+
const newContent = content.slice(0, removeStart) + '\n' + content.slice(removeEnd);
|
|
224
|
+
await fs.writeFile(podfilePath, newContent, 'utf-8');
|
|
225
|
+
logger.debug(`已从 Podfile 移除 tanmi-dock 块: ${podfilePath}`);
|
|
226
|
+
return true;
|
|
227
|
+
}, { lockfilePath: podfilePath + '.tanmi-lock' });
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* 恢复 Podfile 备份
|
|
231
|
+
* @param podfilePath Podfile 路径
|
|
232
|
+
* @returns 是否成功恢复
|
|
233
|
+
*/
|
|
234
|
+
export async function restoreBackup(podfilePath) {
|
|
235
|
+
const backupPath = `${podfilePath}.tanmi-backup`;
|
|
236
|
+
try {
|
|
237
|
+
await fs.access(backupPath);
|
|
238
|
+
await fs.copyFile(backupPath, podfilePath);
|
|
239
|
+
await fs.unlink(backupPath);
|
|
240
|
+
logger.debug(`已恢复 Podfile 备份: ${podfilePath}`);
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
export default {
|
|
248
|
+
findPodfiles,
|
|
249
|
+
parseTanmiDockPods,
|
|
250
|
+
modifyPodfile,
|
|
251
|
+
removeTanmiDockBlock,
|
|
252
|
+
restoreBackup,
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=podfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"podfile.js","sourceRoot":"","sources":["../../src/utils/podfile.ts"],"names":[],"mappings":"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"}
|