@tsonic/cli 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 (82) 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 +111 -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 +55 -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 +113 -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 +214 -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 +311 -0
  36. package/dist/commands/emit.js.map +1 -0
  37. package/dist/commands/init.d.ts +15 -0
  38. package/dist/commands/init.d.ts.map +1 -0
  39. package/dist/commands/init.js +270 -0
  40. package/dist/commands/init.js.map +1 -0
  41. package/dist/commands/pack.d.ts +11 -0
  42. package/dist/commands/pack.d.ts.map +1 -0
  43. package/dist/commands/pack.js +92 -0
  44. package/dist/commands/pack.js.map +1 -0
  45. package/dist/commands/run.d.ts +11 -0
  46. package/dist/commands/run.d.ts.map +1 -0
  47. package/dist/commands/run.js +40 -0
  48. package/dist/commands/run.js.map +1 -0
  49. package/dist/config.d.ts +17 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +160 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/config.test.d.ts +5 -0
  54. package/dist/config.test.d.ts.map +1 -0
  55. package/dist/config.test.js +283 -0
  56. package/dist/config.test.js.map +1 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +20 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/types.d.ts +111 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +5 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +38 -0
  66. package/src/cli/constants.ts +5 -0
  67. package/src/cli/dispatcher.ts +129 -0
  68. package/src/cli/help.ts +56 -0
  69. package/src/cli/index.ts +8 -0
  70. package/src/cli/parser.test.ts +259 -0
  71. package/src/cli/parser.ts +128 -0
  72. package/src/cli.ts +6 -0
  73. package/src/commands/build.ts +264 -0
  74. package/src/commands/emit.ts +406 -0
  75. package/src/commands/init.ts +334 -0
  76. package/src/commands/pack.ts +114 -0
  77. package/src/commands/run.ts +51 -0
  78. package/src/config.test.ts +337 -0
  79. package/src/config.ts +205 -0
  80. package/src/index.ts +23 -0
  81. package/src/types.ts +121 -0
  82. package/tsconfig.json +18 -0
