@tishlang/tish-format 1.0.12 → 2.0.1

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 (189) hide show
  1. package/Cargo.toml +51 -0
  2. package/LICENSE +13 -0
  3. package/bin/tish-format +0 -0
  4. package/crates/js_to_tish/Cargo.toml +11 -0
  5. package/crates/js_to_tish/README.md +18 -0
  6. package/crates/js_to_tish/src/error.rs +55 -0
  7. package/crates/js_to_tish/src/lib.rs +11 -0
  8. package/crates/js_to_tish/src/span_util.rs +35 -0
  9. package/crates/js_to_tish/src/transform/expr.rs +611 -0
  10. package/crates/js_to_tish/src/transform/stmt.rs +503 -0
  11. package/crates/js_to_tish/src/transform.rs +60 -0
  12. package/crates/tish/Cargo.toml +62 -0
  13. package/crates/tish/build.rs +21 -0
  14. package/crates/tish/src/cargo_native_registry.rs +32 -0
  15. package/crates/tish/src/cli_help.rs +576 -0
  16. package/crates/tish/src/main.rs +853 -0
  17. package/crates/tish/src/repl_completion.rs +199 -0
  18. package/crates/tish/tests/cargo_example_compile.rs +67 -0
  19. package/crates/tish/tests/error_source_location.rs +36 -0
  20. package/crates/tish/tests/fixtures/cargo_example_project/Cargo.toml +3 -0
  21. package/crates/tish/tests/fixtures/cargo_example_project/crates/demo-shim/Cargo.toml +11 -0
  22. package/crates/tish/tests/fixtures/cargo_example_project/crates/demo-shim/src/lib.rs +12 -0
  23. package/crates/tish/tests/fixtures/cargo_example_project/package.json +10 -0
  24. package/crates/tish/tests/fixtures/cargo_example_project/src/main.tish +3 -0
  25. package/crates/tish/tests/fixtures/runtime_error_location.tish +5 -0
  26. package/crates/tish/tests/fixtures/trycatch_runtime_errors.tish +15 -0
  27. package/crates/tish/tests/fixtures/tty_capability.tish +9 -0
  28. package/crates/tish/tests/integration_test.rs +1406 -0
  29. package/crates/tish/tests/run_optimize_stdout_parity.rs +50 -0
  30. package/crates/tish/tests/shortcircuit.rs +65 -0
  31. package/crates/tish/tests/trycatch_runtime_errors.rs +45 -0
  32. package/crates/tish/tests/tty_capability.rs +43 -0
  33. package/crates/tish_ast/Cargo.toml +9 -0
  34. package/crates/tish_ast/src/ast.rs +649 -0
  35. package/crates/tish_ast/src/lib.rs +5 -0
  36. package/crates/tish_build_utils/Cargo.toml +11 -0
  37. package/crates/tish_build_utils/src/lib.rs +577 -0
  38. package/crates/tish_builtins/Cargo.toml +22 -0
  39. package/crates/tish_builtins/src/array.rs +803 -0
  40. package/crates/tish_builtins/src/collections.rs +481 -0
  41. package/crates/tish_builtins/src/construct.rs +199 -0
  42. package/crates/tish_builtins/src/date.rs +538 -0
  43. package/crates/tish_builtins/src/globals.rs +293 -0
  44. package/crates/tish_builtins/src/helpers.rs +35 -0
  45. package/crates/tish_builtins/src/iterator.rs +129 -0
  46. package/crates/tish_builtins/src/lib.rs +21 -0
  47. package/crates/tish_builtins/src/math.rs +89 -0
  48. package/crates/tish_builtins/src/number.rs +96 -0
  49. package/crates/tish_builtins/src/object.rs +36 -0
  50. package/crates/tish_builtins/src/string.rs +646 -0
  51. package/crates/tish_builtins/src/symbol.rs +83 -0
  52. package/crates/tish_builtins/src/typedarrays.rs +298 -0
  53. package/crates/tish_bytecode/Cargo.toml +17 -0
  54. package/crates/tish_bytecode/src/chunk.rs +164 -0
  55. package/crates/tish_bytecode/src/compiler.rs +2604 -0
  56. package/crates/tish_bytecode/src/encoding.rs +102 -0
  57. package/crates/tish_bytecode/src/lib.rs +20 -0
  58. package/crates/tish_bytecode/src/opcode.rs +185 -0
  59. package/crates/tish_bytecode/src/peephole.rs +189 -0
  60. package/crates/tish_bytecode/src/serialize.rs +193 -0
  61. package/crates/tish_bytecode/tests/break_continue_bytecode.rs +44 -0
  62. package/crates/tish_bytecode/tests/constant_folding.rs +84 -0
  63. package/crates/tish_bytecode/tests/sort_optimization.rs +31 -0
  64. package/crates/tish_compile/Cargo.toml +27 -0
  65. package/crates/tish_compile/src/check.rs +774 -0
  66. package/crates/tish_compile/src/codegen.rs +7317 -0
  67. package/crates/tish_compile/src/infer.rs +1681 -0
  68. package/crates/tish_compile/src/lib.rs +206 -0
  69. package/crates/tish_compile/src/resolve.rs +1951 -0
  70. package/crates/tish_compile/src/types.rs +605 -0
  71. package/crates/tish_compile_js/Cargo.toml +18 -0
  72. package/crates/tish_compile_js/examples/jsx_vdom_smoke.tish +8 -0
  73. package/crates/tish_compile_js/src/codegen.rs +938 -0
  74. package/crates/tish_compile_js/src/error.rs +20 -0
  75. package/crates/tish_compile_js/src/lib.rs +26 -0
  76. package/crates/tish_compile_js/src/tests_jsx.rs +414 -0
  77. package/crates/tish_compiler_wasm/Cargo.toml +21 -0
  78. package/crates/tish_compiler_wasm/src/lib.rs +57 -0
  79. package/crates/tish_compiler_wasm/src/resolve_virtual.rs +473 -0
  80. package/crates/tish_core/Cargo.toml +32 -0
  81. package/crates/tish_core/src/console_style.rs +170 -0
  82. package/crates/tish_core/src/json.rs +430 -0
  83. package/crates/tish_core/src/lib.rs +20 -0
  84. package/crates/tish_core/src/macros.rs +36 -0
  85. package/crates/tish_core/src/shape.rs +85 -0
  86. package/crates/tish_core/src/uri.rs +118 -0
  87. package/crates/tish_core/src/value.rs +1350 -0
  88. package/crates/tish_core/src/vmref.rs +183 -0
  89. package/crates/tish_cranelift/Cargo.toml +19 -0
  90. package/crates/tish_cranelift/src/lib.rs +43 -0
  91. package/crates/tish_cranelift/src/link.rs +130 -0
  92. package/crates/tish_cranelift/src/lower.rs +85 -0
  93. package/crates/tish_cranelift_runtime/Cargo.toml +26 -0
  94. package/crates/tish_cranelift_runtime/src/lib.rs +45 -0
  95. package/crates/tish_eval/Cargo.toml +51 -0
  96. package/crates/tish_eval/src/eval.rs +4265 -0
  97. package/crates/tish_eval/src/http.rs +191 -0
  98. package/crates/tish_eval/src/lib.rs +99 -0
  99. package/crates/tish_eval/src/natives.rs +551 -0
  100. package/crates/tish_eval/src/promise.rs +179 -0
  101. package/crates/tish_eval/src/regex.rs +299 -0
  102. package/crates/tish_eval/src/timers.rs +120 -0
  103. package/crates/tish_eval/src/value.rs +336 -0
  104. package/crates/tish_eval/src/value_convert.rs +117 -0
  105. package/crates/tish_ffi/Cargo.toml +26 -0
  106. package/crates/tish_ffi/src/lib.rs +518 -0
  107. package/crates/tish_ffi/tests/fixtures/testmod/Cargo.toml +18 -0
  108. package/crates/tish_ffi/tests/fixtures/testmod/src/lib.rs +46 -0
  109. package/crates/tish_ffi/tests/loader.rs +65 -0
  110. package/crates/tish_fmt/Cargo.toml +16 -0
  111. package/crates/tish_fmt/src/bin/tish-fmt.rs +41 -0
  112. package/crates/tish_fmt/src/lib.rs +2157 -0
  113. package/crates/tish_jsx_web/Cargo.toml +9 -0
  114. package/crates/tish_jsx_web/README.md +5 -0
  115. package/crates/tish_jsx_web/src/lib.rs +2 -0
  116. package/crates/tish_lexer/Cargo.toml +9 -0
  117. package/crates/tish_lexer/src/lib.rs +1104 -0
  118. package/crates/tish_lexer/src/token.rs +170 -0
  119. package/crates/tish_lint/Cargo.toml +18 -0
  120. package/crates/tish_lint/src/bin/tish-lint.rs +195 -0
  121. package/crates/tish_lint/src/lib.rs +281 -0
  122. package/crates/tish_llvm/Cargo.toml +13 -0
  123. package/crates/tish_llvm/src/lib.rs +115 -0
  124. package/crates/tish_lsp/Cargo.toml +25 -0
  125. package/crates/tish_lsp/README.md +26 -0
  126. package/crates/tish_lsp/src/builtin_goto.rs +362 -0
  127. package/crates/tish_lsp/src/import_goto.rs +564 -0
  128. package/crates/tish_lsp/src/main.rs +1459 -0
  129. package/crates/tish_native/Cargo.toml +16 -0
  130. package/crates/tish_native/src/build.rs +481 -0
  131. package/crates/tish_native/src/config.rs +48 -0
  132. package/crates/tish_native/src/lib.rs +416 -0
  133. package/crates/tish_opt/Cargo.toml +13 -0
  134. package/crates/tish_opt/src/lib.rs +1046 -0
  135. package/crates/tish_parser/Cargo.toml +11 -0
  136. package/crates/tish_parser/src/lib.rs +386 -0
  137. package/crates/tish_parser/src/parser.rs +2726 -0
  138. package/crates/tish_pg/Cargo.toml +34 -0
  139. package/crates/tish_pg/README.md +38 -0
  140. package/crates/tish_pg/src/error.rs +52 -0
  141. package/crates/tish_pg/src/lib.rs +955 -0
  142. package/crates/tish_resolve/Cargo.toml +13 -0
  143. package/crates/tish_resolve/src/lib.rs +3601 -0
  144. package/crates/tish_resolve/src/pos.rs +141 -0
  145. package/crates/tish_runtime/Cargo.toml +100 -0
  146. package/crates/tish_runtime/src/http.rs +1347 -0
  147. package/crates/tish_runtime/src/http_fetch.rs +492 -0
  148. package/crates/tish_runtime/src/http_hyper.rs +441 -0
  149. package/crates/tish_runtime/src/http_prefork.rs +189 -0
  150. package/crates/tish_runtime/src/lib.rs +1447 -0
  151. package/crates/tish_runtime/src/native_promise.rs +15 -0
  152. package/crates/tish_runtime/src/promise.rs +558 -0
  153. package/crates/tish_runtime/src/promise_io.rs +38 -0
  154. package/crates/tish_runtime/src/timers.rs +172 -0
  155. package/crates/tish_runtime/src/tty.rs +226 -0
  156. package/crates/tish_runtime/src/ws.rs +778 -0
  157. package/crates/tish_runtime/tests/fetch_readable_stream.rs +102 -0
  158. package/crates/tish_ui/Cargo.toml +17 -0
  159. package/crates/tish_ui/src/jsx.rs +692 -0
  160. package/crates/tish_ui/src/lib.rs +20 -0
  161. package/crates/tish_ui/src/runtime/hooks.rs +573 -0
  162. package/crates/tish_ui/src/runtime/mod.rs +183 -0
  163. package/crates/tish_vm/Cargo.toml +60 -0
  164. package/crates/tish_vm/src/jit.rs +1050 -0
  165. package/crates/tish_vm/src/lib.rs +41 -0
  166. package/crates/tish_vm/src/vm.rs +3536 -0
  167. package/crates/tish_vm/tests/concurrent_shared_state.rs +140 -0
  168. package/crates/tish_vm/tests/fixtures/or_string_cmd.tish +2 -0
  169. package/crates/tish_vm/tests/lexical_scope_declare.rs +34 -0
  170. package/crates/tish_vm/tests/peephole_jump_chain_logical_or.rs +150 -0
  171. package/crates/tish_wasm/Cargo.toml +15 -0
  172. package/crates/tish_wasm/src/lib.rs +428 -0
  173. package/crates/tish_wasm_runtime/Cargo.toml +37 -0
  174. package/crates/tish_wasm_runtime/src/gpu.rs +429 -0
  175. package/crates/tish_wasm_runtime/src/lib.rs +42 -0
  176. package/crates/tishlang_cargo_bindgen/Cargo.toml +26 -0
  177. package/crates/tishlang_cargo_bindgen/src/classify.rs +261 -0
  178. package/crates/tishlang_cargo_bindgen/src/discover.rs +125 -0
  179. package/crates/tishlang_cargo_bindgen/src/infer.rs +382 -0
  180. package/crates/tishlang_cargo_bindgen/src/lib.rs +349 -0
  181. package/crates/tishlang_cargo_bindgen/src/main.rs +167 -0
  182. package/crates/tishlang_cargo_bindgen/src/metadata.rs +117 -0
  183. package/justfile +276 -0
  184. package/package.json +2 -2
  185. package/platform/darwin-arm64/tish-fmt +0 -0
  186. package/platform/darwin-x64/tish-fmt +0 -0
  187. package/platform/linux-arm64/tish-fmt +0 -0
  188. package/platform/linux-x64/tish-fmt +0 -0
  189. package/platform/win32-x64/tish-fmt.exe +0 -0
