Skip to content

Commit 0b78d70

Browse files
committed
feat (language): 支持 TypeScript By Browser 引擎语言
1 parent 9632d07 commit 0b78d70

9 files changed

Lines changed: 374 additions & 16 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ CodeForge 是一款轻量级、高性能的桌面代码执行器,专为开发
3737
- **Shell**
3838
- **Swift**
3939
- **TypeScript**
40+
- **TypeScript (Browser)**
4041
- **TypeScript (Node.js)**
4142

4243
## 安装
Lines changed: 7 additions & 0 deletions
Loading
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
// TypeScript Browser 示例代码 - CodeForge 代码执行环境
2+
3+
// 接口定义
4+
interface Person {
5+
name: string;
6+
age: number;
7+
height: number;
8+
}
9+
10+
// 枚举定义
11+
enum Weekday {
12+
MONDAY = 1,
13+
TUESDAY,
14+
WEDNESDAY,
15+
THURSDAY,
16+
FRIDAY,
17+
SATURDAY,
18+
SUNDAY
19+
}
20+
21+
// 类型别名
22+
type CalculationResult = {
23+
result: number;
24+
operation: string;
25+
};
26+
27+
// 函数定义
28+
function greetUser(name: string): string {
29+
return "Hello, " + name + "! 👋";
30+
}
31+
32+
function addNumbers(a: number, b: number): CalculationResult {
33+
return {
34+
result: a + b,
35+
operation: 'addition'
36+
};
37+
}
38+
39+
function printArray(arr: any[], label: string): void {
40+
console.log(label + ": " + arr.join(' '));
41+
}
42+
43+
function fibonacci(n: number): number {
44+
if (n <= 1) {
45+
return n;
46+
}
47+
return fibonacci(n - 1) + fibonacci(n - 2);
48+
}
49+
50+
// 类示例
51+
class Calculator {
52+
private history: string[] = [];
53+
54+
public add(a: number, b: number): number {
55+
var result = a + b;
56+
this.history.push(a + " + " + b + " = " + result);
57+
return result;
58+
}
59+
60+
public getHistory(): string[] {
61+
var copy: string[] = [];
62+
for (var i = 0; i < this.history.length; i++) {
63+
copy.push(this.history[i]);
64+
}
65+
return copy;
66+
}
67+
}
68+
69+
// 主函数
70+
function main(): void {
71+
console.log("🎉 欢迎使用 CodeForge!");
72+
console.log("Welcome to CodeForge!");
73+
console.log("");
74+
75+
console.log("=========================================");
76+
console.log(" CodeForge TypeScript Browser ");
77+
console.log("=========================================");
78+
console.log("");
79+
80+
// 基本输出示例
81+
console.log("✅ TypeScript 运行成功! (TypeScript is working!)");
82+
console.log("⚡ 这是 TypeScript 程序 (This is TypeScript program)");
83+
console.log("");
84+
85+
// 变量操作(强类型)
86+
var name: string = "CodeForge";
87+
var version: string = "TypeScript";
88+
var number1: number = 10;
89+
var number2: number = 20;
90+
var calculation: CalculationResult = addNumbers(number1, number2);
91+
92+
console.log("🔢 简单计算 (Simple calculation):");
93+
console.log(number1 + " + " + number2 + " = " + calculation.result);
94+
console.log("");
95+
96+
// 字符串操作
97+
console.log("📝 字符串操作 (String operations):");
98+
console.log("平台名称 (Platform): " + name);
99+
console.log("语言版本 (Language): " + version);
100+
console.log("完整信息 (Full info): " + name + " - " + version);
101+
console.log("");
102+
103+
// 循环示例
104+
console.log("🔄 循环输出 (Loop output):");
105+
for (var i = 1; i <= 5; i++) {
106+
console.log("第 " + i + " 次输出 (Output #" + i + "): Hello from CodeForge!");
107+
}
108+
console.log("");
109+
110+
// 数组操作(强类型数组)
111+
console.log("🍎 数组示例 (Array example):");
112+
var fruits: string[] = ["苹果", "香蕉", "橙子", "葡萄"];
113+
for (var j = 0; j < fruits.length; j++) {
114+
console.log((j + 1) + ". " + fruits[j]);
115+
}
116+
console.log("");
117+
118+
// 条件判断
119+
var score: number = 85;
120+
console.log("📊 成绩评估 (Score evaluation):");
121+
if (score >= 90) {
122+
console.log("优秀! (Excellent!)");
123+
} else if (score >= 80) {
124+
console.log("良好! (Good!)");
125+
} else if (score >= 60) {
126+
console.log("及格 (Pass)");
127+
} else {
128+
console.log("需要努力 (Need improvement)");
129+
}
130+
console.log("");
131+
132+
// 对象和接口示例
133+
console.log("👤 对象和接口示例 (Object and Interface example):");
134+
var person: Person = {
135+
name: "张三",
136+
age: 25,
137+
height: 175.5
138+
};
139+
140+
console.log("姓名: " + person.name + ", 年龄: " + person.age + ", 身高: " + person.height + " cm");
141+
console.log("");
142+
143+
// 函数示例
144+
console.log("🎭 函数示例 (Function example):");
145+
console.log(greetUser("CodeForge用户"));
146+
console.log("");
147+
148+
// 数组方法示例
149+
console.log("💾 数组操作示例 (Array operations example):");
150+
var dynamicArray: number[] = [];
151+
for (var k = 0; k < 5; k++) {
152+
dynamicArray.push((k + 1) * 10);
153+
}
154+
printArray(dynamicArray, "动态数组");
155+
156+
// 手动实现 map 功能
157+
var squares: number[] = [];
158+
for (var l = 0; l < dynamicArray.length; l++) {
159+
squares.push(dynamicArray[l] * dynamicArray[l]);
160+
}
161+
162+
// 手动实现 filter 功能
163+
var evenNumbers: number[] = [];
164+
for (var m = 0; m < dynamicArray.length; m++) {
165+
if (dynamicArray[m] % 20 === 0) {
166+
evenNumbers.push(dynamicArray[m]);
167+
}
168+
}
169+
170+
printArray(squares, "平方数");
171+
printArray(evenNumbers, "能被20整除的数");
172+
console.log("");
173+
174+
// 递归示例
175+
console.log("🔄 递归示例 (Recursion example):");
176+
var fibN: number = 7;
177+
var fibResult: number = fibonacci(fibN);
178+
console.log("斐波那契数列第" + fibN + "项: " + fibResult);
179+
console.log("");
180+
181+
// 数学库示例
182+
console.log("📐 数学库示例 (Math library example):");
183+
var angle: number = 45.0;
184+
var radians: number = (angle * Math.PI) / 180.0;
185+
console.log("sin(" + angle + "°) = " + Math.sin(radians).toFixed(4));
186+
console.log("cos(" + angle + "°) = " + Math.cos(radians).toFixed(4));
187+
console.log("sqrt(16) = " + Math.sqrt(16).toFixed(2));
188+
console.log("");
189+
190+
// 位操作示例
191+
console.log("🔧 位操作示例 (Bitwise operations):");
192+
var a: number = 12; // 1100 in binary
193+
var b: number = 10; // 1010 in binary
194+
console.log(a + " & " + b + " = " + (a & b) + " (AND)");
195+
console.log(a + " | " + b + " = " + (a | b) + " (OR)");
196+
console.log(a + " ^ " + b + " = " + (a ^ b) + " (XOR)");
197+
console.log("~" + a + " = " + (~a) + " (NOT)");
198+
console.log("");
199+
200+
// 枚举示例
201+
console.log("📋 枚举示例 (Enum example):");
202+
var today: Weekday = Weekday.WEDNESDAY;
203+
console.log("今天是星期" + today);
204+
console.log("");
205+
206+
// 类示例
207+
console.log("🎯 类示例 (Class example):");
208+
var calc = new Calculator();
209+
calc.add(5, 3);
210+
calc.add(10, 7);
211+
console.log("计算历史: " + calc.getHistory().join(", "));
212+
console.log("");
213+
214+
// 泛型函数示例
215+
function identity<T>(arg: T): T {
216+
return arg;
217+
}
218+
219+
console.log("🔧 泛型函数示例 (Generic function example):");
220+
console.log("字符串泛型: " + identity<string>("Hello"));
221+
console.log("数字泛型: " + identity<number>(42));
222+
console.log("");
223+
224+
// 联合类型示例
225+
function formatValue(value: string | number): string {
226+
if (typeof value === "string") {
227+
return "字符串: " + value;
228+
} else {
229+
return "数字: " + value.toString();
230+
}
231+
}
232+
233+
console.log("🎲 联合类型示例 (Union type example):");
234+
console.log(formatValue("TypeScript"));
235+
console.log(formatValue(2024));
236+
console.log("");
237+
238+
// 回调函数示例(模拟异步操作)
239+
console.log("⚡ 回调函数示例 (Callback example):");
240+
function simulateAsync(callback: (message: string) => void): void {
241+
setTimeout(function() {
242+
callback("异步操作完成!");
243+
}, 100);
244+
}
245+
246+
simulateAsync(function(message: string) {
247+
console.log(message);
248+
console.log("");
249+
250+
console.log("🎯 CodeForge TypeScript 代码执行完成!");
251+
console.log("🎯 CodeForge TypeScript execution completed!");
252+
console.log("");
253+
console.log("感谢使用 CodeForge 代码执行环境! 🚀");
254+
console.log("Thank you for using CodeForge! 🚀");
255+
});
256+
}
257+
258+
// 运行主函数
259+
main();

