@dongmingzhixiu/vuexir-compiler 0.4.4 → 0.4.5

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.
@@ -36,7 +36,7 @@ export declare function buildTheme(tokens: {
36
36
  fontNames: Map<string, string>;
37
37
  };
38
38
  /** R42 生成 Theme.swift(颜色/字体去重常量) */
39
- export declare const VRN_HELPERS_SWIFT = "import Foundation\n\n// vuexir \u8FD0\u884C\u65F6\u8F85\u52A9\uFF08R78 \u5BF9\u8C61\u5B57\u6BB5\u53D6\u503C\uFF09\n/// R78 \u5BF9\u8C61\u5B57\u6BB5\u53D6\u503C\uFF1A\u72B6\u6001\u91CC\u5B58 JSON \u5B57\u7B26\u4E32\u65F6\u6309 key \u53D6\u503C\uFF08\u975E JSON \u2192 \u8FD4\u56DE\u7A7A\u4E32\uFF09\n/// R85 \u70B9\u8DEF\u5F84\u53D6\u503C\uFF1Akey \u652F\u6301 \"a.b.c\" \u4E0E\u672B\u6BB5 \".length\"\uFF08\u6570\u7EC4/\u5B57\u5178/\u5B57\u7B26\u4E32\u957F\u5EA6\uFF09\n/// R110 \u5224\u771F\uFF1AJS \u91CC\u7684 truthiness \u8FD1\u4F3C\uFF08\u7A7A\u4E32/\"false\"/\"0\"/\"null\" \u4E3A\u5047\uFF09\nfunc vrnTruthy(_ v: String) -> Bool {\n if v.isEmpty { return false }\n if v == \"false\" || v == \"0\" || v == \"null\" || v == \"undefined\" { return false }\n return true\n}\n\nfunc vrnField(_ json: String, _ path: String, _ fallback: String = \"\") -> String {\n let raw = vrnFieldRaw(json, path)\n return raw.isEmpty ? fallback : raw\n}\n\n/// \u539F\u59CB\u53D6\u503C\uFF08\u4E0D\u5957\u515C\u5E95\uFF09\uFF1A\u70B9\u8DEF\u5F84\u4E0B\u94BB\uFF0C\u7F3A\u5931\u8FD4\u56DE\u7A7A\u4E32\nprivate func vrnFieldRaw(_ json: String, _ path: String) -> String {\n guard let data = json.data(using: .utf8),\n let root = try? JSONSerialization.jsonObject(with: data, options: [.fragmentsAllowed]) else { return \"\" }\n var cur: Any = root\n for seg in path.split(separator: \".\").map(String.init) {\n if seg == \"length\" || seg == \"size\" {\n if let a = cur as? [Any] { cur = a.count }\n else if let d = cur as? [String: Any] { cur = d.count }\n else if let s = cur as? String { cur = s.count }\n else { return \"\" }\n continue\n }\n if let d = cur as? [String: Any], let next = d[seg] { cur = next } else { return \"\" }\n }\n if let s = cur as? String { return s }\n if let b = cur as? Bool { return b ? \"true\" : \"false\" }\n if let n = cur as? NSNumber { return n.stringValue }\n return String(describing: cur)\n}\n";
39
+ export declare const VRN_HELPERS_SWIFT = "import Foundation\nimport SwiftUI\n\n// vuexir \u8FD0\u884C\u65F6\u8F85\u52A9\uFF08R78 \u5BF9\u8C61\u5B57\u6BB5\u53D6\u503C\uFF09\n/// R78 \u5BF9\u8C61\u5B57\u6BB5\u53D6\u503C\uFF1A\u72B6\u6001\u91CC\u5B58 JSON \u5B57\u7B26\u4E32\u65F6\u6309 key \u53D6\u503C\uFF08\u975E JSON \u2192 \u8FD4\u56DE\u7A7A\u4E32\uFF09\n/// R85 \u70B9\u8DEF\u5F84\u53D6\u503C\uFF1Akey \u652F\u6301 \"a.b.c\" \u4E0E\u672B\u6BB5 \".length\"\uFF08\u6570\u7EC4/\u5B57\u5178/\u5B57\u7B26\u4E32\u957F\u5EA6\uFF09\n/// R130\uFF1A\u72B6\u6001\u53EF\u80FD\u662F @State String \u6216 @Binding<String>\uFF0C\u7EDF\u4E00\u53D6\u503C\nfunc vrnStr(_ s: String) -> String { s }\nfunc vrnStr(_ b: SwiftUI.Binding<String>) -> String { b.wrappedValue }\n\n/// R110 \u5224\u771F\uFF1AJS \u91CC\u7684 truthiness \u8FD1\u4F3C\uFF08\u7A7A\u4E32/\"false\"/\"0\"/\"null\" \u4E3A\u5047\uFF09\nfunc vrnTruthy(_ v: String) -> Bool {\n if v.isEmpty { return false }\n if v == \"false\" || v == \"0\" || v == \"null\" || v == \"undefined\" { return false }\n return true\n}\n\nfunc vrnField(_ json: String, _ path: String, _ fallback: String = \"\") -> String {\n let raw = vrnFieldRaw(json, path)\n return raw.isEmpty ? fallback : raw\n}\n\n/// \u539F\u59CB\u53D6\u503C\uFF08\u4E0D\u5957\u515C\u5E95\uFF09\uFF1A\u70B9\u8DEF\u5F84\u4E0B\u94BB\uFF0C\u7F3A\u5931\u8FD4\u56DE\u7A7A\u4E32\nprivate func vrnFieldRaw(_ json: String, _ path: String) -> String {\n guard let data = json.data(using: .utf8),\n let root = try? JSONSerialization.jsonObject(with: data, options: [.fragmentsAllowed]) else { return \"\" }\n var cur: Any = root\n for seg in path.split(separator: \".\").map(String.init) {\n if seg == \"length\" || seg == \"size\" {\n if let a = cur as? [Any] { cur = a.count }\n else if let d = cur as? [String: Any] { cur = d.count }\n else if let s = cur as? String { cur = s.count }\n else { return \"\" }\n continue\n }\n if let d = cur as? [String: Any], let next = d[seg] { cur = next } else { return \"\" }\n }\n if let s = cur as? String { return s }\n if let b = cur as? Bool { return b ? \"true\" : \"false\" }\n if let n = cur as? NSNumber { return n.stringValue }\n return String(describing: cur)\n}\n";
40
40
  export declare function generateThemeSource(palette: {
41
41
  colorNames: Map<string, string>;
42
42
  fontNames: Map<string, string>;
@@ -118,10 +118,15 @@ export function buildTheme(tokens) {
118
118
  }
119
119
  /** R42 生成 Theme.swift(颜色/字体去重常量) */
120
120
  export const VRN_HELPERS_SWIFT = `import Foundation
121
+ import SwiftUI
121
122
 
122
123
  // vuexir 运行时辅助(R78 对象字段取值)
123
124
  /// R78 对象字段取值:状态里存 JSON 字符串时按 key 取值(非 JSON → 返回空串)
124
125
  /// R85 点路径取值:key 支持 "a.b.c" 与末段 ".length"(数组/字典/字符串长度)
126
+ /// R130:状态可能是 @State String 或 @Binding<String>,统一取值
127
+ func vrnStr(_ s: String) -> String { s }
128
+ func vrnStr(_ b: SwiftUI.Binding<String>) -> String { b.wrappedValue }
129
+
125
130
  /// R110 判真:JS 里的 truthiness 近似(空串/"false"/"0"/"null" 为假)
126
131
  func vrnTruthy(_ v: String) -> Bool {
127
132
  if v.isEmpty { return false }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dongmingzhixiu/vuexir-compiler",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Vue SFC → IR → 原生源码(SwiftUI / Compose)编译器核心:纯函数、零 IO",
5
5
  "type": "module",
6
6
  "license": "MIT",