@byteluck-fe/model-driven-core 7.1.0-beta.2 → 7.1.0-beta.4

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.
package/README.md CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  `@byteluck-fe/model-driven-core/contracts` 只导出版本、诊断和页面模型类型,不引用 Vue、DOM 或接口。Designer、Runtime 与 FDE 应从这里共享 `HeadlessControlNode`、`CompilePageModelInput/Result`、`ValidateSavedPageModelChangeInput` 和 build-info 契约;版本不一致时由编译或页面差分入口返回始终阻断的兼容性诊断。
10
10
 
11
+ `MODEL_DRIVEN_CAPABILITIES` 用稳定 feature 与精确版本声明整条 model-driven 发布列车提供的能力,例如 Runtime 历史缺失默认、增量页面校验、authoring facts 与属性 Patch 计划。宿主用 `admitModelDrivenCapabilities` 显式校验所需能力;版本不做 semver 推断。该 build info 是 release-train 声明,不代表只安装/导入 core 就包含 controls 或 driven 的实现,core-only 消费者仍须安装对应同列车子包并从其公开子入口调用。
12
+
11
13
  `HeadlessRuntimeOptions.locale` 接受任意非空字符串;调用方可提供当前语言的扁平 `localeMessages` 或同步 `resolveLocaleMessage`,公共层不会读取全局 i18n 或访问接口。
12
14
 
