@lowdefy/server-e2e 0.0.0-experimental-20260608135213 → 0.0.0-experimental-20260610101734

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.
Files changed (38) hide show
  1. package/{pages/_app.js → client/App.jsx} +39 -28
  2. package/client/Page.jsx +93 -0
  3. package/client/main.jsx +39 -0
  4. package/lib/build/app.js +8 -1
  5. package/lib/build/appMeta.js +8 -1
  6. package/lib/build/auth.js +8 -1
  7. package/lib/build/config.js +8 -1
  8. package/lib/build/i18n.js +26 -0
  9. package/lib/build/logger.js +8 -1
  10. package/lib/build/theme.js +8 -1
  11. package/lib/client/auth/{Auth.js → Auth.jsx} +5 -1
  12. package/lib/server/auth/{getServerSession.js → session.js} +5 -3
  13. package/package.json +38 -32
  14. package/package.original.json +41 -35
  15. package/postcss.config.cjs +1 -0
  16. package/src/app.js +71 -0
  17. package/src/html/getAssets.js +45 -0
  18. package/src/html/renderPage.js +76 -0
  19. package/src/html/template.js +94 -0
  20. package/src/index.js +35 -0
  21. package/src/lib/getPathSegments.js +25 -0
  22. package/src/lib/safeScriptJson.js +38 -0
  23. package/src/middleware/apiContext.js +82 -0
  24. package/src/middleware/errorHandler.js +45 -0
  25. package/src/routes/apiPage.js +35 -0
  26. package/{pages/api/client-error.js → src/routes/clientError.js} +14 -18
  27. package/{pages/api/endpoints/[...endpointId].js → src/routes/endpoints.js} +8 -7
  28. package/{pages/api/request/[...path].js → src/routes/request.js} +10 -10
  29. package/{pages/api/auth/session.js → src/routes/sessionMock.js} +4 -5
  30. package/{pages/api → src/routes}/usage.js +13 -8
  31. package/vite.config.js +45 -0
  32. package/lib/client/Page.js +0 -57
  33. package/lib/server/apiWrapper.js +0 -80
  34. package/lib/server/serverSidePropsWrapper.js +0 -64
  35. package/next.config.js +0 -20
  36. package/pages/404.js +0 -49
  37. package/pages/[[...pageId]].js +0 -85
  38. package/pages/_document.js +0 -106
@@ -14,24 +14,20 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
- // CSS layer order — MUST be the first CSS import. Next.js treats this as critical
18
- // CSS that loads before hydration, locking the cascade priority (antd > base/preflight)
19
- // before antd's StyleProvider injects @layer antd {} at runtime.
20
- import '../build/layer-order.css';
21
-
22
17
  import React, { useCallback, useRef } from 'react';
23
- import dynamic from 'next/dynamic';
24
18
 
25
19
  import { ErrorBoundary } from '@lowdefy/block-utils';
26
- import { useDarkMode } from '@lowdefy/client';
20
+ import { useDarkMode, useLocale } from '@lowdefy/client';
27
21
  import { StyleProvider } from '@ant-design/cssinjs';
28
- import { App as AntdApp, ConfigProvider, theme as antdTheme } from 'antd';
22
+ import { App as AntdApp, theme as antdTheme } from 'antd';
23
+ import { XProvider } from '@ant-design/x';
29
24
 
30
- import Auth from '../lib/client/auth/Auth.js';
25
+ import antdLocaleLoaders from '../build/i18n/antdLocales.js';
26
+ import antdXLocaleLoaders from '../build/i18n/antdXLocales.js';
27
+ import dayjsLocaleMap from '../build/i18n/dayjsLocales.js';
28
+ import Auth from '../lib/client/auth/Auth.jsx';
31
29
  import createLogUsage from '../lib/client/createLogUsage.js';
32
-
33
- // Must be in _app due to next specifications.
34
- import '../build/globals.css';
30
+ import Page from './Page.jsx';
35
31
 