src-tauri/src/examples/typescript-nodejs.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// JavaScript 示例代码 - CodeForge 代码执行环境
1+
// TypeScript Node.js 示例代码 - CodeForge 代码执行环境
22

33
function greetUser(name) {
44
return `Hello, ${name}! 👋`;
@@ -41,18 +41,18 @@ function main() {
4141
console.log("");
4242

4343
console.log("=========================================");
44-
console.log(" CodeForge JavaScript ");
44+
console.log(" CodeForge TypeScript Node.js ");
4545
console.log("=========================================");
4646
console.log("");
4747

4848
// 基本输出示例
49-
console.log("✅ JavaScript 运行成功! (JavaScript is working!)");
50-
console.log("⚡ 这是 JavaScript 程序 (This is JavaScript program)");
49+
console.log("✅ TypeScript 运行成功! (TypeScript is working!)");
50+
console.log("⚡ 这是 TypeScript 程序 (This is TypeScript program)");
5151
console.log("");
5252

5353
// 变量操作
5454
const name = "CodeForge";
55-
const version = "JavaScript";
55+
const version = "TypeScript";
5656
const number1 = 10;
5757
const number2 = 20;
5858
const calculation = addNumbers(number1, number2);
@@ -204,8 +204,8 @@ function main() {
204204
console.log("计算历史:", calc.getHistory());
205205
console.log("");
206206

207-
console.log("🎯 CodeForge JavaScript 代码执行完成!");
208-
console.log("🎯 CodeForge JavaScript execution completed!");
207+
console.log("🎯 CodeForge TypeScript 代码执行完成!");
208+
console.log("🎯 CodeForge TypeScript execution completed!");
209209
console.log("");
210210
console.log("感谢使用 CodeForge 代码执行环境! 🚀");
211211
console.log("Thank you for using CodeForge! 🚀");

src-tauri/src/plugins/manager.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use crate::plugins::scala::ScalaPlugin;
1515
use crate::plugins::shell::ShellPlugin;
1616
use crate::plugins::swift::SwiftPlugin;
1717
use crate::plugins::typescript::TypeScriptPlugin;
18+
use crate::plugins::typescript_browser::TypeScriptBrowserPlugin;
1819
use crate::plugins::typescript_nodejs::TypeScriptNodeJsPlugin;
1920
use std::collections::HashMap;
2021

@@ -49,6 +50,10 @@ impl PluginManager {
4950
"typescript-nodejs".to_string(),
5051
Box::new(TypeScriptNodeJsPlugin),
5152
);
53+
plugins.insert(
54+
"typescript-browser".to_string(),
55+
Box::new(TypeScriptBrowserPlugin),
56+
);
5257

5358
Self { plugins }
5459
}

src-tauri/src/plugins/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,17 @@ pub trait LanguagePlugin: Send + Sync {
124124
let language_name = self.get_language_key();
125125

126126
// 查找匹配的插件配置
127-
let found_config = plugins
127+
if let Some(found_config) = plugins
128128
.iter()
129129
.find(|config| config.language == language_name)
130-
.cloned();
131-
132-
debug!(
133-
"执行代码 -> 获取插件 [ {} ] 配置 {:?}",
134-
language_name, found_config
135-
);
136-
return found_config;
130+
.cloned()
131+
{
132+
debug!(
133+
"执行代码 -> 获取插件 [ {} ] 配置 {:?}",
134+
language_name, found_config
135+
);
136+
return Some(found_config);
137+
}
137138
}
138139
}
139140

@@ -384,6 +385,7 @@ pub mod scala;
384385
pub mod shell;
385386
pub mod swift;
386387
pub mod typescript;
388+
pub mod typescript_browser;
387389
pub mod typescript_nodejs;
388390

389391
pub use manager::PluginManager;

src-tauri/src/plugins/typescript.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ impl LanguagePlugin for TypeScriptPlugin {
5959
PluginConfig {
6060
enabled: true,
6161
language: String::from("typescript"),
62-
before_compile: Some(String::from("tsc --lib es2017,dom --skipLibCheck $filename")),
62+
before_compile: Some(String::from(
63+
"tsc --lib es2017,dom --skipLibCheck $filename",
64+
)),
6365
extension: String::from("ts"),
6466
execute_home: None,
6567
run_command: Some(String::from("node $classname")),

0 commit comments

Comments
 (0)