@tsonic/cli 0.0.19 → 0.0.21
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 +96 -4
- package/dist/cli/dispatcher.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +8 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/parser.d.ts.map +1 -1
- package/dist/cli/parser.js +17 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/parser.test.js +25 -0
- package/dist/cli/parser.test.js.map +1 -1
- package/dist/commands/add-common.d.ts +19 -4
- package/dist/commands/add-common.d.ts.map +1 -1
- package/dist/commands/add-common.js +115 -20
- package/dist/commands/add-common.js.map +1 -1
- package/dist/commands/add-deps.test.d.ts +10 -0
- package/dist/commands/add-deps.test.d.ts.map +1 -0
- package/dist/commands/add-deps.test.js +277 -0
- package/dist/commands/add-deps.test.js.map +1 -0
- 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 +53 -35
- package/dist/commands/add-framework.js.map +1 -1
- package/dist/commands/add-nuget.d.ts +6 -3
- package/dist/commands/add-nuget.d.ts.map +1 -1
- package/dist/commands/add-nuget.js +49 -211
- package/dist/commands/add-nuget.js.map +1 -1
- package/dist/commands/add-package.d.ts +1 -1
- package/dist/commands/add-package.d.ts.map +1 -1
- package/dist/commands/add-package.js +162 -58
- package/dist/commands/add-package.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +5 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/remove-nuget.d.ts +16 -0
- package/dist/commands/remove-nuget.d.ts.map +1 -0
- package/dist/commands/remove-nuget.js +47 -0
- package/dist/commands/remove-nuget.js.map +1 -0
- package/dist/commands/restore.d.ts +19 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +619 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/restore.test.d.ts +5 -0
- package/dist/commands/restore.test.d.ts.map +1 -0
- package/dist/commands/restore.test.js +59 -0
- package/dist/commands/restore.test.js.map +1 -0
- package/dist/commands/update-nuget.d.ts +18 -0
- package/dist/commands/update-nuget.d.ts.map +1 -0
- package/dist/commands/update-nuget.js +76 -0
- package/dist/commands/update-nuget.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -6
- package/dist/config.js.map +1 -1
- package/dist/dotnet/runtime-dlls.d.ts +3 -0
- package/dist/dotnet/runtime-dlls.d.ts.map +1 -0
- package/dist/dotnet/runtime-dlls.js +5 -0
- package/dist/dotnet/runtime-dlls.js.map +1 -0
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for dependency-aware bindings generation.
|
|
3
|
+
*
|
|
4
|
+
* These tests are intentionally end-to-end at the CLI command level:
|
|
5
|
+
* - Use a local NuGet feed (no network)
|
|
6
|
+
* - Verify transitive dependencies produce bindings packages automatically
|
|
7
|
+
* - Verify netstandard-style dependencies resolve under .NET 10
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it } from "mocha";
|
|
10
|
+
import { expect } from "chai";
|
|
11
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync, } from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { spawnSync } from "node:child_process";
|
|
14
|
+
import { dirname, join, resolve } from "node:path";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
import { addNugetCommand } from "./add-nuget.js";
|
|
17
|
+
import { addPackageCommand } from "./add-package.js";
|
|
18
|
+
import { removeNugetCommand } from "./remove-nuget.js";
|
|
19
|
+
import { updateNugetCommand } from "./update-nuget.js";
|
|
20
|
+
const repoRoot = resolve(join(dirname(fileURLToPath(import.meta.url)), "../../../.."));
|
|
21
|
+
const linkDir = (target, linkPath) => {
|
|
22
|
+
mkdirSync(dirname(linkPath), { recursive: true });
|
|
23
|
+
symlinkSync(target, linkPath, "dir");
|
|
24
|
+
};
|
|
25
|
+
const run = (cwd, command, args) => {
|
|
26
|
+
const result = spawnSync(command, args, { cwd, encoding: "utf-8" });
|
|
27
|
+
if (result.status !== 0) {
|
|
28
|
+
const msg = result.stderr || result.stdout || `Exit code ${result.status}`;
|
|
29
|
+
throw new Error(`${command} ${args.join(" ")} failed:\n${msg}`);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const writeTsonicJson = (dir, fileName = "tsonic.json") => {
|
|
33
|
+
mkdirSync(join(dir, "src"), { recursive: true });
|
|
34
|
+
writeFileSync(join(dir, fileName), JSON.stringify({
|
|
35
|
+
$schema: "https://tsonic.dev/schema/v1.json",
|
|
36
|
+
rootNamespace: "Test",
|
|
37
|
+
entryPoint: "src/App.ts",
|
|
38
|
+
sourceRoot: "src",
|
|
39
|
+
outputDirectory: "generated",
|
|
40
|
+
outputName: "app",
|
|
41
|
+
dotnetVersion: "net10.0",
|
|
42
|
+
dotnet: {
|
|
43
|
+
typeRoots: ["node_modules/@tsonic/globals"],
|
|
44
|
+
libraries: [],
|
|
45
|
+
frameworkReferences: [],
|
|
46
|
+
packageReferences: [],
|
|
47
|
+
},
|
|
48
|
+
}, null, 2) + "\n", "utf-8");
|
|
49
|
+
writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "test", private: true, type: "module" }, null, 2) +
|
|
50
|
+
"\n", "utf-8");
|
|
51
|
+
};
|
|
52
|
+
const writeNugetConfig = (projectRoot, feedDir) => {
|
|
53
|
+
const xml = `<?xml version="1.0" encoding="utf-8"?>
|
|
54
|
+
<configuration>
|
|
55
|
+
<packageSources>
|
|
56
|
+
<clear />
|
|
57
|
+
<add key="local" value="${feedDir}" />
|
|
58
|
+
</packageSources>
|
|
59
|
+
</configuration>
|
|
60
|
+
`;
|
|
61
|
+
writeFileSync(join(projectRoot, "nuget.config"), xml, "utf-8");
|
|
62
|
+
};
|
|
63
|
+
const createNugetPackage = (workDir, feedDir, pkg) => {
|
|
64
|
+
const projDir = join(workDir, `${pkg.id}.${pkg.version}`);
|
|
65
|
+
mkdirSync(projDir, { recursive: true });
|
|
66
|
+
const deps = pkg.deps && pkg.deps.length > 0
|
|
67
|
+
? `<ItemGroup>\n${pkg.deps
|
|
68
|
+
.map((d) => ` <PackageReference Include="${d.id}" Version="${d.version}" />`)
|
|
69
|
+
.join("\n")}\n</ItemGroup>\n`
|
|
70
|
+
: "";
|
|
71
|
+
const csproj = `<Project Sdk="Microsoft.NET.Sdk">
|
|
72
|
+
<PropertyGroup>
|
|
73
|
+
<TargetFramework>net10.0</TargetFramework>
|
|
74
|
+
<ImplicitUsings>false</ImplicitUsings>
|
|
75
|
+
<Nullable>enable</Nullable>
|
|
76
|
+
<PackageId>${pkg.id}</PackageId>
|
|
77
|
+
<Version>${pkg.version}</Version>
|
|
78
|
+
</PropertyGroup>
|
|
79
|
+
${deps}</Project>
|
|
80
|
+
`;
|
|
81
|
+
writeFileSync(join(projDir, `${pkg.id}.csproj`), csproj, "utf-8");
|
|
82
|
+
writeFileSync(join(projDir, "Class1.cs"), `namespace ${pkg.id.replace(/\./g, "_")};\npublic sealed class ${pkg.id
|
|
83
|
+
.split(".")
|
|
84
|
+
.pop()}Type { }\n`, "utf-8");
|
|
85
|
+
// Pack to local feed (uses nuget.config in parent dirs).
|
|
86
|
+
run(projDir, "dotnet", [
|
|
87
|
+
"pack",
|
|
88
|
+
"-c",
|
|
89
|
+
"Release",
|
|
90
|
+
"-o",
|
|
91
|
+
feedDir,
|
|
92
|
+
"--nologo",
|
|
93
|
+
]);
|
|
94
|
+
};
|
|
95
|
+
describe("add commands - dependency closure bindings", function () {
|
|
96
|
+
this.timeout(10 * 60 * 1000);
|
|
97
|
+
it("add nuget generates bindings for transitive deps (A -> B -> C)", () => {
|
|
98
|
+
const dir = mkdtempSync(join(tmpdir(), "tsonic-add-nuget-"));
|
|
99
|
+
try {
|
|
100
|
+
writeTsonicJson(dir);
|
|
101
|
+
// Link required standard bindings packages into the temp project (no network).
|
|
102
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/dotnet"), join(dir, "node_modules/@tsonic/dotnet"));
|
|
103
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/core"), join(dir, "node_modules/@tsonic/core"));
|
|
104
|
+
const feedDir = join(dir, "feed");
|
|
105
|
+
mkdirSync(feedDir, { recursive: true });
|
|
106
|
+
writeNugetConfig(dir, feedDir);
|
|
107
|
+
// Build local NuGet feed packages: Acme.C, Acme.B(depends on C), Acme.A(depends on B).
|
|
108
|
+
createNugetPackage(dir, feedDir, { id: "Acme.C", version: "1.0.0" });
|
|
109
|
+
createNugetPackage(dir, feedDir, {
|
|
110
|
+
id: "Acme.B",
|
|
111
|
+
version: "1.0.0",
|
|
112
|
+
deps: [{ id: "Acme.C", version: "1.0.0" }],
|
|
113
|
+
});
|
|
114
|
+
createNugetPackage(dir, feedDir, {
|
|
115
|
+
id: "Acme.A",
|
|
116
|
+
version: "1.0.0",
|
|
117
|
+
deps: [{ id: "Acme.B", version: "1.0.0" }],
|
|
118
|
+
});
|
|
119
|
+
const result = addNugetCommand("Acme.A", "1.0.0", undefined, join(dir, "tsonic.json"), {
|
|
120
|
+
verbose: false,
|
|
121
|
+
quiet: true,
|
|
122
|
+
});
|
|
123
|
+
expect(result.ok).to.equal(true);
|
|
124
|
+
// Airplane-grade requirement: deps bindings are generated automatically.
|
|
125
|
+
expect(existsSync(join(dir, "node_modules", "acme-a-types"))).to.equal(true);
|
|
126
|
+
expect(existsSync(join(dir, "node_modules", "acme-b-types"))).to.equal(true);
|
|
127
|
+
expect(existsSync(join(dir, "node_modules", "acme-c-types"))).to.equal(true);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
rmSync(dir, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
it("update nuget updates pinned version and keeps bindings green", () => {
|
|
134
|
+
const dir = mkdtempSync(join(tmpdir(), "tsonic-update-nuget-"));
|
|
135
|
+
try {
|
|
136
|
+
writeTsonicJson(dir, "tsonic.custom.json");
|
|
137
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/dotnet"), join(dir, "node_modules/@tsonic/dotnet"));
|
|
138
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/core"), join(dir, "node_modules/@tsonic/core"));
|
|
139
|
+
const feedDir = join(dir, "feed");
|
|
140
|
+
mkdirSync(feedDir, { recursive: true });
|
|
141
|
+
writeNugetConfig(dir, feedDir);
|
|
142
|
+
createNugetPackage(dir, feedDir, { id: "Acme.D", version: "1.0.0" });
|
|
143
|
+
createNugetPackage(dir, feedDir, { id: "Acme.D", version: "1.0.1" });
|
|
144
|
+
const configPath = join(dir, "tsonic.custom.json");
|
|
145
|
+
const add = addNugetCommand("Acme.D", "1.0.0", undefined, configPath, {
|
|
146
|
+
verbose: false,
|
|
147
|
+
quiet: true,
|
|
148
|
+
});
|
|
149
|
+
expect(add.ok).to.equal(true);
|
|
150
|
+
expect(existsSync(join(dir, "node_modules", "acme-d-types"))).to.equal(true);
|
|
151
|
+
const update = updateNugetCommand("Acme.D", "1.0.1", undefined, configPath, { verbose: false, quiet: true });
|
|
152
|
+
expect(update.ok).to.equal(true);
|
|
153
|
+
const updated = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
154
|
+
const pr = updated.dotnet?.packageReferences?.find((p) => p.id === "Acme.D");
|
|
155
|
+
expect(pr?.version).to.equal("1.0.1");
|
|
156
|
+
expect(existsSync(join(dir, "node_modules", "acme-d-types"))).to.equal(true);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
rmSync(dir, { recursive: true, force: true });
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
it("remove nuget removes package reference from config", () => {
|
|
163
|
+
const dir = mkdtempSync(join(tmpdir(), "tsonic-remove-nuget-"));
|
|
164
|
+
try {
|
|
165
|
+
writeTsonicJson(dir);
|
|
166
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/dotnet"), join(dir, "node_modules/@tsonic/dotnet"));
|
|
167
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/core"), join(dir, "node_modules/@tsonic/core"));
|
|
168
|
+
const configPath = join(dir, "tsonic.json");
|
|
169
|
+
const cfg = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
170
|
+
cfg.dotnet = cfg.dotnet ?? {};
|
|
171
|
+
cfg.dotnet.packageReferences = [{ id: "Acme.A", version: "1.0.0" }];
|
|
172
|
+
writeFileSync(configPath, JSON.stringify(cfg, null, 2) + "\n", "utf-8");
|
|
173
|
+
const removed = removeNugetCommand("Acme.A", configPath, {
|
|
174
|
+
verbose: false,
|
|
175
|
+
quiet: true,
|
|
176
|
+
});
|
|
177
|
+
expect(removed.ok).to.equal(true);
|
|
178
|
+
const updated = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
179
|
+
expect(updated.dotnet?.packageReferences).to.deep.equal([]);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
rmSync(dir, { recursive: true, force: true });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
it("add package resolves netstandard-style dependencies under .NET 10", () => {
|
|
186
|
+
const dir = mkdtempSync(join(tmpdir(), "tsonic-add-package-"));
|
|
187
|
+
try {
|
|
188
|
+
writeTsonicJson(dir);
|
|
189
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/dotnet"), join(dir, "node_modules/@tsonic/dotnet"));
|
|
190
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/core"), join(dir, "node_modules/@tsonic/core"));
|
|
191
|
+
// Build a netstandard2.0 library (commonly references netstandard 2.0.0.0).
|
|
192
|
+
const libDir = join(dir, "ns");
|
|
193
|
+
run(dir, "dotnet", [
|
|
194
|
+
"new",
|
|
195
|
+
"classlib",
|
|
196
|
+
"-n",
|
|
197
|
+
"NetStandardLib",
|
|
198
|
+
"-f",
|
|
199
|
+
"netstandard2.0",
|
|
200
|
+
"--no-restore",
|
|
201
|
+
"--output",
|
|
202
|
+
libDir,
|
|
203
|
+
]);
|
|
204
|
+
run(libDir, "dotnet", ["build", "-c", "Release", "--nologo"]);
|
|
205
|
+
const dll = join(libDir, "bin", "Release", "netstandard2.0", "NetStandardLib.dll");
|
|
206
|
+
expect(existsSync(dll)).to.equal(true);
|
|
207
|
+
const add = addPackageCommand(dll, undefined, join(dir, "tsonic.json"), {
|
|
208
|
+
verbose: false,
|
|
209
|
+
quiet: true,
|
|
210
|
+
});
|
|
211
|
+
expect(add.ok).to.equal(true);
|
|
212
|
+
// Should have generated a bindings package in node_modules.
|
|
213
|
+
expect(existsSync(join(dir, "node_modules", "net-standard-lib-types"))).to.equal(true);
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
rmSync(dir, { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
it("add package allows constructor constraint loss by default (use --strict to fail)", () => {
|
|
220
|
+
const makeLib = (dir) => {
|
|
221
|
+
const libDir = join(dir, "ctor");
|
|
222
|
+
run(dir, "dotnet", [
|
|
223
|
+
"new",
|
|
224
|
+
"classlib",
|
|
225
|
+
"-n",
|
|
226
|
+
"CtorConstraintInterfaceLib",
|
|
227
|
+
"-f",
|
|
228
|
+
"net10.0",
|
|
229
|
+
"--no-restore",
|
|
230
|
+
"--output",
|
|
231
|
+
libDir,
|
|
232
|
+
]);
|
|
233
|
+
writeFileSync(join(libDir, "Api.cs"), `namespace CtorConstraintInterfaceLib;\n\npublic interface IFactory<T> where T : new()\n{\n T Make();\n}\n\npublic sealed class Factory<T> : IFactory<T> where T : new()\n{\n public T Make() => new T();\n}\n`, "utf-8");
|
|
234
|
+
run(libDir, "dotnet", ["build", "-c", "Release", "--nologo"]);
|
|
235
|
+
const dll = join(libDir, "bin", "Release", "net10.0", "CtorConstraintInterfaceLib.dll");
|
|
236
|
+
expect(existsSync(dll)).to.equal(true);
|
|
237
|
+
return dll;
|
|
238
|
+
};
|
|
239
|
+
// Default: should succeed (we pass --allow-constructor-constraint-loss).
|
|
240
|
+
const dir = mkdtempSync(join(tmpdir(), "tsonic-ctor-constraint-"));
|
|
241
|
+
try {
|
|
242
|
+
writeTsonicJson(dir);
|
|
243
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/dotnet"), join(dir, "node_modules/@tsonic/dotnet"));
|
|
244
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/core"), join(dir, "node_modules/@tsonic/core"));
|
|
245
|
+
const dll = makeLib(dir);
|
|
246
|
+
const add = addPackageCommand(dll, undefined, join(dir, "tsonic.json"), {
|
|
247
|
+
verbose: false,
|
|
248
|
+
quiet: true,
|
|
249
|
+
});
|
|
250
|
+
expect(add.ok).to.equal(true);
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
rmSync(dir, { recursive: true, force: true });
|
|
254
|
+
}
|
|
255
|
+
// Strict: should fail with TBG406.
|
|
256
|
+
const dirStrict = mkdtempSync(join(tmpdir(), "tsonic-ctor-constraint-strict-"));
|
|
257
|
+
try {
|
|
258
|
+
writeTsonicJson(dirStrict);
|
|
259
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/dotnet"), join(dirStrict, "node_modules/@tsonic/dotnet"));
|
|
260
|
+
linkDir(join(repoRoot, "node_modules/@tsonic/core"), join(dirStrict, "node_modules/@tsonic/core"));
|
|
261
|
+
const dll = makeLib(dirStrict);
|
|
262
|
+
const add = addPackageCommand(dll, undefined, join(dirStrict, "tsonic.json"), {
|
|
263
|
+
verbose: false,
|
|
264
|
+
quiet: true,
|
|
265
|
+
strict: true,
|
|
266
|
+
});
|
|
267
|
+
expect(add.ok).to.equal(false);
|
|
268
|
+
if (add.ok === false) {
|
|
269
|
+
expect(add.error).to.include("TBG406");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
rmSync(dirStrict, { recursive: true, force: true });
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
//# sourceMappingURL=add-deps.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-deps.test.js","sourceRoot":"","sources":["../../src/commands/add-deps.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import type { Result } from "../types.js";
|
|
11
11
|
import { type AddCommandOptions } from "./add-common.js";
|
|
12
12
|
export type AddFrameworkOptions = AddCommandOptions;
|
|
13
|
-
export declare const addFrameworkCommand: (frameworkReference: string, typesPackage: string | undefined,
|
|
13
|
+
export declare const addFrameworkCommand: (frameworkReference: string, typesPackage: string | undefined, configPath: string, options?: AddFrameworkOptions) => Result<{
|
|
14
14
|
frameworkReference: string;
|
|
15
15
|
bindings: string;
|
|
16
16
|
}, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-framework.d.ts","sourceRoot":"","sources":["../../src/commands/add-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"add-framework.d.ts","sourceRoot":"","sources":["../../src/commands/add-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAGxD,OAAO,EAYL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAcpD,eAAO,MAAM,mBAAmB,GAC9B,oBAAoB,MAAM,EAC1B,cAAc,MAAM,GAAG,SAAS,EAChC,YAAY,MAAM,EAClB,UAAS,mBAAwB,KAChC,MAAM,CAAC;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CAsIjE,CAAC"}
|
|
@@ -7,32 +7,57 @@
|
|
|
7
7
|
* If typesPackage is omitted, bindings are auto-generated via tsbindgen from the
|
|
8
8
|
* installed shared framework assemblies.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { defaultBindingsPackageNameForFramework, detectTsbindgenNaming,
|
|
13
|
-
const
|
|
14
|
-
if (!arr.includes(value))
|
|
15
|
-
arr.push(value);
|
|
16
|
-
};
|
|
10
|
+
import { loadConfig } from "../config.js";
|
|
11
|
+
import { dirname } from "node:path";
|
|
12
|
+
import { bindingsStoreDir, defaultBindingsPackageNameForFramework, detectTsbindgenNaming, ensureGeneratedBindingsPackageJson, installGeneratedBindingsPackage, listDotnetRuntimes, npmInstallDevDependency, resolveFromProjectRoot, resolvePackageRoot, resolveTsbindgenDllPath, tsbindgenGenerate, writeTsonicJson, } from "./add-common.js";
|
|
13
|
+
const normalizeFrameworkRefId = (value) => typeof value === "string" ? value : value.id;
|
|
17
14
|
const isValidTypesPackageName = (name) => {
|
|
18
15
|
if (!name.startsWith("@") && !name.includes("/"))
|
|
19
16
|
return true;
|
|
20
17
|
return /^@[a-z0-9-]+\/[a-z0-9-]+$/i.test(name);
|
|
21
18
|
};
|
|
22
|
-
export const addFrameworkCommand = (frameworkReference, typesPackage,
|
|
19
|
+
export const addFrameworkCommand = (frameworkReference, typesPackage, configPath, options = {}) => {
|
|
20
|
+
const projectRoot = dirname(configPath);
|
|
23
21
|
if (!frameworkReference.trim()) {
|
|
24
22
|
return { ok: false, error: "Framework reference must be non-empty" };
|
|
25
23
|
}
|
|
26
24
|
if (typesPackage !== undefined && !isValidTypesPackageName(typesPackage)) {
|
|
27
25
|
return { ok: false, error: `Invalid types package name: ${typesPackage}` };
|
|
28
26
|
}
|
|
29
|
-
const tsonicConfigResult =
|
|
27
|
+
const tsonicConfigResult = loadConfig(configPath);
|
|
30
28
|
if (!tsonicConfigResult.ok)
|
|
31
29
|
return tsonicConfigResult;
|
|
32
|
-
const
|
|
30
|
+
const config = tsonicConfigResult.value;
|
|
33
31
|
const dotnet = config.dotnet ?? {};
|
|
34
|
-
const frameworkRefs = [
|
|
35
|
-
|
|
32
|
+
const frameworkRefs = [
|
|
33
|
+
...(dotnet.frameworkReferences ?? []),
|
|
34
|
+
];
|
|
35
|
+
const idx = frameworkRefs.findIndex((r) => normalizeFrameworkRefId(r).toLowerCase() ===
|
|
36
|
+
frameworkReference.toLowerCase());
|
|
37
|
+
if (idx >= 0) {
|
|
38
|
+
const existing = frameworkRefs[idx];
|
|
39
|
+
if (typesPackage) {
|
|
40
|
+
if (typeof existing === "string") {
|
|
41
|
+
frameworkRefs[idx] = { id: existing, types: typesPackage };
|
|
42
|
+
}
|
|
43
|
+
else if (existing.types && existing.types !== typesPackage) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
error: `Framework reference already present with a different types package:\n` +
|
|
47
|
+
`- ${frameworkReference}\n` +
|
|
48
|
+
`- existing: ${existing.types}\n` +
|
|
49
|
+
`- requested: ${typesPackage}\n` +
|
|
50
|
+
`Refusing to change automatically (airplane-grade). Update tsonic.json manually if intended.`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
frameworkRefs[idx] = { ...existing, types: typesPackage };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
frameworkRefs.push(typesPackage ? { id: frameworkReference, types: typesPackage } : frameworkReference);
|
|
60
|
+
}
|
|
36
61
|
const nextConfig = {
|
|
37
62
|
...config,
|
|
38
63
|
dotnet: {
|
|
@@ -69,25 +94,21 @@ export const addFrameworkCommand = (frameworkReference, typesPackage, projectRoo
|
|
|
69
94
|
`Installed runtimes:\n${available}`,
|
|
70
95
|
};
|
|
71
96
|
}
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (!existsSync(join(coreLib, "package.json"))) {
|
|
81
|
-
return {
|
|
82
|
-
ok: false,
|
|
83
|
-
error: "Missing @tsonic/core in node_modules. Run 'tsonic project init' (recommended) or install it manually.",
|
|
84
|
-
};
|
|
85
|
-
}
|
|
97
|
+
const dotnetRoot = resolvePackageRoot(projectRoot, "@tsonic/dotnet");
|
|
98
|
+
if (!dotnetRoot.ok)
|
|
99
|
+
return dotnetRoot;
|
|
100
|
+
const coreRoot = resolvePackageRoot(projectRoot, "@tsonic/core");
|
|
101
|
+
if (!coreRoot.ok)
|
|
102
|
+
return coreRoot;
|
|
103
|
+
const dotnetLib = dotnetRoot.value;
|
|
104
|
+
const coreLib = coreRoot.value;
|
|
86
105
|
const naming = detectTsbindgenNaming(nextConfig);
|
|
87
106
|
const generatedPackage = defaultBindingsPackageNameForFramework(frameworkReference);
|
|
88
|
-
const bindingsDir =
|
|
89
|
-
|
|
90
|
-
|
|
107
|
+
const bindingsDir = bindingsStoreDir(projectRoot, "framework", generatedPackage);
|
|
108
|
+
const packageJsonResult = ensureGeneratedBindingsPackageJson(bindingsDir, generatedPackage, {
|
|
109
|
+
kind: "framework",
|
|
110
|
+
source: { frameworkReference },
|
|
111
|
+
});
|
|
91
112
|
if (!packageJsonResult.ok)
|
|
92
113
|
return packageJsonResult;
|
|
93
114
|
const generateArgs = [
|
|
@@ -111,12 +132,9 @@ export const addFrameworkCommand = (frameworkReference, typesPackage, projectRoo
|
|
|
111
132
|
const genResult = tsbindgenGenerate(projectRoot, tsbindgenDll, generateArgs, options);
|
|
112
133
|
if (!genResult.ok)
|
|
113
134
|
return genResult;
|
|
114
|
-
const
|
|
115
|
-
if (!
|
|
116
|
-
return
|
|
117
|
-
const installLocal = npmInstallDevDependency(projectRoot, `file:bindings/${generatedPackage}`, options);
|
|
118
|
-
if (!installLocal.ok)
|
|
119
|
-
return installLocal;
|
|
135
|
+
const installResult = installGeneratedBindingsPackage(projectRoot, generatedPackage, bindingsDir);
|
|
136
|
+
if (!installResult.ok)
|
|
137
|
+
return installResult;
|
|
120
138
|
return {
|
|
121
139
|
ok: true,
|
|
122
140
|
value: { frameworkReference, bindings: generatedPackage },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-framework.js","sourceRoot":"","sources":["../../src/commands/add-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"add-framework.js","sourceRoot":"","sources":["../../src/commands/add-framework.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
* Usage:
|
|
5
5
|
* tsonic add nuget <PackageId> <Version> [typesPackage]
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Airplane-grade rules:
|
|
8
|
+
* - Versions are pinned (no automatic upgrades/downgrades)
|
|
9
|
+
* - If a types package is provided, we do NOT auto-generate bindings
|
|
10
|
+
* - If types are omitted, we auto-generate bindings for the full transitive closure
|
|
11
|
+
* via `tsonic restore` (single source of truth)
|
|
9
12
|
*/
|
|
10
13
|
import type { Result } from "../types.js";
|
|
11
14
|
import { type AddCommandOptions } from "./add-common.js";
|
|
12
15
|
export type AddNugetOptions = AddCommandOptions;
|
|
13
|
-
export declare const addNugetCommand: (
|
|
16
|
+
export declare const addNugetCommand: (id: string, ver: string, typesPackage: string | undefined, configPath: string, options?: AddNugetOptions) => Result<{
|
|
14
17
|
packageId: string;
|
|
15
18
|
version: string;
|
|
16
19
|
bindings: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-nuget.d.ts","sourceRoot":"","sources":["../../src/commands/add-nuget.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"add-nuget.d.ts","sourceRoot":"","sources":["../../src/commands/add-nuget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAGxD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAehD,eAAO,MAAM,eAAe,GAC1B,IAAI,MAAM,EACV,KAAK,MAAM,EACX,cAAc,MAAM,GAAG,SAAS,EAChC,YAAY,MAAM,EAClB,UAAS,eAAoB,KAC5B,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CAoFzE,CAAC"}
|