-
Notifications
You must be signed in to change notification settings - Fork 42
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Improvement] Add generic error types to useQuery of @powersync/react #472
Comments
This is a case that I'm applying to my app: // ----- Entities
import { Schema } from 'effect'
export class Quote extends Schema.Class<Quote>('@repo/context-domain/Quote')({
text:: Schema.String
...
}
// ----- Queries
const make = Effect.map(SqliteDb, kysely => ({
...
getAllMine: (profileId: string): CompilableGetter<Quote> => {
const query = kysely
.selectFrom('quotes')
.selectAll()
.where('createdByProfile', '=', profileId)
.orderBy('createdAt', 'desc')
return {
execute: async () =>
Effect.runPromise(
Effect.gen(function* () {
const dbRows = yield* Effect.tryPromise({
try: () => query.execute(),
catch: error => new ErrorSqliteQuery({ error }),
})
return yield* Effect.all(
dbRows.map(_ =>
Schema.decodeUnknown(Quote)(_).pipe(
Effect.mapError(error => new ErrorRepoRowToSchema({ error })),
),
),
)
}),
),
compile: () => query.compile(),
}
},
...
}))
export class RepoQuote extends Effect.Tag('repos-sqlite/RepoQuote')<
RepoQuote,
Effect.Effect.Success<typeof make>
>() {
static readonly Live = Layer.effect(this, make).pipe(
Layer.provide(SqliteDb.Live),
)
}
// ------ Errors
import { Data } from 'effect'
export class ErrorSqliteQuery extends Data.TaggedError('ErrorSqliteQuery')<{
readonly error?: any
}> {}
export class ErrorRepoRowToSchema extends Data.TaggedError(
'ErrorRepoRowToSchema',
)<{
readonly error?: any
}> {}
// ----- For running Effect logic
import { ManagedRuntime, Layer } from 'effect'
const ReposLive = Layer.mergeAll(
RepoQuote.Live,
).pipe(Layer.provide(PowerSyncClientLive))
const MainLayer = Layer.mergeAll(
PowerSyncClientLive,
PowerSyncConnectorLive,
ReposLive,
).pipe(Layer.provide(Layer.provideMerge(EnvConfigProviderLayer, LoggingLive)))
export const RuntimeClient = ManagedRuntime.make(MainLayer) ----- The React component: // getAllMine: (profileId: string) => Effect.Effect<CompilableGetter<Quote>, never, RepoQuote>
const { data, error } = useQuery<Quote>(
RuntimeClient.runSync(RepoQuote.getAllMine(profileId)),
) |
Some thoughts? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Problem
Currently, the PowerSync query system uses a generic
Error
type for error handling inQueryResult
https://github.com/powersync-ja/powersync-js/blob/main/packages/react/src/hooks/useQuery.ts#L9 and https://github.com/powersync-ja/powersync-js/blob/main/packages/common/src/types/types.ts.This makes it difficult to handle specific types of errors in a type-safe manner when using TypeScript, forcing developers to use type assertions or broadly catch all errors without type discrimination.
Proposed Solution
Add generic error type support to the query system, allowing developers to specify and handle specific error types with full TypeScript support.
Type Changes
Usage Example
Benefits
Implementation Notes
Error
typeThe text was updated successfully, but these errors were encountered: