Fix TypeScript compilation issues in packages

- Add explicit type annotations for isolatedDeclarations
- Export Database type alias from db-schema
- Fix import paths and add proper type exports
- Update common schemas with better exports

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
RevIQ
2026-01-09 11:46:11 +08:00
parent aee22ae454
commit 5eeef44850
7 changed files with 81 additions and 69 deletions

View File

@@ -1,41 +1,41 @@
import { oc } from "@orpc/contract"; import { oc } from "@orpc/contract";
import { z } from "zod"; import { z } from "zod";
import { import {
signupInputSchema, adminAddSiteInputSchema,
verifyEmailInputSchema,
loginRequestInputSchema,
loginRequestOutputSchema,
loginPasswordInputSchema,
loginStatusOutputSchema,
forgotPasswordInputSchema,
resetPasswordInputSchema,
} from "./schemas/auth.js";
import {
userProfileSchema,
setupProfileInputSchema,
updateProfileInputSchema,
setPasswordInputSchema,
passkeyOutputSchema,
sessionOutputSchema,
deviceOutputSchema,
trustDeviceInputSchema,
} from "./schemas/user.js";
import {
createOrgInputSchema,
orgOutputSchema,
orgMemberOutputSchema,
updateMemberRoleInputSchema,
createInviteInputSchema,
orgInviteOutputSchema,
orgSiteOutputSchema,
} from "./schemas/org.js";
import {
adminCreateOrgInputSchema, adminCreateOrgInputSchema,
adminCreateUserInputSchema, adminCreateUserInputSchema,
adminUpdateUserInputSchema, adminUpdateUserInputSchema,
adminAddSiteInputSchema,
} from "./schemas/admin.js"; } from "./schemas/admin.js";
import {
forgotPasswordInputSchema,
loginPasswordInputSchema,
loginRequestInputSchema,
loginRequestOutputSchema,
loginStatusOutputSchema,
resetPasswordInputSchema,
signupInputSchema,
verifyEmailInputSchema,
} from "./schemas/auth.js";
import { emailSchema, slugSchema } from "./schemas/common.js"; import { emailSchema, slugSchema } from "./schemas/common.js";
import {
createInviteInputSchema,
createOrgInputSchema,
orgInviteOutputSchema,
orgMemberOutputSchema,
orgOutputSchema,
orgSiteOutputSchema,
updateMemberRoleInputSchema,
} from "./schemas/org.js";
import {
deviceOutputSchema,
passkeyOutputSchema,
sessionOutputSchema,
setPasswordInputSchema,
setupProfileInputSchema,
trustDeviceInputSchema,
updateProfileInputSchema,
userProfileSchema,
} from "./schemas/user.js";
/** /**
* oRPC API Contract for the Publisher Dashboard * oRPC API Contract for the Publisher Dashboard
@@ -73,28 +73,28 @@ export const contract = oc.router({
z.object({ z.object({
challengeId: z.number(), challengeId: z.number(),
options: z.any(), // PublicKeyCredentialCreationOptionsJSON options: z.any(), // PublicKeyCredentialCreationOptionsJSON
}) }),
), ),
verifyRegistration: oc verifyRegistration: oc
.input( .input(
z.object({ z.object({
challengeId: z.number(), challengeId: z.number(),
response: z.any(), // RegistrationResponseJSON response: z.any(), // RegistrationResponseJSON
}) }),
) )
.output(z.void()), .output(z.void()),
createAuthenticationOptions: oc.output( createAuthenticationOptions: oc.output(
z.object({ z.object({
challengeId: z.number(), challengeId: z.number(),
options: z.any(), // PublicKeyCredentialRequestOptionsJSON options: z.any(), // PublicKeyCredentialRequestOptionsJSON
}) }),
), ),
verifyAuthentication: oc verifyAuthentication: oc
.input( .input(
z.object({ z.object({
challengeId: z.number(), challengeId: z.number(),
response: z.any(), // AuthenticationResponseJSON response: z.any(), // AuthenticationResponseJSON
}) }),
) )
.output(z.void()), .output(z.void()),
}), }),
@@ -110,27 +110,31 @@ export const contract = oc.router({
// Authentication settings // Authentication settings
setPassword: oc.input(setPasswordInputSchema).output(z.void()), setPassword: oc.input(setPasswordInputSchema).output(z.void()),
listPasskeys: oc.output(z.array(passkeyOutputSchema)), listPasskeys: oc.output(z.array(passkeyOutputSchema)),
createPasskey: oc createPasskey: oc.input(z.object({ name: z.string() })).output(
.input(z.object({ name: z.string() }))
.output(
z.object({ z.object({
challengeId: z.number(), challengeId: z.number(),
options: z.any(), // PublicKeyCredentialCreationOptionsJSON options: z.any(), // PublicKeyCredentialCreationOptionsJSON
}) }),
), ),
renamePasskey: oc renamePasskey: oc
.input(z.object({ passkeyId: z.number(), name: z.string() })) .input(z.object({ passkeyId: z.number(), name: z.string() }))
.output(z.void()), .output(z.void()),
deletePasskey: oc.input(z.object({ passkeyId: z.number() })).output(z.void()), deletePasskey: oc
.input(z.object({ passkeyId: z.number() }))
.output(z.void()),
// Sessions & devices // Sessions & devices
listSessions: oc.output(z.array(sessionOutputSchema)), listSessions: oc.output(z.array(sessionOutputSchema)),
revokeSession: oc.input(z.object({ sessionId: z.number() })).output(z.void()), revokeSession: oc
.input(z.object({ sessionId: z.number() }))
.output(z.void()),
revokeAllSessions: oc.output(z.void()), revokeAllSessions: oc.output(z.void()),
getDeviceInfo: oc.output(deviceOutputSchema), getDeviceInfo: oc.output(deviceOutputSchema),
trustDevice: oc.input(trustDeviceInputSchema).output(z.void()), trustDevice: oc.input(trustDeviceInputSchema).output(z.void()),
listTrustedDevices: oc.output(z.array(deviceOutputSchema)), listTrustedDevices: oc.output(z.array(deviceOutputSchema)),
untrustDevice: oc.input(z.object({ deviceId: z.number() })).output(z.void()), untrustDevice: oc
.input(z.object({ deviceId: z.number() }))
.output(z.void()),
revokeAllTrustedDevices: oc.output(z.void()), revokeAllTrustedDevices: oc.output(z.void()),
}), }),
@@ -147,7 +151,7 @@ export const contract = oc.router({
slug: slugSchema, slug: slugSchema,
displayName: z.string().optional(), displayName: z.string().optional(),
logoUrl: z.string().optional(), logoUrl: z.string().optional(),
}) }),
) )
.output(z.void()), .output(z.void()),
delete: oc.input(z.object({ slug: slugSchema })).output(z.void()), delete: oc.input(z.object({ slug: slugSchema })).output(z.void()),
@@ -198,7 +202,7 @@ export const contract = oc.router({
slug: slugSchema, slug: slugSchema,
displayName: z.string().optional(), displayName: z.string().optional(),
logoUrl: z.string().optional(), logoUrl: z.string().optional(),
}) }),
) )
.output(z.void()), .output(z.void()),
delete: oc.input(z.object({ slug: slugSchema })).output(z.void()), delete: oc.input(z.object({ slug: slugSchema })).output(z.void()),
@@ -222,7 +226,9 @@ export const contract = oc.router({
// Admin auth management // Admin auth management
auth: oc.router({ auth: oc.router({
completeLogin: oc.input(z.object({ email: emailSchema })).output(z.void()), completeLogin: oc
.input(z.object({ email: emailSchema }))
.output(z.void()),
}), }),
}), }),
}); });

View File

@@ -1,9 +1,8 @@
// Export the contract // Export the contract
export { contract } from "./contract.js"; export { contract } from "./contract.js";
export * from "./schemas/admin.js";
export * from "./schemas/auth.js";
// Export all schemas // Export all schemas
export * from "./schemas/common.js"; export * from "./schemas/common.js";
export * from "./schemas/auth.js";
export * from "./schemas/user.js";
export * from "./schemas/org.js"; export * from "./schemas/org.js";
export * from "./schemas/admin.js"; export * from "./schemas/user.js";

View File

@@ -1,10 +1,16 @@
import { parsePhoneNumberWithError, isValidPhoneNumber } from "libphonenumber-js"; import {
isValidPhoneNumber,
parsePhoneNumberWithError,
} from "libphonenumber-js";
import { z } from "zod"; import { z } from "zod";
/** /**
* Email schema - validates email format and transforms to lowercase * Email schema - validates email format and transforms to lowercase
*/ */
export const emailSchema = z.string().email().toLowerCase() satisfies z.ZodTypeAny; export const emailSchema = z
.string()
.email()
.toLowerCase() satisfies z.ZodTypeAny;
/** /**
* Slug schema for org slugs * Slug schema for org slugs
@@ -15,7 +21,8 @@ export const slugSchema = z
.min(2) .min(2)
.max(63) .max(63)
.regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/, { .regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/, {
message: "Slug must be lowercase alphanumeric with hyphens (not at start/end)", message:
"Slug must be lowercase alphanumeric with hyphens (not at start/end)",
}); });
/** /**
@@ -26,7 +33,9 @@ export const phoneSchema = z
.string() .string()
.optional() .optional()
.transform((val) => { .transform((val) => {
if (!val) return undefined; if (!val) {
return undefined;
}
const phone = parsePhoneNumberWithError(val); const phone = parsePhoneNumberWithError(val);
return phone.format("E.164"); // +14155551234 return phone.format("E.164"); // +14155551234
}) })

View File

@@ -4,7 +4,6 @@
* @module @reviq/db-schema * @module @reviq/db-schema
*/ */
export * from "./types.js";
// Re-export DB as Database for convenience // Re-export DB as Database for convenience
export type { DB as Database } from "./types.js"; export type { DB as Database } from "./types.js";
export * from "./types.js";

