mirror of
https://github.com/shishantbiswas/bknd.git
synced 2026-03-16 04:27:21 +00:00
lazy import code editor once, externalized codemirror
This commit is contained in:
17
app/build.ts
17
app/build.ts
@@ -72,16 +72,12 @@ await tsup.build({
|
|||||||
/**
|
/**
|
||||||
* Building UI for direct imports
|
* Building UI for direct imports
|
||||||
*/
|
*/
|
||||||
|
const ui_splitting = false;
|
||||||
await tsup.build({
|
await tsup.build({
|
||||||
minify,
|
minify,
|
||||||
sourcemap,
|
sourcemap,
|
||||||
watch,
|
watch,
|
||||||
entry: [
|
entry: ["src/ui/index.ts", "src/ui/client/index.ts", "src/ui/main.css"],
|
||||||
"src/ui/index.ts",
|
|
||||||
"src/ui/client/index.ts",
|
|
||||||
"src/ui/elements/index.ts",
|
|
||||||
"src/ui/main.css"
|
|
||||||
],
|
|
||||||
outDir: "dist/ui",
|
outDir: "dist/ui",
|
||||||
external: [
|
external: [
|
||||||
"bun:test",
|
"bun:test",
|
||||||
@@ -89,19 +85,22 @@ await tsup.build({
|
|||||||
"react-dom",
|
"react-dom",
|
||||||
"react/jsx-runtime",
|
"react/jsx-runtime",
|
||||||
"react/jsx-dev-runtime",
|
"react/jsx-dev-runtime",
|
||||||
"use-sync-external-store"
|
"use-sync-external-store",
|
||||||
|
/codemirror/
|
||||||
],
|
],
|
||||||
metafile: true,
|
metafile: true,
|
||||||
platform: "browser",
|
platform: "browser",
|
||||||
format: ["esm"],
|
format: ["esm"],
|
||||||
splitting: true,
|
splitting: ui_splitting,
|
||||||
treeshake: true,
|
treeshake: true,
|
||||||
loader: {
|
loader: {
|
||||||
".svg": "dataurl"
|
".svg": "dataurl"
|
||||||
},
|
},
|
||||||
esbuildOptions: (options) => {
|
esbuildOptions: (options) => {
|
||||||
options.logLevel = "silent";
|
options.logLevel = "silent";
|
||||||
options.chunkNames = "chunks/[name]-[hash]";
|
if (ui_splitting) {
|
||||||
|
options.chunkNames = "chunks/[name]-[hash]";
|
||||||
|
}
|
||||||
},
|
},
|
||||||
onSuccess: async () => {
|
onSuccess: async () => {
|
||||||
delayTypes();
|
delayTypes();
|
||||||
|
|||||||
@@ -34,13 +34,14 @@
|
|||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"oauth4webapi": "^2.11.1",
|
"oauth4webapi": "^2.11.1",
|
||||||
"swr": "^2.2.5",
|
"swr": "^2.2.5",
|
||||||
"json-schema-form-react": "^0.0.2"
|
"json-schema-form-react": "^0.0.2",
|
||||||
|
"@uiw/react-codemirror": "^4.23.6",
|
||||||
|
"@codemirror/lang-html": "^6.4.9",
|
||||||
|
"@codemirror/lang-json": "^6.0.1",
|
||||||
|
"@codemirror/lang-liquid": "^6.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.613.0",
|
"@aws-sdk/client-s3": "^3.613.0",
|
||||||
"@codemirror/lang-html": "^6.4.9",
|
|
||||||
"@codemirror/lang-json": "^6.0.1",
|
|
||||||
"@codemirror/lang-liquid": "^6.2.1",
|
|
||||||
"@dagrejs/dagre": "^1.1.4",
|
"@dagrejs/dagre": "^1.1.4",
|
||||||
"@hello-pangea/dnd": "^17.0.0",
|
"@hello-pangea/dnd": "^17.0.0",
|
||||||
"@hono/typebox-validator": "^0.2.6",
|
"@hono/typebox-validator": "^0.2.6",
|
||||||
@@ -58,7 +59,6 @@
|
|||||||
"@types/node": "^22.10.0",
|
"@types/node": "^22.10.0",
|
||||||
"@types/react": "^18.3.12",
|
"@types/react": "^18.3.12",
|
||||||
"@types/react-dom": "^18.3.1",
|
"@types/react-dom": "^18.3.1",
|
||||||
"@uiw/react-codemirror": "^4.23.6",
|
|
||||||
"@vitejs/plugin-react": "^4.3.3",
|
"@vitejs/plugin-react": "^4.3.3",
|
||||||
"@xyflow/react": "^12.3.2",
|
"@xyflow/react": "^12.3.2",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
|
|||||||
@@ -1,8 +1,22 @@
|
|||||||
import { default as CodeMirror, type ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
import { default as CodeMirror, type ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
||||||
|
|
||||||
import { useBknd } from "ui/client/bknd";
|
import { useBknd } from "ui/client/bknd";
|
||||||
|
|
||||||
export default function CodeEditor({ editable, basicSetup, ...props }: ReactCodeMirrorProps) {
|
import { json } from "@codemirror/lang-json";
|
||||||
|
import { type LiquidCompletionConfig, liquid } from "@codemirror/lang-liquid";
|
||||||
|
|
||||||
|
export type CodeEditorProps = ReactCodeMirrorProps & {
|
||||||
|
_extensions?: Partial<{
|
||||||
|
json: boolean;
|
||||||
|
liquid: LiquidCompletionConfig;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function CodeEditor({
|
||||||
|
editable,
|
||||||
|
basicSetup,
|
||||||
|
_extensions = {},
|
||||||
|
...props
|
||||||
|
}: CodeEditorProps) {
|
||||||
const b = useBknd();
|
const b = useBknd();
|
||||||
const theme = b.app.getAdminConfig().color_scheme;
|
const theme = b.app.getAdminConfig().color_scheme;
|
||||||
const _basicSetup: Partial<ReactCodeMirrorProps["basicSetup"]> = !editable
|
const _basicSetup: Partial<ReactCodeMirrorProps["basicSetup"]> = !editable
|
||||||
@@ -13,11 +27,24 @@ export default function CodeEditor({ editable, basicSetup, ...props }: ReactCode
|
|||||||
}
|
}
|
||||||
: basicSetup;
|
: basicSetup;
|
||||||
|
|
||||||
|
const extensions = Object.entries(_extensions ?? {})
|
||||||
|
.map(([ext, config]: any) => {
|
||||||
|
switch (ext) {
|
||||||
|
case "json":
|
||||||
|
return json();
|
||||||
|
case "liquid":
|
||||||
|
return liquid(config);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
})
|
||||||
|
.filter(Boolean) as any;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CodeMirror
|
<CodeMirror
|
||||||
theme={theme === "dark" ? "dark" : "light"}
|
theme={theme === "dark" ? "dark" : "light"}
|
||||||
editable={editable}
|
editable={editable}
|
||||||
basicSetup={_basicSetup}
|
basicSetup={_basicSetup}
|
||||||
|
extensions={extensions}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
import { json } from "@codemirror/lang-json";
|
|
||||||
import type { ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
|
||||||
import { Suspense, lazy } from "react";
|
import { Suspense, lazy } from "react";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
import type { CodeEditorProps } from "./CodeEditor";
|
||||||
const CodeEditor = lazy(() => import("./CodeEditor"));
|
const CodeEditor = lazy(() => import("./CodeEditor"));
|
||||||
|
|
||||||
export function JsonEditor({ editable, className, ...props }: ReactCodeMirrorProps) {
|
export function JsonEditor({ editable, className, ...props }: CodeEditorProps) {
|
||||||
return (
|
return (
|
||||||
<Suspense fallback={null}>
|
<Suspense fallback={null}>
|
||||||
<CodeEditor
|
<CodeEditor
|
||||||
@@ -14,7 +13,7 @@ export function JsonEditor({ editable, className, ...props }: ReactCodeMirrorPro
|
|||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
editable={editable}
|
editable={editable}
|
||||||
extensions={[json()]}
|
_extensions={{ json: true }}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { liquid } from "@codemirror/lang-liquid";
|
|
||||||
import type { ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
|
||||||
import { Suspense, lazy } from "react";
|
import { Suspense, lazy } from "react";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
|
import type { CodeEditorProps } from "./CodeEditor";
|
||||||
const CodeEditor = lazy(() => import("./CodeEditor"));
|
const CodeEditor = lazy(() => import("./CodeEditor"));
|
||||||
|
|
||||||
const filters = [
|
const filters = [
|
||||||
@@ -106,7 +106,7 @@ const tags = [
|
|||||||
{ label: "when" }
|
{ label: "when" }
|
||||||
];
|
];
|
||||||
|
|
||||||
export function LiquidJsEditor({ editable, ...props }: ReactCodeMirrorProps) {
|
export function LiquidJsEditor({ editable, ...props }: CodeEditorProps) {
|
||||||
return (
|
return (
|
||||||
<Suspense fallback={null}>
|
<Suspense fallback={null}>
|
||||||
<CodeEditor
|
<CodeEditor
|
||||||
@@ -115,7 +115,9 @@ export function LiquidJsEditor({ editable, ...props }: ReactCodeMirrorProps) {
|
|||||||
!editable && "opacity-70"
|
!editable && "opacity-70"
|
||||||
)}
|
)}
|
||||||
editable={editable}
|
editable={editable}
|
||||||
extensions={[liquid({ filters, tags })]}
|
_extensions={{
|
||||||
|
liquid: { filters, tags }
|
||||||
|
}}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { MarkerType, type Node, Position, ReactFlowProvider } from "@xyflow/reac
|
|||||||
import type { AppDataConfig, TAppDataEntity } from "data/data-schema";
|
import type { AppDataConfig, TAppDataEntity } from "data/data-schema";
|
||||||
import { useBknd } from "ui/client/BkndProvider";
|
import { useBknd } from "ui/client/BkndProvider";
|
||||||
import { useBkndSystemTheme } from "ui/client/schema/system/use-bknd-system";
|
import { useBkndSystemTheme } from "ui/client/schema/system/use-bknd-system";
|
||||||
import { useTheme } from "ui/client/use-theme";
|
|
||||||
import { Canvas } from "ui/components/canvas/Canvas";
|
import { Canvas } from "ui/components/canvas/Canvas";
|
||||||
import { layoutWithDagre } from "ui/components/canvas/layouts";
|
import { layoutWithDagre } from "ui/components/canvas/layouts";
|
||||||
import { Panels } from "ui/components/canvas/panels";
|
import { Panels } from "ui/components/canvas/panels";
|
||||||
|
|||||||
@@ -1,125 +0,0 @@
|
|||||||
Subject: [PATCH] lazy codemirror
|
|
||||||
---
|
|
||||||
Index: app/src/ui/components/code/LiquidJsEditor.tsx
|
|
||||||
IDEA additional info:
|
|
||||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
|
||||||
<+>UTF-8
|
|
||||||
===================================================================
|
|
||||||
diff --git a/app/src/ui/components/code/LiquidJsEditor.tsx b/app/src/ui/components/code/LiquidJsEditor.tsx
|
|
||||||
--- a/app/src/ui/components/code/LiquidJsEditor.tsx (revision b1a32f370565aded3a34b79ffd254c3c45d1085c)
|
|
||||||
+++ b/app/src/ui/components/code/LiquidJsEditor.tsx (date 1736687726081)
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
-import { liquid } from "@codemirror/lang-liquid";
|
|
||||||
-import type { ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
|
||||||
import { Suspense, lazy } from "react";
|
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
+
|
|
||||||
+import type { CodeEditorProps } from "./CodeEditor";
|
|
||||||
const CodeEditor = lazy(() => import("./CodeEditor"));
|
|
||||||
|
|
||||||
const filters = [
|
|
||||||
@@ -106,7 +106,7 @@
|
|
||||||
{ label: "when" }
|
|
||||||
];
|
|
||||||
|
|
||||||
-export function LiquidJsEditor({ editable, ...props }: ReactCodeMirrorProps) {
|
|
||||||
+export function LiquidJsEditor({ editable, ...props }: CodeEditorProps) {
|
|
||||||
return (
|
|
||||||
<Suspense fallback={null}>
|
|
||||||
<CodeEditor
|
|
||||||
@@ -115,7 +115,9 @@
|
|
||||||
!editable && "opacity-70"
|
|
||||||
)}
|
|
||||||
editable={editable}
|
|
||||||
- extensions={[liquid({ filters, tags })]}
|
|
||||||
+ _extensions={{
|
|
||||||
+ liquid: { filters, tags }
|
|
||||||
+ }}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
</Suspense>
|
|
||||||
Index: app/src/ui/components/code/CodeEditor.tsx
|
|
||||||
IDEA additional info:
|
|
||||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
|
||||||
<+>UTF-8
|
|
||||||
===================================================================
|
|
||||||
diff --git a/app/src/ui/components/code/CodeEditor.tsx b/app/src/ui/components/code/CodeEditor.tsx
|
|
||||||
--- a/app/src/ui/components/code/CodeEditor.tsx (revision b1a32f370565aded3a34b79ffd254c3c45d1085c)
|
|
||||||
+++ b/app/src/ui/components/code/CodeEditor.tsx (date 1736687634668)
|
|
||||||
@@ -1,8 +1,22 @@
|
|
||||||
import { default as CodeMirror, type ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
|
||||||
-
|
|
||||||
import { useBknd } from "ui/client/bknd";
|
|
||||||
|
|
||||||
-export default function CodeEditor({ editable, basicSetup, ...props }: ReactCodeMirrorProps) {
|
|
||||||
+import { json } from "@codemirror/lang-json";
|
|
||||||
+import { type LiquidCompletionConfig, liquid } from "@codemirror/lang-liquid";
|
|
||||||
+
|
|
||||||
+export type CodeEditorProps = ReactCodeMirrorProps & {
|
|
||||||
+ _extensions?: Partial<{
|
|
||||||
+ json: boolean;
|
|
||||||
+ liquid: LiquidCompletionConfig;
|
|
||||||
+ }>;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+export default function CodeEditor({
|
|
||||||
+ editable,
|
|
||||||
+ basicSetup,
|
|
||||||
+ _extensions = {},
|
|
||||||
+ ...props
|
|
||||||
+}: CodeEditorProps) {
|
|
||||||
const b = useBknd();
|
|
||||||
const theme = b.app.getAdminConfig().color_scheme;
|
|
||||||
const _basicSetup: Partial<ReactCodeMirrorProps["basicSetup"]> = !editable
|
|
||||||
@@ -13,11 +27,21 @@
|
|
||||||
}
|
|
||||||
: basicSetup;
|
|
||||||
|
|
||||||
+ const extensions = Object.entries(_extensions ?? {}).map(([ext, config]: any) => {
|
|
||||||
+ switch (ext) {
|
|
||||||
+ case "json":
|
|
||||||
+ return json();
|
|
||||||
+ case "liquid":
|
|
||||||
+ return liquid(config);
|
|
||||||
+ }
|
|
||||||
+ });
|
|
||||||
+
|
|
||||||
return (
|
|
||||||
<CodeMirror
|
|
||||||
theme={theme === "dark" ? "dark" : "light"}
|
|
||||||
editable={editable}
|
|
||||||
basicSetup={_basicSetup}
|
|
||||||
+ extensions={extensions}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
Index: app/src/ui/components/code/JsonEditor.tsx
|
|
||||||
IDEA additional info:
|
|
||||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
|
||||||
<+>UTF-8
|
|
||||||
===================================================================
|
|
||||||
diff --git a/app/src/ui/components/code/JsonEditor.tsx b/app/src/ui/components/code/JsonEditor.tsx
|
|
||||||
--- a/app/src/ui/components/code/JsonEditor.tsx (revision b1a32f370565aded3a34b79ffd254c3c45d1085c)
|
|
||||||
+++ b/app/src/ui/components/code/JsonEditor.tsx (date 1736687681965)
|
|
||||||
@@ -1,10 +1,9 @@
|
|
||||||
-import { json } from "@codemirror/lang-json";
|
|
||||||
-import type { ReactCodeMirrorProps } from "@uiw/react-codemirror";
|
|
||||||
import { Suspense, lazy } from "react";
|
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
+import type { CodeEditorProps } from "./CodeEditor";
|
|
||||||
const CodeEditor = lazy(() => import("./CodeEditor"));
|
|
||||||
|
|
||||||
-export function JsonEditor({ editable, className, ...props }: ReactCodeMirrorProps) {
|
|
||||||
+export function JsonEditor({ editable, className, ...props }: CodeEditorProps) {
|
|
||||||
return (
|
|
||||||
<Suspense fallback={null}>
|
|
||||||
<CodeEditor
|
|
||||||
@@ -14,7 +13,7 @@
|
|
||||||
className
|
|
||||||
)}
|
|
||||||
editable={editable}
|
|
||||||
- extensions={[json()]}
|
|
||||||
+ _extensions={{ json: true }}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
</Suspense>
|
|
||||||
Reference in New Issue
Block a user