@tsonic/cli 0.0.63 → 0.0.64

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/.tsbuildinfo +1 -1
  2. package/dist/aikya/bindings.d.ts +44 -0
  3. package/dist/aikya/bindings.d.ts.map +1 -0
  4. package/dist/aikya/bindings.js +777 -0
  5. package/dist/aikya/bindings.js.map +1 -0
  6. package/dist/aikya/bindings.test.d.ts +2 -0
  7. package/dist/aikya/bindings.test.d.ts.map +1 -0
  8. package/dist/aikya/bindings.test.js +554 -0
  9. package/dist/aikya/bindings.test.js.map +1 -0
  10. package/dist/cli/dispatcher.d.ts.map +1 -1
  11. package/dist/cli/dispatcher.js +15 -0
  12. package/dist/cli/dispatcher.js.map +1 -1
  13. package/dist/cli/help.d.ts.map +1 -1
  14. package/dist/cli/help.js +4 -1
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/parser.d.ts.map +1 -1
  17. package/dist/cli/parser.js +6 -0
  18. package/dist/cli/parser.js.map +1 -1
  19. package/dist/cli/parser.test.js +10 -0
  20. package/dist/cli/parser.test.js.map +1 -1
  21. package/dist/commands/add-npm.d.ts +3 -2
  22. package/dist/commands/add-npm.d.ts.map +1 -1
  23. package/dist/commands/add-npm.js +69 -177
  24. package/dist/commands/add-npm.js.map +1 -1
  25. package/dist/commands/add-npm.test.js +276 -2
  26. package/dist/commands/add-npm.test.js.map +1 -1
  27. package/dist/commands/build-library-bindings-aliases.test.js +349 -4
  28. package/dist/commands/build-library-bindings-aliases.test.js.map +1 -1
  29. package/dist/commands/build.d.ts.map +1 -1
  30. package/dist/commands/build.js +168 -148
  31. package/dist/commands/build.js.map +1 -1
  32. package/dist/commands/build.test.js +22 -3
  33. package/dist/commands/build.test.js.map +1 -1
  34. package/dist/commands/generate.d.ts.map +1 -1
  35. package/dist/commands/generate.js +5 -0
  36. package/dist/commands/generate.js.map +1 -1
  37. package/dist/commands/init.d.ts +5 -2
  38. package/dist/commands/init.d.ts.map +1 -1
  39. package/dist/commands/init.js +42 -7
  40. package/dist/commands/init.js.map +1 -1
  41. package/dist/commands/init.test.js +82 -2
  42. package/dist/commands/init.test.js.map +1 -1
  43. package/dist/commands/library-bindings-augment.d.ts.map +1 -1
  44. package/dist/commands/library-bindings-augment.js +376 -53
  45. package/dist/commands/library-bindings-augment.js.map +1 -1
  46. package/dist/commands/library-bindings-augment.test.js +460 -2
  47. package/dist/commands/library-bindings-augment.test.js.map +1 -1
  48. package/dist/commands/library-bindings-firstparty-regressions.test.d.ts +2 -0
  49. package/dist/commands/library-bindings-firstparty-regressions.test.d.ts.map +1 -0
  50. package/dist/commands/library-bindings-firstparty-regressions.test.js +217 -0
  51. package/dist/commands/library-bindings-firstparty-regressions.test.js.map +1 -0
  52. package/dist/commands/library-bindings-firstparty.d.ts +3 -0
  53. package/dist/commands/library-bindings-firstparty.d.ts.map +1 -0
  54. package/dist/commands/library-bindings-firstparty.js +2250 -0
  55. package/dist/commands/library-bindings-firstparty.js.map +1 -0
  56. package/dist/commands/restore.d.ts.map +1 -1
  57. package/dist/commands/restore.js +3 -1
  58. package/dist/commands/restore.js.map +1 -1
  59. package/dist/commands/restore.test.js +29 -0
  60. package/dist/commands/restore.test.js.map +1 -1
  61. package/dist/commands/run-build-regressions.test.js +72 -0
  62. package/dist/commands/run-build-regressions.test.js.map +1 -1
  63. package/dist/config.d.ts.map +1 -1
  64. package/dist/config.js +16 -2
  65. package/dist/config.js.map +1 -1
  66. package/dist/config.test.js +57 -0
  67. package/dist/config.test.js.map +1 -1
  68. package/dist/dotnet/runtime-dlls.d.ts +1 -0
  69. package/dist/dotnet/runtime-dlls.d.ts.map +1 -1
  70. package/dist/dotnet/runtime-dlls.js +1 -0
  71. package/dist/dotnet/runtime-dlls.js.map +1 -1
  72. package/dist/surface/profiles.d.ts +10 -0
  73. package/dist/surface/profiles.d.ts.map +1 -0
  74. package/dist/surface/profiles.js +61 -0
  75. package/dist/surface/profiles.js.map +1 -0
  76. package/dist/surface/profiles.test.d.ts +2 -0
  77. package/dist/surface/profiles.test.d.ts.map +1 -0
  78. package/dist/surface/profiles.test.js +49 -0
  79. package/dist/surface/profiles.test.js.map +1 -0
  80. package/dist/types.d.ts +10 -0
  81. package/dist/types.d.ts.map +1 -1
  82. package/package.json +4 -4
@@ -5,31 +5,29 @@
5
5
  * Usage:
6
6
  * tsonic add npm <packageSpec>
7
7
  *
