@aster-cloud/aster-lang-ts 0.1.5 → 0.2.0

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.
Files changed (108) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +201 -0
  3. package/README.md +2 -0
  4. package/dist/scripts/core-ir-json.d.ts +3 -0
  5. package/dist/scripts/core-ir-json.d.ts.map +1 -0
  6. package/dist/scripts/core-ir-json.js +72 -0
  7. package/dist/scripts/core-ir-json.js.map +1 -0
  8. package/dist/scripts/golden.js +49 -0
  9. package/dist/scripts/golden.js.map +1 -1
  10. package/dist/src/ai/providers/anthropic.d.ts +17 -0
  11. package/dist/src/ai/providers/anthropic.d.ts.map +1 -1
  12. package/dist/src/ai/providers/anthropic.js +58 -15
  13. package/dist/src/ai/providers/anthropic.js.map +1 -1
  14. package/dist/src/browser/schema.d.ts +52 -0
  15. package/dist/src/browser/schema.d.ts.map +1 -0
  16. package/dist/src/browser/schema.js +205 -0
  17. package/dist/src/browser/schema.js.map +1 -0
  18. package/dist/src/browser.d.ts +3 -53
  19. package/dist/src/browser.d.ts.map +1 -1
  20. package/dist/src/browser.js +20 -186
  21. package/dist/src/browser.js.map +1 -1
  22. package/dist/src/cli/policy-converter.js +8 -1
  23. package/dist/src/cli/policy-converter.js.map +1 -1
  24. package/dist/src/config/lexicons/fallback-lexicon.d.ts +41 -0
  25. package/dist/src/config/lexicons/fallback-lexicon.d.ts.map +1 -0
  26. package/dist/src/config/lexicons/fallback-lexicon.js +88 -0
  27. package/dist/src/config/lexicons/fallback-lexicon.js.map +1 -0
  28. package/dist/src/config/lexicons/index.d.ts +25 -3
  29. package/dist/src/config/lexicons/index.d.ts.map +1 -1
  30. package/dist/src/config/lexicons/index.js +42 -7
  31. package/dist/src/config/lexicons/index.js.map +1 -1
  32. package/dist/src/config/lexicons/registry.d.ts.map +1 -1
  33. package/dist/src/config/lexicons/registry.js +43 -5
  34. package/dist/src/config/lexicons/registry.js.map +1 -1
  35. package/dist/src/config/semantic.d.ts +12 -0
  36. package/dist/src/config/semantic.d.ts.map +1 -1
  37. package/dist/src/config/semantic.js +16 -0
  38. package/dist/src/config/semantic.js.map +1 -1
  39. package/dist/src/core/interpreter.js +2 -0
  40. package/dist/src/core/interpreter.js.map +1 -1
  41. package/dist/src/core/visitor.d.ts.map +1 -1
  42. package/dist/src/core/visitor.js +17 -0
  43. package/dist/src/core/visitor.js.map +1 -1
  44. package/dist/src/frontend/lexer.d.ts.map +1 -1
  45. package/dist/src/frontend/lexer.js +7 -1
  46. package/dist/src/frontend/lexer.js.map +1 -1
  47. package/dist/src/jvm/emitter.js +2 -2
  48. package/dist/src/jvm/emitter.js.map +1 -1
  49. package/dist/src/lsp/diagnostics.d.ts +10 -0
  50. package/dist/src/lsp/diagnostics.d.ts.map +1 -1
  51. package/dist/src/lsp/diagnostics.js +43 -1
  52. package/dist/src/lsp/diagnostics.js.map +1 -1
  53. package/dist/src/lsp/pii_diagnostics.d.ts.map +1 -1
  54. package/dist/src/lsp/pii_diagnostics.js +4 -1
  55. package/dist/src/lsp/pii_diagnostics.js.map +1 -1
  56. package/dist/src/lsp/server.js +34 -14
  57. package/dist/src/lsp/server.js.map +1 -1
  58. package/dist/src/lsp/utils.js +1 -1
  59. package/dist/src/lsp/utils.js.map +1 -1
  60. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  61. package/dist/src/parser/decl-parser.js +12 -1
  62. package/dist/src/parser/decl-parser.js.map +1 -1
  63. package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
  64. package/dist/src/parser/expr-stmt-parser.js +81 -4
  65. package/dist/src/parser/expr-stmt-parser.js.map +1 -1
  66. package/dist/src/parser/input-generator.d.ts +2 -0
  67. package/dist/src/parser/input-generator.d.ts.map +1 -1
  68. package/dist/src/parser/input-generator.js +11 -1
  69. package/dist/src/parser/input-generator.js.map +1 -1
  70. package/dist/src/parser/type-parser.js +1 -1
  71. package/dist/src/parser/type-parser.js.map +1 -1
  72. package/dist/src/typecheck/browser.d.ts.map +1 -1
  73. package/dist/src/typecheck/browser.js +87 -8
  74. package/dist/src/typecheck/browser.js.map +1 -1
  75. package/dist/src/typecheck/effects.d.ts.map +1 -1
  76. package/dist/src/typecheck/effects.js +17 -3
  77. package/dist/src/typecheck/effects.js.map +1 -1
  78. package/dist/src/types.d.ts +1 -0
  79. package/dist/src/types.d.ts.map +1 -1
  80. package/dist/src/types.js +1 -0
  81. package/dist/src/types.js.map +1 -1
  82. package/dist/test/e2e/runner/golden-runner.js +21 -10
  83. package/dist/test/e2e/runner/golden-runner.js.map +1 -1
  84. package/dist/test/integration/compliance/compliance-smoke.test.js +27 -35
  85. package/dist/test/integration/compliance/compliance-smoke.test.js.map +1 -1
  86. package/dist/test/integration/lsp/lsp-multi-rename.test.js +8 -7
  87. package/dist/test/integration/lsp/lsp-multi-rename.test.js.map +1 -1
  88. package/dist/test/policy-converter/round-trip.test.js +6 -4
  89. package/dist/test/policy-converter/round-trip.test.js.map +1 -1
  90. package/dist/test/regression/type-checker-golden.test.js +8 -4
  91. package/dist/test/regression/type-checker-golden.test.js.map +1 -1
  92. package/dist/test/type-checker/cross-module-packages.test.js +5 -3
  93. package/dist/test/type-checker/cross-module-packages.test.js.map +1 -1
  94. package/dist/test/unit/browser/typecheck-browser-unsupported.test.d.ts +2 -0
  95. package/dist/test/unit/browser/typecheck-browser-unsupported.test.d.ts.map +1 -0
  96. package/dist/test/unit/browser/typecheck-browser-unsupported.test.js +100 -0
  97. package/dist/test/unit/browser/typecheck-browser-unsupported.test.js.map +1 -0
  98. package/dist/test/unit/config/lexicons/i18n.test.js +20 -11
  99. package/dist/test/unit/config/lexicons/i18n.test.js.map +1 -1
  100. package/dist/test/unit/config/lexicons/zh-CN.test.js +21 -11
  101. package/dist/test/unit/config/lexicons/zh-CN.test.js.map +1 -1
  102. package/dist/test/unit/lexicons/fallback-lexicon.test.d.ts +16 -0
  103. package/dist/test/unit/lexicons/fallback-lexicon.test.d.ts.map +1 -0
  104. package/dist/test/unit/lexicons/fallback-lexicon.test.js +98 -0
  105. package/dist/test/unit/lexicons/fallback-lexicon.test.js.map +1 -0
  106. package/dist/test/unit/llm-providers.test.js +105 -93
  107. package/dist/test/unit/llm-providers.test.js.map +1 -1
  108. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../../src/ai/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAO9C,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAY;IAClB,KAAK,CAAS;IAEtB,YAAY,SAA0B,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAAC,iDAAiD,EAAE,WAAW,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,4BAA4B,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAmB;QAChC,IAAI,CAAC;YACH,4BAA4B;YAC5B,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,MAAM,CAAC;YAC1C,CAAC;YACD,MAAM,IAAI,cAAc,OAAO,CAAC,MAAM,gBAAgB,CAAC;YAEvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,oBAAoB,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;gBAC/C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;gBACvC,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;YACrD,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,QAAQ,CAAC,UAAU;gBAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,KAAK,EAAE;oBACL,+CAA+C;oBAC/C,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC1C,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC3D,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;iBACzE;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,QAAQ,CAChB,qBAAqB,KAAK,CAAC,OAAO,EAAE,EACpC,WAAW,EACX,KAAK,CACN,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,QAAQ,CAChB,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC3E,WAAW,EACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../../src/ai/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @module @aster-cloud/aster-lang-ts/browser/schema
