Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deprecate createQuery and replace with createFunction #1908

Merged
merged 5 commits into from
Apr 19, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,12 @@ The most powerful way of bringing data into Toolpad is through serverside JavaSc

## Parameters

To be really useful, these backend functions need to be parametrizable with actual state on the page. You can do so by wrapping them in our `createQuery` function.
To be really useful, these backend functions need to be parametrizable with actual state on the page. You can do so by wrapping them in our `createFunction` method.

```tsx
import { createQuery } from '@mui/toolpad/server';
import { createFunction } from '@mui/toolpad/server';

export const example = createQuery(
export const example = createFunction(
async ({ parameters }) => {
return {
message: `3 x ${parameters.value} = ${parameters.value * 3}`,
Expand Down
5 changes: 3 additions & 2 deletions packages/toolpad-app/src/toolpadDataSources/local/client.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { BindableAttrEntries, CreateQueryConfig } from '@mui/toolpad-core';
import { BindableAttrEntries, CreateFunctionConfig } from '@mui/toolpad-core';
import { Autocomplete, Button, Stack, TextField, Typography } from '@mui/material';
import { useBrowserJsRuntime } from '@mui/toolpad-core/jsBrowserRuntime';
import { ClientDataSource, QueryEditorProps } from '../../types';
Expand Down Expand Up @@ -42,7 +42,8 @@ function QueryEditor({
);

const functionName: string | undefined = input.attributes.query.value.function;
const functionDefs: Record<string, CreateQueryConfig<any>> = introspection.data?.functions ?? {};
const functionDefs: Record<string, CreateFunctionConfig<any>> = introspection.data?.functions ??
{};
const parameterDefs = (functionName ? functionDefs?.[functionName]?.parameters : null) || {};

const paramsEntries = input.params?.filter(([key]) => !!parameterDefs[key]) || EMPTY_PARAMS;
Expand Down
12 changes: 6 additions & 6 deletions packages/toolpad-app/src/toolpadDataSources/local/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ function formatCodeFrame(location: esbuild.Location): string {
async function createMain(): Promise<string> {
const relativeFunctionsFilePath = [`.`, getFunctionsFile('.')].join(path.sep);
return `
import { TOOLPAD_QUERY } from '@mui/toolpad-core/server';
import { TOOLPAD_FUNCTION } from '@mui/toolpad-core/server';
import { errorFrom, serializeError } from '@mui/toolpad-core/utils/errors';
import fetch, { Headers, Request, Response } from 'node-fetch'

Expand All @@ -92,7 +92,7 @@ async function createMain(): Promise<string> {
global.Response = Response
}

