Jelajahi Sumber

test: add medtech frontend theme checks

wangkangyjy 1 bulan lalu
induk
melakukan
7c0161f377
2 mengubah file dengan 76 tambahan dan 1 penghapusan
  1. 2 1
      frontend/package.json
  2. 74 0
      frontend/scripts/verify-medtech-theme.mjs

+ 2 - 1
frontend/package.json

@@ -6,7 +6,8 @@
   "scripts": {
     "dev": "vite",
     "build": "vite build",
-    "preview": "vite preview"
+    "preview": "vite preview",
+    "verify:theme": "node scripts/verify-medtech-theme.mjs"
   },
   "dependencies": {
     "vue": "^3.4.21",

+ 74 - 0
frontend/scripts/verify-medtech-theme.mjs

@@ -0,0 +1,74 @@
+import { readFileSync, readdirSync, statSync } from 'node:fs'
+import { join, relative } from 'node:path'
+
+const root = new URL('..', import.meta.url).pathname
+const src = join(root, 'src')
+
+const requiredFiles = [
+  'src/styles/theme.css',
+  'src/styles/components.css',
+  'src/styles/element-plus.css'
+]
+
+const requiredTokens = [
+  '--color-brand: #2b1f99',
+  '--color-accent: #3ad4d8',
+  '--color-bg:',
+  '--color-surface:',
+  '--color-border:',
+  '--color-text:',
+  '--radius-xs: 4px',
+  '--radius-sm: 6px',
+  '--radius-md: 8px'
+]
+
+const bannedEmoji = /[📋📌⚡⏳✅❌🎯🚀💡🔥]/
+const bannedDecor = /(radial-gradient|gradient orb|bokeh|blur\(60px\)|border-radius:\s*(1[2-9]|[2-9]\d)px)/
+
+function walk(dir) {
+  return readdirSync(dir).flatMap((name) => {
+    const path = join(dir, name)
+    return statSync(path).isDirectory() ? walk(path) : [path]
+  })
+}
+
+const failures = []
+
+for (const file of requiredFiles) {
+  try {
+    readFileSync(join(root, file), 'utf8')
+  } catch {
+    failures.push(`missing required style file: ${file}`)
+  }
+}
+
+const themePath = join(root, 'src/styles/theme.css')
+let theme = ''
+try {
+  theme = readFileSync(themePath, 'utf8')
+} catch {}
+
+for (const token of requiredTokens) {
+  if (!theme.includes(token)) failures.push(`missing theme token: ${token}`)
+}
+
+const main = readFileSync(join(root, 'src/main.js'), 'utf8')
+for (const file of requiredFiles) {
+  const importPath = './' + file.replace('src/', '')
+  if (!main.includes(importPath)) failures.push(`main.js must import ${importPath}`)
+}
+
+const vueAndCssFiles = walk(src).filter((file) => /\.(vue|css)$/.test(file))
+for (const file of vueAndCssFiles) {
+  const text = readFileSync(file, 'utf8')
+  const rel = relative(root, file)
+  if (bannedEmoji.test(text)) failures.push(`banned emoji in ${rel}`)
+  if (bannedDecor.test(text)) failures.push(`banned decorative style in ${rel}`)
+}
+
+if (failures.length) {
+  console.error(failures.join('\n'))
+  process.exit(1)
+}
+
+console.log('medtech theme checks passed')