36
32
  function ThemeTokenResolver({ lowdefyRef, children }) {
37
33
  const { token } = antdTheme.useToken();
@@ -42,7 +38,9 @@ function ThemeTokenResolver({ lowdefyRef, children }) {
42
38
  return children;
43
39
  }
44
40
 
45
- function App({ Component, pageProps: { session, rootConfig, pageConfig } }) {
41
+ function App({ config }) {
42
+ const { rootConfig, session } = config;
43
+
46
44
  const usageDataRef = useRef({});
47
45
  const lowdefyRef = useRef({ eventCallback: createLogUsage({ usageDataRef }) });
48
46
  if (rootConfig?.theme) {
@@ -54,6 +52,17 @@ function App({ Component, pageProps: { session, rootConfig, pageConfig } }) {
54
52
  configDarkMode: lowdefyRef.current.theme?.darkMode,
55
53
  });
56
54
 
55
+ const { active: activeLocale, antdLocale, antdXLocale } = useLocale({
56
+ i18n: rootConfig?.i18n,
57
+ antdLocaleLoaders,
58
+ antdXLocaleLoaders,
59
+ dayjsLocaleMap,
60
+ });
61
+
62
+ if (rootConfig?.i18n?.defaultLocale) {
63
+ lowdefyRef.current.i18n = { ...rootConfig.i18n, active: activeLocale };
64
+ }
65
+
57
66
  const {
58
67
  lightToken: _lightToken,
59
68
  darkToken: _darkToken,
@@ -70,9 +79,22 @@ function App({ Component, pageProps: { session, rootConfig, pageConfig } }) {
70
79
  }
71
80
  }, []);
72
81
 
82
+ // XProvider extends antd's ConfigProvider; merging antd + antd-X locale packs
83
+ // gives X components (Bubble, Sender, Conversations, ...) their built-in strings
84
+ // alongside antd's. antd X ships only en_US + zh_CN; other locales fall back
85
+ // to en_US for X-native strings.
86
+ const mergedLocale =
87
+ antdLocale || antdXLocale ? { ...(antdLocale ?? {}), ...(antdXLocale ?? {}) } : undefined;
88
+
73
89
  return (
74
90
  <StyleProvider layer>
75
- <ConfigProvider
91
+ <XProvider
92
+ locale={mergedLocale}
93
+ form={
94
+ antdLocale?.Form?.defaultValidateMessages
95
+ ? { validateMessages: antdLocale.Form.defaultValidateMessages }
96
+ : undefined
97
+ }
76
98
  theme={{
77
99
  ...antdConfig,
78
100
  token,
@@ -88,26 +110,15 @@ function App({ Component, pageProps: { session, rootConfig, pageConfig } }) {
88
110
  <Auth session={session}>
89
111
  {(auth) => {
90
112
  usageDataRef.current.user = auth.session?.hashed_id;
91
- return (
92
- <Component
93
- auth={auth}
94
- lowdefy={lowdefyRef.current}
95
- rootConfig={rootConfig}
96
- pageConfig={pageConfig}
97
- />
98
- );
113
+ return <Page auth={auth} config={config} lowdefy={lowdefyRef.current} />;
99
114
  }}
100
115
  </Auth>
101
116
  </ErrorBoundary>
102
117
  </ThemeTokenResolver>
103
118
  </AntdApp>
104
- </ConfigProvider>
119
+ </XProvider>
105
120
  </StyleProvider>
106
121
  );
107
122
  }
108
123
 
109
- const DynamicApp = dynamic(() => Promise.resolve(App), {
110
- ssr: false,
111
- });
112
-
113
- export default DynamicApp;
124
+ export default App;
@@ -0,0 +1,93 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ import React, { useEffect, useRef, useState } from 'react';
18
+
19
+ import Client from '@lowdefy/client';
20
+ import createRouter from '@lowdefy/client/adapters/createRouter.js';
21
+ import createLinkComponent from '@lowdefy/client/adapters/Link.js';
22
+ import Head from '@lowdefy/client/adapters/Head.js';
23
+
24
+ import actions from '../build/plugins/actions.js';
25
+ import blockMetas from '../build/plugins/blockMetas.json';
26
+ import blocks from '../build/plugins/blocks.js';
27
+ import icons from '../build/plugins/icons.js';
28
+ import operators from '../build/plugins/operators/client.js';
29
+ import jsMap from '../build/plugins/operators/clientJsMap.js';
30
+
31
+ // Replaces lib/client/Page.js. The first page renders from the config
32
+ // embedded in the HTML; SPA navigations fetch /api/page/* and swap pageConfig.
33
+ function Page({ auth, config, lowdefy }) {
34
+ const [pageConfig, setPageConfig] = useState(config.pageConfig);
35
+
36
+ const routerRef = useRef(null);
37
+ if (!routerRef.current) {
38
+ const router = createRouter({ basePath: config.basePath ?? '', window });
39
+ routerRef.current = {
40
+ router,
41
+ Link: createLinkComponent({ router }),
42
+ };
43
+ }
44
+ const { router, Link } = routerRef.current;
45
+
46
+ useEffect(() => {
47
+ const unsubscribe = router.subscribe(async ({ pageId }) => {
48
+ const targetPageId = pageId ?? config.rootConfig.home.pageId;
49
+ try {
50
+ const res = await fetch(`${router.basePath}/api/page/${targetPageId}`);
51
+ if (!res.ok) {
52
+ if (targetPageId !== '404') {
53
+ router.replace({ pathname: '/404' });
54
+ }
55
+ return;
56
+ }
57
+ const { pageConfig: nextPageConfig } = await res.json();
58
+ setPageConfig(nextPageConfig);
59
+ } catch (error) {
60
+ // Network failure on SPA navigation — fall back to a full page load.
61
+ window.location.assign(
62
+ `${router.basePath}/${targetPageId === config.rootConfig.home.pageId ? '' : targetPageId}`
63
+ );
64
+ }
65
+ });
66
+ return unsubscribe;
67
+ }, []);
68
+
69
+ return (
70
+ <Client
71
+ auth={auth}
72
+ Components={{ Head, Link }}
73
+ config={{
74
+ pageConfig,
75
+ rootConfig: config.rootConfig,
76
+ }}
77
+ jsMap={jsMap}
78
+ lowdefy={lowdefy}
79
+ router={router}
80
+ stage="e2e"
81
+ types={{
82
+ actions,
83
+ blockMetas,
84
+ blocks,
85
+ icons,
86
+ operators,
87
+ }}
88
+ window={window}
89
+ />
90
+ );
91
+ }
92
+
93
+ export default Page;
@@ -0,0 +1,39 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ // CSS layer order — MUST be the first CSS import. This locks the cascade
18
+ // priority (antd > base/preflight) before antd's StyleProvider injects
19
+ // @layer antd {} at runtime.
20
+ import '../build/layer-order.css';
21
+
22
+ import React from 'react';
23
+ import { createRoot } from 'react-dom/client';
24
+
25
+ import App from './App.jsx';
26
+
27
+ import '../build/globals.css';
28
+
29
+ const config = JSON.parse(document.getElementById('__LOWDEFY_CONFIG__').textContent);
30
+ const container = document.getElementById('root');
31
+
32
+ // Keep one React root across Vite HMR updates — re-running createRoot on a
33
+ // container that already has a root is an error.
34
+ const root = import.meta.hot?.data.root ?? createRoot(container);
35
+ if (import.meta.hot) {
36
+ import.meta.hot.data.root = root;
37
+ }
38
+
39
+ root.render(<App config={config} />);
package/lib/build/app.js CHANGED
@@ -13,7 +13,14 @@
13
13
  See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
16
22
  import { serializer } from '@lowdefy/helpers';
17
- import raw from '../../build/app.json';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/app.json'), 'utf8'));
18
25
 
19
26
  export default serializer.deserialize(raw);
@@ -13,7 +13,14 @@
13
13
  See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
16
22
  import { serializer } from '@lowdefy/helpers';
17
- import raw from '../../build/appMeta.json';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/appMeta.json'), 'utf8'));
18
25
 
19
26
  export default serializer.deserialize(raw);
package/lib/build/auth.js CHANGED
@@ -13,7 +13,14 @@
13
13
  See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
16
22
  import { serializer } from '@lowdefy/helpers';
17
- import raw from '../../build/auth.json';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/auth.json'), 'utf8'));
18
25
 
19
26
  export default serializer.deserialize(raw);
@@ -13,7 +13,14 @@
13
13
  See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
16
22
  import { serializer } from '@lowdefy/helpers';
17
- import raw from '../../build/config.json';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/config.json'), 'utf8'));
18
25
 
19
26
  export default serializer.deserialize(raw);
@@ -0,0 +1,26 @@
1
+ /*
2
+ Copyright 2020-2026 Lowdefy, Inc
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
22
+ import { serializer } from '@lowdefy/helpers';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/i18n.json'), 'utf8'));
25
+
26
+ export default serializer.deserialize(raw);
@@ -13,7 +13,14 @@
13
13
  See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
16
22
  import { serializer } from '@lowdefy/helpers';
17
- import raw from '../../build/logger.json';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/logger.json'), 'utf8'));
18
25
 
19
26
  export default serializer.deserialize(raw);
@@ -13,7 +13,14 @@
13
13
  See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
+
17
+ // Build artifacts are read from disk because the Hono server runs as
18
+ // unbundled Node.js ESM — JSON imports would need import attributes, and
19
+ // client code imports the build JSON directly through Vite instead.
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
16
22
  import { serializer } from '@lowdefy/helpers';
17
- import raw from '../../build/theme.json';
23
+
24
+ const raw = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'build/theme.json'), 'utf8'));
18
25
 
19
26
  export default serializer.deserialize(raw);
@@ -14,7 +14,11 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
- import authConfig from '../../build/auth.js';
17
+ import { serializer } from '@lowdefy/helpers';
18
+
19
+ import rawAuthConfig from '../../../build/auth.json';
20
+
21
+ const authConfig = serializer.deserialize(rawAuthConfig);
18
22
 
19
23
  function e2eNotSupported() {
20
24
  throw new Error('Sign-in and sign-out are not supported in e2e testing.');
@@ -14,8 +14,10 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
- function getServerSession({ req }) {
18
- const cookieHeader = req?.headers?.cookie ?? '';
17
+ // E2E test-user injection: the session is read from the lowdefy_e2e_user
18
+ // cookie (base64-encoded JSON user object) instead of a real auth engine.
19
+ function getSession(c) {
20
+ const cookieHeader = c.req.header('cookie') ?? '';
19
21
  const match = cookieHeader.match(/lowdefy_e2e_user=([^;]+)/);
20
22
  if (!match) {
21
23
  return undefined;
@@ -30,4 +32,4 @@ function getServerSession({ req }) {
30
32
  }
31
33
  }
32
34
 
33
- export default getServerSession;
35
+ export default getSession;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowdefy/server-e2e",
3
- "version": "0.0.0-experimental-20260608135213",
3
+ "version": "0.0.0-experimental-20260610101734",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Lowdefy e2e testing server with cookie-based user injection",
6
6
  "homepage": "https://lowdefy.com",
@@ -30,49 +30,57 @@
30
30
  "files": [
31
31
  "lib/*",
32
32
  "lowdefy/*",
33
- "pages/*",
34
33
  "public_default/*",
35
- "next.config.js",
36
34
  "package.original.json",
37
35
  ".eslintrc.yaml",
38
- ".npmrc"
36
+ ".npmrc",
37
+ "src/*",
38
+ "client/*",
39
+ "vite.config.js",
40
+ "postcss.config.cjs"
39
41
  ],
40
42
  "dependencies": {
41
43
  "@ant-design/cssinjs": "2.1.2",
42
- "@lowdefy/actions-core": "0.0.0-experimental-20260608135213",
43
- "@lowdefy/api": "0.0.0-experimental-20260608135213",
44
- "@lowdefy/block-utils": "0.0.0-experimental-20260608135213",
45
- "@lowdefy/blocks-antd": "0.0.0-experimental-20260608135213",
46
- "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260608135213",
47
- "@lowdefy/blocks-basic": "0.0.0-experimental-20260608135213",
48
- "@lowdefy/blocks-loaders": "0.0.0-experimental-20260608135213",
49
- "@lowdefy/blocks-markdown": "0.0.0-experimental-20260608135213",
50
- "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260608135213",
51
- "@lowdefy/client": "0.0.0-experimental-20260608135213",
52
- "@lowdefy/connection-axios-http": "0.0.0-experimental-20260608135213",
53
- "@lowdefy/connection-mongodb": "0.0.0-experimental-20260608135213",
54
- "@lowdefy/errors": "0.0.0-experimental-20260608135213",
55
- "@lowdefy/helpers": "0.0.0-experimental-20260608135213",
56
- "@lowdefy/layout": "0.0.0-experimental-20260608135213",
57
- "@lowdefy/logger": "0.0.0-experimental-20260608135213",
58
- "@lowdefy/node-utils": "0.0.0-experimental-20260608135213",
59
- "@lowdefy/operators-js": "0.0.0-experimental-20260608135213",
60
- "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260608135213",
61
- "@lowdefy/operators-uuid": "0.0.0-experimental-20260608135213",
44
+ "@ant-design/x": "2.7.0",
45
+ "@hono/node-server": "2.0.4",
46
+ "@lowdefy/actions-core": "0.0.0-experimental-20260610101734",
47
+ "@lowdefy/api": "0.0.0-experimental-20260610101734",
48
+ "@lowdefy/block-utils": "0.0.0-experimental-20260610101734",
49
+ "@lowdefy/blocks-aggrid": "0.0.0-experimental-20260610101734",
50
+ "@lowdefy/blocks-antd": "0.0.0-experimental-20260610101734",
51
+ "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260610101734",
52
+ "@lowdefy/blocks-basic": "0.0.0-experimental-20260610101734",
53
+ "@lowdefy/blocks-echarts": "0.0.0-experimental-20260610101734",
54
+ "@lowdefy/blocks-loaders": "0.0.0-experimental-20260610101734",
55
+ "@lowdefy/blocks-markdown": "0.0.0-experimental-20260610101734",
56
+ "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260610101734",
57
+ "@lowdefy/client": "0.0.0-experimental-20260610101734",
58
+ "@lowdefy/connection-axios-http": "0.0.0-experimental-20260610101734",
59
+ "@lowdefy/connection-mongodb": "0.0.0-experimental-20260610101734",
60
+ "@lowdefy/errors": "0.0.0-experimental-20260610101734",
61
+ "@lowdefy/helpers": "0.0.0-experimental-20260610101734",
62
+ "@lowdefy/layout": "0.0.0-experimental-20260610101734",
63
+ "@lowdefy/logger": "0.0.0-experimental-20260610101734",
64
+ "@lowdefy/node-utils": "0.0.0-experimental-20260610101734",
65
+ "@lowdefy/operators-js": "0.0.0-experimental-20260610101734",
66
+ "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260610101734",
67
+ "@lowdefy/operators-uuid": "0.0.0-experimental-20260610101734",
62
68
  "@tailwindcss/postcss": "4.2.1",
69
+ "@vitejs/plugin-react": "^6.0.2",
63
70
  "antd": "6.3.1",
64
71
  "dayjs": "1.11.19",
65
- "next": "16.1.6",
72
+ "hono": "4.12.25",
66
73
  "pino": "8.16.2",
67
74
  "react": "18.2.0",
68
75
  "react-dom": "18.2.0",
69
76
  "react-icons": "5.6.0",
70
77
  "tailwindcss": "4.2.1",
71
- "uuid": "13.0.0"
78
+ "uuid": "13.0.0",
79
+ "vite": "8.0.16"
72
80
  },
73
81
  "devDependencies": {
74
82
  "@jest/globals": "28.1.3",
75
- "@lowdefy/build": "0.0.0-experimental-20260608135213",
83
+ "@lowdefy/build": "0.0.0-experimental-20260610101734",
76
84
  "@next/eslint-plugin-next": "16.1.6",
77
85
  "@tailwindcss/postcss": "4.2.1",
78
86
  "jest": "28.1.3",
@@ -87,14 +95,12 @@
87
95
  "publishConfig": {
88
96
  "access": "public"
89
97
  },
98
+ "type": "module",
90
99
  "scripts": {
91
100
  "build": "cp package.json package.original.json || copy package.json package.original.json",
101
+ "build:client": "vite build",
92
102
  "build:lowdefy": "node lowdefy/build.mjs",
93
- "build:next": "next build",
94
- "dev": "next dev",
95
- "start": "next start",
96
- "lint": "next lint",
97
- "next": "next",
103
+ "start": "node src/index.js",
98
104
  "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
99
105
  }
100
106
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowdefy/server-e2e",
3
- "version": "0.0.0-experimental-20260608135213",
3
+ "version": "0.0.0-experimental-20260610101734",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Lowdefy e2e testing server with cookie-based user injection",
6
6
  "homepage": "https://lowdefy.com",
@@ -30,60 +30,65 @@
30
30
  "files": [
31
31
  "lib/*",
32
32
  "lowdefy/*",
33
- "pages/*",
34
33
  "public_default/*",
35
- "next.config.js",
36
34
  "package.original.json",
37
35
  ".eslintrc.yaml",
38
- ".npmrc"
36
+ ".npmrc",
37
+ "src/*",
38
+ "client/*",
39
+ "vite.config.js",
40
+ "postcss.config.cjs"
39
41
  ],
40
42
  "scripts": {
41
43
  "build": "cp package.json package.original.json || copy package.json package.original.json",
44
+ "build:client": "vite build",
42
45
  "build:lowdefy": "node lowdefy/build.mjs",
43
- "build:next": "next build",
44
- "dev": "next dev",
45
- "start": "next start",
46
- "lint": "next lint",
47
- "next": "next",
48
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
49
- "prepublishOnly": "pnpm build"
46
+ "prepublishOnly": "pnpm build",
47
+ "start": "node src/index.js",
48
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
50
49
  },
51
50
  "dependencies": {
52
51
  "@ant-design/cssinjs": "2.1.2",
53
- "@lowdefy/actions-core": "0.0.0-experimental-20260608135213",
54
- "@lowdefy/api": "0.0.0-experimental-20260608135213",
55
- "@lowdefy/block-utils": "0.0.0-experimental-20260608135213",
56
- "@lowdefy/blocks-antd": "0.0.0-experimental-20260608135213",
57
- "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260608135213",
58
- "@lowdefy/blocks-basic": "0.0.0-experimental-20260608135213",
59
- "@lowdefy/blocks-loaders": "0.0.0-experimental-20260608135213",
60
- "@lowdefy/blocks-markdown": "0.0.0-experimental-20260608135213",
61
- "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260608135213",
62
- "@lowdefy/client": "0.0.0-experimental-20260608135213",
63
- "@lowdefy/connection-axios-http": "0.0.0-experimental-20260608135213",
64
- "@lowdefy/connection-mongodb": "0.0.0-experimental-20260608135213",
65
- "@lowdefy/errors": "0.0.0-experimental-20260608135213",
66
- "@lowdefy/helpers": "0.0.0-experimental-20260608135213",
67
- "@lowdefy/layout": "0.0.0-experimental-20260608135213",
68
- "@lowdefy/logger": "0.0.0-experimental-20260608135213",
69
- "@lowdefy/node-utils": "0.0.0-experimental-20260608135213",
70
- "@lowdefy/operators-js": "0.0.0-experimental-20260608135213",
71
- "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260608135213",
72
- "@lowdefy/operators-uuid": "0.0.0-experimental-20260608135213",
52
+ "@ant-design/x": "2.7.0",
53
+ "@hono/node-server": "2.0.4",
54
+ "@lowdefy/actions-core": "0.0.0-experimental-20260610101734",
55
+ "@lowdefy/api": "0.0.0-experimental-20260610101734",
56
+ "@lowdefy/block-utils": "0.0.0-experimental-20260610101734",
57
+ "@lowdefy/blocks-aggrid": "0.0.0-experimental-20260610101734",
58
+ "@lowdefy/blocks-antd": "0.0.0-experimental-20260610101734",
59
+ "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260610101734",
60
+ "@lowdefy/blocks-basic": "0.0.0-experimental-20260610101734",
61
+ "@lowdefy/blocks-echarts": "0.0.0-experimental-20260610101734",
62
+ "@lowdefy/blocks-loaders": "0.0.0-experimental-20260610101734",
63
+ "@lowdefy/blocks-markdown": "0.0.0-experimental-20260610101734",
64
+ "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260610101734",
65
+ "@lowdefy/client": "0.0.0-experimental-20260610101734",
66
+ "@lowdefy/connection-axios-http": "0.0.0-experimental-20260610101734",
67
+ "@lowdefy/connection-mongodb": "0.0.0-experimental-20260610101734",
68
+ "@lowdefy/errors": "0.0.0-experimental-20260610101734",
69
+ "@lowdefy/helpers": "0.0.0-experimental-20260610101734",
70
+ "@lowdefy/layout": "0.0.0-experimental-20260610101734",
71
+ "@lowdefy/logger": "0.0.0-experimental-20260610101734",
72
+ "@lowdefy/node-utils": "0.0.0-experimental-20260610101734",
73
+ "@lowdefy/operators-js": "0.0.0-experimental-20260610101734",
74
+ "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260610101734",
75
+ "@lowdefy/operators-uuid": "0.0.0-experimental-20260610101734",
73
76
  "@tailwindcss/postcss": "4.2.1",
77
+ "@vitejs/plugin-react": "^6.0.2",
74
78
  "antd": "6.3.1",
75
79
  "dayjs": "1.11.19",
76
- "next": "16.1.6",
80
+ "hono": "4.12.25",
77
81
  "pino": "8.16.2",
78
82
  "react": "18.2.0",
79
83
  "react-dom": "18.2.0",
80
84
  "react-icons": "5.6.0",
81
85
  "tailwindcss": "4.2.1",
82
- "uuid": "13.0.0"
86
+ "uuid": "13.0.0",
87
+ "vite": "8.0.16"
83
88
  },
84
89
  "devDependencies": {
85
90
  "@jest/globals": "28.1.3",
86
- "@lowdefy/build": "0.0.0-experimental-20260608135213",
91
+ "@lowdefy/build": "0.0.0-experimental-20260610101734",
87
92
  "@next/eslint-plugin-next": "16.1.6",
88
93
  "@tailwindcss/postcss": "4.2.1",
89
94
  "jest": "28.1.3",
@@ -102,5 +107,6 @@
102
107
  },
103
108
  "publishConfig": {
104
109
  "access": "public"
105
- }
110
+ },
111
+ "type": "module"
106
112
  }
@@ -0,0 +1 @@
1
+ module.exports = { plugins: { '@tailwindcss/postcss': {} } };