forked from trent_larson/crowd-funder-for-time-pwa
Integrate TypeScript type checking into build process with conditional execution
- Add type checking to build scripts for production/test builds only - Fix TypeScript errors in migration service, router, and platform services - Add electronAPI type declarations for Electron platform - Remove type checking from development builds for faster hot reload - Update tsconfig.node.json to resolve configuration conflicts - Ensure type safety for production while maintaining fast development workflow
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint --ext .js,.ts,.vue --ignore-path .gitignore src",
|
"lint": "eslint --ext .js,.ts,.vue --ignore-path .gitignore src",
|
||||||
"lint-fix": "eslint --ext .js,.ts,.vue --ignore-path .gitignore --fix src",
|
"lint-fix": "eslint --ext .js,.ts,.vue --ignore-path .gitignore --fix src",
|
||||||
|
"type-check": "tsc --noEmit",
|
||||||
"prebuild": "eslint --ext .js,.ts,.vue --ignore-path .gitignore src && node sw_combine.js && node scripts/copy-wasm.js",
|
"prebuild": "eslint --ext .js,.ts,.vue --ignore-path .gitignore src && node sw_combine.js && node scripts/copy-wasm.js",
|
||||||
"test:prerequisites": "node scripts/check-prerequisites.js",
|
"test:prerequisites": "node scripts/check-prerequisites.js",
|
||||||
"test:web": "npx playwright test -c playwright.config-local.ts --trace on",
|
"test:web": "npx playwright test -c playwright.config-local.ts --trace on",
|
||||||
|
|||||||
@@ -252,6 +252,25 @@ execute_docker_build() {
|
|||||||
log_info "Docker image available as: $image_tag:$mode"
|
log_info "Docker image available as: $image_tag:$mode"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Function to run type checking based on build mode
|
||||||
|
run_type_checking() {
|
||||||
|
local mode="$1"
|
||||||
|
|
||||||
|
# Only run type checking for production and test builds
|
||||||
|
if [ "$mode" = "production" ] || [ "$mode" = "test" ]; then
|
||||||
|
log_info "Running TypeScript type checking for $mode mode..."
|
||||||
|
|
||||||
|
if ! measure_time npm run type-check; then
|
||||||
|
log_error "TypeScript type checking failed for $mode mode!"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "TypeScript type checking completed for $mode mode"
|
||||||
|
else
|
||||||
|
log_debug "Skipping TypeScript type checking for development mode"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Function to start Vite development server
|
# Function to start Vite development server
|
||||||
start_dev_server() {
|
start_dev_server() {
|
||||||
log_info "Starting Vite development server..."
|
log_info "Starting Vite development server..."
|
||||||
@@ -333,7 +352,10 @@ elif [ "$SERVE_BUILD" = true ]; then
|
|||||||
log_info "Cleaning dist directory..."
|
log_info "Cleaning dist directory..."
|
||||||
clean_build_artifacts "dist"
|
clean_build_artifacts "dist"
|
||||||
|
|
||||||
# Step 2: Execute Vite build
|
# Step 2: Run type checking (for production/test builds)
|
||||||
|
safe_execute "Type checking for $BUILD_MODE mode" "run_type_checking $BUILD_MODE" || exit 2
|
||||||
|
|
||||||
|
# Step 3: Execute Vite build
|
||||||
safe_execute "Vite build for $BUILD_MODE mode" "execute_vite_build $BUILD_MODE" || exit 3
|
safe_execute "Vite build for $BUILD_MODE mode" "execute_vite_build $BUILD_MODE" || exit 3
|
||||||
|
|
||||||
# Step 3: Serve the build
|
# Step 3: Serve the build
|
||||||
@@ -348,7 +370,10 @@ else
|
|||||||
log_info "Cleaning dist directory..."
|
log_info "Cleaning dist directory..."
|
||||||
clean_build_artifacts "dist"
|
clean_build_artifacts "dist"
|
||||||
|
|
||||||
# Step 2: Execute Vite build
|
# Step 2: Run type checking (for production/test builds)
|
||||||
|
safe_execute "Type checking for $BUILD_MODE mode" "run_type_checking $BUILD_MODE" || exit 2
|
||||||
|
|
||||||
|
# Step 3: Execute Vite build
|
||||||
safe_execute "Vite build for $BUILD_MODE mode" "execute_vite_build $BUILD_MODE" || exit 3
|
safe_execute "Vite build for $BUILD_MODE mode" "execute_vite_build $BUILD_MODE" || exit 3
|
||||||
|
|
||||||
# Step 3: Execute Docker build if requested
|
# Step 3: Execute Docker build if requested
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ const MIGRATIONS = [
|
|||||||
* @param extractMigrationNames - A function that extracts the names (string array) from "select name from migrations"
|
* @param extractMigrationNames - A function that extracts the names (string array) from "select name from migrations"
|
||||||
*/
|
*/
|
||||||
export async function runMigrations<T>(
|
export async function runMigrations<T>(
|
||||||
sqlExec: (sql: string, params?: unknown[]) => Promise<unknown>,
|
sqlExec: (sql: string, params?: unknown[]) => Promise<void>,
|
||||||
sqlQuery: (sql: string, params?: unknown[]) => Promise<T>,
|
sqlQuery: (sql: string, params?: unknown[]) => Promise<T>,
|
||||||
extractMigrationNames: (result: T) => Set<string>,
|
extractMigrationNames: (result: T) => Set<string>,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ window.addEventListener("unhandledrejection", (event) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Electron-specific initialization
|
// Electron-specific initialization
|
||||||
if (typeof window !== "undefined" && window.require) {
|
if (typeof window !== "undefined" && typeof window.require === "function") {
|
||||||
// We're in an Electron renderer process
|
// We're in an Electron renderer process
|
||||||
logger.log("[Electron] Detected Electron renderer process");
|
logger.log("[Electron] Detected Electron renderer process");
|
||||||
|
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ router.onError(errorHandler); // Assign the error handler to the router instance
|
|||||||
* @param from - Source route
|
* @param from - Source route
|
||||||
* @param next - Navigation function
|
* @param next - Navigation function
|
||||||
*/
|
*/
|
||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, _from, next) => {
|
||||||
try {
|
try {
|
||||||
// Skip identity check for routes that handle identity creation manually
|
// Skip identity check for routes that handle identity creation manually
|
||||||
const skipIdentityRoutes = [
|
const skipIdentityRoutes = [
|
||||||
|
|||||||
@@ -134,7 +134,11 @@ class AbsurdSqlDatabaseService implements DatabaseService {
|
|||||||
|
|
||||||
// An error is thrown without this pragma: "File has invalid page size. (the first block of a new file must be written first)"
|
// An error is thrown without this pragma: "File has invalid page size. (the first block of a new file must be written first)"
|
||||||
await this.db.exec(`PRAGMA journal_mode=MEMORY;`);
|
await this.db.exec(`PRAGMA journal_mode=MEMORY;`);
|
||||||
const sqlExec = this.db.run.bind(this.db);
|
|
||||||
|
// Create wrapper functions that match the expected signatures
|
||||||
|
const sqlExec = async (sql: string, params?: unknown[]): Promise<void> => {
|
||||||
|
await this.db!.run(sql, params);
|
||||||
|
};
|
||||||
const sqlQuery = this.db.exec.bind(this.db);
|
const sqlQuery = this.db.exec.bind(this.db);
|
||||||
|
|
||||||
// Extract the migration names for the absurd-sql format
|
// Extract the migration names for the absurd-sql format
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
SQLiteConnection,
|
SQLiteConnection,
|
||||||
SQLiteDBConnection,
|
SQLiteDBConnection,
|
||||||
CapacitorSQLite,
|
CapacitorSQLite,
|
||||||
capSQLiteChanges,
|
|
||||||
DBSQLiteValues,
|
DBSQLiteValues,
|
||||||
} from "@capacitor-community/sqlite";
|
} from "@capacitor-community/sqlite";
|
||||||
|
|
||||||
@@ -496,19 +495,17 @@ export class CapacitorPlatformService implements PlatformService {
|
|||||||
const sqlExec = async (
|
const sqlExec = async (
|
||||||
sql: string,
|
sql: string,
|
||||||
params?: unknown[],
|
params?: unknown[],
|
||||||
): Promise<capSQLiteChanges> => {
|
): Promise<void> => {
|
||||||
logger.debug(`🔧 [CapacitorMigration] Executing SQL:`, sql);
|
logger.debug(`🔧 [CapacitorMigration] Executing SQL:`, sql);
|
||||||
|
|
||||||
if (params && params.length > 0) {
|
if (params && params.length > 0) {
|
||||||
// Use run method for parameterized queries (prepared statements)
|
// Use run method for parameterized queries (prepared statements)
|
||||||
// This is essential for proper parameter binding and SQL injection prevention
|
// This is essential for proper parameter binding and SQL injection prevention
|
||||||
const result = await this.db!.run(sql, params);
|
await this.db!.run(sql, params);
|
||||||
return result;
|
|
||||||
} else {
|
} else {
|
||||||
// Use execute method for non-parameterized queries
|
// Use execute method for non-parameterized queries
|
||||||
// This is more efficient for simple DDL statements
|
// This is more efficient for simple DDL statements
|
||||||
const result = await this.db!.execute(sql);
|
await this.db!.execute(sql);
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
13
src/types/electron.d.ts
vendored
Normal file
13
src/types/electron.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
electronAPI?: {
|
||||||
|
exportData: (fileName: string, content: string) => Promise<{
|
||||||
|
success: boolean;
|
||||||
|
path?: string;
|
||||||
|
error?: string;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {};
|
||||||
@@ -4,9 +4,7 @@
|
|||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"module": "ESNext",
|
"module": "ESNext",
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"noEmit": true
|
|
||||||
},
|
},
|
||||||
"include": ["vite.config.*"]
|
"include": ["vite.config.*"]
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user