Skip to content

Commit

Permalink
Move App dom to Toolpad core (#3116)
Browse files Browse the repository at this point in the history
  • Loading branch information
Janpot authored Jan 23, 2024
1 parent c3dfcd4 commit c5ffb33
Show file tree
Hide file tree
Showing 59 changed files with 126 additions and 118 deletions.
6 changes: 1 addition & 5 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,7 @@ module.exports = {
// Don't leak the internal runtime abstraction. It's on its way to be moved towards a separate package
target: './packages/toolpad-app/src/runtime',
from: './packages/toolpad-app/src/',
except: [
'./runtime',
// TODO: move ./src/appDom to ./src/runtime/appDom
'./appDom',
],
except: ['./runtime'],
},
],
},
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/canvas/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import invariant from 'invariant';
import { throttle } from 'lodash-es';
import { CanvasEventsContext } from '@mui/toolpad-core/runtime';
import { FlowDirection, SlotType } from '@mui/toolpad-core';
import { update } from '@mui/toolpad-utils/immutability';
import ToolpadApp, { IS_RENDERED_IN_CANVAS } from '../runtime/ToolpadApp';
import { queryClient } from '../runtime/api';
import { AppCanvasState, NodeInfo, PageViewState, SlotsState } from '../types';
Expand All @@ -13,7 +14,6 @@ import {
} from '../utils/geometry';
import { CanvasHooks, CanvasHooksContext } from '../runtime/CanvasHooksContext';
import { ToolpadBridge, bridge, setCommandHandler } from './ToolpadBridge';
import { update } from '../utils/immutability';

