refactor: remove duplicate miniapp page sources

This commit is contained in:
Codex
2026-09-13 21:19:05 +08:00
parent c66e42dd8a
commit eed4400611
15 changed files with 280 additions and 1024 deletions
@@ -0,0 +1,26 @@
import assert from 'node:assert/strict'
import { existsSync, readdirSync } from 'node:fs'
import { extname, join, relative, resolve } from 'node:path'
const root = resolve(import.meta.dirname, '..')
const pagesRoot = resolve(root, 'miniapp/pages')
function walk(directory) {
return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
const absolutePath = join(directory, entry.name)
return entry.isDirectory() ? walk(absolutePath) : [absolutePath]
})
}
const duplicatePageSources = walk(pagesRoot)
.filter((file) => extname(file) === '.ts')
.filter((file) => existsSync(file.replace(/\.ts$/, '.js')))
.map((file) => relative(root, file).replace(/\\/g, '/'))
assert.deepEqual(
duplicatePageSources,
[],
`小程序页面存在 TS/JS 双源,可能导致微信开发者工具加载旧实现:\n${duplicatePageSources.join('\n')}`,
)
console.log('Miniapp page source uniqueness contracts passed')
@@ -0,0 +1,60 @@
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import vm from 'node:vm'
import ts from '../miniapp/node_modules/typescript/lib/typescript.js'
function loadPage(relativePath, api) {
let page
const source = readFileSync(new URL(`../${relativePath}`, import.meta.url), 'utf8')
const executableSource = relativePath.endsWith('.ts')
? ts.transpileModule(source, {
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
}).outputText
: source
vm.runInNewContext(executableSource, {
exports: {},
module: { exports: {} },
require(request) {
if (request === '../../utils/api') return { default: api }
throw new Error(`未预期依赖:${request}`)
},
Page(config) { page = config },
wx: {},
console,
}, { filename: relativePath })
return page
}
const statusCalls = []
const declarationPage = loadPage('miniapp/pages/local-eligibility/local-eligibility.ts', {
get: async (url) => {
statusCalls.push(url)
return { verificationStatus: 'needs_evidence', eligibilityType: 'employment' }
},
})
assert.equal(typeof declarationPage.checkStatus, 'function', 'U62 必须实现资格状态查询')
await declarationPage.checkStatus.call({
setData(data) { this.data = { ...(this.data || {}), ...data } },
data: {},
})
assert.deepEqual(statusCalls, ['/local-eligibility'], 'U62 必须从当前用户资格接口读取状态')
const submitCalls = []
const supplementPage = loadPage('miniapp/pages/local-eligibility-supplement/local-eligibility-supplement.ts', {
post: async (url, data) => {
submitCalls.push([url, data])
return { verificationStatus: 'pending_review' }
},
})
assert.equal(typeof supplementPage.submitEligibility, 'function', 'U63 必须实现声明与提交审核链路')
await supplementPage.submitEligibility.call({
data: { eligibilityType: 'employment', selectedType: '', uploadedFileIds: [] },
setData() {},
})
assert.deepEqual(
submitCalls.map(([url]) => url),
['/local-eligibility/declaration', '/local-eligibility/submit'],
'无需补证时必须先声明,再提交审核',
)
console.log('Phase 04 local eligibility contracts passed')