From 3f430ecbd123d3414098c17893335c6594ef514b Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 7 Jul 2026 18:54:22 +0530 Subject: [PATCH 1/3] refac: move profiling queries to proto messages --- .../column-types/NumericProfile.svelte | 21 +- .../column-types/TimestampProfile.svelte | 11 +- .../column-types/details/TopK.svelte | 5 +- .../src/features/column-profile/queries.ts | 39 +- web-common/src/lib/proto-utils.ts | 42 + .../src/runtime-client/gen/index.schemas.ts | 988 +----------------- .../v2/codegen/generator.spec.ts | 45 +- .../runtime-client/v2/codegen/generator.ts | 67 +- .../v2/gen/connector-service.ts | 52 +- .../runtime-client/v2/gen/query-service.ts | 535 ++++------ .../runtime-client/v2/gen/runtime-service.ts | 400 ++----- 11 files changed, 488 insertions(+), 1717 deletions(-) create mode 100644 web-common/src/lib/proto-utils.ts diff --git a/web-common/src/features/column-profile/column-types/NumericProfile.svelte b/web-common/src/features/column-profile/column-types/NumericProfile.svelte index 9f82fd90df1f..c44ee1cebb6f 100644 --- a/web-common/src/features/column-profile/column-types/NumericProfile.svelte +++ b/web-common/src/features/column-profile/column-types/NumericProfile.svelte @@ -5,12 +5,11 @@ INTERVALS, isFloat, } from "@rilldata/web-common/lib/duckdb-data-types"; - import { QueryServiceColumnNumericHistogramHistogramMethod } from "@rilldata/web-common/runtime-client"; - import { useRuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { createQueryServiceColumnDescriptiveStatistics, createQueryServiceColumnRugHistogram, } from "@rilldata/web-common/runtime-client"; + import { useRuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { getPriorityForColumn } from "@rilldata/web-common/runtime-client/v2/request-priorities"; import { derived } from "svelte/store"; import ColumnProfileIcon from "../ColumnProfileIcon.svelte"; @@ -25,6 +24,8 @@ import NumericPlot from "./details/NumericPlot.svelte"; import NullPercentageSpark from "./sparks/NullPercentageSpark.svelte"; import NumericSpark from "./sparks/NumericSpark.svelte"; + import { HistogramMethod } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb.ts"; + import { getOneofValue } from "@rilldata/web-common/lib/proto-utils.ts"; export let connector: string; export let database: string; @@ -61,7 +62,7 @@ databaseSchema, objectName, columnName, - QueryServiceColumnNumericHistogramHistogramMethod.HISTOGRAM_METHOD_DIAGNOSTIC, + HistogramMethod.DIAGNOSTIC, enableProfiling, ); let fdHistogram; @@ -73,7 +74,7 @@ databaseSchema, objectName, columnName, - QueryServiceColumnNumericHistogramHistogramMethod.HISTOGRAM_METHOD_FD, + HistogramMethod.FD, enableProfiling, ); } @@ -104,7 +105,11 @@ { query: { select($query) { - return $query?.numericSummary?.numericOutliers?.outliers; + return getOneofValue( + $query?.numericSummary, + "case", + "numericOutliers", + )?.outliers; }, enabled: enableProfiling, }, @@ -138,7 +143,11 @@ }, ), ($query) => { - return $query?.data?.numericSummary?.numericStatistics; + return getOneofValue( + $query?.data?.numericSummary, + "case", + "numericStatistics", + ); }, ); diff --git a/web-common/src/features/column-profile/column-types/TimestampProfile.svelte b/web-common/src/features/column-profile/column-types/TimestampProfile.svelte index 710c29918972..3d635eddb24d 100644 --- a/web-common/src/features/column-profile/column-types/TimestampProfile.svelte +++ b/web-common/src/features/column-profile/column-types/TimestampProfile.svelte @@ -12,6 +12,8 @@ isFetching, } from "../queries"; import NullPercentageSpark from "./sparks/NullPercentageSpark.svelte"; + import { FromProtoTimeGrainMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps.ts"; + import { TimeGrain } from "@rilldata/web-common/proto/gen/rill/runtime/v1/time_grain_pb.ts"; export let connector: string; export let database: string; @@ -110,8 +112,13 @@ height={timestampDetailHeight} {data} {spark} - rollupTimeGrain={$timeSeries?.estimatedRollupInterval?.interval} - estimatedSmallestTimeGrain={$timeSeries?.smallestTimegrain} + rollupTimeGrain={FromProtoTimeGrainMap[ + $timeSeries?.estimatedRollupInterval?.interval ?? + TimeGrain.UNSPECIFIED + ]} + estimatedSmallestTimeGrain={FromProtoTimeGrainMap[ + $timeSeries?.smallestTimegrain ?? TimeGrain.UNSPECIFIED + ]} /> {/if} diff --git a/web-common/src/features/column-profile/column-types/details/TopK.svelte b/web-common/src/features/column-profile/column-types/details/TopK.svelte index 21a3e6496238..3fa3bd07e6bd 100644 --- a/web-common/src/features/column-profile/column-types/details/TopK.svelte +++ b/web-common/src/features/column-profile/column-types/details/TopK.svelte @@ -49,6 +49,7 @@ // Since the topk query is in a reactive statement with `enable`, `topK` can be undefined. // This leads to unexpected issues when paired with transition $: topKCopy = topK ?? topKCopy; + $: topKNormalised = topKCopy?.map((k) => k.toJSON()); function ensureSpaces(str: string, n = 6) { const sanitized = DOMPurify.sanitize(str, { ALLOWED_TAGS: [] }); @@ -77,9 +78,9 @@ /** handle LISTs and STRUCTs */ -{#if topKCopy && totalRows} +{#if topKNormalised && totalRows}
- {#each topKCopy.slice(0, k) as item (item.value)} + {#each topKNormalised.slice(0, k) as item (item.value)} {@const negligiblePercentage = item.count / totalRows < 0.0002} {@const percentage = negligiblePercentage ? "<.01%" diff --git a/web-common/src/features/column-profile/queries.ts b/web-common/src/features/column-profile/queries.ts index 6f4ab2b81dfb..c619f584aa95 100644 --- a/web-common/src/features/column-profile/queries.ts +++ b/web-common/src/features/column-profile/queries.ts @@ -7,10 +7,8 @@ import { createQueryServiceColumnTimeSeries, createQueryServiceColumnTopK, createQueryServiceTableCardinality, - QueryServiceColumnNumericHistogramHistogramMethod, type V1ProfileColumn, type V1TableColumnsResponse, - type V1TimeSeriesValue, } from "@rilldata/web-common/runtime-client"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { getPriorityForColumn } from "@rilldata/web-common/runtime-client/v2/request-priorities"; @@ -19,6 +17,14 @@ import { type QueryObserverResult, } from "@tanstack/query-core"; import { derived, type Readable, writable } from "svelte/store"; +import { + getOneofValue, + valueAsNumber, +} from "@rilldata/web-common/lib/proto-utils.ts"; +import type { + HistogramMethod, + TimeSeriesValue, +} from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb.ts"; export function isFetching(...queries) { return queries.some((query) => query?.isFetching); @@ -81,7 +87,11 @@ export function getSummaries( return { ...col, nullCount: nullValues?.data?.count, - cardinality: cardinality?.data?.categoricalSummary?.cardinality, + cardinality: getOneofValue( + cardinality?.data?.categoricalSummary, + "case", + "cardinality", + ), isFetching: profileColumnResponse.isFetching || nullValues?.isFetching || @@ -181,7 +191,11 @@ export function getCountDistinct( [cardinalityQuery, totalRowsQuery], ([cardinality, totalRows]) => { return { - cardinality: cardinality?.data?.categoricalSummary?.cardinality, + cardinality: getOneofValue( + cardinality?.data?.categoricalSummary, + "case", + "cardinality", + ), // SAFETY: if the V1TableCardinalityResponse exists in `totalRows`, // then `.cardinality` should presumably always exist in the // cardinality query response, so we should be able to cast it to @@ -222,15 +236,16 @@ export function getTopK( }, ); return derived(topKQuery, ($topKQuery) => { - return $topKQuery?.data?.categoricalSummary?.topK?.entries; + return getOneofValue($topKQuery?.data?.categoricalSummary, "case", "topK") + ?.entries; }); } -function convertPoint(point: V1TimeSeriesValue) { +function convertPoint(point: TimeSeriesValue) { const next = { ...point, - count: point?.records?.count as number, - ts: point.ts ? new Date(point.ts) : new Date(0), + count: valueAsNumber(point?.records?.fields?.count), + ts: point.ts?.toDate() ?? new Date(0), }; if (next.count == null || !isFinite(next.count)) { next.count = 0; @@ -329,7 +344,7 @@ export function getNumericHistogram( databaseSchema: string, objectName: string, columnName: string, - histogramMethod: QueryServiceColumnNumericHistogramHistogramMethod, + histogramMethod: HistogramMethod, enabled = true, ) { return createQueryServiceColumnNumericHistogram( @@ -346,7 +361,11 @@ export function getNumericHistogram( { query: { select(query) { - return query?.numericSummary?.numericHistogramBins?.bins; + return getOneofValue( + query?.numericSummary, + "case", + "numericHistogramBins", + )?.bins; }, enabled, }, diff --git a/web-common/src/lib/proto-utils.ts b/web-common/src/lib/proto-utils.ts new file mode 100644 index 000000000000..ba7049e2c197 --- /dev/null +++ b/web-common/src/lib/proto-utils.ts @@ -0,0 +1,42 @@ +import type { Value } from "node_modules/@bufbuild/protobuf/dist/esm/google/protobuf/struct_pb"; + +/** A protobuf-es oneof field as generated for a `case` selector. */ +type OneofSelector = + | { case: string; value: unknown } + | { case: undefined; value?: undefined }; +/** Keys of `M` whose value is a protobuf-es oneof selector. */ +type OneofKeys = { + [K in keyof M]: NonNullable extends OneofSelector ? K : never; +}[keyof M]; +/** The set of case names available on the oneof selector `O`. */ +type OneofCase = O extends { case: infer C extends string } ? C : never; +/** The value type carried by the `C` case of the oneof selector `O`. */ +type OneofValueForCase = O extends { case: C; value: infer V } + ? V + : never; + +/** + * Returns the value of a protobuf-es oneof field for the requested case, or + * undefined if the oneof is unset or set to a different case. `oneofKey` selects + * the oneof field (e.g. "case" on a CategoricalSummary, "resource" on a + * Resource) and the return type is narrowed to the value type of that case. + */ +export function getOneofValue< + M extends object, + K extends OneofKeys, + C extends OneofCase>, +>( + message: M | undefined, + oneofKey: K, + caseName: C, +): OneofValueForCase, C> | undefined { + const oneof = message?.[oneofKey] as OneofSelector | undefined; + if (oneof?.case !== caseName) { + return undefined; + } + return oneof.value as OneofValueForCase, C>; +} + +export function valueAsNumber(val: Value | undefined) { + return getOneofValue(val, "kind", "numberValue") ?? 0; +} diff --git a/web-common/src/runtime-client/gen/index.schemas.ts b/web-common/src/runtime-client/gen/index.schemas.ts index 4058c76cc057..c161ae96feb1 100644 --- a/web-common/src/runtime-client/gen/index.schemas.ts +++ b/web-common/src/runtime-client/gen/index.schemas.ts @@ -1,3 +1,10 @@ +import { + ColumnCardinalityRequest, + ColumnDescriptiveStatisticsRequest, + ColumnNullCountRequest, + ColumnNumericHistogramRequest, type ColumnRollupIntervalRequest, + ColumnRugHistogramRequest, ColumnTimeGrainRequest, ColumnTimeRangeRequest, ColumnTimeSeriesRequest, ColumnTopKRequest } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb.ts"; + /** * Runtime API type definitions. * @@ -12,12 +19,6 @@ * file instead. * - Once all consumers of a V1* type have migrated, delete the type from this file. */ -export interface ColumnTimeSeriesRequestBasicMeasure { - id?: string; - expression?: string; - sqlName?: string; -} - export interface ConnectorDriverProperty { key?: string; type?: ConnectorDriverPropertyType; @@ -198,22 +199,6 @@ export interface ProtobufAny { [key: string]: unknown; } -/** - * `NullValue` is a singleton enumeration to represent the null value for the -`Value` type union. - -The JSON representation for `NullValue` is JSON `null`. - - - NULL_VALUE: Null value. - */ -export type ProtobufNullValue = - (typeof ProtobufNullValue)[keyof typeof ProtobufNullValue]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const ProtobufNullValue = { - NULL_VALUE: "NULL_VALUE", -} as const; - export interface RpcStatus { code?: number; message?: string; @@ -511,11 +496,6 @@ This may be empty if the data refresh time is not known, e.g. if the metrics vie dataRefreshedOn?: string; } -export interface V1CategoricalSummary { - topK?: V1TopK; - cardinality?: number; -} - export interface V1CharLocation { line?: number; } @@ -527,156 +507,6 @@ export interface V1Color { alpha?: number; } -export interface V1ColumnCardinalityRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnCardinalityResponse { - categoricalSummary?: V1CategoricalSummary; -} - -export interface V1ColumnDescriptiveStatisticsRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnDescriptiveStatisticsResponse { - numericSummary?: V1NumericSummary; -} - -export interface V1ColumnNullCountRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnNullCountResponse { - count?: number; -} - -export interface V1ColumnNumericHistogramRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - histogramMethod?: V1HistogramMethod; - priority?: number; -} - -export interface V1ColumnNumericHistogramResponse { - numericSummary?: V1NumericSummary; -} - -export interface V1ColumnRollupIntervalRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnRollupIntervalResponse { - start?: string; - end?: string; - interval?: V1TimeGrain; -} - -export interface V1ColumnRugHistogramRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnRugHistogramResponse { - numericSummary?: V1NumericSummary; -} - -export interface V1ColumnTimeGrainRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnTimeGrainResponse { - timeGrain?: V1TimeGrain; -} - -export interface V1ColumnTimeRangeRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - priority?: number; -} - -export interface V1ColumnTimeRangeResponse { - timeRangeSummary?: V1TimeRangeSummary; -} - -export interface V1ColumnTimeSeriesRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - measures?: ColumnTimeSeriesRequestBasicMeasure[]; - timestampColumnName?: string; - timeRange?: V1TimeSeriesTimeRange; - pixels?: number; - sampleSize?: number; - priority?: number; - timeZone?: string; -} - -export interface V1ColumnTimeSeriesResponse { - rollup?: V1TimeSeriesResponse; -} - -export interface V1ColumnTopKRequest { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - tableName?: string; - columnName?: string; - agg?: string; - k?: number; - priority?: number; -} - -export interface V1ColumnTopKResponse { - categoricalSummary?: V1CategoricalSummary; -} - export interface V1CompleteResponse { conversationId?: string; messages?: V1Message[]; @@ -806,30 +636,6 @@ export interface V1CreateDirectoryResponse { [key: string]: unknown; } -export type V1CreateInstanceRequestVariables = { [key: string]: string }; - -export type V1CreateInstanceRequestAnnotations = { [key: string]: string }; - -/** - * Request message for RuntimeService.CreateInstance. -See message Instance for field descriptions. - */ -export interface V1CreateInstanceRequest { - instanceId?: string; - environment?: string; - olapConnector?: string; - repoConnector?: string; - adminConnector?: string; - aiConnector?: string; - connectors?: V1Connector[]; - variables?: V1CreateInstanceRequestVariables; - annotations?: V1CreateInstanceRequestAnnotations; - frontendUrl?: string; -} - -export interface V1CreateInstanceResponse { - instance?: V1Instance; -} export interface V1CreateTriggerResponse { [key: string]: unknown; @@ -848,9 +654,6 @@ export interface V1DeleteFileResponse { [key: string]: unknown; } -export interface V1DeleteInstanceResponse { - [key: string]: unknown; -} /** * Context for prompts handled by the developer_agent. @@ -869,9 +672,6 @@ export interface V1DirEntry { isDir?: boolean; } -export interface V1EditInstanceResponse { - instance?: V1Instance; -} /** * Example contains metadata about an example project that is available for unpacking. @@ -1104,23 +904,6 @@ export interface V1GenerateMetricsViewFileResponse { aiSucceeded?: boolean; } -export type V1GenerateRendererResponseRendererProperties = { - [key: string]: unknown; -}; - -export interface V1GenerateRendererResponse { - renderer?: string; - rendererProperties?: V1GenerateRendererResponseRendererProperties; -} - -export type V1GenerateResolverResponseResolverProperties = { - [key: string]: unknown; -}; - -export interface V1GenerateResolverResponse { - resolver?: string; - resolverProperties?: V1GenerateResolverResponseResolverProperties; -} export interface V1GetAIMessageResponse { message?: V1Message; @@ -1233,16 +1016,6 @@ export interface V1HealthResponse { instancesHealth?: V1HealthResponseInstancesHealth; } -export type V1HistogramMethod = - (typeof V1HistogramMethod)[keyof typeof V1HistogramMethod]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const V1HistogramMethod = { - HISTOGRAM_METHOD_UNSPECIFIED: "HISTOGRAM_METHOD_UNSPECIFIED", - HISTOGRAM_METHOD_FD: "HISTOGRAM_METHOD_FD", - HISTOGRAM_METHOD_DIAGNOSTIC: "HISTOGRAM_METHOD_DIAGNOSTIC", -} as const; - export type V1InstanceVariables = { [key: string]: string }; export type V1InstanceProjectVariables = { [key: string]: string }; @@ -2021,14 +1794,6 @@ export interface V1Notifier { properties?: V1NotifierProperties; } -export interface V1NumericHistogramBins { - bins?: NumericHistogramBinsBin[]; -} - -export interface V1NumericOutliers { - outliers?: NumericOutliersOutlier[]; -} - export interface V1NumericStatistics { min?: number; max?: number; @@ -2039,12 +1804,6 @@ export interface V1NumericStatistics { sd?: number; } -export interface V1NumericSummary { - numericHistogramBins?: V1NumericHistogramBins; - numericStatistics?: V1NumericStatistics; - numericOutliers?: V1NumericOutliers; -} - export type V1OLAPGetTableResponseUnsupportedColumns = { [key: string]: string; }; @@ -2146,27 +1905,21 @@ export interface V1Query { metricsViewTimeSeriesRequest?: V1MetricsViewTimeSeriesRequest; metricsViewTotalsRequest?: V1MetricsViewTotalsRequest; metricsViewRowsRequest?: V1MetricsViewRowsRequest; - columnRollupIntervalRequest?: V1ColumnRollupIntervalRequest; - columnTopKRequest?: V1ColumnTopKRequest; - columnNullCountRequest?: V1ColumnNullCountRequest; - columnDescriptiveStatisticsRequest?: V1ColumnDescriptiveStatisticsRequest; - columnTimeGrainRequest?: V1ColumnTimeGrainRequest; - columnNumericHistogramRequest?: V1ColumnNumericHistogramRequest; - columnRugHistogramRequest?: V1ColumnRugHistogramRequest; - columnTimeRangeRequest?: V1ColumnTimeRangeRequest; - columnCardinalityRequest?: V1ColumnCardinalityRequest; - columnTimeSeriesRequest?: V1ColumnTimeSeriesRequest; + columnRollupIntervalRequest?: ColumnRollupIntervalRequest; + columnTopKRequest?: ColumnTopKRequest; + columnNullCountRequest?: ColumnNullCountRequest; + columnDescriptiveStatisticsRequest?: ColumnDescriptiveStatisticsRequest; + columnTimeGrainRequest?: ColumnTimeGrainRequest; + columnNumericHistogramRequest?: ColumnNumericHistogramRequest; + columnRugHistogramRequest?: ColumnRugHistogramRequest; + columnTimeRangeRequest?: ColumnTimeRangeRequest; + columnCardinalityRequest?: ColumnCardinalityRequest; + columnTimeSeriesRequest?: ColumnTimeSeriesRequest; tableCardinalityRequest?: V1TableCardinalityRequest; tableColumnsRequest?: V1TableColumnsRequest; tableRowsRequest?: V1TableRowsRequest; } -export interface V1QueryBatchResponse { - index?: number; - result?: V1QueryResult; - error?: string; -} - export type V1QueryResolverResponseMeta = { [key: string]: unknown }; export type V1QueryResolverResponseDataItem = { [key: string]: unknown }; @@ -2184,27 +1937,6 @@ export interface V1QueryResponse { data?: V1QueryResponseDataItem[]; } -export interface V1QueryResult { - metricsViewAggregationResponse?: V1MetricsViewAggregationResponse; - metricsViewToplistResponse?: V1MetricsViewToplistResponse; - metricsViewComparisonResponse?: V1MetricsViewComparisonResponse; - metricsViewTimeSeriesResponse?: V1MetricsViewTimeSeriesResponse; - metricsViewTotalsResponse?: V1MetricsViewTotalsResponse; - metricsViewRowsResponse?: V1MetricsViewRowsResponse; - columnRollupIntervalResponse?: V1ColumnRollupIntervalResponse; - columnTopKResponse?: V1ColumnTopKResponse; - columnNullCountResponse?: V1ColumnNullCountResponse; - columnDescriptiveStatisticsResponse?: V1ColumnDescriptiveStatisticsResponse; - columnTimeGrainResponse?: V1ColumnTimeGrainResponse; - columnNumericHistogramResponse?: V1ColumnNumericHistogramResponse; - columnRugHistogramResponse?: V1ColumnRugHistogramResponse; - columnTimeRangeResponse?: V1ColumnTimeRangeResponse; - columnCardinalityResponse?: V1ColumnCardinalityResponse; - columnTimeSeriesResponse?: V1ColumnTimeSeriesResponse; - tableCardinalityResponse?: V1TableCardinalityResponse; - tableColumnsResponse?: V1TableColumnsResponse; - tableRowsResponse?: V1TableRowsResponse; -} export type V1ReconcileStatus = (typeof V1ReconcileStatus)[keyof typeof V1ReconcileStatus]; @@ -2648,18 +2380,6 @@ export interface V1TimeRangeSummary { watermark?: string; } -export interface V1TimeSeriesResponse { - results?: V1TimeSeriesValue[]; - spark?: V1TimeSeriesValue[]; - sampleSize?: number; -} - -export interface V1TimeSeriesTimeRange { - start?: string; - end?: string; - interval?: V1TimeGrain; -} - export type V1TimeSeriesValueRecords = { [key: string]: unknown }; export interface V1TimeSeriesValue { @@ -2693,10 +2413,6 @@ export interface V1ToolResult { isError?: boolean; } -export interface V1TopK { - entries?: TopKEntry[]; -} - /** * Trace contains trace spans captured during request execution. Used both in successful responses and as gRPC error details when trace=true and the request fails. */ @@ -2728,62 +2444,6 @@ export interface V1WatchResourcesResponse { resource?: V1Resource; } -export type ConnectorServiceListDatabaseSchemasParams = { - instanceId?: string; - connector?: string; - pageSize?: number; - pageToken?: string; -}; - -export type ConnectorServiceOLAPGetTableParams = { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - table?: string; -}; - -export type ConnectorServiceGetTableParams = { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - table?: string; -}; - -export type ConnectorServiceListTablesParams = { - instanceId?: string; - connector?: string; - database?: string; - databaseSchema?: string; - pageSize?: number; - pageToken?: string; -}; - -export type RuntimeServiceListInstancesParams = { - pageSize?: number; - pageToken?: string; -}; - -export type RuntimeServiceGetInstanceParams = { - sensitive?: boolean; -}; - -export type RuntimeServiceDeleteInstanceBody = { [key: string]: unknown }; - -/** - * Request message for RuntimeService.EditInstance. -See message Instance for field descriptions. - */ -export type RuntimeServiceEditInstanceBody = { - environment?: string; - olapConnector?: string; - repoConnector?: string; - adminConnector?: string; - aiConnector?: string; - connectors?: V1Connector[]; -}; - export type RuntimeServiceCompleteBody = { /** Conversation ID to continue. If empty, a new conversation is created. */ conversationId?: string; @@ -2797,76 +2457,6 @@ If not set, it will infer an agent based on the prompt and conversation history. feedbackAgentContext?: V1FeedbackAgentContext; }; -export type RuntimeServiceCompleteStreamingBody = { - /** Conversation ID to continue. If empty, a new conversation is created. */ - conversationId?: string; - /** The prompt to complete. */ - prompt?: string; - /** Optional agent to use for the completion. -If not set, it will infer an agent based on the prompt and conversation history. */ - agent?: string; - analystAgentContext?: V1AnalystAgentContext; - developerAgentContext?: V1DeveloperAgentContext; - feedbackAgentContext?: V1FeedbackAgentContext; -}; - -export type RuntimeServiceCompleteStreaming200 = { - result?: V1CompleteStreamingResponse; - error?: RpcStatus; -}; - -export type RuntimeServiceListConversationsParams = { - /** - * Optional search pattern for filtering by user agent. - */ - userAgentPattern?: string; -}; - -export type RuntimeServiceForkConversationBody = { [key: string]: unknown }; - -export type RuntimeServiceShareConversationBody = { - /** optional message ID up to which to share otherwise share all current messages -only valid conversation having last message of "result" type from "router" agent till until this message ID will be shared.npm -It supports a special value of "none" to unshare the conversation. */ - untilMessageId?: string; -}; - -export type ConnectorServiceListBucketsParams = { - pageSize?: number; - pageToken?: string; -}; - -export type ConnectorServiceListObjectsParams = { - /** - * Lists objects within a folder-like level (using path prefix and delimiter). Cannot be used if `glob` is passed. - */ - path?: string; - delimiter?: string; - /** - * Lists objects matching the glob pattern. Cannot be used if `path` or `delimiter` is passed. - */ - glob?: string; - pageSize?: number; - pageToken?: string; -}; - -export type RuntimeServiceListFilesParams = { - glob?: string; -}; - -export type RuntimeServiceCreateDirectoryBody = { - path?: string; -}; - -export type RuntimeServiceGetFileParams = { - path?: string; -}; - -export type RuntimeServiceDeleteFileParams = { - path?: string; - force?: boolean; -}; - export type RuntimeServicePutFileBody = { path?: string; blob?: string; @@ -2876,16 +2466,6 @@ It should only be set when create = true. */ createOnly?: boolean; }; -export type RuntimeServiceGenerateCanvasFileBody = { - /** Metrics view name to base the canvas on. */ - metricsViewName?: string; - /** Path to save the canvas file to. */ - path?: string; - /** If true, the AI will be used to generate the canvas file. -Otherwise, it falls back to a simpler heuristic approach. */ - useAi?: boolean; -}; - export type RuntimeServiceGenerateMetricsViewFileBody = { /** Model to base the metrics view on. If you set this, do NOT set connector, database, database_schema or table. */ @@ -2911,193 +2491,7 @@ Otherwise, it falls back to a simpler heuristic approach. */ prompt?: string; }; -export type RuntimeServiceRenameFileBody = { - fromPath?: string; - toPath?: string; -}; - -export type RuntimeServiceUnpackEmptyBody = { - displayName?: string; - olap?: string; - force?: boolean; -}; - -export type RuntimeServiceUnpackExampleBody = { - name?: string; - force?: boolean; -}; - -export type RuntimeServiceWatchFilesParams = { - replay?: boolean; -}; - -export type RuntimeServiceWatchFiles200 = { - result?: V1WatchFilesResponse; - error?: RpcStatus; -}; - -export type RuntimeServiceGenerateRendererBodyResolverProperties = { - [key: string]: unknown; -}; - -export type RuntimeServiceGenerateRendererBody = { - prompt?: string; - resolver?: string; - resolverProperties?: RuntimeServiceGenerateRendererBodyResolverProperties; -}; - -export type RuntimeServiceGenerateResolverBody = { - prompt?: string; - /** Both connector and table must be specified if metrics_view is not. */ - connector?: string; - table?: string; - /** table and connector should not be provided if metrics_view is provided. */ - metricsView?: string; -}; - -export type RuntimeServiceGitSwitchBranchBody = { - branch?: string; - create?: boolean; - ignoreLocalChanges?: boolean; -}; - -export type RuntimeServiceGitCommitBody = { - commitMessage?: string; -}; - -export type RuntimeServiceListGitCommitsParams = { - pageSize?: number; - pageToken?: string; -}; - -export type RuntimeServiceGitMergeToBranchBody = { - branch?: string; - /** In case of merge conflicts, prefer current changes. */ - force?: boolean; -}; - -export type RuntimeServiceGitPullBody = { - discardLocal?: boolean; -}; - -export type RuntimeServiceGitPushBody = { - commitMessage?: string; - force?: boolean; -}; - -export type RuntimeServiceRestoreGitCommitBody = { [key: string]: unknown }; - -export type RuntimeServiceGetLogsParams = { - ascending?: boolean; - limit?: number; - level?: RuntimeServiceGetLogsLevel; -}; - -export type RuntimeServiceGetLogsLevel = - (typeof RuntimeServiceGetLogsLevel)[keyof typeof RuntimeServiceGetLogsLevel]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const RuntimeServiceGetLogsLevel = { - LOG_LEVEL_UNSPECIFIED: "LOG_LEVEL_UNSPECIFIED", - LOG_LEVEL_DEBUG: "LOG_LEVEL_DEBUG", - LOG_LEVEL_INFO: "LOG_LEVEL_INFO", - LOG_LEVEL_WARN: "LOG_LEVEL_WARN", - LOG_LEVEL_ERROR: "LOG_LEVEL_ERROR", - LOG_LEVEL_FATAL: "LOG_LEVEL_FATAL", -} as const; - -export type RuntimeServiceWatchLogsParams = { - replay?: boolean; - replayLimit?: number; - level?: RuntimeServiceWatchLogsLevel; -}; - -export type RuntimeServiceWatchLogsLevel = - (typeof RuntimeServiceWatchLogsLevel)[keyof typeof RuntimeServiceWatchLogsLevel]; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -export const RuntimeServiceWatchLogsLevel = { - LOG_LEVEL_UNSPECIFIED: "LOG_LEVEL_UNSPECIFIED", - LOG_LEVEL_DEBUG: "LOG_LEVEL_DEBUG", - LOG_LEVEL_INFO: "LOG_LEVEL_INFO", - LOG_LEVEL_WARN: "LOG_LEVEL_WARN", - LOG_LEVEL_ERROR: "LOG_LEVEL_ERROR", - LOG_LEVEL_FATAL: "LOG_LEVEL_FATAL", -} as const; - -export type RuntimeServiceWatchLogs200 = { - result?: V1WatchLogsResponse; - error?: RpcStatus; -}; - -export type RuntimeServiceGetModelPartitionsParams = { - pending?: boolean; - errored?: boolean; - pageSize?: number; - pageToken?: string; -}; - -export type QueryServiceResolveCanvasBodyArgs = { [key: string]: unknown }; - -export type QueryServiceResolveCanvasBody = { - args?: QueryServiceResolveCanvasBodyArgs; -}; - -export type QueryServiceColumnCardinalityParams = { - connector?: string; - database?: string; - databaseSchema?: string; - /** - * Required - */ - columnName?: string; - priority?: number; -}; - -export type QueryServiceTableColumnsParams = { - connector?: string; - database?: string; - databaseSchema?: string; - priority?: number; -}; - -export type QueryServiceResolveComponentBodyArgs = { [key: string]: unknown }; - -export type QueryServiceResolveComponentBody = { - args?: QueryServiceResolveComponentBodyArgs; -}; -export type QueryServiceColumnDescriptiveStatisticsParams = { - connector?: string; - database?: string; - databaseSchema?: string; - /** - * Required - */ - columnName?: string; - priority?: number; -}; - -export type QueryServiceExportBody = { - /** Optional limit on the number of rows to export. It is applied in addition to any limit specified in the query. */ - limit?: string; - format?: V1ExportFormat; - query?: V1Query; - /** Deprecated. Use query instead. */ - bakedQuery?: string; - /** If true, the export will include header comments with metadata about the export. */ - includeHeader?: boolean; - originDashboard?: V1ResourceName; - /** Optional UI URL that the export originates from. -Only used if include_header is true. */ - originUrl?: string; - /** Optional Execution to attach to the underlying query. Used to resolve rill-time expressions. */ - executionTime?: string; -}; - -export type QueryServiceConvertExpressionToMetricsSQLBody = { - expression?: V1Expression; -}; export type QueryServiceMetricsViewAggregationBody = { dimensions?: V1MetricsViewAggregationDimension[]; @@ -3126,169 +2520,6 @@ export type QueryServiceMetricsViewAggregationBody = { trace?: boolean; }; -export type QueryServiceMetricsViewAnnotationsBody = { - measures?: string[]; - priority?: number; - timeRange?: V1TimeRange; - timeGrain?: V1TimeGrain; - timeZone?: string; - limit?: string; - offset?: string; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewComparisonBody = { - dimension?: V1MetricsViewAggregationDimension; - measures?: V1MetricsViewAggregationMeasure[]; - comparisonMeasures?: string[]; - sort?: V1MetricsViewComparisonSort[]; - timeRange?: V1TimeRange; - comparisonTimeRange?: V1TimeRange; - where?: V1Expression; - /** Optional. If both where and where_sql are set, both will be applied with an AND between them. */ - whereSql?: string; - having?: V1Expression; - /** Optional. If both having and having_sql are set, both will be applied with an AND between them. */ - havingSql?: string; - aliases?: V1MetricsViewComparisonMeasureAlias[]; - limit?: string; - offset?: string; - priority?: number; - exact?: boolean; - filter?: V1MetricsViewFilter; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewRowsBody = { - timeStart?: string; - timeEnd?: string; - timeGranularity?: V1TimeGrain; - where?: V1Expression; - sort?: V1MetricsViewSort[]; - limit?: number; - offset?: string; - priority?: number; - timeZone?: string; - filter?: V1MetricsViewFilter; - timeDimension?: string; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewSchemaParams = { - priority?: number; - /** - * Optional. If true, the response will include traces of spans captured during execution. - */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewSearchBody = { - dimensions?: string[]; - search?: string; - timeRange?: V1TimeRange; - where?: V1Expression; - having?: V1Expression; - limit?: number; - priority?: number; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewTimeRangeBody = { - priority?: number; - timeDimension?: string; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewTimeRangesBody = { - /** Optional time range expressions to resolve (uses the rilltime expression syntax). */ - expressions?: string[]; - /** Optional query priority. */ - priority?: number; - /** Optional time zone that overrides the time zones used when resolving the time range expressions. */ - timeZone?: string; - /** Optional time dimension to return time ranges for. If not specified, it uses the metrics view's default time dimension. */ - timeDimension?: string; - /** Optional execution time against which the time ranges needs to be resolved. Watermark, latest and now are all replaced with this if provided. */ - executionTime?: string; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewTimeSeriesBody = { - measureNames?: string[]; - timeStart?: string; - timeEnd?: string; - timeGranularity?: V1TimeGrain; - where?: V1Expression; - /** Optional. If both where and where_sql are set, both will be applied with an AND between them. */ - whereSql?: string; - having?: V1Expression; - /** Optional. If both having and having_sql are set, both will be applied with an AND between them. */ - havingSql?: string; - timeZone?: string; - priority?: number; - filter?: V1MetricsViewFilter; - timeDimension?: string; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewToplistBody = { - dimensionName?: string; - measureNames?: string[]; - timeStart?: string; - timeEnd?: string; - limit?: string; - offset?: string; - sort?: V1MetricsViewSort[]; - where?: V1Expression; - whereSql?: string; - having?: V1Expression; - havingSql?: string; - priority?: number; - filter?: V1MetricsViewFilter; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceMetricsViewTotalsBody = { - measureNames?: string[]; - timeStart?: string; - timeEnd?: string; - where?: V1Expression; - /** Optional. If both where and where_sql are set, both will be applied with an AND between them. */ - whereSql?: string; - priority?: number; - filter?: V1MetricsViewFilter; - timeDimension?: string; - /** Optional. If true, the response will include traces of spans captured during execution. */ - trace?: boolean; -}; - -export type QueryServiceColumnNullCountParams = { - connector?: string; - database?: string; - databaseSchema?: string; - /** - * Required - */ - columnName?: string; - priority?: number; -}; - -export type QueryServiceColumnNumericHistogramParams = { - connector?: string; - database?: string; - databaseSchema?: string; - columnName?: string; - histogramMethod?: QueryServiceColumnNumericHistogramHistogramMethod; - priority?: number; -}; export type QueryServiceColumnNumericHistogramHistogramMethod = (typeof QueryServiceColumnNumericHistogramHistogramMethod)[keyof typeof QueryServiceColumnNumericHistogramHistogramMethod]; @@ -3310,188 +2541,3 @@ export type QueryServiceResolveTemplatedStringBody = { additionalWhereByMetricsView?: QueryServiceResolveTemplatedStringBodyAdditionalWhereByMetricsView; additionalTimeRange?: V1TimeRange; }; - -export type QueryServiceColumnRollupIntervalBody = { - connector?: string; - database?: string; - databaseSchema?: string; - columnName?: string; - priority?: number; -}; - -export type QueryServiceTableRowsParams = { - connector?: string; - database?: string; - databaseSchema?: string; - limit?: number; - priority?: number; -}; - -export type QueryServiceColumnRugHistogramParams = { - connector?: string; - database?: string; - databaseSchema?: string; - columnName?: string; - priority?: number; -}; - -export type QueryServiceColumnTimeGrainParams = { - connector?: string; - database?: string; - databaseSchema?: string; - /** - * Required - */ - columnName?: string; - priority?: number; -}; - -export type QueryServiceTableCardinalityParams = { - connector?: string; - database?: string; - databaseSchema?: string; - priority?: number; -}; - -export type QueryServiceColumnTimeRangeParams = { - connector?: string; - database?: string; - databaseSchema?: string; - columnName?: string; - priority?: number; -}; - -export type QueryServiceColumnTimeSeriesBody = { - connector?: string; - database?: string; - databaseSchema?: string; - measures?: ColumnTimeSeriesRequestBasicMeasure[]; - timestampColumnName?: string; - timeRange?: V1TimeSeriesTimeRange; - pixels?: number; - sampleSize?: number; - priority?: number; - timeZone?: string; -}; - -export type QueryServiceColumnTopKBody = { - connector?: string; - database?: string; - databaseSchema?: string; - columnName?: string; - agg?: string; - k?: number; - priority?: number; -}; - -export type QueryServiceQueryBody = { - connector?: string; - sql?: string; - args?: unknown[]; - priority?: number; - dryRun?: boolean; - limit?: number; -}; - -export type QueryServiceQueryBatchBody = { - queries?: V1Query[]; -}; - -export type QueryServiceQueryBatch200 = { - result?: V1QueryBatchResponse; - error?: RpcStatus; -}; - -export type RuntimeServiceQueryResolverBodyResolverProperties = { - [key: string]: unknown; -}; - -export type RuntimeServiceQueryResolverBodyResolverArgs = { - [key: string]: unknown; -}; - -export type RuntimeServiceQueryResolverBody = { - resolver?: string; - resolverProperties?: RuntimeServiceQueryResolverBodyResolverProperties; - resolverArgs?: RuntimeServiceQueryResolverBodyResolverArgs; - limit?: number; -}; - -export type RuntimeServiceReloadConfigBody = { [key: string]: unknown }; - -export type QueryServiceExportReportBody = { - /** The execution time to evaluate the report relative to. -This is provided by the report implementation when sending a report. */ - executionTime?: string; - /** Contextual information about the base URL of the UI that initiated the export. -This is used to generate header comments in the exported file when include_header is true in the report spec. */ - originBaseUrl?: string; -}; - -export type RuntimeServiceGetResourceParams = { - "name.kind"?: string; - "name.name"?: string; - skipSecurityChecks?: boolean; -}; - -export type RuntimeServiceListResourcesParams = { - /** - * Filter by resource kind (optional). - */ - kind?: string; - /** - * Filter by resource path (optional). - */ - path?: string; - /** - * Skip security checks - */ - skipSecurityChecks?: boolean; -}; - -export type RuntimeServiceWatchResourcesParams = { - kind?: string; - replay?: boolean; -}; - -export type RuntimeServiceWatchResources200 = { - result?: V1WatchResourcesResponse; - error?: RpcStatus; -}; - -export type RuntimeServiceGetExploreParams = { - name?: string; -}; - -export type RuntimeServiceCreateTriggerBody = { - /** Resources to trigger. See RefreshTriggerSpec for details. */ - resources?: V1ResourceName[]; - /** Models to trigger. Unlike resources, this supports advanced configuration of the refresh trigger. */ - models?: V1RefreshModelTrigger[]; - /** Parser is a convenience flag to trigger the global project parser. -Triggering the project parser ensures a pull of the repository and a full parse of all files. */ - parser?: boolean; - /** Convenience flag to trigger all resources. -Note: Despite the name, it does not currently trigger alerts and reports. */ - all?: boolean; - /** Convenience flag to trigger all resources with full refreshes for resources that support it. -Currently, only models support full refreshes. It's equivalent to passing RefreshModelTrigger.full for those models. -Note: Despite the name, it does not currently trigger alerts and reports. */ - allFull?: boolean; -}; - -export type ConnectorServiceOLAPListTablesParams = { - instanceId?: string; - /** - * Connector to list tables from. - */ - connector?: string; - /** - * Optional search pattern to filter tables by. -Has the same syntax and behavior as ILIKE in SQL. -If the connector supports schema/database names, it searches against both the plain table name and the fully qualified table name. - */ - searchPattern?: string; - pageSize?: number; - pageToken?: string; -}; diff --git a/web-common/src/runtime-client/v2/codegen/generator.spec.ts b/web-common/src/runtime-client/v2/codegen/generator.spec.ts index 3446d90686e6..bad35236103f 100644 --- a/web-common/src/runtime-client/v2/codegen/generator.spec.ts +++ b/web-common/src/runtime-client/v2/codegen/generator.spec.ts @@ -186,9 +186,14 @@ describe("requestTypes", () => { expect(responseType).toBe("V1FakeResponse"); }); - it("falls back to PartialMessage when no Orval type", () => { + it("uses the bare proto Message type for responses when no Orval type", () => { const { responseType } = requestTypes(makeCtx()); - expect(responseType).toContain("PartialMessage"); + expect(responseType).toBe("FakeResponse"); + }); + + it("falls back to PartialMessage for requests when no Orval type", () => { + const { requestType } = requestTypes(makeCtx()); + expect(requestType).toContain("PartialMessage"); }); }); @@ -198,6 +203,25 @@ describe("generateRawFunction", () => { const code = lines.join("\n"); expect(code).toContain("export async function runtimeServiceGetFoo("); expect(code).toContain("signal?: AbortSignal"); + }); + + it("passes proto requests directly and returns the message instance", () => { + // No Orval types: skip the JSON bridge entirely. + const code = generateRawFunction(makeCtx()).join("\n"); + expect(code).not.toContain("fromJson"); + expect(code).not.toContain("toJson"); + expect(code).toContain("{ instanceId: client.instanceId, ...request }"); + expect(code).toContain("return r;"); + }); + + it("bridges to and from JSON for Orval-typed methods", () => { + const ctx = makeCtx({ + orvalTypes: new Set([ + "V1FakeRequestWithInstanceId", + "V1FakeResponse", + ]), + }); + const code = generateRawFunction(ctx).join("\n"); expect(code).toContain("fromJson(stripUndefined("); expect(code).toContain("toJson({ emitDefaultValues: true })"); }); @@ -308,8 +332,17 @@ describe("generateServiceFile", () => { expect(output).toMatch(/^\/\/ Generated by codegen\/run\.ts/); }); - it("imports stripUndefined", () => { - expect(output).toContain( + it("imports stripUndefined only for Orval-typed requests", () => { + // mockService has no Orval types, so the JSON bridge is not needed. + expect(output).not.toContain( + 'import { stripUndefined } from "../strip-undefined"', + ); + + const { code } = generateServiceFile( + mockService, + new Set(["V1FakeRequestWithInstanceId"]), + ); + expect(code).toContain( 'import { stripUndefined } from "../strip-undefined"', ); }); @@ -400,8 +433,8 @@ describe("generateServiceFile", () => { }); it("imports proto response types when no Orval counterpart exists", () => { - // With no Orval types, response types must be imported from _pb.ts - // so PartialMessage resolves in TypeScript + // With no Orval types, response types are the proto Message types and + // must be imported from _pb.ts; requests use PartialMessage. expect(output).toContain("FakeResponse,"); expect(output).toContain("FakePaginatedResponse,"); expect(output).toContain("PartialMessage"); diff --git a/web-common/src/runtime-client/v2/codegen/generator.ts b/web-common/src/runtime-client/v2/codegen/generator.ts index d702d9aa65c5..9db6368072a2 100644 --- a/web-common/src/runtime-client/v2/codegen/generator.ts +++ b/web-common/src/runtime-client/v2/codegen/generator.ts @@ -109,7 +109,10 @@ function hasOrvalType( return availableOrvalTypes.has(orvalTypeName(protoTypeName)); } -/** Get the public-facing type for a request or response */ +/** + * Get the public-facing type for a request. Falls back to `PartialMessage` for + * proto types so callers can pass plain partial objects. + */ function publicType( availableOrvalTypes: Set, protoTypeName: string, @@ -119,6 +122,20 @@ function publicType( : `PartialMessage<${protoTypeName}>`; } +/** + * Get the public-facing type for a response. Falls back to the proto Message + * type (not `PartialMessage`) so callers receive a fully-typed message instance + * with its runtime helpers (e.g. `Timestamp.toDate()`, oneof selectors). + */ +function publicResponseType( + availableOrvalTypes: Set, + protoTypeName: string, +): string { + return hasOrvalType(availableOrvalTypes, protoTypeName) + ? orvalTypeName(protoTypeName) + : protoTypeName; +} + // --- Method extraction --- function extractMethods(service: ServiceDef): MethodInfo[] { @@ -195,15 +212,28 @@ function requestTypes(ctx: MethodContext) { const requestSpread = m.hasInstanceId ? `{ instanceId: client.instanceId, ...request }` : `request`; - const responseType = publicType(orvalTypes, m.outputType); + const responseType = publicResponseType(orvalTypes, m.outputType); return { requestType, requestSpread, responseType }; } function generateRawFunction(ctx: MethodContext): string[] { - const { serviceName, serviceClientProp, m } = ctx; + const { serviceName, serviceClientProp, m, orvalTypes } = ctx; const { rawFn } = methodNames(ctx); const { requestType, requestSpread, responseType } = requestTypes(ctx); + // Orval request types are JSON, so they must be parsed via fromJson (with + // undefined stripped, which fromJson rejects). Proto request types are + // PartialMessage and can be passed to the ConnectRPC client directly. + const requestArg = hasOrvalType(orvalTypes, m.inputType) + ? `${m.inputType}.fromJson(stripUndefined(${requestSpread}) as unknown as JsonValue)` + : requestSpread; + + // Orval callers expect the JSON representation; proto callers get the message + // instance directly (retaining its runtime helpers). + const returnStmt = hasOrvalType(orvalTypes, m.outputType) + ? ` return r.toJson({ emitDefaultValues: true }) as unknown as ${responseType};` + : ` return r;`; + return [ `/**`, ` * Raw RPC call: ${serviceName}.${m.methodName}`, @@ -214,10 +244,10 @@ function generateRawFunction(ctx: MethodContext): string[] { ` options?: { signal?: AbortSignal },`, `): Promise<${responseType}> {`, ` const r = await client.${serviceClientProp}.${m.methodKey}(`, - ` ${m.inputType}.fromJson(stripUndefined(${requestSpread}) as unknown as JsonValue),`, + ` ${requestArg},`, ` { signal: options?.signal },`, ` );`, - ` return r.toJson({ emitDefaultValues: true }) as unknown as ${responseType};`, + returnStmt, `}`, ``, ]; @@ -385,17 +415,23 @@ function generateServiceFile( // --- Package imports --- // @bufbuild/protobuf + // PartialMessage is used for proto request types; JsonValue is only needed + // for the fromJson bridge on Orval-typed requests. const needsPartialMessage = methods.some( - (m) => - !hasOrvalType(availableOrvalTypes, m.inputType) || - !hasOrvalType(availableOrvalTypes, m.outputType), + (m) => !hasOrvalType(availableOrvalTypes, m.inputType), ); - const bufSpecs: string[] = ["JsonValue"]; + const needsJsonBridge = methods.some((m) => + hasOrvalType(availableOrvalTypes, m.inputType), + ); + const bufSpecs: string[] = []; + if (needsJsonBridge) bufSpecs.push("JsonValue"); if (needsPartialMessage) bufSpecs.push("PartialMessage"); bufSpecs.sort(); - lines.push( - `import type { ${bufSpecs.join(", ")} } from "@bufbuild/protobuf";`, - ); + if (bufSpecs.length > 0) { + lines.push( + `import type { ${bufSpecs.join(", ")} } from "@bufbuild/protobuf";`, + ); + } // @connectrpc/connect lines.push(`import type { ConnectError } from "@connectrpc/connect";`); @@ -480,8 +516,11 @@ function generateServiceFile( lines.push(`import type { RuntimeClient } from "../runtime-client";`); // stripUndefined (proto fromJson rejects undefined values; - // Orval's HTTP client silently omitted them) - lines.push(`import { stripUndefined } from "../strip-undefined";`); + // Orval's HTTP client silently omitted them). Only needed for the fromJson + // bridge on Orval-typed requests. + if (needsJsonBridge) { + lines.push(`import { stripUndefined } from "../strip-undefined";`); + } lines.push(``); diff --git a/web-common/src/runtime-client/v2/gen/connector-service.ts b/web-common/src/runtime-client/v2/gen/connector-service.ts index 9ca2741b96e8..28bb9cf8542e 100644 --- a/web-common/src/runtime-client/v2/gen/connector-service.ts +++ b/web-common/src/runtime-client/v2/gen/connector-service.ts @@ -1,6 +1,6 @@ // Generated by codegen/run.ts — DO NOT EDIT -import type { JsonValue, PartialMessage } from "@bufbuild/protobuf"; +import type { PartialMessage } from "@bufbuild/protobuf"; import type { ConnectError } from "@connectrpc/connect"; import { createInfiniteQuery, @@ -33,7 +33,6 @@ import type { V1OLAPListTablesResponse, } from "../../gen/index.schemas"; import type { RuntimeClient } from "../runtime-client"; -import { stripUndefined } from "../strip-undefined"; /** * Raw RPC call: ConnectorService.ListBuckets @@ -44,12 +43,7 @@ export async function connectorServiceListBuckets( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listBuckets( - ListBucketsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -127,12 +121,7 @@ export async function connectorServiceListObjects( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listObjects( - ListObjectsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -210,12 +199,7 @@ export async function connectorServiceOLAPListTables( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.oLAPListTables( - OLAPListTablesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -293,12 +277,7 @@ export async function connectorServiceOLAPGetTable( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.oLAPGetTable( - OLAPGetTableRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -376,12 +355,7 @@ export async function connectorServiceListDatabaseSchemas( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listDatabaseSchemas( - ListDatabaseSchemasRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -461,12 +435,7 @@ export async function connectorServiceListTables( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listTables( - ListTablesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -537,12 +506,7 @@ export async function connectorServiceGetTable( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.getTable( - GetTableRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GetTableResponse; diff --git a/web-common/src/runtime-client/v2/gen/query-service.ts b/web-common/src/runtime-client/v2/gen/query-service.ts index f5da8d9108f3..304365f4af24 100644 --- a/web-common/src/runtime-client/v2/gen/query-service.ts +++ b/web-common/src/runtime-client/v2/gen/query-service.ts @@ -15,15 +15,25 @@ import { } from "@tanstack/svelte-query"; import { ColumnCardinalityRequest, + ColumnCardinalityResponse, ColumnDescriptiveStatisticsRequest, + ColumnDescriptiveStatisticsResponse, ColumnNullCountRequest, + ColumnNullCountResponse, ColumnNumericHistogramRequest, + ColumnNumericHistogramResponse, ColumnRollupIntervalRequest, + ColumnRollupIntervalResponse, ColumnRugHistogramRequest, + ColumnRugHistogramResponse, ColumnTimeGrainRequest, + ColumnTimeGrainResponse, ColumnTimeRangeRequest, + ColumnTimeRangeResponse, ColumnTimeSeriesRequest, + ColumnTimeSeriesResponse, ColumnTopKRequest, + ColumnTopKResponse, ConvertExpressionToMetricsSQLRequest, ExportReportRequest, ExportRequest, @@ -49,26 +59,6 @@ import { TableRowsRequest, } from "../../../proto/gen/rill/runtime/v1/queries_pb"; import type { - V1ColumnCardinalityRequest, - V1ColumnCardinalityResponse, - V1ColumnDescriptiveStatisticsRequest, - V1ColumnDescriptiveStatisticsResponse, - V1ColumnNullCountRequest, - V1ColumnNullCountResponse, - V1ColumnNumericHistogramRequest, - V1ColumnNumericHistogramResponse, - V1ColumnRollupIntervalRequest, - V1ColumnRollupIntervalResponse, - V1ColumnRugHistogramRequest, - V1ColumnRugHistogramResponse, - V1ColumnTimeGrainRequest, - V1ColumnTimeGrainResponse, - V1ColumnTimeRangeRequest, - V1ColumnTimeRangeResponse, - V1ColumnTimeSeriesRequest, - V1ColumnTimeSeriesResponse, - V1ColumnTopKRequest, - V1ColumnTopKResponse, V1ConvertExpressionToMetricsSQLResponse, V1ExportReportResponse, V1ExportResponse, @@ -110,19 +100,12 @@ export async function queryServiceProjectStorage( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise> { +): Promise { const r = await client.queryService.projectStorage( - ProjectStorageRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as PartialMessage; + return r; } export function getQueryServiceProjectStorageQueryKey( @@ -133,55 +116,42 @@ export function getQueryServiceProjectStorageQueryKey( } export function getQueryServiceProjectStorageQueryOptions< - TData = PartialMessage, + TData = ProjectStorageResponse, >( client: RuntimeClient, request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions< - PartialMessage, - ConnectError, - TData - > + CreateQueryOptions >; }, -): CreateQueryOptions< - PartialMessage, - ConnectError, - TData -> & { queryKey: QueryKey } { +): CreateQueryOptions & { + queryKey: QueryKey; +} { const queryKey = getQueryServiceProjectStorageQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction> = ({ - signal, - }) => queryServiceProjectStorage(client, request, { signal }); + const queryFn: QueryFunction = ({ signal }) => + queryServiceProjectStorage(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions< - PartialMessage, - ConnectError, - TData - > & { queryKey: QueryKey }; + } as CreateQueryOptions & { + queryKey: QueryKey; + }; } export function createQueryServiceProjectStorage< - TData = PartialMessage, + TData = ProjectStorageResponse, >( client: RuntimeClient, request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions< - PartialMessage, - ConnectError, - TData - > + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -710,12 +680,7 @@ export async function queryServiceMetricsViewTimeRange( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewTimeRange( - MetricsViewTimeRangeRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -795,12 +760,7 @@ export async function queryServiceMetricsViewSchema( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewSchema( - MetricsViewSchemaRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -878,12 +838,7 @@ export async function queryServiceMetricsViewSearch( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewSearch( - MetricsViewSearchRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -961,12 +916,7 @@ export async function queryServiceMetricsViewTimeRanges( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewTimeRanges( - MetricsViewTimeRangesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1047,12 +997,7 @@ export async function queryServiceMetricsViewAnnotations( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewAnnotations( - MetricsViewAnnotationsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1136,12 +1081,7 @@ export async function queryServiceConvertExpressionToMetricsSQL( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.convertExpressionToMetricsSQL( - ConvertExpressionToMetricsSQLRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1241,12 +1181,7 @@ export async function queryServiceResolveCanvas( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.resolveCanvas( - ResolveCanvasRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1319,12 +1254,7 @@ export async function queryServiceResolveComponent( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.resolveComponent( - ResolveComponentRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1402,12 +1332,7 @@ export async function queryServiceResolveTemplatedString( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.resolveTemplatedString( - ResolveTemplatedStringRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1484,26 +1409,19 @@ export function createQueryServiceResolveTemplatedString< */ export async function queryServiceColumnRollupInterval( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnRollupInterval( - ColumnRollupIntervalRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnRollupIntervalResponse; + return r; } export function getQueryServiceColumnRollupIntervalQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -1514,44 +1432,42 @@ export function getQueryServiceColumnRollupIntervalQueryKey( } export function getQueryServiceColumnRollupIntervalQueryOptions< - TData = V1ColumnRollupIntervalResponse, + TData = ColumnRollupIntervalResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnRollupIntervalQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnRollupInterval(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions< - V1ColumnRollupIntervalResponse, - ConnectError, - TData - > & { queryKey: QueryKey }; + } as CreateQueryOptions & { + queryKey: QueryKey; + }; } export function createQueryServiceColumnRollupInterval< - TData = V1ColumnRollupIntervalResponse, + TData = ColumnRollupIntervalResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -1569,65 +1485,58 @@ export function createQueryServiceColumnRollupInterval< */ export async function queryServiceColumnTopK( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnTopK( - ColumnTopKRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnTopKResponse; + return r; } export function getQueryServiceColumnTopKQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return ["QueryService", "columnTopK", instanceId, request ?? {}] as const; } export function getQueryServiceColumnTopKQueryOptions< - TData = V1ColumnTopKResponse, + TData = ColumnTopKResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnTopKQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnTopK(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } -export function createQueryServiceColumnTopK( +export function createQueryServiceColumnTopK( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -1645,26 +1554,19 @@ export function createQueryServiceColumnTopK( */ export async function queryServiceColumnNullCount( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnNullCount( - ColumnNullCountRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnNullCountResponse; + return r; } export function getQueryServiceColumnNullCountQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -1675,42 +1577,42 @@ export function getQueryServiceColumnNullCountQueryKey( } export function getQueryServiceColumnNullCountQueryOptions< - TData = V1ColumnNullCountResponse, + TData = ColumnNullCountResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnNullCountQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnNullCount(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } export function createQueryServiceColumnNullCount< - TData = V1ColumnNullCountResponse, + TData = ColumnNullCountResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -1728,26 +1630,25 @@ export function createQueryServiceColumnNullCount< */ export async function queryServiceColumnDescriptiveStatistics( client: RuntimeClient, - request: Omit, + request: Omit< + PartialMessage, + "instanceId" + >, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnDescriptiveStatistics( - ColumnDescriptiveStatisticsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnDescriptiveStatisticsResponse; + return r; } export function getQueryServiceColumnDescriptiveStatisticsQueryKey( instanceId: string, - request?: Omit, + request?: Omit< + PartialMessage, + "instanceId" + >, ): QueryKey { return [ "QueryService", @@ -1758,21 +1659,24 @@ export function getQueryServiceColumnDescriptiveStatisticsQueryKey( } export function getQueryServiceColumnDescriptiveStatisticsQueryOptions< - TData = V1ColumnDescriptiveStatisticsResponse, + TData = ColumnDescriptiveStatisticsResponse, >( client: RuntimeClient, - request: Omit, + request: Omit< + PartialMessage, + "instanceId" + >, options?: { query?: Partial< CreateQueryOptions< - V1ColumnDescriptiveStatisticsResponse, + ColumnDescriptiveStatisticsResponse, ConnectError, TData > >; }, ): CreateQueryOptions< - V1ColumnDescriptiveStatisticsResponse, + ColumnDescriptiveStatisticsResponse, ConnectError, TData > & { queryKey: QueryKey } { @@ -1780,7 +1684,7 @@ export function getQueryServiceColumnDescriptiveStatisticsQueryOptions< client.instanceId, request, ); - const queryFn: QueryFunction = ({ + const queryFn: QueryFunction = ({ signal, }) => queryServiceColumnDescriptiveStatistics(client, request, { signal }); return { @@ -1789,21 +1693,24 @@ export function getQueryServiceColumnDescriptiveStatisticsQueryOptions< enabled: !!client.instanceId, ...options?.query, } as CreateQueryOptions< - V1ColumnDescriptiveStatisticsResponse, + ColumnDescriptiveStatisticsResponse, ConnectError, TData > & { queryKey: QueryKey }; } export function createQueryServiceColumnDescriptiveStatistics< - TData = V1ColumnDescriptiveStatisticsResponse, + TData = ColumnDescriptiveStatisticsResponse, >( client: RuntimeClient, - request: Omit, + request: Omit< + PartialMessage, + "instanceId" + >, options?: { query?: Partial< CreateQueryOptions< - V1ColumnDescriptiveStatisticsResponse, + ColumnDescriptiveStatisticsResponse, ConnectError, TData > @@ -1824,26 +1731,19 @@ export function createQueryServiceColumnDescriptiveStatistics< */ export async function queryServiceColumnTimeGrain( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnTimeGrain( - ColumnTimeGrainRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnTimeGrainResponse; + return r; } export function getQueryServiceColumnTimeGrainQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -1854,42 +1754,42 @@ export function getQueryServiceColumnTimeGrainQueryKey( } export function getQueryServiceColumnTimeGrainQueryOptions< - TData = V1ColumnTimeGrainResponse, + TData = ColumnTimeGrainResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnTimeGrainQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnTimeGrain(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } export function createQueryServiceColumnTimeGrain< - TData = V1ColumnTimeGrainResponse, + TData = ColumnTimeGrainResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -1907,26 +1807,19 @@ export function createQueryServiceColumnTimeGrain< */ export async function queryServiceColumnNumericHistogram( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnNumericHistogram( - ColumnNumericHistogramRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnNumericHistogramResponse; + return r; } export function getQueryServiceColumnNumericHistogramQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -1937,45 +1830,44 @@ export function getQueryServiceColumnNumericHistogramQueryKey( } export function getQueryServiceColumnNumericHistogramQueryOptions< - TData = V1ColumnNumericHistogramResponse, + TData = ColumnNumericHistogramResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnNumericHistogramQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ - signal, - }) => queryServiceColumnNumericHistogram(client, request, { signal }); + const queryFn: QueryFunction = ({ signal }) => + queryServiceColumnNumericHistogram(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, } as CreateQueryOptions< - V1ColumnNumericHistogramResponse, + ColumnNumericHistogramResponse, ConnectError, TData > & { queryKey: QueryKey }; } export function createQueryServiceColumnNumericHistogram< - TData = V1ColumnNumericHistogramResponse, + TData = ColumnNumericHistogramResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -1993,26 +1885,19 @@ export function createQueryServiceColumnNumericHistogram< */ export async function queryServiceColumnRugHistogram( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnRugHistogram( - ColumnRugHistogramRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnRugHistogramResponse; + return r; } export function getQueryServiceColumnRugHistogramQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -2023,42 +1908,42 @@ export function getQueryServiceColumnRugHistogramQueryKey( } export function getQueryServiceColumnRugHistogramQueryOptions< - TData = V1ColumnRugHistogramResponse, + TData = ColumnRugHistogramResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnRugHistogramQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnRugHistogram(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } export function createQueryServiceColumnRugHistogram< - TData = V1ColumnRugHistogramResponse, + TData = ColumnRugHistogramResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -2076,26 +1961,19 @@ export function createQueryServiceColumnRugHistogram< */ export async function queryServiceColumnTimeRange( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnTimeRange( - ColumnTimeRangeRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnTimeRangeResponse; + return r; } export function getQueryServiceColumnTimeRangeQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -2106,42 +1984,42 @@ export function getQueryServiceColumnTimeRangeQueryKey( } export function getQueryServiceColumnTimeRangeQueryOptions< - TData = V1ColumnTimeRangeResponse, + TData = ColumnTimeRangeResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnTimeRangeQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnTimeRange(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } export function createQueryServiceColumnTimeRange< - TData = V1ColumnTimeRangeResponse, + TData = ColumnTimeRangeResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -2159,26 +2037,19 @@ export function createQueryServiceColumnTimeRange< */ export async function queryServiceColumnCardinality( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnCardinality( - ColumnCardinalityRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnCardinalityResponse; + return r; } export function getQueryServiceColumnCardinalityQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -2189,42 +2060,42 @@ export function getQueryServiceColumnCardinalityQueryKey( } export function getQueryServiceColumnCardinalityQueryOptions< - TData = V1ColumnCardinalityResponse, + TData = ColumnCardinalityResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnCardinalityQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnCardinality(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } export function createQueryServiceColumnCardinality< - TData = V1ColumnCardinalityResponse, + TData = ColumnCardinalityResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -2242,26 +2113,19 @@ export function createQueryServiceColumnCardinality< */ export async function queryServiceColumnTimeSeries( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise { const r = await client.queryService.columnTimeSeries( - ColumnTimeSeriesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as V1ColumnTimeSeriesResponse; + return r; } export function getQueryServiceColumnTimeSeriesQueryKey( instanceId: string, - request?: Omit, + request?: Omit, "instanceId">, ): QueryKey { return [ "QueryService", @@ -2272,42 +2136,42 @@ export function getQueryServiceColumnTimeSeriesQueryKey( } export function getQueryServiceColumnTimeSeriesQueryOptions< - TData = V1ColumnTimeSeriesResponse, + TData = ColumnTimeSeriesResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, -): CreateQueryOptions & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getQueryServiceColumnTimeSeriesQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => + const queryFn: QueryFunction = ({ signal }) => queryServiceColumnTimeSeries(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { + } as CreateQueryOptions & { queryKey: QueryKey; }; } export function createQueryServiceColumnTimeSeries< - TData = V1ColumnTimeSeriesResponse, + TData = ColumnTimeSeriesResponse, >( client: RuntimeClient, - request: Omit, + request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions >; }, queryClient?: QueryClient, @@ -2561,12 +2425,7 @@ export async function queryServiceQuery( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.query( - QueryRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1QueryResponse; @@ -2620,12 +2479,7 @@ export async function queryServiceExport( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.export( - ExportRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1ExportResponse; @@ -2679,12 +2533,7 @@ export async function queryServiceExportReport( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.exportReport( - ExportReportRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ diff --git a/web-common/src/runtime-client/v2/gen/runtime-service.ts b/web-common/src/runtime-client/v2/gen/runtime-service.ts index e76af338fc69..0101a1a062a0 100644 --- a/web-common/src/runtime-client/v2/gen/runtime-service.ts +++ b/web-common/src/runtime-client/v2/gen/runtime-service.ts @@ -129,10 +129,9 @@ export async function runtimeServicePing( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.ping( - PingRequest.fromJson(stripUndefined(request) as unknown as JsonValue), - { signal: options?.signal }, - ); + const r = await client.runtimeService.ping(request, { + signal: options?.signal, + }); return r.toJson({ emitDefaultValues: true }) as unknown as V1PingResponse; } @@ -189,10 +188,9 @@ export async function runtimeServiceHealth( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.health( - HealthRequest.fromJson(stripUndefined(request) as unknown as JsonValue), - { signal: options?.signal }, - ); + const r = await client.runtimeService.health(request, { + signal: options?.signal, + }); return r.toJson({ emitDefaultValues: true }) as unknown as V1HealthResponse; } @@ -250,12 +248,7 @@ export async function runtimeServiceInstanceHealth( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.instanceHealth( - InstanceHealthRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -332,12 +325,9 @@ export async function runtimeServiceListInstances( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.listInstances( - ListInstancesRequest.fromJson( - stripUndefined(request) as unknown as JsonValue, - ), - { signal: options?.signal }, - ); + const r = await client.runtimeService.listInstances(request, { + signal: options?.signal, + }); return r.toJson({ emitDefaultValues: true, }) as unknown as V1ListInstancesResponse; @@ -413,12 +403,7 @@ export async function runtimeServiceGetInstance( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getInstance( - GetInstanceRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -489,12 +474,7 @@ export async function runtimeServiceListFiles( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listFiles( - ListFilesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -565,12 +545,7 @@ export async function runtimeServiceGetFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getFile( - GetFileRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GetFileResponse; @@ -629,12 +604,9 @@ export async function runtimeServiceListExamples( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.listExamples( - ListExamplesRequest.fromJson( - stripUndefined(request) as unknown as JsonValue, - ), - { signal: options?.signal }, - ); + const r = await client.runtimeService.listExamples(request, { + signal: options?.signal, + }); return r.toJson({ emitDefaultValues: true, }) as unknown as V1ListExamplesResponse; @@ -705,12 +677,7 @@ export async function runtimeServiceQueryResolver( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.queryResolver( - QueryResolverRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -788,12 +755,7 @@ export async function runtimeServiceGetLogs( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getLogs( - GetLogsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GetLogsResponse; @@ -853,12 +815,7 @@ export async function runtimeServiceListResources( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listResources( - ListResourcesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -936,12 +893,7 @@ export async function runtimeServiceGetResource( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getResource( - GetResourceRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1012,12 +964,7 @@ export async function runtimeServiceGetExplore( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getExplore( - GetExploreRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1088,12 +1035,7 @@ export async function runtimeServiceGetModelPartitions( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getModelPartitions( - GetModelPartitionsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1170,12 +1112,9 @@ export async function runtimeServiceListConnectorDrivers( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.listConnectorDrivers( - ListConnectorDriversRequest.fromJson( - stripUndefined(request) as unknown as JsonValue, - ), - { signal: options?.signal }, - ); + const r = await client.runtimeService.listConnectorDrivers(request, { + signal: options?.signal, + }); return r.toJson({ emitDefaultValues: true, }) as unknown as V1ListConnectorDriversResponse; @@ -1253,12 +1192,7 @@ export async function runtimeServiceAnalyzeConnectors( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.analyzeConnectors( - AnalyzeConnectorsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1336,12 +1270,7 @@ export async function runtimeServiceListNotifierConnectors( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listNotifierConnectors( - ListNotifierConnectorsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1422,12 +1351,7 @@ export async function runtimeServiceListConversations( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listConversations( - ListConversationsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1505,12 +1429,7 @@ export async function runtimeServiceGetConversation( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getConversation( - GetConversationRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1588,12 +1507,7 @@ export async function runtimeServiceListTools( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listTools( - ListToolsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1664,12 +1578,7 @@ export async function runtimeServiceGetAIMessage( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getAIMessage( - GetAIMessageRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1815,12 +1724,7 @@ export async function runtimeServiceAnalyzeVariables( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.analyzeVariables( - AnalyzeVariablesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1898,12 +1802,7 @@ export async function runtimeServiceListGitCommits( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listGitCommits( - ListGitCommitsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -1981,12 +1880,7 @@ export async function runtimeServiceGitStatus( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitStatus( - GitStatusRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2055,19 +1949,12 @@ export async function runtimeServiceGitDiff( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise> { +): Promise { const r = await client.runtimeService.gitDiff( - GitDiffRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as PartialMessage; + return r; } export function getRuntimeServiceGitDiffQueryKey( @@ -2077,44 +1964,33 @@ export function getRuntimeServiceGitDiffQueryKey( return ["RuntimeService", "gitDiff", instanceId, request ?? {}] as const; } -export function getRuntimeServiceGitDiffQueryOptions< - TData = PartialMessage, ->( +export function getRuntimeServiceGitDiffQueryOptions( client: RuntimeClient, request: Omit, "instanceId">, options?: { - query?: Partial< - CreateQueryOptions, ConnectError, TData> - >; + query?: Partial>; }, -): CreateQueryOptions, ConnectError, TData> & { +): CreateQueryOptions & { queryKey: QueryKey; } { const queryKey = getRuntimeServiceGitDiffQueryKey(client.instanceId, request); - const queryFn: QueryFunction> = ({ - signal, - }) => runtimeServiceGitDiff(client, request, { signal }); + const queryFn: QueryFunction = ({ signal }) => + runtimeServiceGitDiff(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions< - PartialMessage, - ConnectError, - TData - > & { queryKey: QueryKey }; + } as CreateQueryOptions & { + queryKey: QueryKey; + }; } -export function createRuntimeServiceGitDiff< - TData = PartialMessage, ->( +export function createRuntimeServiceGitDiff( client: RuntimeClient, request: Omit, "instanceId">, options?: { - query?: Partial< - CreateQueryOptions, ConnectError, TData> - >; + query?: Partial>; }, queryClient?: QueryClient, ): CreateQueryResult { @@ -2135,12 +2011,7 @@ export async function runtimeServiceListGitBranches( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listGitBranches( - ListGitBranchesRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2482,12 +2353,7 @@ export async function runtimeServiceReloadConfig( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.reloadConfig( - ReloadConfigRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2546,12 +2412,7 @@ export async function runtimeServicePutFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.putFile( - PutFileRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1PutFileResponse; @@ -2608,12 +2469,7 @@ export async function runtimeServiceCreateDirectory( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.createDirectory( - CreateDirectoryRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2672,12 +2528,7 @@ export async function runtimeServiceDeleteFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.deleteFile( - DeleteFileRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2736,12 +2587,7 @@ export async function runtimeServiceRenameFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.renameFile( - RenameFileRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2800,12 +2646,7 @@ export async function runtimeServiceUnpackExample( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.unpackExample( - UnpackExampleRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2864,12 +2705,7 @@ export async function runtimeServiceUnpackEmpty( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.unpackEmpty( - UnpackEmptyRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2928,12 +2764,7 @@ export async function runtimeServiceGenerateMetricsViewFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.generateMetricsViewFile( - GenerateMetricsViewFileRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -2991,12 +2822,7 @@ export async function runtimeServiceGenerateCanvasFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.generateCanvasFile( - GenerateCanvasFileRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3053,32 +2879,25 @@ export async function runtimeServiceSkipModelPartitions( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise> { +): Promise { const r = await client.runtimeService.skipModelPartitions( - SkipModelPartitionsRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as PartialMessage; + return r; } export function getRuntimeServiceSkipModelPartitionsMutationOptions( client: RuntimeClient, options?: Partial< CreateMutationOptions< - PartialMessage, + SkipModelPartitionsResponse, unknown, Omit, "instanceId"> > >, ): CreateMutationOptions< - PartialMessage, + SkipModelPartitionsResponse, unknown, Omit, "instanceId"> > { @@ -3092,14 +2911,14 @@ export function createRuntimeServiceSkipModelPartitionsMutation( client: RuntimeClient, options?: Partial< CreateMutationOptions< - PartialMessage, + SkipModelPartitionsResponse, unknown, Omit, "instanceId"> > >, queryClient?: QueryClient, ): CreateMutationResult< - PartialMessage, + SkipModelPartitionsResponse, unknown, Omit, "instanceId"> > { @@ -3119,12 +2938,7 @@ export async function runtimeServiceCreateTrigger( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.createTrigger( - CreateTriggerRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3183,12 +2997,7 @@ export async function runtimeServiceShareConversation( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.shareConversation( - ShareConversationRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3247,12 +3056,7 @@ export async function runtimeServiceForkConversation( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.forkConversation( - ForkConversationRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3311,12 +3115,7 @@ export async function runtimeServiceComplete( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.complete( - CompleteRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1CompleteResponse; @@ -3373,12 +3172,7 @@ export async function runtimeServiceGitCommit( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitCommit( - GitCommitRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3437,12 +3231,7 @@ export async function runtimeServiceRestoreGitCommit( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.restoreGitCommit( - RestoreGitCommitRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3501,12 +3290,7 @@ export async function runtimeServiceGitMergeToBranch( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitMergeToBranch( - GitMergeToBranchRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3565,12 +3349,7 @@ export async function runtimeServiceGitSwitchBranch( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitSwitchBranch( - GitSwitchBranchRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ @@ -3629,12 +3408,7 @@ export async function runtimeServiceGitPull( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitPull( - GitPullRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GitPullResponse; @@ -3691,12 +3465,7 @@ export async function runtimeServiceGitPush( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitPush( - GitPushRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GitPushResponse; @@ -3751,32 +3520,25 @@ export async function runtimeServicePushEnv( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise> { +): Promise { const r = await client.runtimeService.pushEnv( - PushEnvRequest.fromJson( - stripUndefined({ - instanceId: client.instanceId, - ...request, - }) as unknown as JsonValue, - ), + { instanceId: client.instanceId, ...request }, { signal: options?.signal }, ); - return r.toJson({ - emitDefaultValues: true, - }) as unknown as PartialMessage; + return r; } export function getRuntimeServicePushEnvMutationOptions( client: RuntimeClient, options?: Partial< CreateMutationOptions< - PartialMessage, + PushEnvResponse, unknown, Omit, "instanceId"> > >, ): CreateMutationOptions< - PartialMessage, + PushEnvResponse, unknown, Omit, "instanceId"> > { @@ -3790,14 +3552,14 @@ export function createRuntimeServicePushEnvMutation( client: RuntimeClient, options?: Partial< CreateMutationOptions< - PartialMessage, + PushEnvResponse, unknown, Omit, "instanceId"> > >, queryClient?: QueryClient, ): CreateMutationResult< - PartialMessage, + PushEnvResponse, unknown, Omit, "instanceId"> > { From 6c55b7c369aef3fe22f67d2f4746aed2992735b3 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 21 Jul 2026 13:59:51 +0530 Subject: [PATCH 2/3] Remove as-any and fix callers --- .../features/canvas/stores/canvas-entity.ts | 9 +++++++- .../useDimensionSearchResults.ts | 5 +++-- .../dashboards/proto-state/enum-maps.ts | 22 ++++++++++++++++++- .../time-controls/rill-time-ranges.ts | 3 ++- .../time-series/annotations-selectors.ts | 10 ++++++--- .../src/features/exports/ExportMenu.svelte | 10 +++++++-- web-common/src/lib/proto-utils.ts | 8 +++++++ 7 files changed, 57 insertions(+), 10 deletions(-) diff --git a/web-common/src/features/canvas/stores/canvas-entity.ts b/web-common/src/features/canvas/stores/canvas-entity.ts index 686517b3f2b8..c7b712c59e5e 100644 --- a/web-common/src/features/canvas/stores/canvas-entity.ts +++ b/web-common/src/features/canvas/stores/canvas-entity.ts @@ -50,6 +50,9 @@ import { DEFAULT_DASHBOARD_WIDTH, namePrefixFromPath } from "../layout-util"; import { createCustomMapStore } from "@rilldata/web-common/lib/custom-map-store"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { queryServiceConvertExpressionToMetricsSQL } from "@rilldata/web-common/runtime-client"; +import { Expression } from "@rilldata/web-common/proto/gen/rill/runtime/v1/expression_pb"; +import type { JsonValue } from "@bufbuild/protobuf"; +import { stripUndefined } from "@rilldata/web-common/runtime-client/v2/strip-undefined.ts"; export const lastVisitedState = new Map(); @@ -411,7 +414,11 @@ export class CanvasEntity { ], queryFn: () => queryServiceConvertExpressionToMetricsSQL(this.client, { - expression: parsed.where as any, + expression: parsed.where + ? Expression.fromJson( + stripUndefined(parsed.where) as unknown as JsonValue, + ) + : undefined, }), }); }); diff --git a/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts b/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts index 79100ea785a0..3a7222d54ecf 100644 --- a/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts +++ b/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts @@ -6,6 +6,7 @@ import { } from "@rilldata/web-common/runtime-client"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { derived } from "svelte/store"; +import { timeStringToTimestamp } from "@rilldata/web-common/lib/proto-utils.ts"; export type DimensionSearchResult = { dimension: string; @@ -37,8 +38,8 @@ export function useDimensionSearchResults( search: searchText, limit: 100, timeRange: { - start: timeRangeSummary.min as any, - end: timeRangeSummary.max as any, + start: timeStringToTimestamp(timeRangeSummary.min), + end: timeStringToTimestamp(timeRangeSummary.max), }, }), ), diff --git a/web-common/src/features/dashboards/proto-state/enum-maps.ts b/web-common/src/features/dashboards/proto-state/enum-maps.ts index da248f1929f8..44288946df24 100644 --- a/web-common/src/features/dashboards/proto-state/enum-maps.ts +++ b/web-common/src/features/dashboards/proto-state/enum-maps.ts @@ -1,8 +1,13 @@ import type { PivotTableMode } from "@rilldata/web-common/features/dashboards/pivot/types"; import { Operation } from "@rilldata/web-common/proto/gen/rill/runtime/v1/expression_pb"; +import { ExportFormat } from "@rilldata/web-common/proto/gen/rill/runtime/v1/export_format_pb"; import { TimeGrain } from "@rilldata/web-common/proto/gen/rill/runtime/v1/time_grain_pb"; import { DashboardState_PivotTableMode } from "@rilldata/web-common/proto/gen/rill/ui/v1/dashboard_pb"; -import { V1Operation, V1TimeGrain } from "@rilldata/web-common/runtime-client"; +import { + V1ExportFormat, + V1Operation, + V1TimeGrain, +} from "@rilldata/web-common/runtime-client"; // This file should contain all the map from proto and API values. // TODO: we should try and find a way to merge these enums @@ -62,3 +67,18 @@ export const FromProtoPivotTableModeMap = {} as Record< for (const op in ToProtoPivotTableModeMap) { FromProtoPivotTableModeMap[ToProtoPivotTableModeMap[op]] = op; } + +export const ToProtoExportFormatMap: Record = { + [V1ExportFormat.EXPORT_FORMAT_UNSPECIFIED]: ExportFormat.UNSPECIFIED, + [V1ExportFormat.EXPORT_FORMAT_CSV]: ExportFormat.CSV, + [V1ExportFormat.EXPORT_FORMAT_XLSX]: ExportFormat.XLSX, + [V1ExportFormat.EXPORT_FORMAT_PARQUET]: ExportFormat.PARQUET, +}; + +export const FromProtoExportFormatMap = {} as Record< + ExportFormat, + V1ExportFormat +>; +for (const format in ToProtoExportFormatMap) { + FromProtoExportFormatMap[ToProtoExportFormatMap[format]] = format; +} diff --git a/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts b/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts index b892d8da8825..372358140494 100644 --- a/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts +++ b/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts @@ -7,6 +7,7 @@ import { } from "@rilldata/web-common/runtime-client"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { queryClient } from "@rilldata/web-common/lib/svelte-query/globalQueryClient"; +import { timeStringToTimestamp } from "@rilldata/web-common/lib/proto-utils.ts"; export async function resolveTimeRanges( client: RuntimeClient, @@ -90,7 +91,7 @@ export async function fetchTimeRanges({ metricsViewName, expressions: rillTimes, timeZone, - executionTime: executionTime as any, + executionTime: timeStringToTimestamp(executionTime), timeDimension, }; diff --git a/web-common/src/features/dashboards/time-series/annotations-selectors.ts b/web-common/src/features/dashboards/time-series/annotations-selectors.ts index 59bfe859e950..afefc2eb4638 100644 --- a/web-common/src/features/dashboards/time-series/annotations-selectors.ts +++ b/web-common/src/features/dashboards/time-series/annotations-selectors.ts @@ -10,6 +10,8 @@ import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { DateTime, Interval } from "luxon"; import { TIME_GRAIN } from "@rilldata/web-common/lib/time/config.ts"; import { keepPreviousData } from "@tanstack/svelte-query"; +import { ToProtoTimeGrainMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps.ts"; +import { timeStringToTimestamp } from "@rilldata/web-common/lib/proto-utils.ts"; /** * Creates a query that fetches annotations for a measure and transforms @@ -34,11 +36,13 @@ export function createAnnotationsQuery( { metricsViewName, timeRange: { - start: timeStart as any, - end: timeEnd as any, + start: timeStringToTimestamp(timeStart), + end: timeStringToTimestamp(timeEnd), timeDimension, }, - timeGrain: timeGranularity as any, + timeGrain: timeGranularity + ? ToProtoTimeGrainMap[timeGranularity] + : undefined, measures: [measureName], }, { diff --git a/web-common/src/features/exports/ExportMenu.svelte b/web-common/src/features/exports/ExportMenu.svelte index e3dcd52499e8..4463d8632d7a 100644 --- a/web-common/src/features/exports/ExportMenu.svelte +++ b/web-common/src/features/exports/ExportMenu.svelte @@ -12,11 +12,15 @@ type V1Query, } from "@rilldata/web-common/runtime-client"; import { useRuntimeClient } from "@rilldata/web-common/runtime-client/v2"; + import { Query } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb"; + import { ToProtoExportFormatMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps"; + import type { JsonValue } from "@bufbuild/protobuf"; import { onMount } from "svelte"; import type TScheduledReportDialog from "../scheduled-reports/ScheduledReportDialog.svelte"; import { ResourceKind } from "@rilldata/web-common/features/entity-management/resource-selectors"; import { eventBus } from "@rilldata/web-common/lib/event-bus/event-bus"; import { extractErrorMessage } from "@rilldata/web-common/lib/errors"; + import { stripUndefined } from "@rilldata/web-common/runtime-client/v2/strip-undefined.ts"; const runtimeClient = useRuntimeClient(); @@ -50,8 +54,10 @@ const { format, includeHeader = false } = options; try { const result = await $exportDash.mutateAsync({ - query: exportQuery as any, - format: format as any, + query: exportQuery + ? Query.fromJson(stripUndefined(exportQuery) as unknown as JsonValue) + : undefined, + format: ToProtoExportFormatMap[format], includeHeader, // Include metadata for CSV/XLSX exports in Cloud context. ...(includeHeader && diff --git a/web-common/src/lib/proto-utils.ts b/web-common/src/lib/proto-utils.ts index ba7049e2c197..46f3148ff6e1 100644 --- a/web-common/src/lib/proto-utils.ts +++ b/web-common/src/lib/proto-utils.ts @@ -1,4 +1,5 @@ import type { Value } from "node_modules/@bufbuild/protobuf/dist/esm/google/protobuf/struct_pb"; +import { Timestamp } from "@bufbuild/protobuf"; /** A protobuf-es oneof field as generated for a `case` selector. */ type OneofSelector = @@ -40,3 +41,10 @@ export function getOneofValue< export function valueAsNumber(val: Value | undefined) { return getOneofValue(val, "kind", "numberValue") ?? 0; } + +export function timeStringToTimestamp( + time: string | undefined, +): Timestamp | undefined { + if (!time) return undefined; + return Timestamp.fromDate(new Date(time)); +} From 5d0ab9e28bd5e6b102db5f1983f6a710fccf9ea0 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Tue, 22 Sep 2026 16:43:22 +0530 Subject: [PATCH 3/3] Move to an allowlist to avoid side effects --- .../features/canvas/stores/canvas-entity.ts | 5 +- .../column-types/NumericProfile.svelte | 4 +- .../column-types/TimestampProfile.svelte | 12 +- .../column-types/details/NumericPlot.svelte | 7 +- .../column-types/details/TopK.svelte | 25 +- .../src/features/column-profile/queries.ts | 4 +- .../useDimensionSearchResults.ts | 5 +- .../dashboards/proto-state/enum-maps.ts | 22 +- .../time-controls/rill-time-ranges.ts | 3 +- .../time-series/annotations-selectors.ts | 10 +- .../src/features/exports/ExportMenu.svelte | 10 +- web-common/src/lib/proto-utils.ts | 10 +- .../src/runtime-client/gen/index.schemas.ts | 168 ++++++- .../runtime-client/v2/codegen/config.spec.ts | 20 +- .../src/runtime-client/v2/codegen/config.ts | 41 +- .../v2/codegen/generator.spec.ts | 95 +++- .../runtime-client/v2/codegen/generator.ts | 126 ++++-- .../v2/gen/connector-service.ts | 52 ++- .../runtime-client/v2/gen/query-service.ts | 134 ++++-- .../runtime-client/v2/gen/runtime-service.ts | 421 ++++++++++++++---- 20 files changed, 888 insertions(+), 286 deletions(-) diff --git a/web-common/src/features/canvas/stores/canvas-entity.ts b/web-common/src/features/canvas/stores/canvas-entity.ts index 30a19204831f..e16d89b773f4 100644 --- a/web-common/src/features/canvas/stores/canvas-entity.ts +++ b/web-common/src/features/canvas/stores/canvas-entity.ts @@ -49,9 +49,6 @@ import { DEFAULT_DASHBOARD_WIDTH, namePrefixFromPath } from "../layout-util"; import { createCustomMapStore } from "@rilldata/web-common/lib/custom-map-store"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { queryServiceConvertExpressionToMetricsSQL } from "@rilldata/web-common/runtime-client"; -import { Expression } from "@rilldata/web-common/proto/gen/rill/runtime/v1/expression_pb"; -import type { JsonValue } from "@bufbuild/protobuf"; -import { stripUndefined } from "@rilldata/web-common/runtime-client/v2/strip-undefined.ts"; import { ExpressionFilterManager } from "@rilldata/web-common/features/dashboards/filters/ExpressionFilterManager.svelte.ts"; import { convertExpressionToFilterParam } from "@rilldata/web-common/features/dashboards/url-state/filters/converters.ts"; import { flattenExpression } from "@rilldata/web-common/features/dashboards/stores/filter-utils.ts"; @@ -355,7 +352,7 @@ export class CanvasEntity { ).map((expr) => { // TODO: our API type is proto but there is a fromJSON underneath. // Once that is fixed, we need to call toExpressionProto here. - const protoExpr = expr ? toExpressionProto(expr) : undefined; + const protoExpr = expr as any; return queryClient.fetchQuery({ queryKey: getQueryServiceConvertExpressionToMetricsSQLQueryKey( this.instanceId, diff --git a/web-common/src/features/column-profile/column-types/NumericProfile.svelte b/web-common/src/features/column-profile/column-types/NumericProfile.svelte index c44ee1cebb6f..99c14f078375 100644 --- a/web-common/src/features/column-profile/column-types/NumericProfile.svelte +++ b/web-common/src/features/column-profile/column-types/NumericProfile.svelte @@ -24,8 +24,8 @@ import NumericPlot from "./details/NumericPlot.svelte"; import NullPercentageSpark from "./sparks/NullPercentageSpark.svelte"; import NumericSpark from "./sparks/NumericSpark.svelte"; - import { HistogramMethod } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb.ts"; - import { getOneofValue } from "@rilldata/web-common/lib/proto-utils.ts"; + import { HistogramMethod } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb"; + import { getOneofValue } from "@rilldata/web-common/lib/proto-utils"; export let connector: string; export let database: string; diff --git a/web-common/src/features/column-profile/column-types/TimestampProfile.svelte b/web-common/src/features/column-profile/column-types/TimestampProfile.svelte index 3d635eddb24d..3e78aa0a36f5 100644 --- a/web-common/src/features/column-profile/column-types/TimestampProfile.svelte +++ b/web-common/src/features/column-profile/column-types/TimestampProfile.svelte @@ -12,8 +12,7 @@ isFetching, } from "../queries"; import NullPercentageSpark from "./sparks/NullPercentageSpark.svelte"; - import { FromProtoTimeGrainMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps.ts"; - import { TimeGrain } from "@rilldata/web-common/proto/gen/rill/runtime/v1/time_grain_pb.ts"; + import { FromProtoTimeGrainMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps"; export let connector: string; export let database: string; @@ -105,7 +104,9 @@ style:height="{timestampDetailHeight + 64 + 28}px" bind:clientWidth={secondWidth} > - {#if $timeSeries?.data?.length && $timeSeries?.estimatedRollupInterval?.interval && $timeSeries?.smallestTimegrain} + + {#if $timeSeries?.data?.length && $timeSeries?.estimatedRollupInterval?.interval !== undefined && $timeSeries?.smallestTimegrain !== undefined} {/if} diff --git a/web-common/src/features/column-profile/column-types/details/NumericPlot.svelte b/web-common/src/features/column-profile/column-types/details/NumericPlot.svelte index 1d85b705ad26..c2f37bbd2e27 100644 --- a/web-common/src/features/column-profile/column-types/details/NumericPlot.svelte +++ b/web-common/src/features/column-profile/column-types/details/NumericPlot.svelte @@ -17,9 +17,9 @@ Otherwise, the page will jump around as the data is fetched. import type { NumericHistogramBinsBin, NumericOutliersOutlier, - TopKEntry, V1NumericStatistics, } from "@rilldata/web-common/runtime-client"; + import type { TopK_Entry } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb"; import { bisector } from "d3-array"; import { scaleLinear } from "d3-scale"; import { createHistogramScales } from "../histogram-utils"; @@ -38,7 +38,7 @@ Otherwise, the page will jump around as the data is fetched. export let data: NumericHistogramBinsBin[]; export let rug: NumericOutliersOutlier[]; export let summary: V1NumericStatistics | undefined; - export let topK: TopKEntry[]; + export let topK: TopK_Entry[]; export let totalRows: number; export let type: string; @@ -46,7 +46,8 @@ Otherwise, the page will jump around as the data is fetched. let topKLimit = 15; let rowHeight = 24; let containerWidth = 400; - let focusPoint: TopKEntry | undefined = undefined; + // The entry focused in the top-K list, in the plain JS form TopK.svelte emits. + let focusPoint: { value: unknown; count: number } | undefined = undefined; $: if (summaryMode !== "summary") focusPoint = undefined; diff --git a/web-common/src/features/column-profile/column-types/details/TopK.svelte b/web-common/src/features/column-profile/column-types/details/TopK.svelte index 3fa3bd07e6bd..8f72dd24d6c4 100644 --- a/web-common/src/features/column-profile/column-types/details/TopK.svelte +++ b/web-common/src/features/column-profile/column-types/details/TopK.svelte @@ -20,17 +20,20 @@ formatInteger, } from "@rilldata/web-common/lib/formatters"; import type { Location } from "@rilldata/web-common/lib/place-element"; - import type { TopKEntry } from "@rilldata/web-common/runtime-client"; + import type { TopK_Entry } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb"; import { format } from "d3-format"; import TopKListItem from "./TopKListItem.svelte"; + /** A `TopK_Entry` with its `value` unwrapped from the `Value` message. */ + type TopKItem = { value: unknown; count: number }; + export let colorClass = "bg-primary-200"; - export let topK: TopKEntry[] | undefined; + export let topK: TopK_Entry[] | undefined; export let totalRows: number; export let k = 15; export let type: string; - export let onFocusTopK: ((value: TopKEntry) => void) | undefined = undefined; - export let onBlurTopK: ((value: TopKEntry) => void) | undefined = undefined; + export let onFocusTopK: ((value: TopKItem) => void) | undefined = undefined; + export let onBlurTopK: ((value: TopKItem) => void) | undefined = undefined; $: smallestPercentage = topK && topK.length @@ -48,8 +51,14 @@ // We need this to get transition working properly. // Since the topk query is in a reactive statement with `enable`, `topK` can be undefined. // This leads to unexpected issues when paired with transition + let topKCopy: TopK_Entry[] | undefined; $: topKCopy = topK ?? topKCopy; - $: topKNormalised = topKCopy?.map((k) => k.toJSON()); + // The entry's value is a `google.protobuf.Value`; unwrap it to the plain JS + // value the formatters expect. + $: topKNormalised = topKCopy?.map((entry) => ({ + value: entry.value?.kind.case ? entry.value.toJson() : null, + count: entry.count, + })); function ensureSpaces(str: string, n = 6) { const sanitized = DOMPurify.sanitize(str, { ALLOWED_TAGS: [] }); @@ -67,11 +76,11 @@ distance: 16, }; - function handleFocus(value: TopKEntry) { + function handleFocus(value: TopKItem) { return () => onFocusTopK?.(value); } - function handleBlur(value: TopKEntry) { + function handleBlur(value: TopKItem) { return () => onBlurTopK?.(value); } @@ -136,7 +145,7 @@ onclick={modified({ shift: () => copyToClipboard( - item.count, + String(item.count), `copied ${item.count} to clipboard`, ), })} diff --git a/web-common/src/features/column-profile/queries.ts b/web-common/src/features/column-profile/queries.ts index c619f584aa95..957cf58c0a3a 100644 --- a/web-common/src/features/column-profile/queries.ts +++ b/web-common/src/features/column-profile/queries.ts @@ -20,11 +20,11 @@ import { derived, type Readable, writable } from "svelte/store"; import { getOneofValue, valueAsNumber, -} from "@rilldata/web-common/lib/proto-utils.ts"; +} from "@rilldata/web-common/lib/proto-utils"; import type { HistogramMethod, TimeSeriesValue, -} from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb.ts"; +} from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb"; export function isFetching(...queries) { return queries.some((query) => query?.isFetching); diff --git a/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts b/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts index baa735ca2746..e46c8cc744d3 100644 --- a/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts +++ b/web-common/src/features/dashboards/dimension-search/useDimensionSearchResults.ts @@ -7,7 +7,6 @@ import { } from "@rilldata/web-common/runtime-client"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { derived } from "svelte/store"; -import { timeStringToTimestamp } from "@rilldata/web-common/lib/proto-utils.ts"; export type DimensionSearchResult = { dimension: string; @@ -42,8 +41,8 @@ export function useDimensionSearchResults( search: searchText, limit: 100, timeRange: { - start: timeStringToTimestamp(timeRangeSummary.min), - end: timeStringToTimestamp(timeRangeSummary.max), + start: timeRangeSummary.min as any, + end: timeRangeSummary.max as any, }, }), ), diff --git a/web-common/src/features/dashboards/proto-state/enum-maps.ts b/web-common/src/features/dashboards/proto-state/enum-maps.ts index 44288946df24..da248f1929f8 100644 --- a/web-common/src/features/dashboards/proto-state/enum-maps.ts +++ b/web-common/src/features/dashboards/proto-state/enum-maps.ts @@ -1,13 +1,8 @@ import type { PivotTableMode } from "@rilldata/web-common/features/dashboards/pivot/types"; import { Operation } from "@rilldata/web-common/proto/gen/rill/runtime/v1/expression_pb"; -import { ExportFormat } from "@rilldata/web-common/proto/gen/rill/runtime/v1/export_format_pb"; import { TimeGrain } from "@rilldata/web-common/proto/gen/rill/runtime/v1/time_grain_pb"; import { DashboardState_PivotTableMode } from "@rilldata/web-common/proto/gen/rill/ui/v1/dashboard_pb"; -import { - V1ExportFormat, - V1Operation, - V1TimeGrain, -} from "@rilldata/web-common/runtime-client"; +import { V1Operation, V1TimeGrain } from "@rilldata/web-common/runtime-client"; // This file should contain all the map from proto and API values. // TODO: we should try and find a way to merge these enums @@ -67,18 +62,3 @@ export const FromProtoPivotTableModeMap = {} as Record< for (const op in ToProtoPivotTableModeMap) { FromProtoPivotTableModeMap[ToProtoPivotTableModeMap[op]] = op; } - -export const ToProtoExportFormatMap: Record = { - [V1ExportFormat.EXPORT_FORMAT_UNSPECIFIED]: ExportFormat.UNSPECIFIED, - [V1ExportFormat.EXPORT_FORMAT_CSV]: ExportFormat.CSV, - [V1ExportFormat.EXPORT_FORMAT_XLSX]: ExportFormat.XLSX, - [V1ExportFormat.EXPORT_FORMAT_PARQUET]: ExportFormat.PARQUET, -}; - -export const FromProtoExportFormatMap = {} as Record< - ExportFormat, - V1ExportFormat ->; -for (const format in ToProtoExportFormatMap) { - FromProtoExportFormatMap[ToProtoExportFormatMap[format]] = format; -} diff --git a/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts b/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts index 372358140494..b892d8da8825 100644 --- a/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts +++ b/web-common/src/features/dashboards/time-controls/rill-time-ranges.ts @@ -7,7 +7,6 @@ import { } from "@rilldata/web-common/runtime-client"; import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { queryClient } from "@rilldata/web-common/lib/svelte-query/globalQueryClient"; -import { timeStringToTimestamp } from "@rilldata/web-common/lib/proto-utils.ts"; export async function resolveTimeRanges( client: RuntimeClient, @@ -91,7 +90,7 @@ export async function fetchTimeRanges({ metricsViewName, expressions: rillTimes, timeZone, - executionTime: timeStringToTimestamp(executionTime), + executionTime: executionTime as any, timeDimension, }; diff --git a/web-common/src/features/dashboards/time-series/annotations-selectors.ts b/web-common/src/features/dashboards/time-series/annotations-selectors.ts index afefc2eb4638..59bfe859e950 100644 --- a/web-common/src/features/dashboards/time-series/annotations-selectors.ts +++ b/web-common/src/features/dashboards/time-series/annotations-selectors.ts @@ -10,8 +10,6 @@ import type { RuntimeClient } from "@rilldata/web-common/runtime-client/v2"; import { DateTime, Interval } from "luxon"; import { TIME_GRAIN } from "@rilldata/web-common/lib/time/config.ts"; import { keepPreviousData } from "@tanstack/svelte-query"; -import { ToProtoTimeGrainMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps.ts"; -import { timeStringToTimestamp } from "@rilldata/web-common/lib/proto-utils.ts"; /** * Creates a query that fetches annotations for a measure and transforms @@ -36,13 +34,11 @@ export function createAnnotationsQuery( { metricsViewName, timeRange: { - start: timeStringToTimestamp(timeStart), - end: timeStringToTimestamp(timeEnd), + start: timeStart as any, + end: timeEnd as any, timeDimension, }, - timeGrain: timeGranularity - ? ToProtoTimeGrainMap[timeGranularity] - : undefined, + timeGrain: timeGranularity as any, measures: [measureName], }, { diff --git a/web-common/src/features/exports/ExportMenu.svelte b/web-common/src/features/exports/ExportMenu.svelte index 4463d8632d7a..e3dcd52499e8 100644 --- a/web-common/src/features/exports/ExportMenu.svelte +++ b/web-common/src/features/exports/ExportMenu.svelte @@ -12,15 +12,11 @@ type V1Query, } from "@rilldata/web-common/runtime-client"; import { useRuntimeClient } from "@rilldata/web-common/runtime-client/v2"; - import { Query } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb"; - import { ToProtoExportFormatMap } from "@rilldata/web-common/features/dashboards/proto-state/enum-maps"; - import type { JsonValue } from "@bufbuild/protobuf"; import { onMount } from "svelte"; import type TScheduledReportDialog from "../scheduled-reports/ScheduledReportDialog.svelte"; import { ResourceKind } from "@rilldata/web-common/features/entity-management/resource-selectors"; import { eventBus } from "@rilldata/web-common/lib/event-bus/event-bus"; import { extractErrorMessage } from "@rilldata/web-common/lib/errors"; - import { stripUndefined } from "@rilldata/web-common/runtime-client/v2/strip-undefined.ts"; const runtimeClient = useRuntimeClient(); @@ -54,10 +50,8 @@ const { format, includeHeader = false } = options; try { const result = await $exportDash.mutateAsync({ - query: exportQuery - ? Query.fromJson(stripUndefined(exportQuery) as unknown as JsonValue) - : undefined, - format: ToProtoExportFormatMap[format], + query: exportQuery as any, + format: format as any, includeHeader, // Include metadata for CSV/XLSX exports in Cloud context. ...(includeHeader && diff --git a/web-common/src/lib/proto-utils.ts b/web-common/src/lib/proto-utils.ts index 46f3148ff6e1..674fe59c520c 100644 --- a/web-common/src/lib/proto-utils.ts +++ b/web-common/src/lib/proto-utils.ts @@ -1,5 +1,4 @@ -import type { Value } from "node_modules/@bufbuild/protobuf/dist/esm/google/protobuf/struct_pb"; -import { Timestamp } from "@bufbuild/protobuf"; +import type { Value } from "@bufbuild/protobuf"; /** A protobuf-es oneof field as generated for a `case` selector. */ type OneofSelector = @@ -41,10 +40,3 @@ export function getOneofValue< export function valueAsNumber(val: Value | undefined) { return getOneofValue(val, "kind", "numberValue") ?? 0; } - -export function timeStringToTimestamp( - time: string | undefined, -): Timestamp | undefined { - if (!time) return undefined; - return Timestamp.fromDate(new Date(time)); -} diff --git a/web-common/src/runtime-client/gen/index.schemas.ts b/web-common/src/runtime-client/gen/index.schemas.ts index 3d927377e686..29076f546522 100644 --- a/web-common/src/runtime-client/gen/index.schemas.ts +++ b/web-common/src/runtime-client/gen/index.schemas.ts @@ -1,10 +1,3 @@ -import { - ColumnCardinalityRequest, - ColumnDescriptiveStatisticsRequest, - ColumnNullCountRequest, - ColumnNumericHistogramRequest, type ColumnRollupIntervalRequest, - ColumnRugHistogramRequest, ColumnTimeGrainRequest, ColumnTimeRangeRequest, ColumnTimeSeriesRequest, ColumnTopKRequest } from "@rilldata/web-common/proto/gen/rill/runtime/v1/queries_pb.ts"; - /** * Runtime API type definitions. * @@ -12,13 +5,20 @@ import { * you may hand-edit this file (e.g., to add a new field to an existing type). * * Migration path: - * - For new endpoints, prefer proto-native types from protobuf-es (PartialMessage). - * The code generator uses them automatically when no V1* equivalent exists here. + * - Whether a method's hooks use these V1* types or proto-native types from + * protobuf-es is decided per method by `protoMessageMethods` in + * src/runtime-client/v2/codegen/config.ts, not by what this file happens to export. * - When a V1* type causes friction (missing fields, no discriminated unions for - * oneof), switch consumers to the proto-native type from the corresponding *_pb.ts - * file instead. + * oneof), switch its consumers to the proto-native type from the corresponding + * *_pb.ts file and add the method to `protoMessageMethods`. * - Once all consumers of a V1* type have migrated, delete the type from this file. */ +export interface ColumnTimeSeriesRequestBasicMeasure { + id?: string; + expression?: string; + sqlName?: string; +} + export interface ConnectorDriverProperty { key?: string; type?: ConnectorDriverPropertyType; @@ -507,6 +507,114 @@ export interface V1Color { alpha?: number; } +export interface V1ColumnCardinalityRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnDescriptiveStatisticsRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnNullCountRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnNumericHistogramRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + histogramMethod?: V1HistogramMethod; + priority?: number; +} + +export interface V1ColumnRollupIntervalRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnRugHistogramRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnTimeGrainRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnTimeRangeRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + priority?: number; +} + +export interface V1ColumnTimeSeriesRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + measures?: ColumnTimeSeriesRequestBasicMeasure[]; + timestampColumnName?: string; + timeRange?: V1TimeSeriesTimeRange; + pixels?: number; + sampleSize?: number; + priority?: number; + timeZone?: string; +} + +export interface V1ColumnTopKRequest { + instanceId?: string; + connector?: string; + database?: string; + databaseSchema?: string; + tableName?: string; + columnName?: string; + agg?: string; + k?: number; + priority?: number; +} + export interface V1CompleteResponse { conversationId?: string; messages?: V1Message[]; @@ -1021,6 +1129,16 @@ export interface V1HealthResponse { instancesHealth?: V1HealthResponseInstancesHealth; } +export type V1HistogramMethod = + (typeof V1HistogramMethod)[keyof typeof V1HistogramMethod]; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export const V1HistogramMethod = { + HISTOGRAM_METHOD_UNSPECIFIED: "HISTOGRAM_METHOD_UNSPECIFIED", + HISTOGRAM_METHOD_FD: "HISTOGRAM_METHOD_FD", + HISTOGRAM_METHOD_DIAGNOSTIC: "HISTOGRAM_METHOD_DIAGNOSTIC", +} as const; + export type V1InstanceVariables = { [key: string]: string }; export type V1InstanceProjectVariables = { [key: string]: string }; @@ -1928,16 +2046,16 @@ export interface V1Query { metricsViewTimeSeriesRequest?: V1MetricsViewTimeSeriesRequest; metricsViewTotalsRequest?: V1MetricsViewTotalsRequest; metricsViewRowsRequest?: V1MetricsViewRowsRequest; - columnRollupIntervalRequest?: ColumnRollupIntervalRequest; - columnTopKRequest?: ColumnTopKRequest; - columnNullCountRequest?: ColumnNullCountRequest; - columnDescriptiveStatisticsRequest?: ColumnDescriptiveStatisticsRequest; - columnTimeGrainRequest?: ColumnTimeGrainRequest; - columnNumericHistogramRequest?: ColumnNumericHistogramRequest; - columnRugHistogramRequest?: ColumnRugHistogramRequest; - columnTimeRangeRequest?: ColumnTimeRangeRequest; - columnCardinalityRequest?: ColumnCardinalityRequest; - columnTimeSeriesRequest?: ColumnTimeSeriesRequest; + columnRollupIntervalRequest?: V1ColumnRollupIntervalRequest; + columnTopKRequest?: V1ColumnTopKRequest; + columnNullCountRequest?: V1ColumnNullCountRequest; + columnDescriptiveStatisticsRequest?: V1ColumnDescriptiveStatisticsRequest; + columnTimeGrainRequest?: V1ColumnTimeGrainRequest; + columnNumericHistogramRequest?: V1ColumnNumericHistogramRequest; + columnRugHistogramRequest?: V1ColumnRugHistogramRequest; + columnTimeRangeRequest?: V1ColumnTimeRangeRequest; + columnCardinalityRequest?: V1ColumnCardinalityRequest; + columnTimeSeriesRequest?: V1ColumnTimeSeriesRequest; tableCardinalityRequest?: V1TableCardinalityRequest; tableColumnsRequest?: V1TableColumnsRequest; tableRowsRequest?: V1TableRowsRequest; @@ -2434,6 +2552,12 @@ export interface V1TimeRangeSummary { watermark?: string; } +export interface V1TimeSeriesTimeRange { + start?: string; + end?: string; + interval?: V1TimeGrain; +} + export type V1TimeSeriesValueRecords = { [key: string]: unknown }; export interface V1TimeSeriesValue { @@ -2760,4 +2884,4 @@ export type QueryServiceResolveTemplatedStringBody = { useFormatTokens?: boolean; additionalWhereByMetricsView?: QueryServiceResolveTemplatedStringBodyAdditionalWhereByMetricsView; additionalTimeRange?: V1TimeRange; -}; \ No newline at end of file +}; diff --git a/web-common/src/runtime-client/v2/codegen/config.spec.ts b/web-common/src/runtime-client/v2/codegen/config.spec.ts index ea1c0d5f443d..1e17f304dcc4 100644 --- a/web-common/src/runtime-client/v2/codegen/config.spec.ts +++ b/web-common/src/runtime-client/v2/codegen/config.spec.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { classifyMethod } from "./config"; +import { classifyMethod, usesProtoMessages } from "./config"; describe("classifyMethod", () => { describe("QueryService overrides", () => { @@ -80,3 +80,21 @@ describe("classifyMethod", () => { }); }); }); + +describe("usesProtoMessages", () => { + it.each(["columnTopK", "columnTimeSeries", "columnCardinality"])( + "is true for the migrated method %s", + (method) => { + expect(usesProtoMessages("QueryService", method)).toBe(true); + }, + ); + + it.each([ + ["QueryService", "metricsViewAggregation"], + ["QueryService", "export"], + ["RuntimeService", "getResource"], + ["ConnectorService", "listTables"], + ] as const)("is false for %s.%s", (service, method) => { + expect(usesProtoMessages(service, method)).toBe(false); + }); +}); diff --git a/web-common/src/runtime-client/v2/codegen/config.ts b/web-common/src/runtime-client/v2/codegen/config.ts index 3cc3e86a7dc4..a947de06de5b 100644 --- a/web-common/src/runtime-client/v2/codegen/config.ts +++ b/web-common/src/runtime-client/v2/codegen/config.ts @@ -1,7 +1,8 @@ /** - * Classification config for the query hooks code generator. + * Config for the query hooks code generator. * Determines whether each RPC method produces a query or mutation hook, - * or should be skipped entirely (streaming methods). + * or should be skipped entirely (streaming methods), and whether its request + * and response are proto messages or the legacy Orval JSON types. */ export type MethodClassification = "query" | "mutation" | "skip"; @@ -78,3 +79,39 @@ export function classifyMethod( return "query"; } + +/** + * Methods migrated to proto messages, keyed by service. + * + * A migrated method takes a `PartialMessage` that is handed straight to + * the ConnectRPC client and returns the `Response` message instance. Every other + * method keeps the legacy JSON bridge: the request is parsed with `fromJson` and + * the response is converted back with `toJson`, so callers keep working with the + * Orval `V1*` JSON types. + * + * Migrating a method is a deliberate step, not a side effect of deleting a `V1*` + * type from `index.schemas.ts`: add the method here in the same change that + * updates its call sites to the proto messages. + */ +export const protoMessageMethods: Record = { + QueryService: [ + "columnCardinality", + "columnDescriptiveStatistics", + "columnNullCount", + "columnNumericHistogram", + "columnRollupInterval", + "columnRugHistogram", + "columnTimeGrain", + "columnTimeRange", + "columnTimeSeries", + "columnTopK", + ], +}; + +/** Whether a method's request and response are proto messages instead of Orval JSON types. */ +export function usesProtoMessages( + serviceName: string, + methodName: string, +): boolean { + return !!protoMessageMethods[serviceName]?.includes(methodName); +} diff --git a/web-common/src/runtime-client/v2/codegen/generator.spec.ts b/web-common/src/runtime-client/v2/codegen/generator.spec.ts index 01993b633294..0ba8e22ea212 100644 --- a/web-common/src/runtime-client/v2/codegen/generator.spec.ts +++ b/web-common/src/runtime-client/v2/codegen/generator.spec.ts @@ -1,5 +1,6 @@ import { describe, it, expect } from "vitest"; import { MethodKind } from "@bufbuild/protobuf"; +import { protoMessageMethods } from "./config"; import { generateServiceFile, generateIndex, @@ -75,6 +76,25 @@ const mockService: ServiceDef = { }, }; +/** + * A QueryService whose methods are exactly the ones listed as migrated to proto + * messages in `protoMessageMethods`, so the generated file skips the JSON bridge. + */ +const migratedService: ServiceDef = { + typeName: "rill.runtime.v1.QueryService", + methods: Object.fromEntries( + protoMessageMethods.QueryService.map((methodKey) => [ + methodKey, + { + name: methodKey.charAt(0).toUpperCase() + methodKey.slice(1), + I: FakeRequestWithInstanceId, + O: FakeResponse, + kind: MethodKind.Unary, + }, + ]), + ), +}; + // Shared context factory for narrow tests function makeCtx(overrides: Partial = {}): MethodContext { return { @@ -87,6 +107,7 @@ function makeCtx(overrides: Partial = {}): MethodContext { inputType: "FakeRequestWithInstanceId", outputType: "FakeResponse", classification: "query", + usesProtoMessages: false, hasInstanceId: true, hasPageToken: false, hasNextPageToken: false, @@ -134,6 +155,25 @@ describe("extractMethods", () => { expect(getFoo?.hasNextPageToken).toBe(false); }); + it("marks only the methods listed in protoMessageMethods as proto", () => { + expect(extractMethods(mockService).every((m) => !m.usesProtoMessages)).toBe( + true, + ); + expect( + extractMethods(migratedService).every((m) => m.usesProtoMessages), + ).toBe(true); + }); + + it("throws when protoMessageMethods names a method the service does not generate", () => { + const partialService: ServiceDef = { + typeName: "rill.runtime.v1.QueryService", + methods: { columnTopK: migratedService.methods.columnTopK }, + }; + expect(() => extractMethods(partialService)).toThrow( + /protoMessageMethods.QueryService lists methods/, + ); + }); + it("extracts short type names", () => { const methods = extractMethods(mockService); const getFoo = methods.find((m) => m.methodKey === "getFoo"); @@ -186,14 +226,20 @@ describe("requestTypes", () => { expect(responseType).toBe("V1FakeResponse"); }); - it("uses the bare proto Message type for responses when no Orval type", () => { - const { responseType } = requestTypes(makeCtx()); - expect(responseType).toBe("FakeResponse"); + it("falls back to PartialMessage when no Orval type", () => { + const { requestType, responseType } = requestTypes(makeCtx()); + expect(requestType).toContain("PartialMessage"); + expect(responseType).toBe("PartialMessage"); }); - it("falls back to PartialMessage for requests when no Orval type", () => { - const { requestType } = requestTypes(makeCtx()); + it("uses proto messages for migrated methods, ignoring the Orval types", () => { + const ctx = makeCtx({ + orvalTypes: new Set(["V1FakeRequestWithInstanceId", "V1FakeResponse"]), + m: { ...makeCtx().m, usesProtoMessages: true }, + }); + const { requestType, responseType } = requestTypes(ctx); expect(requestType).toContain("PartialMessage"); + expect(responseType).toBe("FakeResponse"); }); }); @@ -205,20 +251,17 @@ describe("generateRawFunction", () => { expect(code).toContain("signal?: AbortSignal"); }); - it("passes proto requests directly and returns the message instance", () => { - // No Orval types: skip the JSON bridge entirely. - const code = generateRawFunction(makeCtx()).join("\n"); + it("passes migrated requests directly and returns the message instance", () => { + const ctx = makeCtx({ m: { ...makeCtx().m, usesProtoMessages: true } }); + const code = generateRawFunction(ctx).join("\n"); expect(code).not.toContain("fromJson"); expect(code).not.toContain("toJson"); expect(code).toContain("{ instanceId: client.instanceId, ...request }"); expect(code).toContain("return r;"); }); - it("bridges to and from JSON for Orval-typed methods", () => { - const ctx = makeCtx({ - orvalTypes: new Set(["V1FakeRequestWithInstanceId", "V1FakeResponse"]), - }); - const code = generateRawFunction(ctx).join("\n"); + it("bridges to and from JSON for methods that are not migrated", () => { + const code = generateRawFunction(makeCtx()).join("\n"); expect(code).toContain("fromJson(stripUndefined("); expect(code).toContain("toJson({ emitDefaultValues: true })"); }); @@ -248,6 +291,7 @@ describe("generateInfiniteQueryMethod", () => { inputType: "FakePaginatedRequest", outputType: "FakePaginatedResponse", classification: "query", + usesProtoMessages: false, hasInstanceId: true, hasPageToken: true, hasNextPageToken: true, @@ -296,6 +340,7 @@ describe("generateMutationMethod", () => { inputType: "FakeRequestWithoutInstanceId", outputType: "FakeResponse", classification: "mutation", + usesProtoMessages: false, hasInstanceId: false, hasPageToken: false, hasNextPageToken: false, @@ -329,21 +374,29 @@ describe("generateServiceFile", () => { expect(output).toMatch(/^\/\/ Generated by codegen\/run\.ts/); }); - it("imports stripUndefined only for Orval-typed requests", () => { - // mockService has no Orval types, so the JSON bridge is not needed. - expect(output).not.toContain( + it("imports stripUndefined only for methods on the JSON bridge", () => { + expect(output).toContain( 'import { stripUndefined } from "../strip-undefined"', ); - const { code } = generateServiceFile( - mockService, - new Set(["V1FakeRequestWithInstanceId"]), - ); - expect(code).toContain( + const { code } = generateServiceFile(migratedService, new Set()); + expect(code).not.toContain( 'import { stripUndefined } from "../strip-undefined"', ); }); + it("skips the JSON bridge entirely for a fully migrated service", () => { + const { code } = generateServiceFile( + migratedService, + new Set(["V1FakeRequestWithInstanceId", "V1FakeResponse"]), + ); + expect(code).not.toContain("fromJson"); + expect(code).not.toContain("toJson"); + expect(code).not.toContain("JsonValue"); + expect(code).not.toContain("V1FakeResponse"); + expect(code).toContain("Promise"); + }); + it("returns extracted methods", () => { const { methods } = generateServiceFile(mockService, new Set()); expect(methods.length).toBe(3); // getFoo, putBar, listItems (watchBaz skipped) diff --git a/web-common/src/runtime-client/v2/codegen/generator.ts b/web-common/src/runtime-client/v2/codegen/generator.ts index 9db6368072a2..2b871843bee1 100644 --- a/web-common/src/runtime-client/v2/codegen/generator.ts +++ b/web-common/src/runtime-client/v2/codegen/generator.ts @@ -9,7 +9,12 @@ import * as fs from "node:fs"; import * as path from "node:path"; import { MethodKind } from "@bufbuild/protobuf"; -import { classifyMethod, type MethodClassification } from "./config"; +import { + classifyMethod, + protoMessageMethods, + usesProtoMessages, + type MethodClassification, +} from "./config"; export interface ServiceDef { typeName: string; @@ -35,6 +40,8 @@ export interface MethodInfo { /** Response message type name (e.g. "MetricsViewAggregationResponse") */ outputType: string; classification: MethodClassification; + /** Whether the request and response are proto messages instead of Orval JSON types */ + usesProtoMessages: boolean; /** Whether the request type has an instanceId field */ hasInstanceId: boolean; /** Whether the request type has a pageToken field (pagination input) */ @@ -110,30 +117,54 @@ function hasOrvalType( } /** - * Get the public-facing type for a request. Falls back to `PartialMessage` for - * proto types so callers can pass plain partial objects. + * Whether the request is exposed as its Orval type. Only methods on the JSON + * bridge are, and only while their Orval type still exists; without one the + * request falls back to `PartialMessage` even though it is bridged through + * `fromJson`, so such callers pass the JSON representation behind a cast. */ -function publicType( +function usesOrvalRequestType( + m: MethodInfo, + availableOrvalTypes: Set, +): boolean { + return !m.usesProtoMessages && hasOrvalType(availableOrvalTypes, m.inputType); +} + +/** Whether the response is exposed as its Orval type; see usesOrvalRequestType. */ +function usesOrvalResponseType( + m: MethodInfo, + availableOrvalTypes: Set, +): boolean { + return ( + !m.usesProtoMessages && hasOrvalType(availableOrvalTypes, m.outputType) + ); +} + +/** + * Get the public-facing request type. Migrated methods take a `PartialMessage`, + * so callers can pass plain partial objects. + */ +function requestPublicType( + m: MethodInfo, availableOrvalTypes: Set, - protoTypeName: string, ): string { - return hasOrvalType(availableOrvalTypes, protoTypeName) - ? orvalTypeName(protoTypeName) - : `PartialMessage<${protoTypeName}>`; + return usesOrvalRequestType(m, availableOrvalTypes) + ? orvalTypeName(m.inputType) + : `PartialMessage<${m.inputType}>`; } /** - * Get the public-facing type for a response. Falls back to the proto Message - * type (not `PartialMessage`) so callers receive a fully-typed message instance - * with its runtime helpers (e.g. `Timestamp.toDate()`, oneof selectors). + * Get the public-facing response type. Migrated methods return the proto Message + * type, so callers get a fully-typed message instance with its runtime helpers + * (e.g. `Timestamp.toDate()`, oneof selectors). */ -function publicResponseType( +function responsePublicType( + m: MethodInfo, availableOrvalTypes: Set, - protoTypeName: string, ): string { - return hasOrvalType(availableOrvalTypes, protoTypeName) - ? orvalTypeName(protoTypeName) - : protoTypeName; + if (usesOrvalResponseType(m, availableOrvalTypes)) { + return orvalTypeName(m.outputType); + } + return m.usesProtoMessages ? m.outputType : `PartialMessage<${m.outputType}>`; } // --- Method extraction --- @@ -167,12 +198,25 @@ function extractMethods(service: ServiceDef): MethodInfo[] { inputType: extractShortName(method.I.typeName), outputType: extractShortName(method.O.typeName), classification, + usesProtoMessages: usesProtoMessages(serviceName, key), hasInstanceId, hasPageToken, hasNextPageToken, }); } + // Guard against typos and renames in the migration list: every entry must + // name a method that is actually generated for the service. + const generatedKeys = new Set(methods.map((m) => m.methodKey)); + const unknown = (protoMessageMethods[serviceName] ?? []).filter( + (methodKey) => !generatedKeys.has(methodKey), + ); + if (unknown.length > 0) { + throw new Error( + `protoMessageMethods.${serviceName} lists methods that ${serviceName} does not generate: ${unknown.join(", ")}`, + ); + } + return methods; } @@ -205,34 +249,32 @@ function methodNames(ctx: MethodContext) { function requestTypes(ctx: MethodContext) { const { m, orvalTypes } = ctx; - const inputPublic = publicType(orvalTypes, m.inputType); + const inputPublic = requestPublicType(m, orvalTypes); const requestType = m.hasInstanceId ? `Omit<${inputPublic}, "instanceId">` : inputPublic; const requestSpread = m.hasInstanceId ? `{ instanceId: client.instanceId, ...request }` : `request`; - const responseType = publicResponseType(orvalTypes, m.outputType); + const responseType = responsePublicType(m, orvalTypes); return { requestType, requestSpread, responseType }; } function generateRawFunction(ctx: MethodContext): string[] { - const { serviceName, serviceClientProp, m, orvalTypes } = ctx; + const { serviceName, serviceClientProp, m } = ctx; const { rawFn } = methodNames(ctx); const { requestType, requestSpread, responseType } = requestTypes(ctx); - // Orval request types are JSON, so they must be parsed via fromJson (with - // undefined stripped, which fromJson rejects). Proto request types are - // PartialMessage and can be passed to the ConnectRPC client directly. - const requestArg = hasOrvalType(orvalTypes, m.inputType) - ? `${m.inputType}.fromJson(stripUndefined(${requestSpread}) as unknown as JsonValue)` - : requestSpread; - - // Orval callers expect the JSON representation; proto callers get the message - // instance directly (retaining its runtime helpers). - const returnStmt = hasOrvalType(orvalTypes, m.outputType) - ? ` return r.toJson({ emitDefaultValues: true }) as unknown as ${responseType};` - : ` return r;`; + // Migrated methods take a PartialMessage and can be passed to the ConnectRPC + // client directly. Methods on the JSON bridge take the JSON representation, + // so it must be parsed via fromJson (with undefined stripped, which fromJson + // rejects) and the response converted back with toJson. + const requestArg = m.usesProtoMessages + ? requestSpread + : `${m.inputType}.fromJson(stripUndefined(${requestSpread}) as unknown as JsonValue)`; + const returnStmt = m.usesProtoMessages + ? ` return r;` + : ` return r.toJson({ emitDefaultValues: true }) as unknown as ${responseType};`; return [ `/**`, @@ -312,7 +354,7 @@ function generateInfiniteQueryMethod(ctx: MethodContext): string[] { const omitKeys = m.hasInstanceId ? `"instanceId" | "pageToken"` : `"pageToken"`; - const inputPublic = publicType(ctx.orvalTypes, m.inputType); + const inputPublic = requestPublicType(m, ctx.orvalTypes); const paginatedRequestType = `Omit<${inputPublic}, ${omitKeys}>`; return [ @@ -415,14 +457,14 @@ function generateServiceFile( // --- Package imports --- // @bufbuild/protobuf - // PartialMessage is used for proto request types; JsonValue is only needed - // for the fromJson bridge on Orval-typed requests. + // PartialMessage is used wherever a type is not exposed as its Orval type; + // JsonValue is only needed for the fromJson bridge on unmigrated methods. const needsPartialMessage = methods.some( - (m) => !hasOrvalType(availableOrvalTypes, m.inputType), - ); - const needsJsonBridge = methods.some((m) => - hasOrvalType(availableOrvalTypes, m.inputType), + (m) => + !usesOrvalRequestType(m, availableOrvalTypes) || + (!m.usesProtoMessages && !usesOrvalResponseType(m, availableOrvalTypes)), ); + const needsJsonBridge = methods.some((m) => !m.usesProtoMessages); const bufSpecs: string[] = []; if (needsJsonBridge) bufSpecs.push("JsonValue"); if (needsPartialMessage) bufSpecs.push("PartialMessage"); @@ -484,12 +526,12 @@ function generateServiceFile( const orvalImports = new Set(); for (const m of methods) { - protoImports.add(m.inputType); // always needed for serialization - if (hasOrvalType(availableOrvalTypes, m.inputType)) { + protoImports.add(m.inputType); // always needed: as a type or for fromJson + if (usesOrvalRequestType(m, availableOrvalTypes)) { orvalImports.add(orvalTypeName(m.inputType)); } - if (hasOrvalType(availableOrvalTypes, m.outputType)) { + if (usesOrvalResponseType(m, availableOrvalTypes)) { orvalImports.add(orvalTypeName(m.outputType)); } else { protoImports.add(m.outputType); @@ -517,7 +559,7 @@ function generateServiceFile( // stripUndefined (proto fromJson rejects undefined values; // Orval's HTTP client silently omitted them). Only needed for the fromJson - // bridge on Orval-typed requests. + // bridge on methods that are not migrated to proto messages. if (needsJsonBridge) { lines.push(`import { stripUndefined } from "../strip-undefined";`); } diff --git a/web-common/src/runtime-client/v2/gen/connector-service.ts b/web-common/src/runtime-client/v2/gen/connector-service.ts index 28bb9cf8542e..9ca2741b96e8 100644 --- a/web-common/src/runtime-client/v2/gen/connector-service.ts +++ b/web-common/src/runtime-client/v2/gen/connector-service.ts @@ -1,6 +1,6 @@ // Generated by codegen/run.ts — DO NOT EDIT -import type { PartialMessage } from "@bufbuild/protobuf"; +import type { JsonValue, PartialMessage } from "@bufbuild/protobuf"; import type { ConnectError } from "@connectrpc/connect"; import { createInfiniteQuery, @@ -33,6 +33,7 @@ import type { V1OLAPListTablesResponse, } from "../../gen/index.schemas"; import type { RuntimeClient } from "../runtime-client"; +import { stripUndefined } from "../strip-undefined"; /** * Raw RPC call: ConnectorService.ListBuckets @@ -43,7 +44,12 @@ export async function connectorServiceListBuckets( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listBuckets( - { instanceId: client.instanceId, ...request }, + ListBucketsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -121,7 +127,12 @@ export async function connectorServiceListObjects( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listObjects( - { instanceId: client.instanceId, ...request }, + ListObjectsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -199,7 +210,12 @@ export async function connectorServiceOLAPListTables( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.oLAPListTables( - { instanceId: client.instanceId, ...request }, + OLAPListTablesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -277,7 +293,12 @@ export async function connectorServiceOLAPGetTable( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.oLAPGetTable( - { instanceId: client.instanceId, ...request }, + OLAPGetTableRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -355,7 +376,12 @@ export async function connectorServiceListDatabaseSchemas( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listDatabaseSchemas( - { instanceId: client.instanceId, ...request }, + ListDatabaseSchemasRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -435,7 +461,12 @@ export async function connectorServiceListTables( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.listTables( - { instanceId: client.instanceId, ...request }, + ListTablesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -506,7 +537,12 @@ export async function connectorServiceGetTable( options?: { signal?: AbortSignal }, ): Promise { const r = await client.connectorService.getTable( - { instanceId: client.instanceId, ...request }, + GetTableRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GetTableResponse; diff --git a/web-common/src/runtime-client/v2/gen/query-service.ts b/web-common/src/runtime-client/v2/gen/query-service.ts index 304365f4af24..8b1a60be2cd1 100644 --- a/web-common/src/runtime-client/v2/gen/query-service.ts +++ b/web-common/src/runtime-client/v2/gen/query-service.ts @@ -100,12 +100,19 @@ export async function queryServiceProjectStorage( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise> { const r = await client.queryService.projectStorage( - { instanceId: client.instanceId, ...request }, + ProjectStorageRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); - return r; + return r.toJson({ + emitDefaultValues: true, + }) as unknown as PartialMessage; } export function getQueryServiceProjectStorageQueryKey( @@ -116,42 +123,55 @@ export function getQueryServiceProjectStorageQueryKey( } export function getQueryServiceProjectStorageQueryOptions< - TData = ProjectStorageResponse, + TData = PartialMessage, >( client: RuntimeClient, request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions< + PartialMessage, + ConnectError, + TData + > >; }, -): CreateQueryOptions & { - queryKey: QueryKey; -} { +): CreateQueryOptions< + PartialMessage, + ConnectError, + TData +> & { queryKey: QueryKey } { const queryKey = getQueryServiceProjectStorageQueryKey( client.instanceId, request, ); - const queryFn: QueryFunction = ({ signal }) => - queryServiceProjectStorage(client, request, { signal }); + const queryFn: QueryFunction> = ({ + signal, + }) => queryServiceProjectStorage(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { - queryKey: QueryKey; - }; + } as CreateQueryOptions< + PartialMessage, + ConnectError, + TData + > & { queryKey: QueryKey }; } export function createQueryServiceProjectStorage< - TData = ProjectStorageResponse, + TData = PartialMessage, >( client: RuntimeClient, request: Omit, "instanceId">, options?: { query?: Partial< - CreateQueryOptions + CreateQueryOptions< + PartialMessage, + ConnectError, + TData + > >; }, queryClient?: QueryClient, @@ -680,7 +700,12 @@ export async function queryServiceMetricsViewTimeRange( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewTimeRange( - { instanceId: client.instanceId, ...request }, + MetricsViewTimeRangeRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -760,7 +785,12 @@ export async function queryServiceMetricsViewSchema( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewSchema( - { instanceId: client.instanceId, ...request }, + MetricsViewSchemaRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -838,7 +868,12 @@ export async function queryServiceMetricsViewSearch( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewSearch( - { instanceId: client.instanceId, ...request }, + MetricsViewSearchRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -916,7 +951,12 @@ export async function queryServiceMetricsViewTimeRanges( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewTimeRanges( - { instanceId: client.instanceId, ...request }, + MetricsViewTimeRangesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -997,7 +1037,12 @@ export async function queryServiceMetricsViewAnnotations( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.metricsViewAnnotations( - { instanceId: client.instanceId, ...request }, + MetricsViewAnnotationsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1081,7 +1126,12 @@ export async function queryServiceConvertExpressionToMetricsSQL( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.convertExpressionToMetricsSQL( - { instanceId: client.instanceId, ...request }, + ConvertExpressionToMetricsSQLRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1181,7 +1231,12 @@ export async function queryServiceResolveCanvas( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.resolveCanvas( - { instanceId: client.instanceId, ...request }, + ResolveCanvasRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1254,7 +1309,12 @@ export async function queryServiceResolveComponent( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.resolveComponent( - { instanceId: client.instanceId, ...request }, + ResolveComponentRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1332,7 +1392,12 @@ export async function queryServiceResolveTemplatedString( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.resolveTemplatedString( - { instanceId: client.instanceId, ...request }, + ResolveTemplatedStringRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2425,7 +2490,12 @@ export async function queryServiceQuery( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.query( - { instanceId: client.instanceId, ...request }, + QueryRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1QueryResponse; @@ -2479,7 +2549,12 @@ export async function queryServiceExport( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.export( - { instanceId: client.instanceId, ...request }, + ExportRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1ExportResponse; @@ -2533,7 +2608,12 @@ export async function queryServiceExportReport( options?: { signal?: AbortSignal }, ): Promise { const r = await client.queryService.exportReport( - { instanceId: client.instanceId, ...request }, + ExportReportRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ diff --git a/web-common/src/runtime-client/v2/gen/runtime-service.ts b/web-common/src/runtime-client/v2/gen/runtime-service.ts index 1cb4b705fd84..5095a85060e0 100644 --- a/web-common/src/runtime-client/v2/gen/runtime-service.ts +++ b/web-common/src/runtime-client/v2/gen/runtime-service.ts @@ -131,9 +131,10 @@ export async function runtimeServicePing( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.ping(request, { - signal: options?.signal, - }); + const r = await client.runtimeService.ping( + PingRequest.fromJson(stripUndefined(request) as unknown as JsonValue), + { signal: options?.signal }, + ); return r.toJson({ emitDefaultValues: true }) as unknown as V1PingResponse; } @@ -190,9 +191,10 @@ export async function runtimeServiceHealth( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.health(request, { - signal: options?.signal, - }); + const r = await client.runtimeService.health( + HealthRequest.fromJson(stripUndefined(request) as unknown as JsonValue), + { signal: options?.signal }, + ); return r.toJson({ emitDefaultValues: true }) as unknown as V1HealthResponse; } @@ -250,7 +252,12 @@ export async function runtimeServiceInstanceHealth( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.instanceHealth( - { instanceId: client.instanceId, ...request }, + InstanceHealthRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -327,9 +334,12 @@ export async function runtimeServiceListInstances( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.listInstances(request, { - signal: options?.signal, - }); + const r = await client.runtimeService.listInstances( + ListInstancesRequest.fromJson( + stripUndefined(request) as unknown as JsonValue, + ), + { signal: options?.signal }, + ); return r.toJson({ emitDefaultValues: true, }) as unknown as V1ListInstancesResponse; @@ -405,7 +415,12 @@ export async function runtimeServiceGetInstance( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getInstance( - { instanceId: client.instanceId, ...request }, + GetInstanceRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -476,7 +491,12 @@ export async function runtimeServiceListFiles( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listFiles( - { instanceId: client.instanceId, ...request }, + ListFilesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -547,7 +567,12 @@ export async function runtimeServiceGetFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getFile( - { instanceId: client.instanceId, ...request }, + GetFileRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GetFileResponse; @@ -606,9 +631,12 @@ export async function runtimeServiceListExamples( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.listExamples(request, { - signal: options?.signal, - }); + const r = await client.runtimeService.listExamples( + ListExamplesRequest.fromJson( + stripUndefined(request) as unknown as JsonValue, + ), + { signal: options?.signal }, + ); return r.toJson({ emitDefaultValues: true, }) as unknown as V1ListExamplesResponse; @@ -679,7 +707,12 @@ export async function runtimeServiceQueryResolver( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.queryResolver( - { instanceId: client.instanceId, ...request }, + QueryResolverRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -757,7 +790,12 @@ export async function runtimeServiceGetLogs( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getLogs( - { instanceId: client.instanceId, ...request }, + GetLogsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GetLogsResponse; @@ -817,7 +855,12 @@ export async function runtimeServiceListResources( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listResources( - { instanceId: client.instanceId, ...request }, + ListResourcesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -895,7 +938,12 @@ export async function runtimeServiceGetResource( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getResource( - { instanceId: client.instanceId, ...request }, + GetResourceRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -966,7 +1014,12 @@ export async function runtimeServiceGetExplore( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getExplore( - { instanceId: client.instanceId, ...request }, + GetExploreRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1037,7 +1090,12 @@ export async function runtimeServiceGetModelPartitions( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getModelPartitions( - { instanceId: client.instanceId, ...request }, + GetModelPartitionsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1114,9 +1172,12 @@ export async function runtimeServiceListConnectorDrivers( request: PartialMessage, options?: { signal?: AbortSignal }, ): Promise { - const r = await client.runtimeService.listConnectorDrivers(request, { - signal: options?.signal, - }); + const r = await client.runtimeService.listConnectorDrivers( + ListConnectorDriversRequest.fromJson( + stripUndefined(request) as unknown as JsonValue, + ), + { signal: options?.signal }, + ); return r.toJson({ emitDefaultValues: true, }) as unknown as V1ListConnectorDriversResponse; @@ -1194,7 +1255,12 @@ export async function runtimeServiceAnalyzeConnectors( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.analyzeConnectors( - { instanceId: client.instanceId, ...request }, + AnalyzeConnectorsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1272,7 +1338,12 @@ export async function runtimeServiceListNotifierConnectors( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listNotifierConnectors( - { instanceId: client.instanceId, ...request }, + ListNotifierConnectorsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1353,7 +1424,12 @@ export async function runtimeServiceListConversations( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listConversations( - { instanceId: client.instanceId, ...request }, + ListConversationsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1431,7 +1507,12 @@ export async function runtimeServiceGetConversation( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getConversation( - { instanceId: client.instanceId, ...request }, + GetConversationRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1509,7 +1590,12 @@ export async function runtimeServiceListTools( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listTools( - { instanceId: client.instanceId, ...request }, + ListToolsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1580,7 +1666,12 @@ export async function runtimeServiceGetAIMessage( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.getAIMessage( - { instanceId: client.instanceId, ...request }, + GetAIMessageRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1726,7 +1817,12 @@ export async function runtimeServiceAnalyzeVariables( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.analyzeVariables( - { instanceId: client.instanceId, ...request }, + AnalyzeVariablesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1804,7 +1900,12 @@ export async function runtimeServiceListGitCommits( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listGitCommits( - { instanceId: client.instanceId, ...request }, + ListGitCommitsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1882,7 +1983,12 @@ export async function runtimeServiceGitStatus( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitStatus( - { instanceId: client.instanceId, ...request }, + GitStatusRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -1951,12 +2057,19 @@ export async function runtimeServiceGitDiff( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise> { const r = await client.runtimeService.gitDiff( - { instanceId: client.instanceId, ...request }, + GitDiffRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); - return r; + return r.toJson({ + emitDefaultValues: true, + }) as unknown as PartialMessage; } export function getRuntimeServiceGitDiffQueryKey( @@ -1966,33 +2079,44 @@ export function getRuntimeServiceGitDiffQueryKey( return ["RuntimeService", "gitDiff", instanceId, request ?? {}] as const; } -export function getRuntimeServiceGitDiffQueryOptions( +export function getRuntimeServiceGitDiffQueryOptions< + TData = PartialMessage, +>( client: RuntimeClient, request: Omit, "instanceId">, options?: { - query?: Partial>; + query?: Partial< + CreateQueryOptions, ConnectError, TData> + >; }, -): CreateQueryOptions & { +): CreateQueryOptions, ConnectError, TData> & { queryKey: QueryKey; } { const queryKey = getRuntimeServiceGitDiffQueryKey(client.instanceId, request); - const queryFn: QueryFunction = ({ signal }) => - runtimeServiceGitDiff(client, request, { signal }); + const queryFn: QueryFunction> = ({ + signal, + }) => runtimeServiceGitDiff(client, request, { signal }); return { queryKey, queryFn, enabled: !!client.instanceId, ...options?.query, - } as CreateQueryOptions & { - queryKey: QueryKey; - }; + } as CreateQueryOptions< + PartialMessage, + ConnectError, + TData + > & { queryKey: QueryKey }; } -export function createRuntimeServiceGitDiff( +export function createRuntimeServiceGitDiff< + TData = PartialMessage, +>( client: RuntimeClient, request: Omit, "instanceId">, options?: { - query?: Partial>; + query?: Partial< + CreateQueryOptions, ConnectError, TData> + >; }, queryClient?: QueryClient, ): CreateQueryResult { @@ -2013,7 +2137,12 @@ export async function runtimeServiceListGitBranches( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.listGitBranches( - { instanceId: client.instanceId, ...request }, + ListGitBranchesRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2445,7 +2574,12 @@ export async function runtimeServiceReloadConfig( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.reloadConfig( - { instanceId: client.instanceId, ...request }, + ReloadConfigRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2504,7 +2638,12 @@ export async function runtimeServicePutFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.putFile( - { instanceId: client.instanceId, ...request }, + PutFileRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1PutFileResponse; @@ -2561,7 +2700,12 @@ export async function runtimeServiceCreateDirectory( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.createDirectory( - { instanceId: client.instanceId, ...request }, + CreateDirectoryRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2620,7 +2764,12 @@ export async function runtimeServiceDeleteFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.deleteFile( - { instanceId: client.instanceId, ...request }, + DeleteFileRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2679,7 +2828,12 @@ export async function runtimeServiceRenameFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.renameFile( - { instanceId: client.instanceId, ...request }, + RenameFileRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2738,7 +2892,12 @@ export async function runtimeServiceUnpackExample( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.unpackExample( - { instanceId: client.instanceId, ...request }, + UnpackExampleRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2797,7 +2956,12 @@ export async function runtimeServiceUnpackEmpty( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.unpackEmpty( - { instanceId: client.instanceId, ...request }, + UnpackEmptyRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2856,7 +3020,12 @@ export async function runtimeServiceGenerateMetricsViewFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.generateMetricsViewFile( - { instanceId: client.instanceId, ...request }, + GenerateMetricsViewFileRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2914,7 +3083,12 @@ export async function runtimeServiceGenerateCanvasFile( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.generateCanvasFile( - { instanceId: client.instanceId, ...request }, + GenerateCanvasFileRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -2971,25 +3145,32 @@ export async function runtimeServiceSkipModelPartitions( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise> { const r = await client.runtimeService.skipModelPartitions( - { instanceId: client.instanceId, ...request }, + SkipModelPartitionsRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); - return r; + return r.toJson({ + emitDefaultValues: true, + }) as unknown as PartialMessage; } export function getRuntimeServiceSkipModelPartitionsMutationOptions( client: RuntimeClient, options?: Partial< CreateMutationOptions< - SkipModelPartitionsResponse, + PartialMessage, unknown, Omit, "instanceId"> > >, ): CreateMutationOptions< - SkipModelPartitionsResponse, + PartialMessage, unknown, Omit, "instanceId"> > { @@ -3003,14 +3184,14 @@ export function createRuntimeServiceSkipModelPartitionsMutation( client: RuntimeClient, options?: Partial< CreateMutationOptions< - SkipModelPartitionsResponse, + PartialMessage, unknown, Omit, "instanceId"> > >, queryClient?: QueryClient, ): CreateMutationResult< - SkipModelPartitionsResponse, + PartialMessage, unknown, Omit, "instanceId"> > { @@ -3030,7 +3211,12 @@ export async function runtimeServiceCreateTrigger( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.createTrigger( - { instanceId: client.instanceId, ...request }, + CreateTriggerRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3089,7 +3275,12 @@ export async function runtimeServiceShareConversation( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.shareConversation( - { instanceId: client.instanceId, ...request }, + ShareConversationRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3148,7 +3339,12 @@ export async function runtimeServiceForkConversation( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.forkConversation( - { instanceId: client.instanceId, ...request }, + ForkConversationRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3207,7 +3403,12 @@ export async function runtimeServiceComplete( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.complete( - { instanceId: client.instanceId, ...request }, + CompleteRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1CompleteResponse; @@ -3262,25 +3463,32 @@ export async function runtimeServiceGitRevert( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise> { const r = await client.runtimeService.gitRevert( - { instanceId: client.instanceId, ...request }, + GitRevertRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); - return r; + return r.toJson({ + emitDefaultValues: true, + }) as unknown as PartialMessage; } export function getRuntimeServiceGitRevertMutationOptions( client: RuntimeClient, options?: Partial< CreateMutationOptions< - GitRevertResponse, + PartialMessage, unknown, Omit, "instanceId"> > >, ): CreateMutationOptions< - GitRevertResponse, + PartialMessage, unknown, Omit, "instanceId"> > { @@ -3294,14 +3502,14 @@ export function createRuntimeServiceGitRevertMutation( client: RuntimeClient, options?: Partial< CreateMutationOptions< - GitRevertResponse, + PartialMessage, unknown, Omit, "instanceId"> > >, queryClient?: QueryClient, ): CreateMutationResult< - GitRevertResponse, + PartialMessage, unknown, Omit, "instanceId"> > { @@ -3321,7 +3529,12 @@ export async function runtimeServiceGitCommit( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitCommit( - { instanceId: client.instanceId, ...request }, + GitCommitRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3380,7 +3593,12 @@ export async function runtimeServiceRestoreGitCommit( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.restoreGitCommit( - { instanceId: client.instanceId, ...request }, + RestoreGitCommitRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3439,7 +3657,12 @@ export async function runtimeServiceGitMergeToBranch( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitMergeToBranch( - { instanceId: client.instanceId, ...request }, + GitMergeToBranchRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3498,7 +3721,12 @@ export async function runtimeServiceGitSwitchBranch( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitSwitchBranch( - { instanceId: client.instanceId, ...request }, + GitSwitchBranchRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ @@ -3557,7 +3785,12 @@ export async function runtimeServiceGitPull( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitPull( - { instanceId: client.instanceId, ...request }, + GitPullRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GitPullResponse; @@ -3614,7 +3847,12 @@ export async function runtimeServiceGitPush( options?: { signal?: AbortSignal }, ): Promise { const r = await client.runtimeService.gitPush( - { instanceId: client.instanceId, ...request }, + GitPushRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); return r.toJson({ emitDefaultValues: true }) as unknown as V1GitPushResponse; @@ -3669,25 +3907,32 @@ export async function runtimeServicePushEnv( client: RuntimeClient, request: Omit, "instanceId">, options?: { signal?: AbortSignal }, -): Promise { +): Promise> { const r = await client.runtimeService.pushEnv( - { instanceId: client.instanceId, ...request }, + PushEnvRequest.fromJson( + stripUndefined({ + instanceId: client.instanceId, + ...request, + }) as unknown as JsonValue, + ), { signal: options?.signal }, ); - return r; + return r.toJson({ + emitDefaultValues: true, + }) as unknown as PartialMessage; } export function getRuntimeServicePushEnvMutationOptions( client: RuntimeClient, options?: Partial< CreateMutationOptions< - PushEnvResponse, + PartialMessage, unknown, Omit, "instanceId"> > >, ): CreateMutationOptions< - PushEnvResponse, + PartialMessage, unknown, Omit, "instanceId"> > { @@ -3701,14 +3946,14 @@ export function createRuntimeServicePushEnvMutation( client: RuntimeClient, options?: Partial< CreateMutationOptions< - PushEnvResponse, + PartialMessage, unknown, Omit, "instanceId"> > >, queryClient?: QueryClient, ): CreateMutationResult< - PushEnvResponse, + PartialMessage, unknown, Omit, "instanceId"> > {