@@ -0,0 +1,50 @@
1
+ //! Ensure `tish run` and `tish run --no-optimize` agree on stdout for the same program.
2
+
3
+ use std::path::PathBuf;
4
+ use std::process::Command;
5
+
6
+ #[test]
7
+ fn string_or_fixture_stdout_matches_with_and_without_optimize() {
8
+ let tish = PathBuf::from(env!("CARGO_BIN_EXE_tish"));
9
+ let fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
10
+ .join("..")
11
+ .join("tish_vm")
12
+ .join("tests")
13
+ .join("fixtures")
14
+ .join("or_string_cmd.tish");
15
+ assert!(fixture.is_file(), "missing fixture {}", fixture.display());
16
+
17
+ let out_default = Command::new(&tish)
18
+ .args(["run", "--feature", "process", fixture.to_str().unwrap()])
19
+ .output()
20
+ .expect("spawn tish run");
21
+ assert!(
22
+ out_default.status.success(),
23
+ "stderr: {}",
24
+ String::from_utf8_lossy(&out_default.stderr)
25
+ );
26
+
27
+ let out_noopt = Command::new(&tish)
28
+ .args([
29
+ "run",
30
+ "--no-optimize",
31
+ "--feature",
32
+ "process",
33
+ fixture.to_str().unwrap(),
34
+ ])
35
+ .output()
36
+ .expect("spawn tish run --no-optimize");
37
+ assert!(
38
+ out_noopt.status.success(),
39
+ "stderr: {}",
40
+ String::from_utf8_lossy(&out_noopt.stderr)
41
+ );
42
+
43
+ assert_eq!(
44
+ out_default.stdout,
45
+ out_noopt.stdout,
46
+ "stdout differs:\n default: {:?}\n noopt: {:?}",
47
+ String::from_utf8_lossy(&out_default.stdout),
48
+ String::from_utf8_lossy(&out_noopt.stdout)
49
+ );
50
+ }
@@ -0,0 +1,65 @@
1
+ //! Verify && and || short-circuit (JumpIfFalse before evaluating right side).
2
+ //! Moved from tish_bytecode to break publish cycle (bytecode dev-depends on vm, vm depends on bytecode).
3
+ use std::path::Path;
4
+ use tishlang_bytecode::{compile, compile_unoptimized, Opcode};
5
+ use tishlang_compile::{merge_modules, resolve_project};
6
+ use tishlang_opt;
7
+ use tishlang_parser::parse;
8
+ use tishlang_vm;
9
+
10
+ #[test]
11
+ fn test_and_shortcircuit_emits_jump() {
12
+ let source = "let x = null; let y = x != null && x.foo;";
13
+ let program = parse(source).expect("parse");
14
+ let chunk = compile_unoptimized(&program).expect("compile");
15
+ let code = &chunk.code;
16
+ let has_jump_if_false = code.windows(1).any(|w| w[0] == Opcode::JumpIfFalse as u8);
17
+ assert!(
18
+ has_jump_if_false,
19
+ "And should emit JumpIfFalse for short-circuit"
20
+ );
21
+ }
22
+
23
+ #[test]
24
+ fn test_and_shortcircuit_runs_unoptimized() {
25
+ let source = "let x = null; let y = x != null && x.foo;";
26
+ let program = parse(source).expect("parse");
27
+ let chunk = compile_unoptimized(&program).expect("compile");
28
+ let result = tishlang_vm::run(&chunk);
29
+ assert!(
30
+ result.is_ok(),
31
+ "Should not throw (short-circuit avoids x.foo): {:?}",
32
+ result.err()
33
+ );
34
+ }
35
+
36
+ #[test]
37
+ fn test_and_shortcircuit_runs_optimized() {
38
+ let source = "let x = null; let y = x != null && x.foo;";
39
+ let program = parse(source).expect("parse");
40
+ let program = tishlang_opt::optimize(&program);
41
+ let chunk = tishlang_bytecode::compile(&program).expect("compile");
42
+ let result = tishlang_vm::run(&chunk);
43
+ assert!(
44
+ result.is_ok(),
45
+ "Should not throw with peephole (short-circuit): {:?}",
46
+ result.err()
47
+ );
48
+ }
49
+
50
+ #[test]
51
+ fn test_and_shortcircuit_via_resolve_project() {
52
+ let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tests/shortcircuit.tish");
53
+ let path = path.canonicalize().expect("path");
54
+ let project_root = path.parent().unwrap();
55
+ let modules = resolve_project(&path, Some(project_root)).expect("resolve");
56
+ let program = merge_modules(modules).expect("merge").program;
57
+ let program = tishlang_opt::optimize(&program); // Mirror CLI
58
+ let chunk = compile(&program).expect("compile");
59
+ let result = tishlang_vm::run(&chunk);
60
+ assert!(
61
+ result.is_ok(),
62
+ "Should not throw via resolve+merge+opt (CLI path): {:?}",
63
+ result.err()
64
+ );
65
+ }
@@ -0,0 +1,45 @@
1
+ //! Issue #60: `try/catch` must catch VM-internal runtime errors (property/method access on
2
+ //! null, calling a non-function) AND `throw`s that propagate across function-call frames,
3
+ //! preserving the thrown value. Verified on the bytecode VM and the tree-walk interpreter
4
+ //! (the two backends #60 targets — the embedded/browser target is the VM, the interpreter is
5
+ //! its oracle). The native backend surfaces these as Rust panics and is tracked separately.
6
+
7
+ use std::path::PathBuf;
8
+ use std::process::Command;
9
+
10
+ const EXPECTED: &str = "\
11
+ A caught
12
+ B caught: boom
13
+ C caught
14
+ D done
15
+ E caught: rethrown
16
+ F ok
17
+ G total: 206
18
+ ";
19
+
20
+ fn run(backend: &str, fixture: &str) -> String {
21
+ let tish = PathBuf::from(env!("CARGO_BIN_EXE_tish"));
22
+ let out = Command::new(&tish)
23
+ .args(["run", "--backend", backend, fixture])
24
+ .output()
25
+ .expect("spawn tish run");
26
+ assert!(
27
+ out.status.success(),
28
+ "tish run --backend {backend} failed: {}",
29
+ String::from_utf8_lossy(&out.stderr)
30
+ );
31
+ String::from_utf8_lossy(&out.stdout).into_owned()
32
+ }
33
+
34
+ #[test]
35
+ fn trycatch_catches_runtime_and_cross_frame_errors() {
36
+ let fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
37
+ .join("tests")
38
+ .join("fixtures")
39
+ .join("trycatch_runtime_errors.tish");
40
+ assert!(fixture.is_file(), "missing fixture {}", fixture.display());
41
+ let fixture = fixture.to_str().unwrap();
42
+
43
+ assert_eq!(run("vm", fixture), EXPECTED, "vm output mismatch");
44
+ assert_eq!(run("interp", fixture), EXPECTED, "interp output mismatch");
45
+ }
@@ -0,0 +1,43 @@
1
+ //! Issue #101: the `tish:tty` capability (raw mode, terminal size, key/resize events) is
2
+ //! available on every backend behind the `tty` feature. CI has no real terminal, so this
3
+ //! asserts the module loads and degrades gracefully (size → null, isTTY → a boolean, the
4
+ //! event/raw-mode primitives are functions). Interactive behavior is covered manually.
5
+
6
+ use std::path::PathBuf;
7
+ use std::process::Command;
8
+
9
+ const EXPECTED: &str = "\
10
+ isTTY: boolean
11
+ size: null
12
+ setRawMode: function
13
+ read: function
14
+ readLine: function
15
+ alt: function function
16
+ ";
17
+
18
+ fn run(backend: &str, fixture: &str) -> String {
19
+ let tish = PathBuf::from(env!("CARGO_BIN_EXE_tish"));
20
+ let out = Command::new(&tish)
21
+ .args(["run", "--backend", backend, "--feature", "tty", fixture])
22
+ .output()
23
+ .expect("spawn tish run");
24
+ assert!(
25
+ out.status.success(),
26
+ "tish run --backend {backend} failed: {}",
27
+ String::from_utf8_lossy(&out.stderr)
28
+ );
29
+ String::from_utf8_lossy(&out.stdout).into_owned()
30
+ }
31
+
32
+ #[test]
33
+ fn tty_module_loads_and_degrades_without_a_terminal() {
34
+ let fixture = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
35
+ .join("tests")
36
+ .join("fixtures")
37
+ .join("tty_capability.tish");
38
+ assert!(fixture.is_file(), "missing fixture {}", fixture.display());
39
+ let fixture = fixture.to_str().unwrap();
40
+
41
+ assert_eq!(run("vm", fixture), EXPECTED, "vm output mismatch");
42
+ assert_eq!(run("interp", fixture), EXPECTED, "interp output mismatch");
43
+ }
@@ -0,0 +1,9 @@
1
+ [package]
2
+ name = "tishlang_ast"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ description = "Tish AST types and span info"
6
+
7
+ license-file = { workspace = true }
8
+ repository = { workspace = true }
9
+ [dependencies]