typespec-typescript-emitter 1.2.0 → 2.0.1
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/.husky/pre-commit +2 -1
- package/.prettierignore +2 -1
- package/CHANGELOG.md +19 -24
- package/CODE_OF_CONDUCT.md +128 -0
- package/README.md +362 -219
- package/dist/src/emit_routedTypemap.d.ts +4 -0
- package/dist/src/emit_routedTypemap.js +83 -0
- package/dist/src/emit_routedTypemap.js.map +1 -0
- package/dist/src/emit_routes.d.ts +3 -2
- package/dist/src/emit_routes.js +73 -47
- package/dist/src/emit_routes.js.map +1 -1
- package/dist/src/emit_types.d.ts +3 -9
- package/dist/src/emit_types.js +109 -74
- package/dist/src/emit_types.js.map +1 -1
- package/dist/src/emitter.d.ts +2 -6
- package/dist/src/emitter.js +18 -76
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/helpers/appendableString.d.ts +15 -0
- package/dist/src/helpers/appendableString.js +41 -0
- package/dist/src/helpers/appendableString.js.map +1 -0
- package/dist/src/helpers/arrays.d.ts +3 -0
- package/dist/src/helpers/arrays.js +23 -0
- package/dist/src/helpers/arrays.js.map +1 -0
- package/dist/src/{helper_autogenerateWarning.d.ts → helpers/autogenerateWarning.d.ts} +1 -1
- package/dist/src/{helper_autogenerateWarning.js → helpers/autogenerateWarning.js} +1 -2
- package/dist/src/helpers/autogenerateWarning.js.map +1 -0
- package/dist/src/helpers/buildTypeMap.d.ts +12 -0
- package/dist/src/helpers/buildTypeMap.js +44 -0
- package/dist/src/helpers/buildTypeMap.js.map +1 -0
- package/dist/src/helpers/diagnostics.d.ts +4 -0
- package/dist/src/helpers/diagnostics.js +15 -0
- package/dist/src/helpers/diagnostics.js.map +1 -0
- package/dist/src/helpers/getImports.d.ts +2 -0
- package/dist/src/helpers/getImports.js +3 -0
- package/dist/src/helpers/getImports.js.map +1 -0
- package/dist/src/helpers/namespaces.d.ts +4 -0
- package/dist/src/helpers/namespaces.js +14 -0
- package/dist/src/helpers/namespaces.js.map +1 -0
- package/dist/src/helpers/visibilityHelperFile.d.ts +4 -0
- package/dist/src/helpers/visibilityHelperFile.js +57 -0
- package/dist/src/helpers/visibilityHelperFile.js.map +1 -0
- package/dist/src/lib.d.ts +4 -1
- package/dist/src/lib.js +14 -3
- package/dist/src/lib.js.map +1 -1
- package/dist/src/parseOptions.d.ts +8 -0
- package/dist/src/parseOptions.js +26 -0
- package/dist/src/parseOptions.js.map +1 -0
- package/dist/src/resolve/Resolvable.d.ts +32 -0
- package/dist/src/resolve/Resolvable.js +180 -0
- package/dist/src/resolve/Resolvable.js.map +1 -0
- package/dist/src/resolve/Resolvable_helpers.d.ts +42 -0
- package/dist/src/resolve/Resolvable_helpers.js +19 -0
- package/dist/src/resolve/Resolvable_helpers.js.map +1 -0
- package/dist/src/resolve/operationTypemap.d.ts +21 -0
- package/dist/src/resolve/operationTypemap.js +138 -0
- package/dist/src/resolve/operationTypemap.js.map +1 -0
- package/dist/src/resolve/types/Enum.d.ts +21 -0
- package/dist/src/resolve/types/Enum.js +61 -0
- package/dist/src/resolve/types/Enum.js.map +1 -0
- package/dist/src/resolve/types/Model.Indexed.d.ts +12 -0
- package/dist/src/resolve/types/Model.Indexed.js +69 -0
- package/dist/src/resolve/types/Model.Indexed.js.map +1 -0
- package/dist/src/resolve/types/Model.Shaped.d.ts +17 -0
- package/dist/src/resolve/types/Model.Shaped.js +210 -0
- package/dist/src/resolve/types/Model.Shaped.js.map +1 -0
- package/dist/src/resolve/types/Scalar.d.ts +9 -0
- package/dist/src/resolve/types/Scalar.js +109 -0
- package/dist/src/resolve/types/Scalar.js.map +1 -0
- package/dist/src/resolve/types/Simple.d.ts +11 -0
- package/dist/src/resolve/types/Simple.js +49 -0
- package/dist/src/resolve/types/Simple.js.map +1 -0
- package/dist/src/resolve/types/Tuple.d.ts +9 -0
- package/dist/src/resolve/types/Tuple.js +38 -0
- package/dist/src/resolve/types/Tuple.js.map +1 -0
- package/dist/src/resolve/types/Union.d.ts +9 -0
- package/dist/src/resolve/types/Union.js +36 -0
- package/dist/src/resolve/types/Union.js.map +1 -0
- package/eslint.config.js +12 -4
- package/package.json +2 -2
- package/src/emit_routedTypemap.ts +128 -0
- package/src/emit_routes.ts +108 -61
- package/src/emit_types.ts +137 -92
- package/src/emitter.ts +19 -107
- package/src/helpers/appendableString.ts +52 -0
- package/src/helpers/arrays.ts +21 -0
- package/src/{helper_autogenerateWarning.ts → helpers/autogenerateWarning.ts} +0 -1
- package/src/helpers/buildTypeMap.ts +72 -0
- package/src/helpers/diagnostics.ts +19 -0
- package/src/helpers/getImports.ts +9 -0
- package/src/helpers/namespaces.ts +18 -0
- package/src/helpers/visibilityHelperFile.ts +63 -0
- package/src/lib.ts +25 -4
- package/src/parseOptions.ts +26 -0
- package/src/resolve/Resolvable.ts +267 -0
- package/src/resolve/Resolvable_helpers.ts +65 -0
- package/src/resolve/operationTypemap.ts +212 -0
- package/src/resolve/types/Enum.ts +92 -0
- package/src/resolve/types/Model.Indexed.ts +113 -0
- package/src/resolve/types/Model.Shaped.ts +291 -0
- package/src/resolve/types/Scalar.ts +140 -0
- package/src/resolve/types/Simple.ts +88 -0
- package/src/resolve/types/Tuple.ts +56 -0
- package/src/resolve/types/Union.ts +52 -0
- package/test/helpers/integrationTest-novis.tsp +51 -0
- package/test/helpers/integrationTest.tsp +53 -0
- package/test/helpers/largeModel.tsp +40 -0
- package/test/{runner.ts → helpers/runner.ts} +1 -1
- package/test/helpers/ts.ts +11 -0
- package/test/helpers/wrapper.ts +144 -0
- package/test/routes/routes.target.ts +35 -0
- package/test/routes/routes.test.ts +22 -0
- package/test/typeguards/combined.test.ts +78 -0
- package/test/typeguards/enum.test.ts +10 -0
- package/test/typeguards/model.indexed.test.ts +68 -0
- package/test/typeguards/model.shaped.test.ts +38 -0
- package/test/typeguards/scalar.test.ts +62 -0
- package/test/typeguards/simple.test.ts +35 -0
- package/test/typeguards/tuple.test.ts +34 -0
- package/test/typeguards/union.test.ts +29 -0
- package/test/typemap/typemap-novis.target.ts +38 -0
- package/test/typemap/typemap.target.ts +39 -0
- package/test/typemap/typemap.test.ts +48 -0
- package/test/types/combined.test.ts +71 -0
- package/test/types/enum.test.ts +57 -0
- package/test/types/model.indexed.test.ts +46 -0
- package/test/types/model.shaped.test.ts +23 -0
- package/test/types/scalar.test.ts +53 -0
- package/test/types/simple.test.ts +20 -0
- package/test/types/tuple.test.ts +29 -0
- package/test/types/union.test.ts +20 -0
- package/tsconfig.json +1 -0
- package/dist/src/emit_mapped_types.d.ts +0 -2
- package/dist/src/emit_mapped_types.js +0 -124
- package/dist/src/emit_mapped_types.js.map +0 -1
- package/dist/src/emit_types_resolve.d.ts +0 -22
- package/dist/src/emit_types_resolve.js +0 -217
- package/dist/src/emit_types_resolve.js.map +0 -1
- package/dist/src/emit_types_typeguards.d.ts +0 -17
- package/dist/src/emit_types_typeguards.js +0 -121
- package/dist/src/emit_types_typeguards.js.map +0 -1
- package/dist/src/helper_autogenerateWarning.js.map +0 -1
- package/src/emit_mapped_types.ts +0 -155
- package/src/emit_types_resolve.ts +0 -280
- package/src/emit_types_typeguards.ts +0 -178
- package/test/main.test.ts +0 -83
- package/test/out/.gitkeep +0 -0
- package/test/targets/enum.routed-types.ts +0 -59
- package/test/targets/enum.routes.ts +0 -29
- package/test/targets/enum.target.ts +0 -39
- package/test/targets/enum.tsp +0 -36
- package/test/targets/pr8.routed-types.ts +0 -131
- package/test/targets/pr8.routes.ts +0 -30
- package/test/targets/pr8.target.ts +0 -97
- package/test/targets/pr8.tsp +0 -62
- package/test/targets/simple-routes.routed-types.ts +0 -64
- package/test/targets/simple-routes.routes.ts +0 -29
- package/test/targets/simple-routes.target.ts +0 -21
- package/test/targets/simple-routes.tsp +0 -23
- package/test/targets/union.routed-types.ts +0 -59
- package/test/targets/union.routes.ts +0 -23
- package/test/targets/union.target.ts +0 -59
- package/test/targets/union.tsp +0 -38
- package/test/targets/visibility.routed-types.ts +0 -81
- package/test/targets/visibility.routes.ts +0 -38
- package/test/targets/visibility.target.ts +0 -36
- package/test/targets/visibility.tsp +0 -49
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { AppendableString } from "../helpers/appendableString.js";
|
|
2
|
+
import { compareArrays } from "../helpers/arrays.js";
|
|
3
|
+
import { reportDiagnostic } from "../helpers/diagnostics.js";
|
|
4
|
+
import { namespaceListFromNamespace } from "../helpers/namespaces.js";
|
|
5
|
+
import { Resolver, } from "./Resolvable_helpers.js";
|
|
6
|
+
export class Resolvable {
|
|
7
|
+
/** Recursively resolves a type. */
|
|
8
|
+
static async resolve(r, t, opts) {
|
|
9
|
+
const ret = {
|
|
10
|
+
resolved: new AppendableString(),
|
|
11
|
+
visibilityMap: "",
|
|
12
|
+
hasVisibility: false,
|
|
13
|
+
imports: [],
|
|
14
|
+
};
|
|
15
|
+
await (await Resolvable.for(r, t)).resolve(opts, ret);
|
|
16
|
+
return ret;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* To be called from within the resolution logic of a type:
|
|
20
|
+
* Resolves another type for the current type, handling required changes to the resolution options.
|
|
21
|
+
* The passed `out` object is not signifiantly changed, only the `hasVisibility` flag is managed.
|
|
22
|
+
*/
|
|
23
|
+
async resolveNested(t, opts, out, nest = true) {
|
|
24
|
+
// prepare nested resolution
|
|
25
|
+
if (nest)
|
|
26
|
+
opts.nestlevel++;
|
|
27
|
+
if (!opts.parents)
|
|
28
|
+
opts.parents = [];
|
|
29
|
+
opts.parents.push(this._t);
|
|
30
|
+
const ret = await Resolvable.resolve(this._r, t, opts);
|
|
31
|
+
// revert to current level
|
|
32
|
+
if (nest)
|
|
33
|
+
opts.nestlevel--;
|
|
34
|
+
opts.parents.pop();
|
|
35
|
+
return ret;
|
|
36
|
+
}
|
|
37
|
+
/** Creates the appropriate Resolvable instance for a given type. */
|
|
38
|
+
static async for(r, t) {
|
|
39
|
+
// use lazy imports to break circular dependencies
|
|
40
|
+
const { ResolvableSimple } = await import("./types/Simple.js");
|
|
41
|
+
if (ResolvableSimple.AllowedTypeKinds.includes(t.kind)) {
|
|
42
|
+
return new ResolvableSimple(t, r);
|
|
43
|
+
}
|
|
44
|
+
switch (t.kind) {
|
|
45
|
+
case "Enum": {
|
|
46
|
+
const { ResolvableEnum } = await import("./types/Enum.js");
|
|
47
|
+
return new ResolvableEnum(t, r);
|
|
48
|
+
}
|
|
49
|
+
case "EnumMember": {
|
|
50
|
+
const { ResolvableEnumMember } = await import("./types/Enum.js");
|
|
51
|
+
return new ResolvableEnumMember(t, r);
|
|
52
|
+
}
|
|
53
|
+
case "Model": {
|
|
54
|
+
const { IndexedModel } = await import("./types/Model.Indexed.js");
|
|
55
|
+
const { ShapedModel } = await import("./types/Model.Shaped.js");
|
|
56
|
+
switch (t.name) {
|
|
57
|
+
case "Array":
|
|
58
|
+
case "Record":
|
|
59
|
+
return new IndexedModel(t, r);
|
|
60
|
+
default:
|
|
61
|
+
return new ShapedModel(t, r);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
case "Scalar": {
|
|
65
|
+
const { ResolvableScalar } = await import("./types/Scalar.js");
|
|
66
|
+
return new ResolvableScalar(t, r);
|
|
67
|
+
}
|
|
68
|
+
case "Tuple": {
|
|
69
|
+
const { ResolvableTuple } = await import("./types/Tuple.js");
|
|
70
|
+
return new ResolvableTuple(t, r);
|
|
71
|
+
}
|
|
72
|
+
case "Union": {
|
|
73
|
+
const { ResolvableUnion } = await import("./types/Union.js");
|
|
74
|
+
return new ResolvableUnion(t, r);
|
|
75
|
+
}
|
|
76
|
+
default:
|
|
77
|
+
reportDiagnostic({
|
|
78
|
+
code: "resolve-unresolved",
|
|
79
|
+
message: `Could not resolve type ${t.kind}`,
|
|
80
|
+
severity: "error",
|
|
81
|
+
});
|
|
82
|
+
throw new TypeError(`Could not resolve type ${t.kind}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
constructor(t, r) {
|
|
86
|
+
this._t = t;
|
|
87
|
+
this._r = r;
|
|
88
|
+
}
|
|
89
|
+
_t;
|
|
90
|
+
_r;
|
|
91
|
+
/** Resolves the type, modifying an output object in place. */
|
|
92
|
+
async resolve(opts, out) {
|
|
93
|
+
this.validate();
|
|
94
|
+
const ownVisibility = await this.hasVisibility(opts, out);
|
|
95
|
+
if (ownVisibility)
|
|
96
|
+
out.hasVisibility = true;
|
|
97
|
+
// check for known resolved type
|
|
98
|
+
if (opts.rootTypeReady && this._t.name) {
|
|
99
|
+
// type without name can't be resolved
|
|
100
|
+
const currentNamespaces = namespaceListFromNamespace(this._t.namespace);
|
|
101
|
+
// find known resolved type
|
|
102
|
+
const foundKnownResolved = (() => {
|
|
103
|
+
const currentNamespaces = namespaceListFromNamespace(this._t.namespace);
|
|
104
|
+
if (currentNamespaces && currentNamespaces.length > 0) {
|
|
105
|
+
const found = opts.typemap.find((mt) => mt.type.kind === this._t.kind &&
|
|
106
|
+
mt.type.name === this._t.name &&
|
|
107
|
+
compareArrays(mt.namespaces, currentNamespaces));
|
|
108
|
+
return found ?? null;
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
})();
|
|
112
|
+
// if found, return name instead of full resolution
|
|
113
|
+
if (foundKnownResolved) {
|
|
114
|
+
if (opts.rootType &&
|
|
115
|
+
compareArrays(currentNamespaces, opts.rootType.namespaces)) {
|
|
116
|
+
// if namespace of found is same as current (= same file), just return name
|
|
117
|
+
out.resolved.append(this._r === Resolver.Type
|
|
118
|
+
? foundKnownResolved.type.name
|
|
119
|
+
: this._t.kind === "Enum"
|
|
120
|
+
? "true" // enums don't have typeguards
|
|
121
|
+
: `is${foundKnownResolved.type.name}(${opts.accessor}${ownVisibility ? ", vis" : ""})`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// found is in different file than current, prepare importing
|
|
125
|
+
out.resolved.append(`${foundKnownResolved.namespaces.join("_")}.${this._r === Resolver.Type
|
|
126
|
+
? foundKnownResolved.type.name
|
|
127
|
+
: this._t.kind === "Enum"
|
|
128
|
+
? "true" // enums don't have typeguards
|
|
129
|
+
: `is${foundKnownResolved.type.name}(${opts.accessor}${ownVisibility ? ", vis" : ""})`}`);
|
|
130
|
+
out.imports.push(foundKnownResolved.namespaces);
|
|
131
|
+
}
|
|
132
|
+
// optionally allow found type to modify output
|
|
133
|
+
if (this.transformKnownType !== undefined)
|
|
134
|
+
this.transformKnownType(opts, out);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// this prevents the root type from triggering known resolution
|
|
139
|
+
opts.rootTypeReady = true;
|
|
140
|
+
switch (this._r) {
|
|
141
|
+
case Resolver.Type:
|
|
142
|
+
return await this.type(opts, out);
|
|
143
|
+
case Resolver.Typeguard:
|
|
144
|
+
return await this.typeguard(opts, out);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
transformKnownType(
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
149
|
+
opts,
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
151
|
+
out) { }
|
|
152
|
+
/** Returns true if this type or anything it contains or references has visibility modifiers. */
|
|
153
|
+
async hasVisibility(opts, out) {
|
|
154
|
+
return out.hasVisibility;
|
|
155
|
+
}
|
|
156
|
+
/** Returns true if this type or anything it contains or references has visibility modifiers. */
|
|
157
|
+
static async hasVisibility(t, opts, out, current) {
|
|
158
|
+
if (!opts.parents)
|
|
159
|
+
opts.parents = [];
|
|
160
|
+
opts.parents.push(current);
|
|
161
|
+
const ret = await (await Resolvable.for(Resolver.Type /** doesn't matter */, t)).hasVisibility(opts, out);
|
|
162
|
+
opts.parents.pop();
|
|
163
|
+
return ret;
|
|
164
|
+
}
|
|
165
|
+
/** Checks its stored type to ensure the instance was created on a suitable type. */
|
|
166
|
+
validate() {
|
|
167
|
+
if (this._t.kind !== this.expectedTypeKind) {
|
|
168
|
+
this.diagnostic("typeclass-mismatch", `Tried creating resolver for ${this.expectedTypeKind} on type ${this._t.kind}`, "error");
|
|
169
|
+
throw new TypeError(`Type-kind/class mismatch: instanced ${this.expectedTypeKind} on type ${this._t.kind}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
diagnostic(code, msg, level) {
|
|
173
|
+
reportDiagnostic({
|
|
174
|
+
code: `resolve-${this._r}-${code}`,
|
|
175
|
+
message: msg,
|
|
176
|
+
severity: level,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=Resolvable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resolvable.js","sourceRoot":"","sources":["../../../src/resolve/Resolvable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Program, Type } from "@typespec/compiler";
|
|
2
|
+
import { AppendableString } from "../helpers/appendableString.js";
|
|
3
|
+
import { TTypeMap } from "../helpers/buildTypeMap.js";
|
|
4
|
+
import { EmitterOptions } from "../lib.js";
|
|
5
|
+
export declare enum Resolver {
|
|
6
|
+
Type = 0,
|
|
7
|
+
Typeguard = 1
|
|
8
|
+
}
|
|
9
|
+
export type ResolverOptions<R extends Resolver> = {
|
|
10
|
+
program: Program;
|
|
11
|
+
options: EmitterOptions;
|
|
12
|
+
typemap: TTypeMap;
|
|
13
|
+
nestlevel: number;
|
|
14
|
+
/** The type the entire resolution chain started with. */
|
|
15
|
+
rootType: TTypeMap[number] | null;
|
|
16
|
+
/**
|
|
17
|
+
* This tracks whether or not resolving *to* the type currently being investigated
|
|
18
|
+
* is valid. This allows for recursive types.
|
|
19
|
+
*/
|
|
20
|
+
rootTypeReady?: boolean;
|
|
21
|
+
/** The types "up the chain" - "parent" types on nested resolution. */
|
|
22
|
+
parents?: Type[];
|
|
23
|
+
} & (R extends Resolver.Type ? {
|
|
24
|
+
emitDocs: boolean;
|
|
25
|
+
} : {
|
|
26
|
+
/**
|
|
27
|
+
* This string describes how a function (part) of a typeguard can
|
|
28
|
+
* access the value currently being tested by it.
|
|
29
|
+
* Example: typeguard(t: any) on `n` for {n: string} -> this = "t"
|
|
30
|
+
*/
|
|
31
|
+
accessor: string;
|
|
32
|
+
});
|
|
33
|
+
/** Tries to find type in known types map */
|
|
34
|
+
export declare const getKnownResolvedType: (typemap: TTypeMap, t: any) => TTypeMap[number] | null;
|
|
35
|
+
export type ResolverResult<R extends Resolver> = {
|
|
36
|
+
readonly resolved: AppendableString;
|
|
37
|
+
visibilityMap: string;
|
|
38
|
+
imports: TTypeMap[number]["namespaces"][];
|
|
39
|
+
/** Whether any resolved part (nested types and base types included) have @visibility modifiers */
|
|
40
|
+
hasVisibility: boolean;
|
|
41
|
+
doc?: R extends Resolver.Type ? string : never;
|
|
42
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { compareArrays } from "../helpers/arrays.js";
|
|
2
|
+
import { namespaceListFromNamespace } from "../helpers/namespaces.js";
|
|
3
|
+
export var Resolver;
|
|
4
|
+
(function (Resolver) {
|
|
5
|
+
Resolver[Resolver["Type"] = 0] = "Type";
|
|
6
|
+
Resolver[Resolver["Typeguard"] = 1] = "Typeguard";
|
|
7
|
+
})(Resolver || (Resolver = {}));
|
|
8
|
+
/** Tries to find type in known types map */
|
|
9
|
+
export const getKnownResolvedType = (typemap, t) => {
|
|
10
|
+
const currentNamespaces = namespaceListFromNamespace(t.namespace);
|
|
11
|
+
if (currentNamespaces && currentNamespaces.length > 0) {
|
|
12
|
+
const found = typemap.find((mt) => mt.type.kind === t.kind &&
|
|
13
|
+
mt.type.name === t.name &&
|
|
14
|
+
compareArrays(mt.namespaces, currentNamespaces));
|
|
15
|
+
return found ?? null;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=Resolvable_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resolvable_helpers.js","sourceRoot":"","sources":["../../../src/resolve/Resolvable_helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAGtE,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,uCAAI,CAAA;IACJ,iDAAS,CAAA;AACX,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AA6BD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAiB,EACjB,CAAM,EACmB,EAAE;IAC3B,MAAM,iBAAiB,GAAG,0BAA0B,CAAE,CAAS,CAAC,SAAS,CAAC,CAAC;IAC3E,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YACvB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAM,CAAS,CAAC,IAAI;YAChC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAClD,CAAC;QACF,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Operation, Program } from "@typespec/compiler";
|
|
2
|
+
import { TTypeMap } from "../helpers/buildTypeMap.js";
|
|
3
|
+
import { EmitterOptions } from "../lib.js";
|
|
4
|
+
/** Maps a route path to its typemap definition and required imports */
|
|
5
|
+
export type TOperationTypemap = {
|
|
6
|
+
request: {
|
|
7
|
+
content: string;
|
|
8
|
+
hasVisibility: boolean;
|
|
9
|
+
};
|
|
10
|
+
response: {
|
|
11
|
+
content: Array<{
|
|
12
|
+
status: number | "unknown";
|
|
13
|
+
body: string;
|
|
14
|
+
hasVisibility: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare const resolveOperationTypemap: (program: Program, options: EmitterOptions, typemap: TTypeMap, op: Operation) => Promise<{
|
|
19
|
+
types: TOperationTypemap;
|
|
20
|
+
imports: TTypeMap[number]["namespaces"][];
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { getHttpOperation } from "@typespec/http";
|
|
2
|
+
import { Resolvable } from "./Resolvable.js";
|
|
3
|
+
import { Resolver } from "./Resolvable_helpers.js";
|
|
4
|
+
export const resolveOperationTypemap = async (program, options, typemap, op) => {
|
|
5
|
+
const httpOp = getHttpOperation(program, op)[0];
|
|
6
|
+
const ret = {
|
|
7
|
+
types: {
|
|
8
|
+
request: { content: "null", hasVisibility: false },
|
|
9
|
+
response: { content: [] },
|
|
10
|
+
},
|
|
11
|
+
imports: [],
|
|
12
|
+
};
|
|
13
|
+
// request
|
|
14
|
+
if (httpOp.parameters.body) {
|
|
15
|
+
const resolved = await Resolvable.resolve(Resolver.Type, httpOp.parameters.body.type, {
|
|
16
|
+
program,
|
|
17
|
+
options,
|
|
18
|
+
emitDocs: false,
|
|
19
|
+
nestlevel: 3,
|
|
20
|
+
rootType: null,
|
|
21
|
+
typemap,
|
|
22
|
+
rootTypeReady: true,
|
|
23
|
+
});
|
|
24
|
+
ret.imports.push(...resolved.imports);
|
|
25
|
+
ret.types.request.content = replaceLifecycle(resolved.resolved.value, httpOp.verb.toUpperCase(), resolved.hasVisibility);
|
|
26
|
+
if (resolved.hasVisibility)
|
|
27
|
+
ret.types.request.hasVisibility = true;
|
|
28
|
+
}
|
|
29
|
+
// response
|
|
30
|
+
if (op.returnType) {
|
|
31
|
+
const getReturnType = async (t) => {
|
|
32
|
+
const responseRet = { content: [] };
|
|
33
|
+
switch (t.kind) {
|
|
34
|
+
case "Model": {
|
|
35
|
+
// If the return type is a model, it may either be a "blank" body or a fully
|
|
36
|
+
// qualified response with status and body.
|
|
37
|
+
const modelret = {
|
|
38
|
+
status: 200,
|
|
39
|
+
body: "{}",
|
|
40
|
+
hasVisibility: false,
|
|
41
|
+
};
|
|
42
|
+
// check for fully qualified response or plain body
|
|
43
|
+
let wasFullyQualified = false;
|
|
44
|
+
for (const prop of t.properties) {
|
|
45
|
+
for (const decorator of prop[1].decorators) {
|
|
46
|
+
// find status code
|
|
47
|
+
if (decorator.definition?.name === "@statusCode" &&
|
|
48
|
+
prop[1].type.kind === "Number")
|
|
49
|
+
modelret.status = prop[1].type.value;
|
|
50
|
+
// find body definiton
|
|
51
|
+
if (decorator.definition?.name === "@body") {
|
|
52
|
+
const resolved = await Resolvable.resolve(Resolver.Type, prop[1].type, {
|
|
53
|
+
program,
|
|
54
|
+
options,
|
|
55
|
+
emitDocs: false,
|
|
56
|
+
nestlevel: 3,
|
|
57
|
+
rootType: null,
|
|
58
|
+
typemap,
|
|
59
|
+
rootTypeReady: true,
|
|
60
|
+
});
|
|
61
|
+
if (resolved.hasVisibility)
|
|
62
|
+
modelret.hasVisibility = true;
|
|
63
|
+
ret.imports.push(...resolved.imports);
|
|
64
|
+
modelret.body = replaceLifecycle(resolved.resolved.value, "RETURN", resolved.hasVisibility);
|
|
65
|
+
wasFullyQualified = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!wasFullyQualified) {
|
|
70
|
+
const resolved = await Resolvable.resolve(Resolver.Type, t, {
|
|
71
|
+
program,
|
|
72
|
+
options,
|
|
73
|
+
emitDocs: false,
|
|
74
|
+
nestlevel: 3,
|
|
75
|
+
rootType: null,
|
|
76
|
+
typemap,
|
|
77
|
+
rootTypeReady: true,
|
|
78
|
+
});
|
|
79
|
+
if (resolved.hasVisibility)
|
|
80
|
+
modelret.hasVisibility = true;
|
|
81
|
+
ret.imports.push(...resolved.imports);
|
|
82
|
+
modelret.body = replaceLifecycle(resolved.resolved.value, "RETURN", resolved.hasVisibility);
|
|
83
|
+
}
|
|
84
|
+
responseRet.content.push(modelret);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case "Union": {
|
|
88
|
+
// if return type is a union, each variant may be fully qualified or body-only
|
|
89
|
+
for (const variant of t.variants) {
|
|
90
|
+
const resolved = await getReturnType(variant[1].type);
|
|
91
|
+
responseRet.content.push(...resolved.content);
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
default: {
|
|
96
|
+
// return type does not have a qualified body; making one up and resolving that one
|
|
97
|
+
const resolved = await Resolvable.resolve(Resolver.Type, t, {
|
|
98
|
+
program,
|
|
99
|
+
options,
|
|
100
|
+
emitDocs: false,
|
|
101
|
+
nestlevel: 3,
|
|
102
|
+
rootType: null,
|
|
103
|
+
typemap,
|
|
104
|
+
rootTypeReady: true,
|
|
105
|
+
});
|
|
106
|
+
ret.imports.push(...resolved.imports);
|
|
107
|
+
responseRet.content.push({
|
|
108
|
+
status: 200,
|
|
109
|
+
body: replaceLifecycle(resolved.resolved.value, httpOp.verb.toUpperCase(), resolved.hasVisibility),
|
|
110
|
+
hasVisibility: resolved.hasVisibility,
|
|
111
|
+
});
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return responseRet;
|
|
116
|
+
};
|
|
117
|
+
ret.types.response = await getReturnType(op.returnType);
|
|
118
|
+
}
|
|
119
|
+
return ret;
|
|
120
|
+
};
|
|
121
|
+
/** Maps HTTP verbs to lifecycle states. See @typespec/compiler/.../visibility.tsp */
|
|
122
|
+
const VerbToLifecycle = {
|
|
123
|
+
RETURN: ["Read"], // for all return types
|
|
124
|
+
POST: ["Create"],
|
|
125
|
+
PUT: ["Create", "Update"],
|
|
126
|
+
PATCH: ["Update"],
|
|
127
|
+
DELETE: ["Delete"],
|
|
128
|
+
GET: ["Query"], // *parameters* of request, return type is still RETURN
|
|
129
|
+
Head: ["Query"],
|
|
130
|
+
};
|
|
131
|
+
// lifecycle assignment helper
|
|
132
|
+
const replaceLifecycle = (resolved, verb, hasVisibility) => {
|
|
133
|
+
const opLifecycle = VerbToLifecycle[verb];
|
|
134
|
+
if (!hasVisibility)
|
|
135
|
+
return resolved;
|
|
136
|
+
return resolved.replaceAll("V>", `V extends Lifecycle.All ? (${opLifecycle.map((l) => `Lifecycle.${l}`).join(" | ")}) : V>`);
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=operationTypemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operationTypemap.js","sourceRoot":"","sources":["../../../src/resolve/operationTypemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Enum, EnumMember } from "@typespec/compiler";
|
|
2
|
+
import { Resolvable } from "../Resolvable.js";
|
|
3
|
+
import { Resolver, ResolverOptions, ResolverResult } from "../Resolvable_helpers.js";
|
|
4
|
+
/**
|
|
5
|
+
* This resolves Enums completely, meaning it doesn't try to resolve
|
|
6
|
+
* members as EnumMember, because EnumMember resolution references the base Enum.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ResolvableEnum extends Resolvable<Enum> {
|
|
9
|
+
protected expectedTypeKind: string;
|
|
10
|
+
protected type(opts: ResolverOptions<Resolver.Type>, out: ResolverResult<Resolver.Type>): Promise<void>;
|
|
11
|
+
protected typeguard(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* This cannot resolve members during Enum resolution, because this
|
|
15
|
+
* will try to reference the base Enum by name.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ResolvableEnumMember extends Resolvable<EnumMember> {
|
|
18
|
+
protected expectedTypeKind: string;
|
|
19
|
+
protected type(opts: ResolverOptions<Resolver.Type>, out: ResolverResult<Resolver.Type>): Promise<void>;
|
|
20
|
+
protected typeguard(opts: ResolverOptions<Resolver.Typeguard>, out: ResolverResult<Resolver.Typeguard>): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getDoc } from "@typespec/compiler";
|
|
2
|
+
import { compareArrays } from "../../helpers/arrays.js";
|
|
3
|
+
import { namespaceListFromNamespace } from "../../helpers/namespaces.js";
|
|
4
|
+
import { Resolvable } from "../Resolvable.js";
|
|
5
|
+
/**
|
|
6
|
+
* This resolves Enums completely, meaning it doesn't try to resolve
|
|
7
|
+
* members as EnumMember, because EnumMember resolution references the base Enum.
|
|
8
|
+
*/
|
|
9
|
+
export class ResolvableEnum extends Resolvable {
|
|
10
|
+
expectedTypeKind = "Enum";
|
|
11
|
+
async type(opts, out) {
|
|
12
|
+
if (opts.emitDocs) {
|
|
13
|
+
out.doc = getDoc(opts.program, this._t);
|
|
14
|
+
}
|
|
15
|
+
out.resolved.append("{\n");
|
|
16
|
+
let i = 1;
|
|
17
|
+
this._t.members.forEach((member) => {
|
|
18
|
+
const val = resolveEnumMemberValue(member, opts);
|
|
19
|
+
out.resolved.addLine(`${member.name.includes("-") ? `'${member.name}'` : member.name}${val}${i < this._t.members.size ? "," : ""}`, opts.nestlevel + 1);
|
|
20
|
+
i++;
|
|
21
|
+
});
|
|
22
|
+
out.resolved.addLine("}", opts.nestlevel, "continued");
|
|
23
|
+
}
|
|
24
|
+
async typeguard() {
|
|
25
|
+
// enums cannot have typeguards
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* This cannot resolve members during Enum resolution, because this
|
|
31
|
+
* will try to reference the base Enum by name.
|
|
32
|
+
*/
|
|
33
|
+
export class ResolvableEnumMember extends Resolvable {
|
|
34
|
+
expectedTypeKind = "EnumMember";
|
|
35
|
+
async type(opts, out) {
|
|
36
|
+
const foundParent = opts.typemap.find((mt) => mt.type.kind === "Enum" &&
|
|
37
|
+
mt.type.name === this._t.enum.name &&
|
|
38
|
+
compareArrays(mt.namespaces, namespaceListFromNamespace(this._t.enum.namespace) ?? []));
|
|
39
|
+
if (foundParent) {
|
|
40
|
+
out.resolved.append(`${foundParent.type.name}.${this._t.name}`);
|
|
41
|
+
out.imports.push(foundParent.namespaces);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
out.resolved.append(resolveEnumMemberValue(this._t, opts));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async typeguard(opts, out) {
|
|
48
|
+
out.resolved.append("true");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const resolveEnumMemberValue = (member, opts) => {
|
|
52
|
+
return member.value === undefined
|
|
53
|
+
? opts.options["string-nominal-enums"]
|
|
54
|
+
? ` = '${member.name}'`
|
|
55
|
+
: ""
|
|
56
|
+
: " = " +
|
|
57
|
+
(typeof member.value === "string"
|
|
58
|
+
? `'${member.value}'`
|
|
59
|
+
: member.value.toString());
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=Enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Enum.js","sourceRoot":"","sources":["../../../../src/resolve/types/Enum.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Model } from "@typespec/compiler";
|
|
2
|
+
import { Resolvable } from "../Resolvable.js";
|
|
3
|
+
import { Resolver, ResolverOptions, ResolverResult } from "../Resolvable_helpers.js";
|
|
4
|
+
export declare class IndexedModel extends Resolvable<Model> {
|
|
5
|
+
constructor(t: Model, r: Resolver);
|
|
6
|
+
private _indexedModelKind;
|
|
7
|
+
protected expectedTypeKind: string;
|
|
8
|
+
hasVisibility(opts: ResolverOptions<Resolver>, out: ResolverResult<Resolver>): Promise<boolean>;
|
|
9
|
+
protected type(opts: ResolverOptions<Resolver.Type>, out: ResolverResult<Resolver.Type>): Promise<void>;
|
|
10
|
+
protected typeguard(opts: ResolverOptions<Resolver.Typeguard>, out: ResolverResult<Resolver.Typeguard>): Promise<void>;
|
|
11
|
+
protected validate(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Resolvable } from "../Resolvable.js";
|
|
2
|
+
var Type;
|
|
3
|
+
(function (Type) {
|
|
4
|
+
Type[Type["Array"] = 0] = "Array";
|
|
5
|
+
Type[Type["Record"] = 1] = "Record";
|
|
6
|
+
})(Type || (Type = {}));
|
|
7
|
+
export class IndexedModel extends Resolvable {
|
|
8
|
+
constructor(t, r) {
|
|
9
|
+
super(t, r);
|
|
10
|
+
if (t.name === "Array") {
|
|
11
|
+
this._indexedModelKind = Type.Array;
|
|
12
|
+
}
|
|
13
|
+
else if (t.name === "Record") {
|
|
14
|
+
this._indexedModelKind = Type.Record;
|
|
15
|
+
}
|
|
16
|
+
else
|
|
17
|
+
throw new TypeError(`Cannot create IndexedModel on type of name ${t.name}`);
|
|
18
|
+
}
|
|
19
|
+
_indexedModelKind;
|
|
20
|
+
expectedTypeKind = "Model";
|
|
21
|
+
async hasVisibility(opts, out) {
|
|
22
|
+
if (await super.hasVisibility(opts, out))
|
|
23
|
+
return true;
|
|
24
|
+
if (await Resolvable.hasVisibility(this._t.indexer.value, opts, out, this._t))
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
async type(opts, out) {
|
|
29
|
+
const resolved = await this.resolveNested(this._t.indexer.value, opts, out, false);
|
|
30
|
+
switch (this._indexedModelKind) {
|
|
31
|
+
case Type.Array:
|
|
32
|
+
out.resolved.append(`(${resolved.resolved})[]`);
|
|
33
|
+
break;
|
|
34
|
+
case Type.Record:
|
|
35
|
+
out.resolved.append(`{[k: string]: ${resolved.resolved}}`);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
out.imports.push(...resolved.imports);
|
|
39
|
+
}
|
|
40
|
+
async typeguard(opts, out) {
|
|
41
|
+
const oldAccessor = opts.accessor;
|
|
42
|
+
opts.accessor = this._indexedModelKind === Type.Array ? "v" : "v[1]";
|
|
43
|
+
const resolved = await this.resolveNested(this._t.indexer.value, opts, out);
|
|
44
|
+
opts.accessor = oldAccessor;
|
|
45
|
+
if (resolved.resolved.value.endsWith("\n"))
|
|
46
|
+
resolved.resolved.dropLast();
|
|
47
|
+
switch (this._indexedModelKind) {
|
|
48
|
+
case Type.Array:
|
|
49
|
+
out.resolved.append(`Array.isArray(${opts.accessor}) && ${opts.accessor}.every((v) => ${resolved.resolved})`);
|
|
50
|
+
break;
|
|
51
|
+
case Type.Record:
|
|
52
|
+
out.resolved.append(`typeof ${opts.accessor} === 'object' && Object.entries(${opts.accessor} as Record<string, any>).every((v) => ${resolved.resolved})`);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
out.imports.push(...resolved.imports);
|
|
56
|
+
}
|
|
57
|
+
validate() {
|
|
58
|
+
if (this._t.name !== "Array" && this._t.name !== "Record") {
|
|
59
|
+
this.diagnostic("typeclass-modeltype-mismatch", "Tried creating IndexedModel for non-array and non-record model type", "error");
|
|
60
|
+
throw new Error("Tried creating IndexedModel for non-array and non-record model type");
|
|
61
|
+
}
|
|
62
|
+
if (!this._t.indexer) {
|
|
63
|
+
this.diagnostic("no-indexer", "Tried creating IndexedModel for type without indexer", "error");
|
|
64
|
+
throw new Error("Tried creating IndexedModel for type without indexer");
|
|
65
|
+
}
|
|
66
|
+
super.validate();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=Model.Indexed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Model.Indexed.js","sourceRoot":"","sources":["../../../../src/resolve/types/Model.Indexed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Model } from "@typespec/compiler";
|
|
2
|
+
import { Resolvable } from "../Resolvable.js";
|
|
3
|
+
import { Resolver, ResolverOptions, ResolverResult } from "../Resolvable_helpers.js";
|
|
4
|
+
export declare class ShapedModel extends Resolvable<Model> {
|
|
5
|
+
protected expectedTypeKind: string;
|
|
6
|
+
private getProps;
|
|
7
|
+
private getPropVisibilityType;
|
|
8
|
+
/**
|
|
9
|
+
* Checks whether or not any of the model's properties has @visibility modifier.
|
|
10
|
+
* Also returns true if any base model (in the entire chain) has a visibility OR if
|
|
11
|
+
* any nested type (in the model's properties) has a visibility.
|
|
12
|
+
*/
|
|
13
|
+
hasVisibility(opts: ResolverOptions<Resolver>, out: ResolverResult<Resolver>): Promise<boolean>;
|
|
14
|
+
protected type(opts: ResolverOptions<Resolver.Type>, out: ResolverResult<Resolver.Type>): Promise<void>;
|
|
15
|
+
protected typeguard(opts: ResolverOptions<Resolver.Typeguard>, out: ResolverResult<Resolver.Typeguard>): Promise<void>;
|
|
16
|
+
protected transformKnownType(opts: ResolverOptions<Resolver>, out: ResolverResult<Resolver>): void;
|
|
17
|
+
}
|