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,83 @@
|
|
|
1
|
+
import { emitFile, navigateProgram, resolvePath, } from "@typespec/compiler";
|
|
2
|
+
import { getHttpOperation } from "@typespec/http";
|
|
3
|
+
import { unique2D } from "./helpers/arrays.js";
|
|
4
|
+
import autogenerateWarning from "./helpers/autogenerateWarning.js";
|
|
5
|
+
import { getImports } from "./helpers/getImports.js";
|
|
6
|
+
import { visibilityHelperFileName } from "./helpers/visibilityHelperFile.js";
|
|
7
|
+
import { resolveOperationTypemap, } from "./resolve/operationTypemap.js";
|
|
8
|
+
export const emitRoutedTypemap = async (program, options, typemap) => {
|
|
9
|
+
// save original targeted namespaces array because it's mutated here
|
|
10
|
+
const targetedNamespaces = structuredClone(options["root-namespaces"]);
|
|
11
|
+
const namespaceImports = {};
|
|
12
|
+
const namespaceOps = {};
|
|
13
|
+
// finding all operations
|
|
14
|
+
const foundOps = {};
|
|
15
|
+
const traverseNamespace = (n, rootName) => {
|
|
16
|
+
if (!foundOps[rootName])
|
|
17
|
+
foundOps[rootName] = [];
|
|
18
|
+
foundOps[rootName].push(...Array.from(n.operations).map((op) => op[1]));
|
|
19
|
+
n.namespaces.forEach((ns) => traverseNamespace(ns, rootName));
|
|
20
|
+
};
|
|
21
|
+
navigateProgram(program, {
|
|
22
|
+
namespace(n) {
|
|
23
|
+
const nsIndex = options["root-namespaces"].findIndex((ns) => n.name === ns);
|
|
24
|
+
if (nsIndex === -1)
|
|
25
|
+
return;
|
|
26
|
+
// for some reason, navigateProgram visits each namespace multiple times; this prevents that
|
|
27
|
+
delete options["root-namespaces"][nsIndex];
|
|
28
|
+
traverseNamespace(n, n.name);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
// resolving operations
|
|
32
|
+
for (const ns of Object.entries(foundOps)) {
|
|
33
|
+
for (const op of ns[1]) {
|
|
34
|
+
const resolved = await resolveOperationTypemap(program, options, typemap, op);
|
|
35
|
+
const httpOp = getHttpOperation(program, op)[0];
|
|
36
|
+
if (!namespaceImports[ns[0]])
|
|
37
|
+
namespaceImports[ns[0]] = [];
|
|
38
|
+
namespaceImports[ns[0]].push(...resolved.imports);
|
|
39
|
+
if (!namespaceOps[ns[0]])
|
|
40
|
+
namespaceOps[ns[0]] = { ops: {}, hasVisibility: false };
|
|
41
|
+
if (!namespaceOps[ns[0]].ops[httpOp.path])
|
|
42
|
+
namespaceOps[ns[0]].ops[httpOp.path] = {};
|
|
43
|
+
namespaceOps[ns[0]].ops[httpOp.path][httpOp.verb.toUpperCase()] =
|
|
44
|
+
resolved.types;
|
|
45
|
+
if (resolved.types.request.hasVisibility ||
|
|
46
|
+
resolved.types.response.content.some((v) => v.hasVisibility))
|
|
47
|
+
namespaceOps[ns[0]].hasVisibility = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// emitting
|
|
51
|
+
for (const ns of Object.entries(namespaceOps)) {
|
|
52
|
+
const importStrings = getImports(unique2D(namespaceImports[ns[0]]));
|
|
53
|
+
if (ns[1].hasVisibility) {
|
|
54
|
+
importStrings.push(`import {Lifecycle, FilterLifecycle} from './${visibilityHelperFileName}';`);
|
|
55
|
+
}
|
|
56
|
+
let out = `export type types_${ns[0]}${ns[1].hasVisibility ? "<V extends Lifecycle = Lifecycle.All>" : ""} = {\n`;
|
|
57
|
+
out += Object.entries(ns[1].ops)
|
|
58
|
+
.map((path) => {
|
|
59
|
+
let pathret = ` ['${path[0]}']: {\n`;
|
|
60
|
+
pathret += Object.entries(path[1])
|
|
61
|
+
.map((verb) => {
|
|
62
|
+
let verbret = ` ['${verb[0]}']: {\n`;
|
|
63
|
+
verbret += ` request: ${verb[1].request.content}\n`;
|
|
64
|
+
verbret += ` response: ${verb[1].response.content.map((res) => `{status: ${res.status}, body: ${res.body}}`).join(" | ")}\n`;
|
|
65
|
+
verbret += " }";
|
|
66
|
+
return verbret;
|
|
67
|
+
})
|
|
68
|
+
.join(",\n");
|
|
69
|
+
pathret += "\n }";
|
|
70
|
+
return pathret;
|
|
71
|
+
})
|
|
72
|
+
.join(",\n");
|
|
73
|
+
out += "\n};\n";
|
|
74
|
+
const content = `/* eslint-disable */\n\n${autogenerateWarning}\n${importStrings.join("\n")}\n\n${out}`;
|
|
75
|
+
await emitFile(program, {
|
|
76
|
+
path: resolvePath(options["out-dir"], `routedTypemap_${ns[0]}.ts`),
|
|
77
|
+
content: content,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// restore un-mutated version
|
|
81
|
+
options["root-namespaces"] = targetedNamespaces;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=emit_routedTypemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_routedTypemap.js","sourceRoot":"","sources":["../../src/emit_routedTypemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Program } from "@typespec/compiler";
|
|
2
|
+
import { EmitterOptions } from "./lib.js";
|
|
3
|
+
export declare const emitRoutes: (program: Program, options: EmitterOptions) => Promise<void>;
|
package/dist/src/emit_routes.js
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
import { getDoc, isTemplateDeclaration, } from "@typespec/compiler";
|
|
1
|
+
import { emitFile, getDoc, isTemplateDeclaration, navigateProgram, resolvePath, } from "@typespec/compiler";
|
|
2
2
|
import { getAuthentication, getHttpOperation } from "@typespec/http";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// getUrl
|
|
20
|
-
const pathParams = httpOp[0].parameters.parameters.filter((p) => p.type === "path");
|
|
21
|
-
const pathParamsArgsString = pathParams
|
|
3
|
+
import { AppendableString } from "./helpers/appendableString.js";
|
|
4
|
+
import autogenerateWarning from "./helpers/autogenerateWarning.js";
|
|
5
|
+
export const emitRoutes = async (program, options) => {
|
|
6
|
+
// save original targeted namespaces array because it's mutated here
|
|
7
|
+
const targetedNamespaces = structuredClone(options["root-namespaces"]);
|
|
8
|
+
const files = {};
|
|
9
|
+
const traverseNamespace = (n, nestlevel, rootName) => {
|
|
10
|
+
if (files[rootName] === undefined)
|
|
11
|
+
files[rootName] = new AppendableString(`export const routes_${rootName} = {\n`);
|
|
12
|
+
const numCollections = Array.from(n.interfaces ?? []).length +
|
|
13
|
+
Array.from((n.namespaces ?? [])).length;
|
|
14
|
+
let i = 1;
|
|
15
|
+
for (const op of n.operations) {
|
|
16
|
+
const httpOp = getHttpOperation(program, op[1])[0];
|
|
17
|
+
const pathParams = httpOp.parameters.parameters.filter((p) => p.type === "path");
|
|
18
|
+
const urlParams = `params: {${pathParams
|
|
22
19
|
.map((p) => `${p.name}: string`)
|
|
23
|
-
.join(", ")
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
20
|
+
.join(", ")}}`;
|
|
21
|
+
const urlReturn = pathParams.reduce((sum, cur) => sum.replaceAll(`{${cur.name}}`, `${"$"}{params.${cur.name}}`), `\`${httpOp.path}\``);
|
|
22
|
+
const doc = getDoc(program, op[1]);
|
|
23
|
+
if (doc)
|
|
24
|
+
files[rootName].addLine(`/** ${doc} */`
|
|
25
|
+
.split("\n")
|
|
26
|
+
.map((l) => `${" ".repeat(nestlevel)}${l}`)
|
|
27
|
+
.join("\n"), 0);
|
|
28
|
+
files[rootName]
|
|
29
|
+
.addLine(`${op[1].name}: {`, nestlevel)
|
|
30
|
+
.addLine(`verb: '${httpOp.verb.toUpperCase()}',`, nestlevel + 1)
|
|
31
|
+
.addLine(`path: '${httpOp.path}',`, nestlevel + 1)
|
|
32
|
+
.addLine(`getUrl: (${pathParams.length > 0 ? urlParams : ""}): string => ${urlReturn},`, nestlevel + 1);
|
|
27
33
|
// auth
|
|
28
34
|
let auth = [];
|
|
29
|
-
const opAuth = getAuthentication(
|
|
35
|
+
const opAuth = getAuthentication(program, op[1]);
|
|
30
36
|
if (opAuth) {
|
|
31
37
|
opAuth.options.forEach((authOption) => authOption.schemes.forEach((authScheme) => {
|
|
32
38
|
if (authScheme.type === "noAuth")
|
|
@@ -46,7 +52,7 @@ export const emitRoutes = (context, namespace) => {
|
|
|
46
52
|
}
|
|
47
53
|
else
|
|
48
54
|
auth = [null];
|
|
49
|
-
|
|
55
|
+
files[rootName].addLine(`auth: [${auth
|
|
50
56
|
.map((authEntry) => !authEntry
|
|
51
57
|
? "null"
|
|
52
58
|
: typeof authEntry === "string"
|
|
@@ -54,29 +60,49 @@ export const emitRoutes = (context, namespace) => {
|
|
|
54
60
|
: `{${Object.entries(authEntry)
|
|
55
61
|
.map((entry) => `${entry[0]}: '${entry[1]}'`)
|
|
56
62
|
.join(", ")}}`)
|
|
57
|
-
.join(", ")}]`,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
n
|
|
63
|
-
|
|
64
|
-
itf.operations.forEach(processOp);
|
|
65
|
-
});
|
|
66
|
-
// get and traverse all namespaces
|
|
67
|
-
let nsnum = 0;
|
|
68
|
-
n.namespaces.forEach((ns) => {
|
|
69
|
-
nsnum++;
|
|
70
|
-
const doc = getDoc(context.program, ns);
|
|
63
|
+
.join(", ")}]`, nestlevel + 1);
|
|
64
|
+
files[rootName].addLine(i < n.operations.size || numCollections > 0 ? "}," : "}", nestlevel);
|
|
65
|
+
i++;
|
|
66
|
+
}
|
|
67
|
+
let collectionNum = 1;
|
|
68
|
+
const printCollection = (n) => {
|
|
69
|
+
const doc = getDoc(program, n);
|
|
71
70
|
if (doc)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
files[rootName].addLine(`/** ${doc} */`
|
|
72
|
+
.split("\n")
|
|
73
|
+
.map((l) => `${" ".repeat(nestlevel)}${l}`)
|
|
74
|
+
.join("\n"));
|
|
75
|
+
files[rootName].addLine(`${n.name}: {`, nestlevel);
|
|
76
|
+
traverseNamespace(n, nestlevel + 1, rootName);
|
|
77
|
+
files[rootName].addLine(collectionNum < numCollections ? "}," : "}", nestlevel);
|
|
78
|
+
collectionNum++;
|
|
79
|
+
};
|
|
80
|
+
(n.interfaces ?? []).forEach((i) => {
|
|
81
|
+
if (!isTemplateDeclaration(i))
|
|
82
|
+
printCollection(i);
|
|
76
83
|
});
|
|
84
|
+
(n.namespaces ?? []).forEach((ns) => printCollection(ns));
|
|
85
|
+
if (n.name === rootName && nestlevel === 1)
|
|
86
|
+
files[rootName].addLine("} as const;");
|
|
77
87
|
};
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
navigateProgram(program, {
|
|
89
|
+
namespace(n) {
|
|
90
|
+
const nsIndex = options["root-namespaces"].findIndex((ns) => n.name === ns);
|
|
91
|
+
if (nsIndex === -1)
|
|
92
|
+
return;
|
|
93
|
+
// for some reason, navigateProgram visits each namespace multiple times; this prevents that
|
|
94
|
+
delete options["root-namespaces"][nsIndex];
|
|
95
|
+
traverseNamespace(n, 1, n.name);
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
// emitting
|
|
99
|
+
for (const file of Object.entries(files)) {
|
|
100
|
+
await emitFile(program, {
|
|
101
|
+
path: resolvePath(options["out-dir"], `routes_${file[0]}.ts`),
|
|
102
|
+
content: `/* eslint-disable */\n\n${autogenerateWarning}\n${file[1].value}`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// restore un-mutated version
|
|
106
|
+
options["root-namespaces"] = targetedNamespaces;
|
|
81
107
|
};
|
|
82
108
|
//# sourceMappingURL=emit_routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit_routes.js","sourceRoot":"","sources":["../../src/emit_routes.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"emit_routes.js","sourceRoot":"","sources":["../../src/emit_routes.ts"],"names":[],"mappings":"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"}
|
package/dist/src/emit_types.d.ts
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Program } from "@typespec/compiler";
|
|
2
|
+
import { TTypeMap } from "./helpers/buildTypeMap.js";
|
|
2
3
|
import { EmitterOptions } from "./lib.js";
|
|
3
|
-
declare const emitTypes: (
|
|
4
|
-
files: Record<string, string>;
|
|
5
|
-
typeguardedNames: Array<{
|
|
6
|
-
filename: string;
|
|
7
|
-
name: string;
|
|
8
|
-
}>;
|
|
9
|
-
};
|
|
10
|
-
export default emitTypes;
|
|
4
|
+
export declare const emitTypes: (program: Program, options: EmitterOptions, typemap: TTypeMap) => Promise<void>;
|
package/dist/src/emit_types.js
CHANGED
|
@@ -1,81 +1,116 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import { emitFile, resolvePath } from "@typespec/compiler";
|
|
2
|
+
import { AppendableString } from "./helpers/appendableString.js";
|
|
3
|
+
import { unique2D } from "./helpers/arrays.js";
|
|
4
|
+
import autogenerateWarning from "./helpers/autogenerateWarning.js";
|
|
5
|
+
import { getImports } from "./helpers/getImports.js";
|
|
6
|
+
import { filenameFromNamespaces } from "./helpers/namespaces.js";
|
|
7
|
+
import { visibilityHelperFileName } from "./helpers/visibilityHelperFile.js";
|
|
8
|
+
import { Resolvable } from "./resolve/Resolvable.js";
|
|
9
|
+
import { Resolver } from "./resolve/Resolvable_helpers.js";
|
|
10
|
+
export const emitTypes = async (program, options, typemap) => {
|
|
11
|
+
// maps file names to file contents
|
|
12
|
+
const files = {};
|
|
13
|
+
// maps file names to list of required imports
|
|
14
|
+
const imports = {};
|
|
15
|
+
// generate files
|
|
16
|
+
typemap.forEach((t) => {
|
|
17
|
+
files[filenameFromNamespaces(t.namespaces)] = new AppendableString();
|
|
18
|
+
imports[filenameFromNamespaces(t.namespaces)] = {
|
|
19
|
+
namespaces: [],
|
|
20
|
+
lifecycleTypes: [],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
const typeOrder = ["Enum", "Scalar", "Model", "Union"];
|
|
24
|
+
typemap.sort((a, b) => typeOrder.indexOf(a.type.kind) - typeOrder.indexOf(b.type.kind));
|
|
25
|
+
// resolve all types
|
|
26
|
+
for (let i = 0; i < typemap.length; i++) {
|
|
27
|
+
const t = typemap[i];
|
|
28
|
+
const filename = filenameFromNamespaces(t.namespaces);
|
|
29
|
+
const resolved = await Resolvable.resolve(Resolver.Type, t.type, {
|
|
30
|
+
program,
|
|
31
|
+
options,
|
|
32
|
+
emitDocs: true,
|
|
33
|
+
nestlevel: 0,
|
|
34
|
+
rootType: t,
|
|
35
|
+
typemap: typemap,
|
|
23
36
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
imports[filename].namespaces.push(...resolved.imports);
|
|
38
|
+
let declaration = "export ";
|
|
39
|
+
switch (t.type.kind) {
|
|
40
|
+
case "Enum":
|
|
41
|
+
declaration += `enum ${t.type.name}`;
|
|
42
|
+
break;
|
|
43
|
+
case "Scalar":
|
|
44
|
+
declaration += `type ${t.type.name} =`;
|
|
45
|
+
break;
|
|
46
|
+
case "Model":
|
|
47
|
+
declaration += `type ${t.type.name}${resolved.hasVisibility ? "<V extends Lifecycle = Lifecycle.All>" : ""} =`;
|
|
48
|
+
// Making ALL types generic (regardless of whether they need it) improves ease-of-use,
|
|
49
|
+
// both for the user as well for the dev when accessing known types.
|
|
50
|
+
// declaration += `type ${t.type.name}${resolved.hasVisibility ? "<V extends Lifecycle = Lifecycle.All>" : ""} =`;
|
|
51
|
+
break;
|
|
52
|
+
case "Union":
|
|
53
|
+
declaration += `type ${t.type.name}${resolved.hasVisibility ? "<V extends Lifecycle = Lifecycle.All>" : ""} =`;
|
|
54
|
+
// declaration += `type ${t.type.name}${resolved.hasVisibility ? "<V extends Lifecycle = Lifecycle.All>" : ""} =`;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
if (resolved.doc)
|
|
58
|
+
files[filename].addLine(`/** ${resolved.doc} */`);
|
|
59
|
+
if (resolved.hasVisibility) {
|
|
60
|
+
imports[filename].lifecycleTypes.push("FilterLifecycle", "Lifecycle");
|
|
61
|
+
}
|
|
62
|
+
if (t.type.kind === "Model" &&
|
|
63
|
+
t.type.name !== "Array" &&
|
|
64
|
+
t.type.name !== "Record" &&
|
|
65
|
+
resolved.visibilityMap.replaceAll("{", "").replaceAll("}", "").trim()) {
|
|
66
|
+
files[filename].addLine(`${declaration} ${resolved.resolved.value}`);
|
|
67
|
+
// files[filename].addLine(
|
|
68
|
+
// `${declaration} FilterLifecycle<${resolved.resolved.value}, typeof ${t.type.name}_VisMap, V>`,
|
|
69
|
+
// );
|
|
70
|
+
// files[filename].addLine(
|
|
71
|
+
// `export const ${t.type.name}_VisMap = ${resolved.visibilityMap} as const`,
|
|
72
|
+
// );
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
files[filename].addLine(`${declaration} ${resolved.resolved.value}`);
|
|
76
|
+
}
|
|
77
|
+
if (options["enable-typeguards"]) {
|
|
78
|
+
const typeguard = await Resolvable.resolve(Resolver.Typeguard, t.type, {
|
|
79
|
+
program,
|
|
80
|
+
options,
|
|
81
|
+
nestlevel: 1,
|
|
82
|
+
rootType: t,
|
|
83
|
+
typemap: typemap,
|
|
84
|
+
accessor: "t",
|
|
85
|
+
});
|
|
86
|
+
if (typeguard.resolved.value) {
|
|
87
|
+
if (typeguard.hasVisibility) {
|
|
88
|
+
imports[filename].lifecycleTypes.push("Lifecycle");
|
|
89
|
+
files[filename].addLine(`export function is${t.type.name}(t: any, vis: Lifecycle = Lifecycle.All): t is ${t.type.name}<typeof vis> {return (${typeguard.resolved})}`);
|
|
37
90
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
n.models.forEach((m) => {
|
|
41
|
-
if (options["enable-types"]) {
|
|
42
|
-
const resolved = resolveModel(m, {
|
|
43
|
-
nestlevel: 0,
|
|
44
|
-
currentNamespace: n,
|
|
45
|
-
context,
|
|
46
|
-
isNamespaceRoot: true,
|
|
47
|
-
});
|
|
48
|
-
if (resolved) {
|
|
49
|
-
const doc = getDoc(context.program, m);
|
|
50
|
-
if (doc)
|
|
51
|
-
file = file.addLine(`/** ${doc} */`);
|
|
52
|
-
file = file.addLine(`export interface ${m.name} ${resolved};`);
|
|
91
|
+
else {
|
|
92
|
+
files[filename].addLine(`export function is${t.type.name}(t: any): t is ${t.type.name} {return (${typeguard.resolved})}`);
|
|
53
93
|
}
|
|
94
|
+
imports[filename].namespaces.push(...typeguard.imports);
|
|
54
95
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
96
|
+
}
|
|
97
|
+
files[filename].append("\n");
|
|
98
|
+
}
|
|
99
|
+
const filesArr = Object.entries(files).filter((f) => !!f[1].value);
|
|
100
|
+
for (let i = 0; i < filesArr.length; i++) {
|
|
101
|
+
if (!filesArr[i][1].value)
|
|
102
|
+
continue;
|
|
103
|
+
const filename = filesArr[i][0];
|
|
104
|
+
imports[filename].namespaces = unique2D(imports[filename].namespaces);
|
|
105
|
+
const importStrings = getImports(imports[filename].namespaces.filter((i) => filenameFromNamespaces(i) !== filename));
|
|
106
|
+
if (imports[filename].lifecycleTypes.length > 0) {
|
|
107
|
+
importStrings.push(`import {${[...new Set(imports[filename].lifecycleTypes)].join(", ")}} from './${visibilityHelperFileName}';`); // unique-ify
|
|
108
|
+
}
|
|
109
|
+
const content = `/* eslint-disable */\n\n${autogenerateWarning}${importStrings.join("\n")}${importStrings.length > 0 ? "\n\n" : ""}${filesArr[i][1].value}`;
|
|
110
|
+
await emitFile(program, {
|
|
111
|
+
path: resolvePath(options["out-dir"], filename),
|
|
112
|
+
content: content,
|
|
71
113
|
});
|
|
72
|
-
|
|
73
|
-
out.files[n.name.charAt(0).toUpperCase() + n.name.slice(1)] = file;
|
|
74
|
-
// recursively iterate child namespaces
|
|
75
|
-
n.namespaces.forEach((ns) => traverseNamespace(ns));
|
|
76
|
-
};
|
|
77
|
-
traverseNamespace(namespace);
|
|
78
|
-
return out;
|
|
114
|
+
}
|
|
79
115
|
};
|
|
80
|
-
export default emitTypes;
|
|
81
116
|
//# sourceMappingURL=emit_types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit_types.js","sourceRoot":"","sources":["../../src/emit_types.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"emit_types.js","sourceRoot":"","sources":["../../src/emit_types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/emitter.d.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
import { EmitContext } from "@typespec/compiler";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
addLine(str: string, tabs?: number, continued?: boolean): string;
|
|
5
|
-
}
|
|
6
|
-
}
|
|
7
|
-
export declare function $onEmit(context: EmitContext): Promise<void>;
|
|
2
|
+
import { EmitterOptions } from "./lib.js";
|
|
3
|
+
export declare function $onEmit(context: EmitContext<EmitterOptions>): Promise<void>;
|