import {routingModuleUrl} from './helpers/routing.mjs'; import {linkShared,sharedModule} from './helpers/shared-modules.mjs'; import {test} from 'node:test'; import assert from 'node:assert/strict'; import {readFile} from 'node:fs/promises'; import vm from 'node:vm'; import ts from 'typescript'; import {seo,clientSeo,headDocument} from './helpers/seo.mjs'; const routingFile=new URL('../src/lib/routing.ts',import.meta.url); const routingCode=ts.transpileModule(await readFile(routingFile,'utf8'),{compilerOptions:{module:ts.ModuleKind.ESNext,target:ts.ScriptTarget.ES2022}}).outputText; const routing=await import('data:text/javascript;base64,'+Buffer.from(routingCode+'\n//# sourceURL='+routingFile.pathname).toString('base64')); const protocolFile=new URL('../src/lib/api/protocol.ts',import.meta.url); const protocolCode=ts.transpileModule(await readFile(protocolFile,'utf8'),{compilerOptions:{module:ts.ModuleKind.ESNext,target:ts.ScriptTarget.ES2022}}).outputText; const protocolUrl='data:text/javascript;base64,'+Buffer.from(protocolCode).toString('base64'); const protocol=await import(protocolUrl); const renderCode=ts.transpileModule(await readFile(new URL('../src/lib/client/render.ts',import.meta.url),'utf8'),{compilerOptions:{module:ts.ModuleKind.ESNext,target:ts.ScriptTarget.ES2022}}).outputText; const renderUrl='data:text/javascript;base64,'+Buffer.from(renderCode.replace("'../routing'",JSON.stringify(routingModuleUrl)).replace('"../api/protocol"',JSON.stringify(protocolUrl))).toString('base64'); const searchCode=ts.transpileModule(await readFile(new URL('../src/lib/client/search.ts',import.meta.url),'utf8'),{compilerOptions:{module:ts.ModuleKind.ESNext,target:ts.ScriptTarget.ES2022}}).outputText; const search=await import('data:text/javascript;base64,'+Buffer.from(searchCode.replace("'../routing'",JSON.stringify(routingModuleUrl)).replace("'../api/protocol'",JSON.stringify(protocolUrl)).replace("'./render'",JSON.stringify(renderUrl))).toString('base64')); const infoCode=ts.transpileModule(await readFile(new URL('../src/lib/info-pages.ts',import.meta.url),'utf8'),{compilerOptions:{module:ts.ModuleKind.ESNext,target:ts.ScriptTarget.ES2022}}).outputText; const infoPages=await import('data:text/javascript;base64,'+Buffer.from(linkShared(infoCode)).toString('base64')); const brandModule=await sharedModule('brand'); const siteNavigationCode=ts.transpileModule(await readFile(new URL('../src/lib/site-navigation.ts',import.meta.url),'utf8'),{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022}}).outputText; const applicationFile=new URL('../src/lib/client/application.ts',import.meta.url); const applicationCode=ts.transpileModule(await readFile(applicationFile,'utf8'),{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022}}).outputText; const channelCode=ts.transpileModule(await readFile(new URL('../src/lib/client/channel.ts',import.meta.url),'utf8'),{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022}}).outputText; function fixture(load=async()=>({list:[{id:1}],totalCount:72,name:'接口通用标题'}),options={}){ const nodes=new Map(),calls=[],cardCalls=[],reloads=[]; const location={pathname:'/rank/hot/',search:'',origin:'https://site.test',reload:()=>reloads.push(location.pathname+location.search)}; const sidebar={dataset:{page:'rank'},classList:{toggle(name,active){this[name]=active;}},setAttribute(){},removeAttribute(){}}; const document={...headDocument(),querySelector(selector){ if(selector==='dialog[open]')return null; if(!nodes.has(selector))nodes.set(selector,{innerHTML:'',textContent:'',hidden:false,dataset:{},setAttribute(name,value){this[name]=value;}}); return nodes.get(selector); },querySelectorAll:selector=>selector.startsWith('a[data-page]')?[sidebar]:selector==='[data-promotion-row]'?options.promotionRows||[]:[]}; class ApiClient {async get(path,query,signal){calls.push({path,...query,signal});return load(path,query,signal);}async revalidateSession(){calls.push({path:'restore-session'});}} const exports={},channelExports={},siteNavigationExports={}; const require=specifier=>{ if(specifier==='../site-navigation')return siteNavigationExports; if(specifier==='../brand')return brandModule; if(specifier==='./routing')return routing; if(specifier==='./api/protocol')return protocol; if(specifier==='./channel')return channelExports; if(specifier==='./api')return {ApiClient}; if(specifier==='../routing')return routing; if(specifier==='../api/protocol')return protocol; if(specifier==='./search')return search; if(specifier==='../info-pages')return infoPages; if(specifier==='../seo')return seo; if(specifier==='./seo')return {applyPageHead:head=>clientSeo.applyPageHead(head,document)}; if(specifier==='./config')return {configureSite:async()=>{}}; if(specifier==='./hero-swipe')return {bindHeroSwipe(){}}; if(specifier==='./promo-marquee')return {bindPromotionMarquee:root=>{calls.push({path:'bindPromotionMarquee',root});return ()=>calls.push({path:'disposePromotionMarquee',root});}}; if(specifier==='./player')return {renderPlayer:async(_app,id,chapterId,isVideo,options)=>{calls.push({path:'renderPlayer',id,chapterId,isVideo,...options});return ()=>{};}}; if(specifier==='./render')return {escape:String,empty:message=>`
${message}
`,loading:()=>'加载中
',activeBanners:()=>[],topicCard:()=>'专题',renderHome:()=>'