Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions scripts/test-shared-db.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ import { fileURLToPath, pathToFileURL } from 'node:url'

const shadowMateRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
const merchantAdminRoot = path.resolve(shadowMateRoot, '..', 'shadow-size', 'merchant-admin')
const testPath = path.join(shadowMateRoot, 'supabase', 'tests', 'learning_rls_test.sql')
const testsDir = path.join(shadowMateRoot, 'supabase', 'tests')

function collectTestFiles() {
return fs
.readdirSync(testsDir)
.filter((entry) => entry.endsWith('.sql'))
.sort()
.map((entry) => path.join(testsDir, entry))
}

function validateLocalDatabaseUrl(databaseUrl, source) {
let parsedUrl
Expand Down Expand Up @@ -75,8 +83,13 @@ export { buildTestDatabaseUrl }
if (process.argv[1] && pathToFileURL(process.argv[1]).href === import.meta.url) {
const databaseUrl = getDatabaseUrl()
const testDatabaseUrl = buildTestDatabaseUrl(databaseUrl)
const testFiles = collectTestFiles()

if (testFiles.length === 0) {
throw new Error(`在 ${testsDir} 中没有找到任何 SQL 测试文件。`)
}

console.log('🧪 运行 Shadow Mate learning RLS 测试(目标:loopback 本地数据库)')
console.log(`🧪 运行 ${testFiles.length} 个 pgTAP 测试文件(目标:loopback 本地数据库)`)
execFileSync(
'npx',
[
Expand All @@ -85,7 +98,7 @@ if (process.argv[1] && pathToFileURL(process.argv[1]).href === import.meta.url)
'db',
'--db-url',
testDatabaseUrl,
testPath,
...testFiles,
],
{
cwd: shadowMateRoot,
Expand Down
20 changes: 20 additions & 0 deletions src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,26 @@
.pts-card.sub .pts-toggle{background:#e08a8a;}
.pts-card.sub.done .pts-toggle{background:#d9534f;}

.growth-form{display:grid;grid-template-columns:minmax(0,1fr) 120px auto;gap:8px;align-items:end;margin-top:10px;}
.growth-form label{display:flex;flex-direction:column;gap:5px;color:var(--green-deep);font-size:12px;font-weight:800;}
.growth-form input{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:12px;background:var(--card);color:var(--ink);padding:10px 11px;font:inherit;font-size:14px;}
.growth-form .checkin{width:auto;white-space:nowrap;padding:10px 14px;font-size:13px;}
.growth-custom-card{background:linear-gradient(135deg,var(--card),var(--green-soft));}
.growth-reward-card{background:linear-gradient(135deg,var(--card),#fff7dc);}
.reward-list{margin-top:14px;display:grid;gap:9px;}
.reward-card{display:flex;align-items:center;gap:9px;border:1px solid var(--line);border-radius:16px;background:var(--card);padding:9px 10px;}
.reward-icon{width:34px;height:34px;border-radius:12px;background:#fff2bc;color:#a26c00;display:flex;align-items:center;justify-content:center;flex:0 0 auto;}
.reward-info{display:flex;flex:1;min-width:0;flex-direction:column;gap:2px;}
.reward-info strong{font-size:13px;color:var(--ink);}
.reward-info span{font-size:11px;color:var(--ink-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.reward-card .pts-badge{margin-left:0;}
.reward-redeem{width:auto;padding:8px 10px;font-size:12px;}
.reward-redeem:disabled{opacity:.55;cursor:not-allowed;}
@media (max-width:360px){
.growth-form{grid-template-columns:1fr;}
.growth-form .checkin{width:100%;}
}

.cal{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;}
.cal-chip{width:100%;height:auto;aspect-ratio:1;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:800;background:#f1f7f2;border:2px solid transparent;cursor:pointer;color:var(--ink-soft);transition:transform .15s ease,background-color .15s ease,border-color .15s ease,box-shadow .15s ease;font-family:inherit;appearance:none;}
.cal-chip:active{transform:scale(.96);}
Expand Down
Loading
Loading