commit 1f7327cb5c04b005b86ff2ee74ca684ecf436a96 Author: skycurtain Date: Fri Jul 11 16:27:36 2025 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a14702c --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a17187 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# datax-config + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.2.17. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..9785375 --- /dev/null +++ b/bun.lock @@ -0,0 +1,29 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "datax-config", + "devDependencies": { + "@types/bun": "latest", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@types/bun": ["@types/bun@1.2.18", "", { "dependencies": { "bun-types": "1.2.18" } }, "sha512-Xf6RaWVheyemaThV0kUfaAUvCNokFr+bH8Jxp+tTZfx7dAPA8z9ePnP9S9+Vspzuxxx9JRAXhnyccRj3GyCMdQ=="], + + "@types/node": ["@types/node@24.0.10", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA=="], + + "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], + + "bun-types": ["bun-types@1.2.18", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-04+Eha5NP7Z0A9YgDAzMk5PHR16ZuLVa83b26kH5+cp1qZW4F6FmAURngE7INf4tKOvCE69vYvDEwoNl1tGiWw=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..86fa381 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "datax-config", + "module": "index.ts", + "type": "module", + "private": true, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5" + } +} diff --git a/src/datax-config.ts b/src/datax-config.ts new file mode 100644 index 0000000..74e34bb --- /dev/null +++ b/src/datax-config.ts @@ -0,0 +1,127 @@ +// 大屏设计时的配置 +interface ScreenDesignTimeConfig { + // 大屏样式 + style: { + width: number; + height: number; + background: string; + stretchMode: string; // 拉伸模式 + }; + // 组件配置 + // 可以支持组件包含子组件 + // 当type不是group且children非空时表示该组件有子组件 + components: Array<{ + id: string; // 组件id(唯一) + type: string | "group"; // 组件类型(区别于分组) + name: string; // 组件名称(可由用户定义) + parentId?: string; // 组件分组id(如果存在) + zIndex?: number; // 组件在分组中的层级 + collapsed?: boolean; // 分组特有属性(当type为"group"时使用) + children: ScreenDesignTimeConfig["components"]; + // 组件在画布上的布局和样式 + style: { + left: number; // 组件在画布上的X轴距离 + top: number; // 组件在画布上的Y轴距离 + width: number; // 组件宽度 + height: number; // 组件高度 + rotate: number; // 组件旋转角度 + visibility: string; // 组件可见性 + opacity: number; // 组件透明度 + pointerEvents: string; // 事件穿透 + allowDrag: boolean; // 允许拖动 + allowDrop: boolean; // 允许放置 + }; + props: { + [name: string]: any; + }; + data: any; // 组件数据 + dataSource: { + variableNames: Array; // 关联的全局变量名称 + type: "static" | "api" | "variable"; + // 数据源配置 + config: { + value?: any; + url?: string; + method?: "GET" | "POST"; + headers?: Record; + query?: Record; + body?: Record; + }; + cors: boolean; // 服务器代理请求 + filterIds: Array; + }; + // 组件交互 + interaction: { + // 下游交互事件 + events: Array<{ + id: string; + name: string; + // 判断条件 + conditions: Array<{ + // 每个判断条件可以由一系列过滤器组合而成 + filterIds: Array; + // 交互动作 + // 在配置事件动作时,先选择交互对象,再选择交互动作 + // 交互对象允许多选,多选后,交互动作的范围收缩到所选交互对象共有的动作 + // 如何判断一个动作是否为指定的多个交互对象所共有?动作名称与动作参数都相同 + // 为什么要添加beforeAction字段?计划支持分组向内部组件分派数据, + // 即组件允许实现一个名为【更新数据】的动作(区别于【请求数据】), + // 该动作接收参数并将其直接赋值给组件数据,为了规范数据,在设计时需要在动作执行前做一些预处理 + actions: { + components: Array<{ + id: string; // 下游交互组件ID + name: string; + filtersReturn: any; // 与判断条件的返回值相对应 + beforeAction: Array; // 交互前动作(过滤器ID) + actionName: string; // 交互动作名称 + params: any; // 交互动作参数 + }>; + variables: Array<{ + id: string; + name: string; + beforeAction: Array; // 交互前动作(过滤器ID) + actionName: string; // 交互动作名称 + params: any; // 交互动作参数 + }>; + }; + }>; + }>; + }; + }>; + // 全局变量 + // 如果一个全局变量的数据源是静态数据源,则只通过组件的事件去更新变量 + // 如果一个全局变量的数据源是API,则尽量不要由组件事件去更新这个变量 + variables: Array<{ + id: string; + name: string; + description?: string; + data: any; + dataSource: { + type: "static" | "api"; + // 数据源配置 + config: { + value?: any; + url?: string; + method?: "GET" | "POST"; + headers?: Record; + query?: Record; + body?: Record; + }; + cors: boolean; + filterIds: Array; + }; + }>; + // 过滤器 + filters: Array<{ + id: string; + name: string; + payload: string; // (data: any, variables: any) => Promise + }>; +} + +// 组件的分类: +// 1. 数据组件:大屏中的组件 +// 2. 控制组件:大屏中的悬浮组件,可拖拽,贴边时可隐藏,比如一个控制面版用于操作摄像机/录像机等设备 +// 3. 反馈组件:弹窗(全局,带遮罩) + +interface ScreenRuntimeConfig {} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..f67b2c6 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..bfa0fea --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +}