fix(miniapp): 修复 hall.vue 混入 TS 类型标注导致编译失败
- countByType 的 (cls: string)/(o: any) 改为纯 JS 写法 - 新增 miniapp-script-syntax 护栏:未声明 lang=ts 的 vue 脚本禁止 TS 类型标注(112 套件/734 用例全绿)
这个提交包含在:
@@ -385,7 +385,7 @@ onUnmounted(() => {
|
||||
});
|
||||
|
||||
|
||||
const countByType = (cls: string) => orders.value.filter((o: any) => o.typeClass === cls).length;
|
||||
const countByType = (cls) => orders.value.filter((o) => o.typeClass === cls).length;
|
||||
|
||||
const categories = computed(() => [
|
||||
{ key: 'all', name: '全部可接', count: orders.value.length, icon: ICONS.gridAll },
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// 已读取AGENTS.md
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
/**
|
||||
* 第九十七批:小程序 Vue 单文件不得混入 TypeScript 语法。
|
||||
* 背景:hall.vue 的 `<script setup>` 未声明 lang="ts",却写了 `(cls: string)`,
|
||||
* 导致 HBuilderX/Vite 编译直接失败,只能在人工编译时发现。
|
||||
*/
|
||||
describe('第九十七批小程序脚本语法闸门', () => {
|
||||
const root = path.resolve(__dirname, '../../pwuniapp');
|
||||
|
||||
const walk = (dir: string, out: string[]): string[] => {
|
||||
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
||||
if (entry.name === 'node_modules' || entry.name === 'unpackage' || entry.name.startsWith('.')) continue;
|
||||
const full = path.join(dir, entry.name);
|
||||
if (entry.isDirectory()) walk(full, out);
|
||||
else if (entry.name.endsWith('.vue')) out.push(full);
|
||||
}
|
||||
return out;
|
||||
};
|
||||
|
||||
it('未声明 lang="ts" 的 <script> 中不得出现 TS 类型标注', () => {
|
||||
const problems: string[] = [];
|
||||
const typeAnno = /\(\s*[A-Za-z_$][\w$]*\s*:\s*(string|number|boolean|any|unknown|void|Record|Array)\b/;
|
||||
for (const file of walk(root, [])) {
|
||||
const src = fs.readFileSync(file, 'utf-8');
|
||||
const scriptMatch = src.match(/<script([^>]*)>([\s\S]*?)<\/script>/);
|
||||
if (!scriptMatch) continue;
|
||||
const attrs = scriptMatch[1] || '';
|
||||
if (/lang\s*=\s*["']ts["']/.test(attrs)) continue;
|
||||
if (typeAnno.test(scriptMatch[2])) {
|
||||
problems.push(path.relative(root, file));
|
||||
}
|
||||
}
|
||||
expect(problems).toEqual([]);
|
||||
});
|
||||
});
|
||||
在新工单中引用
屏蔽一个用户