tsonic 0.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 (77) hide show
  1. package/dist/cli/constants.d.ts +5 -0
  2. package/dist/cli/constants.d.ts.map +1 -0
  3. package/dist/cli/constants.js +5 -0
  4. package/dist/cli/constants.js.map +1 -0
  5. package/dist/cli/dispatcher.d.ts +8 -0
  6. package/dist/cli/dispatcher.d.ts.map +1 -0
  7. package/dist/cli/dispatcher.js +98 -0
  8. package/dist/cli/dispatcher.js.map +1 -0
  9. package/dist/cli/help.d.ts +8 -0
  10. package/dist/cli/help.d.ts.map +1 -0
  11. package/dist/cli/help.js +48 -0
  12. package/dist/cli/help.js.map +1 -0
  13. package/dist/cli/index.d.ts +8 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +8 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/parser.d.ts +14 -0
  18. package/dist/cli/parser.d.ts.map +1 -0
  19. package/dist/cli/parser.js +94 -0
  20. package/dist/cli/parser.js.map +1 -0
  21. package/dist/cli/parser.test.d.ts +5 -0
  22. package/dist/cli/parser.test.d.ts.map +1 -0
  23. package/dist/cli/parser.test.js +221 -0
  24. package/dist/cli/parser.test.js.map +1 -0
  25. package/dist/cli.d.ts +6 -0
  26. package/dist/cli.d.ts.map +1 -0
  27. package/dist/cli.js +6 -0
  28. package/dist/cli.js.map +1 -0
  29. package/dist/commands/build.d.ts +11 -0
  30. package/dist/commands/build.d.ts.map +1 -0
  31. package/dist/commands/build.js +99 -0
  32. package/dist/commands/build.js.map +1 -0
  33. package/dist/commands/emit.d.ts +12 -0
  34. package/dist/commands/emit.d.ts.map +1 -0
  35. package/dist/commands/emit.js +170 -0
  36. package/dist/commands/emit.js.map +1 -0
  37. package/dist/commands/init.d.ts +14 -0
  38. package/dist/commands/init.d.ts.map +1 -0
  39. package/dist/commands/init.js +217 -0
  40. package/dist/commands/init.js.map +1 -0
  41. package/dist/commands/run.d.ts +11 -0
  42. package/dist/commands/run.d.ts.map +1 -0
  43. package/dist/commands/run.js +40 -0
  44. package/dist/commands/run.js.map +1 -0
  45. package/dist/config.d.ts +17 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +84 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/config.test.d.ts +5 -0
  50. package/dist/config.test.d.ts.map +1 -0
  51. package/dist/config.test.js +274 -0
  52. package/dist/config.test.js.map +1 -0
  53. package/dist/index.d.ts +8 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +20 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/types.d.ts +74 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +5 -0
  60. package/dist/types.js.map +1 -0
  61. package/package.json +38 -0
  62. package/src/cli/constants.ts +5 -0
  63. package/src/cli/dispatcher.ts +115 -0
  64. package/src/cli/help.ts +49 -0
  65. package/src/cli/index.ts +8 -0
  66. package/src/cli/parser.test.ts +259 -0
  67. package/src/cli/parser.ts +109 -0
  68. package/src/cli.ts +6 -0
  69. package/src/commands/build.ts +125 -0
  70. package/src/commands/emit.ts +222 -0
  71. package/src/commands/init.ts +272 -0
  72. package/src/commands/run.ts +51 -0
  73. package/src/config.test.ts +328 -0
  74. package/src/config.ts +105 -0
  75. package/src/index.ts +23 -0
  76. package/src/types.ts +74 -0
  77. package/tsconfig.json +18 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * tsonic build command - Build executable