const handleScreenUpdate = throttle(
() => {
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/AppThemeProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react';
import { createTheme, Theme, ThemeProvider, ThemeOptions } from '@mui/material';
import { deepmerge } from '@mui/utils';
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';

declare module '@mui/material/styles' {
interface Theme {
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/CanvasHooksContext.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ComponentConfig, NodeHashes } from '@mui/toolpad-core';
import * as React from 'react';
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';

export interface NavigateToPage {
(name: string, pageParameters?: Record<string, string>): void;
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/ToolpadApp.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { LiveBindings, RuntimeEvents } from '@mui/toolpad-core';
import { CanvasEventsContext } from '@mui/toolpad-core/runtime';
import { Emitter } from '@mui/toolpad-utils/events';
import { test, expect, afterEach } from 'vitest';
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import createRuntimeState from './createRuntimeState';
import ToolpadApp from './ToolpadApp';

Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/ToolpadApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ import useBoolean from '@mui/toolpad-utils/hooks/useBoolean';
import usePageTitle from '@mui/toolpad-utils/hooks/usePageTitle';
import invariant from 'invariant';
import useEventCallback from '@mui/utils/useEventCallback';
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { RuntimeState } from './types';
import { getBindingType, getBindingValue } from './bindings';
import {
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/createRuntimeState.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { RuntimeState } from './types';

export interface CreateRuntimeStateParams {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as appDom from '../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';

export const PAGE_ROW_COMPONENT_ID = 'PageRow';
export const PAGE_COLUMN_COMPONENT_ID = 'PageColumn';
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type * as appDom from '../appDom';
import type * as appDom from '@mui/toolpad-core/appDom';

/**
* Defines all the data needed to render the runtime.
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/useAuth.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';

const AUTH_API_PATH = '/api/auth';

Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/runtime/useDataQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import { GridRowsProp } from '@mui/x-data-grid-pro';
import * as React from 'react';
import { useQuery, UseQueryOptions } from '@tanstack/react-query';
import * as appDom from '@mui/toolpad-core/appDom';
import { CanvasHooksContext } from './CanvasHooksContext';
import * as appDom from '../appDom';
import api from './api';

export type UseDataQueryConfig = Pick<
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/server/DataManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import express, { Router } from 'express';
import cors from 'cors';
import invariant from 'invariant';
import { errorFrom, serializeError, SerializedError } from '@mui/toolpad-utils/errors';
import * as appDom from '@mui/toolpad-core/appDom';
import type { RuntimeConfig, Methods, ServerDataSource, ToolpadProjectOptions } from '../types';
import serverDataSources from '../toolpadDataSources/server';
import * as appDom from '../appDom';
import applyTransform from '../toolpadDataSources/applyTransform';
import { asyncHandler } from '../utils/express';
import type FunctionsManager from './FunctionsManager';
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/server/appServerWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { parentPort, workerData, MessagePort } from 'worker_threads';
import invariant from 'invariant';
import type { Plugin } from 'vite';
import { createRpcClient } from '@mui/toolpad-utils/workerRpc';
import type * as appDom from '@mui/toolpad-core/appDom';
import { getHtmlContent, createViteConfig } from './toolpadAppBuilder';
import type { RuntimeConfig } from '../types';
import type * as appDom from '../appDom';
import type { ComponentEntry, PagesManifest } from './localMode';
import createRuntimeState from '../runtime/createRuntimeState';
import { postProcessHtml } from './toolpadAppServer';
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/server/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import GoogleProvider from '@auth/core/providers/google';
import { getToken } from '@auth/core/jwt';
import { AuthConfig, TokenSet } from '@auth/core/types';
import { OAuthConfig } from '@auth/core/providers';
import * as appDom from '@mui/toolpad-core/appDom';
import { asyncHandler } from '../utils/express';
import { adaptRequestFromExpressToFetch } from './httpApiAdapters';
import { ToolpadProject } from './localMode';
import * as appDom from '../appDom';

export function createAuthHandler(project: ToolpadProject): Router {
const { base } = project.options;
Expand Down
31 changes: 28 additions & 3 deletions packages/toolpad-app/src/server/localMode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import * as yaml from 'yaml';
import invariant from 'invariant';
import openEditor from 'open-editor';
import chalk from 'chalk';
import { BindableAttrValue, PropBindableAttrValue } from '@mui/toolpad-core';
import { BindableAttrValue, EnvAttrValue, PropBindableAttrValue } from '@mui/toolpad-core';
import { fromZodError } from 'zod-validation-error';
import { glob } from 'glob';
import * as chokidar from 'chokidar';
Expand All @@ -25,7 +25,7 @@ import {
} from '@mui/toolpad-utils/fs';
import { z } from 'zod';
import { Awaitable } from '@mui/toolpad-utils/types';
import * as appDom from '../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import insecureHash from '../utils/insecureHash';
import {
Page,
Expand All @@ -44,6 +44,7 @@ import {
API_VERSION,
applicationSchema,
Application,
envBindingSchema,
} from './schema';
import { format, resolvePrettierConfig } from '../utils/prettier';
import {
Expand Down Expand Up @@ -939,6 +940,30 @@ async function calculateDomFingerprint(root: string): Promise<number> {
return insecureHash(JSON.stringify(mtimes));
}

function findEnvBindings(obj: unknown): EnvAttrValue[] {
if (Array.isArray(obj)) {
return obj.flatMap((item) => findEnvBindings(item));
}

if (obj && typeof obj === 'object') {
try {
return [envBindingSchema.parse(obj)];
} catch {
return Object.values(obj).flatMap((value) => findEnvBindings(value));
}
}

return [];
}

export function getRequiredEnvVars(dom: appDom.AppDom): Set<string> {
const allVars = Object.values(dom.nodes)
.flatMap((node) => findEnvBindings(node))
.map((binding) => binding.$$env);

return new Set(allVars);
}

class ToolpadProject {
private root: string;

Expand Down Expand Up @@ -1095,7 +1120,7 @@ class ToolpadProject {
}

alertOnMissingVariablesInDom(dom: appDom.AppDom) {
const requiredVars = appDom.getRequiredEnvVars(dom);
const requiredVars = getRequiredEnvVars(dom);
const missingVars = Array.from(requiredVars).filter(
(key) => typeof process.env[key] === 'undefined',
);
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/server/toolpadAppBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import * as url from 'node:url';
import type { InlineConfig, Plugin } from 'vite';
import react from '@vitejs/plugin-react';
import { indent } from '@mui/toolpad-utils/strings';
import * as appDom from '@mui/toolpad-core/appDom';
import type { ComponentEntry, PagesManifest } from './localMode';
import { INITIAL_STATE_WINDOW_PROPERTY } from '../constants';
import * as appDom from '../appDom';
import { pathToNodeImportSpecifier } from '../utils/paths';
import viteVirtualPlugin, { VirtualFileContent, replaceFiles } from './viteVirtualPlugin';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,10 @@ import {
import GitHubIcon from '@mui/icons-material/GitHub';
import GoogleIcon from '@mui/icons-material/Google';
import { TabContext, TabList } from '@mui/lab';
import { updateArray } from '@mui/toolpad-utils/immutability';
import * as appDom from '@mui/toolpad-core/appDom';
import { useAppState, useAppStateApi } from '../AppState';
import * as appDom from '../../appDom';
import TabPanel from '../../components/TabPanel';
import { AuthProviderConfig, AuthProvider } from '../../types';
import { updateArray } from '../../utils/immutability';

const AUTH_PROVIDERS = new Map([
['github', { name: 'GitHub', Icon: GitHubIcon }],
Expand All @@ -52,7 +51,7 @@ export function AppAuthenticationEditor() {
const appState = useAppStateApi();

const handleAuthProvidersChange = React.useCallback(
(event: SelectChangeEvent<AuthProvider[]>) => {
(event: SelectChangeEvent<appDom.AuthProvider[]>) => {
const {
target: { value: providers },
} = event;
Expand All @@ -63,7 +62,7 @@ export function AppAuthenticationEditor() {
draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authentication', {
...app.attributes?.authentication,
providers: (typeof providers === 'string' ? providers.split(',') : providers).map(
(provider) => ({ provider }) as AuthProviderConfig,
(provider) => ({ provider }) as appDom.AuthProviderConfig,
),
});

Expand Down Expand Up @@ -114,7 +113,7 @@ export function AppAuthenticationEditor() {
</Typography>
<FormControl>
<InputLabel id="auth-providers-label">Authentication providers</InputLabel>
<Select<AuthProvider[]>
<Select<appDom.AuthProvider[]>
labelId="auth-providers-label"
label="Authentication providers"
id="auth-providers"
Expand All @@ -131,7 +130,7 @@ export function AppAuthenticationEditor() {
{[...AUTH_PROVIDERS].map(([value, { name, Icon }]) => (
<MenuItem key={value} value={value}>
<Stack direction="row" alignItems="center">
<Checkbox checked={authProviders.indexOf(value as AuthProvider) > -1} />
<Checkbox checked={authProviders.indexOf(value as appDom.AuthProvider) > -1} />
<Icon fontSize="small" />
<Typography ml={1}>{name}</Typography>
</Stack>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import useDebounced from '@mui/toolpad-utils/hooks/useDebounced';
import { errorFrom } from '@mui/toolpad-utils/errors';
import useLatest from '@mui/toolpad-utils/hooks/useLatest';
import { WithControlledProp, Maybe } from '@mui/toolpad-utils/types';
import * as appDom from '@mui/toolpad-core/appDom';
import { JsExpressionEditor } from './PageEditor/JsExpressionEditor';
import JsonView from '../../components/JsonView';
import { useEvaluateLiveBinding } from './useEvaluateLiveBinding';
Expand All @@ -51,7 +52,6 @@ import useUnsavedChangesConfirm from '../hooks/useUnsavedChangesConfirm';
import TabPanel from '../../components/TabPanel';

import { useAppState } from '../AppState';
import * as appDom from '../../appDom';
import { getBindingType, getBindingValue } from '../../runtime/bindings';

import { useProjectApi } from '../../projectApi';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import * as React from 'react';
import { Box, Container, Stack, Typography } from '@mui/material';
import { NodeId } from '@mui/toolpad-core';
import invariant from 'invariant';
import * as appDom from '@mui/toolpad-core/appDom';
import { ConnectionEditorProps, ClientDataSource } from '../../../types';
import { useAppState, useDomApi } from '../../AppState';
import * as appDom from '../../../appDom';
import dataSources from '../../../toolpadDataSources/client';
import { ConnectionContextProvider } from '../../../toolpadDataSources/context';
import NodeNameEditor from '../NodeNameEditor';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as React from 'react';
import * as appDom from '../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';

export default React.createContext<appDom.ElementNode | undefined>(undefined);
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Box, Typography } from '@mui/material';
import { TreeView, TreeItem, TreeItemProps } from '@mui/x-tree-view';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import ChevronRightIcon from '@mui/icons-material/ChevronRight';
import * as appDom from '../../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { useAppState, useDomApi, useAppStateApi } from '../../AppState';
import { ComponentIcon } from '../PageEditor/ComponentCatalog/ComponentCatalogItem';
import { DomView } from '../../../utils/domView';
Expand Down
2 changes: 1 addition & 1 deletion packages/toolpad-app/src/toolpad/AppEditor/NodeMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ContentCopyIcon from '@mui/icons-material/ContentCopy';
import ModeEditIcon from '@mui/icons-material/ModeEdit';
import { NodeId } from '@mui/toolpad-core';
import useLatest from '@mui/toolpad-utils/hooks/useLatest';
import * as appDom from '../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { useAppState } from '../AppState';
import { ConfirmDialog } from '../../components/SystemDialogs';
import useMenu from '../../utils/useMenu';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SxProps, TextField } from '@mui/material';
import * as React from 'react';
import * as appDom from '../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { useAppState, useDomApi } from '../AppState';
import { useNodeNameValidation } from './PagesExplorer/validation';
import { useProjectApi } from '../../projectApi';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { IconButton, InputAdornment, TextField, Tooltip } from '@mui/material';
import * as React from 'react';
import ResetIcon from '@mui/icons-material/RestartAlt';
import * as appDom from '../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { useDomApi } from '../AppState';

interface PageDisplayNameEditorProps {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import invariant from 'invariant';
import InputAdornment from '@mui/material/InputAdornment';
import AccountCircle from '@mui/icons-material/Search';
import { uncapitalize } from '@mui/toolpad-utils/strings';
import * as appDom from '@mui/toolpad-core/appDom';
import ComponentCatalogItem from './ComponentCatalogItem';
import CreateCodeComponentNodeDialog from '../../PagesExplorer/CreateCodeComponentNodeDialog';
import * as appDom from '../../../../appDom';
import { useAppState } from '../../../AppState';
import { usePageEditorApi } from '../PageEditorProvider';
import { useToolpadComponents } from '../../toolpadComponents';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
LiveBinding,
} from '@mui/toolpad-core';
import { ExactEntriesOf } from '@mui/toolpad-utils/types';
import * as appDom from '../../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import NodeAttributeEditor from './NodeAttributeEditor';
import { usePageEditorState } from './PageEditorProvider';
import { useToolpadComponent } from '../toolpadComponents';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { TabContext, TabList, TabPanel } from '@mui/lab';
import { Tab, Box, styled, Typography, Link } from '@mui/material';
import * as React from 'react';
import * as appDom from '@mui/toolpad-core/appDom';
import PageOptionsPanel from './PageOptionsPanel';
import ComponentEditor from './ComponentEditor';
import ThemeEditor from './ThemeEditor';
import { useAppState, useAppStateApi } from '../../AppState';
import { PageViewTab } from '../../../utils/domView';
import * as appDom from '../../../appDom';

const classes = {
panel: 'Toolpad_Panel',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import { NodeId } from '@mui/toolpad-core';
import { asArray } from '@mui/toolpad-utils/collections';
import { Maybe, WithControlledProp } from '@mui/toolpad-utils/types';
import * as appDom from '../../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { useAppState } from '../../AppState';
import dataSources from '../../../toolpadDataSources/client';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
} from '@mui/toolpad-core';
import { Alert, Box, SxProps } from '@mui/material';
import { useBrowserJsRuntime } from '@mui/toolpad-core/jsBrowserRuntime';
import * as appDom from '../../../appDom';
import * as appDom from '@mui/toolpad-core/appDom';
import { useDomApi } from '../../AppState';
import BindableEditor from './BindableEditor';
import { usePageEditorState } from './PageEditorProvider';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { NodeId, LiveBindings, ScopeMeta, ApplicationVm } from '@mui/toolpad-core';
import * as React from 'react';
import * as appDom from '../../../appDom';
import { update, updateOrCreate } from '@mui/toolpad-utils/immutability';
import * as appDom from '@mui/toolpad-core/appDom';
import { PageViewState } from '../../../types';
import { RectangleEdge } from '../../../utils/geometry';
import { update, updateOrCreate } from '../../../utils/immutability';

export const DROP_ZONE_TOP = 'top';
export const DROP_ZONE_BOTTOM = 'bottom';
Expand Down
Loading

0 comments on commit c5ffb33

Please sign in to comment.