@tsonic/cli 0.0.26 → 0.0.28
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/dist/.tsbuildinfo +1 -1
- package/dist/cli/dispatcher.d.ts.map +1 -1
- package/dist/cli/dispatcher.js +90 -40
- package/dist/cli/dispatcher.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +15 -16
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/parser.js +5 -5
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/parser.test.js +3 -7
- package/dist/cli/parser.test.js.map +1 -1
- package/dist/commands/add-common.d.ts +2 -4
- package/dist/commands/add-common.d.ts.map +1 -1
- package/dist/commands/add-common.js +0 -6
- package/dist/commands/add-common.js.map +1 -1
- package/dist/commands/add-deps.test.js +13 -20
- package/dist/commands/add-deps.test.js.map +1 -1
- package/dist/commands/add-framework.d.ts +1 -1
- package/dist/commands/add-framework.d.ts.map +1 -1
- package/dist/commands/add-framework.js +14 -23
- package/dist/commands/add-framework.js.map +1 -1
- package/dist/commands/add-js.d.ts +2 -2
- package/dist/commands/add-js.d.ts.map +1 -1
- package/dist/commands/add-js.js +21 -19
- package/dist/commands/add-js.js.map +1 -1
- package/dist/commands/add-js.test.js +23 -11
- package/dist/commands/add-js.test.js.map +1 -1
- package/dist/commands/add-nodejs.d.ts +2 -2
- package/dist/commands/add-nodejs.d.ts.map +1 -1
- package/dist/commands/add-nodejs.js +22 -19
- package/dist/commands/add-nodejs.js.map +1 -1
- package/dist/commands/add-nodejs.test.js +31 -13
- package/dist/commands/add-nodejs.test.js.map +1 -1
- package/dist/commands/add-nuget.d.ts +1 -1
- package/dist/commands/add-nuget.d.ts.map +1 -1
- package/dist/commands/add-nuget.js +7 -7
- package/dist/commands/add-nuget.js.map +1 -1
- package/dist/commands/add-package.d.ts.map +1 -1
- package/dist/commands/add-package.js +44 -30
- package/dist/commands/add-package.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +157 -11
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +47 -69
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts +10 -19
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +150 -260
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/init.test.js +21 -51
- package/dist/commands/init.test.js.map +1 -1
- package/dist/commands/pack.js +1 -1
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/remove-nuget.d.ts +1 -1
- package/dist/commands/remove-nuget.d.ts.map +1 -1
- package/dist/commands/remove-nuget.js +3 -3
- package/dist/commands/remove-nuget.js.map +1 -1
- package/dist/commands/restore.d.ts +1 -1
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +42 -61
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/restore.test.js +42 -18
- package/dist/commands/restore.test.js.map +1 -1
- package/dist/commands/update-nuget.d.ts +1 -1
- package/dist/commands/update-nuget.d.ts.map +1 -1
- package/dist/commands/update-nuget.js +3 -3
- package/dist/commands/update-nuget.js.map +1 -1
- package/dist/config.d.ts +18 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +212 -156
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +156 -147
- package/dist/config.test.js.map +1 -1
- package/dist/dotnet/runtime-assets.d.ts +1 -0
- package/dist/dotnet/runtime-assets.d.ts.map +1 -1
- package/dist/dotnet/runtime-assets.js +30 -0
- package/dist/dotnet/runtime-assets.js.map +1 -1
- package/dist/types.d.ts +59 -36
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/commands/init.js
CHANGED
|
@@ -1,20 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tsonic
|
|
2
|
+
* tsonic init - initialize a mandatory Tsonic workspace.
|
|
3
|
+
*
|
|
4
|
+
* Workspace layout (airplane-grade, deterministic):
|
|
5
|
+
* tsonic.workspace.json
|
|
6
|
+
* libs/
|
|
7
|
+
* packages/<workspaceName>/
|
|
8
|
+
* tsonic.json
|
|
9
|
+
* package.json
|
|
10
|
+
* src/App.ts
|
|
3
11
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import { join } from "node:path";
|
|
12
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
13
|
+
import { basename, join } from "node:path";
|
|
6
14
|
import { spawnSync } from "node:child_process";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
import { copyRuntimeDllsToWorkspaceLibs } from "../dotnet/runtime-assets.js";
|
|
16
|
+
// Unified CLI package version - installed as devDependency for npm scripts.
|
|
17
|
+
const CLI_PACKAGE = { name: "tsonic", version: "latest" };
|
|
18
|
+
export const getTypePackageInfo = (options = {}) => {
|
|
19
|
+
const js = options.js === true;
|
|
20
|
+
const nodejs = options.nodejs === true;
|
|
21
|
+
const packages = [
|
|
22
|
+
CLI_PACKAGE,
|
|
23
|
+
{ name: "@tsonic/core", version: "latest" },
|
|
24
|
+
{ name: "@tsonic/globals", version: "latest" },
|
|
25
|
+
...(js ? [{ name: "@tsonic/js", version: "latest" }] : []),
|
|
26
|
+
...(nodejs ? [{ name: "@tsonic/nodejs", version: "latest" }] : []),
|
|
27
|
+
];
|
|
28
|
+
return {
|
|
29
|
+
packages,
|
|
30
|
+
typeRoots: ["node_modules/@tsonic/globals"],
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const DEFAULT_ROOT_GITIGNORE = `# .NET build artifacts (per-project)
|
|
34
|
+
packages/*/generated/bin/
|
|
35
|
+
packages/*/generated/obj/
|
|
11
36
|
|
|
12
37
|
# Optional: Uncomment to ignore generated C# files
|
|
13
|
-
# generated/**/*.cs
|
|
38
|
+
# packages/*/generated/**/*.cs
|
|
14
39
|
|
|
15
40
|
# Output executables
|
|
16
|
-
out/
|
|
17
|
-
|
|
41
|
+
packages/*/out/
|
|
42
|
+
packages/*/*.exe
|
|
18
43
|
|
|
19
44
|
# Dependencies
|
|
20
45
|
node_modules/
|
|
@@ -25,15 +50,6 @@ node_modules/
|
|
|
25
50
|
const SAMPLE_MAIN_TS = `import { Console } from "@tsonic/dotnet/System.js";
|
|
26
51
|
import { File } from "@tsonic/dotnet/System.IO.js";
|
|
27
52
|
|
|
28
|
-
export function main(): void {
|
|
29
|
-
Console.writeLine("Reading README.md...");
|
|
30
|
-
const content = File.readAllText("./README.md");
|
|
31
|
-
Console.writeLine(content);
|
|
32
|
-
}
|
|
33
|
-
`;
|
|
34
|
-
const SAMPLE_MAIN_TS_PURE = `import { Console } from "@tsonic/dotnet-pure/System.js";
|
|
35
|
-
import { File } from "@tsonic/dotnet-pure/System.IO.js";
|
|
36
|
-
|
|
37
53
|
export function main(): void {
|
|
38
54
|
Console.WriteLine("Reading README.md...");
|
|
39
55
|
const content = File.ReadAllText("./README.md");
|
|
@@ -43,15 +59,6 @@ export function main(): void {
|
|
|
43
59
|
const SAMPLE_MAIN_TS_JS = `import { Console } from "@tsonic/dotnet/System.js";
|
|
44
60
|
import { console, JSON } from "@tsonic/js/index.js";
|
|
45
61
|
|
|
46
|
-
export function main(): void {
|
|
47
|
-
Console.writeLine("JSRuntime JSON example...");
|
|
48
|
-
const value = JSON.parse<{ x: number }>('{"x": 1}');
|
|
49
|
-
console.log(JSON.stringify(value));
|
|
50
|
-
}
|
|
51
|
-
`;
|
|
52
|
-
const SAMPLE_MAIN_TS_JS_PURE = `import { Console } from "@tsonic/dotnet-pure/System.js";
|
|
53
|
-
import { console, JSON } from "@tsonic/js/index.js";
|
|
54
|
-
|
|
55
62
|
export function main(): void {
|
|
56
63
|
Console.WriteLine("JSRuntime JSON example...");
|
|
57
64
|
const value = JSON.parse<{ x: number }>('{"x": 1}');
|
|
@@ -64,276 +71,159 @@ export function main(): void {
|
|
|
64
71
|
console.log("Hello from @tsonic/nodejs");
|
|
65
72
|
}
|
|
66
73
|
`;
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
## Getting Started
|
|
72
|
-
|
|
73
|
-
Build and run the project:
|
|
74
|
-
|
|
75
|
-
\`\`\`bash
|
|
76
|
-
npm run build
|
|
77
|
-
./out/app
|
|
78
|
-
\`\`\`
|
|
79
|
-
|
|
80
|
-
Or run directly:
|
|
81
|
-
|
|
82
|
-
\`\`\`bash
|
|
83
|
-
npm run dev
|
|
84
|
-
\`\`\`
|
|
85
|
-
|
|
86
|
-
## Project Structure
|
|
87
|
-
|
|
88
|
-
- \`src/App.ts\` - Entry point
|
|
89
|
-
- \`tsonic.json\` - Project configuration
|
|
90
|
-
- \`generated/\` - Generated C# code (gitignored)
|
|
91
|
-
`;
|
|
92
|
-
// Unified CLI package version - installed as devDependency for npm run build/dev
|
|
93
|
-
const CLI_PACKAGE = { name: "tsonic", version: "latest" };
|
|
94
|
-
/**
|
|
95
|
-
* Get type package info
|
|
96
|
-
*
|
|
97
|
-
* typeRoots: Only ambient globals packages (provide global types without imports)
|
|
98
|
-
* packages: All type packages to install (includes explicit import packages)
|
|
99
|
-
*
|
|
100
|
-
* Package structure:
|
|
101
|
-
* - @tsonic/core: Core types (int, float, etc.) - imported as @tsonic/core/types.js
|
|
102
|
-
* - @tsonic/globals depends on @tsonic/dotnet (camelCase BCL methods)
|
|
103
|
-
* - @tsonic/globals-pure depends on @tsonic/dotnet-pure (PascalCase CLR naming)
|
|
104
|
-
* - @tsonic/nodejs has @tsonic/dotnet as peerDependency (uses whichever globals provides)
|
|
105
|
-
*/
|
|
106
|
-
export const getTypePackageInfo = (options = {}) => {
|
|
107
|
-
const js = options.js === true;
|
|
108
|
-
const nodejs = options.nodejs === true;
|
|
109
|
-
const pure = options.pure === true;
|
|
110
|
-
// Core package is always included (provides int, float, etc.)
|
|
111
|
-
const corePackage = { name: "@tsonic/core", version: "latest" };
|
|
112
|
-
// - @tsonic/cli: the compiler CLI (provides `tsonic` command)
|
|
113
|
-
// - @tsonic/core: core types (int, float, etc.) - explicit import
|
|
114
|
-
// - @tsonic/globals[-pure]: base types + BCL methods (transitive @tsonic/dotnet[-pure]) - needs typeRoots
|
|
115
|
-
// - @tsonic/nodejs: Node.js interop (peerDep on @tsonic/dotnet, satisfied by globals)
|
|
116
|
-
const globalsPackage = pure ? "@tsonic/globals-pure" : "@tsonic/globals";
|
|
117
|
-
const packages = [
|
|
118
|
-
CLI_PACKAGE,
|
|
119
|
-
corePackage,
|
|
120
|
-
{ name: globalsPackage, version: "latest" },
|
|
121
|
-
];
|
|
122
|
-
// JSRuntime / nodejs bindings currently import from @tsonic/dotnet (not dotnet-pure).
|
|
123
|
-
// In --pure mode, ensure @tsonic/dotnet is installed so these packages typecheck.
|
|
124
|
-
if (pure && (js || nodejs)) {
|
|
125
|
-
packages.push({ name: "@tsonic/dotnet", version: "latest" });
|
|
126
|
-
}
|
|
127
|
-
if (js) {
|
|
128
|
-
packages.push({ name: "@tsonic/js", version: "latest" });
|
|
129
|
-
}
|
|
130
|
-
if (nodejs) {
|
|
131
|
-
packages.push({ name: "@tsonic/nodejs", version: "latest" });
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
packages,
|
|
135
|
-
typeRoots: [`node_modules/${globalsPackage}`],
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
/**
|
|
139
|
-
* Generate tsonic.json config
|
|
140
|
-
*/
|
|
141
|
-
const generateConfig = (includeTypeRoots, libraryPaths = [], pure = false) => {
|
|
142
|
-
const config = {
|
|
143
|
-
$schema: "https://tsonic.org/schema/v1.json",
|
|
144
|
-
rootNamespace: "MyApp",
|
|
145
|
-
entryPoint: "src/App.ts",
|
|
146
|
-
sourceRoot: "src",
|
|
147
|
-
outputDirectory: "generated",
|
|
148
|
-
outputName: "app",
|
|
149
|
-
optimize: "speed",
|
|
150
|
-
buildOptions: {
|
|
151
|
-
stripSymbols: true,
|
|
152
|
-
invariantGlobalization: true,
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
if (includeTypeRoots || libraryPaths.length > 0) {
|
|
156
|
-
const typeInfo = getTypePackageInfo({ pure });
|
|
157
|
-
const dotnet = {};
|
|
158
|
-
if (includeTypeRoots) {
|
|
159
|
-
dotnet.typeRoots = typeInfo.typeRoots;
|
|
160
|
-
}
|
|
161
|
-
if (libraryPaths.length > 0) {
|
|
162
|
-
dotnet.libraries = [...libraryPaths];
|
|
163
|
-
}
|
|
164
|
-
config.dotnet = dotnet;
|
|
165
|
-
}
|
|
166
|
-
return JSON.stringify(config, null, 2) + "\n";
|
|
167
|
-
};
|
|
168
|
-
/**
|
|
169
|
-
* Create or update package.json with scripts and metadata
|
|
170
|
-
*/
|
|
171
|
-
const createOrUpdatePackageJson = (packageJsonPath) => {
|
|
172
|
-
let packageJson;
|
|
74
|
+
const createOrUpdateRootPackageJson = (workspaceRoot) => {
|
|
75
|
+
const packageJsonPath = join(workspaceRoot, "package.json");
|
|
76
|
+
const workspaceName = basename(workspaceRoot);
|
|
77
|
+
let pkg;
|
|
173
78
|
if (existsSync(packageJsonPath)) {
|
|
174
|
-
|
|
175
|
-
const existing = readFileSync(packageJsonPath, "utf-8");
|
|
176
|
-
packageJson = JSON.parse(existing);
|
|
177
|
-
// Ensure required fields exist
|
|
178
|
-
if (!packageJson.name) {
|
|
179
|
-
packageJson.name = "my-tsonic-app";
|
|
180
|
-
}
|
|
181
|
-
if (!packageJson.version) {
|
|
182
|
-
packageJson.version = "1.0.0";
|
|
183
|
-
}
|
|
184
|
-
if (!packageJson.type) {
|
|
185
|
-
packageJson.type = "module";
|
|
186
|
-
}
|
|
187
|
-
// Merge scripts
|
|
188
|
-
const existingScripts = packageJson.scripts || {};
|
|
189
|
-
packageJson.scripts = {
|
|
190
|
-
...existingScripts,
|
|
191
|
-
build: "tsonic build src/App.ts",
|
|
192
|
-
dev: "tsonic run src/App.ts",
|
|
193
|
-
};
|
|
194
|
-
// Ensure devDependencies exists
|
|
195
|
-
if (!packageJson.devDependencies) {
|
|
196
|
-
packageJson.devDependencies = {};
|
|
197
|
-
}
|
|
79
|
+
pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
198
80
|
}
|
|
199
81
|
else {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
82
|
+
pkg = {
|
|
83
|
+
name: workspaceName,
|
|
84
|
+
private: true,
|
|
203
85
|
version: "1.0.0",
|
|
204
86
|
type: "module",
|
|
205
|
-
scripts: {
|
|
206
|
-
build: "tsonic build src/App.ts",
|
|
207
|
-
dev: "tsonic run src/App.ts",
|
|
208
|
-
},
|
|
209
|
-
devDependencies: {},
|
|
210
87
|
};
|
|
211
88
|
}
|
|
212
|
-
|
|
89
|
+
pkg.workspaces = ["packages/*"];
|
|
90
|
+
const scripts = pkg.scripts ?? {};
|
|
91
|
+
pkg.scripts = {
|
|
92
|
+
...scripts,
|
|
93
|
+
build: "tsonic build",
|
|
94
|
+
dev: "tsonic run",
|
|
95
|
+
};
|
|
96
|
+
pkg.devDependencies = pkg.devDependencies ?? {};
|
|
97
|
+
writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + "\n", "utf-8");
|
|
213
98
|
};
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const
|
|
218
|
-
|
|
99
|
+
const writeWorkspaceConfig = (workspaceRoot, config) => {
|
|
100
|
+
writeFileSync(join(workspaceRoot, "tsonic.workspace.json"), JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
101
|
+
};
|
|
102
|
+
const writeProjectConfig = (projectRoot, config) => {
|
|
103
|
+
writeFileSync(join(projectRoot, "tsonic.json"), JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
104
|
+
};
|
|
105
|
+
const npmInstallDev = (workspaceRoot, spec) => {
|
|
106
|
+
const result = spawnSync("npm", ["install", "--save-dev", spec, "--no-fund", "--no-audit"], {
|
|
107
|
+
cwd: workspaceRoot,
|
|
219
108
|
stdio: "inherit",
|
|
220
109
|
encoding: "utf-8",
|
|
221
110
|
});
|
|
222
111
|
if (result.status !== 0) {
|
|
223
|
-
return {
|
|
224
|
-
ok: false,
|
|
225
|
-
error: `Failed to install ${packageName}@${version}`,
|
|
226
|
-
};
|
|
112
|
+
return { ok: false, error: `npm install failed: ${spec}` };
|
|
227
113
|
}
|
|
228
114
|
return { ok: true, value: undefined };
|
|
229
115
|
};
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
export const initProject = (cwd, options = {}) => {
|
|
234
|
-
const tsonicJsonPath = join(cwd, "tsonic.json");
|
|
235
|
-
const gitignorePath = join(cwd, ".gitignore");
|
|
236
|
-
const srcDir = join(cwd, "src");
|
|
237
|
-
const appTsPath = join(srcDir, "App.ts");
|
|
238
|
-
const readmePath = join(cwd, "README.md");
|
|
239
|
-
const packageJsonPath = join(cwd, "package.json");
|
|
240
|
-
// Check if tsonic.json already exists
|
|
241
|
-
if (existsSync(tsonicJsonPath)) {
|
|
116
|
+
export const initWorkspace = (workspaceRoot, options = {}) => {
|
|
117
|
+
const workspaceConfigPath = join(workspaceRoot, "tsonic.workspace.json");
|
|
118
|
+
if (existsSync(workspaceConfigPath)) {
|
|
242
119
|
return {
|
|
243
120
|
ok: false,
|
|
244
|
-
error: "tsonic.json already exists.
|
|
121
|
+
error: "tsonic.workspace.json already exists. Workspace is already initialized.",
|
|
245
122
|
};
|
|
246
123
|
}
|
|
124
|
+
const name = basename(workspaceRoot);
|
|
125
|
+
const packagesDir = join(workspaceRoot, "packages");
|
|
126
|
+
const libsDir = join(workspaceRoot, "libs");
|
|
127
|
+
const projectRoot = join(packagesDir, name);
|
|
247
128
|
try {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
//
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
129
|
+
mkdirSync(packagesDir, { recursive: true });
|
|
130
|
+
mkdirSync(libsDir, { recursive: true });
|
|
131
|
+
mkdirSync(projectRoot, { recursive: true });
|
|
132
|
+
mkdirSync(join(projectRoot, "src"), { recursive: true });
|
|
133
|
+
// Root package.json (npm workspaces)
|
|
134
|
+
createOrUpdateRootPackageJson(workspaceRoot);
|
|
135
|
+
// Workspace config (deps live here)
|
|
136
|
+
let workspaceConfig = {
|
|
137
|
+
$schema: "https://tsonic.org/schema/workspace/v1.json",
|
|
138
|
+
dotnetVersion: "net10.0",
|
|
139
|
+
dotnet: {
|
|
140
|
+
typeRoots: ["node_modules/@tsonic/globals"],
|
|
141
|
+
libraries: [],
|
|
142
|
+
frameworkReferences: [],
|
|
143
|
+
packageReferences: [],
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
// Install type declarations at workspace root
|
|
147
|
+
const shouldInstallTypes = options.skipTypes !== true;
|
|
148
|
+
const js = options.js === true;
|
|
149
|
+
const nodejs = options.nodejs === true;
|
|
258
150
|
if (shouldInstallTypes) {
|
|
151
|
+
const typeInfo = getTypePackageInfo({ js, nodejs });
|
|
259
152
|
for (const pkg of typeInfo.packages) {
|
|
260
153
|
const version = options.typesVersion ?? pkg.version;
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
return installResult;
|
|
265
|
-
}
|
|
266
|
-
console.log(`✓ Installed ${pkg.name}`);
|
|
154
|
+
const r = npmInstallDev(workspaceRoot, `${pkg.name}@${version}`);
|
|
155
|
+
if (!r.ok)
|
|
156
|
+
return r;
|
|
267
157
|
}
|
|
268
158
|
}
|
|
269
|
-
//
|
|
270
|
-
//
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
// Log warning but continue - user can add manually later
|
|
282
|
-
console.log(`⚠ Warning: ${copyResult.error}`);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
for (const path of copyResult.value) {
|
|
286
|
-
console.log(`✓ Copied ${path.split("/").pop()}`);
|
|
159
|
+
// Optional runtime assemblies (JSRuntime + nodejs) are treated like any other DLL:
|
|
160
|
+
// copy them into ./libs and add to workspace dotnet.libraries so csproj references them.
|
|
161
|
+
if (js || nodejs) {
|
|
162
|
+
const copyResult = copyRuntimeDllsToWorkspaceLibs(workspaceRoot, {
|
|
163
|
+
includeJsRuntime: true,
|
|
164
|
+
includeNodejs: nodejs,
|
|
165
|
+
});
|
|
166
|
+
if (!copyResult.ok)
|
|
167
|
+
return copyResult;
|
|
168
|
+
const libs = [...(workspaceConfig.dotnet?.libraries ?? [])];
|
|
169
|
+
if (copyResult.value.includes("libs/Tsonic.JSRuntime.dll")) {
|
|
170
|
+
libs.push("libs/Tsonic.JSRuntime.dll");
|
|
287
171
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
// Note: Runtime DLLs in lib/ are found automatically by generate command
|
|
291
|
-
const config = generateConfig(shouldInstallTypes, [], pure);
|
|
292
|
-
writeFileSync(tsonicJsonPath, config, "utf-8");
|
|
293
|
-
console.log("✓ Created tsonic.json");
|
|
294
|
-
// Create or append to .gitignore
|
|
295
|
-
if (existsSync(gitignorePath)) {
|
|
296
|
-
const existing = readFileSync(gitignorePath, "utf-8");
|
|
297
|
-
if (!existing.includes("generated/")) {
|
|
298
|
-
writeFileSync(gitignorePath, existing + "\n" + DEFAULT_GITIGNORE, "utf-8");
|
|
299
|
-
console.log("✓ Updated .gitignore");
|
|
172
|
+
if (copyResult.value.includes("libs/nodejs.dll")) {
|
|
173
|
+
libs.push("libs/nodejs.dll");
|
|
300
174
|
}
|
|
175
|
+
workspaceConfig = {
|
|
176
|
+
...workspaceConfig,
|
|
177
|
+
dotnet: {
|
|
178
|
+
...(workspaceConfig.dotnet ?? {}),
|
|
179
|
+
libraries: Array.from(new Set(libs)),
|
|
180
|
+
},
|
|
181
|
+
};
|
|
301
182
|
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
183
|
+
writeWorkspaceConfig(workspaceRoot, workspaceConfig);
|
|
184
|
+
// Project package.json (minimal)
|
|
185
|
+
const projectPkgJson = join(projectRoot, "package.json");
|
|
186
|
+
if (!existsSync(projectPkgJson)) {
|
|
187
|
+
writeFileSync(projectPkgJson, JSON.stringify({
|
|
188
|
+
name,
|
|
189
|
+
private: true,
|
|
190
|
+
version: "1.0.0",
|
|
191
|
+
type: "module",
|
|
192
|
+
}, null, 2) + "\n", "utf-8");
|
|
309
193
|
}
|
|
194
|
+
// Project config
|
|
195
|
+
writeProjectConfig(projectRoot, {
|
|
196
|
+
$schema: "https://tsonic.org/schema/v1.json",
|
|
197
|
+
rootNamespace: "MyApp",
|
|
198
|
+
entryPoint: "src/App.ts",
|
|
199
|
+
sourceRoot: "src",
|
|
200
|
+
outputDirectory: "generated",
|
|
201
|
+
outputName: name,
|
|
202
|
+
output: { type: "executable" },
|
|
203
|
+
});
|
|
204
|
+
// Sample source
|
|
205
|
+
const appTsPath = join(projectRoot, "src", "App.ts");
|
|
310
206
|
if (!existsSync(appTsPath)) {
|
|
311
|
-
const sample = nodejs
|
|
312
|
-
? SAMPLE_MAIN_TS_NODEJS
|
|
313
|
-
: js
|
|
314
|
-
? (pure ? SAMPLE_MAIN_TS_JS_PURE : SAMPLE_MAIN_TS_JS)
|
|
315
|
-
: pure
|
|
316
|
-
? SAMPLE_MAIN_TS_PURE
|
|
317
|
-
: SAMPLE_MAIN_TS;
|
|
207
|
+
const sample = nodejs ? SAMPLE_MAIN_TS_NODEJS : js ? SAMPLE_MAIN_TS_JS : SAMPLE_MAIN_TS;
|
|
318
208
|
writeFileSync(appTsPath, sample, "utf-8");
|
|
319
|
-
console.log("✓ Created src/App.ts");
|
|
320
209
|
}
|
|
321
|
-
//
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
210
|
+
// Root .gitignore
|
|
211
|
+
const gitignorePath = join(workspaceRoot, ".gitignore");
|
|
212
|
+
if (existsSync(gitignorePath)) {
|
|
213
|
+
const existing = readFileSync(gitignorePath, "utf-8");
|
|
214
|
+
if (!existing.includes("packages/*/generated/")) {
|
|
215
|
+
writeFileSync(gitignorePath, existing + "\n" + DEFAULT_ROOT_GITIGNORE, "utf-8");
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
writeFileSync(gitignorePath, DEFAULT_ROOT_GITIGNORE, "utf-8");
|
|
325
220
|
}
|
|
326
|
-
// Note: .csproj is generated by the build command with proper runtime DLL references
|
|
327
|
-
console.log("\n✓ Project initialized successfully!");
|
|
328
|
-
console.log("\nNext steps:");
|
|
329
|
-
console.log(" npm run build # Build executable");
|
|
330
|
-
console.log(" npm run dev # Run directly");
|
|
331
221
|
return { ok: true, value: undefined };
|
|
332
222
|
}
|
|
333
223
|
catch (error) {
|
|
334
224
|
return {
|
|
335
225
|
ok: false,
|
|
336
|
-
error: `Failed to initialize
|
|
226
|
+
error: `Failed to initialize workspace: ${error instanceof Error ? error.message : String(error)}`,
|
|
337
227
|
};
|
|
338
228
|
}
|
|
339
229
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|