diff --git a/README.md b/README.md
index 016e451..5585b22 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,9 @@ CodeForge 是一款轻量级、高性能的桌面代码执行器,专为开发
- **Rust**
- **Shell**
- **Swift**
+- **TypeScript**
+- **TypeScript (Browser)**
+- **TypeScript (Node.js)**
## 安装
diff --git a/public/icons/typescript-browser.svg b/public/icons/typescript-browser.svg
new file mode 100644
index 0000000..3ec4c71
--- /dev/null
+++ b/public/icons/typescript-browser.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/public/icons/typescript-nodejs.svg b/public/icons/typescript-nodejs.svg
new file mode 100644
index 0000000..cea945e
--- /dev/null
+++ b/public/icons/typescript-nodejs.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/public/icons/typescript.svg b/public/icons/typescript.svg
new file mode 100644
index 0000000..f275c90
--- /dev/null
+++ b/public/icons/typescript.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/src-tauri/src/examples/typescript-browser.ts b/src-tauri/src/examples/typescript-browser.ts
new file mode 100644
index 0000000..7f584c6
--- /dev/null
+++ b/src-tauri/src/examples/typescript-browser.ts
@@ -0,0 +1,259 @@
+// TypeScript Browser 示例代码 - CodeForge 代码执行环境
+
+// 接口定义
+interface Person {
+ name: string;
+ age: number;
+ height: number;
+}
+
+// 枚举定义
+enum Weekday {
+ MONDAY = 1,
+ TUESDAY,
+ WEDNESDAY,
+ THURSDAY,
+ FRIDAY,
+ SATURDAY,
+ SUNDAY
+}
+
+// 类型别名
+type CalculationResult = {
+ result: number;
+ operation: string;
+};
+
+// 函数定义
+function greetUser(name: string): string {
+ return "Hello, " + name + "! 👋";
+}
+
+function addNumbers(a: number, b: number): CalculationResult {
+ return {
+ result: a + b,
+ operation: 'addition'
+ };
+}
+
+function printArray(arr: any[], label: string): void {
+ console.log(label + ": " + arr.join(' '));
+}
+
+function fibonacci(n: number): number {
+ if (n <= 1) {
+ return n;
+ }
+ return fibonacci(n - 1) + fibonacci(n - 2);
+}
+
+// 类示例
+class Calculator {
+ private history: string[] = [];
+
+ public add(a: number, b: number): number {
+ var result = a + b;
+ this.history.push(a + " + " + b + " = " + result);
+ return result;
+ }
+
+ public getHistory(): string[] {
+ var copy: string[] = [];
+ for (var i = 0; i < this.history.length; i++) {
+ copy.push(this.history[i]);
+ }
+ return copy;
+ }
+}
+
+// 主函数
+function main(): void {
+ console.log("🎉 欢迎使用 CodeForge!");
+ console.log("Welcome to CodeForge!");
+ console.log("");
+
+ console.log("=========================================");
+ console.log(" CodeForge TypeScript Browser ");
+ console.log("=========================================");
+ console.log("");
+
+ // 基本输出示例
+ console.log("✅ TypeScript 运行成功! (TypeScript is working!)");
+ console.log("⚡ 这是 TypeScript 程序 (This is TypeScript program)");
+ console.log("");
+
+ // 变量操作(强类型)
+ var name: string = "CodeForge";
+ var version: string = "TypeScript";
+ var number1: number = 10;
+ var number2: number = 20;
+ var calculation: CalculationResult = addNumbers(number1, number2);
+
+ console.log("🔢 简单计算 (Simple calculation):");
+ console.log(number1 + " + " + number2 + " = " + calculation.result);
+ console.log("");
+
+ // 字符串操作
+ console.log("📝 字符串操作 (String operations):");
+ console.log("平台名称 (Platform): " + name);
+ console.log("语言版本 (Language): " + version);
+ console.log("完整信息 (Full info): " + name + " - " + version);
+ console.log("");
+
+ // 循环示例
+ console.log("🔄 循环输出 (Loop output):");
+ for (var i = 1; i <= 5; i++) {
+ console.log("第 " + i + " 次输出 (Output #" + i + "): Hello from CodeForge!");
+ }
+ console.log("");
+
+ // 数组操作(强类型数组)
+ console.log("🍎 数组示例 (Array example):");
+ var fruits: string[] = ["苹果", "香蕉", "橙子", "葡萄"];
+ for (var j = 0; j < fruits.length; j++) {
+ console.log((j + 1) + ". " + fruits[j]);
+ }
+ console.log("");
+
+ // 条件判断
+ var score: number = 85;
+ console.log("📊 成绩评估 (Score evaluation):");
+ if (score >= 90) {
+ console.log("优秀! (Excellent!)");
+ } else if (score >= 80) {
+ console.log("良好! (Good!)");
+ } else if (score >= 60) {
+ console.log("及格 (Pass)");
+ } else {
+ console.log("需要努力 (Need improvement)");
+ }
+ console.log("");
+
+ // 对象和接口示例
+ console.log("👤 对象和接口示例 (Object and Interface example):");
+ var person: Person = {
+ name: "张三",
+ age: 25,
+ height: 175.5
+ };
+
+ console.log("姓名: " + person.name + ", 年龄: " + person.age + ", 身高: " + person.height + " cm");
+ console.log("");
+
+ // 函数示例
+ console.log("🎭 函数示例 (Function example):");
+ console.log(greetUser("CodeForge用户"));
+ console.log("");
+
+ // 数组方法示例
+ console.log("💾 数组操作示例 (Array operations example):");
+ var dynamicArray: number[] = [];
+ for (var k = 0; k < 5; k++) {
+ dynamicArray.push((k + 1) * 10);
+ }
+ printArray(dynamicArray, "动态数组");
+
+ // 手动实现 map 功能
+ var squares: number[] = [];
+ for (var l = 0; l < dynamicArray.length; l++) {
+ squares.push(dynamicArray[l] * dynamicArray[l]);
+ }
+
+ // 手动实现 filter 功能
+ var evenNumbers: number[] = [];
+ for (var m = 0; m < dynamicArray.length; m++) {
+ if (dynamicArray[m] % 20 === 0) {
+ evenNumbers.push(dynamicArray[m]);
+ }
+ }
+
+ printArray(squares, "平方数");
+ printArray(evenNumbers, "能被20整除的数");
+ console.log("");
+
+ // 递归示例
+ console.log("🔄 递归示例 (Recursion example):");
+ var fibN: number = 7;
+ var fibResult: number = fibonacci(fibN);
+ console.log("斐波那契数列第" + fibN + "项: " + fibResult);
+ console.log("");
+
+ // 数学库示例
+ console.log("📐 数学库示例 (Math library example):");
+ var angle: number = 45.0;
+ var radians: number = (angle * Math.PI) / 180.0;
+ console.log("sin(" + angle + "°) = " + Math.sin(radians).toFixed(4));
+ console.log("cos(" + angle + "°) = " + Math.cos(radians).toFixed(4));
+ console.log("sqrt(16) = " + Math.sqrt(16).toFixed(2));
+ console.log("");
+
+ // 位操作示例
+ console.log("🔧 位操作示例 (Bitwise operations):");
+ var a: number = 12; // 1100 in binary
+ var b: number = 10; // 1010 in binary
+ console.log(a + " & " + b + " = " + (a & b) + " (AND)");
+ console.log(a + " | " + b + " = " + (a | b) + " (OR)");
+ console.log(a + " ^ " + b + " = " + (a ^ b) + " (XOR)");
+ console.log("~" + a + " = " + (~a) + " (NOT)");
+ console.log("");
+
+ // 枚举示例
+ console.log("📋 枚举示例 (Enum example):");
+ var today: Weekday = Weekday.WEDNESDAY;
+ console.log("今天是星期" + today);
+ console.log("");
+
+ // 类示例
+ console.log("🎯 类示例 (Class example):");
+ var calc = new Calculator();
+ calc.add(5, 3);
+ calc.add(10, 7);
+ console.log("计算历史: " + calc.getHistory().join(", "));
+ console.log("");
+
+ // 泛型函数示例
+ function identity(arg: T): T {
+ return arg;
+ }
+
+ console.log("🔧 泛型函数示例 (Generic function example):");
+ console.log("字符串泛型: " + identity("Hello"));
+ console.log("数字泛型: " + identity(42));
+ console.log("");
+
+ // 联合类型示例
+ function formatValue(value: string | number): string {
+ if (typeof value === "string") {
+ return "字符串: " + value;
+ } else {
+ return "数字: " + value.toString();
+ }
+ }
+
+ console.log("🎲 联合类型示例 (Union type example):");
+ console.log(formatValue("TypeScript"));
+ console.log(formatValue(2024));
+ console.log("");
+
+ // 回调函数示例(模拟异步操作)
+ console.log("⚡ 回调函数示例 (Callback example):");
+ function simulateAsync(callback: (message: string) => void): void {
+ setTimeout(function() {
+ callback("异步操作完成!");
+ }, 100);
+ }
+
+ simulateAsync(function(message: string) {
+ console.log(message);
+ console.log("");
+
+ console.log("🎯 CodeForge TypeScript 代码执行完成!");
+ console.log("🎯 CodeForge TypeScript execution completed!");
+ console.log("");
+ console.log("感谢使用 CodeForge 代码执行环境! 🚀");
+ console.log("Thank you for using CodeForge! 🚀");
+ });
+}
+
+// 运行主函数
+main();
\ No newline at end of file
diff --git a/src-tauri/src/examples/typescript-nodejs.ts b/src-tauri/src/examples/typescript-nodejs.ts
new file mode 100644
index 0000000..febbabf
--- /dev/null
+++ b/src-tauri/src/examples/typescript-nodejs.ts
@@ -0,0 +1,216 @@
+// TypeScript Node.js 示例代码 - CodeForge 代码执行环境
+
+function greetUser(name) {
+ return `Hello, ${name}! 👋`;
+}
+
+// 函数定义
+function addNumbers(a, b) {
+ return {
+ result: a + b,
+ operation: 'addition'
+ };
+}
+
+function printArray(arr, label) {
+ console.log(`${label}: ${arr.join(' ')}`);
+}
+
+function fibonacci(n) {
+ if (n <= 1) {
+ return n;
+ }
+ return fibonacci(n - 1) + fibonacci(n - 2);
+}
+
+// 枚举模拟
+const Weekday = {
+ MONDAY: 1,
+ TUESDAY: 2,
+ WEDNESDAY: 3,
+ THURSDAY: 4,
+ FRIDAY: 5,
+ SATURDAY: 6,
+ SUNDAY: 7
+};
+
+// 主函数
+function main() {
+ console.log("🎉 欢迎使用 CodeForge!");
+ console.log("Welcome to CodeForge!");
+ console.log("");
+
+ console.log("=========================================");
+ console.log(" CodeForge TypeScript Node.js ");
+ console.log("=========================================");
+ console.log("");
+
+ // 基本输出示例
+ console.log("✅ TypeScript 运行成功! (TypeScript is working!)");
+ console.log("⚡ 这是 TypeScript 程序 (This is TypeScript program)");
+ console.log("");
+
+ // 变量操作
+ const name = "CodeForge";
+ const version = "TypeScript";
+ const number1 = 10;
+ const number2 = 20;
+ const calculation = addNumbers(number1, number2);
+
+ console.log("🔢 简单计算 (Simple calculation):");
+ console.log(`${number1} + ${number2} = ${calculation.result}`);
+ console.log("");
+
+ // 字符串操作
+ console.log("📝 字符串操作 (String operations):");
+ console.log(`平台名称 (Platform): ${name}`);
+ console.log(`语言版本 (Language): ${version}`);
+ console.log(`完整信息 (Full info): ${name} - ${version}`);
+ console.log("");
+
+ // 循环示例
+ console.log("🔄 循环输出 (Loop output):");
+ for (let i = 1; i <= 5; i++) {
+ console.log(`第 ${i} 次输出 (Output #${i}): Hello from CodeForge!`);
+ }
+ console.log("");
+
+ // 数组操作
+ console.log("🍎 数组示例 (Array example):");
+ const fruits = ["苹果", "香蕉", "橙子", "葡萄"];
+ fruits.forEach((fruit, index) => {
+ console.log(`${index + 1}. ${fruit}`);
+ });
+ console.log("");
+
+ // 条件判断
+ const score = 85;
+ console.log("📊 成绩评估 (Score evaluation):");
+ if (score >= 90) {
+ console.log("优秀! (Excellent!)");
+ } else if (score >= 80) {
+ console.log("良好! (Good!)");
+ } else if (score >= 60) {
+ console.log("及格 (Pass)");
+ } else {
+ console.log("需要努力 (Need improvement)");
+ }
+ console.log("");
+
+ // 对象示例
+ console.log("👤 对象示例 (Object example):");
+ const person = {
+ name: "张三",
+ age: 25,
+ height: 175.5
+ };
+
+ console.log(`姓名: ${person.name}, 年龄: ${person.age}, 身高: ${person.height} cm`);
+ console.log("");
+
+ // 函数示例
+ console.log("🎭 函数示例 (Function example):");
+ console.log(greetUser("CodeForge用户"));
+ console.log("");
+
+ // 数组方法示例
+ console.log("💾 数组方法示例 (Array methods example):");
+ const dynamicArray = Array.from({ length: 5 }, (_, i) => (i + 1) * 10);
+ printArray(dynamicArray, "动态数组");
+
+ // Map 和 Filter 示例
+ const squares = dynamicArray.map(x => x * x);
+ const evenNumbers = dynamicArray.filter(x => x % 20 === 0);
+ printArray(squares, "平方数");
+ printArray(evenNumbers, "能被20整除的数");
+ console.log("");
+
+ // 解构赋值示例
+ console.log("🔍 解构赋值示例 (Destructuring example):");
+ const [first, second, ...rest] = fruits;
+ console.log(`第一个水果: ${first}`);
+ console.log(`第二个水果: ${second}`);
+ console.log(`其余水果: ${rest.join(', ')}`);
+
+ const { name: personName, age } = person;
+ console.log(`通过解构获取: ${personName}, ${age}岁`);
+ console.log("");
+
+ // 递归示例
+ console.log("🔄 递归示例 (Recursion example):");
+ const fibN = 7;
+ const fibResult = fibonacci(fibN);
+ console.log(`斐波那契数列第${fibN}项: ${fibResult}`);
+ console.log("");
+
+ // 数学库示例
+ console.log("📐 数学库示例 (Math library example):");
+ const angle = 45.0;
+ const radians = (angle * Math.PI) / 180.0;
+ console.log(`sin(${angle}°) = ${Math.sin(radians).toFixed(4)}`);
+ console.log(`cos(${angle}°) = ${Math.cos(radians).toFixed(4)}`);
+ console.log(`sqrt(16) = ${Math.sqrt(16).toFixed(2)}`);
+ console.log("");
+
+ // 位操作示例
+ console.log("🔧 位操作示例 (Bitwise operations):");
+ const a = 12; // 1100 in binary
+ const b = 10; // 1010 in binary
+ console.log(`${a} & ${b} = ${a & b} (AND)`);
+ console.log(`${a} | ${b} = ${a | b} (OR)`);
+ console.log(`${a} ^ ${b} = ${a ^ b} (XOR)`);
+ console.log(`~${a} = ${~a} (NOT)`);
+ console.log("");
+
+ // 枚举示例
+ console.log("📋 枚举示例 (Enum example):");
+ const today = Weekday.WEDNESDAY;
+ console.log(`今天是星期${today}`);
+ console.log("");
+
+ // Promise 和 async/await 示例
+ console.log("⚡ 异步示例 (Async example):");
+ const asyncExample = async () => {
+ return new Promise((resolve) => {
+ setTimeout(() => resolve("异步操作完成!"), 100);
+ });
+ };
+
+ asyncExample().then((message) => {
+ console.log(message);
+ console.log("");
+
+ // 类示例
+ console.log("🎯 类示例 (Class example):");
+ class Calculator {
+ constructor() {
+ this.history = [];
+ }
+
+ add(a, b) {
+ const result = a + b;
+ this.history.push(`${a} + ${b} = ${result}`);
+ return result;
+ }
+
+ getHistory() {
+ return [...this.history];
+ }
+ }
+
+ const calc = new Calculator();
+ calc.add(5, 3);
+ calc.add(10, 7);
+ console.log("计算历史:", calc.getHistory());
+ console.log("");
+
+ console.log("🎯 CodeForge TypeScript 代码执行完成!");
+ console.log("🎯 CodeForge TypeScript execution completed!");
+ console.log("");
+ console.log("感谢使用 CodeForge 代码执行环境! 🚀");
+ console.log("Thank you for using CodeForge! 🚀");
+ });
+}
+
+// 运行主函数
+main();
\ No newline at end of file
diff --git a/src-tauri/src/examples/typescript.ts b/src-tauri/src/examples/typescript.ts
new file mode 100644
index 0000000..75f2ad8
--- /dev/null
+++ b/src-tauri/src/examples/typescript.ts
@@ -0,0 +1,259 @@
+// TypeScript 示例代码 - CodeForge 代码执行环境
+
+// 接口定义
+interface Person {
+ name: string;
+ age: number;
+ height: number;
+}
+
+// 枚举定义
+enum Weekday {
+ MONDAY = 1,
+ TUESDAY,
+ WEDNESDAY,
+ THURSDAY,
+ FRIDAY,
+ SATURDAY,
+ SUNDAY
+}
+
+// 类型别名
+type CalculationResult = {
+ result: number;
+ operation: string;
+};
+
+// 函数定义
+function greetUser(name: string): string {
+ return "Hello, " + name + "! 👋";
+}
+
+function addNumbers(a: number, b: number): CalculationResult {
+ return {
+ result: a + b,
+ operation: 'addition'
+ };
+}
+
+function printArray(arr: any[], label: string): void {
+ console.log(label + ": " + arr.join(' '));
+}
+
+function fibonacci(n: number): number {
+ if (n <= 1) {
+ return n;
+ }
+ return fibonacci(n - 1) + fibonacci(n - 2);
+}
+
+// 类示例
+class Calculator {
+ private history: string[] = [];
+
+ public add(a: number, b: number): number {
+ var result = a + b;
+ this.history.push(a + " + " + b + " = " + result);
+ return result;
+ }
+
+ public getHistory(): string[] {
+ var copy: string[] = [];
+ for (var i = 0; i < this.history.length; i++) {
+ copy.push(this.history[i]);
+ }
+ return copy;
+ }
+}
+
+// 主函数
+function main(): void {
+ console.log("🎉 欢迎使用 CodeForge!");
+ console.log("Welcome to CodeForge!");
+ console.log("");
+
+ console.log("=========================================");
+ console.log(" CodeForge TypeScript ");
+ console.log("=========================================");
+ console.log("");
+
+ // 基本输出示例
+ console.log("✅ TypeScript 运行成功! (TypeScript is working!)");
+ console.log("⚡ 这是 TypeScript 程序 (This is TypeScript program)");
+ console.log("");
+
+ // 变量操作(强类型)
+ var name: string = "CodeForge";
+ var version: string = "TypeScript";
+ var number1: number = 10;
+ var number2: number = 20;
+ var calculation: CalculationResult = addNumbers(number1, number2);
+
+ console.log("🔢 简单计算 (Simple calculation):");
+ console.log(number1 + " + " + number2 + " = " + calculation.result);
+ console.log("");
+
+ // 字符串操作
+ console.log("📝 字符串操作 (String operations):");
+ console.log("平台名称 (Platform): " + name);
+ console.log("语言版本 (Language): " + version);
+ console.log("完整信息 (Full info): " + name + " - " + version);
+ console.log("");
+
+ // 循环示例
+ console.log("🔄 循环输出 (Loop output):");
+ for (var i = 1; i <= 5; i++) {
+ console.log("第 " + i + " 次输出 (Output #" + i + "): Hello from CodeForge!");
+ }
+ console.log("");
+
+ // 数组操作(强类型数组)
+ console.log("🍎 数组示例 (Array example):");
+ var fruits: string[] = ["苹果", "香蕉", "橙子", "葡萄"];
+ for (var j = 0; j < fruits.length; j++) {
+ console.log((j + 1) + ". " + fruits[j]);
+ }
+ console.log("");
+
+ // 条件判断
+ var score: number = 85;
+ console.log("📊 成绩评估 (Score evaluation):");
+ if (score >= 90) {
+ console.log("优秀! (Excellent!)");
+ } else if (score >= 80) {
+ console.log("良好! (Good!)");
+ } else if (score >= 60) {
+ console.log("及格 (Pass)");
+ } else {
+ console.log("需要努力 (Need improvement)");
+ }
+ console.log("");
+
+ // 对象和接口示例
+ console.log("👤 对象和接口示例 (Object and Interface example):");
+ var person: Person = {
+ name: "张三",
+ age: 25,
+ height: 175.5
+ };
+
+ console.log("姓名: " + person.name + ", 年龄: " + person.age + ", 身高: " + person.height + " cm");
+ console.log("");
+
+ // 函数示例
+ console.log("🎭 函数示例 (Function example):");
+ console.log(greetUser("CodeForge用户"));
+ console.log("");
+
+ // 数组方法示例
+ console.log("💾 数组操作示例 (Array operations example):");
+ var dynamicArray: number[] = [];
+ for (var k = 0; k < 5; k++) {
+ dynamicArray.push((k + 1) * 10);
+ }
+ printArray(dynamicArray, "动态数组");
+
+ // 手动实现 map 功能
+ var squares: number[] = [];
+ for (var l = 0; l < dynamicArray.length; l++) {
+ squares.push(dynamicArray[l] * dynamicArray[l]);
+ }
+
+ // 手动实现 filter 功能
+ var evenNumbers: number[] = [];
+ for (var m = 0; m < dynamicArray.length; m++) {
+ if (dynamicArray[m] % 20 === 0) {
+ evenNumbers.push(dynamicArray[m]);
+ }
+ }
+
+ printArray(squares, "平方数");
+ printArray(evenNumbers, "能被20整除的数");
+ console.log("");
+
+ // 递归示例
+ console.log("🔄 递归示例 (Recursion example):");
+ var fibN: number = 7;
+ var fibResult: number = fibonacci(fibN);
+ console.log("斐波那契数列第" + fibN + "项: " + fibResult);
+ console.log("");
+
+ // 数学库示例
+ console.log("📐 数学库示例 (Math library example):");
+ var angle: number = 45.0;
+ var radians: number = (angle * Math.PI) / 180.0;
+ console.log("sin(" + angle + "°) = " + Math.sin(radians).toFixed(4));
+ console.log("cos(" + angle + "°) = " + Math.cos(radians).toFixed(4));
+ console.log("sqrt(16) = " + Math.sqrt(16).toFixed(2));
+ console.log("");
+
+ // 位操作示例
+ console.log("🔧 位操作示例 (Bitwise operations):");
+ var a: number = 12; // 1100 in binary
+ var b: number = 10; // 1010 in binary
+ console.log(a + " & " + b + " = " + (a & b) + " (AND)");
+ console.log(a + " | " + b + " = " + (a | b) + " (OR)");
+ console.log(a + " ^ " + b + " = " + (a ^ b) + " (XOR)");
+ console.log("~" + a + " = " + (~a) + " (NOT)");
+ console.log("");
+
+ // 枚举示例
+ console.log("📋 枚举示例 (Enum example):");
+ var today: Weekday = Weekday.WEDNESDAY;
+ console.log("今天是星期" + today);
+ console.log("");
+
+ // 类示例
+ console.log("🎯 类示例 (Class example):");
+ var calc = new Calculator();
+ calc.add(5, 3);
+ calc.add(10, 7);
+ console.log("计算历史: " + calc.getHistory().join(", "));
+ console.log("");
+
+ // 泛型函数示例
+ function identity(arg: T): T {
+ return arg;
+ }
+
+ console.log("🔧 泛型函数示例 (Generic function example):");
+ console.log("字符串泛型: " + identity("Hello"));
+ console.log("数字泛型: " + identity(42));
+ console.log("");
+
+ // 联合类型示例
+ function formatValue(value: string | number): string {
+ if (typeof value === "string") {
+ return "字符串: " + value;
+ } else {
+ return "数字: " + value.toString();
+ }
+ }
+
+ console.log("🎲 联合类型示例 (Union type example):");
+ console.log(formatValue("TypeScript"));
+ console.log(formatValue(2024));
+ console.log("");
+
+ // 回调函数示例(模拟异步操作)
+ console.log("⚡ 回调函数示例 (Callback example):");
+ function simulateAsync(callback: (message: string) => void): void {
+ setTimeout(function() {
+ callback("异步操作完成!");
+ }, 100);
+ }
+
+ simulateAsync(function(message: string) {
+ console.log(message);
+ console.log("");
+
+ console.log("🎯 CodeForge TypeScript 代码执行完成!");
+ console.log("🎯 CodeForge TypeScript execution completed!");
+ console.log("");
+ console.log("感谢使用 CodeForge 代码执行环境! 🚀");
+ console.log("Thank you for using CodeForge! 🚀");
+ });
+}
+
+// 运行主函数
+main();
\ No newline at end of file
diff --git a/src-tauri/src/plugins/javascript_nodejs.rs b/src-tauri/src/plugins/javascript_nodejs.rs
index 3c01d5e..8f398fb 100644
--- a/src-tauri/src/plugins/javascript_nodejs.rs
+++ b/src-tauri/src/plugins/javascript_nodejs.rs
@@ -1,9 +1,9 @@
use super::{LanguagePlugin, PluginConfig};
use std::vec;
-pub struct LanguageNodeJsPlugin;
+pub struct JavaScriptNodeJsPlugin;
-impl LanguagePlugin for LanguageNodeJsPlugin {
+impl LanguagePlugin for JavaScriptNodeJsPlugin {
fn get_order(&self) -> i32 {
13
}
diff --git a/src-tauri/src/plugins/manager.rs b/src-tauri/src/plugins/manager.rs
index baf698f..8b66fbf 100644
--- a/src-tauri/src/plugins/manager.rs
+++ b/src-tauri/src/plugins/manager.rs
@@ -4,7 +4,7 @@ use crate::plugins::c::CPlugin;
use crate::plugins::clojure::ClojurePlugin;
use crate::plugins::go::GoPlugin;
use crate::plugins::java::JavaPlugin;
-use crate::plugins::javascript_nodejs::LanguageNodeJsPlugin;
+use crate::plugins::javascript_nodejs::JavaScriptNodeJsPlugin;
use crate::plugins::kotlin::KotlinPlugin;
use crate::plugins::nodejs::NodeJSPlugin;
use crate::plugins::python2::Python2Plugin;
@@ -14,6 +14,9 @@ use crate::plugins::rust::RustPlugin;
use crate::plugins::scala::ScalaPlugin;
use crate::plugins::shell::ShellPlugin;
use crate::plugins::swift::SwiftPlugin;
+use crate::plugins::typescript::TypeScriptPlugin;
+use crate::plugins::typescript_browser::TypeScriptBrowserPlugin;
+use crate::plugins::typescript_nodejs::TypeScriptNodeJsPlugin;
use std::collections::HashMap;
pub struct PluginManager {
@@ -38,9 +41,18 @@ impl PluginManager {
plugins.insert("c".to_string(), Box::new(CPlugin));
plugins.insert("ruby".to_string(), Box::new(RubyPlugin));
plugins.insert("applescript".to_string(), Box::new(AppleScriptPlugin));
+ plugins.insert("typescript".to_string(), Box::new(TypeScriptPlugin));
plugins.insert(
"javascript-nodejs".to_string(),
- Box::new(LanguageNodeJsPlugin),
+ Box::new(JavaScriptNodeJsPlugin),
+ );
+ plugins.insert(
+ "typescript-nodejs".to_string(),
+ Box::new(TypeScriptNodeJsPlugin),
+ );
+ plugins.insert(
+ "typescript-browser".to_string(),
+ Box::new(TypeScriptBrowserPlugin),
);
Self { plugins }
diff --git a/src-tauri/src/plugins/mod.rs b/src-tauri/src/plugins/mod.rs
index 9fc5301..082ec17 100644
--- a/src-tauri/src/plugins/mod.rs
+++ b/src-tauri/src/plugins/mod.rs
@@ -124,16 +124,17 @@ pub trait LanguagePlugin: Send + Sync {
let language_name = self.get_language_key();
// 查找匹配的插件配置
- let found_config = plugins
+ if let Some(found_config) = plugins
.iter()
.find(|config| config.language == language_name)
- .cloned();
-
- debug!(
- "执行代码 -> 获取插件 [ {} ] 配置 {:?}",
- language_name, found_config
- );
- return found_config;
+ .cloned()
+ {
+ debug!(
+ "执行代码 -> 获取插件 [ {} ] 配置 {:?}",
+ language_name, found_config
+ );
+ return Some(found_config);
+ }
}
}
@@ -216,6 +217,11 @@ pub trait LanguagePlugin: Send + Sync {
}
let processed_cmd = before_cmd.replace("$filename", file_path);
+ info!(
+ "执行代码 -> 插件 [ {} ] 处理 pre_execute_hook 处理命令 {}",
+ self.get_language_key(),
+ processed_cmd
+ );
self.handle_environment_setup(&processed_cmd)?;
}
}
@@ -302,6 +308,8 @@ pub trait LanguagePlugin: Send + Sync {
}
fn execute_cross_platform_command(&self, command: &str) -> Result<(), String> {
+ info!("执行命令: {}", command);
+
let output = if cfg!(target_os = "windows") {
std::process::Command::new("cmd")
.args(["/C", command])
@@ -314,11 +322,26 @@ pub trait LanguagePlugin: Send + Sync {
let output = output.map_err(|e| format!("执行命令失败: {}", e))?;
+ debug!("命令退出状态: {:?}", output.status);
+ debug!("命令标准输出: {}", String::from_utf8_lossy(&output.stdout));
+ debug!("命令标准错误: {}", String::from_utf8_lossy(&output.stderr));
+
if !output.status.success() {
- return Err(format!(
- "命令执行失败: {}",
- String::from_utf8_lossy(&output.stderr)
- ));
+ let stderr = String::from_utf8_lossy(&output.stderr);
+ let stdout = String::from_utf8_lossy(&output.stdout);
+
+ let error_msg = if !stderr.is_empty() {
+ stderr.to_string()
+ } else if !stdout.is_empty() {
+ stdout.to_string()
+ } else {
+ format!(
+ "命令执行失败,退出代码: {}",
+ output.status.code().unwrap_or(-1)
+ )
+ };
+
+ return Err(format!("命令执行失败: {}", error_msg));
}
Ok(())
@@ -361,5 +384,8 @@ pub mod rust;
pub mod scala;
pub mod shell;
pub mod swift;
+pub mod typescript;
+pub mod typescript_browser;
+pub mod typescript_nodejs;
pub use manager::PluginManager;
diff --git a/src-tauri/src/plugins/typescript.rs b/src-tauri/src/plugins/typescript.rs
new file mode 100644
index 0000000..f7a51fe
--- /dev/null
+++ b/src-tauri/src/plugins/typescript.rs
@@ -0,0 +1,79 @@
+use super::{LanguagePlugin, PluginConfig};
+use std::vec;
+
+pub struct TypeScriptPlugin;
+
+impl LanguagePlugin for TypeScriptPlugin {
+ fn get_order(&self) -> i32 {
+ 17
+ }
+
+ fn get_language_name(&self) -> &'static str {
+ "TypeScript"
+ }
+
+ fn get_language_key(&self) -> &'static str {
+ "typescript"
+ }
+
+ fn get_file_extension(&self) -> String {
+ self.get_config()
+ .map(|config| config.extension.clone())
+ .unwrap_or_else(|| "ts".to_string())
+ }
+
+ fn get_version_args(&self) -> Vec<&'static str> {
+ vec!["--version"]
+ }
+
+ fn get_path_command(&self) -> String {
+ "which tsc".to_string()
+ }
+
+ fn get_execute_args(&self, file_path: &str) -> Vec {
+ if let Some(config) = self.get_config() {
+ if let Some(run_cmd) = &config.run_command {
+ let processed_cmd = if run_cmd.contains("$classname") {
+ let class_name = if file_path.ends_with(&self.get_file_extension().to_string())
+ {
+ file_path.replace(&self.get_file_extension().to_string(), "js")
+ } else {
+ file_path.to_string()
+ };
+ run_cmd.replace("$classname", &class_name)
+ } else {
+ run_cmd.replace("$filename", file_path)
+ };
+
+ return processed_cmd
+ .split_whitespace()
+ .skip(1)
+ .map(|s| s.to_string())
+ .collect();
+ }
+ }
+ vec![file_path.to_string()]
+ }
+
+ fn get_default_config(&self) -> PluginConfig {
+ PluginConfig {
+ enabled: true,
+ language: String::from("typescript"),
+ before_compile: Some(String::from(
+ "tsc --lib es2017,dom --skipLibCheck $filename",
+ )),
+ extension: String::from("ts"),
+ execute_home: None,
+ run_command: Some(String::from("node $classname")),
+ after_compile: Some(String::from("rm -f *.js")),
+ template: Some(String::from("// 在这里输入 TypeScript 代码")),
+ timeout: Some(30),
+ }
+ }
+
+ fn get_default_command(&self) -> String {
+ self.get_config()
+ .and_then(|config| config.run_command.clone())
+ .unwrap_or_else(|| "tsc".to_string())
+ }
+}
diff --git a/src-tauri/src/plugins/typescript_browser.rs b/src-tauri/src/plugins/typescript_browser.rs
new file mode 100644
index 0000000..414cffb
--- /dev/null
+++ b/src-tauri/src/plugins/typescript_browser.rs
@@ -0,0 +1,81 @@
+use super::{LanguagePlugin, PluginConfig};
+use std::vec;
+
+pub struct TypeScriptBrowserPlugin;
+
+impl LanguagePlugin for TypeScriptBrowserPlugin {
+ fn get_order(&self) -> i32 {
+ 16
+ }
+
+ fn get_language_name(&self) -> &'static str {
+ "TypeScript (Browser)"
+ }
+
+ fn get_language_key(&self) -> &'static str {
+ "typescript-browser"
+ }
+
+ fn get_file_extension(&self) -> String {
+ self.get_config()
+ .map(|config| config.extension.clone())
+ .unwrap_or_else(|| "ts".to_string())
+ }
+
+ fn get_version_args(&self) -> Vec<&'static str> {
+ vec!["--version"]
+ }
+
+ fn get_path_command(&self) -> String {
+ "which tsc".to_string()
+ }
+
+ fn get_execute_args(&self, file_path: &str) -> Vec {
+ if let Some(config) = self.get_config() {
+ if let Some(run_cmd) = &config.run_command {
+ let processed_cmd = if run_cmd.contains("$classname") {
+ let class_name = if file_path.ends_with(&self.get_file_extension().to_string())
+ {
+ file_path.replace(&self.get_file_extension().to_string(), "js")
+ } else {
+ file_path.to_string()
+ };
+ run_cmd.replace("$classname", &class_name)
+ } else {
+ run_cmd.replace("$filename", file_path)
+ };
+
+ return processed_cmd
+ .split_whitespace()
+ .skip(1)
+ .map(|s| s.to_string())
+ .collect();
+ }
+ }
+ vec![file_path.to_string()]
+ }
+
+ fn get_default_config(&self) -> PluginConfig {
+ PluginConfig {
+ enabled: true,
+ language: String::from("typescript-browser"),
+ before_compile: Some(String::from(
+ "tsc --lib es2017,dom --skipLibCheck $filename",
+ )),
+ extension: String::from("ts"),
+ execute_home: None,
+ run_command: Some(String::from(
+ "echo ",
+ )),
+ after_compile: Some(String::from("rm -f *.js")),
+ template: Some(String::from("// 在这里输入 TypeScript (Browser) 代码")),
+ timeout: Some(30),
+ }
+ }
+
+ fn get_default_command(&self) -> String {
+ self.get_config()
+ .and_then(|config| config.run_command.clone())
+ .unwrap_or_else(|| "tsc".to_string())
+ }
+}
diff --git a/src-tauri/src/plugins/typescript_nodejs.rs b/src-tauri/src/plugins/typescript_nodejs.rs
new file mode 100644
index 0000000..b88cd51
--- /dev/null
+++ b/src-tauri/src/plugins/typescript_nodejs.rs
@@ -0,0 +1,52 @@
+use super::{LanguagePlugin, PluginConfig};
+use std::vec;
+
+pub struct TypeScriptNodeJsPlugin;
+
+impl LanguagePlugin for TypeScriptNodeJsPlugin {
+ fn get_order(&self) -> i32 {
+ 16
+ }
+
+ fn get_language_name(&self) -> &'static str {
+ "TypeScript (Node.js)"
+ }
+
+ fn get_language_key(&self) -> &'static str {
+ "typescript-nodejs"
+ }
+
+ fn get_file_extension(&self) -> String {
+ self.get_config()
+ .map(|config| config.extension.clone())
+ .unwrap_or_else(|| "ts".to_string())
+ }
+
+ fn get_version_args(&self) -> Vec<&'static str> {
+ vec!["--version"]
+ }
+
+ fn get_path_command(&self) -> String {
+ "which node".to_string()
+ }
+
+ fn get_default_config(&self) -> PluginConfig {
+ PluginConfig {
+ enabled: true,
+ language: String::from("typescript-nodejs"),
+ before_compile: None,
+ extension: String::from("ts"),
+ execute_home: None,
+ run_command: Some(String::from("node $filename")),
+ after_compile: None,
+ template: Some(String::from("// 在这里输入 TypeScript (Node.js) 代码")),
+ timeout: Some(30),
+ }
+ }
+
+ fn get_default_command(&self) -> String {
+ self.get_config()
+ .and_then(|config| config.run_command.clone())
+ .unwrap_or_else(|| "node".to_string())
+ }
+}
diff --git a/src/composables/useCodeMirrorEditor.ts b/src/composables/useCodeMirrorEditor.ts
index a97f6cc..dceabc0 100644
--- a/src/composables/useCodeMirrorEditor.ts
+++ b/src/composables/useCodeMirrorEditor.ts
@@ -184,6 +184,10 @@ export function useCodeMirrorEditor(props: Props)
return StreamLanguage.define(clojure)
case 'ruby':
return StreamLanguage.define(ruby)
+ case 'typescript':
+ case 'typescript-browser':
+ case 'typescript-nodejs':
+ return javascript({typescript: true})
default:
return null
}