openyida 2026.9.12 → 2026.9.13

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.
@@ -1019,39 +1019,42 @@ function compileCanvas(source, options = {}) {
1019
1019
  try {
1020
1020
  resolve(compileCanvasLocal(source, options));
1021
1021
  } catch (compileError) {
1022
- if (isCliError(compileError)) {
1023
- reject(compileError);
1024
- return;
1025
- }
1026
- const detail = compileError && compileError.message ? compileError.message : String(compileError);
1027
- if (
1028
- compileError &&
1029
- /^OPENYIDA_/.test(String(compileError.code || '')) &&
1030
- compileError.details !== undefined
1031
- ) {
1032
- reject(new CliError(`Code Canvas 本地编译失败: ${detail}`, {
1033
- code: compileError.code,
1034
- details: compileError.details,
1035
- }));
1036
- return;
1037
- }
1038
- reject(new CliError(`Code Canvas 本地编译失败: ${detail}`, {
1039
- code: 'OPENYIDA_CANVAS_COMPILE_FAILED',
1040
- details: {
1041
- stage: 'canvas_compile',
1042
- sourcePath: options.sourcePath,
1043
- causeCode: compileError && compileError.code,
1044
- causeName: compileError && compileError.name,
1045
- loc: compileError && compileError.loc,
1046
- },
1047
- }));
1022
+ reject(normalizeCanvasCompileError(compileError, options));
1048
1023
  }
1049
1024
  });
1050
1025
  }
1051
1026
 
1027
+ function normalizeCanvasCompileError(compileError, options = {}) {
1028
+ if (isCliError(compileError)) {
1029
+ return compileError;
1030
+ }
1031
+ const detail = compileError && compileError.message ? compileError.message : String(compileError);
1032
+ if (
1033
+ compileError &&
1034
+ /^OPENYIDA_/.test(String(compileError.code || '')) &&
1035
+ compileError.details !== undefined
1036
+ ) {
1037
+ return new CliError(`Code Canvas 本地编译失败: ${detail}`, {
1038
+ code: compileError.code,
1039
+ details: compileError.details,
1040
+ });
1041
+ }
1042
+ return new CliError(`Code Canvas 本地编译失败: ${detail}`, {
1043
+ code: 'OPENYIDA_CANVAS_COMPILE_FAILED',
1044
+ details: {
1045
+ stage: 'canvas_compile',
1046
+ sourcePath: options.sourcePath,
1047
+ causeCode: compileError && compileError.code,
1048
+ causeName: compileError && compileError.name,
1049
+ loc: compileError && compileError.loc,
1050
+ },
1051
+ });
1052
+ }
1053
+
1052
1054
  module.exports = {
1053
1055
  compileCanvas,
1054
1056
  compileCanvasLocal,
1057
+ normalizeCanvasCompileError,
1055
1058
  extractImportedModules,
1056
1059
  resolveWindowAlias,
1057
1060
  shouldAllowUnsupportedBareImports,
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const crypto = require('crypto');
4
- const { compileCanvasLocal } = require('../canvas-compile');
4
+ const { compileCanvasLocal, normalizeCanvasCompileError } = require('../canvas-compile');
5
5
  const { assertNoEmojiInText } = require('../../core/no-emoji-guard');
6
6
  const { schemaError } = require('../../core/structured-error');
7
7
  const { isLoadedPageSource } = require('./page-source-loader');
@@ -36,8 +36,8 @@ function compileCanvasPageSource(loadedSource) {
36
36
  sourcePath: loadedSource.relativePath,
37
37
  });