3
+ *
4
+ * Schema extraction for dynamic form generation. Split out of `browser.ts`
5
+ * in the Round-3 codex refactor: previously the main browser entry was a
6
+ * 660-line monolith mixing compile / validate / schema / evaluate / typecheck
7
+ * gates. Public exports remain available from `@aster-cloud/aster-lang-ts/browser`
8
+ * — this module is implementation detail.
9
+ */
10
+ import type { Lexicon } from '../config/lexicons/types.js';
11
+ import type { ParameterInfo } from '../parser/input-generator.js';
12
+ /** Schema extraction options */
13
+ export interface SchemaOptions {
14
+ /** CNL lexicon (default: EN_US) */
15
+ lexicon?: Lexicon;
16
+ /** Target function name (default: first function) */
17
+ functionName?: string;
18
+ }
19
+ export interface SchemaResult {
20
+ /** Whether extraction succeeded */
21
+ success: boolean;
22
+ /** Module name */
23
+ moduleName?: string;
24
+ /** Function name */
25
+ functionName?: string;
26
+ /** Parameter schema */
27
+ parameters?: ParameterInfo[];
28
+ /** Error message if failed */
29
+ error?: string;
30
+ }
31
+ /**
32
+ * Extract schema from CNL source code.
33
+ *
34
+ * Parses CNL source and extracts parameter schema for the specified function,
35
+ * suitable for dynamic form generation.
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const result = extractSchema(`
40
+ * Module loan.
41
+ * Define LoanApplication has creditScore as Int, amount as Float, term as Int.
42
+ * Rule evaluate given application as LoanApplication, produce Bool:
43
+ * If application.creditScore >= 700 then Return true
44
+ * Otherwise Return false.
45
+ * `);
46
+ * if (result.success) {
47
+ * console.log(result.parameters);
48
+ * }
49
+ * ```
50
+ */
51
+ export declare function extractSchema(source: string, options?: SchemaOptions): SchemaResult;
52
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/browser/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAY,aAAa,EAAa,MAAM,8BAA8B,CAAC;AAGvF,gCAAgC;AAChC,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAkInF"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * @module @aster-cloud/aster-lang-ts/browser/schema
3
+ *
4
+ * Schema extraction for dynamic form generation. Split out of `browser.ts`
5
+ * in the Round-3 codex refactor: previously the main browser entry was a
6
+ * 660-line monolith mixing compile / validate / schema / evaluate / typecheck
7
+ * gates. Public exports remain available from `@aster-cloud/aster-lang-ts/browser`
8
+ * — this module is implementation detail.
9
+ */
10
+ import { canonicalize } from '../frontend/canonicalizer.js';
11
+ import { lex } from '../frontend/lexer.js';
12
+ import { parse } from '../parser.js';
13
+ import { createKeywordTranslator, needsKeywordTranslation } from '../frontend/keyword-translator.js';
14
+ import { attachTypeInferenceRules } from '../config/lexicons/type-inference-rules.js';
15
+ /** Convert AST Type to type kind */
16
+ function getTypeKind(type) {
17
+ if (!type || typeof type !== 'object' || !('kind' in type)) {
18
+ return 'unknown';
19
+ }
20
+ switch (type.kind) {
21
+ case 'TypeName': {
22
+ const name = type.name.toLowerCase();
23
+ if (['int', 'float', 'double', 'number', 'bool', 'boolean', 'text', 'string', 'datetime', 'date', 'time'].includes(name)) {
24
+ return 'primitive';
25
+ }
26
+ // Custom type names are typically structs
27
+ return 'struct';
28
+ }
29
+ case 'List':
30
+ return 'list';
31
+ case 'Map':
32
+ return 'map';
33
+ case 'Option':
34
+ case 'Maybe':
35
+ return 'option';
36
+ case 'Result':
37
+ return 'result';
38
+ case 'FuncType':
39
+ return 'function';
40
+ default:
41
+ return 'unknown';
42
+ }
43
+ }
44
+ /** Convert AST Type to display string */
45
+ function typeToString(type) {
46
+ if (!type || typeof type !== 'object' || !('kind' in type)) {
47
+ return 'Unknown';
48
+ }
49
+ switch (type.kind) {
50
+ case 'TypeName':
51
+ return type.name;
52
+ case 'List':
53
+ return `List<${typeToString(type.type)}>`;
54
+ case 'Map':
55
+ return `Map<${typeToString(type.key)}, ${typeToString(type.val)}>`;
56
+ case 'Option':
57
+ return `Option<${typeToString(type.type)}>`;
58
+ case 'Maybe':
59
+ return `Maybe<${typeToString(type.type)}>`;
60
+ case 'Result':
61
+ return `Result<${typeToString(type.ok)}, ${typeToString(type.err)}>`;
62
+ default:
63
+ return 'Unknown';
64
+ }
65
+ }
66
+ /**
67
+ * Extract schema from CNL source code.
68
+ *
69
+ * Parses CNL source and extracts parameter schema for the specified function,
70
+ * suitable for dynamic form generation.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const result = extractSchema(`
75
+ * Module loan.
76
+ * Define LoanApplication has creditScore as Int, amount as Float, term as Int.
77
+ * Rule evaluate given application as LoanApplication, produce Bool:
78
+ * If application.creditScore >= 700 then Return true
79
+ * Otherwise Return false.
80
+ * `);
81
+ * if (result.success) {
82
+ * console.log(result.parameters);
83
+ * }
84
+ * ```
85
+ */
86
+ export function extractSchema(source, options) {
87
+ try {
88
+ const lexicon = options?.lexicon;
89
+ // Canonicalize with lexicon for language-specific normalization
90
+ const canonical = canonicalize(source, lexicon);
91
+ let tokens = lex(canonical, lexicon);
92
+ // Translate non-English tokens to English for parser compatibility
93
+ if (lexicon && needsKeywordTranslation(lexicon)) {
94
+ const translator = createKeywordTranslator(lexicon);
95
+ tokens = translator.translateTokens(tokens);
96
+ }
97
+ // Parse to AST
98
+ const effectiveLexForSchema = lexicon ? attachTypeInferenceRules(lexicon) : undefined;
99
+ const parseResult = parse(tokens, effectiveLexForSchema);
100
+ if (parseResult.diagnostics.length > 0 && parseResult.ast.decls.length === 0) {
101
+ return {
102
+ success: false,
103
+ error: parseResult.diagnostics[0]?.message ?? 'Parse failed',
104
+ };
105
+ }
106
+ const module = parseResult.ast;
107
+ const moduleName = module.name ?? 'unknown';
108
+ // Find all Data and Enum declarations (for struct/enum field resolution)
109
+ const dataDecls = new Map();
110
+ const enumDecls = new Map();
111
+ for (const decl of module.decls) {
112
+ if (decl.kind === 'Data') {
113
+ const data = decl;
114
+ const fields = data.fields.map((f) => {
115
+ const fieldTypeKind = getTypeKind(f.type);
116
+ const fieldTypeName = typeToString(f.type);
117
+ return {
118
+ name: f.name,
119
+ type: fieldTypeName,
120
+ typeKind: fieldTypeKind,
121
+ };
122
+ });
123
+ dataDecls.set(data.name, fields);
124
+ }
125
+ else if (decl.kind === 'Enum') {
126
+ const enumDecl = decl;
127
+ enumDecls.set(enumDecl.name, [...enumDecl.variants]);
128
+ }
129
+ }
130
+ // Find the target function
131
+ const funcs = module.decls.filter((d) => d.kind === 'Func');
132
+ if (funcs.length === 0) {
133
+ return {
134
+ success: false,
135
+ error: 'No functions found in module',
136
+ };
137
+ }
138
+ const targetFuncName = options?.functionName;
139
+ const func = targetFuncName
140
+ ? funcs.find((f) => f.name === targetFuncName)
141
+ : funcs[0];
142
+ if (!func) {
143
+ return {
144
+ success: false,
145
+ error: targetFuncName
146
+ ? `Function '${targetFuncName}' not found`
147
+ : 'No functions found in module',
148
+ };
149
+ }
150
+ // Extract parameters
151
+ const parameters = func.params.map((param, index) => {
152
+ let typeName = typeToString(param.type);
153
+ let typeKind = getTypeKind(param.type);
154
+ let fields;
155
+ // Resolve struct/enum fields if applicable
156
+ if (typeKind === 'struct' && enumDecls.has(typeName)) {
157
+ // Type is actually an enum, not a struct
158
+ typeKind = 'enum';
159
+ }
160
+ else if (typeKind === 'struct' && dataDecls.has(typeName)) {
161
+ // Resolve struct fields, also resolving enum types within fields
162
+ fields = dataDecls.get(typeName).map((f) => {
163
+ if (f.typeKind === 'struct' && enumDecls.has(f.type)) {
164
+ return { ...f, typeKind: 'enum', enumVariants: enumDecls.get(f.type) };
165
+ }
166
+ return f;
167
+ });
168
+ }
169
+ else if (typeKind === 'primitive' && dataDecls.has(param.name)) {
170
+ // 当参数类型为基本类型但参数名与 Data 定义匹配时,
171
+ // 推断参数类型为该 Data 类型(支持中文无类型参数语法)
172
+ typeName = param.name;
173
+ typeKind = 'struct';
174
+ fields = dataDecls.get(param.name);
175
+ }
176
+ const result = {
177
+ name: param.name,
178
+ type: typeName,
179
+ typeKind,
180
+ optional: false, // Parameters don't have optional field in AST
181
+ position: index,
182
+ };
183
+ if (typeKind === 'enum' && enumDecls.has(typeName)) {
184
+ result.enumVariants = enumDecls.get(typeName);
185
+ }
186
+ if (fields) {
187
+ result.fields = fields;
188
+ }
189
+ return result;
190
+ });
191
+ return {
192
+ success: true,
193
+ moduleName,
194
+ functionName: func.name,
195
+ parameters,
196
+ };
197
+ }
198
+ catch (error) {
199
+ return {
200
+ success: false,
201
+ error: error instanceof Error ? error.message : String(error),
202
+ };
203
+ }
204
+ }
205
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/browser/schema.ts"],"names":[],"mappings":"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"}
@@ -40,7 +40,7 @@ export type { EvalResult } from './core/interpreter.js';
40
40
  export { generateFieldValue, generateInputValues, getFieldValueHint, } from './parser/input-generator.js';