8
- * The npm package must include `tsonic.bindings.json` at its package root.
9
- * That manifest is the ONLY mechanism used to discover .NET deps (airplane-grade).
8
+ * Supported manifest contracts (airplane-grade):
9
+ * - `tsonic/package-manifest.json` (Aikya)
10
+ * - `tsonic.bindings.json` (legacy/external)
10
11
  */
11
- import { existsSync, readFileSync } from "node:fs";
12
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
12
13
  import { dirname, join, resolve } from "node:path";
13
14
  import { loadWorkspaceConfig } from "../config.js";
14
15
  import { npmInstallDevDependency, resolvePackageRoot, writeTsonicJson, } from "./add-common.js";
15
- const normalizeId = (id) => id.trim().toLowerCase();
16
+ import { discoverWorkspaceBindingsManifests, mergeManifestIntoWorkspaceConfig, resolveInstalledPackageBindingsManifest, } from "../aikya/bindings.js";
16
17
  const parseNpmPackageName = (rawSpec) => {
17
18
  const spec = rawSpec.trim();
18
19
  if (!spec)
19
20
  return null;
20
- // Reject path-ish specs; these are handled separately.
21
21
  if (spec.startsWith("file:") ||
22
22
  spec.startsWith(".") ||
23
23
  spec.startsWith("/") ||
24
24
  spec.includes("\\")) {
25
25
  return null;
26
26
  }
27
- // Scoped: @scope/pkg[@ver]
28
27
  if (spec.startsWith("@")) {
29
28
  const match = spec.match(/^(@[^/]+\/[^@/]+)(?:@.+)?$/);
30
29
  return match?.[1] ?? null;
31
30
  }
32
- // Unscoped: pkg[@ver]
33
31
  const match = spec.match(/^([^@/]+)(?:@.+)?$/);
34
32
  return match?.[1] ?? null;
35
33
  };
@@ -80,130 +78,28 @@ const resolvePackageNameFromSpec = (workspaceRoot, packageSpec) => {
80
78
  `Use a standard npm spec (e.g., @scope/pkg@1.2.3) or a local directory (file:./path).`,
81
79
  };
82
80
  };
