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(() => [
|
const categories = computed(() => [
|
||||||
{ key: 'all', name: '全部可接', count: orders.value.length, icon: ICONS.gridAll },
|
{ 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([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
在新工单中引用
屏蔽一个用户