38
38
  } catch (error) {
39
- compilerError('SCHEMA_PAGE_SOURCE_COMPILE_FAILED', 'Canvas page source could not be compiled.', {
40
- stage: 'canvas',
39
+ throw normalizeCanvasCompileError(error, {
40
+ sourcePath: loadedSource.relativePath,
41
41
  });
42
42
  }
43
43
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openyida",
3
- "version": "2026.9.12",
3
+ "version": "2026.9.13",
4
4
  "description": "OpenYida CLI - 宜搭低代码 AI 开发工具(安装即用,零配置)",
5
5
  "bin": {
6
6
  "openyida": "bin/yida.js",
@@ -25,7 +25,7 @@ description: 自定义页面编译发布技能;发布 YidaCodeCanvas 页面时
25
25
 
26
26
  - 不要在未加载对应页面开发技能的情况下临时编写页面源码;使用 `YidaCodeCanvas` 组件实现的页面先看 `yida-canvas-custom-page`。
27
27
  - 不要把普通 React / Next / Vite 项目源码直接发布;可发布源码必须是 OpenYida 页面源码,并放在 `project/pages/src/*.{canvas.jsx,canvas.tsx,oyd.jsx,jsx,tsx}`
28
- - 不要混用预检命令:`.canvas.jsx` / `.canvas.tsx` 不走 `openyida check-page` / `openyida compile`;`.oyd.jsx` / `.jsx` / `.tsx` 不要当成 `YidaCodeCanvas` 页面发布,除非已明确确认源码就是 `YidaCodeCanvas` 组件源码并使用 `--canvas`
28
+ - 不要混用预检模式:`.canvas.jsx` / `.canvas.tsx` 不走 `openyida check-page`,统一执行 `openyida compile <源文件> --json` 让 CLI 按扩展名选择 Canvas 编译器;`.oyd.jsx` / `.jsx` / `.tsx` 不要当成 `YidaCodeCanvas` 页面发布,除非已明确确认源码就是 `YidaCodeCanvas` 组件源码并使用 `--canvas`
29
29
  - 不要在平台 `renderJsx` / `didMount` 形态里手写 React Hooks;需要 Hooks 的页面应交回对应页面开发技能改成可编译的源码形态
30
30
  - 不要编造 appType 和 formUuid,必须从已有记录或命令返回中获取
31
31
  - 不要把普通表单、流程表单或数据底表的 `formUuid` 当作发布目标;除非已确认目标是自定义展示页面,否则不要用 `--force` 绕过保护
@@ -34,7 +34,8 @@ description: 自定义页面编译发布技能;发布 YidaCodeCanvas 页面时
34
34
 
35
35
  - 发布前确认页面源码已通过对应页面开发技能编写:`.canvas.jsx` / `.canvas.tsx` 发布为 `YidaCodeCanvas` 组件;`.oyd.jsx` / `.jsx` / `.tsx` 发布为平台 `Jsx` 组件
36
36
  - 平台 `Jsx` 组件 / `oyb.jsx` / `renderJsx` 维护源码发布前优先执行 `openyida check-page <源文件路径>` 和 `openyida compile <源文件路径>`;本技能只把它们作为发布前 guard
37
- - 使用 `YidaCodeCanvas` 组件实现的页面不单独运行普通 JSX 编译命令;执行 `openyida publish <源文件> <appType> <displayPageFormUuid> --canvas --health-check`,由发布流程校验并写入 `runtimeCode + importedModules`
37
+ - 使用 `YidaCodeCanvas` 组件实现的页面发布前必须执行 `openyida compile <源文件> --json`;CLI 会自动选择 Canvas 编译器。失败时直接按结构化 `code/message/details` 修源码并重跑同一命令,不要改用 `node -e`、`compileCanvasLocal` 或 `run_workspace_script` 绕行
38
+ - Canvas 本地编译通过后,执行 `openyida publish <源文件> <appType> <displayPageFormUuid> --canvas --health-check`,由发布流程再次校验并写入 `runtimeCode + importedModules`
38
39
  - 使用 `YidaCodeCanvas` 组件实现的页面发布时,发布流程会在外层页面 `didMount` 注入 `window.__OPENYIDA_YIDA_API__` 和 `window.__OPENYIDA_UTILS__`;不要在 Canvas 源码内补写 `this.utils.yida.*` 或根级 `this.utils.*`
39
40
  - 推荐源码放在 `project/pages/src/`:使用 `YidaCodeCanvas` 组件实现的页面用 `<页面名>.canvas.jsx` / `<页面名>.canvas.tsx`;平台 `Jsx` 组件维护源码用 `<页面名>.oyd.jsx` / `<页面名>.jsx` / `<页面名>.tsx`
40
41
  - 发布前注意 CLI 会检查 `<workspace>/project/pages/src/` 与 `<workspace>/projects/<id>/artifacts/` 中同名源码是否内容不一致;出现警告时必须确认实际要发布哪一份
@@ -100,7 +101,7 @@ openyida list-forms <appType> --keyword <页面名>
100
101
  - `--health-check` 是发布内容读回校验,不是浏览器运行态 smoke。输出中的 `runtimeSmokeVerified=false`、`runtimeSmokeStatus=not_checked` 表示本命令没有验证页面渲染与交互;需要宣称“页面可运行”时,必须另有专项运行态证据。
101
102
  - `<source>` 必须是本轮实际 Write/Edit/Create 过的页面源码;`<displayPageFormUuid>` 必须是已解析的 display 自定义页面。发布了其他文件或其他目标页面,不满足本轮源码修改的 doneWhen。
102
103
  - 若 publish 没执行、执行失败、目标不明、登录态/组织不一致或用户要求先暂停,final 只能说“源码已修改,尚未发布”,并给出下一步需要执行的 publish 命令或阻塞原因。
103
- - 平台 JSX 组件页面的 `check-page` / `compile`、使用 `YidaCodeCanvas` 组件实现页面的 `compileCanvasLocal` 都是发布前 guard,不是远端完成证据。
104
+ - 平台 JSX 组件页面的 `check-page` / `compile`、Canvas 页面统一入口 `openyida compile <源文件> --json` 都是发布前 guard,不是远端完成证据。
104
105
 
105
106
  ## 数据源保留
106
107
 
@@ -117,7 +118,7 @@ openyida list-forms <appType> --keyword <页面名>
117
118
 
118
119
  `openyida publish` 会在保存 Schema 前执行确定性编译;Agent 不要把这一步改成口头检查:
119
120
 
120
- 1. `.canvas.jsx` / `.canvas.tsx`:执行 `YidaCodeCanvas` 页面编译,产出并写入 `runtimeCode` `importedModules`。该类源码不使用 `openyida check-page` / `openyida compile` 作为预检。
121
+ 1. `.canvas.jsx` / `.canvas.tsx`:发布前执行 `openyida compile <源文件> --json`;统一入口会按扩展名执行与发布阶段相同的 `YidaCodeCanvas` 编译并返回结构化结果。不要执行 `openyida check-page`,也不要直接调用内部编译函数或临时脚本。
121
122
  2. `.oyd.jsx` / `.openyida.jsx` 或显式 `--compat`:先运行 OpenYida compatibility compiler,输出宜搭平台 `Jsx` 组件可执行源码。
122
123
  3. 普通 `.jsx` / `.tsx` 源码如果已有 `export function renderJsx()`:视为平台 `Jsx` 组件源码,执行 lint、Babel、UglifyJS 后构建 Schema。
123
124
  4. 普通 `.jsx` / `.tsx` 源码如果没有 `renderJsx` 但存在 `export default function Page()`:只允许走有限 authoring 降级;Hooks、生命周期和运行态限制以`yida-custom-page` 为准。