83
- const readBindingsManifest = (pkgRoot) => {
84
- const manifestPath = join(pkgRoot, "tsonic.bindings.json");
85
- if (!existsSync(manifestPath)) {
86
- return {
87
- ok: false,
88
- error: `Missing tsonic.bindings.json in npm package: ${pkgRoot}\n` +
89
- `This package does not declare its .NET dependency graph for Tsonic.`,
90
- };
91
- }
81
+ const writeNormalizedBindingsManifest = (workspaceRoot, packageName, manifest) => {
82
+ const outDir = join(workspaceRoot, ".tsonic", "manifests", "npm", packageName);
83
+ const outPath = join(outDir, "tsonic.bindings.normalized.json");
92
84
  try {
93
- const parsed = JSON.parse(readFileSync(manifestPath, "utf-8"));
94
- if (parsed === null || typeof parsed !== "object") {
95
- return {
96
- ok: false,
97
- error: `Invalid tsonic.bindings.json (must be an object): ${manifestPath}`,
98
- };
99
- }
100
- return { ok: true, value: parsed };
85
+ mkdirSync(outDir, { recursive: true });
86
+ writeFileSync(outPath, JSON.stringify(manifest, null, 2) + "\n", "utf-8");
87
+ return { ok: true, value: undefined };
101
88
  }
102
89
  catch (error) {
103
90
  return {
104
91
  ok: false,
105
- error: `Failed to parse tsonic.bindings.json: ${error instanceof Error ? error.message : String(error)}`,
92
+ error: `Failed to write normalized bindings manifest: ${error instanceof Error ? error.message : String(error)}`,
106
93
  };
107
94
  }
108
95
  };
109
- const mergeFrameworkReferences = (existing, incoming) => {
110
- const out = [...existing];
111
- const byId = new Map();
112
- for (const ref of out) {
113
- const id = typeof ref === "string" ? ref : ref.id;
114
- byId.set(normalizeId(id), ref);
115
- }
116
- for (const ref of incoming) {
117
- const id = typeof ref === "string" ? ref : ref.id;
118
- const key = normalizeId(id);
119
- const current = byId.get(key);
120
- if (!current) {
121
- out.push(ref);
122
- byId.set(key, ref);
123
- continue;
124
- }
125
- const currentTypes = typeof current === "string" ? undefined : current.types;
126
- const nextTypes = typeof ref === "string" ? undefined : ref.types;
127
- if (nextTypes !== undefined &&
128
- currentTypes !== undefined &&
129
- currentTypes !== nextTypes) {
130
- return {
131
- ok: false,
132
- error: `Conflicting framework types mapping for '${id}'.\n` +
133
- `Existing: ${String(currentTypes)}\n` +
134
- `Manifest: ${String(nextTypes)}\n` +
135
- `Refusing to change automatically (airplane-grade). Update tsonic.workspace.json manually if intended.`,
136
- };
137
- }
138
- // If existing is string and incoming has types, upgrade entry to object.
139
- if (typeof current === "string" && typeof ref !== "string") {
140
- const idx = out.findIndex((x) => (typeof x === "string" ? x : x.id).toLowerCase() ===
141
- current.toLowerCase());
142
- if (idx >= 0)
143
- out[idx] = { id: current, types: ref.types };
144
- byId.set(key, out[idx]);
145
- }
146
- }
147
- return { ok: true, value: out };
148
- };
149
- const mergePackageReferences = (existing, incoming) => {
150
- const out = [...existing];
151
- const byId = new Map();
152
- for (const p of out)
153
- byId.set(normalizeId(p.id), p);
154
- for (const p of incoming) {
155
- const key = normalizeId(p.id);
156
- const current = byId.get(key);
157
- if (!current) {
158
- out.push(p);
159
- byId.set(key, p);
160
- continue;
161
- }
162
- if (current.version !== p.version) {
163
- return {
164
- ok: false,
165
- error: `NuGet package already present with a different version: ${current.id} ${current.version}\n` +
166
- `Manifest requested: ${p.id} ${p.version}\n` +
167
- `Refusing to change versions automatically (airplane-grade). Update tsonic.workspace.json manually if intended.`,
168
- };
169
- }
170
- if (p.types !== undefined &&
171
- current.types !== undefined &&
172
- current.types !== p.types) {
173
- return {
174
- ok: false,
175
- error: `NuGet package already present with a different types mapping:\n` +
176
- `- ${current.id} ${current.version}\n` +
177
- `- existing: ${String(current.types)}\n` +
178
- `- manifest: ${String(p.types)}\n` +
179
- `Refusing to change automatically (airplane-grade). Update tsonic.workspace.json manually if intended.`,
180
- };
181
- }
182
- if (current.types === undefined && p.types !== undefined) {
183
- const idx = out.findIndex((x) => normalizeId(x.id) === key);
184
- if (idx >= 0)
185
- out[idx] = { ...current, types: p.types };
186
- byId.set(key, out[idx]);
187
- }
188
- }
189
- return { ok: true, value: out };
190
- };
191
- const mergeMsbuildProperties = (existing, incoming) => {
192
- const out = { ...existing };
193
- for (const [k, v] of Object.entries(incoming)) {
194
- const current = out[k];
195
- if (current !== undefined && current !== v) {
196
- return {
197
- ok: false,
198
- error: `Conflicting msbuildProperties for key '${k}'.\n` +
199
- `Existing: ${current}\n` +
200
- `Manifest: ${v}\n` +
201
- `Refusing to change automatically (airplane-grade). Update tsonic.workspace.json manually if intended.`,
202
- };
203
- }
204
- out[k] = v;
96
+ const writeNormalizedBindingsManifests = (workspaceRoot, manifests) => {
97
+ for (const manifest of manifests) {
98
+ const writeResult = writeNormalizedBindingsManifest(workspaceRoot, manifest.packageName, manifest);
99
+ if (!writeResult.ok)
100
+ return writeResult;
205
101
  }
206
- return { ok: true, value: out };
102
+ return { ok: true, value: undefined };
207
103
  };
208
104
  const installTypesPackages = (workspaceRoot, manifest, selfPackageName, options) => {
209
105
  const typesToInstall = new Set();
@@ -217,7 +113,6 @@ const installTypesPackages = (workspaceRoot, manifest, selfPackageName, options)
217
113
  if (typeof p.types === "string")
218
114
  typesToInstall.add(p.types);
219
115
  }
220
- // If the manifest points back at itself, avoid re-installing redundantly.
221
116
  typesToInstall.delete(selfPackageName);
222
117
  for (const pkg of typesToInstall) {
223
118
  const r = npmInstallDevDependency(workspaceRoot, pkg, options);
@@ -226,78 +121,75 @@ const installTypesPackages = (workspaceRoot, manifest, selfPackageName, options)
226
121
  }
227
122
  return { ok: true, value: undefined };
228
123
  };
124
+ const installTypesPackagesForManifests = (workspaceRoot, manifests, options) => {
125
+ for (const manifest of manifests) {
126
+ const dotnetTypesResult = installTypesPackages(workspaceRoot, manifest.dotnet, manifest.packageName, options);
127
+ if (!dotnetTypesResult.ok)
128
+ return dotnetTypesResult;
129
+ const testTypesResult = installTypesPackages(workspaceRoot, manifest.testDotnet, manifest.packageName, options);
130
+ if (!testTypesResult.ok)
131
+ return testTypesResult;
132
+ }
133
+ return { ok: true, value: undefined };
134
+ };
229
135
  export const addNpmCommand = (packageSpec, configPath, options = {}) => {
230
136
  const workspaceRoot = dirname(configPath);
231
137
  const nameResult = resolvePackageNameFromSpec(workspaceRoot, packageSpec);
232
138
  if (!nameResult.ok)
233
139
  return nameResult;
234
- const packageName = nameResult.value;
140
+ const requestedPackageName = nameResult.value;
235
141
  const installResult = npmInstallDevDependency(workspaceRoot, packageSpec, options);
236
142
  if (!installResult.ok)
237
143
  return installResult;
238
- const pkgRootResult = resolvePackageRoot(workspaceRoot, packageName);
144
+ const pkgRootResult = resolvePackageRoot(workspaceRoot, requestedPackageName);
239
145
  if (!pkgRootResult.ok)
240
146
  return pkgRootResult;
241
147
  const pkgRoot = pkgRootResult.value;
242
- const manifestResult = readBindingsManifest(pkgRoot);
148
+ const manifestResult = resolveInstalledPackageBindingsManifest(pkgRoot);
243
149
  if (!manifestResult.ok)
244
150
  return manifestResult;
245
151
  const manifest = manifestResult.value;
152
+ if (!manifest) {
153
+ return {
154
+ ok: false,
155
+ error: `Missing manifest in npm package: ${pkgRoot}\n` +
156
+ `Expected one of:\n` +
157
+ `- tsonic/package-manifest.json\n` +
158
+ `- tsonic.bindings.json`,
159
+ };
160
+ }
161
+ const discovered = discoverWorkspaceBindingsManifests(workspaceRoot);
162
+ if (!discovered.ok)
163
+ return discovered;
164
+ const resolvedManifests = discovered.value;
165
+ const requestedResolved = resolvedManifests.some((m) => m.packageName === manifest.packageName &&
166
+ m.packageVersion === manifest.packageVersion);
167
+ if (!requestedResolved) {
168
+ return {
169
+ ok: false,
170
+ error: `Installed npm package '${manifest.packageName}@${manifest.packageVersion}' ` +
171
+ `was not found during workspace manifest discovery.`,
172
+ };
173
+ }
174
+ const writeAllResult = writeNormalizedBindingsManifests(workspaceRoot, resolvedManifests);
175
+ if (!writeAllResult.ok)
176
+ return writeAllResult;
246
177
  const configResult = loadWorkspaceConfig(configPath);
247
178
  if (!configResult.ok)
248
179
  return configResult;
249
- const config = configResult.value;
250
- const dotnet = config.dotnet ?? {};
251
- const testDotnet = config.testDotnet ?? {};
252
- const mergedFramework = mergeFrameworkReferences((dotnet.frameworkReferences ?? []), (manifest.dotnet?.frameworkReferences ?? []));
253
- if (!mergedFramework.ok)
254
- return mergedFramework;
255
- const mergedPackages = mergePackageReferences((dotnet.packageReferences ?? []), (manifest.dotnet?.packageReferences ?? []));
256
- if (!mergedPackages.ok)
257
- return mergedPackages;
258
- const mergedMsbuild = mergeMsbuildProperties((dotnet.msbuildProperties ?? {}), (manifest.dotnet?.msbuildProperties ?? {}));
259
- if (!mergedMsbuild.ok)
260
- return mergedMsbuild;
261
- const mergedTestFramework = mergeFrameworkReferences((testDotnet.frameworkReferences ?? []), (manifest.testDotnet?.frameworkReferences ??
262
- []));
263
- if (!mergedTestFramework.ok)
264
- return mergedTestFramework;
265
- const mergedTestPackages = mergePackageReferences((testDotnet.packageReferences ?? []), (manifest.testDotnet?.packageReferences ?? []));
266
- if (!mergedTestPackages.ok)
267
- return mergedTestPackages;
268
- const mergedTestMsbuild = mergeMsbuildProperties((testDotnet.msbuildProperties ?? {}), (manifest.testDotnet?.msbuildProperties ?? {}));
269
- if (!mergedTestMsbuild.ok)
270
- return mergedTestMsbuild;
271
- const nextConfig = {
272
- ...config,
273
- dotnet: {
274
- ...dotnet,
275
- frameworkReferences: mergedFramework.value,
276
- packageReferences: mergedPackages.value,
277
- msbuildProperties: Object.keys(mergedMsbuild.value).length > 0
278
- ? mergedMsbuild.value
279
- : undefined,
280
- },
281
- testDotnet: manifest.testDotnet
282
- ? {
283
- ...testDotnet,
284
- frameworkReferences: mergedTestFramework.value,
285
- packageReferences: mergedTestPackages.value,
286
- msbuildProperties: Object.keys(mergedTestMsbuild.value).length > 0
287
- ? mergedTestMsbuild.value
288
- : undefined,
289
- }
290
- : config.testDotnet,
291
- };
292
- const writeResult = writeTsonicJson(configPath, nextConfig);
180
+ let mergedConfig = configResult.value;
181
+ for (const item of resolvedManifests) {
182
+ const merged = mergeManifestIntoWorkspaceConfig(mergedConfig, item);
183
+ if (!merged.ok)
184
+ return merged;
185
+ mergedConfig = merged.value;
186
+ }
187
+ const writeResult = writeTsonicJson(configPath, mergedConfig);
293
188
  if (!writeResult.ok)
294
189
  return writeResult;
295
- const dotnetTypesResult = installTypesPackages(workspaceRoot, manifest.dotnet, packageName, options);
296
- if (!dotnetTypesResult.ok)
297
- return dotnetTypesResult;
298
- const testTypesResult = installTypesPackages(workspaceRoot, manifest.testDotnet, packageName, options);
299
- if (!testTypesResult.ok)
300
- return testTypesResult;
301
- return { ok: true, value: { packageName } };
190
+ const typesResult = installTypesPackagesForManifests(workspaceRoot, resolvedManifests, options);
191
+ if (!typesResult.ok)
192
+ return typesResult;
193
+ return { ok: true, value: { packageName: manifest.packageName } };
302
194
  };
303
195
  //# sourceMappingURL=add-npm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-npm.js","sourceRoot":"","sources":["../../src/commands/add-npm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AAezB,MAAM,WAAW,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAEpE,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAiB,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,uDAAuD;IACvD,IACE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACvD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,sBAAsB;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC/C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,aAAqB,EACrB,OAAe,EACA,EAAE;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5E,IACE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EACvB,CAAC;QACD,OAAO,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAA0B,EAAE;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,OAAO,EAAE,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAEvD,CAAC;QACF,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3D,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,0CAA0C,OAAO,EAAE;aAC3D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACjG,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CACjC,aAAqB,EACrB,WAAmB,EACK,EAAE;IAC1B,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,QAAQ;QAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EACH,gDAAgD,WAAW,IAAI;YAC/D,sFAAsF;KACzF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,OAAe,EACyB,EAAE;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EACH,gDAAgD,OAAO,IAAI;gBAC3D,qEAAqE;SACxE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAY,CAAC;QAC1E,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,qDAAqD,YAAY,EAAE;aAC3E,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAgC,EAAE,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACzG,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAC/B,QAA6C,EAC7C,QAA6C,EACD,EAAE;IAC9C,MAAM,GAAG,GAA+B,CAAC,GAAG,QAAQ,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoC,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAChB,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1D,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QAElE,IACE,SAAS,KAAK,SAAS;YACvB,YAAY,KAAK,SAAS;YAC1B,YAAY,KAAK,SAAS,EAC1B,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,4CAA4C,EAAE,MAAM;oBACpD,aAAa,MAAM,CAAC,YAAY,CAAC,IAAI;oBACrC,aAAa,MAAM,CAAC,SAAS,CAAC,IAAI;oBAClC,uGAAuG;aAC1G,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CACvB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;gBAChD,OAAO,CAAC,WAAW,EAAE,CACxB,CAAC;YACF,IAAI,GAAG,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAA6B,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC7B,QAA2C,EAC3C,QAA2C,EACD,EAAE;IAC5C,MAAM,GAAG,GAA6B,CAAC,GAAG,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkC,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,2DAA2D,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,OAAO,IAAI;oBAC5F,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI;oBAC5C,gHAAgH;aACnH,CAAC;QACJ,CAAC;QAED,IACE,CAAC,CAAC,KAAK,KAAK,SAAS;YACrB,OAAO,CAAC,KAAK,KAAK,SAAS;YAC3B,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EACzB,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,iEAAiE;oBACjE,KAAK,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,OAAO,IAAI;oBACtC,eAAe,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;oBACxC,eAAe,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;oBAClC,uGAAuG;aAC1G,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAA2B,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAC7B,QAA0C,EAC1C,QAA0C,EACF,EAAE;IAC1C,MAAM,GAAG,GAA2B,EAAE,GAAG,QAAQ,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,0CAA0C,CAAC,MAAM;oBACjD,aAAa,OAAO,IAAI;oBACxB,aAAa,CAAC,IAAI;oBAClB,uGAAuG;aAC1G,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,aAAqB,EACrB,QAAoC,EACpC,eAAuB,EACvB,OAAsB,EACA,EAAE;IACxB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAC;QACtD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QACtC,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAAE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,uBAAuB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,WAAmB,EACnB,UAAkB,EAClB,UAAyB,EAAE,EACuB,EAAE;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,0BAA0B,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,UAAU,CAAC;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;IAErC,MAAM,aAAa,GAAG,uBAAuB,CAC3C,aAAa,EACb,WAAW,EACX,OAAO,CACR,CAAC;IACF,IAAI,CAAC,aAAa,CAAC,EAAE;QAAE,OAAO,aAAa,CAAC;IAE5C,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrE,IAAI,CAAC,aAAa,CAAC,EAAE;QAAE,OAAO,aAAa,CAAC;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC;IAEpC,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,cAAc,CAAC,EAAE;QAAE,OAAO,cAAc,CAAC;IAC9C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;IAEtC,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,CAAC,EAAE;QAAE,OAAO,YAAY,CAAC;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;IAElC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAE3C,MAAM,eAAe,GAAG,wBAAwB,CAC9C,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAA+B,EAChE,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,IAAI,EAAE,CAA+B,CAC3E,CAAC;IACF,IAAI,CAAC,eAAe,CAAC,EAAE;QAAE,OAAO,eAAe,CAAC;IAEhD,MAAM,cAAc,GAAG,sBAAsB,CAC3C,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAA6B,EAC5D,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE,CAA6B,CACvE,CAAC;IACF,IAAI,CAAC,cAAc,CAAC,EAAE;QAAE,OAAO,cAAc,CAAC;IAE9C,MAAM,aAAa,GAAG,sBAAsB,CAC1C,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAA2B,EAC1D,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,IAAI,EAAE,CAA2B,CACrE,CAAC;IACF,IAAI,CAAC,aAAa,CAAC,EAAE;QAAE,OAAO,aAAa,CAAC;IAE5C,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAA+B,EACpE,CAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB;QACvC,EAAE,CAA+B,CACpC,CAAC;IACF,IAAI,CAAC,mBAAmB,CAAC,EAAE;QAAE,OAAO,mBAAmB,CAAC;IAExD,MAAM,kBAAkB,GAAG,sBAAsB,CAC/C,CAAC,UAAU,CAAC,iBAAiB,IAAI,EAAE,CAA6B,EAChE,CAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,IAAI,EAAE,CAA6B,CAC3E,CAAC;IACF,IAAI,CAAC,kBAAkB,CAAC,EAAE;QAAE,OAAO,kBAAkB,CAAC;IAEtD,MAAM,iBAAiB,GAAG,sBAAsB,CAC9C,CAAC,UAAU,CAAC,iBAAiB,IAAI,EAAE,CAA2B,EAC9D,CAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,IAAI,EAAE,CAA2B,CACzE,CAAC;IACF,IAAI,CAAC,iBAAiB,CAAC,EAAE;QAAE,OAAO,iBAAiB,CAAC;IAEpD,MAAM,UAAU,GAA0B;QACxC,GAAG,MAAM;QACT,MAAM,EAAE;YACN,GAAG,MAAM;YACT,mBAAmB,EAAE,eAAe,CAAC,KAAK;YAC1C,iBAAiB,EAAE,cAAc,CAAC,KAAK;YACvC,iBAAiB,EACf,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;gBACzC,CAAC,CAAC,aAAa,CAAC,KAAK;gBACrB,CAAC,CAAC,SAAS;SAChB;QACD,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC7B,CAAC,CAAC;gBACE,GAAG,UAAU;gBACb,mBAAmB,EAAE,mBAAmB,CAAC,KAAK;gBAC9C,iBAAiB,EAAE,kBAAkB,CAAC,KAAK;gBAC3C,iBAAiB,EACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;oBAC7C,CAAC,CAAC,iBAAiB,CAAC,KAAK;oBACzB,CAAC,CAAC,SAAS;aAChB;YACH,CAAC,CAAC,MAAM,CAAC,UAAU;KACtB,CAAC;IAEF,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,WAAW,CAAC;IAExC,MAAM,iBAAiB,GAAG,oBAAoB,CAC5C,aAAa,EACb,QAAQ,CAAC,MAAM,EACf,WAAW,EACX,OAAO,CACR,CAAC;IACF,IAAI,CAAC,iBAAiB,CAAC,EAAE;QAAE,OAAO,iBAAiB,CAAC;IAEpD,MAAM,eAAe,GAAG,oBAAoB,CAC1C,aAAa,EACb,QAAQ,CAAC,UAAU,EACnB,WAAW,EACX,OAAO,CACR,CAAC;IACF,IAAI,CAAC,eAAe,CAAC,EAAE;QAAE,OAAO,eAAe,CAAC;IAEhD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;AAC9C,CAAC,CAAC"}
1
+ {"version":3,"file":"add-npm.js","sourceRoot":"","sources":["../../src/commands/add-npm.ts"],"names":[],"mappings":"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"}
@@ -39,10 +39,18 @@ const writeLocalNpmPackage = (workspaceRoot, relDir, pkg) => {
39
39
  private: true,
40
40
  version: "1.0.0",
41
41
  type: "module",
42
+ ...(pkg.dependencies ? { dependencies: pkg.dependencies } : {}),
42
43
  }, null, 2) + "\n", "utf-8");