41
41
  export type { TypeKind, FieldInfo, ParameterInfo, } from './parser/input-generator.js';
42
42
  export type * from './types.js';
43
- export { EN_US, ZH_CN, DE_DE, LexiconRegistry, initializeDefaultLexicons } from './config/lexicons/index.js';
43
+ export { EN_US, ZH_CN, DE_DE, LexiconRegistry, initializeDefaultLexicons, initializeAllBundledLexicons, } from './config/lexicons/index.js';
44
44
  export type { Lexicon } from './config/lexicons/types.js';
45
45
  export { getLspUiTexts } from './config/lexicons/lsp-ui-texts.js';
46
46
  export type { LspUiTexts } from './config/lexicons/lsp-ui-texts.js';
@@ -165,58 +165,8 @@ export declare function validateSyntaxWithSpan(source: string, lexicon?: Lexicon
165
165
  * @returns Array of tokens
166
166
  */
167
167
  export declare function tokenize(source: string, lexicon?: Lexicon): Token[];
168
- import type { ParameterInfo } from './parser/input-generator.js';
169
- /**
170
- * Schema extraction result
171
- */
172
- export interface SchemaResult {
173
- /** Whether extraction succeeded */
174
- success: boolean;
175
- /** Module name */
176
- moduleName?: string;
177
- /** Function name */
178
- functionName?: string;
179
- /** Parameter schema */
180
- parameters?: ParameterInfo[];
181
- /** Error message if failed */
182
- error?: string;
183
- }
184
- /**
185
- * Schema extraction options
186
- */
187
- export interface SchemaOptions {
188
- /** CNL lexicon (default: EN_US) */
189
- lexicon?: Lexicon;
190
- /** Target function name (default: first function) */
191
- functionName?: string;
192
- }
193
- /**
194
- * Extract schema from CNL source code
195
- *
196
- * Parses CNL source and extracts parameter schema for the specified function,
197
- * suitable for dynamic form generation.
198
- *
199
- * @param source - CNL source code
200
- * @param options - Schema extraction options
201
- * @returns Schema extraction result
202
- *
203
- * @example
204
- * ```typescript
205
- * const result = extractSchema(`
206
- * Module loan.
207
- * Define LoanApplication has creditScore as Int, amount as Float, term as Int.
208
- * Rule evaluate given application as LoanApplication, produce Bool:
209
- * If application.creditScore >= 700 then Return true
210
- * Otherwise Return false.
211
- * `);
212
- *
213
- * if (result.success) {
214
- * console.log(result.parameters);
215
- * // [{ name: 'application', type: 'LoanApplication', typeKind: 'struct', ... }]
216
- * }
217
- * ```
218
- */
219
- export declare function extractSchema(source: string, options?: SchemaOptions): SchemaResult;
168
+ export { extractSchema } from './browser/schema.js';
169
+ export type { SchemaResult, SchemaOptions } from './browser/schema.js';
220
170
  export { typecheckBrowser } from './typecheck/browser.js';
221
171
  export type { BrowserTypecheckOptions } from './typecheck/browser.js';
222
172
  export type { TypecheckDiagnostic } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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"}
@@ -41,9 +41,12 @@ export { Node } from './ast/ast.js';
41
41
  export { evaluate } from './core/interpreter.js';
42
42
  // Input value generation (for policy execution)
43
43
  export { generateFieldValue, generateInputValues, getFieldValueHint, } from './parser/input-generator.js';
44
- // Lexicons for multi-language support
45
- import { LexiconRegistry, initializeDefaultLexicons } from './config/lexicons/index.js';
46
- export { EN_US, ZH_CN, DE_DE, LexiconRegistry, initializeDefaultLexicons } from './config/lexicons/index.js';
44
+ // Lexicons for multi-language support.
45
+ // 浏览器路径下使用 initializeAllBundledLexicons —— 因为浏览器 bundle 本来就把
46
+ // en/zh/de 编译进去,不存在"按需加载"的服务端约束。后续可在 next major
47
+ // 由消费者改用 initializeDefaultLexicons + 显式 register。
48
+ import { LexiconRegistry, initializeAllBundledLexicons } from './config/lexicons/index.js';
49
+ export { EN_US, ZH_CN, DE_DE, LexiconRegistry, initializeDefaultLexicons, initializeAllBundledLexicons, } from './config/lexicons/index.js';
47
50
  // LSP UI texts (localized labels for hover, completion, etc.)
48
51
  export { getLspUiTexts } from './config/lexicons/lsp-ui-texts.js';
49
52
  // ============================================================================
@@ -91,7 +94,8 @@ export function compile(source, options) {
91
94
  let canonical;
92
95
  if (domain) {
93
96
  // Resolve effective lexicon for domain translation (default to EN_US)
94
- const effectiveLexicon = lexicon ?? (initializeDefaultLexicons(), LexiconRegistry.getDefault());
97
+ // M3: 浏览器入口预注册 en + zh + de(这些已在 bundle 里)
98
+ const effectiveLexicon = lexicon ?? (initializeAllBundledLexicons(), LexiconRegistry.getDefault());
95
99
  canonical = canonicalize(source, { lexicon: effectiveLexicon, domain, locale: effectiveLexicon.id });
96
100
  }
97
101
  else {
@@ -109,8 +113,11 @@ export function compile(source, options) {
109
113
  // Step 4: Parse to AST (now with English tokens)
110
114
  const effectiveLex = lexicon ? attachTypeInferenceRules(lexicon) : undefined;
111
115
  const parseResult = parse(tokens, effectiveLex);
112
- // Check for parse errors
113
- if (parseResult.diagnostics.length > 0 && parseResult.ast.decls.length === 0) {
116
+ // Parse 诊断分级:error 必须导致 success=false(即使部分 decl 可恢复),
117
+ // warning 不阻塞编译。原实现仅在 decls 全空时才报失败,导致调用方在
118
+ // 部分恢复场景下误以为编译成功 —— 实际产物(Core IR)来自残缺 AST。
119
+ const parseErrorDiagnostics = parseResult.diagnostics.filter(d => d.severity === 'error');
120
+ if (parseErrorDiagnostics.length > 0) {
114
121
  const result = {
115
122
  success: false,
116
123
  parseErrors: parseResult.diagnostics.map(d => ({
@@ -131,6 +138,7 @@ export function compile(source, options) {
131
138
  core,
132
139
  };
133
140
  if (parseResult.diagnostics.length > 0) {
141
+ // 此时只剩 warning(error 已在上面 short-circuit),保留以便调用方展示
134
142
  result.parseErrors = parseResult.diagnostics.map(d => ({ message: d.message, span: d.span }));
135
143
  }
136
144
  if (options?.includeIntermediates) {
@@ -212,186 +220,12 @@ export function tokenize(source, lexicon) {
212
220
  const canonical = canonicalize(source, lexicon);
213
221
  return lex(canonical, lexicon);
214
222
  }
215
- /**
216
- * Convert AST Type to type kind
217
- */
218
- function getTypeKind(type) {
219
- if (!type || typeof type !== 'object' || !('kind' in type)) {
220
- return 'unknown';
221
- }
222
- switch (type.kind) {
223
- case 'TypeName': {
224
- const name = type.name.toLowerCase();
225
- if (['int', 'float', 'double', 'number', 'bool', 'boolean', 'text', 'string', 'datetime', 'date', 'time'].includes(name)) {
226
- return 'primitive';
227
- }
228
- // Custom type names are typically structs
229
- return 'struct';
230
- }
231
- case 'List':
232
- return 'list';
233
- case 'Map':
234
- return 'map';
235
- case 'Option':
236
- case 'Maybe':
237
- return 'option';
238
- case 'Result':
239
- return 'result';
240
- case 'FuncType':
241
- return 'function';
242
- default:
243
- return 'unknown';
244
- }
245
- }
246
- /**
247
- * Convert AST Type to display string
248
- */
249
- function typeToString(type) {
250
- if (!type || typeof type !== 'object' || !('kind' in type)) {
251
- return 'Unknown';
252
- }
253
- switch (type.kind) {
254
- case 'TypeName':
255
- return type.name;
256
- case 'List':
257
- return `List<${typeToString(type.type)}>`;
258
- case 'Map':
259
- return `Map<${typeToString(type.key)}, ${typeToString(type.val)}>`;
260
- case 'Option':
261
- return `Option<${typeToString(type.type)}>`;
262
- case 'Maybe':
263
- return `Maybe<${typeToString(type.type)}>`;
264
- case 'Result':
265
- return `Result<${typeToString(type.ok)}, ${typeToString(type.err)}>`;
266
- default:
267
- return 'Unknown';
268
- }
269
- }
270
- /**
271
- * Extract schema from CNL source code
272
- *
273
- * Parses CNL source and extracts parameter schema for the specified function,
274
- * suitable for dynamic form generation.
275
- *
276
- * @param source - CNL source code
277
- * @param options - Schema extraction options
278
- * @returns Schema extraction result
279
- *
280
- * @example
281
- * ```typescript
282
- * const result = extractSchema(`
283
- * Module loan.
284
- * Define LoanApplication has creditScore as Int, amount as Float, term as Int.
285
- * Rule evaluate given application as LoanApplication, produce Bool:
286
- * If application.creditScore >= 700 then Return true
287
- * Otherwise Return false.
288
- * `);
289
- *
290
- * if (result.success) {
291
- * console.log(result.parameters);
292
- * // [{ name: 'application', type: 'LoanApplication', typeKind: 'struct', ... }]
293
- * }
294
- * ```
295
- */
296
- export function extractSchema(source, options) {
297
- try {
298
- const lexicon = options?.lexicon;
299
- // Canonicalize with lexicon for language-specific normalization
300
- const canonical = canonicalize(source, lexicon);
301
- let tokens = lex(canonical, lexicon);
302
- // Translate non-English tokens to English for parser compatibility
303
- if (lexicon && needsKeywordTranslation(lexicon)) {
304
- const translator = createKeywordTranslator(lexicon);
305
- tokens = translator.translateTokens(tokens);
306
- }
307
- // Parse to AST
308
- const effectiveLexForSchema = lexicon ? attachTypeInferenceRules(lexicon) : undefined;
309
- const parseResult = parse(tokens, effectiveLexForSchema);
310
- if (parseResult.diagnostics.length > 0 && parseResult.ast.decls.length === 0) {
311
- return {
312
- success: false,
313
- error: parseResult.diagnostics[0]?.message ?? 'Parse failed',
314
- };
315
- }
316
- const module = parseResult.ast;
317
- const moduleName = module.name ?? 'unknown';
318
- // Find all Data declarations (for struct field resolution)
319
- const dataDecls = new Map();
320
- for (const decl of module.decls) {
321
- if (decl.kind === 'Data') {
322
- const data = decl;
323
- const fields = data.fields.map((f) => ({
324
- name: f.name,
325
- type: typeToString(f.type),
326
- typeKind: getTypeKind(f.type),
327
- }));
328
- dataDecls.set(data.name, fields);
329
- }
330
- }
331
- // Find the target function
332
- const funcs = module.decls.filter((d) => d.kind === 'Func');
333
- if (funcs.length === 0) {
334
- return {
335
- success: false,
336
- error: 'No functions found in module',
337
- };
338
- }
339
- const targetFuncName = options?.functionName;
340
- const func = targetFuncName
341
- ? funcs.find((f) => f.name === targetFuncName)
342
- : funcs[0];
343
- if (!func) {
344
- return {
345
- success: false,
346
- error: targetFuncName
347
- ? `Function '${targetFuncName}' not found`
348
- : 'No functions found in module',
349
- };
350
- }
351
- // Extract parameters
352
- const parameters = func.params.map((param, index) => {
353
- let typeName = typeToString(param.type);
354
- let typeKind = getTypeKind(param.type);
355
- let fields;
356
- // Resolve struct fields if applicable
357
- if (typeKind === 'struct' && dataDecls.has(typeName)) {
358
- fields = dataDecls.get(typeName);
359
- }
360
- else if (typeKind === 'primitive' && dataDecls.has(param.name)) {
361
- // 当参数类型为基本类型但参数名与 Data 定义匹配时,
362
- // 推断参数类型为该 Data 类型(支持中文无类型参数语法)
363
- // 例如:规则 评估贷款 给定 申请人:
364
- // 此时参数名"申请人"与 Data "申请人"匹配,推断类型为结构体
365
- typeName = param.name;
366
- typeKind = 'struct';
367
- fields = dataDecls.get(param.name);
368
- }
369
- const result = {
370
- name: param.name,
371
- type: typeName,
372
- typeKind,
373
- optional: false, // Parameters don't have optional field in AST
374
- position: index,
375
- };
376
- if (fields) {
377
- result.fields = fields;
378
- }
379
- return result;
380
- });
381
- return {
382
- success: true,
383
- moduleName,
384
- functionName: func.name,
385
- parameters,
386
- };
387
- }
388
- catch (error) {
389
- return {
390
- success: false,
391
- error: error instanceof Error ? error.message : String(error),
392
- };
393
- }
394
- }
223
+ // ============================================================================
224
+ // Schema extraction API (for dynamic form generation)
225
+ // ============================================================================
226
+ // 实现移到 ./browser/schema.ts;这里只再导出以保持公共 API 不变。
227
+ // Round-3 codex 重构记录。
228
+ export { extractSchema } from './browser/schema.js';
395
229
  // ============================================================================
396
230
  // Browser-compatible Type Checking API
397
231
  // ============================================================================