From 689c39d81fe9c15a01a26d045ffc294d68a83f2b Mon Sep 17 00:00:00 2001 From: eerraa Date: Sat, 19 Sep 2026 13:02:40 +0900 Subject: [PATCH] fix(import): extract filenames from Windows file-picker paths --- scripts/import-filename.test.mjs | 23 +++++++++++++++++++++++ src/components/AddAccountModal.tsx | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 scripts/import-filename.test.mjs diff --git a/scripts/import-filename.test.mjs b/scripts/import-filename.test.mjs new file mode 100644 index 0000000..36d0652 --- /dev/null +++ b/scripts/import-filename.test.mjs @@ -0,0 +1,23 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import vm from 'node:vm'; +import ts from 'typescript'; + +const file = ts.createSourceFile('AddAccountModal.tsx', fs.readFileSync('src/components/AddAccountModal.tsx', 'utf8'), ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX); +const expressions = []; +function visit(node) { + if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.name.text === 'filename') expressions.push(node.initializer.getText(file)); + ts.forEachChild(node, visit); +} +visit(file); +assert.equal(expressions.length, 1); +const basename = vm.runInNewContext(`p => (${expressions[0]})`); + +test('import filename excludes Windows drive and UNC directories', () => { + assert.equal(basename('C:\\Users\\한글 이름\\accounts.json'), 'accounts.json'); + assert.equal(basename('\\\\server\\share\\tokens.zip'), 'tokens.zip'); +}); +test('POSIX, mixed separators and plain filenames stay valid', () => { + for (const p of ['/tmp/accounts.json', 'C:\\Users/folder\\accounts.json', 'accounts.json']) assert.equal(basename(p), 'accounts.json'); +}); diff --git a/src/components/AddAccountModal.tsx b/src/components/AddAccountModal.tsx index 65214fc..7efa0af 100644 --- a/src/components/AddAccountModal.tsx +++ b/src/components/AddAccountModal.tsx @@ -371,7 +371,7 @@ export function AddAccountModal({ isOpen, onClose, onAdd, onSuccess }: AddAccoun try { const files = await Promise.all(paths.map(async (p) => { const bytes = await readFile(p); - const filename = p.split('/').pop() || p; + const filename = p.split(/[\\/]/).pop() || p; return { filename, content_b64: bytesToBase64(bytes) }; })); const r = await invoke('bulk_import_accounts', { files });