43
44
  if (pkg.manifest !== undefined) {
44
45
  writeFileSync(join(pkgRoot, "tsonic.bindings.json"), JSON.stringify(pkg.manifest, null, 2) + "\n", "utf-8");
45
46
  }
47
+ if (pkg.aikyaManifest !== undefined) {
48
+ mkdirSync(join(pkgRoot, "tsonic"), { recursive: true });
49
+ writeFileSync(join(pkgRoot, "tsonic", "package-manifest.json"), JSON.stringify(pkg.aikyaManifest, null, 2) + "\n", "utf-8");
50
+ }
51
+ if (pkg.bindingsRoot) {
52
+ mkdirSync(join(pkgRoot, pkg.bindingsRoot), { recursive: true });
53
+ }
46
54
  return pkgRoot;
47
55
  };
48
56
  describe("add npm", function () {
@@ -90,6 +98,32 @@ describe("add npm", function () {
90
98
  expect(cfg.testDotnet.packageReferences).to.deep.equal([
91
99
  { id: "Acme.Test", version: "2.0.0", types: false },
92
100
  ]);
101
+ const normalizedManifestPath = join(dir, ".tsonic", "manifests", "npm", pkgName, "tsonic.bindings.normalized.json");
102
+ expect(existsSync(normalizedManifestPath)).to.equal(true);
103
+ const normalizedManifest = JSON.parse(readFileSync(normalizedManifestPath, "utf-8"));
104
+ expect(normalizedManifest["bindingVersion"]).to.equal(1);
105
+ expect(normalizedManifest["packageName"]).to.equal(pkgName);
106
+ expect(normalizedManifest["packageVersion"]).to.equal("1.0.0");
107
+ expect(normalizedManifest["surfaceMode"]).to.equal("clr");
108
+ const runtimePackages = normalizedManifest["runtimePackages"];
109
+ expect(runtimePackages).to.deep.equal([pkgName]);
110
+ const nugetDependencies = normalizedManifest["nugetDependencies"];
111
+ expect(nugetDependencies).to.deep.equal([
112
+ {
113
+ source: "dotnet.framework",
114
+ id: "Microsoft.AspNetCore.App",
115
+ },
116
+ {
117
+ source: "dotnet.package",
118
+ id: "Acme.A",
119
+ version: "1.0.0",
120
+ },
121
+ {
122
+ source: "testDotnet.package",
123
+ id: "Acme.Test",
124
+ version: "2.0.0",
125
+ },
126
+ ]);
93
127
  }
94
128
  finally {
95
129
  rmSync(dir, { recursive: true, force: true });
@@ -124,7 +158,7 @@ describe("add npm", function () {
124
158
  rmSync(dir, { recursive: true, force: true });
125
159
  }
126
160
  });
127
- it("errors when the npm package lacks tsonic.bindings.json", () => {
161
+ it("errors when the npm package lacks both supported manifest contracts", () => {
128
162
  const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-missing-"));
129
163
  try {
130
164
  const configPath = writeWorkspaceConfig(dir);
@@ -133,7 +167,247 @@ describe("add npm", function () {
133
167
  quiet: true,
134
168
  });
135
169
  expect(result.ok).to.equal(false);
136
- expect(result.ok ? "" : result.error).to.match(/Missing tsonic\.bindings\.json/);
170
+ expect(result.ok ? "" : result.error).to.match(/Missing manifest/);
171
+ }
172
+ finally {
173
+ rmSync(dir, { recursive: true, force: true });
174
+ }
175
+ });
176
+ it("errors on unsupported manifest bindingVersion", () => {
177
+ const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-bindver-"));
178
+ try {
179
+ const configPath = writeWorkspaceConfig(dir);
180
+ const pkgName = "acme-bindings";
181
+ writeLocalNpmPackage(dir, "local/acme-bindings", {
182
+ name: pkgName,
183
+ manifest: {
184
+ bindingVersion: 2,
185
+ dotnet: {
186
+ packageReferences: [
187
+ { id: "Acme.A", version: "1.0.0", types: pkgName },
188
+ ],
189
+ },
190
+ },
191
+ });
192
+ const result = addNpmCommand("./local/acme-bindings", configPath, {
193
+ quiet: true,
194
+ });
195
+ expect(result.ok).to.equal(false);
196
+ expect(result.ok ? "" : result.error).to.match(/bindingVersion/i);
197
+ }
198
+ finally {
199
+ rmSync(dir, { recursive: true, force: true });
200
+ }
201
+ });
202
+ it("errors on packageName mismatch between manifest and installed package", () => {
203
+ const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-name-mismatch-"));
204
+ try {
205
+ const configPath = writeWorkspaceConfig(dir);
206
+ writeLocalNpmPackage(dir, "local/acme-bindings", {
207
+ name: "acme-bindings",
208
+ manifest: {
209
+ bindingVersion: 1,
210
+ packageName: "different-name",
211
+ dotnet: {
212
+ packageReferences: [{ id: "Acme.A", version: "1.0.0" }],
213
+ },
214
+ },
215
+ });
216
+ const result = addNpmCommand("./local/acme-bindings", configPath, {
217
+ quiet: true,
218
+ });
219
+ expect(result.ok).to.equal(false);
220
+ expect(result.ok ? "" : result.error).to.match(/packageName mismatch/i);
221
+ }
222
+ finally {
223
+ rmSync(dir, { recursive: true, force: true });
224
+ }
225
+ });
226
+ it("writes deterministic normalized manifest bytes across repeated installs", () => {
227
+ const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-deterministic-"));
228
+ try {
229
+ const configPath = writeWorkspaceConfig(dir);
230
+ const pkgName = "acme-bindings";
231
+ writeLocalNpmPackage(dir, "local/acme-bindings", {
232
+ name: pkgName,
233
+ manifest: {
234
+ bindingVersion: 1,
235
+ surfaceMode: "nodejs",
236
+ runtimePackages: ["@tsonic/nodejs", "@tsonic/js"],
237
+ dotnet: {
238
+ packageReferences: [
239
+ { id: "Zeta", version: "1.0.0" },
240
+ { id: "Acme.A", version: "1.0.0" },
241
+ ],
242
+ },
243
+ testDotnet: {
244
+ frameworkReferences: ["Microsoft.AspNetCore.App"],
245
+ },
246
+ },
247
+ });
248
+ const first = addNpmCommand("./local/acme-bindings", configPath, {
249
+ quiet: true,
250
+ });
251
+ expect(first.ok).to.equal(true);
252
+ const normalizedManifestPath = join(dir, ".tsonic", "manifests", "npm", pkgName, "tsonic.bindings.normalized.json");
253
+ const firstBytes = readFileSync(normalizedManifestPath, "utf-8");
254
+ const second = addNpmCommand("./local/acme-bindings", configPath, {
255
+ quiet: true,
256
+ });
257
+ expect(second.ok).to.equal(true);
258
+ const secondBytes = readFileSync(normalizedManifestPath, "utf-8");
259
+ expect(secondBytes).to.equal(firstBytes);
260
+ }
261
+ finally {
262
+ rmSync(dir, { recursive: true, force: true });
263
+ }
264
+ });
265
+ it("supports Aikya package-manifest and injects runtime NuGet references", () => {
266
+ const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-aikya-"));
267
+ try {
268
+ const configPath = writeWorkspaceConfig(dir);
269
+ const pkgName = "@acme/node";
270
+ writeLocalNpmPackage(dir, "local/acme-node", {
271
+ name: pkgName,
272
+ bindingsRoot: "tsonic/bindings",
273
+ aikyaManifest: {
274
+ schemaVersion: 1,
275
+ kind: "tsonic-library",
276
+ npmPackage: pkgName,
277
+ npmVersion: "1.0.0",
278
+ runtime: {
279
+ nugetPackages: [{ id: "Acme.Node.Runtime", version: "1.0.0" }],
280
+ frameworkReferences: ["Microsoft.AspNetCore.App"],
281
+ runtimePackages: ["@tsonic/dotnet"],
282
+ },
283
+ typing: {
284
+ bindingsRoot: "tsonic/bindings",
285
+ },
286
+ producer: {
287
+ tool: "tsonic",
288
+ version: "0.0.70",
289
+ mode: "aikya-firstparty",
290
+ },
291
+ },
292
+ });
293
+ const result = addNpmCommand("./local/acme-node", configPath, {
294
+ quiet: true,
295
+ });
296
+ expect(result.ok).to.equal(true);
297
+ expect(result.ok ? result.value.packageName : "").to.equal(pkgName);
298
+ const cfg = readWorkspaceConfig(dir);
299
+ expect(cfg.dotnet.frameworkReferences).to.deep.equal([
300
+ "Microsoft.AspNetCore.App",
301
+ ]);
302
+ expect(cfg.dotnet.packageReferences).to.deep.equal([
303
+ { id: "Acme.Node.Runtime", version: "1.0.0" },
304
+ ]);
305
+ const normalizedManifestPath = join(dir, ".tsonic", "manifests", "npm", pkgName, "tsonic.bindings.normalized.json");
306
+ const normalizedManifest = JSON.parse(readFileSync(normalizedManifestPath, "utf-8"));
307
+ expect(normalizedManifest["sourceManifest"]).to.equal("aikya");
308
+ expect(normalizedManifest["packageName"]).to.equal(pkgName);
309
+ expect(normalizedManifest["bindingsRoot"]).to.equal("tsonic/bindings");
310
+ expect(normalizedManifest["runtimePackages"]).to.deep.equal([
311
+ "@acme/node",
312
+ "@tsonic/dotnet",
313
+ ]);
314
+ }
315
+ finally {
316
+ rmSync(dir, { recursive: true, force: true });
317
+ }
318
+ });
319
+ it("resolves transitive Aikya manifests and injects all runtime NuGet references", () => {
320
+ const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-aikya-transitive-"));
321
+ try {
322
+ const configPath = writeWorkspaceConfig(dir);
323
+ writeLocalNpmPackage(dir, "local/acme-child", {
324
+ name: "acme-child",
325
+ bindingsRoot: "tsonic/bindings",
326
+ aikyaManifest: {
327
+ schemaVersion: 1,
328
+ kind: "tsonic-library",
329
+ npmPackage: "acme-child",
330
+ npmVersion: "1.0.0",
331
+ runtime: {
332
+ nugetPackages: [{ id: "Acme.Child.Runtime", version: "1.0.0" }],
333
+ },
334
+ typing: {
335
+ bindingsRoot: "tsonic/bindings",
336
+ },
337
+ producer: {
338
+ tool: "tsonic",
339
+ version: "0.0.70",
340
+ mode: "aikya-firstparty",
341
+ },
342
+ },
343
+ });
344
+ writeLocalNpmPackage(dir, "local/acme-parent", {
345
+ name: "acme-parent",
346
+ dependencies: {
347
+ "acme-child": "file:../acme-child",
348
+ },
349
+ bindingsRoot: "tsonic/bindings",
350
+ aikyaManifest: {
351
+ schemaVersion: 1,
352
+ kind: "tsonic-library",
353
+ npmPackage: "acme-parent",
354
+ npmVersion: "1.0.0",
355
+ runtime: {
356
+ nugetPackages: [{ id: "Acme.Parent.Runtime", version: "1.0.0" }],
357
+ },
358
+ typing: {
359
+ bindingsRoot: "tsonic/bindings",
360
+ },
361
+ producer: {
362
+ tool: "tsonic",
363
+ version: "0.0.70",
364
+ mode: "aikya-firstparty",
365
+ },
366
+ },
367
+ });
368
+ const result = addNpmCommand("./local/acme-parent", configPath, {
369
+ quiet: true,
370
+ });
371
+ expect(result.ok).to.equal(true);
372
+ expect(result.ok ? result.value.packageName : "").to.equal("acme-parent");
373
+ const cfg = readWorkspaceConfig(dir);
374
+ expect(cfg.dotnet.packageReferences).to.deep.equal([
375
+ { id: "Acme.Child.Runtime", version: "1.0.0" },
376
+ { id: "Acme.Parent.Runtime", version: "1.0.0" },
377
+ ]);
378
+ const childManifest = join(dir, ".tsonic", "manifests", "npm", "acme-child", "tsonic.bindings.normalized.json");
379
+ const parentManifest = join(dir, ".tsonic", "manifests", "npm", "acme-parent", "tsonic.bindings.normalized.json");
380
+ expect(existsSync(childManifest)).to.equal(true);
381
+ expect(existsSync(parentManifest)).to.equal(true);
382
+ }
383
+ finally {
384
+ rmSync(dir, { recursive: true, force: true });
385
+ }
386
+ });
387
+ it("emits TSN8A04 when Aikya manifest bindingsRoot is missing", () => {
388
+ const dir = mkdtempSync(join(tmpdir(), "tsonic-add-npm-aikya-root-"));
389
+ try {
390
+ const configPath = writeWorkspaceConfig(dir);
391
+ writeLocalNpmPackage(dir, "local/acme-node", {
392
+ name: "@acme/node",
393
+ aikyaManifest: {
394
+ schemaVersion: 1,
395
+ kind: "tsonic-library",
396
+ npmPackage: "@acme/node",
397
+ npmVersion: "1.0.0",
398
+ runtime: {
399
+ nugetPackages: [{ id: "Acme.Node.Runtime", version: "1.0.0" }],
400
+ },
401
+ typing: {
402
+ bindingsRoot: "tsonic/bindings",
403
+ },
404
+ },
405
+ });
406
+ const result = addNpmCommand("./local/acme-node", configPath, {
407
+ quiet: true,
408
+ });
409
+ expect(result.ok).to.equal(false);
410
+ expect(result.ok ? "" : result.error).to.match(/^TSN8A04:/);
137
411
  }
138
412
  finally {
139
413
  rmSync(dir, { recursive: true, force: true });