From b023ac9e34b3a493c20534f4212b5f5128b823b6 Mon Sep 17 00:00:00 2001
From: MUI bot <2109932+Janpot@users.noreply.github.com>
Date: Wed, 24 Jan 2024 18:50:01 +0100
Subject: [PATCH 01/19] WIP
---
examples/custom-server-nextjs/app/layout.tsx | 16 ++
.../app/my-toolpad/[[...path]]/page.tsx | 6 +
examples/custom-server-nextjs/next-env.d.ts | 1 +
examples/custom-server-nextjs/next.config.mjs | 8 +
examples/custom-server-nextjs/package.json | 10 +-
examples/custom-server-nextjs/tsconfig.json | 10 +-
packages/toolpad-app/cli/index.ts | 2 +-
packages/toolpad-app/package.json | 7 +-
.../toolpad-app/src/exports/next-client.tsx | 3 +
packages/toolpad-app/src/exports/next.tsx | 33 ++++
packages/toolpad-app/src/packageInfo.ts | 2 +-
.../toolpad-app/src/runtime/ToolpadApp.tsx | 2 +
.../src/server/FunctionsManager.ts | 4 +-
.../src/server/functionsRuntime.ts | 2 +-
packages/toolpad-app/src/server/index.ts | 2 +-
.../src/server/toolpadAppBuilder.ts | 2 +-
packages/toolpad-app/tsup.config.ts | 2 +-
pnpm-lock.yaml | 155 ++++++++++++++++++
pnpm-workspace.yaml | 1 +
19 files changed, 252 insertions(+), 16 deletions(-)
create mode 100644 examples/custom-server-nextjs/app/layout.tsx
create mode 100644 examples/custom-server-nextjs/app/my-toolpad/[[...path]]/page.tsx
create mode 100644 packages/toolpad-app/src/exports/next-client.tsx
create mode 100644 packages/toolpad-app/src/exports/next.tsx
diff --git a/examples/custom-server-nextjs/app/layout.tsx b/examples/custom-server-nextjs/app/layout.tsx
new file mode 100644
index 00000000000..a14e64fcd5e
--- /dev/null
+++ b/examples/custom-server-nextjs/app/layout.tsx
@@ -0,0 +1,16 @@
+export const metadata = {
+ title: 'Next.js',
+ description: 'Generated by Next.js',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
{children}
+
+ )
+}
diff --git a/examples/custom-server-nextjs/app/my-toolpad/[[...path]]/page.tsx b/examples/custom-server-nextjs/app/my-toolpad/[[...path]]/page.tsx
new file mode 100644
index 00000000000..ec61262d2ca
--- /dev/null
+++ b/examples/custom-server-nextjs/app/my-toolpad/[[...path]]/page.tsx
@@ -0,0 +1,6 @@
+import * as React from 'react';
+import { ToolpadApp } from '@mui/toolpad/next';
+
+export default function ToolpadPage() {
+ return ;
+}
diff --git a/examples/custom-server-nextjs/next-env.d.ts b/examples/custom-server-nextjs/next-env.d.ts
index 4f11a03dc6c..fd36f9494e2 100644
--- a/examples/custom-server-nextjs/next-env.d.ts
+++ b/examples/custom-server-nextjs/next-env.d.ts
@@ -1,5 +1,6 @@
///
///
+///
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/examples/custom-server-nextjs/next.config.mjs b/examples/custom-server-nextjs/next.config.mjs
index 39cb507f56b..dc0f85c7d04 100644
--- a/examples/custom-server-nextjs/next.config.mjs
+++ b/examples/custom-server-nextjs/next.config.mjs
@@ -1,4 +1,12 @@
/** @type {import('next').NextConfig} */
export default {
+ webpack: (config) => {
+ config.externals.push({
+ fsevents: 'commonjs fsevents',
+ chokidar: 'commonjs chokidar',
+ });
+ config.resolve.alias['@mui/icons-material'] = ['@mui/icons-material/esm'];
+ return config;
+ },
basePath: '/my-next-app',
};
diff --git a/examples/custom-server-nextjs/package.json b/examples/custom-server-nextjs/package.json
index 0a2425215d7..52bf8d3e136 100644
--- a/examples/custom-server-nextjs/package.json
+++ b/examples/custom-server-nextjs/package.json
@@ -10,7 +10,13 @@
},
"dependencies": {
"@mui/toolpad": "0.1.46",
- "next": "14.0.2"
+ "chokidar": "3.5.3",
+ "express": "4.18.2",
+ "next": "14.1.0",
+ "react": "18.2.0",
+ "react-dom": "18.2.0"
},
- "devDependencies": {}
+ "devDependencies": {
+ "@types/react": "18.2.48"
+ }
}
diff --git a/examples/custom-server-nextjs/tsconfig.json b/examples/custom-server-nextjs/tsconfig.json
index 1c4f693a991..f7ebea61fe5 100644
--- a/examples/custom-server-nextjs/tsconfig.json
+++ b/examples/custom-server-nextjs/tsconfig.json
@@ -11,8 +11,14 @@
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "preserve"
+ "jsx": "preserve",
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "strictNullChecks": true
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
diff --git a/packages/toolpad-app/cli/index.ts b/packages/toolpad-app/cli/index.ts
index 2d0fed10e51..a6e62dfb509 100644
--- a/packages/toolpad-app/cli/index.ts
+++ b/packages/toolpad-app/cli/index.ts
@@ -14,7 +14,7 @@ export interface RunOptions {
base: string;
}
-import.meta.url ??= url.pathToFileURL(__filename).toString();
+// import.meta.url ??= url.pathToFileURL(__filename).toString();
const currentDirectory = url.fileURLToPath(new URL('.', import.meta.url));
async function runCommand(
diff --git a/packages/toolpad-app/package.json b/packages/toolpad-app/package.json
index fe6a7230b0d..d3b73a6c990 100644
--- a/packages/toolpad-app/package.json
+++ b/packages/toolpad-app/package.json
@@ -29,6 +29,7 @@
"server",
"runtime"
],
+ "type": "module",
"exports": {
"./package.json": "./package.json",
"./cli": {
@@ -36,13 +37,11 @@
},
".": {
"types": "./dist/exports/index.d.ts",
- "import": "./dist/exports/index.mjs",
- "require": "./dist/exports/index.js"
+ "import": "./dist/exports/index.js"
},
"./*": {
"types": "./dist/exports/*.d.ts",
- "import": "./dist/exports/*.mjs",
- "require": "./dist/exports/*.js"
+ "import": "./dist/exports/*.js"
}
},
"dependencies": {
diff --git a/packages/toolpad-app/src/exports/next-client.tsx b/packages/toolpad-app/src/exports/next-client.tsx
new file mode 100644
index 00000000000..e7c04561a81
--- /dev/null
+++ b/packages/toolpad-app/src/exports/next-client.tsx
@@ -0,0 +1,3 @@
+'use client';
+
+export { default } from '../runtime/ToolpadApp';
diff --git a/packages/toolpad-app/src/exports/next.tsx b/packages/toolpad-app/src/exports/next.tsx
new file mode 100644
index 00000000000..294a7d60b24
--- /dev/null
+++ b/packages/toolpad-app/src/exports/next.tsx
@@ -0,0 +1,33 @@
+'use server';
+
+import * as React from 'react';
+import * as appDom from '@mui/toolpad-core/appDom';
+import ToolpadAppClient from './next-client';
+import { initProject } from '../server/localMode';
+import createRuntimeState from '../runtime/createRuntimeState';
+
+export interface ToolpadAppServerProps {
+ base: string;
+ dir: string;
+}
+
+let dom = appDom.createDom();
+dom = appDom.addNode(
+ dom,
+ appDom.createNode(dom, 'page', { attributes: {} }),
+ appDom.getRoot(dom),
+ 'pages',
+);
+
+export async function ToolpadApp({ base, dir = './toolpad' }: ToolpadAppServerProps) {
+ const project = await initProject({
+ dev: false,
+ dir,
+ base,
+ });
+ //
+ // const dom = await project.loadDom();
+ const initialState = createRuntimeState({ dom });
+
+ return ;
+}
diff --git a/packages/toolpad-app/src/packageInfo.ts b/packages/toolpad-app/src/packageInfo.ts
index 8d0ce5017a7..46a15020195 100644
--- a/packages/toolpad-app/src/packageInfo.ts
+++ b/packages/toolpad-app/src/packageInfo.ts
@@ -2,7 +2,7 @@ import * as path from 'path';
import * as url from 'node:url';
import * as fs from 'fs';
-const currentDirectory = url.fileURLToPath(new URL('.', import.meta.url));
+const currentDirectory = url.fileURLToPath(new URL('.', String(import.meta.url)));
const pkgJsonContent = fs.readFileSync(path.resolve(currentDirectory, '../../package.json'), {
encoding: 'utf-8',
diff --git a/packages/toolpad-app/src/runtime/ToolpadApp.tsx b/packages/toolpad-app/src/runtime/ToolpadApp.tsx
index 581de553e2a..7545a21eda4 100644
--- a/packages/toolpad-app/src/runtime/ToolpadApp.tsx
+++ b/packages/toolpad-app/src/runtime/ToolpadApp.tsx
@@ -1,3 +1,5 @@
+'use client';
+
import * as React from 'react';
import {
Stack,
diff --git a/packages/toolpad-app/src/server/FunctionsManager.ts b/packages/toolpad-app/src/server/FunctionsManager.ts
index af7ed4953ff..a9f958e4735 100644
--- a/packages/toolpad-app/src/server/FunctionsManager.ts
+++ b/packages/toolpad-app/src/server/FunctionsManager.ts
@@ -31,8 +31,8 @@ export interface CreateDataProviderOptions {
paginationMode: PaginationMode;
}
-import.meta.url ??= url.pathToFileURL(__filename).toString();
-const currentDirectory = url.fileURLToPath(new URL('.', import.meta.url));
+// import.meta.url ??= url.pathToFileURL(__filename).toString();
+const currentDirectory = url.fileURLToPath(new URL('.', String(import.meta.url)));
async function createDefaultFunction(filePath: string): Promise {
const result = await format(
diff --git a/packages/toolpad-app/src/server/functionsRuntime.ts b/packages/toolpad-app/src/server/functionsRuntime.ts
index 9270891a9d0..c7da6f42c46 100644
--- a/packages/toolpad-app/src/server/functionsRuntime.ts
+++ b/packages/toolpad-app/src/server/functionsRuntime.ts
@@ -6,7 +6,7 @@ import * as z from 'zod';
import { fromZodError } from 'zod-validation-error';
import * as crypto from 'crypto';
-import.meta.url ??= url.pathToFileURL(__filename).toString();
+// import.meta.url ??= url.pathToFileURL(__filename).toString();
async function loadExports(filePath: string): Promise