13
15
  ```
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var E=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable;var _=(t,e,o)=>e in t?n(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,r=(t,e)=>{for(var o in e||(e={}))O.call(e,o)&&_(t,o,e[o]);if(E)for(var o of E(e))s.call(e,o)&&_(t,o,e[o]);return t};Object.defineProperty(exports,"__esModule",{value:!0});const MODEL_DRIVEN_PACKAGE_VERSION="7.1.0-beta.2",CURRENT_PAGE_SCHEMA_VERSION="3.16",HEADLESS_COMPILER_CONTRACT_VERSION="model-driven.headless.v2",CONTROL_CATALOG_SCHEMA_VERSION="model-driven.control-catalog.v1",MODEL_DRIVEN_BUILD_INFO=Object.freeze({packageVersion:MODEL_DRIVEN_PACKAGE_VERSION,pageSchemaVersion:CURRENT_PAGE_SCHEMA_VERSION,compilerContractVersion:HEADLESS_COMPILER_CONTRACT_VERSION,catalogSchemaVersion:CONTROL_CATALOG_SCHEMA_VERSION});function getModelDrivenBuildInfo(){return r({},MODEL_DRIVEN_BUILD_INFO)}function createModelDrivenDiagnostic(t){return r({},t)}exports.CONTROL_CATALOG_SCHEMA_VERSION=CONTROL_CATALOG_SCHEMA_VERSION,exports.CURRENT_PAGE_SCHEMA_VERSION=CURRENT_PAGE_SCHEMA_VERSION,exports.HEADLESS_COMPILER_CONTRACT_VERSION=HEADLESS_COMPILER_CONTRACT_VERSION,exports.MODEL_DRIVEN_BUILD_INFO=MODEL_DRIVEN_BUILD_INFO,exports.MODEL_DRIVEN_PACKAGE_VERSION=MODEL_DRIVEN_PACKAGE_VERSION,exports.createModelDrivenDiagnostic=createModelDrivenDiagnostic,exports.getModelDrivenBuildInfo=getModelDrivenBuildInfo;
1
+ "use strict";var f=Object.defineProperty,_=Object.defineProperties;var u=Object.getOwnPropertyDescriptors;var s=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable;var c=(t,n,r)=>n in t?f(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r,i=(t,n)=>{for(var r in n||(n={}))O.call(n,r)&&c(t,r,n[r]);if(s)for(var r of s(n))p.call(n,r)&&c(t,r,n[r]);return t},l=(t,n)=>_(t,u(n));Object.defineProperty(exports,"__esModule",{value:!0});const MODEL_DRIVEN_PACKAGE_VERSION="7.1.0-beta.4",CURRENT_PAGE_SCHEMA_VERSION="3.16",HEADLESS_COMPILER_CONTRACT_VERSION="model-driven.headless.v2",CONTROL_CATALOG_SCHEMA_VERSION="model-driven.control-catalog.v1",MODEL_DRIVEN_FEATURES=Object.freeze({runtimeAbsentDefaults:"model-driven.runtime-absent-defaults",incrementalPageValidation:"model-driven.incremental-page-validation",controlAuthoringFacts:"model-driven.control-authoring-facts",controlPropertyPatchPlan:"model-driven.control-property-patch-plan"}),MODEL_DRIVEN_CAPABILITIES=Object.freeze([Object.freeze({feature:MODEL_DRIVEN_FEATURES.runtimeAbsentDefaults,version:"1"}),Object.freeze({feature:MODEL_DRIVEN_FEATURES.incrementalPageValidation,version:"1"}),Object.freeze({feature:MODEL_DRIVEN_FEATURES.controlAuthoringFacts,version:"1"}),Object.freeze({feature:MODEL_DRIVEN_FEATURES.controlPropertyPatchPlan,version:"1"})]);function nonEmptyCapabilityPart(t){return typeof t=="string"&&t.trim().length>0}function admitModelDrivenCapabilities(t){const n=new Map;for(const e of t.available||[]){if(!e||!nonEmptyCapabilityPart(e.feature)||!nonEmptyCapabilityPart(e.version))continue;const o=n.get(e.feature)||new Set;o.add(e.version),n.set(e.feature,o)}const r=new Map;for(const e of t.required||[]){if(!e)continue;const o=JSON.stringify([e.feature,e.version]);r.set(o,e)}const a=[...r.values()].sort((e,o)=>`${String(e.feature)}\0${String(e.version)}`.localeCompare(`${String(o.feature)}\0${String(o.version)}`)).flatMap(e=>{const o=nonEmptyCapabilityPart(e.feature)?[...n.get(e.feature)||[]].sort():[],E=nonEmptyCapabilityPart(e.version)?e.version:String(e.version||"");return nonEmptyCapabilityPart(e.feature)&&nonEmptyCapabilityPart(e.version)&&o.includes(e.version)?[]:[{feature:nonEmptyCapabilityPart(e.feature)?e.feature:String(e.feature||""),requiredVersion:E,availableVersions:o,reason:o.length===0?"missing":"version-mismatch"}]});return{ok:a.length===0,issues:a}}const MODEL_DRIVEN_BUILD_INFO=Object.freeze({packageVersion:MODEL_DRIVEN_PACKAGE_VERSION,pageSchemaVersion:CURRENT_PAGE_SCHEMA_VERSION,compilerContractVersion:HEADLESS_COMPILER_CONTRACT_VERSION,catalogSchemaVersion:CONTROL_CATALOG_SCHEMA_VERSION,capabilities:MODEL_DRIVEN_CAPABILITIES});function getModelDrivenBuildInfo(){return l(i({},MODEL_DRIVEN_BUILD_INFO),{capabilities:MODEL_DRIVEN_BUILD_INFO.capabilities.map(t=>i({},t))})}function createModelDrivenDiagnostic(t){return i({},t)}exports.CONTROL_CATALOG_SCHEMA_VERSION=CONTROL_CATALOG_SCHEMA_VERSION,exports.CURRENT_PAGE_SCHEMA_VERSION=CURRENT_PAGE_SCHEMA_VERSION,exports.HEADLESS_COMPILER_CONTRACT_VERSION=HEADLESS_COMPILER_CONTRACT_VERSION,exports.MODEL_DRIVEN_BUILD_INFO=MODEL_DRIVEN_BUILD_INFO,exports.MODEL_DRIVEN_CAPABILITIES=MODEL_DRIVEN_CAPABILITIES,exports.MODEL_DRIVEN_FEATURES=MODEL_DRIVEN_FEATURES,exports.MODEL_DRIVEN_PACKAGE_VERSION=MODEL_DRIVEN_PACKAGE_VERSION,exports.admitModelDrivenCapabilities=admitModelDrivenCapabilities,exports.createModelDrivenDiagnostic=createModelDrivenDiagnostic,exports.getModelDrivenBuildInfo=getModelDrivenBuildInfo;
@@ -1 +1 @@
1
- var s=Object.defineProperty;var c=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable;var r=(n,e,o)=>e in n?s(n,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[e]=o,t=(n,e)=>{for(var o in e||(e={}))R.call(e,o)&&r(n,o,e[o]);if(c)for(var o of c(e))l.call(e,o)&&r(n,o,e[o]);return n};const E="7.1.0-beta.2",_="3.16",a="model-driven.headless.v2",i="model-driven.control-catalog.v1",O=Object.freeze({packageVersion:E,pageSchemaVersion:_,compilerContractVersion:a,catalogSchemaVersion:i});function C(){return t({},O)}function I(n){return t({},n)}export{i as CONTROL_CATALOG_SCHEMA_VERSION,_ as CURRENT_PAGE_SCHEMA_VERSION,a as HEADLESS_COMPILER_CONTRACT_VERSION,O as MODEL_DRIVEN_BUILD_INFO,E as MODEL_DRIVEN_PACKAGE_VERSION,I as createModelDrivenDiagnostic,C as getModelDrivenBuildInfo};
1
+ var S=Object.defineProperty,_=Object.defineProperties;var d=Object.getOwnPropertyDescriptors;var f=Object.getOwnPropertySymbols;var V=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var u=(t,n,o)=>n in t?S(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,s=(t,n)=>{for(var o in n||(n={}))V.call(n,o)&&u(t,o,n[o]);if(f)for(var o of f(n))A.call(n,o)&&u(t,o,n[o]);return t},v=(t,n)=>_(t,d(n));const g="7.1.0-beta.4",m="3.16",p="model-driven.headless.v2",E="model-driven.control-catalog.v1",i=Object.freeze({runtimeAbsentDefaults:"model-driven.runtime-absent-defaults",incrementalPageValidation:"model-driven.incremental-page-validation",controlAuthoringFacts:"model-driven.control-authoring-facts",controlPropertyPatchPlan:"model-driven.control-property-patch-plan"}),O=Object.freeze([Object.freeze({feature:i.runtimeAbsentDefaults,version:"1"}),Object.freeze({feature:i.incrementalPageValidation,version:"1"}),Object.freeze({feature:i.controlAuthoringFacts,version:"1"}),Object.freeze({feature:i.controlPropertyPatchPlan,version:"1"})]);function a(t){return typeof t=="string"&&t.trim().length>0}function D(t){const n=new Map;for(const e of t.available||[]){if(!e||!a(e.feature)||!a(e.version))continue;const r=n.get(e.feature)||new Set;r.add(e.version),n.set(e.feature,r)}const o=new Map;for(const e of t.required||[]){if(!e)continue;const r=JSON.stringify([e.feature,e.version]);o.set(r,e)}const l=[...o.values()].sort((e,r)=>`${String(e.feature)}\0${String(e.version)}`.localeCompare(`${String(r.feature)}\0${String(r.version)}`)).flatMap(e=>{const r=a(e.feature)?[...n.get(e.feature)||[]].sort():[],b=a(e.version)?e.version:String(e.version||"");return a(e.feature)&&a(e.version)&&r.includes(e.version)?[]:[{feature:a(e.feature)?e.feature:String(e.feature||""),requiredVersion:b,availableVersions:r,reason:r.length===0?"missing":"version-mismatch"}]});return{ok:l.length===0,issues:l}}const c=Object.freeze({packageVersion:g,pageSchemaVersion:m,compilerContractVersion:p,catalogSchemaVersion:E,capabilities:O});function I(){return v(s({},c),{capabilities:c.capabilities.map(t=>s({},t))})}function C(t){return s({},t)}export{E as CONTROL_CATALOG_SCHEMA_VERSION,m as CURRENT_PAGE_SCHEMA_VERSION,p as HEADLESS_COMPILER_CONTRACT_VERSION,c as MODEL_DRIVEN_BUILD_INFO,O as MODEL_DRIVEN_CAPABILITIES,i as MODEL_DRIVEN_FEATURES,g as MODEL_DRIVEN_PACKAGE_VERSION,D as admitModelDrivenCapabilities,C as createModelDrivenDiagnostic,I as getModelDrivenBuildInfo};
@@ -0,0 +1 @@
1
+ export { };
@@ -24,13 +24,42 @@ function _object_spread(target) {
24
24
  }
25
25
  return target;
26
26
  }
27
+ function ownKeys(object, enumerableOnly) {
28
+ var keys = Object.keys(object);
29
+ if (Object.getOwnPropertySymbols) {
30
+ var symbols = Object.getOwnPropertySymbols(object);
31
+ if (enumerableOnly) {
32
+ symbols = symbols.filter(function(sym) {
33
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
34
+ });
35
+ }
36
+ keys.push.apply(keys, symbols);
37
+ }
38
+ return keys;
39
+ }
40
+ function _object_spread_props(target, source) {
41
+ source = source != null ? source : {};
42
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
43
+ else {
44
+ ownKeys(Object(source)).forEach(function(key) {
45
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
46
+ });
47
+ }
48
+ return target;
49
+ }
27
50
  import { CONTROL_CATALOG_SCHEMA_VERSION, CURRENT_PAGE_SCHEMA_VERSION, HEADLESS_COMPILER_CONTRACT_VERSION, MODEL_DRIVEN_PACKAGE_VERSION } from './versions';
51
+ import { MODEL_DRIVEN_CAPABILITIES } from './capabilities';
28
52
  export var MODEL_DRIVEN_BUILD_INFO = Object.freeze({
29
53
  packageVersion: MODEL_DRIVEN_PACKAGE_VERSION,
30
54
  pageSchemaVersion: CURRENT_PAGE_SCHEMA_VERSION,
31
55
  compilerContractVersion: HEADLESS_COMPILER_CONTRACT_VERSION,
32
- catalogSchemaVersion: CONTROL_CATALOG_SCHEMA_VERSION
56
+ catalogSchemaVersion: CONTROL_CATALOG_SCHEMA_VERSION,
57
+ capabilities: MODEL_DRIVEN_CAPABILITIES
33
58
  });
34
59
  /** 返回新对象,避免调用方意外改写共享的版本事实。 */ export function getModelDrivenBuildInfo() {
35
- return _object_spread({}, MODEL_DRIVEN_BUILD_INFO);
60
+ return _object_spread_props(_object_spread({}, MODEL_DRIVEN_BUILD_INFO), {
61
+ capabilities: MODEL_DRIVEN_BUILD_INFO.capabilities.map(function(capability) {
62
+ return _object_spread({}, capability);
63
+ })
64
+ });
36
65
  }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * 公共能力使用独立于 npm 包版本的稳定 feature 名称与精确版本。
3
+ *
4
+ * capability 版本是调用契约,不按 semver 猜测兼容范围;宿主必须声明自己要求的
5
+ * feature/version,公共层仅在精确命中时准入,从而避免“包版本一致但能力缺失”。
6
+ */ function _array_like_to_array(arr, len) {
7
+ if (len == null || len > arr.length) len = arr.length;
8
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
9
+ return arr2;
10
+ }
11
+ function _array_without_holes(arr) {
12
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
13
+ }
14
+ function _iterable_to_array(iter) {
15
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
16
+ return Array.from(iter);
17
+ }
18
+ }
19
+ function _non_iterable_spread() {
20
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
21
+ }
22
+ function _to_consumable_array(arr) {
23
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
24
+ }
25
+ function _unsupported_iterable_to_array(o, minLen) {
26
+ if (!o) return;
27
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
28
+ var n = Object.prototype.toString.call(o).slice(8, -1);
29
+ if (n === "Object" && o.constructor) n = o.constructor.name;
30
+ if (n === "Map" || n === "Set") return Array.from(n);
31
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
32
+ }
33
+ export var MODEL_DRIVEN_FEATURES = Object.freeze({
34
+ runtimeAbsentDefaults: 'model-driven.runtime-absent-defaults',
35
+ incrementalPageValidation: 'model-driven.incremental-page-validation',
36
+ controlAuthoringFacts: 'model-driven.control-authoring-facts',
37
+ controlPropertyPatchPlan: 'model-driven.control-property-patch-plan'
38
+ });
39
+ /** 当前发布列车明确提供的能力;新增或变更语义时必须显式调整对应版本。 */ export var MODEL_DRIVEN_CAPABILITIES = Object.freeze([
40
+ Object.freeze({
41
+ feature: MODEL_DRIVEN_FEATURES.runtimeAbsentDefaults,
42
+ version: '1'
43
+ }),
44
+ Object.freeze({
45
+ feature: MODEL_DRIVEN_FEATURES.incrementalPageValidation,
46
+ version: '1'
47
+ }),
48
+ Object.freeze({
49
+ feature: MODEL_DRIVEN_FEATURES.controlAuthoringFacts,
50
+ version: '1'
51
+ }),
52
+ Object.freeze({
53
+ feature: MODEL_DRIVEN_FEATURES.controlPropertyPatchPlan,
54
+ version: '1'
55
+ })
56
+ ]);
57
+ function nonEmptyCapabilityPart(value) {
58
+ return typeof value === 'string' && value.trim().length > 0;
59
+ }
60
+ /**
61
+ * 对宿主声明的 required capabilities 做纯集合准入;结果稳定排序且不抛出输入内容。
62
+ * 相同声明会去重,无效或不匹配声明按 fail-closed 处理;函数不读取任何外部状态。
63
+ */ export function admitModelDrivenCapabilities(input) {
64
+ var availableVersionsByFeature = new Map();
65
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
66
+ try {
67
+ for(var _iterator = (input.available || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
68
+ var capability = _step.value;
69
+ if (!capability || !nonEmptyCapabilityPart(capability.feature) || !nonEmptyCapabilityPart(capability.version)) {
70
+ continue;
71
+ }
72
+ var versions = availableVersionsByFeature.get(capability.feature) || new Set();
73
+ versions.add(capability.version);
74
+ availableVersionsByFeature.set(capability.feature, versions);
75
+ }
76
+ } catch (err) {
77
+ _didIteratorError = true;
78
+ _iteratorError = err;
79
+ } finally{
80
+ try {
81
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
82
+ _iterator.return();
83
+ }
84
+ } finally{
85
+ if (_didIteratorError) {
86
+ throw _iteratorError;
87
+ }
88
+ }
89
+ }
90
+ var requirements = new Map();
91
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
92
+ try {
93
+ for(var _iterator1 = (input.required || [])[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
94
+ var capability1 = _step1.value;
95
+ if (!capability1) continue;
96
+ var key = JSON.stringify([
97
+ capability1.feature,
98
+ capability1.version
99
+ ]);
100
+ requirements.set(key, capability1);
101
+ }
102
+ } catch (err) {
103
+ _didIteratorError1 = true;
104
+ _iteratorError1 = err;
105
+ } finally{
106
+ try {
107
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
108
+ _iterator1.return();
109
+ }
110
+ } finally{
111
+ if (_didIteratorError1) {
112
+ throw _iteratorError1;
113
+ }
114
+ }
115
+ }
116
+ var issues = _to_consumable_array(requirements.values()).sort(function(left, right) {
117
+ return "".concat(String(left.feature), "\0").concat(String(left.version)).localeCompare("".concat(String(right.feature), "\0").concat(String(right.version)));
118
+ }).flatMap(function(required) {
119
+ var availableVersions = nonEmptyCapabilityPart(required.feature) ? _to_consumable_array(availableVersionsByFeature.get(required.feature) || []).sort() : [];
120
+ var requiredVersion = nonEmptyCapabilityPart(required.version) ? required.version : String(required.version || '');
121
+ if (nonEmptyCapabilityPart(required.feature) && nonEmptyCapabilityPart(required.version) && availableVersions.includes(required.version)) {
122
+ return [];
123
+ }
124
+ return [
125
+ {
126
+ feature: nonEmptyCapabilityPart(required.feature) ? required.feature : String(required.feature || ''),
127
+ requiredVersion: requiredVersion,
128
+ availableVersions: availableVersions,
129
+ reason: availableVersions.length === 0 ? 'missing' : 'version-mismatch'
130
+ }
131
+ ];
132
+ });
133
+ return {
134
+ ok: issues.length === 0,
135
+ issues: issues
136
+ };
137
+ }
@@ -1,4 +1,6 @@
1
1
  export * from './versions';
2
+ export * from './capabilities';
2
3
  export * from './build-info';
3
4
  export * from './diagnostics';
4
5
  export * from './page-model';
6
+ export * from './authoring';
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 注意:npm 包版本、页面持久化 schema 版本和纯编译契约版本是三套独立版本,
5
5
  * 不能再通过其中任意一个推断另外两个。
6
- */ export var MODEL_DRIVEN_PACKAGE_VERSION = '7.1.0-beta.2';
6
+ */ export var MODEL_DRIVEN_PACKAGE_VERSION = '7.1.0-beta.4';
7
7
  /** 当前设计器写入的页面持久化 schema 版本。 */ export var CURRENT_PAGE_SCHEMA_VERSION = '3.16';
8
8
  /** Node 纯编译入口的契约版本。 */ export var HEADLESS_COMPILER_CONTRACT_VERSION = 'model-driven.headless.v2';
9
9
  /** 静态控件目录的文档结构版本。 */ export var CONTROL_CATALOG_SCHEMA_VERSION = 'model-driven.control-catalog.v1';
@@ -0,0 +1,47 @@
1
+ import { ModelDrivenCapability, ModelDrivenCapabilityAdmissionResult } from './capabilities';
2
+ import { ModelDrivenDiagnostic } from './diagnostics';
3
+ import { JsonObject, JsonValue } from './page-model';
4
+ /**
5
+ * 宿主对单个保存属性的显式准入;公共层没有默认 allowlist。
6
+ *
7
+ * 宿主只能对 catalog 已发布的保存属性授权;紧凑约束缺失时继续失败关闭。
8
+ */
9
+ export interface ControlPropertyAdmission {
10
+ savedPropertyKey: string;
11
+ allowNull?: boolean;
12
+ /** object/array 只有顶层类型事实时,宿主必须显式承担深层结构校验。 */
13
+ allowIncompleteConstraint?: boolean;
14
+ }
15
+ export interface ControlPropertyPatchPolicy {
16
+ properties: readonly ControlPropertyAdmission[];
17
+ }
18
+ export interface ControlPropertyPatchInput {
19
+ /** 必须精确声明 control-property-patch-plan feature/version。 */
20
+ capability: ModelDrivenCapability;
21
+ controlType: string;
22
+ controlId?: string;
23
+ /**
24
+ * 本批只规划 set:key 必须是 catalog 保存键,null 是显式值,undefined 一律拒绝。
25
+ * remove 需要独立的 absent-runtime admission,不能借用 undefined 表达。
26
+ */
27
+ set: JsonObject;
28
+ policy: ControlPropertyPatchPolicy;
29
+ }
30
+ export interface PlannedControlPropertyPatchEntry {
31
+ propertyKey: string;
32
+ savedPropertyKey: string;
33
+ value: JsonValue;
34
+ }
35
+ export interface ControlPropertyPatchPlan {
36
+ controlType: string;
37
+ savedPropsPatch: JsonObject;
38
+ entries: PlannedControlPropertyPatchEntry[];
39
+ }
40
+ export interface ControlAuthoringValidationResult {
41
+ ok: boolean;
42
+ diagnostics: ModelDrivenDiagnostic[];
43
+ capabilityAdmission: ModelDrivenCapabilityAdmissionResult;
44
+ }
45
+ export interface ControlPropertyPatchPlanResult extends ControlAuthoringValidationResult {
46
+ plan?: ControlPropertyPatchPlan;
47
+ }
@@ -1,4 +1,5 @@
1
1
  import { CONTROL_CATALOG_SCHEMA_VERSION, CURRENT_PAGE_SCHEMA_VERSION, HEADLESS_COMPILER_CONTRACT_VERSION, MODEL_DRIVEN_PACKAGE_VERSION } from './versions';
2
+ import { ModelDrivenCapability } from './capabilities';
2
3
  /**
3
4
  * 可跨 Designer、Runtime 与 FDE 比对的公共构建信息。
4
5
  * catalogRevision 由 controls/catalog 在生成阶段补充,core 不反向依赖 controls。
@@ -9,6 +10,15 @@ export interface ModelDrivenBuildInfo {
9
10
  compilerContractVersion: typeof HEADLESS_COMPILER_CONTRACT_VERSION;
10
11
  catalogSchemaVersion: typeof CONTROL_CATALOG_SCHEMA_VERSION;
11
12
  catalogRevision?: string;
13
+ /**
14
+ * 发布列车实际提供的精确 feature/version 能力。
15
+ * 字段可选仅为兼容旧宿主构造的 build-info;当前查询 API 始终返回它。
16
+ */
17
+ capabilities?: ReadonlyArray<ModelDrivenCapability>;
18
+ }
19
+ /** 当前版本实际返回的完整 build-info,保留旧 ModelDrivenBuildInfo 的源码兼容。 */
20
+ export interface ModelDrivenBuildInfoWithCapabilities extends ModelDrivenBuildInfo {
21
+ capabilities: ReadonlyArray<ModelDrivenCapability>;
12
22
  }
13
23
  /**
14
24
  * 调用方声明的版本期望允许任意字符串,才能在类型安全的调用中表达并检测旧版本。
@@ -19,7 +29,9 @@ export interface ModelDrivenBuildInfoExpectation {
19
29
  compilerContractVersion?: string;
20
30
  catalogSchemaVersion?: string;
21
31
  catalogRevision?: string;
32
+ /** 宿主按 feature/version 显式声明所需能力;任一缺失或版本不同均 fail-closed。 */
33
+ requiredCapabilities?: readonly ModelDrivenCapability[];
22
34
  }
23
- export declare const MODEL_DRIVEN_BUILD_INFO: Readonly<ModelDrivenBuildInfo>;
35
+ export declare const MODEL_DRIVEN_BUILD_INFO: Readonly<ModelDrivenBuildInfoWithCapabilities>;
24
36
  /** 返回新对象,避免调用方意外改写共享的版本事实。 */
25
- export declare function getModelDrivenBuildInfo(): ModelDrivenBuildInfo;
37
+ export declare function getModelDrivenBuildInfo(): ModelDrivenBuildInfoWithCapabilities;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 公共能力使用独立于 npm 包版本的稳定 feature 名称与精确版本。
3
+ *
4
+ * capability 版本是调用契约,不按 semver 猜测兼容范围;宿主必须声明自己要求的
5
+ * feature/version,公共层仅在精确命中时准入,从而避免“包版本一致但能力缺失”。
6
+ */
7
+ export interface ModelDrivenCapability {
8
+ feature: string;
9
+ version: string;
10
+ }
11
+ export type ModelDrivenCapabilityAdmissionIssueReason = 'missing' | 'version-mismatch';
12
+ export interface ModelDrivenCapabilityAdmissionIssue {
13
+ feature: string;
14
+ requiredVersion: string;
15
+ availableVersions: string[];
16
+ reason: ModelDrivenCapabilityAdmissionIssueReason;
17
+ }
18
+ export interface ModelDrivenCapabilityAdmissionResult {
19
+ ok: boolean;
20
+ issues: ModelDrivenCapabilityAdmissionIssue[];
21
+ }
22
+ export declare const MODEL_DRIVEN_FEATURES: Readonly<{
23
+ readonly runtimeAbsentDefaults: "model-driven.runtime-absent-defaults";
24
+ readonly incrementalPageValidation: "model-driven.incremental-page-validation";
25
+ readonly controlAuthoringFacts: "model-driven.control-authoring-facts";
26
+ readonly controlPropertyPatchPlan: "model-driven.control-property-patch-plan";
27
+ }>;
28
+ /** 当前发布列车明确提供的能力;新增或变更语义时必须显式调整对应版本。 */
29
+ export declare const MODEL_DRIVEN_CAPABILITIES: ReadonlyArray<ModelDrivenCapability>;
30
+ /**
31
+ * 对宿主声明的 required capabilities 做纯集合准入;结果稳定排序且不抛出输入内容。
32
+ * 相同声明会去重,无效或不匹配声明按 fail-closed 处理;函数不读取任何外部状态。
33
+ */
34
+ export declare function admitModelDrivenCapabilities(input: {
35
+ available?: readonly ModelDrivenCapability[];
36
+ required?: readonly ModelDrivenCapability[];
37
+ }): ModelDrivenCapabilityAdmissionResult;
@@ -1,4 +1,6 @@
1
1
  export * from './versions';
2
+ export * from './capabilities';
2
3
  export * from './build-info';
3
4
  export * from './diagnostics';
4
5
  export * from './page-model';
6
+ export * from './authoring';
@@ -4,7 +4,7 @@
4
4
  * 注意:npm 包版本、页面持久化 schema 版本和纯编译契约版本是三套独立版本,
5
5
  * 不能再通过其中任意一个推断另外两个。
6
6
  */
7
- export declare const MODEL_DRIVEN_PACKAGE_VERSION: "7.1.0-beta.2";
7
+ export declare const MODEL_DRIVEN_PACKAGE_VERSION: "7.1.0-beta.4";
8
8
  /** 当前设计器写入的页面持久化 schema 版本。 */
9
9
  export declare const CURRENT_PAGE_SCHEMA_VERSION: "3.16";
10
10
  /** Node 纯编译入口的契约版本。 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@byteluck-fe/model-driven-core",
3
- "version": "7.1.0-beta.2",
3
+ "version": "7.1.0-beta.4",
4
4
  "description": "model engine core",
5
5
  "author": "郝晨光 <2293885211@qq.com>",
6
6
  "homepage": "",
@@ -48,9 +48,9 @@
48
48
  "postpublish": "node ../../scripts/postpublish.js"
49
49
  },
50
50
  "dependencies": {
51
- "@byteluck-fe/model-driven-shared": "7.1.0-beta.2",
51
+ "@byteluck-fe/model-driven-shared": "7.1.0-beta.4",
52
52
  "async-validator": "3.5.1",
53
53
  "tslib": "^2.1.0"
54
54
  },
55
- "gitHead": "68b8a947f7a0bc1b0e4ec68a71aafac5e0e7cd37"
55
+ "gitHead": "82847b31dd60becd6a77ed5d831c12f57b3dc7aa"
56
56
  }