- 原生 Next.js App Router + 严格 TypeScript 实现花魁短剧 PC/H5 页面,按 src/features/{catalog,content,playback} 组织,保留完整 SEO(metadata、JSON-LD、canonical、robots、llms、sitemap、IndexNow)。
- 主域名通过 SITE_URL=https://huakuidj.com 强制覆盖后端 foreverUrlAddr(config/*.env、src/server/config.ts、src/server/seo/shared.ts、src/server/services/shared.ts),支持邮箱改为 support@huakuidj.com。
- 移除登录与账户体系:删除 /account 全部页面、登录/注册/充值弹窗、收藏点赞、评论、金币解锁及对应 BFF 接口;旧账户地址 GET/HEAD 统一 301 到首页(src/lib/routes.ts REMOVED_ACCOUNT_PATHS),保留游客会话、反馈、图片上传、观看上报与搜索联想。
- 播放页:评论位改为同类推荐 + 热播榜单,锁定集改为 App 观看遮罩与底部弹层,新增简介标签、分集图例与独立视觉皮肤(src/features/playback、src/styles/pages/playback.css)。
- 卡片:短剧/视频卡状态与时长移至信息行胶囊标签,封面角标移至左上角(src/components/catalog/Cards.tsx、src/styles/foundations/base.css)。
- 同步更新单元测试、浏览器冒烟脚本、路由清单与 README。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
33 lines
2.8 KiB
TypeScript
33 lines
2.8 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { installationURL } from '../src/server/config';
|
|
import { installGuideData } from '../src/server/services/install-guide';
|
|
|
|
test('installation URLs require a valid HTTP(S) platform destination', () => {
|
|
assert.equal(installationURL(' https://apps.apple.com/app/id123?campaign=site '), 'https://apps.apple.com/app/id123?campaign=site');
|
|
assert.equal(installationURL('http://downloads.example/app.apk'), 'http://downloads.example/app.apk');
|
|
for (const value of ['', '/download-app/', '//downloads.example/app', 'javascript:alert(1)', 'data:text/html,test', 'file:///tmp/app.apk', 'vbscript:foo', 'huakui://open', 'https://user:password@example.com/', 'https://example.com/\napp.apk']) assert.equal(installationURL(value), '', value);
|
|
});
|
|
|
|
test('deep links allow universal links and app schemes while rejecting executable protocols', () => {
|
|
assert.equal(installationURL('huakui://open/home', true), 'huakui://open/home');
|
|
assert.equal(installationURL('https://app.example/open', true), 'https://app.example/open');
|
|
for (const value of ['javascript://alert(1)', 'JaVaScRiPt:alert(1)', 'data://text/html,test', 'file://localhost/etc/passwd', 'vbscript://execute', 'blob://test', 'about://blank', 'chrome://settings', 'huakui:open', 'not a URL']) assert.equal(installationURL(value, true), '', value);
|
|
});
|
|
|
|
test('unconfigured installation capabilities retain backend AppAddr and truthful fallback state', () => {
|
|
const empty = { iosStoreURL: '', iosProfileURL: '', androidAPKURL: '', deepLinkURL: '' };
|
|
const data = installGuideData('https://download.example/real-backend-page', empty);
|
|
assert.equal(data.iosStoreURL, data.fallbackURL); assert.equal(data.iosProfileURL, data.fallbackURL); assert.equal(data.androidAPKURL, data.fallbackURL);
|
|
assert.equal(data.fallbackURL, 'https://download.example/real-backend-page');
|
|
assert.equal(data.hasIOSStore, false); assert.equal(data.hasIOSProfile, false); assert.equal(data.hasAndroidAPK, false); assert.equal(data.deepLinkURL, '');
|
|
assert.equal(installGuideData(undefined, empty).fallbackURL, '/app/download/');
|
|
});
|
|
|
|
test('each configured installation capability replaces only its own fallback', () => {
|
|
const data = installGuideData('https://download.example/', { iosStoreURL: 'https://apps.apple.com/app/id123', iosProfileURL: '', androidAPKURL: 'https://download.example/app.apk', deepLinkURL: 'huakui://open' });
|
|
assert.equal(data.iosStoreURL, 'https://apps.apple.com/app/id123'); assert.equal(data.hasIOSStore, true);
|
|
assert.equal(data.iosProfileURL, 'https://download.example/'); assert.equal(data.hasIOSProfile, false);
|
|
assert.equal(data.androidAPKURL, 'https://download.example/app.apk'); assert.equal(data.hasAndroidAPK, true); assert.equal(data.deepLinkURL, 'huakui://open');
|
|
});
|