@gasm-compiler/cli 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -1,172 +1,126 @@
1
- # Gasm Compiler CLI
1
+ # @gasm-compiler/cli
2
2
 
3
- A Deno-based command-line tool for compiling AssemblyScript to WGSL using the Gasm compiler.
3
+ **Command-line compiler for WebAssembly WGSL**
4
4
 
5
- ## Overview
5
+ Compile WebAssembly (`.wasm`) or AssemblyScript (`.as`/`.ts`) files to WGSL compute shaders from the command line. Built on top of [`@gasm-compiler/core`](https://www.npmjs.com/package/@gasm-compiler/core).
6
6
 
7
- This CLI tool provides an easy way to:
8
-
9
- 1. **Write AssemblyScript** code (a TypeScript-like subset of WebAssembly)
10
- 2. **Compile to WebAssembly** using the AssemblyScript compiler
11
- 3. **Transform to WGSL** using the Gasm Compiler Gasm compiler
12
- 4. **Execute on GPU** using WebGPU
13
-
14
- ## Quick Start
15
-
16
- ### Prerequisites
17
-
18
- - [Deno](https://deno.com) installed
19
- - AssemblyScript installed (or use `npm` within the examples folder)
7
+ ---
20
8
 
21
- ### Usage
9
+ ## Installation
22
10
 
23
11
  ```bash
24
- # Compile AssemblyScript to WASM, then to WGSL
25
- deno run --allow-all src/cli.ts compile examples/demo.as --output output.wgsl
26
-
27
- # View help
28
- deno run --allow-all src/cli.ts --help
29
-
30
- # Show detailed compiler output
31
- deno run --allow-all src/cli.ts compile examples/demo.as --verbose
12
+ npm install -g @gasm-compiler/cli
32
13
  ```
33
14
 
34
- ## Project Structure
15
+ Or use without installing:
35
16
 
17
+ ```bash
18
+ npx @gasm-compiler/cli compile shader.wasm -o shader.wgsl
36
19
  ```
37
- packages/cli/
38
- ├── src/
39
- │ ├── cli.ts # Main CLI entry point
40
- │ ├── compiler.ts # Compilation orchestration
41
- │ └── utils.ts # Utility functions
42
- ├── examples/
43
- │ ├── package.json # AssemblyScript dependencies
44
- │ ├── demo.as # Sample AssemblyScript program
45
- │ └── asconfig.json # AssemblyScript compiler config
46
- ├── deno.json # Deno configuration
47
- ├── package.json # NPM package metadata
48
- └── README.md # This file
49
- ```
50
-
51
- ## Example AssemblyScript Programs
52
-
53
- ### Simple Arithmetic
54
20
 
55
- The `examples/demo.ts` file contains a basic example showing:
56
- - Function definitions
57
- - Integer arithmetic
58
- - Memory operations
59
- - Control flow
60
-
61
- ### WASM vs WGSL Execution Comparison
21
+ ---
62
22
 
63
- The **`examples/simple_math.ts`** and **`examples/compare.ts`** demonstrate 1:1 parity verification:
23
+ ## Quick Start
64
24
 
65
25
  ```bash
66
- # 1. Compile AssemblyScript to WASM
67
- cd examples && npx asc simple_math.ts -o simple_math.wasm
68
-
69
- # 2. Run comparison (executes WASM natively and compiles to WGSL)
70
- cd ../.. && deno run --allow-all --unstable-webgpu packages/cli/examples/compare.ts packages/cli/examples/simple_math.wasm
71
- ```
72
-
73
- This validates that:
74
- - ✅ WASM functions produce expected results
75
- - ✅ WGSL code compiles successfully
76
- - ✅ Compilation preserves semantics
26
+ # Compile a .wasm file to WGSL
27
+ gasm-compiler compile shader.wasm --output shader.wgsl
77
28
 
78
- See **[COMPARISON_DEMO.md](examples/COMPARISON_DEMO.md)** for detailed documentation.
29
+ # Compile AssemblyScript to WGSL (compiles to Wasm first, then to WGSL)
30
+ gasm-compiler compile kernel.as --output kernel.wgsl
79
31
 
80
- ### Running Examples
32
+ # Print WGSL to stdout
33
+ gasm-compiler compile shader.wasm
81
34
 
82
- ```bash
83
- # Compile and view the WGSL output
84
- deno run --allow-all src/cli.ts compile examples/demo.as
85
-
86
- # Save to file
87
- deno run --allow-all src/cli.ts compile examples/demo.as --output output.wgsl
35
+ # Show verbose compilation steps
36
+ gasm-compiler compile shader.wasm --verbose
88
37
 
89
- # Verbose output with compilation steps
90
- deno run --allow-all src/cli.ts compile examples/demo.as --verbose
38
+ # View help
39
+ gasm-compiler --help
91
40
  ```
92
41
 
93
- ## How It Works
42
+ ---
94
43
 
95
- 1. **AssemblyScript Parsing**: Your `.as` file is compiled to WebAssembly using the official AssemblyScript compiler
96
- 2. **Gasm Validation**: The compiler validates that the Wasm conforms to the Gasm specification
97
- 3. **IR Generation**: An intermediate representation is built for analysis and transformation
98
- 4. **WGSL Code Generation**: The IR is transformed into WGSL shader code ready for WebGPU
44
+ ## Commands
99
45
 
100
- ## CLI Options
46
+ ### `compile <input>`
101
47
 
102
- - `compile <input>` - Compile AssemblyScript to WGSL
103
- - `--output <file>` - Write output to file (default: stdout)
104
- - `--verbose` - Show detailed compilation steps
105
- - `--keep-wasm` - Keep intermediate WASM files
106
- - `--optimize` - Apply optimization passes
48
+ Compiles a WebAssembly binary or AssemblyScript source to WGSL.
107
49
 
108
- ## Development
50
+ | Option | Description |
51
+ |--------|-------------|
52
+ | `--output <file>`, `-o` | Write WGSL output to a file (default: stdout) |
53
+ | `--verbose` | Show detailed compilation steps |
54
+ | `--keep-wasm` | Keep intermediate `.wasm` file when compiling from AssemblyScript |
55
+ | `--optimize` | Apply optimization passes |
109
56
 
110
- ### Building from Source
57
+ **Examples:**
111
58
 
112
59
  ```bash
113
- # No build step needed - Deno runs TypeScript directly
114
- deno run --allow-all src/cli.ts --version
115
- ```
116
-
117
- ### Running Tests
60
+ # Compile pre-built Wasm
61
+ gasm-compiler compile my_shader.wasm -o my_shader.wgsl
118
62
 
119
- The CLI uses the core compiler tests. To run all tests:
63
+ # Compile AssemblyScript with verbose output
64
+ gasm-compiler compile gpu_kernel.as --verbose -o output.wgsl
120
65
 
121
- ```bash
122
- cd ../core
123
- deno test --allow-all
66
+ # Pipe output into another tool
67
+ gasm-compiler compile shader.wasm | tee shader.wgsl
124
68
  ```
125
69
 
126
- ## Architecture
70
+ ---
127
71
 
128
- The CLI integrates with the Gasm Compiler Core compiler:
72
+ ## How It Works
129
73
 
130
74
  ```
131
- AssemblyScript (.as)
75
+ AssemblyScript (.as/.ts) WebAssembly (.wasm)
76
+ ↓ │
77
+ ASC Compiler │
78
+ ↓ │
79
+ WebAssembly Binary ←────────────────┘
132
80
 
133
- ASC Compiler
81
+ Gasm Compiler (parse, validate, transform)
134
82
 
135
- WebAssembly Binary (.wasm)
136
-
137
- Core Compiler (Gasm)
138
- ├─ Parser
139
- ├─ Validator
140
- ├─ IR Generator
141
- └─ Code Generator
142
-
143
- WGSL Code (.wgsl)
83
+ WGSL Compute Shader (.wgsl)
144
84
  ```
145
85
 
146
- ## Testing
147
- # Compiler tests (WASM WGSL compilation)
148
- deno test --allow-all tests/compiler_test.ts
86
+ 1. If the input is AssemblyScript, it is first compiled to WebAssembly using the AssemblyScript compiler
87
+ 2. The WebAssembly binary is validated against the Gasm specification (GPU-safe subset)
88
+ 3. The compiler transforms the Wasm into WGSL, restructuring control flow and lowering memory operations
89
+ 4. The output is a valid WGSL compute shader ready for use with WebGPU
149
90
 
150
- # CLI integration tests (command parsing, help, etc.)
151
- deno test --allow-all tests/cli_test.ts
91
+ ---
152
92
 
153
- # GPU execution tests (requires WebGPU support)
154
- deno test --allow-all --unstable-webgpu tests/execution_test.ts
93
+ ## Writing Gasm-Compatible WebAssembly
155
94
 
156
- ## Future Plans
95
+ Your WebAssembly module must conform to the Gasm subset:
157
96
 
158
- - [ ] Web-based REPL for interactive compilation
159
- - [ ] Inline WASM binary support
160
- - [ ] Multiple output formats (WGSL, IR, debug info)
161
- - [ ] Performance profiling and optimization suggestions
162
- - [ ] Integration with gpu.js or wgpu for execution
97
+ - Export a single linear memory as `"memory"`
98
+ - Only import globals from the `"gasm"` module (GPU built-ins like `global_invocation_id_x`)
99
+ - No function or memory imports
100
+ - Export your entry point function
163
101
 
164
- ## Related Documentation
102
+ **Example (WAT):**
103
+ ```wasm
104
+ (module
105
+ (import "gasm" "global_invocation_id_x" (global $gid_x i32))
106
+ (memory (export "memory") 1)
107
+ (func (export "main")
108
+ ;; Your GPU kernel logic here
109
+ ;; Use $gid_x for per-thread indexing
110
+ ))
111
+ ```
165
112
 
166
- - [Core Compiler Documentation](../core/README.md)
167
- - [Gasm Specification](../../spec/gasm-v0.1.md)
168
- - [AssemblyScript Handbook](https://www.assemblyscript.org/)
113
+ For the full list of available Gasm built-in globals and supported instructions, see the [`@gasm-compiler/core` documentation](https://www.npmjs.com/package/@gasm-compiler/core).
169
114
 
170
115
  ---
171
116
 
172
- **Status**: Early development | **Last Updated**: December 2025
117
+ ## Related Packages
118
+
119
+ - [`@gasm-compiler/core`](https://www.npmjs.com/package/@gasm-compiler/core) — Core compiler library (programmatic API)
120
+ - [`@gasm-compiler/math-reference`](https://www.npmjs.com/package/@gasm-compiler/math-reference) — CPU-side reference implementations of Gasm math functions
121
+
122
+ ---
123
+
124
+ ## License
125
+
126
+ See [LICENSE](./LICENSE) for details.
package/dist/cli.js CHANGED
@@ -306,4 +306,3 @@ main().catch((error) => {
306
306
  console.error("Fatal error:", error);
307
307
  Deno.exit(1);
308
308
  });
309
- //# sourceMappingURL=cli.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gasm-compiler/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "CLI for compiling WebAssembly/AssemblyScript to WGSL using Gasm Compiler",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",
@@ -17,6 +17,7 @@
17
17
  },
18
18
  "files": [
19
19
  "dist",
20
+ "!dist/**/*.map",
20
21
  "LICENSE",
21
22
  "README.md"
22
23
  ],
@@ -34,7 +35,7 @@
34
35
  "cli"
35
36
  ],
36
37
  "dependencies": {
37
- "@gasm-compiler/core": "0.1.0"
38
+ "@gasm-compiler/core": "0.1.1"
38
39
  },
39
40
  "devDependencies": {
40
41
  "assemblyscript": "v0.28.9",
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/compiler.ts"],"sourcesContent":["/**\n * Gasm Compiler CLI - Main Entry Point\n *\n * Provides a command-line interface for compiling AssemblyScript to WGSL\n * using the Gasm compiler.\n */\n\nimport { parseArgs } from \"jsr:@std/cli/parse-args\";\nimport { compileAssemblyScriptToWGSL } from \"./compiler.ts\";\n\nconst VERSION = \"0.1.0\";\n\ninterface CLIOptions {\n help?: boolean;\n version?: boolean;\n output?: string;\n \"wat-output\"?: string;\n verbose?: boolean;\n \"keep-wasm\"?: boolean;\n optimize?: boolean;\n \"deny-f64-demotion\"?: boolean;\n \"allow-i64-demotion\"?: boolean;\n \"warnings-as-errors\"?: boolean;\n \"source-mapping\"?: string;\n _: string[];\n}\n\nasync function main() {\n const args = parseArgs(Deno.args, {\n string: [\"output\", \"wat-output\", \"source-mapping\"],\n boolean: [\n \"help\",\n \"version\",\n \"verbose\",\n \"keep-wasm\",\n \"optimize\",\n \"deny-f64-demotion\",\n \"allow-i64-demotion\",\n \"warnings-as-errors\",\n ],\n default: {\n verbose: false,\n \"keep-wasm\": false,\n optimize: false,\n },\n }) as CLIOptions;\n\n // Handle --version\n if (args.version) {\n console.log(`Gasm Compiler CLI v${VERSION}`);\n Deno.exit(0);\n }\n\n // Handle --help or no command\n if (args.help || args._.length === 0) {\n printHelp();\n Deno.exit(args.help ? 0 : 1);\n }\n\n const command = args._[0];\n\n try {\n if (command === \"compile\") {\n if (args._.length < 2) {\n console.error(\"Error: compile requires an input file\");\n console.error(\"Usage: cli compile <input.as|wasm> [--output <output.wgsl>]\");\n Deno.exit(1);\n }\n\n const inputFile = args._[1] as string;\n const options = {\n output: args.output as string | undefined,\n watOutput: args[\"wat-output\"] as string | undefined,\n verbose: args.verbose as boolean,\n keepWasm: args[\"keep-wasm\"] as boolean,\n optimize: args.optimize as boolean,\n denyF64Demotion: args[\"deny-f64-demotion\"] as boolean,\n allowI64Demotion: args[\"allow-i64-demotion\"] as boolean,\n warningsAsErrors: args[\"warnings-as-errors\"] as boolean,\n sourceMapping: args[\"source-mapping\"] as string | undefined,\n };\n\n await compileAssemblyScriptToWGSL(inputFile, options);\n } else {\n console.error(`Unknown command: ${command}`);\n printHelp();\n Deno.exit(1);\n }\n } catch (error) {\n console.error(\"Error:\", error instanceof Error ? error.message : String(error));\n if (args.verbose && error instanceof Error && error.stack) {\n console.error(\"\\nStack trace:\");\n console.error(error.stack);\n }\n Deno.exit(1);\n }\n}\n\nfunction printHelp() {\n console.log(`\nGasm Compiler CLI v${VERSION}\nCompile WebAssembly or AssemblyScript to WGSL using the Gasm compiler\n\nUSAGE:\n gasm-compiler <COMMAND> [OPTIONS] [ARGS]\n\nCOMMANDS:\n compile <input.wasm|.as> Compile WebAssembly or AssemblyScript to WGSL\n help Show this help message\n version Show version information\n\nOPTIONS:\n --output <file> Write WGSL output to file (default: stdout)\n --wat-output <file> Also write WAT (WebAssembly Text) disassembly to file\n --verbose Show detailed compilation steps\n --keep-wasm Keep intermediate WASM files\n --optimize Apply optimization passes\n --deny-f64-demotion Fail if f64 would be demoted to f32\n --allow-i64-demotion Allow lossy i64→i32 demotion (mod 2^32)\n --warnings-as-errors Treat compiler warnings as errors\n --source-mapping <level> Add source mapping comments (none, minimal, normal, detailed, verbose)\n --help Show this help message\n --version Show version information\n\nEXAMPLES:\n # Compile WASM to stdout\n deno run --allow-all src/cli.ts compile input.wasm\n\n # Compile WASM to file\n deno run --allow-all src/cli.ts compile input.wasm --output output.wgsl\n\n # Compile with verbose output\n deno run --allow-all src/cli.ts compile input.wasm --verbose --output output.wgsl\n\n # Compile with optimization\n deno run --allow-all src/cli.ts compile input.wasm --optimize --output output.wgsl\n\nDOCUMENTATION:\n https://github.com/MartinEricsson/gasm-compiler\n `);\n}\n\n// Run main\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n Deno.exit(1);\n});\n","/**\n * Gasm Compiler CLI - Compilation Orchestration\n *\n * Handles the compilation pipeline:\n * AssemblyScript → WASM → Gasm Validation → IR → WGSL\n * \n * Note: This Deno-based CLI wrapper will be deprecated in favor of\n * the Node.js compiler exported from @gasm-compiler/core/compiler\n */\n\nimport { resolve } from \"jsr:@std/path\";\nimport { ensureFile } from \"jsr:@std/fs\";\nimport { \n compileWithDiagnostics, \n disassembleToWAT,\n parseWasmModule,\n isParseError,\n type CompileDiagnostics \n} from \"@gasm-compiler/core\";\n\nexport interface CompileOptions {\n output?: string;\n watOutput?: string;\n verbose?: boolean;\n keepWasm?: boolean;\n optimize?: boolean;\n denyF64Demotion?: boolean;\n allowI64Demotion?: boolean;\n warningsAsErrors?: boolean;\n sourceMapping?: string;\n}\n\nfunction printDiagnostics(diagnostics: CompileDiagnostics, verbose: boolean): void {\n for (const w of diagnostics.warnings) {\n const where = w.functionName ? ` (${w.functionName})` : \"\";\n console.error(`warning${where}: ${w.message}`);\n }\n\n if (verbose && diagnostics.demotions.length > 0) {\n const counts = new Map<string, number>();\n for (const d of diagnostics.demotions) {\n counts.set(d.kind, (counts.get(d.kind) ?? 0) + 1);\n }\n const parts = [...counts.entries()].map(([kind, count]) => `${kind} (${count})`);\n console.error(`demotions: ${parts.join(\", \")}`);\n }\n}\n\n/**\n * Compiles an AssemblyScript file to WGSL using the Gasm compiler.\n *\n * Pipeline:\n * 1. Validate input file exists\n * 2. Compile AssemblyScript to WASM using asc\n * 3. Read WASM binary\n * 4. Compile WASM to WGSL using Gasm\n * 5. Write output to file or stdout\n *\n * @param inputFile - Path to .as file\n * @param options - Compilation options\n */\nexport async function compileAssemblyScriptToWGSL(\n inputFile: string,\n options: CompileOptions = {},\n) {\n const {\n output: outputFile,\n watOutput: watOutputFile,\n verbose = false,\n keepWasm = false,\n optimize = false,\n denyF64Demotion = false,\n allowI64Demotion = false,\n warningsAsErrors = false,\n sourceMapping,\n } = options;\n\n try {\n // 1. Validate input file\n if (verbose) console.log(`[1/4] Validating input file: ${inputFile}`);\n\n const resolvedInput = resolve(inputFile);\n const stats = await Deno.stat(resolvedInput);\n\n if (!stats.isFile) {\n throw new Error(`Not a file: ${inputFile}`);\n }\n\n const isWasm = resolvedInput.endsWith(\".wasm\");\n\n if (!isWasm && !resolvedInput.endsWith(\".as\") && !resolvedInput.endsWith(\".ts\")) {\n console.warn(\"Warning: Input file does not have .as, .ts, or .wasm extension\");\n }\n\n let wasmPath = resolvedInput.replace(/\\.(as|ts)$/, \".wasm\");\n\n // 2. Compile AssemblyScript to WASM (if input is not already WASM)\n if (!isWasm) {\n if (verbose) console.log(\"[2/4] Compiling AssemblyScript to WASM...\");\n\n const asmPath = await getAssemblyScriptPath();\n\n // If input ends with .as, create a temporary .ts file for asc\n // (asc appends .ts to .as files, causing lookup failures)\n let inputForAsc = resolvedInput;\n let cleanupTsFile = false;\n\n if (resolvedInput.endsWith(\".as\")) {\n inputForAsc = resolvedInput.replace(/\\.as$/, \".ts\");\n cleanupTsFile = true;\n\n try {\n // Create a symlink from .as to .ts\n await Deno.symlink(resolvedInput, inputForAsc);\n } catch (e) {\n if (!(e instanceof Deno.errors.AlreadyExists)) {\n // If symlink fails for other reasons, copy the file instead\n const content = await Deno.readTextFile(resolvedInput);\n await Deno.writeTextFile(inputForAsc, content);\n }\n }\n }\n\n const compileCommand = new Deno.Command(asmPath, {\n args: [inputForAsc, \"-o\", wasmPath],\n stdout: \"piped\",\n stderr: \"piped\",\n });\n\n const compileProcess = compileCommand.spawn();\n const { success, stdout, stderr } = await compileProcess.output();\n\n // Clean up temporary .ts file if we created it\n if (cleanupTsFile) {\n try {\n await Deno.remove(inputForAsc);\n } catch {\n // Ignore cleanup errors\n }\n }\n\n if (!success) {\n const errorMsg = new TextDecoder().decode(stderr);\n throw new Error(`AssemblyScript compilation failed:\\n${errorMsg}`);\n }\n\n if (verbose) {\n const output = new TextDecoder().decode(stdout);\n if (output) console.log(output);\n }\n } else {\n if (verbose) console.log(\"[2/4] Input is WASM, skipping compilation...\");\n wasmPath = resolvedInput;\n }\n\n // 3. Read WASM binary and compile to WGSL\n if (verbose) console.log(\"[3/4] Reading WASM binary...\");\n\n const wasmBytes = await Deno.readFile(wasmPath);\n\n if (verbose) {\n console.log(` WASM size: ${wasmBytes.length} bytes`);\n console.log(\"[4/4] Compiling WASM to WGSL using Gasm...\");\n }\n\n const demotionPolicy: {\n f64?: \"allow\" | \"deny\";\n i64?: \"deny\" | \"allow-lossy\";\n } = {};\n if (denyF64Demotion) demotionPolicy.f64 = \"deny\";\n if (allowI64Demotion) demotionPolicy.i64 = \"allow-lossy\";\n\n // Parse source mapping level\n type SourceMappingLevel = \"none\" | \"minimal\" | \"normal\" | \"detailed\" | \"verbose\";\n const validLevels: SourceMappingLevel[] = [\"none\", \"minimal\", \"normal\", \"detailed\", \"verbose\"];\n let sourceMappingLevel: SourceMappingLevel | undefined;\n if (sourceMapping) {\n if (validLevels.includes(sourceMapping as SourceMappingLevel)) {\n sourceMappingLevel = sourceMapping as SourceMappingLevel;\n } else {\n console.warn(`Warning: Unknown source-mapping level \"${sourceMapping}\", using \"normal\"`);\n sourceMappingLevel = \"normal\";\n }\n }\n\n const result = compileWithDiagnostics(wasmBytes, {\n optimize,\n demotionPolicy,\n warningsAsErrors,\n sourceMapping: sourceMappingLevel,\n });\n\n printDiagnostics(result.diagnostics, verbose);\n\n if (!result.ok) {\n const first = result.diagnostics.errors[0];\n throw new Error(first?.message ?? \"Compilation failed\");\n }\n\n const wgslCode = result.wgsl;\n\n // 4. Generate WAT disassembly if requested\n if (watOutputFile) {\n if (verbose) console.log(\"[4a/4] Generating WAT disassembly...\");\n \n // Parse the WASM to get the module structure\n const parseResult = parseWasmModule(wasmBytes);\n \n // Check if parsing succeeded\n if (!isParseError(parseResult)) {\n const watCode = disassembleToWAT(parseResult);\n const resolvedWatOutput = resolve(watOutputFile);\n await ensureFile(resolvedWatOutput);\n await Deno.writeTextFile(resolvedWatOutput, watCode);\n \n if (verbose) {\n console.log(`✓ WAT disassembly written to: ${resolvedWatOutput}`);\n } else {\n console.log(`✓ WAT written to: ${watOutputFile}`);\n }\n } else {\n console.warn(`Warning: Failed to parse WASM for WAT disassembly: ${parseResult.message}`);\n }\n }\n\n // 5. Write WGSL output\n if (outputFile) {\n const resolvedOutput = resolve(outputFile);\n await ensureFile(resolvedOutput);\n await Deno.writeTextFile(resolvedOutput, wgslCode);\n\n if (verbose) {\n console.log(`✓ Successfully compiled to: ${resolvedOutput}`);\n } else {\n console.log(`✓ Compiled to: ${outputFile}`);\n }\n } else {\n console.log(wgslCode);\n }\n\n // Clean up intermediate WASM if not keeping (and we generated it)\n if (!keepWasm && !isWasm) {\n try {\n await Deno.remove(wasmPath);\n if (verbose) console.log(\" Cleaned up intermediate WASM file\");\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unknown error: ${String(error)}`);\n }\n}\n\n/**\n * Locates the AssemblyScript compiler executable\n * Tries multiple common paths\n */\nasync function getAssemblyScriptPath(): Promise<string> {\n // Get the directory of the current script for relative path resolution\n const scriptDir = new URL(\".\", import.meta.url).pathname;\n\n const possiblePaths = [\n // Relative to CLI package\n resolve(scriptDir, \"../../node_modules/.bin/asc\"),\n resolve(scriptDir, \"../../node_modules/.pnpm/assemblyscript@0.28.9/node_modules/assemblyscript/node_modules/.bin/asc\"),\n resolve(scriptDir, \"../node_modules/.bin/asc\"),\n resolve(scriptDir, \"../examples/node_modules/.bin/asc\"),\n \n // Relative to workspace root\n resolve(scriptDir, \"../../node_modules/.bin/asc\"),\n resolve(scriptDir, \"../../../node_modules/.bin/asc\"),\n \n // AssemblyScript toy example\n resolve(scriptDir, \"../../assemblyscript-toy/node_modules/.bin/asc\"),\n ];\n\n for (const path of possiblePaths) {\n try {\n const stat = await Deno.stat(path);\n if (stat.isFile) {\n return path;\n }\n } catch {\n // Path doesn't exist, try next\n }\n }\n\n // If not found, assume 'asc' is in PATH\n return \"asc\";\n}\n"],"mappings":"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","names":[]}