@contractkit/plugin-csharp 0.1.2 → 0.1.3
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/.turbo/turbo-build$colon$ci.log +4 -4
- package/.turbo/turbo-test$colon$ci.log +13 -13
- package/CHANGELOG.md +11 -0
- package/dist/codegen-models.d.ts.map +1 -1
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/codegen-models.ts +34 -8
- package/tests/codegen-models.test.ts +15 -0
|
@@ -5,9 +5,9 @@ $ tsup src/index.ts --format esm --sourcemap --dts && tsc --emitDeclarationOnly
|
|
|
5
5
|
[34mCLI[39m tsup v8.5.1
|
|
6
6
|
[34mCLI[39m Target: esnext
|
|
7
7
|
[34mESM[39m Build start
|
|
8
|
-
[32mESM[39m [1mdist/index.js [22m[
|
|
9
|
-
[32mESM[39m [1mdist/index.js.map [22m[
|
|
10
|
-
[32mESM[39m ⚡️ Build success in
|
|
8
|
+
[32mESM[39m [1mdist/index.js [22m[32m87.30 KB[39m
|
|
9
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m188.87 KB[39m
|
|
10
|
+
[32mESM[39m ⚡️ Build success in 180ms
|
|
11
11
|
[34mDTS[39m Build start
|
|
12
|
-
[32mDTS[39m ⚡️ Build success in
|
|
12
|
+
[32mDTS[39m ⚡️ Build success in 7420ms
|
|
13
13
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.50 KB[39m
|
|
@@ -3,27 +3,27 @@ $ vitest run --coverage
|
|
|
3
3
|
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/ContractKit/ContractKit/packages/plugin-csharp[39m
|
|
4
4
|
[2mCoverage enabled with [22m[33mv8[39m
|
|
5
5
|
|
|
6
|
-
[32m✓[39m tests/codegen-client.test.ts [2m([22m[2m26 tests[22m[2m)[22m[32m
|
|
7
|
-
[32m✓[39m tests/codegen-models.test.ts [2m([22m[
|
|
8
|
-
[32m✓[39m tests/index.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
9
|
-
[32m✓[39m tests/
|
|
10
|
-
[32m✓[39m tests/
|
|
11
|
-
[32m✓[39m tests/scaffold.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m
|
|
12
|
-
[32m✓[39m tests/hoist.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
6
|
+
[32m✓[39m tests/codegen-client.test.ts [2m([22m[2m26 tests[22m[2m)[22m[32m 252[2mms[22m[39m
|
|
7
|
+
[32m✓[39m tests/codegen-models.test.ts [2m([22m[2m65 tests[22m[2m)[22m[32m 282[2mms[22m[39m
|
|
8
|
+
[32m✓[39m tests/index.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 207[2mms[22m[39m
|
|
9
|
+
[32m✓[39m tests/naming.test.ts [2m([22m[2m19 tests[22m[2m)[22m[32m 88[2mms[22m[39m
|
|
10
|
+
[32m✓[39m tests/runtime.test.ts [2m([22m[2m14 tests[22m[2m)[22m[32m 51[2mms[22m[39m
|
|
11
|
+
[32m✓[39m tests/scaffold.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 14[2mms[22m[39m
|
|
12
|
+
[32m✓[39m tests/hoist.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 67[2mms[22m[39m
|
|
13
13
|
|
|
14
14
|
[2m Test Files [22m [1m[32m7 passed[39m[22m[90m (7)[39m
|
|
15
|
-
[2m Tests [22m [1m[
|
|
16
|
-
[2m Start at [22m
|
|
17
|
-
[2m Duration [22m
|
|
15
|
+
[2m Tests [22m [1m[32m149 passed[39m[22m[90m (149)[39m
|
|
16
|
+
[2m Start at [22m 15:17:08
|
|
17
|
+
[2m Duration [22m 13.50s[2m (transform 5.27s, setup 0ms, import 22.08s, tests 962ms, environment 10ms)[22m
|
|
18
18
|
|
|
19
19
|
[34m % [39m[2mCoverage report from [22m[33mv8[39m
|
|
20
20
|
-------------------|---------|----------|---------|---------|-------------------
|
|
21
21
|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
|
22
22
|
-------------------|---------|----------|---------|---------|-------------------
|
|
23
|
-
All files |
|
|
24
|
-
src | 88.
|
|
23
|
+
All files | 88.04 | 77.07 | 89.59 | 90.82 |
|
|
24
|
+
src | 88.08 | 77.15 | 89.79 | 90.86 |
|
|
25
25
|
...gen-client.ts | 94.61 | 87.12 | 94.91 | 97.59 | ...94-496,513-514
|
|
26
|
-
...gen-models.ts | 91.
|
|
26
|
+
...gen-models.ts | 91.29 | 75.25 | 96.61 | 93.02 | ...05,907,929-932
|
|
27
27
|
codegen-sdk.ts | 100 | 100 | 100 | 100 |
|
|
28
28
|
hoist.ts | 78.66 | 61.9 | 93.1 | 79.06 | ...13-322,350-362
|
|
29
29
|
index.ts | 70.74 | 71.21 | 58.06 | 75.59 | ...25-329,350-369
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @contractkit/plugin-csharp
|
|
2
2
|
|
|
3
|
+
## 0.1.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ad6b72e: A default on a field whose property shares its enum's name now compiles. `rating?: Rating = neutral`
|
|
8
|
+
generated `public Rating? Rating { get; init; } = Rating.Neutral;`, and inside the record `Rating`
|
|
9
|
+
resolved to the property rather than the type, so the build failed with CS0236. C#'s rule that lets a
|
|
10
|
+
member share its type's name only applies when the member's type is exactly that type, and `Rating?`
|
|
11
|
+
is `Nullable<Rating>`. The initializer is now written from the global namespace whenever a property of
|
|
12
|
+
the same record would shadow the enum.
|
|
13
|
+
|
|
3
14
|
## 0.1.2
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen-models.d.ts","sourceRoot":"","sources":["../src/codegen-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAa,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,YAAY,CAAC;AAK3D,MAAM,WAAW,yBAAyB;IACtC,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,kGAAkG;IAClG,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAwBpG;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAG3H;AAID,UAAU,aAAa;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,oFAAoF;IACpF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG;IAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,aAAa,CAS7H;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAYvI;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAqDrG;AAqBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA2CrF;
|
|
1
|
+
{"version":3,"file":"codegen-models.d.ts","sourceRoot":"","sources":["../src/codegen-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAa,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,YAAY,CAAC;AAK3D,MAAM,WAAW,yBAAyB;IACtC,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,kGAAkG;IAClG,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAwBpG;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAG3H;AAID,UAAU,aAAa;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,oFAAoF;IACpF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,yBAAyB,GAAG;IAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,aAAa,CAS7H;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAYvI;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAqDrG;AAqBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA2CrF;AA8pBD,YAAY,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -329,7 +329,8 @@ function literalCSharpType(value, ctx) {
|
|
|
329
329
|
if (typeof value === "boolean") return qualify("bool", "System.Boolean", ctx);
|
|
330
330
|
return Number.isInteger(value) ? qualify("long", "System.Int64", ctx) : qualify("double", "System.Double", ctx);
|
|
331
331
|
}
|
|
332
|
-
function renderDefault(value, type, ctx) {
|
|
332
|
+
function renderDefault(value, type, ctx, memberNames = /* @__PURE__ */ new Set()) {
|
|
333
|
+
const enumType = (name) => memberNames.has(name) ? `global::${ctx.namespace}.Models.${name}` : name;
|
|
333
334
|
const inner = type.kind === "lazy" ? type.inner : type;
|
|
334
335
|
if (typeof value === "boolean") return String(value);
|
|
335
336
|
if (typeof value === "number") {
|
|
@@ -350,13 +351,13 @@ function renderDefault(value, type, ctx) {
|
|
|
350
351
|
if (inner.kind === "enum") {
|
|
351
352
|
const decl = ctx.hoisted?.byNode.get(inner);
|
|
352
353
|
if (!decl || !inner.values.includes(value)) return void 0;
|
|
353
|
-
return `${decl.name}.${enumMemberNames(inner.values).get(value)}`;
|
|
354
|
+
return `${enumType(decl.name)}.${enumMemberNames(inner.values).get(value)}`;
|
|
354
355
|
}
|
|
355
356
|
if (inner.kind === "ref") {
|
|
356
357
|
const target = ctx.modelIndex.get(inner.name);
|
|
357
358
|
const targetType = target?.type?.kind === "lazy" ? target.type.inner : target?.type;
|
|
358
359
|
if (targetType?.kind !== "enum" || !targetType.values.includes(value)) return void 0;
|
|
359
|
-
return `${inner.name}.${enumMemberNames(targetType.values).get(value)}`;
|
|
360
|
+
return `${enumType(inner.name)}.${enumMemberNames(targetType.values).get(value)}`;
|
|
360
361
|
}
|
|
361
362
|
if (inner.kind === "scalar") {
|
|
362
363
|
switch (inner.name) {
|
|
@@ -555,24 +556,28 @@ function renderRecord(name, fields, ctx, forInput, supertypes, description, depr
|
|
|
555
556
|
lines.push(`public sealed record ${name}${implementsClause};`);
|
|
556
557
|
return lines;
|
|
557
558
|
}
|
|
559
|
+
const memberNames = new Set(fields.map((field) => memberName(field, name)));
|
|
558
560
|
lines.push(`public sealed record ${name}${implementsClause}`);
|
|
559
561
|
lines.push("{");
|
|
560
562
|
fields.forEach((field, index) => {
|
|
561
563
|
if (index > 0) lines.push("");
|
|
562
|
-
lines.push(...renderField(field, ctx, forInput, name, wireCase));
|
|
564
|
+
lines.push(...renderField(field, ctx, forInput, name, memberNames, wireCase));
|
|
563
565
|
});
|
|
564
566
|
lines.push("}");
|
|
565
567
|
return lines;
|
|
566
568
|
}
|
|
567
|
-
function
|
|
568
|
-
|
|
569
|
+
function memberName(field, ownerTypeName) {
|
|
570
|
+
return safeMemberName(toCSharpPropertyName(field.name), ownerTypeName);
|
|
571
|
+
}
|
|
572
|
+
function renderField(field, ctx, forInput, ownerTypeName, memberNames, wireCase) {
|
|
573
|
+
const propName = memberName(field, ownerTypeName);
|
|
569
574
|
const wireName = applyWireCase(field.name, wireCase);
|
|
570
575
|
let typeStr = renderCSharpType(field.type, ctx, forInput);
|
|
571
576
|
if ((field.optional || field.nullable) && !typeStr.endsWith("?")) typeStr += "?";
|
|
572
|
-
let initializer = field.default !== void 0 ? renderDefault(field.default, field.type, ctx) : void 0;
|
|
577
|
+
let initializer = field.default !== void 0 ? renderDefault(field.default, field.type, ctx, memberNames) : void 0;
|
|
573
578
|
if (initializer === void 0 && !field.optional && !field.nullable) {
|
|
574
579
|
const inner = field.type.kind === "lazy" ? field.type.inner : field.type;
|
|
575
|
-
if (inner.kind === "literal") initializer = renderDefault(inner.value, inner, ctx);
|
|
580
|
+
if (inner.kind === "literal") initializer = renderDefault(inner.value, inner, ctx, memberNames);
|
|
576
581
|
}
|
|
577
582
|
const isRequired = !field.optional && initializer === void 0;
|
|
578
583
|
const lines = [];
|