@distilled.cloud/core 0.30.3 → 1.0.0-rc.10
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/LICENSE +201 -0
- package/lib/api.d.ts +165 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +190 -0
- package/lib/api.js.map +1 -0
- package/lib/category.d.ts +4 -4
- package/lib/category.js +4 -4
- package/lib/codegen/boolean-string-enums.d.ts +36 -0
- package/lib/codegen/boolean-string-enums.d.ts.map +1 -0
- package/lib/codegen/boolean-string-enums.js +94 -0
- package/lib/codegen/boolean-string-enums.js.map +1 -0
- package/lib/codegen/boolean-string-enums.test.d.ts +2 -0
- package/lib/codegen/boolean-string-enums.test.d.ts.map +1 -0
- package/lib/codegen/boolean-string-enums.test.js +147 -0
- package/lib/codegen/boolean-string-enums.test.js.map +1 -0
- package/lib/codegen/cli.d.ts +79 -0
- package/lib/codegen/cli.d.ts.map +1 -0
- package/lib/codegen/cli.js +149 -0
- package/lib/codegen/cli.js.map +1 -0
- package/lib/codegen/emit.d.ts +125 -0
- package/lib/codegen/emit.d.ts.map +1 -0
- package/lib/codegen/emit.js +101 -0
- package/lib/codegen/emit.js.map +1 -0
- package/lib/codegen/format.d.ts +23 -0
- package/lib/codegen/format.d.ts.map +1 -0
- package/lib/codegen/format.js +28 -0
- package/lib/codegen/format.js.map +1 -0
- package/lib/codegen/generator.d.ts +334 -0
- package/lib/codegen/generator.d.ts.map +1 -0
- package/lib/codegen/generator.js +813 -0
- package/lib/codegen/generator.js.map +1 -0
- package/lib/codegen/graph.d.ts +36 -0
- package/lib/codegen/graph.d.ts.map +1 -0
- package/lib/codegen/graph.js +136 -0
- package/lib/codegen/graph.js.map +1 -0
- package/lib/codegen/graphql-client.d.ts +62 -0
- package/lib/codegen/graphql-client.d.ts.map +1 -0
- package/lib/codegen/graphql-client.js +294 -0
- package/lib/codegen/graphql-client.js.map +1 -0
- package/lib/codegen/graphql-client.test.d.ts +2 -0
- package/lib/codegen/graphql-client.test.d.ts.map +1 -0
- package/lib/codegen/graphql-client.test.js +311 -0
- package/lib/codegen/graphql-client.test.js.map +1 -0
- package/lib/codegen/graphql.d.ts +207 -0
- package/lib/codegen/graphql.d.ts.map +1 -0
- package/lib/codegen/graphql.js +799 -0
- package/lib/codegen/graphql.js.map +1 -0
- package/lib/codegen/members.d.ts +25 -0
- package/lib/codegen/members.d.ts.map +1 -0
- package/lib/codegen/members.js +55 -0
- package/lib/codegen/members.js.map +1 -0
- package/lib/codegen/naming.d.ts +29 -0
- package/lib/codegen/naming.d.ts.map +1 -0
- package/lib/codegen/naming.js +74 -0
- package/lib/codegen/naming.js.map +1 -0
- package/lib/codegen/openapi-cli.d.ts +52 -0
- package/lib/codegen/openapi-cli.d.ts.map +1 -0
- package/lib/codegen/openapi-cli.js +109 -0
- package/lib/codegen/openapi-cli.js.map +1 -0
- package/lib/codegen/openapi.d.ts +178 -0
- package/lib/codegen/openapi.d.ts.map +1 -0
- package/lib/codegen/openapi.js +1377 -0
- package/lib/codegen/openapi.js.map +1 -0
- package/lib/codegen/operations.d.ts +24 -0
- package/lib/codegen/operations.d.ts.map +1 -0
- package/lib/codegen/operations.js +56 -0
- package/lib/codegen/operations.js.map +1 -0
- package/lib/codegen/pagination.d.ts +39 -0
- package/lib/codegen/pagination.d.ts.map +1 -0
- package/lib/codegen/pagination.js +33 -0
- package/lib/codegen/pagination.js.map +1 -0
- package/lib/codegen/patches.d.ts +65 -0
- package/lib/codegen/patches.d.ts.map +1 -0
- package/lib/codegen/patches.js +236 -0
- package/lib/codegen/patches.js.map +1 -0
- package/lib/codegen/patches.test.d.ts +2 -0
- package/lib/codegen/patches.test.d.ts.map +1 -0
- package/lib/codegen/patches.test.js +105 -0
- package/lib/codegen/patches.test.js.map +1 -0
- package/lib/codegen/prelude.d.ts +15 -0
- package/lib/codegen/prelude.d.ts.map +1 -0
- package/lib/codegen/prelude.js +60 -0
- package/lib/codegen/prelude.js.map +1 -0
- package/lib/codegen/proto.d.ts +121 -0
- package/lib/codegen/proto.d.ts.map +1 -0
- package/lib/codegen/proto.js +962 -0
- package/lib/codegen/proto.js.map +1 -0
- package/lib/codegen/rewrite-operation-ids.d.ts +131 -0
- package/lib/codegen/rewrite-operation-ids.d.ts.map +1 -0
- package/lib/codegen/rewrite-operation-ids.js +1079 -0
- package/lib/codegen/rewrite-operation-ids.js.map +1 -0
- package/lib/codegen/rewrite-operation-ids.test.d.ts +2 -0
- package/lib/codegen/rewrite-operation-ids.test.d.ts.map +1 -0
- package/lib/codegen/rewrite-operation-ids.test.js +533 -0
- package/lib/codegen/rewrite-operation-ids.test.js.map +1 -0
- package/lib/codegen/spec-path.d.ts +16 -0
- package/lib/codegen/spec-path.d.ts.map +1 -0
- package/lib/codegen/spec-path.js +101 -0
- package/lib/codegen/spec-path.js.map +1 -0
- package/lib/error-category.d.ts +28 -0
- package/lib/error-category.d.ts.map +1 -0
- package/lib/error-category.js +46 -0
- package/lib/error-category.js.map +1 -0
- package/lib/errors.d.ts +1 -0
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +18 -13
- package/lib/errors.js.map +1 -1
- package/lib/graphql.d.ts +284 -0
- package/lib/graphql.d.ts.map +1 -0
- package/lib/graphql.fixture.d.ts +249 -0
- package/lib/graphql.fixture.d.ts.map +1 -0
- package/lib/graphql.fixture.js +240 -0
- package/lib/graphql.fixture.js.map +1 -0
- package/lib/graphql.js +718 -0
- package/lib/graphql.js.map +1 -0
- package/lib/graphql.test.d.ts +2 -0
- package/lib/graphql.test.d.ts.map +1 -0
- package/lib/graphql.test.js +780 -0
- package/lib/graphql.test.js.map +1 -0
- package/lib/graphql.types.d.ts +2 -0
- package/lib/graphql.types.d.ts.map +1 -0
- package/lib/graphql.types.js +45 -0
- package/lib/graphql.types.js.map +1 -0
- package/lib/json-patch.d.ts +30 -30
- package/lib/json-patch.d.ts.map +1 -1
- package/lib/json-patch.js +73 -107
- package/lib/json-patch.js.map +1 -1
- package/lib/pagination.d.ts +77 -51
- package/lib/pagination.d.ts.map +1 -1
- package/lib/pagination.js +162 -94
- package/lib/pagination.js.map +1 -1
- package/lib/protocol-http.d.ts +74 -0
- package/lib/protocol-http.d.ts.map +1 -0
- package/lib/protocol-http.js +590 -0
- package/lib/protocol-http.js.map +1 -0
- package/lib/protocol-http.test.d.ts +2 -0
- package/lib/protocol-http.test.d.ts.map +1 -0
- package/lib/protocol-http.test.js +88 -0
- package/lib/protocol-http.test.js.map +1 -0
- package/lib/protocol-rest.d.ts +134 -0
- package/lib/protocol-rest.d.ts.map +1 -0
- package/lib/protocol-rest.js +256 -0
- package/lib/protocol-rest.js.map +1 -0
- package/lib/retry.d.ts +8 -2
- package/lib/retry.d.ts.map +1 -1
- package/lib/retry.js +22 -16
- package/lib/retry.js.map +1 -1
- package/lib/schema.d.ts +8 -9
- package/lib/schema.d.ts.map +1 -1
- package/lib/schema.js +8 -9
- package/lib/schema.js.map +1 -1
- package/lib/trait.d.ts +174 -0
- package/lib/trait.d.ts.map +1 -0
- package/lib/trait.js +123 -0
- package/lib/trait.js.map +1 -0
- package/package.json +24 -78
- package/src/api.ts +460 -0
- package/src/category.ts +4 -4
- package/src/codegen/boolean-string-enums.test.ts +168 -0
- package/src/codegen/boolean-string-enums.ts +106 -0
- package/src/codegen/cli.ts +285 -0
- package/src/codegen/emit.ts +203 -0
- package/src/codegen/format.ts +47 -0
- package/src/codegen/generator.ts +1283 -0
- package/src/codegen/graph.ts +151 -0
- package/src/codegen/graphql-client.test.ts +386 -0
- package/src/codegen/graphql-client.ts +419 -0
- package/src/codegen/graphql.ts +1217 -0
- package/src/codegen/members.ts +71 -0
- package/src/codegen/naming.ts +86 -0
- package/src/codegen/openapi-cli.ts +182 -0
- package/src/codegen/openapi.ts +1689 -0
- package/src/codegen/operations.ts +76 -0
- package/src/codegen/pagination.ts +71 -0
- package/src/codegen/patches.test.ts +130 -0
- package/src/codegen/patches.ts +291 -0
- package/src/codegen/prelude.ts +70 -0
- package/src/codegen/proto.ts +1128 -0
- package/src/codegen/rewrite-operation-ids.test.ts +563 -0
- package/src/codegen/rewrite-operation-ids.ts +1206 -0
- package/src/codegen/spec-path.ts +115 -0
- package/src/error-category.ts +84 -0
- package/src/errors.ts +22 -25
- package/src/graphql.fixture.ts +371 -0
- package/src/graphql.test.ts +974 -0
- package/src/graphql.ts +1321 -0
- package/src/graphql.types.ts +185 -0
- package/src/json-patch.ts +95 -122
- package/src/pagination.ts +217 -146
- package/src/protocol-http.test.ts +107 -0
- package/src/protocol-http.ts +735 -0
- package/src/protocol-rest.ts +391 -0
- package/src/retry.ts +21 -22
- package/src/schema.ts +9 -10
- package/src/trait.ts +274 -0
- package/README.md +0 -30
- package/lib/client.d.ts +0 -167
- package/lib/client.d.ts.map +0 -1
- package/lib/client.js +0 -659
- package/lib/client.js.map +0 -1
- package/lib/schemas.d.ts +0 -60
- package/lib/schemas.d.ts.map +0 -1
- package/lib/schemas.js +0 -79
- package/lib/schemas.js.map +0 -1
- package/lib/sensitive.d.ts +0 -71
- package/lib/sensitive.d.ts.map +0 -1
- package/lib/sensitive.js +0 -96
- package/lib/sensitive.js.map +0 -1
- package/lib/traits.d.ts +0 -421
- package/lib/traits.d.ts.map +0 -1
- package/lib/traits.js +0 -737
- package/lib/traits.js.map +0 -1
- package/src/client.ts +0 -1177
- package/src/schemas.ts +0 -128
- package/src/sensitive.ts +0 -119
- package/src/traits.ts +0 -996
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boolean-valued string enums on request members (dev-time only).
|
|
3
|
+
*
|
|
4
|
+
* Plenty of APIs document a flag as the string enum `"true" | "false"`
|
|
5
|
+
* rather than a JSON boolean — Cloudflare's `validation_enabled`, Clerk's
|
|
6
|
+
* `include_invalid`, GrowthBook's `deleteMissing`, and so on. Taken
|
|
7
|
+
* literally that surfaces as `"true" | "false" | (string & {})` and every
|
|
8
|
+
* caller writes the ternary itself.
|
|
9
|
+
*
|
|
10
|
+
* {@link generateService} runs this pass over the loaded model before
|
|
11
|
+
* emitting: REQUEST members of such an enum are retargeted to a real
|
|
12
|
+
* `smithy.api#Boolean` and stamped {@link STRING_ENCODED_TRAIT}, which the
|
|
13
|
+
* generator emits as `T.StringEncoded()` and the protocol's `buildRequest`
|
|
14
|
+
* honors by sending the value's string spelling. The TS surface becomes
|
|
15
|
+
* `boolean` with the wire unchanged. The model on disk keeps the string
|
|
16
|
+
* enum the description documents.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately narrow:
|
|
19
|
+
*
|
|
20
|
+
* • request shapes only (`smithy.api#input`) — a response member would
|
|
21
|
+
* need the mirror-image decode, which the protocol does not do;
|
|
22
|
+
* • a list member is retargeted only when EVERY reference to that list
|
|
23
|
+
* comes from a request shape, so a shared list is never rewritten;
|
|
24
|
+
* • the enum must be exactly `{"true", "false"}` — a three-value enum
|
|
25
|
+
* that happens to include them is left alone.
|
|
26
|
+
*/
|
|
27
|
+
/** Synthetic trait: send this member's value as its string spelling. */
|
|
28
|
+
export declare const STRING_ENCODED_TRAIT = "distilled.protocols#stringEncoded";
|
|
29
|
+
export interface BooleanStringEnumResult {
|
|
30
|
+
/** Request members retargeted to a real boolean. */
|
|
31
|
+
members: number;
|
|
32
|
+
/** List shapes whose element type was retargeted. */
|
|
33
|
+
lists: number;
|
|
34
|
+
}
|
|
35
|
+
export declare const booleanStringEnums: (model: any) => BooleanStringEnumResult;
|
|
36
|
+
//# sourceMappingURL=boolean-string-enums.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean-string-enums.d.ts","sourceRoot":"","sources":["../../src/codegen/boolean-string-enums.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,sCAAsC,CAAC;AAIxE,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;CACf;AAwBD,eAAO,MAAM,kBAAkB,UAAW,GAAG,KAAG,uBA4C/C,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boolean-valued string enums on request members (dev-time only).
|
|
3
|
+
*
|
|
4
|
+
* Plenty of APIs document a flag as the string enum `"true" | "false"`
|
|
5
|
+
* rather than a JSON boolean — Cloudflare's `validation_enabled`, Clerk's
|
|
6
|
+
* `include_invalid`, GrowthBook's `deleteMissing`, and so on. Taken
|
|
7
|
+
* literally that surfaces as `"true" | "false" | (string & {})` and every
|
|
8
|
+
* caller writes the ternary itself.
|
|
9
|
+
*
|
|
10
|
+
* {@link generateService} runs this pass over the loaded model before
|
|
11
|
+
* emitting: REQUEST members of such an enum are retargeted to a real
|
|
12
|
+
* `smithy.api#Boolean` and stamped {@link STRING_ENCODED_TRAIT}, which the
|
|
13
|
+
* generator emits as `T.StringEncoded()` and the protocol's `buildRequest`
|
|
14
|
+
* honors by sending the value's string spelling. The TS surface becomes
|
|
15
|
+
* `boolean` with the wire unchanged. The model on disk keeps the string
|
|
16
|
+
* enum the description documents.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately narrow:
|
|
19
|
+
*
|
|
20
|
+
* • request shapes only (`smithy.api#input`) — a response member would
|
|
21
|
+
* need the mirror-image decode, which the protocol does not do;
|
|
22
|
+
* • a list member is retargeted only when EVERY reference to that list
|
|
23
|
+
* comes from a request shape, so a shared list is never rewritten;
|
|
24
|
+
* • the enum must be exactly `{"true", "false"}` — a three-value enum
|
|
25
|
+
* that happens to include them is left alone.
|
|
26
|
+
*/
|
|
27
|
+
/** Synthetic trait: send this member's value as its string spelling. */
|
|
28
|
+
export const STRING_ENCODED_TRAIT = "distilled.protocols#stringEncoded";
|
|
29
|
+
const BOOLEAN = "smithy.api#Boolean";
|
|
30
|
+
/** Enum shapes whose values are exactly `"true"` and `"false"`. */
|
|
31
|
+
const booleanEnumIds = (shapes) => {
|
|
32
|
+
const out = new Set();
|
|
33
|
+
for (const [id, shape] of Object.entries(shapes)) {
|
|
34
|
+
if (shape?.type !== "enum")
|
|
35
|
+
continue;
|
|
36
|
+
const values = Object.values(shape.members ?? {}).map((m) => m?.traits?.["smithy.api#enumValue"]);
|
|
37
|
+
if (values.length === 2 &&
|
|
38
|
+
values.includes("true") &&
|
|
39
|
+
values.includes("false")) {
|
|
40
|
+
out.add(id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
};
|
|
45
|
+
const isRequestShape = (shape) => shape?.type === "structure" && "smithy.api#input" in (shape.traits ?? {});
|
|
46
|
+
export const booleanStringEnums = (model) => {
|
|
47
|
+
const shapes = model?.shapes ?? {};
|
|
48
|
+
const boolEnums = booleanEnumIds(shapes);
|
|
49
|
+
if (boolEnums.size === 0)
|
|
50
|
+
return { members: 0, lists: 0 };
|
|
51
|
+
// Lists of a boolean enum, and whether anything outside a request shape
|
|
52
|
+
// refers to them (a shared list keeps its documented string type).
|
|
53
|
+
const boolLists = new Set();
|
|
54
|
+
for (const [id, shape] of Object.entries(shapes)) {
|
|
55
|
+
if (shape?.type === "list" && boolEnums.has(shape.member?.target)) {
|
|
56
|
+
boolLists.add(id);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const sharedLists = new Set();
|
|
60
|
+
for (const shape of Object.values(shapes)) {
|
|
61
|
+
if (isRequestShape(shape))
|
|
62
|
+
continue;
|
|
63
|
+
for (const member of Object.values(shape?.members ?? {})) {
|
|
64
|
+
if (boolLists.has(member?.target))
|
|
65
|
+
sharedLists.add(member.target);
|
|
66
|
+
}
|
|
67
|
+
if (boolLists.has(shape?.member?.target)) {
|
|
68
|
+
sharedLists.add(shape.member.target);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let members = 0;
|
|
72
|
+
const retargeted = new Set();
|
|
73
|
+
for (const shape of Object.values(shapes)) {
|
|
74
|
+
if (!isRequestShape(shape))
|
|
75
|
+
continue;
|
|
76
|
+
for (const member of Object.values(shape.members ?? {})) {
|
|
77
|
+
const isList = boolLists.has(member?.target) && !sharedLists.has(member.target);
|
|
78
|
+
if (!boolEnums.has(member?.target) && !isList)
|
|
79
|
+
continue;
|
|
80
|
+
if (isList) {
|
|
81
|
+
retargeted.add(member.target);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
member.target = BOOLEAN;
|
|
85
|
+
}
|
|
86
|
+
member.traits = { ...member.traits, [STRING_ENCODED_TRAIT]: {} };
|
|
87
|
+
members++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const id of retargeted)
|
|
91
|
+
shapes[id].member.target = BOOLEAN;
|
|
92
|
+
return { members, lists: retargeted.size };
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=boolean-string-enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean-string-enums.js","sourceRoot":"","sources":["../../src/codegen/boolean-string-enums.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean-string-enums.test.d.ts","sourceRoot":"","sources":["../../src/codegen/boolean-string-enums.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { booleanStringEnums, STRING_ENCODED_TRAIT, } from "./boolean-string-enums.js";
|
|
3
|
+
import { generateService } from "./generator.js";
|
|
4
|
+
const boolEnum = {
|
|
5
|
+
type: "enum",
|
|
6
|
+
members: {
|
|
7
|
+
TRUE: {
|
|
8
|
+
target: "smithy.api#Unit",
|
|
9
|
+
traits: { "smithy.api#enumValue": "true" },
|
|
10
|
+
},
|
|
11
|
+
FALSE: {
|
|
12
|
+
target: "smithy.api#Unit",
|
|
13
|
+
traits: { "smithy.api#enumValue": "false" },
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
const model = (shapes) => ({ smithy: "2.0", shapes });
|
|
18
|
+
describe("booleanStringEnums", () => {
|
|
19
|
+
test("retargets a request member and stamps the trait", () => {
|
|
20
|
+
const m = model({
|
|
21
|
+
"com.example.x#Flag": boolEnum,
|
|
22
|
+
"com.example.x#Request": {
|
|
23
|
+
type: "structure",
|
|
24
|
+
traits: { "smithy.api#input": {} },
|
|
25
|
+
members: { validation_enabled: { target: "com.example.x#Flag" } },
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
expect(booleanStringEnums(m)).toEqual({ members: 1, lists: 0 });
|
|
29
|
+
const member = m.shapes["com.example.x#Request"].members.validation_enabled;
|
|
30
|
+
expect(member.target).toBe("smithy.api#Boolean");
|
|
31
|
+
expect(member.traits[STRING_ENCODED_TRAIT]).toEqual({});
|
|
32
|
+
});
|
|
33
|
+
test("leaves response members alone", () => {
|
|
34
|
+
const m = model({
|
|
35
|
+
"com.example.x#Flag": boolEnum,
|
|
36
|
+
"com.example.x#Response": {
|
|
37
|
+
type: "structure",
|
|
38
|
+
members: { active: { target: "com.example.x#Flag" } },
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
expect(booleanStringEnums(m)).toEqual({ members: 0, lists: 0 });
|
|
42
|
+
expect(m.shapes["com.example.x#Response"].members.active.target).toBe("com.example.x#Flag");
|
|
43
|
+
});
|
|
44
|
+
test("retargets a request-only list's element type", () => {
|
|
45
|
+
const m = model({
|
|
46
|
+
"com.example.x#Flag": boolEnum,
|
|
47
|
+
"com.example.x#FlagList": {
|
|
48
|
+
type: "list",
|
|
49
|
+
member: { target: "com.example.x#Flag" },
|
|
50
|
+
},
|
|
51
|
+
"com.example.x#Request": {
|
|
52
|
+
type: "structure",
|
|
53
|
+
traits: { "smithy.api#input": {} },
|
|
54
|
+
members: { unique_entries: { target: "com.example.x#FlagList" } },
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
expect(booleanStringEnums(m)).toEqual({ members: 1, lists: 1 });
|
|
58
|
+
expect(m.shapes["com.example.x#FlagList"].member.target).toBe("smithy.api#Boolean");
|
|
59
|
+
});
|
|
60
|
+
test("leaves a list a response also uses", () => {
|
|
61
|
+
const m = model({
|
|
62
|
+
"com.example.x#Flag": boolEnum,
|
|
63
|
+
"com.example.x#FlagList": {
|
|
64
|
+
type: "list",
|
|
65
|
+
member: { target: "com.example.x#Flag" },
|
|
66
|
+
},
|
|
67
|
+
"com.example.x#Request": {
|
|
68
|
+
type: "structure",
|
|
69
|
+
traits: { "smithy.api#input": {} },
|
|
70
|
+
members: { unique_entries: { target: "com.example.x#FlagList" } },
|
|
71
|
+
},
|
|
72
|
+
"com.example.x#Response": {
|
|
73
|
+
type: "structure",
|
|
74
|
+
members: { seen: { target: "com.example.x#FlagList" } },
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
expect(booleanStringEnums(m)).toEqual({ members: 0, lists: 0 });
|
|
78
|
+
expect(m.shapes["com.example.x#FlagList"].member.target).toBe("com.example.x#Flag");
|
|
79
|
+
});
|
|
80
|
+
test("leaves an enum that is not exactly true/false", () => {
|
|
81
|
+
const m = model({
|
|
82
|
+
"com.example.x#Tri": {
|
|
83
|
+
type: "enum",
|
|
84
|
+
members: {
|
|
85
|
+
TRUE: {
|
|
86
|
+
target: "smithy.api#Unit",
|
|
87
|
+
traits: { "smithy.api#enumValue": "true" },
|
|
88
|
+
},
|
|
89
|
+
FALSE: {
|
|
90
|
+
target: "smithy.api#Unit",
|
|
91
|
+
traits: { "smithy.api#enumValue": "false" },
|
|
92
|
+
},
|
|
93
|
+
AUTO: {
|
|
94
|
+
target: "smithy.api#Unit",
|
|
95
|
+
traits: { "smithy.api#enumValue": "auto" },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
"com.example.x#Request": {
|
|
100
|
+
type: "structure",
|
|
101
|
+
traits: { "smithy.api#input": {} },
|
|
102
|
+
members: { mode: { target: "com.example.x#Tri" } },
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
expect(booleanStringEnums(m)).toEqual({ members: 0, lists: 0 });
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("generateService", () => {
|
|
109
|
+
test("emits a boolean piped through T.StringEncoded()", () => {
|
|
110
|
+
const { code } = generateService(model({
|
|
111
|
+
"com.example.x#Example": {
|
|
112
|
+
type: "service",
|
|
113
|
+
version: "2024-01-01",
|
|
114
|
+
operations: [{ target: "com.example.x#GetThing" }],
|
|
115
|
+
},
|
|
116
|
+
"com.example.x#GetThing": {
|
|
117
|
+
type: "operation",
|
|
118
|
+
input: { target: "com.example.x#GetThingRequest" },
|
|
119
|
+
output: { target: "smithy.api#Unit" },
|
|
120
|
+
traits: { "smithy.api#http": { method: "GET", uri: "/things" } },
|
|
121
|
+
},
|
|
122
|
+
"com.example.x#GetThingRequest": {
|
|
123
|
+
type: "structure",
|
|
124
|
+
traits: { "smithy.api#input": {} },
|
|
125
|
+
members: {
|
|
126
|
+
verbose: {
|
|
127
|
+
target: "com.example.x#Flag",
|
|
128
|
+
traits: { "smithy.api#httpQuery": "verbose" },
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
"com.example.x#Flag": boolEnum,
|
|
133
|
+
}), {
|
|
134
|
+
operationDecl: {
|
|
135
|
+
contextType: "ExampleOpContext",
|
|
136
|
+
commonErrorType: "ExampleOpError",
|
|
137
|
+
commonErrorClasses: [],
|
|
138
|
+
protocol: "ExampleProtocol",
|
|
139
|
+
retry: "Retry.Retry",
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
expect(code).toContain('"verbose": S.optional(S.Boolean.pipe(T.Query(), T.StringEncoded())),');
|
|
143
|
+
expect(code).toContain("verbose?: boolean;");
|
|
144
|
+
expect(code).not.toContain('"true" | "false"');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=boolean-string-enums.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean-string-enums.test.js","sourceRoot":"","sources":["../../src/codegen/boolean-string-enums.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import * as FileSystem from "effect/FileSystem";
|
|
3
|
+
import * as Path from "effect/Path";
|
|
4
|
+
import { type SdkSpec } from "./generator.ts";
|
|
5
|
+
export interface GeneratorCliOptions {
|
|
6
|
+
/** Command description shown in --help. */
|
|
7
|
+
readonly description: string;
|
|
8
|
+
/** Absolute package root (usually `path.resolve(import.meta.dir, "..")`). */
|
|
9
|
+
readonly root: string;
|
|
10
|
+
/** Model directory default (relative to root). Default `.generated-specs`. */
|
|
11
|
+
readonly smithyDir?: string;
|
|
12
|
+
/** Output directory default (relative to root). Default `src/services`. */
|
|
13
|
+
readonly outDir?: string;
|
|
14
|
+
/** Model files to skip (e.g. a shared protocols model). */
|
|
15
|
+
readonly excludeModel?: (file: string) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Where the models are, when they aren't a flat directory of `<resource>.json`.
|
|
18
|
+
* AWS vendors Amazon's own repo, whose models sit at
|
|
19
|
+
* `models/<service>/service/<version>/<service>-<version>.json`.
|
|
20
|
+
*
|
|
21
|
+
* Returns the model files to compile; manual specs are merged in after,
|
|
22
|
+
* as usual.
|
|
23
|
+
*/
|
|
24
|
+
readonly discoverModels?: (ctx: {
|
|
25
|
+
readonly smithyDir: string;
|
|
26
|
+
}) => Effect.Effect<ReadonlyArray<{
|
|
27
|
+
readonly file: string;
|
|
28
|
+
readonly dir: string;
|
|
29
|
+
}>, never, FileSystem.FileSystem | Path.Path>;
|
|
30
|
+
/**
|
|
31
|
+
* Side effects to run before generating — e.g. AWS copies `partitions.json`
|
|
32
|
+
* out of the smithy submodule, runtime data its endpoint resolver reads.
|
|
33
|
+
*/
|
|
34
|
+
readonly prepare?: (ctx: {
|
|
35
|
+
readonly root: string;
|
|
36
|
+
readonly outDir: string;
|
|
37
|
+
}) => Effect.Effect<void, never, FileSystem.FileSystem | Path.Path>;
|
|
38
|
+
/**
|
|
39
|
+
* The output module's name, when it isn't the model's filename. AWS names
|
|
40
|
+
* modules after the service's `aws.api#service` sdkId (`amazon-s3.json` →
|
|
41
|
+
* `s3.ts`), so the public surface reads `AWS.S3.getObject`.
|
|
42
|
+
*/
|
|
43
|
+
readonly resourceName?: (ctx: {
|
|
44
|
+
readonly model: any;
|
|
45
|
+
readonly file: string;
|
|
46
|
+
}) => string;
|
|
47
|
+
/** Barrel export name for a resource. Default: the resource name itself. */
|
|
48
|
+
readonly barrelExportName?: (resource: string) => string;
|
|
49
|
+
/**
|
|
50
|
+
* The closing pass over the output directory. Defaults to formatting;
|
|
51
|
+
* AWS lint-fixes first (see `codegen/format.ts`).
|
|
52
|
+
*/
|
|
53
|
+
readonly finalize?: (dir: string) => Effect.Effect<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Keep generating after a model fails, instead of stopping at the first.
|
|
56
|
+
* AWS compiles 430 services in one run, and one broken model shouldn't
|
|
57
|
+
* hide the state of the other 429. The run still FAILS at the end — the
|
|
58
|
+
* failures are reported together rather than swallowed.
|
|
59
|
+
*/
|
|
60
|
+
readonly continueOnModelError?: boolean;
|
|
61
|
+
/** Directory of hand-authored models merged after the generated ones. */
|
|
62
|
+
readonly manualSpecsDir?: string;
|
|
63
|
+
/**
|
|
64
|
+
* RFC-6902 patches apply in convert, never here. Only `false` is accepted
|
|
65
|
+
* so a string is a type error rather than a silently ignored setting.
|
|
66
|
+
*/
|
|
67
|
+
readonly patchesDir?: false;
|
|
68
|
+
/**
|
|
69
|
+
* Model transform applied before generation (e.g. AWS dropping
|
|
70
|
+
* unreachable foreign-namespace shapes from a vendored model). Does not
|
|
71
|
+
* write back to `.generated-specs` — convert owns the committed model.
|
|
72
|
+
*/
|
|
73
|
+
readonly transformModel?: (model: any, resource: string) => string | void;
|
|
74
|
+
/** The provider spec — built per model (metadata may vary per model). */
|
|
75
|
+
readonly spec: (model: any) => SdkSpec;
|
|
76
|
+
}
|
|
77
|
+
/** Run the generator CLI (BunRuntime main — call at module top level). */
|
|
78
|
+
export declare const runGeneratorCli: (options: GeneratorCliOptions) => void;
|
|
79
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/codegen/cli.ts"],"names":[],"mappings":"AAaA,OAAO,EAAW,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAKpC,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE;QAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,KAAK,MAAM,CAAC,MAAM,CACjB,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,EAC9D,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAClC,CAAC;IACF;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,KAAK,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1E,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;CACxC;AAED,0EAA0E;AAC1E,eAAO,MAAM,eAAe,YAAa,mBAAmB,KAAG,IA2L9D,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generic generator CLI harness (dev-time only).
|
|
3
|
+
*
|
|
4
|
+
* Owns the smithy→SDK pipeline every SDK package shares: scan the model
|
|
5
|
+
* directory (plus optional hand-authored manual specs), compile each model
|
|
6
|
+
* through {@link generateService} with the provider's {@link SdkSpec}, write
|
|
7
|
+
* the service modules and the namespaced barrel. RFC-6902 patches apply in
|
|
8
|
+
* convert so `.generated-specs` is already the patched model.
|
|
9
|
+
*
|
|
10
|
+
* A provider's `scripts/generate.ts` is: trait consts + an SdkSpec + a
|
|
11
|
+
* `runGeneratorCli` call.
|
|
12
|
+
*/
|
|
13
|
+
import { BunRuntime, BunServices } from "@effect/platform-bun";
|
|
14
|
+
import { Console, Effect } from "effect";
|
|
15
|
+
import * as FileSystem from "effect/FileSystem";
|
|
16
|
+
import * as Path from "effect/Path";
|
|
17
|
+
import { Flag } from "effect/unstable/cli";
|
|
18
|
+
import { Command } from "effect/unstable/cli";
|
|
19
|
+
import { barrel } from "./emit.js";
|
|
20
|
+
import { formatGenerated } from "./format.js";
|
|
21
|
+
import { generateService } from "./generator.js";
|
|
22
|
+
/** Run the generator CLI (BunRuntime main — call at module top level). */
|
|
23
|
+
export const runGeneratorCli = (options) => {
|
|
24
|
+
const command = Command.make("generate", {
|
|
25
|
+
smithy: Flag.String("smithy").pipe(Flag.withDefault(options.smithyDir ?? ".generated-specs"), Flag.withDescription("Directory of Smithy JSON models")),
|
|
26
|
+
out: Flag.String("out").pipe(Flag.withDefault(options.outDir ?? "src/services"), Flag.withDescription("Output directory for generated service modules")),
|
|
27
|
+
resource: Flag.String("resource").pipe(Flag.withDefault(""), Flag.withDescription("Only generate this resource (e.g. ai)")),
|
|
28
|
+
}, (config) => Effect.gen(function* () {
|
|
29
|
+
const fs = yield* FileSystem.FileSystem;
|
|
30
|
+
const path = yield* Path.Path;
|
|
31
|
+
const root = options.root;
|
|
32
|
+
const smithyDir = path.resolve(root, config.smithy);
|
|
33
|
+
const outDir = path.resolve(root, config.out);
|
|
34
|
+
yield* Console.log("⚙️ generate");
|
|
35
|
+
yield* Console.log(` Smithy: ${smithyDir}`);
|
|
36
|
+
yield* Console.log(` Output: ${outDir}`);
|
|
37
|
+
yield* options.prepare?.({ root, outDir }) ?? Effect.void;
|
|
38
|
+
// Generated models plus optional manual-specs (hand-authored models
|
|
39
|
+
// for APIs the provider's spec source doesn't cover). A manual model
|
|
40
|
+
// must not shadow a generated one.
|
|
41
|
+
const generated = options.discoverModels
|
|
42
|
+
? yield* options.discoverModels({ smithyDir })
|
|
43
|
+
: (yield* fs.readDirectory(smithyDir))
|
|
44
|
+
.filter((f) => f.endsWith(".json") && !(options.excludeModel?.(f) ?? false))
|
|
45
|
+
.map((f) => ({ file: f, dir: smithyDir }));
|
|
46
|
+
const manualDir = options.manualSpecsDir
|
|
47
|
+
? path.resolve(root, options.manualSpecsDir)
|
|
48
|
+
: undefined;
|
|
49
|
+
const manual = manualDir && (yield* fs.exists(manualDir))
|
|
50
|
+
? (yield* fs.readDirectory(manualDir))
|
|
51
|
+
.filter((f) => f.endsWith(".json"))
|
|
52
|
+
.map((f) => ({ file: f, dir: manualDir }))
|
|
53
|
+
: [];
|
|
54
|
+
for (const m of manual) {
|
|
55
|
+
if (generated.some((g) => g.file === m.file)) {
|
|
56
|
+
return yield* Effect.die(new Error(`${options.manualSpecsDir}/${m.file} shadows a generated model — rename or delete it`));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const entries = [...generated, ...manual].sort((a, b) => a.file.localeCompare(b.file));
|
|
60
|
+
yield* fs.makeDirectory(outDir, { recursive: true });
|
|
61
|
+
const written = [];
|
|
62
|
+
const failedModels = [];
|
|
63
|
+
let totalOps = 0;
|
|
64
|
+
for (const { file, dir } of entries) {
|
|
65
|
+
const model = JSON.parse(yield* fs.readFileString(path.join(dir, file)));
|
|
66
|
+
// The module's name — the model's filename unless the provider
|
|
67
|
+
// derives it from the model itself (AWS: the service's sdkId).
|
|
68
|
+
const resource = options.resourceName?.({ model, file }) ??
|
|
69
|
+
file.replace(/\.json$/, "");
|
|
70
|
+
if (config.resource && resource !== config.resource)
|
|
71
|
+
continue;
|
|
72
|
+
if (options.transformModel) {
|
|
73
|
+
const note = options.transformModel(model, resource);
|
|
74
|
+
if (note)
|
|
75
|
+
yield* Console.log(` ${note}`);
|
|
76
|
+
}
|
|
77
|
+
// `generateService` and the provider spec are synchronous and
|
|
78
|
+
// throw; with continueOnModelError the throw is recorded and the
|
|
79
|
+
// run moves on, so one broken model doesn't hide the state of
|
|
80
|
+
// every model after it. The run still fails at the end.
|
|
81
|
+
let generated;
|
|
82
|
+
try {
|
|
83
|
+
generated = generateService(model, options.spec(model));
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
if (!options.continueOnModelError)
|
|
87
|
+
throw e;
|
|
88
|
+
failedModels.push(`${resource}: ${e instanceof Error ? e.message : String(e)}`);
|
|
89
|
+
yield* Console.error(`❌ ${resource}`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const { code, operations } = generated;
|
|
93
|
+
if (operations === 0)
|
|
94
|
+
continue;
|
|
95
|
+
yield* fs.writeFileString(path.join(outDir, `${resource}.ts`), code);
|
|
96
|
+
written.push(resource);
|
|
97
|
+
totalOps += operations;
|
|
98
|
+
}
|
|
99
|
+
// Barrel — namespace per resource to avoid op-name collisions.
|
|
100
|
+
//
|
|
101
|
+
// A FULL run is authoritative: the barrel is exactly what was
|
|
102
|
+
// generated, so a resource whose model went away drops out of it.
|
|
103
|
+
//
|
|
104
|
+
// A `--resource` run only knows about the resource it generated, so
|
|
105
|
+
// rewriting the barrel from that would delete every other export —
|
|
106
|
+
// which is how #397 shipped a cloudflare barrel exporting `workers`
|
|
107
|
+
// and nothing else, silently dropping 119 services. Merge into the
|
|
108
|
+
// existing barrel instead, so `--resource` can still ADD a brand-new
|
|
109
|
+
// resource without removing anything.
|
|
110
|
+
const barrelPath = path.join(outDir, "index.ts");
|
|
111
|
+
const filtered = config.resource !== "";
|
|
112
|
+
// Sorted, not in generation order: a provider that discovers models
|
|
113
|
+
// in some other order (AWS walks Amazon's directory tree) would
|
|
114
|
+
// otherwise reshuffle the barrel on every run.
|
|
115
|
+
let resources = [...written].sort((a, b) => `${a}.json`.localeCompare(`${b}.json`));
|
|
116
|
+
if (filtered && (yield* fs.exists(barrelPath))) {
|
|
117
|
+
// Recover the RESOURCE from each export line's path, not its name:
|
|
118
|
+
// the two differ when barrelExportName renames (AWS exports
|
|
119
|
+
// `S3` from `./s3.ts`).
|
|
120
|
+
const existing = (yield* fs.readFileString(barrelPath))
|
|
121
|
+
.split("\n")
|
|
122
|
+
.map((line) => /^export \* as \S+ from "\.\/(.+)\.ts";/.exec(line)?.[1])
|
|
123
|
+
.filter((name) => name !== undefined);
|
|
124
|
+
// Ordered exactly as a full run orders it: by MODEL FILENAME, so
|
|
125
|
+
// the `.json` takes part in the collation (`ai_gateway.json` sorts
|
|
126
|
+
// before `ai.json`, where the bare names sort the other way).
|
|
127
|
+
// Otherwise a filtered run reshuffles the barrel into diff noise.
|
|
128
|
+
resources = [...new Set([...existing, ...written])].sort((a, b) => `${a}.json`.localeCompare(`${b}.json`));
|
|
129
|
+
}
|
|
130
|
+
yield* fs.writeFileString(barrelPath, barrel(`// AUTO-GENERATED by scripts/generate.ts. Do not edit.\n`, resources.map((r) => ({
|
|
131
|
+
name: options.barrelExportName?.(r) ?? r,
|
|
132
|
+
path: `./${r}.ts`,
|
|
133
|
+
}))));
|
|
134
|
+
yield* (options.finalize ?? formatGenerated)(outDir);
|
|
135
|
+
yield* Console.log(`\n✅ Generated ${totalOps} operations across ${written.length} resource modules.`);
|
|
136
|
+
yield* Console.log(` ${path.join(outDir, "index.ts")}`);
|
|
137
|
+
// Models that failed under continueOnModelError. Reported together,
|
|
138
|
+
// at the end, and the run FAILS — a generate that couldn't produce
|
|
139
|
+
// a module must not exit 0 with the failure buried in the log.
|
|
140
|
+
if (failedModels.length) {
|
|
141
|
+
yield* Console.error(`\n❌ ${failedModels.length} model(s) failed to generate:`);
|
|
142
|
+
for (const f of failedModels)
|
|
143
|
+
yield* Console.error(` ${f}`);
|
|
144
|
+
return yield* Effect.die(new Error(`${failedModels.length} model(s) failed to generate`));
|
|
145
|
+
}
|
|
146
|
+
})).pipe(Command.withDescription(options.description));
|
|
147
|
+
BunRuntime.runMain(Effect.provide(Command.run(command, { version: "1.0.0" }), BunServices.layer));
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/codegen/cli.ts"],"names":[],"mappings":"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"}
|