chore: 前端工程化 + Git hooks + 对齐 PathEditor 规范

- 新增 .gitattributes(CRLF 统一)+ rust-toolchain.toml
- 新增 Prettier + ESLint + markdownlint 配置
- 新增 Husky Git hooks(pre-commit lint-staged + commit-msg commitlint)
- 新增 vitest 前端测试(12 tests, utils/qrText.ts)
- 新增 @ 路径别名(vite + tsconfig)
- 新增 ROADMAP / SUPPORT / CODEOWNERS / FUNDING / dependabot
- 更新 .gitignore + .editorconfig
- 更新 package.json(新增 lint/format/test 脚本)
- 全项目 prettier 格式化 + eslint 通过
- 更新 CLAUDE.md + README.md
This commit is contained in:
2026-06-19 19:42:13 +08:00
parent ce8063431e
commit c3956f0f36
40 changed files with 4034 additions and 148 deletions
@@ -0,0 +1,109 @@
/**
* QR 编码文本构造工具 — 单元测试
*/
import { describe, it, expect } from 'vitest';
import {
buildWifiText,
buildVCardText,
buildEmailText,
buildPhoneText,
buildSmsText,
buildEncodedText,
} from '@/utils/qrText';
describe('buildWifiText', () => {
it('构造 WPA WiFi 字符串', () => {
const result = buildWifiText({
ssid: 'MyWiFi',
encryption: 'WPA',
password: 'pass123',
});
expect(result).toBe('WIFI:T:WPA;S:MyWiFi;P:pass123;;');
});
it('空 SSID 返回空字符串', () => {
const result = buildWifiText({ ssid: '' });
expect(result).toBe('');
});
it('隐藏网络标记正确', () => {
const result = buildWifiText({
ssid: 'HiddenNet',
encryption: 'WPA2',
password: 'secret',
hidden: 'true',
});
expect(result).toBe('WIFI:T:WPA2;S:HiddenNet;P:secret;H:true;;');
});
it('默认加密方式为 WPA', () => {
const result = buildWifiText({ ssid: 'Test' });
expect(result).toContain('T:WPA');
});
});
describe('buildVCardText', () => {
it('构造完整 vCard', () => {
const result = buildVCardText({
name: '张三',
phone: '13800138000',
email: 'zhangsan@example.com',
company: '测试公司',
address: '北京市',
});
expect(result).toContain('BEGIN:VCARD');
expect(result).toContain('VERSION:3.0');
expect(result).toContain('FN:张三');
expect(result).toContain('TEL:13800138000');
expect(result).toContain('EMAIL:zhangsan@example.com');
expect(result).toContain('END:VCARD');
});
it('空字段产生空值', () => {
const result = buildVCardText({});
expect(result).toBe('BEGIN:VCARD\nVERSION:3.0\nFN:\nTEL:\nEMAIL:\nORG:\nADR:\nEND:VCARD');
});
});
describe('buildEmailText', () => {
it('构造 mailto 链接', () => {
const result = buildEmailText({
to: 'test@example.com',
subject: 'Hello',
body: 'Test body',
});
expect(result).toContain('mailto:test@example.com');
expect(result).toContain('subject=');
expect(result).toContain('body=');
});
});
describe('buildPhoneText', () => {
it('构造电话链接', () => {
expect(buildPhoneText({ number: '13800138000' })).toBe('tel:13800138000');
});
});
describe('buildSmsText', () => {
it('构造短信链接', () => {
const result = buildSmsText({ number: '13800138000', message: 'Hi' });
expect(result).toBe('smsto:13800138000:Hi');
});
});
describe('buildEncodedText', () => {
it('url 模式返回 url 字段', () => {
const result = buildEncodedText('url', { url: 'https://example.com' });
expect(result).toBe('https://example.com');
});
it('wifi 模式委托给 buildWifiText', () => {
const result = buildEncodedText('wifi', { ssid: 'Test', encryption: 'WPA' });
expect(result).toContain('WIFI:T:WPA;S:Test');
});
it('未知模式返回 text 字段', () => {
const result = buildEncodedText('unknown', { text: 'raw text' });
expect(result).toBe('raw text');
});
});