@vibe-lang/runtime 0.2.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.
- package/package.json +46 -0
- package/src/ast/index.ts +375 -0
- package/src/ast.ts +2 -0
- package/src/debug/advanced-features.ts +482 -0
- package/src/debug/bun-inspector.ts +424 -0
- package/src/debug/handoff-manager.ts +283 -0
- package/src/debug/index.ts +150 -0
- package/src/debug/runner.ts +365 -0
- package/src/debug/server.ts +565 -0
- package/src/debug/stack-merger.ts +267 -0
- package/src/debug/state.ts +581 -0
- package/src/debug/test/advanced-features.test.ts +300 -0
- package/src/debug/test/e2e.test.ts +218 -0
- package/src/debug/test/handoff-manager.test.ts +256 -0
- package/src/debug/test/runner.test.ts +256 -0
- package/src/debug/test/stack-merger.test.ts +163 -0
- package/src/debug/test/state.test.ts +400 -0
- package/src/debug/test/ts-debug-integration.test.ts +374 -0
- package/src/debug/test/ts-import-tracker.test.ts +125 -0
- package/src/debug/test/ts-source-map.test.ts +169 -0
- package/src/debug/ts-import-tracker.ts +151 -0
- package/src/debug/ts-source-map.ts +171 -0
- package/src/errors/index.ts +124 -0
- package/src/index.ts +358 -0
- package/src/lexer/index.ts +348 -0
- package/src/lexer.ts +2 -0
- package/src/parser/index.ts +792 -0
- package/src/parser/parse.ts +45 -0
- package/src/parser/test/async.test.ts +248 -0
- package/src/parser/test/destructuring.test.ts +167 -0
- package/src/parser/test/do-expression.test.ts +486 -0
- package/src/parser/test/errors/do-expression.test.ts +95 -0
- package/src/parser/test/errors/error-locations.test.ts +230 -0
- package/src/parser/test/errors/invalid-expressions.test.ts +144 -0
- package/src/parser/test/errors/missing-tokens.test.ts +126 -0
- package/src/parser/test/errors/model-declaration.test.ts +185 -0
- package/src/parser/test/errors/nested-blocks.test.ts +226 -0
- package/src/parser/test/errors/unclosed-delimiters.test.ts +122 -0
- package/src/parser/test/errors/unexpected-tokens.test.ts +120 -0
- package/src/parser/test/import-export.test.ts +143 -0
- package/src/parser/test/literals.test.ts +404 -0
- package/src/parser/test/model-declaration.test.ts +161 -0
- package/src/parser/test/nested-blocks.test.ts +402 -0
- package/src/parser/test/parser.test.ts +743 -0
- package/src/parser/test/private.test.ts +136 -0
- package/src/parser/test/template-literal.test.ts +127 -0
- package/src/parser/test/tool-declaration.test.ts +302 -0
- package/src/parser/test/ts-block.test.ts +252 -0
- package/src/parser/test/type-annotations.test.ts +254 -0
- package/src/parser/visitor/helpers.ts +330 -0
- package/src/parser/visitor.ts +794 -0
- package/src/parser.ts +2 -0
- package/src/runtime/ai/cache-chunking.test.ts +69 -0
- package/src/runtime/ai/cache-chunking.ts +73 -0
- package/src/runtime/ai/client.ts +109 -0
- package/src/runtime/ai/context.ts +168 -0
- package/src/runtime/ai/formatters.ts +316 -0
- package/src/runtime/ai/index.ts +38 -0
- package/src/runtime/ai/language-ref.ts +38 -0
- package/src/runtime/ai/providers/anthropic.ts +253 -0
- package/src/runtime/ai/providers/google.ts +201 -0
- package/src/runtime/ai/providers/openai.ts +156 -0
- package/src/runtime/ai/retry.ts +100 -0
- package/src/runtime/ai/return-tools.ts +301 -0
- package/src/runtime/ai/test/client.test.ts +83 -0
- package/src/runtime/ai/test/formatters.test.ts +485 -0
- package/src/runtime/ai/test/retry.test.ts +137 -0
- package/src/runtime/ai/test/return-tools.test.ts +450 -0
- package/src/runtime/ai/test/tool-loop.test.ts +319 -0
- package/src/runtime/ai/test/tool-schema.test.ts +241 -0
- package/src/runtime/ai/tool-loop.ts +203 -0
- package/src/runtime/ai/tool-schema.ts +151 -0
- package/src/runtime/ai/types.ts +113 -0
- package/src/runtime/ai-logger.ts +255 -0
- package/src/runtime/ai-provider.ts +347 -0
- package/src/runtime/async/dependencies.ts +276 -0
- package/src/runtime/async/executor.ts +293 -0
- package/src/runtime/async/index.ts +43 -0
- package/src/runtime/async/scheduling.ts +163 -0
- package/src/runtime/async/test/dependencies.test.ts +284 -0
- package/src/runtime/async/test/executor.test.ts +388 -0
- package/src/runtime/context.ts +357 -0
- package/src/runtime/exec/ai.ts +139 -0
- package/src/runtime/exec/expressions.ts +475 -0
- package/src/runtime/exec/frames.ts +26 -0
- package/src/runtime/exec/functions.ts +305 -0
- package/src/runtime/exec/interpolation.ts +312 -0
- package/src/runtime/exec/statements.ts +604 -0
- package/src/runtime/exec/tools.ts +129 -0
- package/src/runtime/exec/typescript.ts +215 -0
- package/src/runtime/exec/variables.ts +279 -0
- package/src/runtime/index.ts +975 -0
- package/src/runtime/modules.ts +452 -0
- package/src/runtime/serialize.ts +103 -0
- package/src/runtime/state.ts +489 -0
- package/src/runtime/stdlib/core.ts +45 -0
- package/src/runtime/stdlib/directory.test.ts +156 -0
- package/src/runtime/stdlib/edit.test.ts +154 -0
- package/src/runtime/stdlib/fastEdit.test.ts +201 -0
- package/src/runtime/stdlib/glob.test.ts +106 -0
- package/src/runtime/stdlib/grep.test.ts +144 -0
- package/src/runtime/stdlib/index.ts +16 -0
- package/src/runtime/stdlib/readFile.test.ts +123 -0
- package/src/runtime/stdlib/tools/index.ts +707 -0
- package/src/runtime/stdlib/writeFile.test.ts +157 -0
- package/src/runtime/step.ts +969 -0
- package/src/runtime/test/ai-context.test.ts +1086 -0
- package/src/runtime/test/ai-result-object.test.ts +419 -0
- package/src/runtime/test/ai-tool-flow.test.ts +859 -0
- package/src/runtime/test/async-execution-order.test.ts +618 -0
- package/src/runtime/test/async-execution.test.ts +344 -0
- package/src/runtime/test/async-nested.test.ts +660 -0
- package/src/runtime/test/async-parallel-timing.test.ts +546 -0
- package/src/runtime/test/basic1.test.ts +154 -0
- package/src/runtime/test/binary-operators.test.ts +431 -0
- package/src/runtime/test/break-statement.test.ts +257 -0
- package/src/runtime/test/context-modes.test.ts +650 -0
- package/src/runtime/test/context.test.ts +466 -0
- package/src/runtime/test/core-functions.test.ts +228 -0
- package/src/runtime/test/e2e.test.ts +88 -0
- package/src/runtime/test/error-locations/error-locations.test.ts +80 -0
- package/src/runtime/test/error-locations/main-error.vibe +4 -0
- package/src/runtime/test/error-locations/main-import-error.vibe +3 -0
- package/src/runtime/test/error-locations/utils/helper.vibe +5 -0
- package/src/runtime/test/for-in.test.ts +312 -0
- package/src/runtime/test/helpers.ts +69 -0
- package/src/runtime/test/imports.test.ts +334 -0
- package/src/runtime/test/json-expressions.test.ts +232 -0
- package/src/runtime/test/literals.test.ts +372 -0
- package/src/runtime/test/logical-indexing.test.ts +478 -0
- package/src/runtime/test/member-methods.test.ts +324 -0
- package/src/runtime/test/model-config.test.ts +338 -0
- package/src/runtime/test/null-handling.test.ts +342 -0
- package/src/runtime/test/private-visibility.test.ts +332 -0
- package/src/runtime/test/runtime-state.test.ts +514 -0
- package/src/runtime/test/scoping.test.ts +370 -0
- package/src/runtime/test/string-interpolation.test.ts +354 -0
- package/src/runtime/test/template-literal.test.ts +181 -0
- package/src/runtime/test/tool-execution.test.ts +467 -0
- package/src/runtime/test/tool-schema-generation.test.ts +477 -0
- package/src/runtime/test/tostring.test.ts +210 -0
- package/src/runtime/test/ts-block.test.ts +594 -0
- package/src/runtime/test/ts-error-location.test.ts +231 -0
- package/src/runtime/test/types.test.ts +732 -0
- package/src/runtime/test/verbose-logger.test.ts +710 -0
- package/src/runtime/test/vibe-expression.test.ts +54 -0
- package/src/runtime/test/vibe-value-errors.test.ts +541 -0
- package/src/runtime/test/while.test.ts +232 -0
- package/src/runtime/tools/builtin.ts +30 -0
- package/src/runtime/tools/directory-tools.ts +70 -0
- package/src/runtime/tools/file-tools.ts +228 -0
- package/src/runtime/tools/index.ts +5 -0
- package/src/runtime/tools/registry.ts +48 -0
- package/src/runtime/tools/search-tools.ts +134 -0
- package/src/runtime/tools/security.ts +36 -0
- package/src/runtime/tools/system-tools.ts +312 -0
- package/src/runtime/tools/test/fixtures/base-types.ts +40 -0
- package/src/runtime/tools/test/fixtures/test-types.ts +132 -0
- package/src/runtime/tools/test/registry.test.ts +713 -0
- package/src/runtime/tools/test/security.test.ts +86 -0
- package/src/runtime/tools/test/system-tools.test.ts +679 -0
- package/src/runtime/tools/test/ts-schema.test.ts +357 -0
- package/src/runtime/tools/ts-schema.ts +341 -0
- package/src/runtime/tools/types.ts +89 -0
- package/src/runtime/tools/utility-tools.ts +198 -0
- package/src/runtime/ts-eval.ts +126 -0
- package/src/runtime/types.ts +797 -0
- package/src/runtime/validation.ts +160 -0
- package/src/runtime/verbose-logger.ts +459 -0
- package/src/runtime.ts +2 -0
- package/src/semantic/analyzer-context.ts +62 -0
- package/src/semantic/analyzer-validators.ts +575 -0
- package/src/semantic/analyzer-visitors.ts +534 -0
- package/src/semantic/analyzer.ts +83 -0
- package/src/semantic/index.ts +11 -0
- package/src/semantic/symbol-table.ts +58 -0
- package/src/semantic/test/async-validation.test.ts +301 -0
- package/src/semantic/test/compress-validation.test.ts +179 -0
- package/src/semantic/test/const-reassignment.test.ts +111 -0
- package/src/semantic/test/control-flow.test.ts +346 -0
- package/src/semantic/test/destructuring.test.ts +185 -0
- package/src/semantic/test/duplicate-declarations.test.ts +168 -0
- package/src/semantic/test/export-validation.test.ts +111 -0
- package/src/semantic/test/fixtures/math.ts +31 -0
- package/src/semantic/test/imports.test.ts +148 -0
- package/src/semantic/test/json-type.test.ts +68 -0
- package/src/semantic/test/literals.test.ts +127 -0
- package/src/semantic/test/model-validation.test.ts +179 -0
- package/src/semantic/test/prompt-validation.test.ts +343 -0
- package/src/semantic/test/scoping.test.ts +312 -0
- package/src/semantic/test/tool-validation.test.ts +306 -0
- package/src/semantic/test/ts-type-checking.test.ts +563 -0
- package/src/semantic/test/type-constraints.test.ts +111 -0
- package/src/semantic/test/type-inference.test.ts +87 -0
- package/src/semantic/test/type-validation.test.ts +552 -0
- package/src/semantic/test/undefined-variables.test.ts +163 -0
- package/src/semantic/ts-block-checker.ts +204 -0
- package/src/semantic/ts-signatures.ts +194 -0
- package/src/semantic/ts-types.ts +170 -0
- package/src/semantic/types.ts +58 -0
- package/tests/fixtures/conditional-logic.vibe +14 -0
- package/tests/fixtures/function-call.vibe +16 -0
- package/tests/fixtures/imports/cycle-detection/a.vibe +6 -0
- package/tests/fixtures/imports/cycle-detection/b.vibe +5 -0
- package/tests/fixtures/imports/cycle-detection/main.vibe +3 -0
- package/tests/fixtures/imports/module-isolation/main-b.vibe +8 -0
- package/tests/fixtures/imports/module-isolation/main.vibe +9 -0
- package/tests/fixtures/imports/module-isolation/moduleA.vibe +6 -0
- package/tests/fixtures/imports/module-isolation/moduleB.vibe +6 -0
- package/tests/fixtures/imports/nested-import/helper.vibe +6 -0
- package/tests/fixtures/imports/nested-import/main.vibe +3 -0
- package/tests/fixtures/imports/nested-import/utils.ts +3 -0
- package/tests/fixtures/imports/nested-isolation/file2.vibe +15 -0
- package/tests/fixtures/imports/nested-isolation/file3.vibe +10 -0
- package/tests/fixtures/imports/nested-isolation/main.vibe +21 -0
- package/tests/fixtures/imports/pure-cycle/a.vibe +5 -0
- package/tests/fixtures/imports/pure-cycle/b.vibe +5 -0
- package/tests/fixtures/imports/pure-cycle/main.vibe +3 -0
- package/tests/fixtures/imports/ts-boolean/checks.ts +14 -0
- package/tests/fixtures/imports/ts-boolean/main.vibe +10 -0
- package/tests/fixtures/imports/ts-boolean/type-mismatch.vibe +5 -0
- package/tests/fixtures/imports/ts-boolean/use-constant.vibe +18 -0
- package/tests/fixtures/imports/ts-error-handling/helpers.ts +42 -0
- package/tests/fixtures/imports/ts-error-handling/main.vibe +5 -0
- package/tests/fixtures/imports/ts-import/main.vibe +4 -0
- package/tests/fixtures/imports/ts-import/math.ts +9 -0
- package/tests/fixtures/imports/ts-variables/call-non-function.vibe +5 -0
- package/tests/fixtures/imports/ts-variables/data.ts +10 -0
- package/tests/fixtures/imports/ts-variables/import-json.vibe +5 -0
- package/tests/fixtures/imports/ts-variables/import-type-mismatch.vibe +5 -0
- package/tests/fixtures/imports/ts-variables/import-variable.vibe +5 -0
- package/tests/fixtures/imports/vibe-import/greet.vibe +5 -0
- package/tests/fixtures/imports/vibe-import/main.vibe +3 -0
- package/tests/fixtures/multiple-ai-calls.vibe +10 -0
- package/tests/fixtures/simple-greeting.vibe +6 -0
- package/tests/fixtures/template-literals.vibe +11 -0
- package/tests/integration/basic-ai/basic-ai.integration.test.ts +166 -0
- package/tests/integration/basic-ai/basic-ai.vibe +12 -0
- package/tests/integration/bug-fix/bug-fix.integration.test.ts +201 -0
- package/tests/integration/bug-fix/buggy-code.ts +22 -0
- package/tests/integration/bug-fix/fix-bug.vibe +21 -0
- package/tests/integration/compress/compress.integration.test.ts +206 -0
- package/tests/integration/destructuring/destructuring.integration.test.ts +92 -0
- package/tests/integration/hello-world-translator/hello-world-translator.integration.test.ts +61 -0
- package/tests/integration/line-annotator/context-modes.integration.test.ts +261 -0
- package/tests/integration/line-annotator/line-annotator.integration.test.ts +148 -0
- package/tests/integration/multi-feature/cumulative-sum.integration.test.ts +75 -0
- package/tests/integration/multi-feature/number-analyzer.integration.test.ts +191 -0
- package/tests/integration/multi-feature/number-analyzer.vibe +59 -0
- package/tests/integration/tool-calls/tool-calls.integration.test.ts +93 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript Type Mapping Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared utilities for converting between Vibe types and TypeScript types.
|
|
5
|
+
* Used by both the ts-block-checker and semantic analyzer.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Map Vibe type to TypeScript type string.
|
|
10
|
+
*/
|
|
11
|
+
export function vibeTypeToTs(vibeType: string | null): string {
|
|
12
|
+
if (!vibeType) return 'any';
|
|
13
|
+
|
|
14
|
+
// Handle array types first
|
|
15
|
+
if (vibeType.endsWith('[]')) {
|
|
16
|
+
const base = vibeType.slice(0, -2);
|
|
17
|
+
return vibeTypeToTs(base) + '[]';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const map: Record<string, string> = {
|
|
21
|
+
'text': 'string',
|
|
22
|
+
'prompt': 'string',
|
|
23
|
+
'number': 'number',
|
|
24
|
+
'boolean': 'boolean',
|
|
25
|
+
'json': 'Record<string, unknown>',
|
|
26
|
+
'null': 'null | undefined',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
return map[vibeType] ?? 'any';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Map TypeScript type string back to Vibe type.
|
|
34
|
+
*/
|
|
35
|
+
export function tsTypeToVibe(tsType: string): string | null {
|
|
36
|
+
// Handle array types
|
|
37
|
+
if (tsType.endsWith('[]')) {
|
|
38
|
+
const base = tsType.slice(0, -2);
|
|
39
|
+
const vibeBase = tsTypeToVibe(base);
|
|
40
|
+
return vibeBase ? `${vibeBase}[]` : null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Handle Array<T> syntax
|
|
44
|
+
if (tsType.startsWith('Array<') && tsType.endsWith('>')) {
|
|
45
|
+
const base = tsType.slice(6, -1);
|
|
46
|
+
const vibeBase = tsTypeToVibe(base);
|
|
47
|
+
return vibeBase ? `${vibeBase}[]` : null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Direct mappings
|
|
51
|
+
const map: Record<string, string> = {
|
|
52
|
+
'string': 'text',
|
|
53
|
+
'number': 'number',
|
|
54
|
+
'boolean': 'boolean',
|
|
55
|
+
'void': 'null',
|
|
56
|
+
'undefined': 'null',
|
|
57
|
+
'null': 'null',
|
|
58
|
+
'any': 'json',
|
|
59
|
+
'unknown': 'json',
|
|
60
|
+
'object': 'json',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
if (map[tsType]) {
|
|
64
|
+
return map[tsType];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Handle Record types and other object-like types as json
|
|
68
|
+
if (tsType.startsWith('Record<') || tsType.startsWith('{')) {
|
|
69
|
+
return 'json';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Handle union types - try to find a common type
|
|
73
|
+
if (tsType.includes(' | ')) {
|
|
74
|
+
const types = tsType.split(' | ').map(t => t.trim());
|
|
75
|
+
// Filter out null/undefined
|
|
76
|
+
const nonNullTypes = types.filter(t => t !== 'null' && t !== 'undefined');
|
|
77
|
+
if (nonNullTypes.length === 1) {
|
|
78
|
+
return tsTypeToVibe(nonNullTypes[0]);
|
|
79
|
+
}
|
|
80
|
+
// Mixed types become json
|
|
81
|
+
return 'json';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Unknown types become json (safest)
|
|
85
|
+
return 'json';
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Check if a Vibe type is compatible with a TypeScript type.
|
|
90
|
+
*/
|
|
91
|
+
export function isVibeTypeCompatibleWithTs(vibeType: string, tsType: string): boolean {
|
|
92
|
+
// Map Vibe types to their TS equivalents
|
|
93
|
+
const vibeToTs: Record<string, string> = {
|
|
94
|
+
'text': 'string',
|
|
95
|
+
'prompt': 'string',
|
|
96
|
+
'number': 'number',
|
|
97
|
+
'boolean': 'boolean',
|
|
98
|
+
'null': 'null',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Handle array types
|
|
102
|
+
if (vibeType.endsWith('[]')) {
|
|
103
|
+
const vibeBase = vibeType.slice(0, -2);
|
|
104
|
+
// TS array types can be T[] or Array<T>
|
|
105
|
+
if (tsType.endsWith('[]')) {
|
|
106
|
+
const tsBase = tsType.slice(0, -2);
|
|
107
|
+
return isVibeTypeCompatibleWithTs(vibeBase, tsBase);
|
|
108
|
+
}
|
|
109
|
+
if (tsType.startsWith('Array<') && tsType.endsWith('>')) {
|
|
110
|
+
const tsBase = tsType.slice(6, -1);
|
|
111
|
+
return isVibeTypeCompatibleWithTs(vibeBase, tsBase);
|
|
112
|
+
}
|
|
113
|
+
// Check against any[]
|
|
114
|
+
if (tsType === 'any[]' || tsType === 'Array<any>') return true;
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// json is compatible with object-like types
|
|
119
|
+
if (vibeType === 'json') {
|
|
120
|
+
return isTsTypeObjectLike(tsType);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Get the mapped TS type for the Vibe type
|
|
124
|
+
const mappedTsType = vibeToTs[vibeType];
|
|
125
|
+
if (!mappedTsType) {
|
|
126
|
+
// Unknown Vibe type - skip checking
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Direct match
|
|
131
|
+
if (mappedTsType === tsType) return true;
|
|
132
|
+
|
|
133
|
+
// 'any' accepts everything
|
|
134
|
+
if (tsType === 'any') return true;
|
|
135
|
+
|
|
136
|
+
// 'unknown' accepts everything at assignment
|
|
137
|
+
if (tsType === 'unknown') return true;
|
|
138
|
+
|
|
139
|
+
// Handle union types (e.g., "string | null")
|
|
140
|
+
if (tsType.includes(' | ')) {
|
|
141
|
+
const unionTypes = tsType.split(' | ').map(t => t.trim());
|
|
142
|
+
return unionTypes.some(ut => isVibeTypeCompatibleWithTs(vibeType, ut));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Check if a TypeScript type is object-like (accepts json).
|
|
150
|
+
*/
|
|
151
|
+
export function isTsTypeObjectLike(tsType: string): boolean {
|
|
152
|
+
// Direct object-like types
|
|
153
|
+
if (tsType === 'object') return true;
|
|
154
|
+
if (tsType === 'any') return true;
|
|
155
|
+
if (tsType === 'unknown') return true;
|
|
156
|
+
|
|
157
|
+
// Record types
|
|
158
|
+
if (tsType.startsWith('Record<')) return true;
|
|
159
|
+
|
|
160
|
+
// Index signature types like { [key: string]: any }
|
|
161
|
+
if (tsType.startsWith('{') && tsType.includes('[')) return true;
|
|
162
|
+
|
|
163
|
+
// Generic object types (interfaces, type aliases)
|
|
164
|
+
// If it starts with uppercase and isn't a known primitive, assume it's object-like
|
|
165
|
+
if (/^[A-Z]/.test(tsType) && !['String', 'Number', 'Boolean'].includes(tsType)) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Type validation and compatibility utilities
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Valid base types in the Vibe language.
|
|
5
|
+
*/
|
|
6
|
+
export const VALID_BASE_TYPES = ['text', 'json', 'prompt', 'boolean', 'number', 'model'] as const;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Get the base type from a type annotation (strips array brackets).
|
|
10
|
+
* e.g., "text[][]" -> "text", "number" -> "number"
|
|
11
|
+
*/
|
|
12
|
+
export function getBaseType(type: string): string {
|
|
13
|
+
return type.replace(/\[\]/g, '');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Check if a type annotation string is a valid Vibe type.
|
|
18
|
+
*/
|
|
19
|
+
export function isValidType(type: string): boolean {
|
|
20
|
+
const baseType = getBaseType(type);
|
|
21
|
+
return VALID_BASE_TYPES.includes(baseType as typeof VALID_BASE_TYPES[number]);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Check if sourceType can be assigned to targetType.
|
|
26
|
+
*/
|
|
27
|
+
export function typesCompatible(sourceType: string, targetType: string): boolean {
|
|
28
|
+
// Exact match
|
|
29
|
+
if (sourceType === targetType) return true;
|
|
30
|
+
|
|
31
|
+
// null is compatible with most types, but NOT boolean (booleans must be true or false)
|
|
32
|
+
if (sourceType === 'null' && targetType !== 'boolean') return true;
|
|
33
|
+
|
|
34
|
+
// text and prompt are compatible
|
|
35
|
+
if ((sourceType === 'text' || sourceType === 'prompt') &&
|
|
36
|
+
(targetType === 'text' || targetType === 'prompt')) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// json accepts text (will be parsed at runtime)
|
|
41
|
+
if (targetType === 'json' && sourceType === 'text') {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Validate that a string is valid JSON.
|
|
50
|
+
*/
|
|
51
|
+
export function isValidJson(value: string): boolean {
|
|
52
|
+
try {
|
|
53
|
+
JSON.parse(value);
|
|
54
|
+
return true;
|
|
55
|
+
} catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Program with conditional logic
|
|
2
|
+
|
|
3
|
+
model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
|
|
4
|
+
let isPremium: boolean = true
|
|
5
|
+
let response = ""
|
|
6
|
+
|
|
7
|
+
if isPremium {
|
|
8
|
+
let greeting = vibe "Generate a premium greeting" m default
|
|
9
|
+
response = greeting
|
|
10
|
+
} else {
|
|
11
|
+
response = "Standard greeting"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
response
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Program with functions and AI calls
|
|
2
|
+
|
|
3
|
+
model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
|
|
4
|
+
|
|
5
|
+
function generateStory(topic: text) {
|
|
6
|
+
let aiPrompt = "Write a short story about {topic}"
|
|
7
|
+
return vibe aiPrompt m default
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function summarize(content: text) {
|
|
11
|
+
return vibe "Summarize this: {content}" m default
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let story = generateStory("a brave knight")
|
|
15
|
+
let summary = summarize(story)
|
|
16
|
+
summary
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// file2.vibe - imports from file3
|
|
2
|
+
import { getC } from "./file3.vibe"
|
|
3
|
+
|
|
4
|
+
const x = "B"
|
|
5
|
+
|
|
6
|
+
export function getB() {
|
|
7
|
+
return x
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// This function calls into file3 - should still see file3's x
|
|
11
|
+
export function getBAndC() {
|
|
12
|
+
let b = x
|
|
13
|
+
let c = getC()
|
|
14
|
+
return b + c
|
|
15
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// main.vibe - imports from file2 and file3
|
|
2
|
+
// Tests nested import scope isolation
|
|
3
|
+
|
|
4
|
+
import { getB, getBAndC } from "./file2.vibe"
|
|
5
|
+
import { getC, getCTwice } from "./file3.vibe"
|
|
6
|
+
|
|
7
|
+
const x = "A"
|
|
8
|
+
|
|
9
|
+
// Each function should see its own module's x:
|
|
10
|
+
// - getB() should return "B" (from file2)
|
|
11
|
+
// - getC() should return "C" (from file3)
|
|
12
|
+
// - getCTwice() should return "CC" (from file3)
|
|
13
|
+
// - getBAndC() should return "BC" (B from file2, C via file3's getC)
|
|
14
|
+
|
|
15
|
+
let resultB = getB()
|
|
16
|
+
let resultC = getC()
|
|
17
|
+
let resultCC = getCTwice()
|
|
18
|
+
let resultBC = getBAndC()
|
|
19
|
+
|
|
20
|
+
// Final result combines all to verify isolation
|
|
21
|
+
let result = resultB + resultC + resultCC + resultBC
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function alwaysTrue(): boolean {
|
|
2
|
+
return true;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function alwaysFalse(): boolean {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function isNotEmpty(str: string): boolean {
|
|
10
|
+
return str.length > 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const FEATURE_ENABLED = true;
|
|
14
|
+
export const DEBUG_MODE = false;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { alwaysTrue, isNotEmpty } from "./checks.ts"
|
|
2
|
+
|
|
3
|
+
// Test TS function returning boolean (no args)
|
|
4
|
+
let check1: boolean = alwaysTrue()
|
|
5
|
+
let result1 = "failed"
|
|
6
|
+
if check1 {
|
|
7
|
+
result1 = "passed"
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Test TS function returning boolean (string arg)
|
|
11
|
+
let testStr = "hello"
|
|
12
|
+
let check2: boolean = isNotEmpty(testStr)
|
|
13
|
+
let result2 = "empty"
|
|
14
|
+
if check2 {
|
|
15
|
+
result2 = "not empty"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
result2
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// TypeScript helpers that throw errors for testing error handling
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A function that always throws an error.
|
|
5
|
+
* Used to test that stack traces include the correct file and line.
|
|
6
|
+
*/
|
|
7
|
+
export function alwaysThrows(): never {
|
|
8
|
+
throw new Error('This function always throws');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A function that throws when given invalid input.
|
|
13
|
+
*/
|
|
14
|
+
export function validatePositive(n: number): number {
|
|
15
|
+
if (n < 0) {
|
|
16
|
+
throw new RangeError(`Expected positive number, got ${n}`);
|
|
17
|
+
}
|
|
18
|
+
return n;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A function that accesses a property on null (TypeError).
|
|
23
|
+
*/
|
|
24
|
+
export function accessNullProperty(): string {
|
|
25
|
+
const obj: { name: string } | null = null;
|
|
26
|
+
return obj!.name; // This will throw TypeError
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A nested function call that throws - to test stack trace depth.
|
|
31
|
+
*/
|
|
32
|
+
export function outerFunction(): void {
|
|
33
|
+
innerFunction();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function innerFunction(): void {
|
|
37
|
+
deepFunction();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function deepFunction(): never {
|
|
41
|
+
throw new Error('Error from deep in the call stack');
|
|
42
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Test various TS exports - functions and non-functions
|
|
2
|
+
|
|
3
|
+
export const PI = 3.14159;
|
|
4
|
+
export const CONFIG = { name: "test", version: "1.0" };
|
|
5
|
+
export const ITEMS = ["a", "b", "c"];
|
|
6
|
+
export const MESSAGE = "Hello from TypeScript";
|
|
7
|
+
|
|
8
|
+
export function greet(name: string): string {
|
|
9
|
+
return `Hello, ${name}!`;
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Program with multiple sequential AI calls
|
|
2
|
+
|
|
3
|
+
model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
|
|
4
|
+
const topic = "machine learning"
|
|
5
|
+
|
|
6
|
+
let overview = vibe "Give a one-sentence overview of {topic}" m default
|
|
7
|
+
let details = vibe "Expand on this: {overview}" m default
|
|
8
|
+
let summary = vibe "Summarize in 5 words: {details}" m default
|
|
9
|
+
|
|
10
|
+
summary
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Program with template literals and string interpolation
|
|
2
|
+
|
|
3
|
+
model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
|
|
4
|
+
const firstName = "John"
|
|
5
|
+
const lastName = "Doe"
|
|
6
|
+
|
|
7
|
+
// Template literals now use {var} syntax (unified with regular strings)
|
|
8
|
+
let fullName = `{firstName} {lastName}`
|
|
9
|
+
let message = vibe "Generate a welcome message for {fullName}" m default
|
|
10
|
+
|
|
11
|
+
message
|