Files
NextEdu/scripts/arch-scan/schema.ts

127 lines
4.0 KiB
TypeScript

import type Database from "better-sqlite3";
const DDL_STATEMENTS = [
`CREATE TABLE IF NOT EXISTS modules (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
path TEXT NOT NULL,
description TEXT,
layer TEXT NOT NULL,
created_at TEXT NOT NULL
)`,
`CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY,
module_id INTEGER REFERENCES modules(id),
path TEXT NOT NULL UNIQUE,
kind TEXT NOT NULL,
lines INTEGER,
is_server INTEGER DEFAULT 0,
is_client INTEGER DEFAULT 0,
has_server_only INTEGER DEFAULT 0
)`,
`CREATE TABLE IF NOT EXISTS symbols (
id INTEGER PRIMARY KEY,
file_id INTEGER NOT NULL REFERENCES files(id),
name TEXT NOT NULL,
kind TEXT NOT NULL,
is_exported INTEGER DEFAULT 0,
is_async INTEGER DEFAULT 0,
is_server_action INTEGER DEFAULT 0,
is_public INTEGER DEFAULT 0,
signature TEXT,
start_line INTEGER,
end_line INTEGER,
UNIQUE(file_id, name, start_line)
)`,
`CREATE TABLE IF NOT EXISTS calls (
id INTEGER PRIMARY KEY,
caller_id INTEGER NOT NULL REFERENCES symbols(id),
callee_id INTEGER REFERENCES symbols(id),
callee_external TEXT,
call_line INTEGER,
count INTEGER DEFAULT 1
)`,
`CREATE TABLE IF NOT EXISTS file_imports (
id INTEGER PRIMARY KEY,
source_file_id INTEGER NOT NULL REFERENCES files(id),
imported_file_id INTEGER REFERENCES files(id),
import_path TEXT NOT NULL,
is_type_only INTEGER DEFAULT 0,
imported_names TEXT
)`,
`CREATE TABLE IF NOT EXISTS module_deps (
id INTEGER PRIMARY KEY,
source_module_id INTEGER NOT NULL REFERENCES modules(id),
target_module_id INTEGER NOT NULL REFERENCES modules(id),
dep_type TEXT NOT NULL,
UNIQUE(source_module_id, target_module_id, dep_type)
)`,
`CREATE TABLE IF NOT EXISTS tech_tags (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
category TEXT
)`,
`CREATE TABLE IF NOT EXISTS symbol_tech_tags (
symbol_id INTEGER NOT NULL REFERENCES symbols(id),
tag_id INTEGER NOT NULL REFERENCES tech_tags(id),
PRIMARY KEY(symbol_id, tag_id)
)`,
`CREATE TABLE IF NOT EXISTS permissions (
id INTEGER PRIMARY KEY,
key TEXT NOT NULL UNIQUE,
description TEXT
)`,
`CREATE TABLE IF NOT EXISTS routes (
id INTEGER PRIMARY KEY,
path TEXT NOT NULL UNIQUE,
kind TEXT NOT NULL,
file_id INTEGER REFERENCES files(id),
min_permission TEXT
)`,
`CREATE TABLE IF NOT EXISTS db_tables (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
module_id INTEGER REFERENCES modules(id),
description TEXT
)`,
`CREATE TABLE IF NOT EXISTS scan_meta (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
)`,
`CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_id)`,
`CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name)`,
`CREATE INDEX IF NOT EXISTS idx_calls_caller ON calls(caller_id)`,
`CREATE INDEX IF NOT EXISTS idx_calls_callee ON calls(callee_id)`,
`CREATE INDEX IF NOT EXISTS idx_file_imports_source ON file_imports(source_file_id)`,
`CREATE INDEX IF NOT EXISTS idx_file_imports_target ON file_imports(imported_file_id)`,
`CREATE INDEX IF NOT EXISTS idx_symbol_tech_tags_tag ON symbol_tech_tags(tag_id)`,
];
export function initSchema(db: Database.Database): void {
for (const stmt of DDL_STATEMENTS) {
db.exec(stmt);
}
}
export function clearAllData(db: Database.Database): void {
const tables = [
"symbol_tech_tags",
"calls",
"file_imports",
"module_deps",
"symbols",
"files",
"modules",
"tech_tags",
"permissions",
"routes",
"db_tables",
"scan_meta",
];
db.exec("PRAGMA foreign_keys = OFF");
for (const table of tables) {
db.exec(`DELETE FROM ${table}`);
}
db.exec("PRAGMA foreign_keys = ON");
}