@@ -0,0 +1,270 @@
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_JS = `export function main(): void {
22
+ console.log("Hello from Tsonic!");
23
+
24
+ const numbers = [1, 2, 3, 4, 5];
25
+ const doubled = numbers.map((n) => n * 2);
26
+ console.log("Doubled:", doubled.join(", "));
27
+ }
28
+ `;
29
+ const SAMPLE_MAIN_TS_DOTNET = `import { Console } from "@tsonic/dotnet/System";
30
+ import { File } from "@tsonic/dotnet/System.IO";
31
+
32
+ export function main(): void {
33
+ Console.WriteLine("Reading README.md...");
34
+ const content = File.ReadAllText("./README.md");
35
+ Console.WriteLine(content);
36
+ }
37
+ `;
38
+ const SAMPLE_README = `# My Tsonic Project
39
+
40
+ This is a sample Tsonic project that demonstrates .NET interop.
41
+
42
+ ## Getting Started
43
+
44
+ Build and run the project:
45
+
46
+ \`\`\`bash
47
+ npm run build
48
+ ./app
49
+ \`\`\`
50
+
51
+ Or run directly:
52
+
53
+ \`\`\`bash
54
+ npm run dev
55
+ \`\`\`
56
+
57
+ ## Project Structure
58
+
59
+ - \`src/main.ts\` - Entry point
60
+ - \`tsonic.json\` - Project configuration
61
+ - \`generated/\` - Generated C# code (gitignored)
62
+ `;
63
+ // CLI package version - installed as devDependency for npm run build/dev
64
+ const CLI_PACKAGE = { name: "@tsonic/cli", version: "0.0.1" };
65
+ /**
66
+ * Get type package info based on runtime mode
67
+ *
68
+ * typeRoots: Only ambient globals packages (provide global types without imports)
69
+ * packages: All type packages to install (includes explicit import packages)
70
+ */
71
+ const getTypePackageInfo = (runtime) => {
72
+ if (runtime === "js") {
73
+ // JS mode:
74
+ // - @tsonic/cli: the compiler CLI (provides `tsonic` command)
75
+ // - @tsonic/js-globals: ambient globals (Array, console, etc.) - needs typeRoots
76
+ // - @tsonic/types: explicit imports (int, float, etc.) - just npm dep
77
+ return {
78
+ packages: [
79
+ CLI_PACKAGE,
80
+ { name: "@tsonic/js-globals", version: "0.1.1" },
81
+ { name: "@tsonic/types", version: "0.2.0" },
82
+ ],
83
+ typeRoots: ["node_modules/@tsonic/js-globals"],
84
+ };
85
+ }
86
+ // Dotnet mode:
87
+ // - @tsonic/cli: the compiler CLI (provides `tsonic` command)
88
+ // - @tsonic/dotnet-globals: ambient globals - needs typeRoots
89
+ // - @tsonic/dotnet: explicit imports (System.*, etc.) - just npm dep
90
+ // - @tsonic/types: transitive dep of @tsonic/dotnet
91
+ return {
92
+ packages: [
93
+ CLI_PACKAGE,
94
+ { name: "@tsonic/dotnet-globals", version: "0.1.2" },
95
+ { name: "@tsonic/dotnet", version: "0.4.0" },
96
+ ],
97
+ typeRoots: ["node_modules/@tsonic/dotnet-globals"],
98
+ };
99
+ };
100
+ /**
101
+ * Generate tsonic.json config
102
+ */
103
+ const generateConfig = (includeTypeRoots, runtime) => {
104
+ const config = {
105
+ $schema: "https://tsonic.dev/schema/v1.json",
106
+ rootNamespace: "MyApp",
107
+ entryPoint: "src/app.ts",
108
+ sourceRoot: "src",
109
+ outputDirectory: "generated",
110
+ outputName: "app",
111
+ runtime: runtime,
112
+ optimize: "speed",
113
+ packages: [],
114
+ buildOptions: {
115
+ stripSymbols: true,
116
+ invariantGlobalization: true,
117
+ },
118
+ };
119
+ if (includeTypeRoots) {
120
+ const typeInfo = getTypePackageInfo(runtime);
121
+ config.dotnet = {
122
+ typeRoots: typeInfo.typeRoots,
123
+ };
124
+ }
125
+ return JSON.stringify(config, null, 2) + "\n";
126
+ };
127
+ /**
128
+ * Create or update package.json with scripts and metadata
129
+ */
130
+ const createOrUpdatePackageJson = (packageJsonPath) => {
131
+ let packageJson;
132
+ if (existsSync(packageJsonPath)) {
133
+ // Merge with existing package.json
134
+ const existing = readFileSync(packageJsonPath, "utf-8");
135
+ packageJson = JSON.parse(existing);
136
+ // Ensure required fields exist
137
+ if (!packageJson.name) {
138
+ packageJson.name = "my-tsonic-app";
139
+ }
140
+ if (!packageJson.version) {
141
+ packageJson.version = "1.0.0";
142
+ }
143
+ if (!packageJson.type) {
144
+ packageJson.type = "module";
145
+ }
146
+ // Merge scripts
147
+ const existingScripts = packageJson.scripts || {};
148
+ packageJson.scripts = {
149
+ ...existingScripts,
150
+ build: "tsonic build src/app.ts",
151
+ dev: "tsonic run src/app.ts",
152
+ };
153
+ // Ensure devDependencies exists
154
+ if (!packageJson.devDependencies) {
155
+ packageJson.devDependencies = {};
156
+ }
157
+ }
158
+ else {
159
+ // Create new package.json
160
+ packageJson = {
161
+ name: "my-tsonic-app",
162
+ version: "1.0.0",
163
+ type: "module",
164
+ scripts: {
165
+ build: "tsonic build src/app.ts",
166
+ dev: "tsonic run src/app.ts",
167
+ },
168
+ devDependencies: {},
169
+ };
170
+ }
171
+ writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8");
172
+ };
173
+ /**
174
+ * Install npm package
175
+ */
176
+ const installPackage = (packageName, version) => {
177
+ const result = spawnSync("npm", ["install", "--save-dev", `${packageName}@${version}`], {
178
+ stdio: "inherit",
179
+ encoding: "utf-8",
180
+ });
181
+ if (result.status !== 0) {
182
+ return {
183
+ ok: false,
184
+ error: `Failed to install ${packageName}@${version}`,
185
+ };
186
+ }
187
+ return { ok: true, value: undefined };
188
+ };
189
+ /**
190
+ * Initialize a new Tsonic project
191
+ */
192
+ export const initProject = (cwd, options = {}) => {
193
+ const runtime = options.runtime ?? "js";
194
+ const tsonicJsonPath = join(cwd, "tsonic.json");
195
+ const gitignorePath = join(cwd, ".gitignore");
196
+ const srcDir = join(cwd, "src");
197
+ const appTsPath = join(srcDir, "app.ts");
198
+ const readmePath = join(cwd, "README.md");
199
+ const packageJsonPath = join(cwd, "package.json");
200
+ // Check if tsonic.json already exists
201
+ if (existsSync(tsonicJsonPath)) {
202
+ return {
203
+ ok: false,
204
+ error: "tsonic.json already exists. Project is already initialized.",
205
+ };
206
+ }
207
+ try {
208
+ // Create or update package.json FIRST (before npm install)
209
+ const packageJsonExists = existsSync(packageJsonPath);
210
+ createOrUpdatePackageJson(packageJsonPath);
211
+ console.log(packageJsonExists ? "✓ Updated package.json" : "✓ Created package.json");
212
+ // Install type declarations based on runtime mode
213
+ const shouldInstallTypes = !options.skipTypes;
214
+ const typeInfo = getTypePackageInfo(runtime);
215
+ if (shouldInstallTypes) {
216
+ for (const pkg of typeInfo.packages) {
217
+ const version = options.typesVersion ?? pkg.version;
218
+ console.log(`Installing type declarations (${pkg.name}@${version})...`);
219
+ const installResult = installPackage(pkg.name, version);
220
+ if (!installResult.ok) {
221
+ return installResult;
222
+ }
223
+ console.log(`✓ Installed ${pkg.name}`);
224
+ }
225
+ }
226
+ // Create tsonic.json
227
+ const config = generateConfig(shouldInstallTypes, runtime);
228
+ writeFileSync(tsonicJsonPath, config, "utf-8");
229
+ console.log("✓ Created tsonic.json");
230
+ // Create or append to .gitignore
231
+ if (existsSync(gitignorePath)) {
232
+ const existing = readFileSync(gitignorePath, "utf-8");
233
+ if (!existing.includes("generated/")) {
234
+ writeFileSync(gitignorePath, existing + "\n" + DEFAULT_GITIGNORE, "utf-8");
235
+ console.log("✓ Updated .gitignore");
236
+ }
237
+ }
238
+ else {
239
+ writeFileSync(gitignorePath, DEFAULT_GITIGNORE, "utf-8");
240
+ console.log("✓ Created .gitignore");
241
+ }
242
+ // Create src directory and app.ts with runtime-appropriate code
243
+ if (!existsSync(srcDir)) {
244
+ mkdirSync(srcDir, { recursive: true });
245
+ }
246
+ if (!existsSync(appTsPath)) {
247
+ const sampleCode = runtime === "js" ? SAMPLE_MAIN_TS_JS : SAMPLE_MAIN_TS_DOTNET;
248
+ writeFileSync(appTsPath, sampleCode, "utf-8");
249
+ console.log("✓ Created src/app.ts");
250
+ }
251
+ // Create README.md
252
+ if (!existsSync(readmePath)) {
253
+ writeFileSync(readmePath, SAMPLE_README, "utf-8");
254
+ console.log("✓ Created README.md");
255
+ }
256
+ // Note: .csproj is generated by the build command with proper runtime DLL references
257
+ console.log("\n✓ Project initialized successfully!");
258
+ console.log("\nNext steps:");
259
+ console.log(" npm run build # Build executable");
260
+ console.log(" npm run dev # Run directly");
261
+ return { ok: true, value: undefined };
262
+ }
263
+ catch (error) {
264
+ return {
265
+ ok: false,
266
+ error: `Failed to initialize project: ${error instanceof Error ? error.message : String(error)}`,
267
+ };
268
+ }
269
+ };
270
+ //# 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 pack command - Create NuGet package from library
3
+ */
4
+ import type { ResolvedConfig, Result } from "../types.js";
5
+ /**
6
+ * Pack library into NuGet package
7
+ */
8
+ export declare const packCommand: (config: ResolvedConfig) => Result<{
9
+ outputPath: string;
10
+ }, string>;
11
+ //# sourceMappingURL=pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1D;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,cAAc,KACrB,MAAM,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CAkGvC,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * tsonic pack command - Create NuGet package from library
3
+ */
4
+ import { spawnSync } from "node:child_process";
5
+ import { join } from "node:path";
6
+ import { existsSync } from "node:fs";
7
+ import { emitCommand } from "./emit.js";
8
+ /**
9
+ * Pack library into NuGet package
10
+ */
11
+ export const packCommand = (config) => {
12
+ const { outputDirectory, outputName, quiet, verbose } = config;
13
+ // Verify this is a library project
14
+ if (config.outputConfig.type !== "library") {
15
+ return {
16
+ ok: false,
17
+ error: "Pack command can only be used with library projects. Set output.type to 'library' in tsonic.json",
18
+ };
19
+ }
20
+ // Verify packable is enabled
21
+ if (!config.outputConfig.packable) {
22
+ return {
23
+ ok: false,
24
+ error: "Library is not packable. Set output.packable to true in tsonic.json",
25
+ };
26
+ }
27
+ // Step 1: Emit C# code
28
+ if (!quiet) {
29
+ console.log("Step 1/2: Generating C# code...");
30
+ }
31
+ const emitResult = emitCommand(config);
32
+ if (!emitResult.ok) {
33
+ return emitResult;
34
+ }
35
+ const generatedDir = emitResult.value.outputDir;
36
+ const csprojPath = join(generatedDir, "tsonic.csproj");
37
+ if (!existsSync(csprojPath)) {
38
+ return {
39
+ ok: false,
40
+ error: `No tsonic.csproj found in ${outputDirectory}/. This should have been created by emit.`,
41
+ };
42
+ }
43
+ // Step 2: Run dotnet pack
44
+ if (!quiet) {
45
+ console.log("Step 2/2: Creating NuGet package...");
46
+ }
47
+ const packArgs = ["pack", "tsonic.csproj", "-c", "Release", "--nologo"];
48
+ if (quiet) {
49
+ packArgs.push("--verbosity", "quiet");
50
+ }
51
+ else if (verbose) {
52
+ packArgs.push("--verbosity", "detailed");
53
+ }
54
+ else {
55
+ packArgs.push("--verbosity", "minimal");
56
+ }
57
+ const packResult = spawnSync("dotnet", packArgs, {
58
+ cwd: generatedDir,
59
+ stdio: verbose ? "inherit" : "pipe",
60
+ encoding: "utf-8",
61
+ });
62
+ if (packResult.status !== 0) {
63
+ const errorMsg = packResult.stderr || packResult.stdout || "Unknown error";
64
+ return {
65
+ ok: false,
66
+ error: `dotnet pack failed:\n${errorMsg}`,
67
+ };
68
+ }
69
+ // Find the generated .nupkg file
70
+ const nupkgDir = join(generatedDir, "bin", "Release");
71
+ // Package metadata
72
+ const packageId = config.outputConfig.package?.id ?? outputName;
73
+ const packageVersion = config.outputConfig.package?.version ?? "1.0.0";
74
+ const nupkgName = `${packageId}.${packageVersion}.nupkg`;
75
+ const nupkgPath = join(nupkgDir, nupkgName);
76
+ if (!existsSync(nupkgPath)) {
77
+ return {
78
+ ok: false,
79
+ error: `NuGet package not found at ${nupkgPath}. Check dotnet pack output for errors.`,
80
+ };
81
+ }
82
+ if (!quiet) {
83
+ console.log(`\n✓ Package created: ${nupkgPath}`);
84
+ console.log(`\nTo publish to NuGet.org:`);
85
+ console.log(` dotnet nuget push ${nupkgPath} --api-key YOUR_API_KEY --source https://api.nuget.org/v3/index.json`);
86
+ }
87
+ return {
88
+ ok: true,
89
+ value: { outputPath: nupkgPath },
90
+ };
91
+ };
92
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/commands/pack.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,EAEP,MAAM,YAAY,CAAC;AAGpB;;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;AA+EF;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,YAAY,EACpB,YAAY,UAAU,EACtB,YAAY,MAAM,KACjB,cAgDF,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Configuration loading and validation
3
+ */
4
+ import { readFileSync, existsSync } from "node:fs";
5
+ import { join, resolve, dirname } from "node:path";
6
+ import { detectRid } from "@tsonic/backend";
7
+ /**
8
+ * Load tsonic.json from a directory
9
+ */
10
+ export const loadConfig = (configPath) => {
11
+ if (!existsSync(configPath)) {
12
+ return {
13
+ ok: false,
14
+ error: `Config file not found: ${configPath}`,
15
+ };
16
+ }
17
+ try {
18
+ const content = readFileSync(configPath, "utf-8");
19
+ const config = JSON.parse(content);
20
+ // Validate required fields
21
+ if (!config.rootNamespace) {
22
+ return {
23
+ ok: false,
24
+ error: "tsonic.json: 'rootNamespace' is required",
25
+ };
26
+ }
27
+ return { ok: true, value: config };
28
+ }
29
+ catch (error) {
30
+ return {
31
+ ok: false,
32
+ error: `Failed to parse tsonic.json: ${error instanceof Error ? error.message : String(error)}`,
33
+ };
34
+ }
35
+ };
36
+ /**
37
+ * Find tsonic.json by walking up the directory tree
38
+ */
39
+ export const findConfig = (startDir) => {
40
+ let currentDir = resolve(startDir);
41
+ // Walk up until we find tsonic.json or hit root
42
+ while (true) {
43
+ const configPath = join(currentDir, "tsonic.json");
44
+ if (existsSync(configPath)) {
45
+ return configPath;
46
+ }
47
+ const parentDir = dirname(currentDir);
48
+ if (parentDir === currentDir) {
49
+ // Hit root
50
+ return null;
51
+ }
52
+ currentDir = parentDir;
53
+ }
54
+ };
55
+ /**
56
+ * Auto-detect output type based on entry point and project structure
57
+ */
58
+ const autoDetectOutputType = (entryPoint) => {
59
+ // If no entry point, default to library
60
+ if (!entryPoint) {
61
+ return "library";
62
+ }
63
+ // If entry point is provided, default to executable
64
+ // The user specified an entry point, so they want a runnable program
65
+ return "executable";
66
+ };
67
+ /**
68
+ * Resolve output configuration from config + CLI options
69
+ */
70
+ const resolveOutputConfig = (config, cliOptions, entryPoint) => {
71
+ const configOutput = config.output ?? {};
72
+ // Determine output type
73
+ const outputType = cliOptions.type ?? configOutput.type ?? autoDetectOutputType(entryPoint);
74
+ // Base config from file
75
+ const baseConfig = {
76
+ type: outputType,
77
+ name: configOutput.name ?? config.outputName,
78
+ };
79
+ // Merge executable-specific options
80
+ if (outputType === "executable") {
81
+ return {
82
+ ...baseConfig,
83
+ nativeAot: cliOptions.noAot ? false : (configOutput.nativeAot ?? true),
84
+ singleFile: cliOptions.singleFile ?? configOutput.singleFile ?? true,
85
+ trimmed: configOutput.trimmed ?? true,
86
+ stripSymbols: cliOptions.noStrip
87
+ ? false
88
+ : (configOutput.stripSymbols ?? true),
89
+ optimization: cliOptions.optimize ?? configOutput.optimization ?? "speed",
90
+ invariantGlobalization: config.buildOptions?.invariantGlobalization ?? true,
91
+ selfContained: cliOptions.selfContained ?? configOutput.selfContained ?? true,
92
+ };
93
+ }
94
+ // Merge library-specific options
95
+ if (outputType === "library") {
96
+ return {
97
+ ...baseConfig,
98
+ targetFrameworks: configOutput.targetFrameworks ?? [
99
+ config.dotnetVersion ?? "net10.0",
100
+ ],
101
+ generateDocumentation: cliOptions.generateDocs ?? configOutput.generateDocumentation ?? true,
102
+ includeSymbols: cliOptions.includeSymbols ?? configOutput.includeSymbols ?? true,
103
+ packable: cliOptions.pack ?? configOutput.packable ?? false,
104
+ package: configOutput.package,
105
+ };
106
+ }
107
+ // Console app fallback
108
+ return {
109
+ ...baseConfig,
110
+ singleFile: cliOptions.singleFile ?? configOutput.singleFile ?? true,
111
+ selfContained: cliOptions.selfContained ?? configOutput.selfContained ?? true,
112
+ };
113
+ };
114
+ /**
115
+ * Resolve final configuration from file + CLI args
116
+ */
117
+ export const resolveConfig = (config, cliOptions, entryFile) => {
118
+ const entryPoint = entryFile ?? config.entryPoint;
119
+ const sourceRoot = cliOptions.src ??
120
+ config.sourceRoot ??
121
+ (entryPoint ? dirname(entryPoint) : "src");
122
+ // Default type roots based on runtime mode
123
+ // Only ambient globals packages need typeRoots - explicit import packages are resolved normally
124
+ const runtime = config.runtime ?? "js";
125
+ const defaultTypeRoots = runtime === "js"
126
+ ? ["node_modules/@tsonic/js-globals"]
127
+ : ["node_modules/@tsonic/dotnet-globals"];
128
+ const typeRoots = config.dotnet?.typeRoots ?? defaultTypeRoots;
129
+ // Merge libraries from config and CLI
130
+ const configLibraries = config.dotnet?.libraries ?? [];
131
+ const cliLibraries = cliOptions.lib ?? [];
132
+ const libraries = [...configLibraries, ...cliLibraries];
133
+ // Resolve output configuration
134
+ const outputConfig = resolveOutputConfig(config, cliOptions, entryPoint);
135
+ return {
136
+ rootNamespace: cliOptions.namespace ?? config.rootNamespace,
137
+ entryPoint,
138
+ sourceRoot,
139
+ outputDirectory: config.outputDirectory ?? "generated",
140
+ outputName: cliOptions.out ?? config.outputName ?? "app",
141
+ rid: cliOptions.rid ?? config.rid ?? detectRid(),
142
+ dotnetVersion: config.dotnetVersion ?? "net10.0",
143
+ optimize: cliOptions.optimize ?? config.optimize ?? "speed",
144
+ runtime: config.runtime ?? "js",
145
+ // Only include user-specified packages
146
+ // Runtime DLLs are bundled with @tsonic/tsonic and added as assembly references
147
+ packages: config.dotnet?.packages ?? config.packages ?? [],
148
+ outputConfig,
149
+ stripSymbols: cliOptions.noStrip
150
+ ? false
151
+ : (config.buildOptions?.stripSymbols ?? true),
152
+ invariantGlobalization: config.buildOptions?.invariantGlobalization ?? true,
153
+ keepTemp: cliOptions.keepTemp ?? false,
154
+ verbose: cliOptions.verbose ?? false,
155
+ quiet: cliOptions.quiet ?? false,
156
+ typeRoots,
157
+ libraries,
158
+ };
159
+ };
160
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for configuration loading and resolution
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}