View File

@@ -16,9 +16,9 @@ export type Json = JsonValue;
export type JsonArray = JsonValue[]; export type JsonArray = JsonValue[];
export type JsonObject = { export interface JsonObject {
[x: string]: JsonValue | undefined; [x: string]: JsonValue | undefined;
}; }
export type JsonPrimitive = boolean | number | string | null; export type JsonPrimitive = boolean | number | string | null;

View File

@@ -4,8 +4,8 @@
* @module @reviq/db * @module @reviq/db
*/ */
import { Kysely, PostgresDialect } from "kysely";
import type { Database } from "@reviq/db-schema"; import type { Database } from "@reviq/db-schema";
import { Kysely, PostgresDialect } from "kysely";
import pg from "pg"; import pg from "pg";
const { Pool } = pg; const { Pool } = pg;
@@ -17,11 +17,11 @@ const { Pool } = pg;
* @returns Kysely database instance * @returns Kysely database instance
*/ */
export const createDb = ( export const createDb = (
connectionString: string = process.env.DATABASE_URL || "" connectionString: string = process.env.DATABASE_URL || "",
): Kysely<Database> => { ): Kysely<Database> => {
if (!connectionString) { if (!connectionString) {
throw new Error( throw new Error(
"Database connection string is required. Set DATABASE_URL environment variable." "Database connection string is required. Set DATABASE_URL environment variable.",
); );
} }

View File

@@ -4,8 +4,8 @@
* @module @reviq/db * @module @reviq/db
*/ */
import type { Kysely } from "kysely";
import type { Database } from "@reviq/db-schema"; import type { Database } from "@reviq/db-schema";
import type { Kysely } from "kysely";
import { createDb } from "./client.js"; import { createDb } from "./client.js";
/** /**
@@ -15,12 +15,11 @@ import { createDb } from "./client.js";
*/ */
export const db: Kysely<Database> = createDb(); export const db: Kysely<Database> = createDb();
/**
* Export createDb for creating custom database instances
*/
export { createDb } from "./client.js";
/** /**
* Re-export database types from db-schema * Re-export database types from db-schema
*/ */
export type { Database } from "@reviq/db-schema"; export type { Database } from "@reviq/db-schema";
/**
* Export createDb for creating custom database instances
*/
export { createDb } from "./client.js";