3
+ */
4
+ import { spawnSync } from "node:child_process";
5
+ import { join, relative } from "node:path";
6
+ import { copyFileSync, chmodSync, existsSync } from "node:fs";
7
+ import { emitCommand } from "./emit.js";
8
+ /**
9
+ * Build native executable
10
+ */
11
+ export const buildCommand = (config) => {
12
+ const { outputDirectory, outputName, rid, quiet, verbose } = config;
13
+ // Step 1: Emit C# code
14
+ if (!quiet) {
15
+ console.log("Step 1/3: Generating C# code...");
16
+ }
17
+ const emitResult = emitCommand(config);
18
+ if (!emitResult.ok) {
19
+ return emitResult;
20
+ }
21
+ const generatedDir = emitResult.value.outputDir;
22
+ const csprojPath = join(generatedDir, "tsonic.csproj");
23
+ if (!existsSync(csprojPath)) {
24
+ return {
25
+ ok: false,
26
+ error: `No tsonic.csproj found in ${outputDirectory}/. This should have been created by emit.`,
27
+ };
28
+ }
29
+ // Step 2: Run dotnet publish
30
+ if (!quiet) {
31
+ console.log("Step 2/3: Compiling with dotnet publish...");
32
+ }
33
+ const publishArgs = [
34
+ "publish",
35
+ "tsonic.csproj",
36
+ "-c",
37
+ "Release",
38
+ "-r",
39
+ rid,
40
+ "--nologo",
41
+ ];
42
+ if (quiet) {
43
+ publishArgs.push("--verbosity", "quiet");
44
+ }
45
+ else if (verbose) {
46
+ publishArgs.push("--verbosity", "detailed");
47
+ }
48
+ else {
49
+ publishArgs.push("--verbosity", "minimal");
50
+ }
51
+ const publishResult = spawnSync("dotnet", publishArgs, {
52
+ cwd: generatedDir,
53
+ stdio: verbose ? "inherit" : "pipe",
54
+ encoding: "utf-8",
55
+ });
56
+ if (publishResult.status !== 0) {
57
+ const errorMsg = publishResult.stderr || publishResult.stdout || "Unknown error";
58
+ return {
59
+ ok: false,
60
+ error: `dotnet publish failed:\n${errorMsg}`,
61
+ };
62
+ }
63
+ // Step 3: Copy output binary
64
+ if (!quiet) {
65
+ console.log("Step 3/3: Copying output binary...");
66
+ }
67
+ const binaryName = process.platform === "win32" ? `${outputName}.exe` : outputName;
68
+ const publishDir = join(generatedDir, "bin", "Release", config.dotnetVersion, rid, "publish");
69
+ const sourceBinary = join(publishDir, binaryName);
70
+ const targetBinary = join(process.cwd(), binaryName);
71
+ if (!existsSync(sourceBinary)) {
72
+ return {
73
+ ok: false,
74
+ error: `Built binary not found at ${sourceBinary}`,
75
+ };
76
+ }
77
+ try {
78
+ copyFileSync(sourceBinary, targetBinary);
79
+ // Make executable on Unix
80
+ if (process.platform !== "win32") {
81
+ chmodSync(targetBinary, 0o755);
82
+ }
83
+ if (!quiet) {
84
+ const relativePath = relative(process.cwd(), targetBinary);
85
+ console.log(`\n✓ Build complete: ${relativePath}`);
86
+ }
87
+ return {
88
+ ok: true,
89
+ value: { outputPath: targetBinary },
90
+ };
91
+ }
92
+ catch (error) {
93
+ return {
94
+ ok: false,
95
+ error: `Failed to copy binary: ${error instanceof Error ? error.message : String(error)}`,
96
+ };
97
+ }
98
+ };
99
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * tsonic emit command - Generate C# code only
3
+ */
4
+ import type { ResolvedConfig, Result } from "../types.js";
5
+ /**
6
+ * Emit C# code from TypeScript
7
+ */
8
+ export declare const emitCommand: (config: ResolvedConfig) => Result<{
9
+ filesGenerated: number;
10
+ outputDir: string;
11
+ }, string>;
12
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/commands/emit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAwC1D;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,cAAc,KACrB,MAAM,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CA8J9D,CAAC"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * tsonic emit command - Generate C# code only
3
+ */
4
+ import { mkdirSync, writeFileSync, existsSync } from "node:fs";
5
+ import { join, dirname, relative, resolve } from "node:path";
6
+ import { compile, buildIr, } from "@tsonic/frontend";
7
+ import { emitCSharpFiles } from "@tsonic/emitter";
8
+ import { generateCsproj, generateProgramCs, } from "@tsonic/backend";
9
+ /**
10
+ * Extract entry point information from IR module
11
+ */
12
+ const extractEntryInfo = (entryModule) => {
13
+ // Look for exported 'main' function
14
+ for (const exp of entryModule.exports) {
15
+ if (exp.kind === "declaration") {
16
+ const decl = exp.declaration;
17
+ if (decl.kind === "functionDeclaration" && decl.name === "main") {
18
+ return {
19
+ namespace: entryModule.namespace,
20
+ className: entryModule.className,
21
+ methodName: "main",
22
+ isAsync: decl.isAsync,
23
+ needsProgram: true,
24
+ };
25
+ }
26
+ }
27
+ else if (exp.kind === "named" && exp.name === "main") {
28
+ // Named export of 'main'
29
+ // Look in body for the function declaration
30
+ for (const stmt of entryModule.body) {
31
+ if (stmt.kind === "functionDeclaration" && stmt.name === "main") {
32
+ return {
33
+ namespace: entryModule.namespace,
34
+ className: entryModule.className,
35
+ methodName: "main",
36
+ isAsync: stmt.isAsync,
37
+ needsProgram: true,
38
+ };
39
+ }
40
+ }
41
+ }
42
+ }
43
+ // No main function found
44
+ return null;
45
+ };
46
+ /**
47
+ * Emit C# code from TypeScript
48
+ */
49
+ export const emitCommand = (config) => {
50
+ const { entryPoint, outputDirectory, rootNamespace, sourceRoot, packages, typeRoots, } = config;
51
+ if (!config.quiet) {
52
+ console.log(`Emitting C# code for ${entryPoint}...`);
53
+ }
54
+ try {
55
+ // Parse TypeScript
56
+ const compileResult = compile([entryPoint], {
57
+ sourceRoot,
58
+ rootNamespace,
59
+ typeRoots,
60
+ });
61
+ if (!compileResult.ok) {
62
+ return {
63
+ ok: false,
64
+ error: `TypeScript compilation failed:\n${compileResult.error.diagnostics.map((d) => d.message).join("\n")}`,
65
+ };
66
+ }
67
+ // Build IR
68
+ const irResult = buildIr(compileResult.value.program, {
69
+ sourceRoot,
70
+ rootNamespace,
71
+ });
72
+ if (!irResult.ok) {
73
+ return {
74
+ ok: false,
75
+ error: `IR build failed:\n${irResult.error.map((d) => d.message).join("\n")}`,
76
+ };
77
+ }
78
+ // Emit C# code
79
+ const absoluteEntryPoint = resolve(entryPoint);
80
+ const csFiles = emitCSharpFiles(irResult.value, {
81
+ rootNamespace,
82
+ entryPointPath: absoluteEntryPoint,
83
+ });
84
+ // Create output directory
85
+ const outputDir = join(process.cwd(), outputDirectory);
86
+ mkdirSync(outputDir, { recursive: true });
87
+ // Write C# files preserving directory structure
88
+ for (const [modulePath, csCode] of csFiles) {
89
+ // Convert module path to C# file path
90
+ // src/models/User.ts → generated/src/models/User.cs
91
+ const csPath = modulePath.replace(/\.ts$/, ".cs");
92
+ const fullPath = join(outputDir, csPath);
93
+ mkdirSync(dirname(fullPath), { recursive: true });
94
+ writeFileSync(fullPath, csCode, "utf-8");
95
+ if (config.verbose) {
96
+ const relPath = relative(process.cwd(), fullPath);
97
+ console.log(` Generated: ${relPath}`);
98
+ }
99
+ }
100
+ // Generate Program.cs entry point wrapper
101
+ const entryModule = irResult.value.find((m) => resolve(m.filePath) === absoluteEntryPoint);
102
+ if (entryModule) {
103
+ const entryInfo = extractEntryInfo(entryModule);
104
+ if (entryInfo) {
105
+ const programCs = generateProgramCs(entryInfo);
106
+ const programPath = join(outputDir, "Program.cs");
107
+ writeFileSync(programPath, programCs, "utf-8");
108
+ if (config.verbose) {
109
+ console.log(` Generated: ${relative(process.cwd(), programPath)}`);
110
+ }
111
+ }
112
+ }
113
+ // Generate or preserve tsonic.csproj
114
+ const csprojPath = join(outputDir, "tsonic.csproj");
115
+ if (!existsSync(csprojPath)) {
116
+ // Find Tsonic.Runtime.csproj path - try multiple locations
117
+ let runtimePath;
118
+ // 1. Try monorepo structure (development)
119
+ const monorepoPath = resolve(join(import.meta.dirname, "../../../runtime/src/Tsonic.Runtime.csproj"));
120
+ if (existsSync(monorepoPath)) {
121
+ runtimePath = monorepoPath;
122
+ }
123
+ else {
124
+ // 2. Try installed package structure
125
+ const installedPath = resolve(join(import.meta.dirname, "../../../../@tsonic/runtime/src/Tsonic.Runtime.csproj"));
126
+ if (existsSync(installedPath)) {
127
+ runtimePath = installedPath;
128
+ }
129
+ }
130
+ // Warn if no runtime found
131
+ if (!runtimePath && !config.quiet) {
132
+ console.warn("Warning: Tsonic.Runtime.csproj not found. You may need to add a reference manually.");
133
+ }
134
+ const csproj = generateCsproj({
135
+ rootNamespace,
136
+ outputName: config.outputName,
137
+ dotnetVersion: config.dotnetVersion,
138
+ runtimePath,
139
+ packages,
140
+ invariantGlobalization: config.invariantGlobalization,
141
+ stripSymbols: config.stripSymbols,
142
+ optimizationPreference: config.optimize === "size" ? "Size" : "Speed",
143
+ });
144
+ writeFileSync(csprojPath, csproj, "utf-8");
145
+ if (config.verbose) {
146
+ console.log(` Generated: ${relative(process.cwd(), csprojPath)}`);
147
+ }
148
+ }
149
+ else if (config.verbose) {
150
+ console.log(` Preserved: ${relative(process.cwd(), csprojPath)} (user edits kept)`);
151
+ }
152
+ if (!config.quiet) {
153
+ console.log(`\n✓ Generated ${csFiles.size} C# files in ${outputDirectory}/`);
154
+ }
155
+ return {
156
+ ok: true,
157
+ value: {
158
+ filesGenerated: csFiles.size,
159
+ outputDir,
160
+ },
161
+ };
162
+ }
163
+ catch (error) {
164
+ return {
165
+ ok: false,
166
+ error: `Emit failed: ${error instanceof Error ? error.message : String(error)}`,
167
+ };
168
+ }
169
+ };
170
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/commands/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * tsonic project init command
3
+ */
4
+ import type { Result } from "../types.js";
5
+ type InitOptions = {
6
+ readonly skipTypes?: boolean;
7
+ readonly typesVersion?: string;
8
+ };
9
+ /**
10
+ * Initialize a new Tsonic project
11
+ */
12
+ export declare const initProject: (cwd: string, options?: InitOptions) => Result<void, string>;
13
+ export {};
14
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAmKF;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,KAAK,MAAM,EACX,UAAS,WAAgB,KACxB,MAAM,CAAC,IAAI,EAAE,MAAM,CA0FrB,CAAC"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * tsonic project init command
3
+ */
4
+ import { writeFileSync, existsSync, readFileSync, mkdirSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { spawnSync } from "node:child_process";
7
+ const DEFAULT_GITIGNORE = `# .NET build artifacts
8
+ generated/bin/
9
+ generated/obj/
10
+
11
+ # Optional: Uncomment to ignore generated C# files
12
+ # generated/**/*.cs
13
+
14
+ # Output executables
15
+ *.exe
16
+ app
17
+
18
+ # Dependencies
19
+ node_modules/
20
+ `;
21
+ const SAMPLE_MAIN_TS = `import { Console } from "System";
22
+ import { File } from "System.IO";
23
+
24
+ export function main(): void {
25
+ Console.WriteLine("Reading README.md...");
26
+ const content = File.ReadAllText("./README.md");
27
+ Console.WriteLine(content);
28
+ }
29
+ `;
30
+ const SAMPLE_README = `# My Tsonic Project
31
+
32
+ This is a sample Tsonic project that demonstrates .NET interop.
33
+
34
+ ## Getting Started
35
+
36
+ Build and run the project:
37
+
38
+ \`\`\`bash
39
+ npm run build
40
+ ./app
41
+ \`\`\`
42
+
43
+ Or run directly:
44
+
45
+ \`\`\`bash
46
+ npm run dev
47
+ \`\`\`
48
+
49
+ ## Project Structure
50
+
51
+ - \`src/main.ts\` - Entry point
52
+ - \`tsonic.json\` - Project configuration
53
+ - \`generated/\` - Generated C# code (gitignored)
54
+ `;
55
+ /**
56
+ * Generate tsonic.json config
57
+ */
58
+ const generateConfig = (includeTypeRoots) => {
59
+ const config = {
60
+ $schema: "https://tsonic.dev/schema/v1.json",
61
+ rootNamespace: "MyApp",
62
+ entryPoint: "src/main.ts",
63
+ sourceRoot: "src",
64
+ outputDirectory: "generated",
65
+ outputName: "app",
66
+ optimize: "speed",
67
+ packages: [],
68
+ buildOptions: {
69
+ stripSymbols: true,
70
+ invariantGlobalization: true,
71
+ },
72
+ };
73
+ if (includeTypeRoots) {
74
+ config.dotnet = {
75
+ typeRoots: ["node_modules/@tsonic/dotnet-types/types"],
76
+ };
77
+ }
78
+ return JSON.stringify(config, null, 2) + "\n";
79
+ };
80
+ /**
81
+ * Create or update package.json with scripts and metadata
82
+ */
83
+ const createOrUpdatePackageJson = (packageJsonPath) => {
84
+ let packageJson;
85
+ if (existsSync(packageJsonPath)) {
86
+ // Merge with existing package.json
87
+ const existing = readFileSync(packageJsonPath, "utf-8");
88
+ packageJson = JSON.parse(existing);
89
+ // Ensure required fields exist
90
+ if (!packageJson.name) {
91
+ packageJson.name = "my-tsonic-app";
92
+ }
93
+ if (!packageJson.version) {
94
+ packageJson.version = "1.0.0";
95
+ }
96
+ if (!packageJson.type) {
97
+ packageJson.type = "module";
98
+ }
99
+ // Merge scripts
100
+ const existingScripts = packageJson.scripts || {};
101
+ packageJson.scripts = {
102
+ ...existingScripts,
103
+ build: "tsonic build src/main.ts",
104
+ dev: "tsonic run src/main.ts",
105
+ };
106
+ // Ensure devDependencies exists
107
+ if (!packageJson.devDependencies) {
108
+ packageJson.devDependencies = {};
109
+ }
110
+ }
111
+ else {
112
+ // Create new package.json
113
+ packageJson = {
114
+ name: "my-tsonic-app",
115
+ version: "1.0.0",
116
+ type: "module",
117
+ scripts: {
118
+ build: "tsonic build src/main.ts",
119
+ dev: "tsonic run src/main.ts",
120
+ },
121
+ devDependencies: {},
122
+ };
123
+ }
124
+ writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8");
125
+ };
126
+ /**
127
+ * Install npm package
128
+ */
129
+ const installPackage = (packageName, version) => {
130
+ const result = spawnSync("npm", ["install", "--save-dev", `${packageName}@${version}`], {
131
+ stdio: "inherit",
132
+ encoding: "utf-8",
133
+ });
134
+ if (result.status !== 0) {
135
+ return {
136
+ ok: false,
137
+ error: `Failed to install ${packageName}@${version}`,
138
+ };
139
+ }
140
+ return { ok: true, value: undefined };
141
+ };
142
+ /**
143
+ * Initialize a new Tsonic project
144
+ */
145
+ export const initProject = (cwd, options = {}) => {
146
+ const tsonicJsonPath = join(cwd, "tsonic.json");
147
+ const gitignorePath = join(cwd, ".gitignore");
148
+ const srcDir = join(cwd, "src");
149
+ const mainTsPath = join(srcDir, "main.ts");
150
+ const readmePath = join(cwd, "README.md");
151
+ const packageJsonPath = join(cwd, "package.json");
152
+ // Check if tsonic.json already exists
153
+ if (existsSync(tsonicJsonPath)) {
154
+ return {
155
+ ok: false,
156
+ error: "tsonic.json already exists. Project is already initialized.",
157
+ };
158
+ }
159
+ try {
160
+ // Create or update package.json FIRST (before npm install)
161
+ const packageJsonExists = existsSync(packageJsonPath);
162
+ createOrUpdatePackageJson(packageJsonPath);
163
+ console.log(packageJsonExists ? "✓ Updated package.json" : "✓ Created package.json");
164
+ // Install .NET type declarations
165
+ const shouldInstallTypes = !options.skipTypes;
166
+ const typesVersion = options.typesVersion ?? "10.0.0";
167
+ if (shouldInstallTypes) {
168
+ console.log(`Installing .NET type declarations (@tsonic/dotnet-types@${typesVersion})...`);
169
+ const installResult = installPackage("@tsonic/dotnet-types", typesVersion);
170
+ if (!installResult.ok) {
171
+ return installResult;
172
+ }
173
+ console.log("✓ Installed @tsonic/dotnet-types");
174
+ }
175
+ // Create tsonic.json
176
+ const config = generateConfig(shouldInstallTypes);
177
+ writeFileSync(tsonicJsonPath, config, "utf-8");
178
+ console.log("✓ Created tsonic.json");
179
+ // Create or append to .gitignore
180
+ if (existsSync(gitignorePath)) {
181
+ const existing = readFileSync(gitignorePath, "utf-8");
182
+ if (!existing.includes("generated/")) {
183
+ writeFileSync(gitignorePath, existing + "\n" + DEFAULT_GITIGNORE, "utf-8");
184
+ console.log("✓ Updated .gitignore");
185
+ }
186
+ }
187
+ else {
188
+ writeFileSync(gitignorePath, DEFAULT_GITIGNORE, "utf-8");
189
+ console.log("✓ Created .gitignore");
190
+ }
191
+ // Create src directory and main.ts
192
+ if (!existsSync(srcDir)) {
193
+ mkdirSync(srcDir, { recursive: true });
194
+ }
195
+ if (!existsSync(mainTsPath)) {
196
+ writeFileSync(mainTsPath, SAMPLE_MAIN_TS, "utf-8");
197
+ console.log("✓ Created src/main.ts");
198
+ }
199
+ // Create README.md
200
+ if (!existsSync(readmePath)) {
201
+ writeFileSync(readmePath, SAMPLE_README, "utf-8");
202
+ console.log("✓ Created README.md");
203
+ }
204
+ console.log("\n✓ Project initialized successfully!");
205
+ console.log("\nNext steps:");
206
+ console.log(" npm run build # Build executable");
207
+ console.log(" npm run dev # Run directly");
208
+ return { ok: true, value: undefined };
209
+ }
210
+ catch (error) {
211
+ return {
212
+ ok: false,
213
+ error: `Failed to initialize project: ${error instanceof Error ? error.message : String(error)}`,
214
+ };
215
+ }
216
+ };
217
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * tsonic run command - Build and execute
3
+ */
4
+ import type { ResolvedConfig, Result } from "../types.js";
5
+ /**
6
+ * Build and run the executable
7
+ */
8
+ export declare const runCommand: (config: ResolvedConfig, programArgs?: string[]) => Result<{
9
+ exitCode: number;
10
+ }, string>;
11
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1D;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,QAAQ,cAAc,EACtB,cAAa,MAAM,EAAO,KACzB,MAAM,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CAoCrC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * tsonic run command - Build and execute
3
+ */
4
+ import { spawnSync } from "node:child_process";
5
+ import { buildCommand } from "./build.js";
6
+ /**
7
+ * Build and run the executable
8
+ */
9
+ export const runCommand = (config, programArgs = []) => {
10
+ // Build the executable
11
+ const buildResult = buildCommand(config);
12
+ if (!buildResult.ok) {
13
+ return buildResult;
14
+ }
15
+ const { outputPath } = buildResult.value;
16
+ if (!config.quiet) {
17
+ console.log(`\nRunning ${outputPath}...`);
18
+ console.log("─".repeat(50));
19
+ }
20
+ // Execute the binary
21
+ const runResult = spawnSync(outputPath, programArgs, {
22
+ stdio: "inherit",
23
+ encoding: "utf-8",
24
+ });
25
+ if (runResult.error) {
26
+ return {
27
+ ok: false,
28
+ error: `Failed to run executable: ${runResult.error.message}`,
29
+ };
30
+ }
31
+ if (!config.quiet) {
32
+ console.log("─".repeat(50));
33
+ console.log(`\nProcess exited with code ${runResult.status ?? 0}`);
34
+ }
35
+ return {
36
+ ok: true,
37
+ value: { exitCode: runResult.status ?? 0 },
38
+ };
39
+ };
40
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAsB,EACtB,cAAwB,EAAE,EACY,EAAE;IACxC,uBAAuB;IACvB,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC;IAEzC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE;QACnD,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,6BAA6B,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,8BAA8B,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;KAC3C,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configuration loading and validation
3
+ */
4
+ import type { TsonicConfig, CliOptions, ResolvedConfig, Result } from "./types.js";
5
+ /**
6
+ * Load tsonic.json from a directory
7
+ */
8
+ export declare const loadConfig: (configPath: string) => Result<TsonicConfig, string>;
9
+ /**
10
+ * Find tsonic.json by walking up the directory tree
11
+ */
12
+ export declare const findConfig: (startDir: string) => string | null;
13
+ /**
14
+ * Resolve final configuration from file + CLI args
15
+ */
16
+ export declare const resolveConfig: (config: TsonicConfig, cliOptions: CliOptions, entryFile?: string) => ResolvedConfig;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,MAAM,EACP,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,YAAY,MAAM,KACjB,MAAM,CAAC,YAAY,EAAE,MAAM,CA2B7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,KAAG,MAAM,GAAG,IAiBtD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,YAAY,EACpB,YAAY,UAAU,EACtB,YAAY,MAAM,KACjB,cA2BF,CAAC"}