shellbase 0.12.1 → 0.13.0
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/agent.js +16 -4
- package/dist/browse.js +17 -4
- package/package.json +1 -1
package/dist/agent.js
CHANGED
|
@@ -801,6 +801,9 @@ export async function runAgent(options) {
|
|
|
801
801
|
const dir = typeof control.dir === 'string' && control.dir ? control.dir : liveCwd(session);
|
|
802
802
|
const name = typeof control.name === 'string' ? control.name : '';
|
|
803
803
|
let failure;
|
|
804
|
+
// 내용물이 든 폴더는 바로 지우지 않고 개수만 돌려준다 — 폰이 한 번 더 물어본 뒤
|
|
805
|
+
// recursive 로 다시 부른다 (browse.ts 의 deleteEntry 설명 참고)
|
|
806
|
+
let pending;
|
|
804
807
|
if (control.op === 'rename') {
|
|
805
808
|
const to = typeof control.to === 'string' ? control.to : '';
|
|
806
809
|
failure = renameEntry(dir, name, to).error;
|
|
@@ -808,9 +811,14 @@ export async function runAgent(options) {
|
|
|
808
811
|
console.log(`📱 폰에서 이름을 바꿨어요: ${name} → ${to} (${dir})`);
|
|
809
812
|
}
|
|
810
813
|
else if (control.op === 'delete') {
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
+
const recursive = control.recursive === true;
|
|
815
|
+
const result = deleteEntry(dir, name, { recursive, protect: liveCwd(session) });
|
|
816
|
+
failure = result.error;
|
|
817
|
+
if (result.contains !== undefined)
|
|
818
|
+
pending = { name, contains: result.contains };
|
|
819
|
+
if (!failure && !pending) {
|
|
820
|
+
console.log(`📱 폰에서 지웠어요: ${name}${recursive ? ' (통째로)' : ''} (${dir})`);
|
|
821
|
+
}
|
|
814
822
|
}
|
|
815
823
|
else {
|
|
816
824
|
failure = '알 수 없는 요청이에요.';
|
|
@@ -819,7 +827,11 @@ export async function runAgent(options) {
|
|
|
819
827
|
void send({
|
|
820
828
|
kind: 'dirs',
|
|
821
829
|
to: session.deviceId,
|
|
822
|
-
data: encryptFrame(JSON.stringify(
|
|
830
|
+
data: encryptFrame(JSON.stringify({
|
|
831
|
+
...listing,
|
|
832
|
+
...(failure ? { error: failure } : {}),
|
|
833
|
+
...(pending ? { pending } : {}),
|
|
834
|
+
}), session.frameKey),
|
|
823
835
|
});
|
|
824
836
|
return;
|
|
825
837
|
}
|
package/dist/browse.js
CHANGED
|
@@ -39,7 +39,10 @@ export function renameEntry(dir, name, to) {
|
|
|
39
39
|
// 지우기 — 파일은 바로, 폴더는 **비어 있을 때만**.
|
|
40
40
|
// 폰에서 한 번 잘못 누르면 되돌릴 수 없으므로, 안에 든 것까지 통째로 지우는 일은 하지 않는다
|
|
41
41
|
// (정말 필요하면 터미널에서 직접 지우면 된다).
|
|
42
|
-
|
|
42
|
+
// 지우기. 폴더 안에 뭐가 들어 있으면 바로 지우지 않고 `contains`(들어 있는 개수)만 돌려준다 —
|
|
43
|
+
// 폰에서 "안에 N개가 들어 있어요. 통째로 지울까요?" 를 한 번 더 물어본 뒤 recursive 로 다시 부른다.
|
|
44
|
+
// (예전에는 여기서 그냥 거절했는데, 그러면 내용물 있는 폴더는 영영 정리할 수 없었다)
|
|
45
|
+
export function deleteEntry(dir, name, opts = {}) {
|
|
43
46
|
const target = childPath(dir, name);
|
|
44
47
|
if (!target)
|
|
45
48
|
return { error: '지울 수 없는 이름이에요.' };
|
|
@@ -50,13 +53,17 @@ export function deleteEntry(dir, name) {
|
|
|
50
53
|
catch {
|
|
51
54
|
return { error: '이미 없어요.' };
|
|
52
55
|
}
|
|
56
|
+
// 지금 터미널이 그 안에서 돌고 있는 폴더는 못 지운다 — 지우면 셸이 갈 곳을 잃는다
|
|
57
|
+
if (opts.protect && stat.isDirectory() && isInside(opts.protect, target)) {
|
|
58
|
+
return { error: `지금 터미널이 "${name}" 안에서 돌고 있어요. 밖으로 나온 뒤 지워주세요.` };
|
|
59
|
+
}
|
|
53
60
|
try {
|
|
54
61
|
if (stat.isDirectory()) {
|
|
55
62
|
const inside = fs.readdirSync(target);
|
|
56
|
-
if (inside.length > 0) {
|
|
57
|
-
return {
|
|
63
|
+
if (inside.length > 0 && !opts.recursive) {
|
|
64
|
+
return { contains: inside.length };
|
|
58
65
|
}
|
|
59
|
-
fs.
|
|
66
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
60
67
|
return {};
|
|
61
68
|
}
|
|
62
69
|
fs.unlinkSync(target);
|
|
@@ -66,6 +73,12 @@ export function deleteEntry(dir, name) {
|
|
|
66
73
|
return { error: `지우지 못했어요: ${err.message}` };
|
|
67
74
|
}
|
|
68
75
|
}
|
|
76
|
+
// child 가 parent 와 같거나 그 아래에 있는가
|
|
77
|
+
function isInside(child, parent) {
|
|
78
|
+
const a = path.resolve(child);
|
|
79
|
+
const b = path.resolve(parent);
|
|
80
|
+
return a === b || a.startsWith(b.endsWith(path.sep) ? b : b + path.sep);
|
|
81
|
+
}
|
|
69
82
|
export function listDirs(dir, opts = {}) {
|
|
70
83
|
const target = path.resolve(dir);
|
|
71
84
|
const up = path.dirname(target);
|