async function loadQuery (name, importFn) {
async function loadFunction (name, importFn) {
const { default: resolver } = await importFn()
return [name, resolver]
}
Expand All @@ -101,18 +101,18 @@ async function createMain(): Promise<string> {
async function getResolvers() {
if (!resolversPromise) {
resolversPromise = (async () => {
const queries = await import(${JSON.stringify(
const functions = await import(${JSON.stringify(
relativeFunctionsFilePath,
)}).catch((err) => {
console.error(err);
return {};
});

const queriesFileResolvers = Object.entries(queries).flatMap(([name, resolver]) => {
const functionsFileResolvers = Object.entries(functions).flatMap(([name, resolver]) => {
return typeof resolver === 'function' ? [[name, resolver]] : []
})

return new Map(queriesFileResolvers);
return new Map(functionsFileResolvers);
})();
}
return resolversPromise
Expand Down Expand Up @@ -158,7 +158,7 @@ async function createMain(): Promise<string> {
const resolvers = await getResolvers()
const resolvedResolvers = Array.from(resolvers, ([name, resolver]) => [
name,
resolver[TOOLPAD_QUERY] || {}
resolver[TOOLPAD_FUNCTION] || {}
]);
data = {
functions: Object.fromEntries(resolvedResolvers.filter(Boolean))
Expand Down
4 changes: 2 additions & 2 deletions packages/toolpad-app/src/toolpadDataSources/local/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BindableAttrValue, CreateQueryConfig, ExecFetchResult } from '@mui/toolpad-core';
import { BindableAttrValue, CreateFunctionConfig, ExecFetchResult } from '@mui/toolpad-core';

export interface LocalConnectionParams {}

Expand Down Expand Up @@ -29,5 +29,5 @@ export interface FetchResult extends ExecFetchResult<any> {
}

export type IntrospectionResult = {
functions: Record<string, CreateQueryConfig<unknown>>;
functions: Record<string, CreateFunctionConfig<unknown>>;
};
1 change: 0 additions & 1 deletion packages/toolpad-components/src/DataGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,6 @@ interface CustomColumnProps {
function CustomColumn({ params }: CustomColumnProps) {
const { value, colDef, row, field } = params;
const column = colDef as SerializableGridColumn;

const components = useComponents();
const Component = components[`codeComponent.${column.codeComponent}`];

Expand Down
5 changes: 5 additions & 0 deletions packages/toolpad-core/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
export const RUNTIME_PROP_NODE_ID = '__toolpadNodeId';
export const RUNTIME_PROP_SLOTS = '__toolpadSlots';
export const TOOLPAD_COMPONENT = Symbol.for('ToolpadComponent');
export const TOOLPAD_FUNCTION = Symbol.for('ToolpadFunction');
/**
* @deprecated
* TOOLPAD_QUERY is deprecated. Use TOOLPAD_FUNCTION instead.
Copy link
Member

@Janpot Janpot Apr 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TOOLPAD_QUERY is not public API, you can just rename

*/
export const TOOLPAD_QUERY = Symbol.for('ToolpadQuery');
export const TOOLPAD_COMPONENT_MODE_PROPERTY = 'ToolpadComponentMode';

Expand Down
52 changes: 52 additions & 0 deletions packages/toolpad-core/src/createFunction.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { TOOLPAD_FUNCTION } from './constants.js';
import { PrimitiveValueType } from './types.js';

interface ParameterTypeLookup {
number: number;
string: string;
boolean: boolean;
array: unknown[];
object: Record<string, unknown>;
}

export interface FunctionParameterConfig<P, K extends keyof P> {
typeDef: PrimitiveValueType;
defaultValue?: P[K];
}

export interface CreateFunctionConfig<P> {
parameters: {
[K in keyof P]: FunctionParameterConfig<P, K>;
};
}

type CreateFunctionConfigParameters<
C extends CreateFunctionConfig<CreateFunctionConfigParameters<C>>,
> = FunctionResolverParams<C>['parameters'];

export interface FunctionResolverParams<
C extends CreateFunctionConfig<CreateFunctionConfigParameters<C>>,
> {
parameters: {
[K in keyof C['parameters']]: ParameterTypeLookup[C['parameters'][K]['typeDef']['type']];
};
}

export interface FunctionResolver<
C extends CreateFunctionConfig<CreateFunctionConfigParameters<C>>,
> {
(params: FunctionResolverParams<C>): Promise<unknown>;
}

export interface ToolpadFunction<C extends CreateFunctionConfig<CreateFunctionConfigParameters<C>>>
extends FunctionResolver<C> {
[TOOLPAD_FUNCTION]: C;
}

export default function createFunction<
C extends CreateFunctionConfig<CreateFunctionConfigParameters<C>>,
>(resolver: FunctionResolver<C>, config?: C) {
return Object.assign(resolver, {
[TOOLPAD_FUNCTION]: config || { parameters: {} },
});
}
24 changes: 24 additions & 0 deletions packages/toolpad-core/src/createQuery.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,19 @@ interface QueryParameterTypeLookup {
object: Record<string, unknown>;
}

/**
* @deprecated
* QueryParameterConfig is deprecated. Use FunctionParameterConfig instead.
*/
export interface QueryParameterConfig<P, K extends keyof P> {
typeDef: PrimitiveValueType;
defaultValue?: P[K];
}

/**
* @deprecated
* CreateQueryConfig is deprecated. Use CreateFunctionConfig instead.
*/
export interface CreateQueryConfig<P> {
parameters: {
[K in keyof P]: QueryParameterConfig<P, K>;
Expand All @@ -23,21 +31,37 @@ export interface CreateQueryConfig<P> {
type CreateQueryConfigParameters<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>> =
QueryResolverParams<C>['parameters'];

/**
* @deprecated
* QueryResolverParams is deprecated. Use FunctionResolverParams instead.
*/
export interface QueryResolverParams<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>> {
parameters: {
[K in keyof C['parameters']]: QueryParameterTypeLookup[C['parameters'][K]['typeDef']['type']];
};
}

/**
* @deprecated
* QueryResolver is deprecated. Use FunctionResolver instead.
*/
export interface QueryResolver<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>> {
(params: QueryResolverParams<C>): Promise<unknown>;
}

/**
* @deprecated
* ToolpadQuery is deprecated. Use ToolpaFunction instead.
*/
export interface ToolpadQuery<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>>
extends QueryResolver<C> {
[TOOLPAD_QUERY]: C;
}

/**
* @deprecated
* createQuery is deprecated. Use createFunction instead.
*/
export default function createQuery<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>>(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to avoid duplication this way?

import createFunction from './createFuction'

/**
 * @deprecated
 * createQuery is deprecated. Use createFunction instead.
 */
const createQuery = createFunction
export default createQuery

resolver: QueryResolver<C>,
config?: C,
Expand Down
3 changes: 3 additions & 0 deletions packages/toolpad-core/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,6 @@ export * from './componentsContext.js';

export { default as createQuery } from './createQuery.js';
export * from './createQuery.js';

export { default as createFunction } from './createFunction.js';
export * from './createFunction.js';
3 changes: 3 additions & 0 deletions packages/toolpad-core/src/server.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
export * from './constants.js';
export { default as createQuery } from './createQuery.js';
export * from './createQuery.js';

export { default as createFunction } from './createFunction.js';
export * from './createFunction.js';
4 changes: 2 additions & 2 deletions test/integration/backend-basic/fixture/toolpad/queries.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createQuery } from '@mui/toolpad/server';
import { createFunction } from '@mui/toolpad/server';

export async function hello() {
return { message: 'hello world' };
Expand All @@ -8,7 +8,7 @@ export async function throws() {
throw new Error('BOOM!');
}

export const echo = createQuery(
export const echo = createFunction(
async function echo({ parameters }) {
return {
params: parameters,
Expand Down