@hypequery/react 0.6.4 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -85,6 +85,39 @@ export const { useMetric, useDataset } =
85
85
  });
86
86
  ```
87
87
 
88
+ ## Use Python datasets
89
+
90
+ Generate a TypeScript client file from the Python build contract with
91
+ `hypequery generate:client client-contract.json --output src/hypequery-client.ts`.
92
+ Use its API type and route map directly:
93
+
94
+ ```tsx
95
+ import { createAnalyticsHooks } from '@hypequery/react';
96
+ import { clientManifest, type ClientApi } from './hypequery-client.js';
97
+
98
+ export const { useDataset, useMetric, useInfiniteDataset } =
99
+ createAnalyticsHooks<ClientApi>({
100
+ baseUrl: 'https://analytics.example.com',
101
+ manifest: clientManifest,
102
+ token: () => getShortLivedUserToken(),
103
+ });
104
+ ```
105
+
106
+ Use the endpoint origin as `baseUrl`: generated paths already contain the full
107
+ installed mount prefix. Every request sends its endpoint schema hash. A `409`
108
+ with `CLIENT_SCHEMA_CHANGED` requires explicit regeneration and review; the client
109
+ does not fetch a replacement schema or refresh authentication for that response.
110
+ TanStack Query retry/refetch policies remain configurable by your application.
111
+ Use a new client or cache scope when the deployment, user or authorization scope
112
+ changes; a token resolver changing its return value does not invalidate cached data.
113
+
114
+ Literal selections expose their selected fields. Omitted measures use the exported
115
+ `defaultMeasures`; `measures: []` selects none. Numeric dimension values may be
116
+ numbers or strings, unknown/related nullability includes null, and aggregates use
117
+ strings or null. A time bucket may be null. Widened query inputs retain optional
118
+ fields because their actual selection is known only at runtime. Existing server
119
+ inference and handwritten API types remain supported.
120
+
88
121
  ## Build the dashboard
89
122
 
90
123
  ```tsx
