typespec-rust-emitter 0.12.0 → 0.13.0
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/AGENTS.md +82 -80
- package/CHANGELOG.md +17 -0
- package/dist/src/decorators/cache_control.d.ts +6 -0
- package/dist/src/decorators/cache_control.js +9 -0
- package/dist/src/decorators/cache_control.js.map +1 -0
- package/dist/src/decorators/etag_cache.d.ts +6 -0
- package/dist/src/decorators/etag_cache.js +9 -0
- package/dist/src/decorators/etag_cache.js.map +1 -0
- package/dist/src/decorators/index.d.ts +6 -0
- package/dist/src/decorators/index.js +7 -0
- package/dist/src/decorators/index.js.map +1 -0
- package/dist/src/decorators/rust_attr.d.ts +3 -0
- package/dist/src/decorators/rust_attr.js +45 -0
- package/dist/src/decorators/rust_attr.js.map +1 -0
- package/dist/src/decorators/rust_derive.d.ts +3 -0
- package/dist/src/decorators/rust_derive.js +39 -0
- package/dist/src/decorators/rust_derive.js.map +1 -0
- package/dist/src/decorators/rust_impl.d.ts +2 -0
- package/dist/src/decorators/rust_impl.js +19 -0
- package/dist/src/decorators/rust_impl.js.map +1 -0
- package/dist/src/decorators/rust_self.d.ts +3 -0
- package/dist/src/decorators/rust_self.js +35 -0
- package/dist/src/decorators/rust_self.js.map +1 -0
- package/dist/src/emitter.d.ts +2 -11
- package/dist/src/emitter.js +7 -1282
- package/dist/src/emitter.js.map +1 -1
- package/dist/src/formatter/index.d.ts +2 -0
- package/dist/src/formatter/index.js +3 -0
- package/dist/src/formatter/index.js.map +1 -0
- package/dist/src/formatter/mappings.d.ts +4 -0
- package/dist/src/formatter/mappings.js +68 -0
- package/dist/src/formatter/mappings.js.map +1 -0
- package/dist/src/formatter/strings.d.ts +4 -0
- package/dist/src/formatter/strings.js +32 -0
- package/dist/src/formatter/strings.js.map +1 -0
- package/dist/src/generator/etag_router.d.ts +30 -0
- package/dist/src/generator/etag_router.js +123 -0
- package/dist/src/generator/etag_router.js.map +1 -0
- package/dist/src/generator/index.d.ts +5 -0
- package/dist/src/generator/index.js +6 -0
- package/dist/src/generator/index.js.map +1 -0
- package/dist/src/generator/response_enums.d.ts +6 -0
- package/dist/src/generator/response_enums.js +58 -0
- package/dist/src/generator/response_enums.js.map +1 -0
- package/dist/src/generator/router.d.ts +7 -0
- package/dist/src/generator/router.js +227 -0
- package/dist/src/generator/router.js.map +1 -0
- package/dist/src/generator/server_trait.d.ts +6 -0
- package/dist/src/generator/server_trait.js +97 -0
- package/dist/src/generator/server_trait.js.map +1 -0
- package/dist/src/generator/types_file.d.ts +11 -0
- package/dist/src/generator/types_file.js +209 -0
- package/dist/src/generator/types_file.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib.js +1 -1
- package/dist/src/lib.js.map +1 -1
- package/dist/src/models/index.d.ts +2 -0
- package/dist/src/models/index.js +3 -0
- package/dist/src/models/index.js.map +1 -0
- package/dist/src/models/keys.d.ts +6 -0
- package/dist/src/models/keys.js +8 -0
- package/dist/src/models/keys.js.map +1 -0
- package/dist/src/models/types.d.ts +45 -0
- package/dist/src/models/types.js +2 -0
- package/dist/src/models/types.js.map +1 -0
- package/dist/src/parser/decorators.d.ts +18 -0
- package/dist/src/parser/decorators.js +28 -0
- package/dist/src/parser/decorators.js.map +1 -0
- package/dist/src/parser/index.d.ts +6 -0
- package/dist/src/parser/index.js +7 -0
- package/dist/src/parser/index.js.map +1 -0
- package/dist/src/parser/operations.d.ts +13 -0
- package/dist/src/parser/operations.js +127 -0
- package/dist/src/parser/operations.js.map +1 -0
- package/dist/src/parser/parameters.d.ts +5 -0
- package/dist/src/parser/parameters.js +98 -0
- package/dist/src/parser/parameters.js.map +1 -0
- package/dist/src/parser/responses.d.ts +13 -0
- package/dist/src/parser/responses.js +132 -0
- package/dist/src/parser/responses.js.map +1 -0
- package/dist/src/parser/routes.d.ts +4 -0
- package/dist/src/parser/routes.js +36 -0
- package/dist/src/parser/routes.js.map +1 -0
- package/dist/src/parser/types.d.ts +9 -0
- package/dist/src/parser/types.js +157 -0
- package/dist/src/parser/types.js.map +1 -0
- package/dist/test/etag_cache.test.d.ts +1 -0
- package/dist/test/etag_cache.test.js +62 -0
- package/dist/test/etag_cache.test.js.map +1 -0
- package/dist/test/test-host.d.ts +11 -0
- package/dist/test/test-host.js +28 -0
- package/dist/test/test-host.js.map +1 -1
- package/example/main.tsp +27 -1
- package/example/output-rust/Cargo.lock +48 -0
- package/example/output-rust/Cargo.toml +1 -0
- package/example/output-rust/src/generated/server.rs +122 -11
- package/example/output-rust/src/generated/types.rs +6 -0
- package/example/output-rust/src/main.rs +60 -27
- package/justfile +31 -2
- package/package.json +1 -1
- package/scripts/update-golden.js +36 -0
- package/src/decorators/cache_control.ts +14 -0
- package/src/decorators/etag_cache.ts +14 -0
- package/src/decorators/index.ts +6 -0
- package/src/decorators/rust_attr.ts +61 -0
- package/src/decorators/rust_derive.ts +55 -0
- package/src/decorators/rust_impl.ts +29 -0
- package/src/decorators/rust_self.ts +42 -0
- package/src/emitter.ts +18 -1654
- package/src/formatter/index.ts +2 -0
- package/src/formatter/mappings.ts +70 -0
- package/src/formatter/strings.ts +33 -0
- package/src/generator/etag_router.ts +147 -0
- package/src/generator/index.ts +5 -0
- package/src/generator/response_enums.ts +76 -0
- package/src/generator/router.ts +280 -0
- package/src/generator/server_trait.ts +134 -0
- package/src/generator/types_file.ts +297 -0
- package/src/index.ts +3 -1
- package/src/lib.ts +1 -1
- package/src/lib.tsp +3 -1
- package/src/models/index.ts +2 -0
- package/src/models/keys.ts +7 -0
- package/src/models/types.ts +54 -0
- package/src/parser/decorators.ts +34 -0
- package/src/parser/index.ts +6 -0
- package/src/parser/operations.ts +158 -0
- package/src/parser/parameters.ts +117 -0
- package/src/parser/responses.ts +170 -0
- package/src/parser/routes.ts +47 -0
- package/src/parser/types.ts +215 -0
- package/test/etag_cache.test.ts +69 -0
- package/test/golden/etag_cache/server.rs +109 -0
- package/test/golden/etag_cache/spec.tsp +20 -0
- package/test/golden/etag_cache/types.rs +13 -0
- package/test/test-host.ts +43 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { toPascalCase, toRustIdent } from "../formatter/strings.js";
|
|
2
|
+
import { emitOperationInfo, hasAuthDecorator, getSelfReceiver, hasEtagCache, } from "../parser/operations.js";
|
|
3
|
+
import { getFullRoute } from "../parser/routes.js";
|
|
4
|
+
import { getRustTypeForProperty } from "../parser/types.js";
|
|
5
|
+
import { hasMultipartBody } from "../parser/parameters.js";
|
|
6
|
+
import { generateEtagHandler } from "./etag_router.js";
|
|
7
|
+
export function generateRouter(program, namespaceGroups, anonymousEnums) {
|
|
8
|
+
const handlers = [];
|
|
9
|
+
const queryTypeStructs = [];
|
|
10
|
+
const publicRoutes = [];
|
|
11
|
+
const protectedRoutes = [];
|
|
12
|
+
const usedMethods = new Set();
|
|
13
|
+
const hasEtag = namespaceGroups.some((g) => g.operations.some((o) => hasEtagCache(program, o)));
|
|
14
|
+
for (const group of namespaceGroups) {
|
|
15
|
+
const nsRoute = getFullRoute(program, group.namespace);
|
|
16
|
+
if (!nsRoute)
|
|
17
|
+
continue;
|
|
18
|
+
const nsName = toPascalCase(group.namespace.name.replace(/[^a-zA-Z0-9_]/g, "_"));
|
|
19
|
+
for (const op of group.operations) {
|
|
20
|
+
const opInfo = emitOperationInfo(program, op, nsRoute, anonymousEnums);
|
|
21
|
+
if (!opInfo)
|
|
22
|
+
continue;
|
|
23
|
+
const method = opInfo.method.toLowerCase();
|
|
24
|
+
usedMethods.add(method);
|
|
25
|
+
const handlerFnName = toRustIdent(`${nsName}_${opInfo.name}`);
|
|
26
|
+
const traitFnName = handlerFnName;
|
|
27
|
+
const isProtected = hasAuthDecorator(op);
|
|
28
|
+
const selfReceiver = getSelfReceiver(op);
|
|
29
|
+
const pathParams = opInfo.parameters.filter((p) => p.location === "path");
|
|
30
|
+
const hasPathParams = pathParams.length > 0;
|
|
31
|
+
const queryParams = opInfo.parameters.filter((p) => p.location === "query");
|
|
32
|
+
const hasQueryParams = queryParams.length > 0;
|
|
33
|
+
const hasBody = !!opInfo.body;
|
|
34
|
+
const isMultipartBody = hasMultipartBody(op);
|
|
35
|
+
const extractorLines = [];
|
|
36
|
+
const serverArgs = [];
|
|
37
|
+
const serviceBinding = selfReceiver === "&mut self" ? "mut service" : "service";
|
|
38
|
+
if (isProtected) {
|
|
39
|
+
extractorLines.push(` Extension(claims): Extension<S::Claims>,`);
|
|
40
|
+
serverArgs.push(`claims`);
|
|
41
|
+
}
|
|
42
|
+
if (hasPathParams) {
|
|
43
|
+
const pathTypes = pathParams.map((p) => p.rustType).join(", ");
|
|
44
|
+
const pathFields = pathParams.map((p) => p.rustName).join(", ");
|
|
45
|
+
if (pathParams.length === 1) {
|
|
46
|
+
extractorLines.push(` Path(${pathFields}): Path<${pathTypes}>,`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
extractorLines.push(` Path((${pathFields})): Path<(${pathTypes})>,`);
|
|
50
|
+
}
|
|
51
|
+
for (const param of pathParams) {
|
|
52
|
+
serverArgs.push(param.rustName);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (hasQueryParams && queryParams.length > 0) {
|
|
56
|
+
const queryTypeName = `${toPascalCase(handlerFnName)}Query`;
|
|
57
|
+
const queryFields = queryParams
|
|
58
|
+
.map((p) => ` #[serde(rename = "${p.name}")]\n pub ${p.rustName}: ${p.rustType}`)
|
|
59
|
+
.join(",\n");
|
|
60
|
+
queryTypeStructs.push(`#[derive(Debug, Clone, serde::Deserialize)]\npub struct ${queryTypeName} {\n${queryFields}\n}`);
|
|
61
|
+
extractorLines.push(` Query(params): Query<${queryTypeName}>,`);
|
|
62
|
+
for (const param of queryParams) {
|
|
63
|
+
serverArgs.push(`params.${param.rustName}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (hasBody && opInfo.body) {
|
|
67
|
+
if (isMultipartBody) {
|
|
68
|
+
extractorLines.push(` multipart: axum::extract::Multipart,`);
|
|
69
|
+
serverArgs.push(`multipart`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const bodyType = getRustTypeForProperty(opInfo.body.type, program, anonymousEnums);
|
|
73
|
+
extractorLines.push(` Json(payload): Json<${bodyType.type}>,`);
|
|
74
|
+
serverArgs.push(`payload`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const serverArgsStr = serverArgs.join(", ");
|
|
78
|
+
if (hasEtagCache(program, op)) {
|
|
79
|
+
const cacheKey = `${handlerFnName}:${pathParams.map((p) => `{${p.rustName}}`).join(":")}`;
|
|
80
|
+
const code = generateEtagHandler({
|
|
81
|
+
handlerFnName,
|
|
82
|
+
cacheKey,
|
|
83
|
+
pathParams,
|
|
84
|
+
serverArgsStr,
|
|
85
|
+
responseName: `${nsName}${toPascalCase(opInfo.name)}Response`,
|
|
86
|
+
etagKey: opInfo.etagKey,
|
|
87
|
+
cacheControl: opInfo.cacheControl,
|
|
88
|
+
});
|
|
89
|
+
handlers.push(code);
|
|
90
|
+
const routePath = `"${opInfo.path}"`;
|
|
91
|
+
const routeStmt = `.route(${routePath}, ${method}(${handlerFnName}_handler::<S, C>))`;
|
|
92
|
+
if (isProtected) {
|
|
93
|
+
protectedRoutes.push(routeStmt);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
publicRoutes.push(routeStmt);
|
|
97
|
+
}
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const serverCall = `service.${traitFnName}(${serverArgsStr}).await`;
|
|
101
|
+
let responseHandling = opInfo.cacheControl
|
|
102
|
+
? `match result {
|
|
103
|
+
Ok(response) => {
|
|
104
|
+
let mut res = response.into_response();
|
|
105
|
+
res.headers_mut().insert(
|
|
106
|
+
axum::http::header::CACHE_CONTROL,
|
|
107
|
+
axum::http::HeaderValue::from_static("${opInfo.cacheControl}"),
|
|
108
|
+
);
|
|
109
|
+
res
|
|
110
|
+
}
|
|
111
|
+
Err(e) => (
|
|
112
|
+
axum::http::StatusCode::INTERNAL_SERVER_ERROR,
|
|
113
|
+
format!("Internal error: {e}"),
|
|
114
|
+
)
|
|
115
|
+
.into_response(),
|
|
116
|
+
}`
|
|
117
|
+
: `match result {
|
|
118
|
+
Ok(response) => response.into_response(),
|
|
119
|
+
Err(e) => (
|
|
120
|
+
axum::http::StatusCode::INTERNAL_SERVER_ERROR,
|
|
121
|
+
format!("Internal error: {e}"),
|
|
122
|
+
)
|
|
123
|
+
.into_response(),
|
|
124
|
+
}`;
|
|
125
|
+
const needsClone = selfReceiver !== "self" ? "+ Clone" : "";
|
|
126
|
+
const handlerCode = selfReceiver === "self"
|
|
127
|
+
? `// NOTE: ${handlerFnName} takes self and cannot be used with the router pattern.
|
|
128
|
+
// It consumes the service, so you need to implement your own handler pattern.
|
|
129
|
+
pub async fn ${handlerFnName}_handler<S>(
|
|
130
|
+
axum::extract::State(service): axum::extract::State<S>,
|
|
131
|
+
${extractorLines.join("\n")}
|
|
132
|
+
) -> impl axum::response::IntoResponse
|
|
133
|
+
where
|
|
134
|
+
S: Server + Send + Sync + 'static,
|
|
135
|
+
S::Claims: Send + Sync + Clone + 'static,
|
|
136
|
+
{
|
|
137
|
+
let result = service.${traitFnName}(${serverArgsStr}).await;
|
|
138
|
+
${responseHandling}
|
|
139
|
+
}`
|
|
140
|
+
: `pub async fn ${handlerFnName}_handler<S>(
|
|
141
|
+
axum::extract::State(${serviceBinding}): axum::extract::State<S>,
|
|
142
|
+
${extractorLines.join("\n")}
|
|
143
|
+
) -> impl axum::response::IntoResponse
|
|
144
|
+
where
|
|
145
|
+
S: Server${needsClone} + Send + Sync + 'static,
|
|
146
|
+
S::Claims: Send + Sync + Clone + 'static,
|
|
147
|
+
{
|
|
148
|
+
let result = ${serverCall};
|
|
149
|
+
${responseHandling}
|
|
150
|
+
}`;
|
|
151
|
+
handlers.push(handlerCode);
|
|
152
|
+
if (selfReceiver === "self") {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const routePath = `"${opInfo.path}"`;
|
|
156
|
+
let routeStmt = "";
|
|
157
|
+
if (isProtected) {
|
|
158
|
+
routeStmt = `.route(${routePath}, ${method}(${handlerFnName}_handler::<S>))`;
|
|
159
|
+
protectedRoutes.push(routeStmt);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
routeStmt = `.route(${routePath}, ${method}(${handlerFnName}_handler::<S>))`;
|
|
163
|
+
publicRoutes.push(routeStmt);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const methodImports = Array.from(usedMethods).sort().join(", ");
|
|
168
|
+
const routerBody = buildRouterBody(publicRoutes, protectedRoutes);
|
|
169
|
+
const parts = [];
|
|
170
|
+
parts.push(`use axum::extract::{Query, Multipart};
|
|
171
|
+
use axum::routing::{${methodImports}};
|
|
172
|
+
use axum::Router;
|
|
173
|
+
|
|
174
|
+
`);
|
|
175
|
+
if (queryTypeStructs.length > 0) {
|
|
176
|
+
parts.push(queryTypeStructs.join("\n\n"));
|
|
177
|
+
parts.push("\n\n");
|
|
178
|
+
}
|
|
179
|
+
parts.push(handlers.join("\n\n"));
|
|
180
|
+
if (hasEtag) {
|
|
181
|
+
parts.push(`
|
|
182
|
+
pub fn create_router<S, C, M>(service: S, cache: C, middleware: M) -> Router
|
|
183
|
+
where
|
|
184
|
+
S: Server + Clone + Send + Sync + 'static,
|
|
185
|
+
S::Claims: Send + Sync + Clone + 'static,
|
|
186
|
+
C: EtagCache + Clone + Send + Sync + 'static + axum::extract::FromRef<S>,
|
|
187
|
+
M: FnOnce(Router<S>) -> Router<S> + Clone + Send + Sync + 'static,
|
|
188
|
+
{
|
|
189
|
+
${routerBody.replace("Router::new()", "Router::new().with_state(cache)")}
|
|
190
|
+
}`);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
parts.push(`
|
|
194
|
+
pub fn create_router<S, M>(service: S, middleware: M) -> Router
|
|
195
|
+
where
|
|
196
|
+
S: Server + Clone + Send + Sync + 'static,
|
|
197
|
+
S::Claims: Send + Sync + Clone + 'static,
|
|
198
|
+
M: FnOnce(Router<S>) -> Router<S> + Clone + Send + Sync + 'static,
|
|
199
|
+
{
|
|
200
|
+
${routerBody}
|
|
201
|
+
}`);
|
|
202
|
+
}
|
|
203
|
+
return parts.join("\n");
|
|
204
|
+
}
|
|
205
|
+
export function buildRouterBody(publicRoutes, protectedRoutes) {
|
|
206
|
+
const lines = [];
|
|
207
|
+
lines.push(" let mut router = Router::new();");
|
|
208
|
+
if (publicRoutes.length > 0) {
|
|
209
|
+
lines.push(" let public = Router::new()");
|
|
210
|
+
for (const r of publicRoutes) {
|
|
211
|
+
lines.push(` ${r.trim()}`);
|
|
212
|
+
}
|
|
213
|
+
lines.push(" ;");
|
|
214
|
+
lines.push(" router = router.merge(public);");
|
|
215
|
+
}
|
|
216
|
+
if (protectedRoutes.length > 0) {
|
|
217
|
+
lines.push(" let protected = Router::new()");
|
|
218
|
+
for (const r of protectedRoutes) {
|
|
219
|
+
lines.push(` ${r.trim()}`);
|
|
220
|
+
}
|
|
221
|
+
lines.push(" ;");
|
|
222
|
+
lines.push(" router = router.merge(middleware(protected));");
|
|
223
|
+
}
|
|
224
|
+
lines.push(" router.with_state(service)");
|
|
225
|
+
return lines.join("\n");
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/generator/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Operation, Program, Namespace } from "@typespec/compiler";
|
|
2
|
+
import { AnonymousStringLiteralUnion } from "../models/types.js";
|
|
3
|
+
export declare function generateServerTrait(program: Program, namespaceGroups: {
|
|
4
|
+
namespace: Namespace;
|
|
5
|
+
operations: Operation[];
|
|
6
|
+
}[], anonymousEnums: Map<string, AnonymousStringLiteralUnion>): string;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { formatDoc, toPascalCase, toRustIdent } from "../formatter/strings.js";
|
|
2
|
+
import { emitOperationInfo, hasAuthDecorator, getSelfReceiver, hasEtagCache, } from "../parser/operations.js";
|
|
3
|
+
import { getRustTypeForProperty } from "../parser/types.js";
|
|
4
|
+
import { hasMultipartBody } from "../parser/parameters.js";
|
|
5
|
+
import { generateEtagCacheTrait } from "./etag_router.js";
|
|
6
|
+
export function generateServerTrait(program, namespaceGroups, anonymousEnums) {
|
|
7
|
+
const parts = [];
|
|
8
|
+
parts.push(`use super::types::*;
|
|
9
|
+
use async_trait::async_trait;
|
|
10
|
+
use axum::extract::Path;
|
|
11
|
+
use axum::Extension;
|
|
12
|
+
use axum::http::StatusCode;
|
|
13
|
+
use axum::response::IntoResponse;
|
|
14
|
+
use axum::Json;
|
|
15
|
+
use eyre::Result;
|
|
16
|
+
|
|
17
|
+
`);
|
|
18
|
+
if (namespaceGroups.some((g) => g.operations.some((o) => hasEtagCache(program, o)))) {
|
|
19
|
+
parts.push(generateEtagCacheTrait());
|
|
20
|
+
parts.push("\n");
|
|
21
|
+
}
|
|
22
|
+
parts.push(`#[async_trait]
|
|
23
|
+
pub trait Server: Send + Sync {
|
|
24
|
+
type Claims: Send + Sync + 'static;
|
|
25
|
+
|
|
26
|
+
`);
|
|
27
|
+
for (const group of namespaceGroups) {
|
|
28
|
+
const nsName = toPascalCase(group.namespace.name.replace(/[^a-zA-Z0-9_]/g, "_"));
|
|
29
|
+
for (const op of group.operations) {
|
|
30
|
+
const opInfo = emitOperationInfo(program, op, "", anonymousEnums);
|
|
31
|
+
if (!opInfo)
|
|
32
|
+
continue;
|
|
33
|
+
if (opInfo.doc) {
|
|
34
|
+
parts.push(` ${formatDoc(opInfo.doc)}`);
|
|
35
|
+
}
|
|
36
|
+
const responseName = `${nsName}${toPascalCase(opInfo.name)}Response`;
|
|
37
|
+
const fnName = toRustIdent(`${nsName}_${opInfo.name}`);
|
|
38
|
+
const isProtected = hasAuthDecorator(op);
|
|
39
|
+
// Build parameter list for the trait method
|
|
40
|
+
const paramParts = [];
|
|
41
|
+
// Add path parameters
|
|
42
|
+
for (const param of opInfo.parameters) {
|
|
43
|
+
if (param.location === "path") {
|
|
44
|
+
paramParts.push(`${param.rustName}: ${param.rustType}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Add query parameters
|
|
48
|
+
for (const param of opInfo.parameters) {
|
|
49
|
+
if (param.location === "query") {
|
|
50
|
+
paramParts.push(`${param.rustName}: ${param.rustType}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Add body parameter
|
|
54
|
+
if (opInfo.body) {
|
|
55
|
+
if (hasMultipartBody(op)) {
|
|
56
|
+
paramParts.push(`body: Multipart`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const bodyType = getRustTypeForProperty(opInfo.body.type, program, anonymousEnums);
|
|
60
|
+
paramParts.push(`body: ${bodyType.type}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const paramsStr = paramParts.join(", ");
|
|
64
|
+
const selfReceiver = getSelfReceiver(op);
|
|
65
|
+
if (hasEtagCache(program, op)) {
|
|
66
|
+
const paramList = paramsStr ? `cache: &C, ${paramsStr}` : `cache: &C`;
|
|
67
|
+
if (isProtected) {
|
|
68
|
+
parts.push(` async fn ${fnName}<C: EtagCache + Send + Sync>(\n ${selfReceiver}, claims: Self::Claims, ${paramList}\n ) -> Result<${responseName}>;`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
parts.push(` async fn ${fnName}<C: EtagCache + Send + Sync>(\n ${selfReceiver}, ${paramList}\n ) -> Result<${responseName}>;`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
if (isProtected) {
|
|
76
|
+
if (paramsStr) {
|
|
77
|
+
parts.push(` async fn ${fnName}(${selfReceiver}, claims: Self::Claims, ${paramsStr}) -> Result<${responseName}>;`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
parts.push(` async fn ${fnName}(${selfReceiver}, claims: Self::Claims) -> Result<${responseName}>;`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (paramsStr) {
|
|
85
|
+
parts.push(` async fn ${fnName}(${selfReceiver}, ${paramsStr}) -> Result<${responseName}>;`);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
parts.push(` async fn ${fnName}(${selfReceiver}) -> Result<${responseName}>;`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
parts.push("}");
|
|
95
|
+
return parts.join("\n");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=server_trait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server_trait.js","sourceRoot":"","sources":["../../../src/generator/server_trait.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CACjC,OAAgB,EAChB,eAAoE,EACpE,cAAwD;IAExD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC;;;;;;;;;CASZ,CAAC,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC;;;;CAIZ,CAAC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,YAAY,CACzB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CACpD,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACrE,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAEzC,4CAA4C;YAC5C,MAAM,UAAU,GAAa,EAAE,CAAC;YAEhC,sBAAsB;YACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;oBAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,qBAAqB;YACrB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;oBACzB,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,sBAAsB,CACrC,MAAM,CAAC,IAAI,CAAC,IAAI,EAChB,OAAO,EACP,cAAc,CACf,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;YAEzC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;gBACtE,IAAI,WAAW,EAAE,CAAC;oBAChB,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,0CAA0C,YAAY,2BAA2B,SAAS,qBAAqB,YAAY,IAAI,CACtJ,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,0CAA0C,YAAY,KAAK,SAAS,qBAAqB,YAAY,IAAI,CAChI,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,SAAS,EAAE,CAAC;wBACd,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,IAAI,YAAY,2BAA2B,SAAS,eAAe,YAAY,IAAI,CAC1G,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,IAAI,YAAY,qCAAqC,YAAY,IAAI,CAC5F,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,SAAS,EAAE,CAAC;wBACd,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,IAAI,YAAY,KAAK,SAAS,eAAe,YAAY,IAAI,CACpF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,KAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,IAAI,YAAY,eAAe,YAAY,IAAI,CACtE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Enum, Model, ModelProperty, Program, Scalar, Union } from "@typespec/compiler";
|
|
2
|
+
import { AnonymousStringLiteralUnion } from "../models/types.js";
|
|
3
|
+
export declare function getAllProperties(model: Model, _program: Program): Map<string, ModelProperty>;
|
|
4
|
+
export declare function emitModel(model: Model, program: Program, anonymousEnums: Map<string, AnonymousStringLiteralUnion>): string;
|
|
5
|
+
export declare function emitEnum(enumType: Enum): string;
|
|
6
|
+
export declare function emitUnion(union: Union, program: Program): string;
|
|
7
|
+
export declare function emitScalar(scalar: Scalar, program: Program): {
|
|
8
|
+
typeDef: string;
|
|
9
|
+
impls: string[];
|
|
10
|
+
};
|
|
11
|
+
export declare function emitStringLiteralUnion(union: Union): string;
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { getDoc, getFormat, getPattern, } from "@typespec/compiler";
|
|
2
|
+
import { rustAttrKey, rustDeriveKey, rustImplKey } from "../models/keys.js";
|
|
3
|
+
import { formatToRust, scalarToRust } from "../formatter/mappings.js";
|
|
4
|
+
import { formatDoc, toPascalCase, toRustIdent, toRustVariantName, } from "../formatter/strings.js";
|
|
5
|
+
import { getRustTypeForProperty } from "../parser/types.js";
|
|
6
|
+
export function getAllProperties(model, _program) {
|
|
7
|
+
const props = new Map();
|
|
8
|
+
if (model.baseModel) {
|
|
9
|
+
const baseProps = getAllProperties(model.baseModel, _program);
|
|
10
|
+
for (const [key, value] of baseProps) {
|
|
11
|
+
props.set(key, value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
for (const [key, value] of model.properties) {
|
|
15
|
+
props.set(key, value);
|
|
16
|
+
}
|
|
17
|
+
return props;
|
|
18
|
+
}
|
|
19
|
+
export function emitModel(model, program, anonymousEnums) {
|
|
20
|
+
const parts = [];
|
|
21
|
+
const name = toPascalCase(model.name);
|
|
22
|
+
const allProps = getAllProperties(model, program);
|
|
23
|
+
const deriveAttrs = [
|
|
24
|
+
"Debug",
|
|
25
|
+
"Clone",
|
|
26
|
+
"serde::Serialize",
|
|
27
|
+
"serde::Deserialize",
|
|
28
|
+
];
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
const customDerives = model[rustDeriveKey];
|
|
31
|
+
if (customDerives) {
|
|
32
|
+
deriveAttrs.push(...customDerives.derives);
|
|
33
|
+
}
|
|
34
|
+
parts.push(`#[derive(${deriveAttrs.join(", ")})]`);
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
const customAttrs = model[rustAttrKey];
|
|
37
|
+
if (customAttrs) {
|
|
38
|
+
for (const attr of customAttrs.attrs) {
|
|
39
|
+
parts.push(`#[${attr}]`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (allProps.size > 0) {
|
|
43
|
+
const fields = [];
|
|
44
|
+
for (const [propName, prop] of allProps) {
|
|
45
|
+
const doc = getDoc(program, prop);
|
|
46
|
+
const { type: rustType } = getRustTypeForProperty(prop.type, program, anonymousEnums);
|
|
47
|
+
const optional = prop.optional ? true : false;
|
|
48
|
+
const fieldName = toRustIdent(propName);
|
|
49
|
+
const serdeRename = propName !== fieldName ? `#[serde(rename = "${propName}")]` : "";
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
const propAttrs = prop[rustAttrKey];
|
|
52
|
+
if (doc) {
|
|
53
|
+
fields.push(` ${formatDoc(doc)}`);
|
|
54
|
+
}
|
|
55
|
+
if (propAttrs) {
|
|
56
|
+
for (const attr of propAttrs.attrs) {
|
|
57
|
+
fields.push(` #[${attr}]`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (serdeRename) {
|
|
61
|
+
fields.push(` ${serdeRename}`);
|
|
62
|
+
}
|
|
63
|
+
if (optional) {
|
|
64
|
+
fields.push(` #[serde(skip_serializing_if = "Option::is_none")]`);
|
|
65
|
+
}
|
|
66
|
+
fields.push(` pub ${fieldName}: ${optional ? `Option<${rustType}>` : rustType},`);
|
|
67
|
+
}
|
|
68
|
+
parts.push(`pub struct ${name} {
|
|
69
|
+
${fields.join("\n")}
|
|
70
|
+
}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
parts.push(`pub struct ${name}`);
|
|
74
|
+
parts.push("(());");
|
|
75
|
+
}
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
+
const customImpl = model[rustImplKey];
|
|
78
|
+
if (customImpl) {
|
|
79
|
+
parts.push(`
|
|
80
|
+
${customImpl.impl}`);
|
|
81
|
+
}
|
|
82
|
+
return parts.join("\n");
|
|
83
|
+
}
|
|
84
|
+
export function emitEnum(enumType) {
|
|
85
|
+
const parts = [];
|
|
86
|
+
const name = toPascalCase(enumType.name);
|
|
87
|
+
const members = Array.from(enumType.members.values());
|
|
88
|
+
const isString = members.every((m) => m.value === undefined || typeof m.value === "string");
|
|
89
|
+
const baseDerives = [
|
|
90
|
+
"Debug",
|
|
91
|
+
"Clone",
|
|
92
|
+
"Copy",
|
|
93
|
+
"PartialEq",
|
|
94
|
+
"Eq",
|
|
95
|
+
"Hash",
|
|
96
|
+
"Default",
|
|
97
|
+
"serde::Serialize",
|
|
98
|
+
"serde::Deserialize",
|
|
99
|
+
];
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
101
|
+
const customDerives = enumType[rustDeriveKey];
|
|
102
|
+
const allDerives = [...baseDerives];
|
|
103
|
+
if (customDerives) {
|
|
104
|
+
allDerives.push(...customDerives.derives);
|
|
105
|
+
}
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
const customAttrs = enumType[rustAttrKey];
|
|
108
|
+
const attrLines = [];
|
|
109
|
+
if (customAttrs) {
|
|
110
|
+
for (const attr of customAttrs.attrs) {
|
|
111
|
+
attrLines.push(`#[${attr}]`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (isString) {
|
|
115
|
+
parts.push(`#[derive(${allDerives.join(", ")})]`);
|
|
116
|
+
if (attrLines.length > 0) {
|
|
117
|
+
parts.push(...attrLines);
|
|
118
|
+
}
|
|
119
|
+
parts.push(`pub enum ${name} {`);
|
|
120
|
+
for (let i = 0; i < members.length; i++) {
|
|
121
|
+
const variantName = toRustVariantName(members[i].name);
|
|
122
|
+
const serdeValue = members[i].value ?? members[i].name;
|
|
123
|
+
if (i === 0) {
|
|
124
|
+
parts.push(` #[default]`);
|
|
125
|
+
}
|
|
126
|
+
parts.push(` #[serde(rename = "${serdeValue}")]`);
|
|
127
|
+
parts.push(` ${variantName},`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
parts.push(`#[derive(${allDerives.join(", ")})]`);
|
|
132
|
+
if (attrLines.length > 0) {
|
|
133
|
+
parts.push(...attrLines);
|
|
134
|
+
}
|
|
135
|
+
parts.push(`pub enum ${name} {`);
|
|
136
|
+
for (let i = 0; i < members.length; i++) {
|
|
137
|
+
const variantName = toRustVariantName(members[i].name);
|
|
138
|
+
const enumValue = members[i].value ?? 0;
|
|
139
|
+
if (i === 0) {
|
|
140
|
+
parts.push(` #[default]`);
|
|
141
|
+
}
|
|
142
|
+
parts.push(` ${variantName} = ${enumValue},`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
parts.push("}");
|
|
146
|
+
return parts.join("\n");
|
|
147
|
+
}
|
|
148
|
+
export function emitUnion(union, program) {
|
|
149
|
+
const parts = [];
|
|
150
|
+
const name = toPascalCase(union.name ?? "Union");
|
|
151
|
+
const variants = Array.from(union.variants.values());
|
|
152
|
+
if (variants.length === 0) {
|
|
153
|
+
parts.push(`#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]\npub enum ${name} {}\nimpl ${name} {\n pub fn new() -> Self { unreachable!() }\n}`);
|
|
154
|
+
return parts.join("\n");
|
|
155
|
+
}
|
|
156
|
+
parts.push(`#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]\n#[serde(untagged)]\npub enum ${name} {`);
|
|
157
|
+
for (let i = 0; i < variants.length; i++) {
|
|
158
|
+
const variant = variants[i];
|
|
159
|
+
const variantName = `Variant${i + 1}`;
|
|
160
|
+
const { type: rustType } = getRustTypeForProperty(variant.type, program, new Map());
|
|
161
|
+
parts.push(` ${variantName}(${rustType}),`);
|
|
162
|
+
}
|
|
163
|
+
parts.push("}");
|
|
164
|
+
return parts.join("\n");
|
|
165
|
+
}
|
|
166
|
+
export function emitScalar(scalar, program) {
|
|
167
|
+
const format = getFormat(program, scalar);
|
|
168
|
+
const pattern = getPattern(program, scalar);
|
|
169
|
+
const structName = toPascalCase(scalar.name);
|
|
170
|
+
const impls = [];
|
|
171
|
+
if (format && formatToRust[format]) {
|
|
172
|
+
return {
|
|
173
|
+
typeDef: `pub type ${structName} = ${formatToRust[format]};`,
|
|
174
|
+
impls: [],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (pattern) {
|
|
178
|
+
const rustType = scalarToRust[scalar.name] ?? "String";
|
|
179
|
+
impls.push(`\nimpl TryFrom<String> for ${structName} {\n type Error = String;\n\n fn try_from(value: String) -> Result<Self, Self::Error> {\n let re = regex::Regex::new(r"${pattern}").unwrap();\n if re.is_match(&value) { Ok(Self(value)) } else { Err(format!("Invalid value: {}", value)) }\n }\n}`);
|
|
180
|
+
return {
|
|
181
|
+
typeDef: `#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize)]\npub struct ${structName}(pub ${rustType});`,
|
|
182
|
+
impls,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const rustType = scalarToRust[scalar.name] ?? "serde_json::Value";
|
|
186
|
+
return {
|
|
187
|
+
typeDef: `pub type ${structName} = ${rustType};`,
|
|
188
|
+
impls: [],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
export function emitStringLiteralUnion(union) {
|
|
192
|
+
const parts = [];
|
|
193
|
+
const name = toPascalCase(union.name ?? "Value");
|
|
194
|
+
const variants = Array.from(union.variants.values());
|
|
195
|
+
parts.push(`#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize)]\n#[allow(clippy::enum_variant_names)]\npub enum ${name} {`);
|
|
196
|
+
for (let i = 0; i < variants.length; i++) {
|
|
197
|
+
const literalType = variants[i].type;
|
|
198
|
+
const variantName = toPascalCase(literalType.value);
|
|
199
|
+
const serdeValue = literalType.value;
|
|
200
|
+
if (i === 0) {
|
|
201
|
+
parts.push(` #[default]`);
|
|
202
|
+
}
|
|
203
|
+
parts.push(` #[serde(rename = "${serdeValue}")]`);
|
|
204
|
+
parts.push(` ${variantName},`);
|
|
205
|
+
}
|
|
206
|
+
parts.push("}");
|
|
207
|
+
return parts.join("\n");
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=types_file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types_file.js","sourceRoot":"","sources":["../../../src/generator/types_file.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { $onEmit } from "./emitter.js";
|
|
2
|
-
export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, } from "./
|
|
2
|
+
export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, $etagCache, $cacheControl, } from "./decorators/index.js";
|
|
3
3
|
export { $lib } from "./lib.js";
|
package/dist/src/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { $onEmit } from "./emitter.js";
|
|
2
|
-
export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, } from "./
|
|
2
|
+
export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, $etagCache, $cacheControl, } from "./decorators/index.js";
|
|
3
3
|
export { $lib } from "./lib.js";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/src/lib.js
CHANGED
package/dist/src/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACxC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACxC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const rustDeriveKey: unique symbol;
|
|
2
|
+
export declare const rustAttrKey: unique symbol;
|
|
3
|
+
export declare const rustImplKey: unique symbol;
|
|
4
|
+
export declare const rustSelfReceiverKey: unique symbol;
|
|
5
|
+
export declare const etagCacheKey: unique symbol;
|
|
6
|
+
export declare const cacheControlKey: unique symbol;
|