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 all 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
2 changes: 1 addition & 1 deletion packages/toolpad-core/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export const RUNTIME_PROP_NODE_ID = '__toolpadNodeId';
export const RUNTIME_PROP_SLOTS = '__toolpadSlots';
export const TOOLPAD_COMPONENT = Symbol.for('ToolpadComponent');
export const TOOLPAD_QUERY = Symbol.for('ToolpadQuery');
export const TOOLPAD_FUNCTION = Symbol.for('ToolpadFunction');
export const TOOLPAD_COMPONENT_MODE_PROPERTY = 'ToolpadComponentMode';

export const IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'svg', 'webp'];
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: {} },
});
}
56 changes: 8 additions & 48 deletions packages/toolpad-core/src/createQuery.tsx
Original file line number Diff line number Diff line change
@@ -1,48 +1,8 @@
import { TOOLPAD_QUERY } from './constants.js';
import { PrimitiveValueType } from './types.js';

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

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

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

type CreateQueryConfigParameters<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>> =
QueryResolverParams<C>['parameters'];

export interface QueryResolverParams<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>> {
parameters: {
[K in keyof C['parameters']]: QueryParameterTypeLookup[C['parameters'][K]['typeDef']['type']];
};
}

export interface QueryResolver<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>> {
(params: QueryResolverParams<C>): Promise<unknown>;
}

export interface ToolpadQuery<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>>
extends QueryResolver<C> {
[TOOLPAD_QUERY]: C;
}

export default function createQuery<C extends CreateQueryConfig<CreateQueryConfigParameters<C>>>(
resolver: QueryResolver<C>,
config?: C,
) {
return Object.assign(resolver, {
[TOOLPAD_QUERY]: config || { parameters: {} },
});
}
import createFunction from './createFunction.js';

/**
* @deprecated
* createQuery is deprecated. Use createFunction instead.
*/
const createQuery = createFunction;
export default createQuery;
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