@@ -2,10 +2,13 @@ import type { UseQueryOptions as TanstackUseQueryOptions, UseQueryResult, UseInf
2
2
  import { type CreateHooksConfig } from './createHooks.js';
3
3
  import { HttpError } from './errors.js';
4
4
  import type { ExtractNames, QueryInput, QueryOutput, QueryOutputForInput } from './types.js';
5
+ import type { WithPageMeta } from './utils/response-meta.js';
5
6
  type DatasetKey<Name extends string> = `dataset:${Name}`;
6
7
  type DatasetNamesFromApi<Api> = ExtractNames<Api> extends infer Key ? Key extends `dataset:${infer Name}` ? Name : never : never;
7
8
  type QueryKey<Name extends string, Input> = Input extends never ? ['hypequery', string, Name] : ['hypequery', string, Name, Input];
8
9
  type QueryOptions<Api, Key extends ExtractNames<Api>> = Omit<TanstackUseQueryOptions<QueryOutput<Api, Key>, HttpError, QueryOutput<Api, Key>, QueryKey<Key, QueryInput<Api, Key>>>, 'queryKey' | 'queryFn'>;
10
+ /** Query options whose `select` receives the projected response; `TData` is what `select` returns. */
11
+ type ProjectedQueryOptions<Api, Key extends ExtractNames<Api>, TProjected, TData> = Omit<TanstackUseQueryOptions<TProjected, HttpError, TData, QueryKey<Key, QueryInput<Api, Key>>>, 'queryKey' | 'queryFn'>;
9
12
  /** Infinite-query options parameterized by the projected page type. */
10
13
  type InfiniteQueryOptions<Api, Key extends ExtractNames<Api>, TPage> = Omit<TanstackUseInfiniteQueryOptions<TPage, HttpError, InfiniteData<TPage, number>, QueryKey<Key, QueryInput<Api, Key>>, number>, 'queryKey' | 'queryFn' | 'getNextPageParam' | 'initialPageParam'>;
11
14
  export interface CreateAnalyticsHooksConfig<Api extends Record<string, {
@@ -20,14 +23,14 @@ export declare function createAnalyticsHooks<Api extends Record<string, {
20
23
  }>, TMetrics extends readonly Exclude<ExtractNames<Api>, `dataset:${string}`>[] = readonly Exclude<ExtractNames<Api>, `dataset:${string}`>[]>(config?: CreateAnalyticsHooksConfig<Api, TMetrics>): {
21
24
  readonly useMetric: {
22
25
  <Name extends TMetrics extends readonly (infer U)[] ? U extends string ? U : never : Exclude<ExtractNames<Api>, `dataset:${string}`>>(...args: QueryInput<Api, Name> extends never ? [name: Name, options?: QueryOptions<Api, Name>] : never): UseQueryResult<QueryOutput<Api, Name>, HttpError>;
23
- <Name extends TMetrics extends readonly (infer U)[] ? U extends string ? U : never : Exclude<ExtractNames<Api>, `dataset:${string}`>, const TInput extends QueryInput<Api, Name>>(name: Name, input: TInput, options?: QueryOptions<Api, Name>): UseQueryResult<QueryOutputForInput<Api, Name, TInput>, HttpError>;
26
+ <Name extends TMetrics extends readonly (infer U)[] ? U extends string ? U : never : Exclude<ExtractNames<Api>, `dataset:${string}`>, const TInput extends QueryInput<Api, Name>, TData = QueryOutputForInput<Api, Name, TInput>>(name: Name, input: TInput, options?: ProjectedQueryOptions<Api, Name, QueryOutputForInput<Api, Name, TInput>, TData>): UseQueryResult<TData, HttpError>;
24
27
  };
25
28
  readonly useDataset: {
26
29
  <Name extends DatasetNamesFromApi<Api>>(...args: QueryInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>> extends never ? [name: Name, options?: QueryOptions<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>] : never): UseQueryResult<QueryOutput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>, HttpError>;
27
- <Name extends DatasetNamesFromApi<Api>, const TInput extends QueryInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>>(name: Name, input: TInput, options?: QueryOptions<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>): UseQueryResult<QueryOutputForInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, TInput>, HttpError>;
30
+ <Name extends DatasetNamesFromApi<Api>, const TInput extends QueryInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>, TData = QueryOutputForInput<Api, Extract<ExtractNames<Api>, `dataset:${Name}`>, TInput>>(name: Name, input: TInput, options?: ProjectedQueryOptions<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, QueryOutputForInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, TInput>, TData>): UseQueryResult<TData, HttpError>;
28
31
  };
29
- readonly useInfiniteMetric: <Name extends TMetrics extends readonly (infer U)[] ? U extends string ? U : never : Exclude<ExtractNames<Api>, `dataset:${string}`>, const TInput extends QueryInput<Api, Name>>(name: Name, input: TInput, options?: InfiniteQueryOptions<Api, Name, QueryOutputForInput<Api, Name, TInput>>) => UseInfiniteQueryResult<InfiniteData<QueryOutputForInput<Api, Name, TInput>, number>, HttpError>;
30
- readonly useInfiniteDataset: <Name extends DatasetNamesFromApi<Api>, const TInput extends QueryInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>>(name: Name, input: TInput, options?: InfiniteQueryOptions<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, QueryOutputForInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, TInput>>) => UseInfiniteQueryResult<InfiniteData<QueryOutputForInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, TInput>, number>, HttpError>;
32
+ readonly useInfiniteMetric: <Name extends TMetrics extends readonly (infer U)[] ? U extends string ? U : never : Exclude<ExtractNames<Api>, `dataset:${string}`>, const TInput extends QueryInput<Api, Name>>(name: Name, input: TInput, options?: InfiniteQueryOptions<Api, Name, WithPageMeta<QueryOutputForInput<Api, Name, TInput>>>) => UseInfiniteQueryResult<InfiniteData<WithPageMeta<QueryOutputForInput<Api, Name, TInput>>, number>, HttpError>;
33
+ readonly useInfiniteDataset: <Name extends DatasetNamesFromApi<Api>, const TInput extends QueryInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>>>(name: Name, input: TInput, options?: InfiniteQueryOptions<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, WithPageMeta<QueryOutputForInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, TInput>>>) => UseInfiniteQueryResult<InfiniteData<WithPageMeta<QueryOutputForInput<Api, Extract<ExtractNames<Api>, DatasetKey<Name>>, TInput>>, number>, HttpError>;
31
34
  readonly useQuery: <Name extends ExtractNames<Api>>(...args: QueryInput<Api, Name> extends never ? [name: Name, options?: Omit<TanstackUseQueryOptions<QueryOutput<Api, Name>, HttpError, QueryOutput<Api, Name>, QueryInput<Api, Name> extends never ? ["hypequery", string, Name] : ["hypequery", string, Name, QueryInput<Api, Name>]>, "queryKey" | "queryFn"> | undefined] : [name: Name, input: QueryInput<Api, Name>, options?: Omit<TanstackUseQueryOptions<QueryOutput<Api, Name>, HttpError, QueryOutput<Api, Name>, QueryInput<Api, Name> extends never ? ["hypequery", string, Name] : ["hypequery", string, Name, QueryInput<Api, Name>]>, "queryKey" | "queryFn"> | undefined]) => UseQueryResult<QueryOutput<Api, Name>, HttpError>;
32
35
  readonly useMutation: <Name extends ExtractNames<Api>>(name: Name, options?: Omit<import("@tanstack/react-query").UseMutationOptions<QueryOutput<Api, Name>, HttpError, QueryInput<Api, Name>, unknown>, "mutationFn"> | undefined) => import("@tanstack/react-query").UseMutationResult<QueryOutput<Api, Name>, HttpError, QueryInput<Api, Name>>;
33
36
  readonly useInfiniteQuery: <Name extends ExtractNames<Api>>(name: Name, input: QueryInput<Api, Name>, options?: Omit<TanstackUseInfiniteQueryOptions<QueryOutput<Api, Name>, HttpError, InfiniteData<QueryOutput<Api, Name>, number>, QueryInput<Api, Name> extends never ? ["hypequery", string, Name] : ["hypequery", string, Name, QueryInput<Api, Name>], number>, "queryKey" | "queryFn" | "getNextPageParam" | "initialPageParam"> | undefined) => UseInfiniteQueryResult<InfiniteData<QueryOutput<Api, Name>, number>, HttpError>;
@@ -1 +1 @@
1
- {"version":3,"file":"analyticsHooks.d.ts","sourceRoot":"","sources":["../src/analyticsHooks.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyticsHooks.d.ts","sourceRoot":"","sources":["../src/analyticsHooks.tsx"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -5,10 +5,14 @@ export type ApiContract = Record<string, {
5
5
  export interface QueryMethodConfig {
6
6
  method?: string;
7
7
  path?: string;
8
+ /** Generated endpoint schema precondition. A mismatch requires explicit regeneration/refresh. */
9
+ schemaHash?: string;
8
10
  }
9
11
  export interface RouteManifestEntry {
10
12
  method?: string;
11
13
  path?: string;
14
+ /** Generated endpoint schema precondition. A mismatch requires explicit regeneration/refresh. */
15
+ schemaHash?: string;
12
16
  }
13
17
  export type RouteManifest = Record<string, RouteManifestEntry>;
14
18
  type HeaderMap = Record<string, string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE/D,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAE3F,MAAM,WAAW,qBAAqB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,gGAAgG;IAChG,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAqED,MAAM,WAAW,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW;IACpE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzH;AAID,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,EACzE,MAAM,EAAE,qBAAqB,CAAC,GAAG,CAAC,GACjC,eAAe,CAAC,GAAG,CAAC,CAwFtB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE/D,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAE3F,MAAM,WAAW,qBAAqB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,gGAAgG;IAChG,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAqED,MAAM,WAAW,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW;IACpE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzH;AAID,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,EACzE,MAAM,EAAE,qBAAqB,CAAC,GAAG,CAAC,GACjC,eAAe,CAAC,GAAG,CAAC,CAyFtB"}
package/dist/client.js CHANGED
@@ -1,8 +1,9 @@
1
+ import { clientSchemaHeaders } from './utils/client-schema-headers.js';
1
2
  import { HttpError } from './errors.js';
2
3
  const normalizeMethodConfig = (source) => {
3
4
  if (!source)
4
5
  return {};
5
- return Object.fromEntries(Object.entries(source).map(([key, value]) => [key, { method: value.method ?? 'GET', path: value.path }]));
6
+ return Object.fromEntries(Object.entries(source).map(([key, value]) => [key, { method: value.method ?? 'GET', path: value.path, schemaHash: value.schemaHash }]));
6
7
  };
7
8
  const deriveMethodConfig = (api) => {
8
9
  if (typeof api !== 'object' || api === null)
@@ -62,11 +63,10 @@ let clientSequence = 0;
62
63
  export function createHypequeryClient(config) {
63
64
  const { baseUrl, fetchFn = fetch, headers, token, config: explicitConfig = {}, manifest, onUnauthorized, api, } = config;
64
65
  const cacheKey = config.cacheKey ?? `client:${++clientSequence}`;
65
- const finalConfig = {
66
- ...deriveMethodConfig(api),
67
- ...(manifest ? normalizeMethodConfig(manifest) : {}),
68
- ...explicitConfig,
69
- };
66
+ const finalConfig = Object.assign(Object.create(null), deriveMethodConfig(api), manifest ? normalizeMethodConfig(manifest) : {});
67
+ for (const [name, override] of Object.entries(explicitConfig)) {
68
+ finalConfig[name] = { ...finalConfig[name], ...override };
69
+ }
70
70
  const request = async (name, input, defaultMethod = 'GET', extraHeaders) => {
71
71
  const methodConfig = finalConfig[name];
72
72
  if (name.includes(':') && !methodConfig?.path) {
@@ -100,12 +100,12 @@ export function createHypequeryClient(config) {
100
100
  ]);
101
101
  return fetchFn(finalUrl, {
102
102
  method,
103
- headers: {
103
+ headers: clientSchemaHeaders({
104
104
  ...resolvedHeaders,
105
105
  ...(resolvedToken ? { authorization: `Bearer ${resolvedToken}` } : {}),
106
106
  ...(extraHeaders ?? {}),
107
107
  ...(body ? { 'content-type': 'application/json' } : {}),
108
- },
108
+ }, methodConfig?.schemaHash),
109
109
  body,
110
110
  });
111
111
  };
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { createAnalyticsHooks } from './analyticsHooks.js';
3
3
  export { createHypequeryClient } from './client.js';
4
4
  export { HypequeryProvider, useHypequeryClient } from './provider.js';
5
5
  export { HttpError } from './errors.js';
6
- export type { QueryInput, QueryOutput, HttpMethod } from './types.js';
6
+ export type { QueryInput, QueryOutput, QueryOutputForInput, HttpMethod } from './types.js';
7
7
  export type { CreateHooksConfig } from './createHooks.js';
8
8
  export type { ApiContract, HeadersInput, HypequeryClient, HypequeryClientConfig, QueryMethodConfig, RouteManifest, RouteManifestEntry, TokenInput, } from './client.js';
9
9
  export type { HypequeryProviderProps } from './provider.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC"}
@@ -7,7 +7,7 @@ export interface HypequeryProviderProps<Api extends ApiContract = ApiContract> {
7
7
  /** Reuse an application's existing TanStack Query client when supplied. */
8
8
  queryClient?: QueryClient;
9
9
  }
10
- export declare function HypequeryProvider<Api extends ApiContract>({ client, children, queryClient, }: HypequeryProviderProps<Api>): import("react/jsx-runtime").JSX.Element;
10
+ export declare function HypequeryProvider<Api extends ApiContract>({ client, children, queryClient, }: HypequeryProviderProps<Api>): import("react").JSX.Element;
11
11
  export declare function useHypequeryClient<Api extends ApiContract = ApiContract>(): HypequeryClient<Api>;
12
12
  export declare function useOptionalHypequeryClient<Api extends ApiContract = ApiContract>(): HypequeryClient<Api> | null;
13
13
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIhE,MAAM,WAAW,sBAAsB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW;IAC3E,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,WAAW,EAAE,EACzD,MAAM,EACN,QAAQ,EACR,WAAW,GACZ,EAAE,sBAAsB,CAAC,GAAG,CAAC,2CAS7B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,0BAMvE;AAED,wBAAgB,0BAA0B,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,KACvC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CACnE"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIhE,MAAM,WAAW,sBAAsB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW;IAC3E,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,WAAW,EAAE,EACzD,MAAM,EACN,QAAQ,EACR,WAAW,GACZ,EAAE,sBAAsB,CAAC,GAAG,CAAC,+BAS7B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,0BAMvE;AAED,wBAAgB,0BAA0B,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,KACvC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CACnE"}
package/dist/types.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { ClientOutputForInput } from './utils/client-projection.js';
2
+ import type { WithRequestedMeta } from './utils/response-meta.js';
1
3
  export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
2
4
  export type KnownStringKeys<T> = {
3
5
  [K in keyof T]: string extends K ? never : K extends string ? K : never;
@@ -53,10 +55,12 @@ type MetricOutputForInput<TInfo, TInput, TFallback> = TInfo extends {
53
55
  } & {
54
56
  [K in TMetricName]?: string | null;
55
57
  } & PeriodSelection<TInput>> : TFallback;
56
- export type QueryOutputForInput<Api, Name extends ExtractNames<Api>, TInput> = SemanticInfo<Api, Name> extends infer Info ? Info extends {
58
+ type LegacyOutputForInput<Api, Name extends ExtractNames<Api>, TInput> = [SemanticInfo<Api, Name>] extends [never] ? QueryOutput<Api, Name> : SemanticInfo<Api, Name> extends infer Info ? Info extends {
57
59
  kind: 'dataset';
58
60
  } ? DatasetOutputForInput<Info, TInput, QueryOutput<Api, Name>> : Info extends {
59
61
  kind: 'metric';
60
62
  } ? MetricOutputForInput<Info, TInput, QueryOutput<Api, Name>> : QueryOutput<Api, Name> : QueryOutput<Api, Name>;
63
+ /** Narrow generated client rows while retaining the legacy semantic and ordinary API contracts. */
64
+ export type QueryOutputForInput<Api, Name extends ExtractNames<Api>, TInput> = WithRequestedMeta<'__hypequeryClientSemantic' extends keyof Api[Name] ? ClientOutputForInput<NonNullable<Api[Name]['__hypequeryClientSemantic']>, TInput, QueryOutput<Api, Name>> : LegacyOutputForInput<Api, Name, TInput>, TInput>;
61
65
  export {};
62
66
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /** Projection for the versioned data-only client contract emitted by generate:client. */
2
+ type WireValue<Definition> = Definition extends {
3
+ wireType: infer Wire;
4
+ nullable: infer Nullable;
5
+ } ? (Wire extends 'number-or-string' ? number | string : Wire extends 'number' ? number : Wire extends 'boolean' ? boolean : string) | (Nullable extends false ? never : null) : unknown;
6
+ type ArrayNames<Value> = NonNullable<Value> extends readonly (infer Name)[] ? Name : never;
7
+ type IsUnion<T, U = T> = T extends unknown ? ([U] extends [T] ? false : true) : never;
8
+ /** Names one fixed tuple always selects: an element typed as a union may name any of them. */
9
+ type TupleNames<Tuple> = Tuple extends readonly [infer Head, ...infer Rest] ? (IsUnion<Head> extends true ? never : Head) | TupleNames<Rest> : never;
10
+ /** Names every alternative of a (possibly union-typed) tuple selection selects. */
11
+ type CertainNames<Selection> = (Selection extends unknown ? (names: TupleNames<Selection>) => void : never) extends (names: infer Names) => void ? Names : never;
12
+ type SelectedFields<Definitions, Input, Key extends string, Defaults = never> = Key extends keyof Input ? Input extends Record<Key, readonly unknown[]> ? number extends Input[Key]['length'] ? {
13
+ [Name in Extract<ArrayNames<Input[Key]>, keyof Definitions>]?: WireValue<Definitions[Name]>;
14
+ } : {
15
+ [Name in Extract<CertainNames<Input[Key]>, keyof Definitions>]-?: WireValue<Definitions[Name]>;
16
+ } & {
17
+ [Name in Exclude<Extract<ArrayNames<Input[Key]>, keyof Definitions>, CertainNames<Input[Key]>>]?: WireValue<Definitions[Name]>;
18
+ } : {
19
+ [Name in Extract<ArrayNames<Input[Key]> | Defaults, keyof Definitions>]?: WireValue<Definitions[Name]>;
20
+ } : {
21
+ [Name in Extract<Defaults, keyof Definitions>]-?: WireValue<Definitions[Name]>;
22
+ };
23
+ type Period<Input> = Input extends {
24
+ by: string;
25
+ } ? {
26
+ period: string | null;
27
+ } : 'by' extends keyof Input ? {
28
+ period?: string | null;
29
+ } : {};
30
+ type ProjectedOutput<Output, Row> = Omit<Output, 'data'> & {
31
+ data: Row[];
32
+ };
33
+ export type ClientOutputForInput<Info, Input, Fallback> = [Info] extends [never] ? Fallback : Input extends unknown ? Info extends {
34
+ version: 1;
35
+ kind: 'dataset';
36
+ dimensions: infer Dimensions;
37
+ measures: infer Measures;
38
+ defaultMeasures: readonly (infer Default)[];
39
+ } ? ProjectedOutput<Fallback, SelectedFields<Dimensions, Input, 'dimensions'> & SelectedFields<Measures, Input, 'measures', Default> & Period<Input>> : Info extends {
40
+ version: 1;
41
+ kind: 'metric';
42
+ dimensions: infer Dimensions;
43
+ metricName: infer Name extends string;
44
+ } ? ProjectedOutput<Fallback, SelectedFields<Dimensions, Input, 'dimensions'> & {
45
+ [Key in Name]: string | null;
46
+ } & Period<Input>> : Fallback : never;
47
+ export {};
48
+ //# sourceMappingURL=client-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-projection.d.ts","sourceRoot":"","sources":["../../src/utils/client-projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ /** A generated precondition wins over differently cased user/header overrides. */
2
+ export declare function clientSchemaHeaders(headers: Record<string, string>, schemaHash?: string): Record<string, string>;
3
+ //# sourceMappingURL=client-schema-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-schema-headers.d.ts","sourceRoot":"","sources":["../../src/utils/client-schema-headers.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMhH"}
@@ -0,0 +1,9 @@
1
+ /** A generated precondition wins over differently cased user/header overrides. */
2
+ export function clientSchemaHeaders(headers, schemaHash) {
3
+ if (!schemaHash)
4
+ return headers;
5
+ return {
6
+ ...Object.fromEntries(Object.entries(headers).filter(([name]) => name.toLowerCase() !== 'x-hypequery-client-schema')),
7
+ 'X-Hypequery-Client-Schema': schemaHash,
8
+ };
9
+ }
@@ -0,0 +1,12 @@
1
+ /** Response metadata the request guarantees: servers return it whenever it is requested. */
2
+ type RequiredMeta<Output> = Output extends unknown ? 'meta' extends keyof Output ? Omit<Output, 'meta'> & {
3
+ meta: NonNullable<Output['meta']>;
4
+ } : Output : never;
5
+ /** `includeMeta: true` in the input makes `meta` present on the response. */
6
+ export type WithRequestedMeta<Output, Input> = Input extends {
7
+ includeMeta: true;
8
+ } ? RequiredMeta<Output> : Output;
9
+ /** Infinite queries always request metadata (for `meta.pagination`), so every page carries it. */
10
+ export type WithPageMeta<Output> = RequiredMeta<Output>;
11
+ export {};
12
+ //# sourceMappingURL=response-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-meta.d.ts","sourceRoot":"","sources":["../../src/utils/response-meta.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,KAAK,YAAY,CAAC,MAAM,IAAI,MAAM,SAAS,OAAO,GAC9C,MAAM,SAAS,MAAM,MAAM,GACzB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,GAC5D,MAAM,GACR,KAAK,CAAC;AAEV,6EAA6E;AAC7E,MAAM,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,SAAS;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GAC9E,YAAY,CAAC,MAAM,CAAC,GACpB,MAAM,CAAC;AAEX,kGAAkG;AAClG,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypequery/react",
3
- "version": "0.6.4",
3
+ "version": "0.7.1",
4
4
  "description": "Type-safe React and TanStack Query hooks for ClickHouse analytics, metrics, and datasets",
5
5
  "keywords": [
6
6
  "react",
@@ -23,27 +23,33 @@
23
23
  }
24
24
  },
25
25
  "files": [
26
- "dist"
26
+ "dist",
27
+ "!dist/**/*.test.*",
28
+ "!dist/**/*.type-test.*",
29
+ "!dist/**/__tests__/**",
30
+ "!dist/**/tests/**",
31
+ "!dist/**/type-tests/**"
27
32
  ],
28
33
  "sideEffects": false,
29
34
  "peerDependencies": {
30
- "@tanstack/react-query": "^5.104.0",
35
+ "@tanstack/react-query": "^5.104.5",
31
36
  "react": "^18.0.0 || ^19.0.0",
32
37
  "react-dom": "^18.0.0 || ^19.0.0"
33
38
  },
34
39
  "devDependencies": {
35
- "@tanstack/react-query": "^5.104.0",
36
- "@testing-library/react": "^14.2.1",
37
- "@types/react": "^18.2.43",
38
- "@types/react-dom": "^18.2.18",
39
- "@vitest/coverage-v8": "^5.0.2",
40
- "jsdom": "^27.4.0",
41
- "react": "^18.2.0",
42
- "react-dom": "^18.2.0",
43
- "typescript": "^5.7.3",
44
- "vitest": "^5.0.2",
45
- "@hypequery/datasets": "0.22.0",
46
- "@hypequery/serve": "0.20.0"
40
+ "@tanstack/react-query": "^5.104.5",
41
+ "@testing-library/dom": "^10.4.2",
42
+ "@testing-library/react": "^16.3.3",
43
+ "@types/react": "^19.3.0",
44
+ "@types/react-dom": "^19.3.0",
45
+ "@vitest/coverage-v8": "^5.0.5",
46
+ "jsdom": "^30.1.3",
47
+ "react": "^19.3.1",
48
+ "react-dom": "^19.3.1",
49
+ "typescript": "^6.0.3",
50
+ "vitest": "^5.0.5",
51
+ "@hypequery/datasets": "0.25.0",
52
+ "@hypequery/serve": "0.23.0"
47
53
  },
48
54
  "repository": {
49
55
  "type": "git",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=analyticsHooks.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyticsHooks.test.d.ts","sourceRoot":"","sources":["../src/analyticsHooks.test.tsx"],"names":[],"mappings":""}
@@ -1,98 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import { renderHook, waitFor } from '@testing-library/react';
4
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
5
- import { createAnalyticsHooks } from './analyticsHooks.js';
6
- function createWrapper() {
7
- const queryClient = new QueryClient({
8
- defaultOptions: {
9
- queries: { retry: false },
10
- },
11
- });
12
- return ({ children }) => (_jsx(QueryClientProvider, { client: queryClient, children: children }));
13
- }
14
- function mockSuccessResponse(data) {
15
- return {
16
- ok: true,
17
- status: 200,
18
- json: () => Promise.resolve(data),
19
- };
20
- }
21
- describe('createAnalyticsHooks', () => {
22
- const fetchMock = vi.fn();
23
- beforeEach(() => {
24
- fetchMock.mockReset();
25
- });
26
- it('queries metrics through useMetric with metric names only', async () => {
27
- fetchMock.mockResolvedValue(mockSuccessResponse({ data: [{ totalRevenue: 42 }] }));
28
- const { useMetric } = createAnalyticsHooks({
29
- baseUrl: '/api/analytics',
30
- fetchFn: fetchMock,
31
- metrics: ['totalRevenue', 'monthlyRevenue'],
32
- config: {
33
- totalRevenue: { method: 'POST', path: '/api/analytics/metrics/totalRevenue' },
34
- },
35
- });
36
- const { result } = renderHook(() => useMetric('totalRevenue', { dimensions: ['country'] }), { wrapper: createWrapper() });
37
- await waitFor(() => {
38
- expect(result.current.data).toEqual({ data: [{ totalRevenue: 42 }] });
39
- });
40
- expect(fetchMock).toHaveBeenCalledWith('/api/analytics/metrics/totalRevenue', expect.objectContaining({
41
- method: 'POST',
42
- body: JSON.stringify({ dimensions: ['country'] }),
43
- }));
44
- });
45
- it('queries datasets through useDataset without exposing dataset: keys', async () => {
46
- fetchMock.mockResolvedValue(mockSuccessResponse({ data: [{ country: 'US', revenue: 120 }] }));
47
- const { useDataset } = createAnalyticsHooks({
48
- baseUrl: '/api/analytics',
49
- fetchFn: fetchMock,
50
- metrics: [],
51
- config: {
52
- 'dataset:orders': { method: 'POST', path: '/api/analytics/datasets/orders/query' },
53
- },
54
- });
55
- const { result } = renderHook(() => useDataset('orders', { dimensions: ['country'], measures: ['revenue'] }), { wrapper: createWrapper() });
56
- await waitFor(() => {
57
- expect(result.current.data).toEqual({ data: [{ country: 'US', revenue: 120 }] });
58
- });
59
- expect(fetchMock).toHaveBeenCalledWith('/api/analytics/datasets/orders/query', expect.objectContaining({
60
- method: 'POST',
61
- body: JSON.stringify({ dimensions: ['country'], measures: ['revenue'] }),
62
- }));
63
- });
64
- it('supports metric names from the declared semantic metric list', async () => {
65
- fetchMock.mockResolvedValue(mockSuccessResponse({ data: [{ period: '2025-01-01', monthlyRevenue: 90 }] }));
66
- const { useMetric } = createAnalyticsHooks({
67
- baseUrl: '/api/analytics',
68
- fetchFn: fetchMock,
69
- metrics: ['totalRevenue', 'monthlyRevenue'],
70
- config: {
71
- monthlyRevenue: { method: 'POST', path: '/api/analytics/metrics/monthlyRevenue' },
72
- },
73
- });
74
- const { result } = renderHook(() => useMetric('monthlyRevenue', { by: 'month' }), { wrapper: createWrapper() });
75
- await waitFor(() => {
76
- expect(result.current.data).toEqual({ data: [{ period: '2025-01-01', monthlyRevenue: 90 }] });
77
- });
78
- });
79
- it('resolves semantic config paths against an absolute baseUrl host', async () => {
80
- fetchMock.mockResolvedValue(mockSuccessResponse({ data: [{ totalRevenue: 42 }] }));
81
- const { useMetric } = createAnalyticsHooks({
82
- baseUrl: 'https://api.example.com/hypequery',
83
- fetchFn: fetchMock,
84
- metrics: ['totalRevenue', 'monthlyRevenue'],
85
- config: {
86
- totalRevenue: { method: 'POST', path: '/api/analytics/metrics/totalRevenue' },
87
- },
88
- });
89
- const { result } = renderHook(() => useMetric('totalRevenue', { dimensions: ['country'] }), { wrapper: createWrapper() });
90
- await waitFor(() => {
91
- expect(result.current.data).toEqual({ data: [{ totalRevenue: 42 }] });
92
- });
93
- expect(fetchMock).toHaveBeenCalledWith('https://api.example.com/api/analytics/metrics/totalRevenue', expect.objectContaining({
94
- method: 'POST',
95
- body: JSON.stringify({ dimensions: ['country'] }),
96
- }));
97
- });
98
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=createHooks.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createHooks.test.d.ts","sourceRoot":"","sources":["../src/createHooks.test.tsx"],"names":[],"mappings":""}