@sashido/mcp-server 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/README.md +201 -2
- package/dist/access.d.ts +47 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +156 -0
- package/dist/access.js.map +1 -0
- package/dist/advice/format.d.ts +22 -0
- package/dist/advice/format.d.ts.map +1 -0
- package/dist/advice/format.js +70 -0
- package/dist/advice/format.js.map +1 -0
- package/dist/advice/schemaChecks.d.ts +17 -0
- package/dist/advice/schemaChecks.d.ts.map +1 -0
- package/dist/advice/schemaChecks.js +64 -0
- package/dist/advice/schemaChecks.js.map +1 -0
- package/dist/audit.d.ts +32 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +41 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth.d.ts +17 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +72 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin/login.d.ts +3 -0
- package/dist/bin/login.d.ts.map +1 -0
- package/dist/bin/login.js +16 -0
- package/dist/bin/login.js.map +1 -0
- package/dist/bin/mcp-server.d.ts +3 -0
- package/dist/bin/mcp-server.d.ts.map +1 -0
- package/dist/bin/mcp-server.js +27 -0
- package/dist/bin/mcp-server.js.map +1 -0
- package/dist/client/parse.d.ts +219 -0
- package/dist/client/parse.d.ts.map +1 -0
- package/dist/client/parse.js +414 -0
- package/dist/client/parse.js.map +1 -0
- package/dist/client/sashido.d.ts +213 -0
- package/dist/client/sashido.d.ts.map +1 -0
- package/dist/client/sashido.js +289 -0
- package/dist/client/sashido.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +33 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +132 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +60 -0
- package/dist/server.js.map +1 -0
- package/dist/session/redis-client.d.ts +23 -0
- package/dist/session/redis-client.d.ts.map +1 -0
- package/dist/session/redis-client.js +136 -0
- package/dist/session/redis-client.js.map +1 -0
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +68 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/sse-pubsub.d.ts +23 -0
- package/dist/session/sse-pubsub.d.ts.map +1 -0
- package/dist/session/sse-pubsub.js +121 -0
- package/dist/session/sse-pubsub.js.map +1 -0
- package/dist/session/types.d.ts +43 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/advisor/index.d.ts +3 -0
- package/dist/tools/advisor/index.d.ts.map +1 -0
- package/dist/tools/advisor/index.js +149 -0
- package/dist/tools/advisor/index.js.map +1 -0
- package/dist/tools/apps/index.d.ts +3 -0
- package/dist/tools/apps/index.d.ts.map +1 -0
- package/dist/tools/apps/index.js +113 -0
- package/dist/tools/apps/index.js.map +1 -0
- package/dist/tools/audit/index.d.ts +6 -0
- package/dist/tools/audit/index.d.ts.map +1 -0
- package/dist/tools/audit/index.js +69 -0
- package/dist/tools/audit/index.js.map +1 -0
- package/dist/tools/builds/index.d.ts +3 -0
- package/dist/tools/builds/index.d.ts.map +1 -0
- package/dist/tools/builds/index.js +85 -0
- package/dist/tools/builds/index.js.map +1 -0
- package/dist/tools/classes/index.d.ts +3 -0
- package/dist/tools/classes/index.d.ts.map +1 -0
- package/dist/tools/classes/index.js +223 -0
- package/dist/tools/classes/index.js.map +1 -0
- package/dist/tools/cloud-functions/index.d.ts +3 -0
- package/dist/tools/cloud-functions/index.d.ts.map +1 -0
- package/dist/tools/cloud-functions/index.js +154 -0
- package/dist/tools/cloud-functions/index.js.map +1 -0
- package/dist/tools/deployments/index.d.ts +3 -0
- package/dist/tools/deployments/index.d.ts.map +1 -0
- package/dist/tools/deployments/index.js +124 -0
- package/dist/tools/deployments/index.js.map +1 -0
- package/dist/tools/engines/index.d.ts +3 -0
- package/dist/tools/engines/index.d.ts.map +1 -0
- package/dist/tools/engines/index.js +68 -0
- package/dist/tools/engines/index.js.map +1 -0
- package/dist/tools/env/index.d.ts +3 -0
- package/dist/tools/env/index.d.ts.map +1 -0
- package/dist/tools/env/index.js +116 -0
- package/dist/tools/env/index.js.map +1 -0
- package/dist/tools/files/index.d.ts +3 -0
- package/dist/tools/files/index.d.ts.map +1 -0
- package/dist/tools/files/index.js +132 -0
- package/dist/tools/files/index.js.map +1 -0
- package/dist/tools/health/index.d.ts +3 -0
- package/dist/tools/health/index.d.ts.map +1 -0
- package/dist/tools/health/index.js +47 -0
- package/dist/tools/health/index.js.map +1 -0
- package/dist/tools/infrastructure/deployments.d.ts +23 -0
- package/dist/tools/infrastructure/deployments.d.ts.map +1 -0
- package/dist/tools/infrastructure/deployments.js +76 -0
- package/dist/tools/infrastructure/deployments.js.map +1 -0
- package/dist/tools/infrastructure/index.d.ts +9 -0
- package/dist/tools/infrastructure/index.d.ts.map +1 -0
- package/dist/tools/infrastructure/index.js +164 -0
- package/dist/tools/infrastructure/index.js.map +1 -0
- package/dist/tools/jobs/index.d.ts +3 -0
- package/dist/tools/jobs/index.d.ts.map +1 -0
- package/dist/tools/jobs/index.js +338 -0
- package/dist/tools/jobs/index.js.map +1 -0
- package/dist/tools/logs/index.d.ts +3 -0
- package/dist/tools/logs/index.d.ts.map +1 -0
- package/dist/tools/logs/index.js +133 -0
- package/dist/tools/logs/index.js.map +1 -0
- package/dist/tools/objects/index.d.ts +3 -0
- package/dist/tools/objects/index.d.ts.map +1 -0
- package/dist/tools/objects/index.js +185 -0
- package/dist/tools/objects/index.js.map +1 -0
- package/dist/tools/push/index.d.ts +3 -0
- package/dist/tools/push/index.d.ts.map +1 -0
- package/dist/tools/push/index.js +434 -0
- package/dist/tools/push/index.js.map +1 -0
- package/dist/tools/types/index.d.ts +3 -0
- package/dist/tools/types/index.d.ts.map +1 -0
- package/dist/tools/types/index.js +45 -0
- package/dist/tools/types/index.js.map +1 -0
- package/dist/tools/webhooks/index.d.ts +3 -0
- package/dist/tools/webhooks/index.d.ts.map +1 -0
- package/dist/tools/webhooks/index.js +443 -0
- package/dist/tools/webhooks/index.js.map +1 -0
- package/dist/transports/http.d.ts +4 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +241 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +7 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +29 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/typegen/dart.d.ts +3 -0
- package/dist/typegen/dart.d.ts.map +1 -0
- package/dist/typegen/dart.js +84 -0
- package/dist/typegen/dart.js.map +1 -0
- package/dist/typegen/kotlin.d.ts +3 -0
- package/dist/typegen/kotlin.d.ts.map +1 -0
- package/dist/typegen/kotlin.js +84 -0
- package/dist/typegen/kotlin.js.map +1 -0
- package/dist/typegen/model.d.ts +37 -0
- package/dist/typegen/model.d.ts.map +1 -0
- package/dist/typegen/model.js +82 -0
- package/dist/typegen/model.js.map +1 -0
- package/dist/typegen/swift.d.ts +3 -0
- package/dist/typegen/swift.d.ts.map +1 -0
- package/dist/typegen/swift.js +105 -0
- package/dist/typegen/swift.js.map +1 -0
- package/dist/typegen/typescript.d.ts +3 -0
- package/dist/typegen/typescript.d.ts.map +1 -0
- package/dist/typegen/typescript.js +73 -0
- package/dist/typegen/typescript.js.map +1 -0
- package/dist/upgrade/rules.d.ts +27 -0
- package/dist/upgrade/rules.d.ts.map +1 -0
- package/dist/upgrade/rules.js +133 -0
- package/dist/upgrade/rules.js.map +1 -0
- package/dist/upgrade/scan.d.ts +18 -0
- package/dist/upgrade/scan.d.ts.map +1 -0
- package/dist/upgrade/scan.js +38 -0
- package/dist/upgrade/scan.js.map +1 -0
- package/dist/upgrade/versions.d.ts +8 -0
- package/dist/upgrade/versions.d.ts.map +1 -0
- package/dist/upgrade/versions.js +25 -0
- package/dist/upgrade/versions.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +67 -4
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
3
|
+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
4
|
+
import { narrowAccess } from "../access.js";
|
|
5
|
+
import { AuthError, accessFromTokenInfo, bearerToken, getTokenInfo, tokenHash, } from "../auth.js";
|
|
6
|
+
import { appConfig } from "../config.js";
|
|
7
|
+
import { createToolContext } from "../context.js";
|
|
8
|
+
import { createServer, SERVER_NAME, SERVER_VERSION } from "../server.js";
|
|
9
|
+
import { closeRedisConnection, getRedisClient, isRedisConfigured, pingRedis, } from "../session/redis-client.js";
|
|
10
|
+
import { deleteSession, registerSession, touchSession } from "../session/session-manager.js";
|
|
11
|
+
import { closePubSub, publishToSession, subscribeToSession, unsubscribeFromSession, } from "../session/sse-pubsub.js";
|
|
12
|
+
// SSE connections held by this instance (an SSE stream lives on one instance)
|
|
13
|
+
const sseTransports = new Map();
|
|
14
|
+
function jsonRpcError(res, status, message) {
|
|
15
|
+
if (!res.headersSent) {
|
|
16
|
+
res.status(status).json({
|
|
17
|
+
jsonrpc: "2.0",
|
|
18
|
+
error: { code: status === 401 ? -32001 : -32000, message },
|
|
19
|
+
id: null,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Browsers send Origin; only allowed origins may call the server (CORS and
|
|
25
|
+
* protection against DNS rebinding to a local server). Other clients send
|
|
26
|
+
* no Origin and are let through to authentication.
|
|
27
|
+
*/
|
|
28
|
+
function originCheck(req, res, next) {
|
|
29
|
+
const origin = req.headers.origin;
|
|
30
|
+
if (!origin) {
|
|
31
|
+
return next();
|
|
32
|
+
}
|
|
33
|
+
if (appConfig.server.allowedOrigins.indexOf(origin) === -1) {
|
|
34
|
+
res.status(403).json({ error: "Origin not allowed" });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
res.header("Access-Control-Allow-Origin", origin);
|
|
38
|
+
res.header("Vary", "Origin");
|
|
39
|
+
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
40
|
+
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, mcp-protocol-version");
|
|
41
|
+
if (req.method === "OPTIONS") {
|
|
42
|
+
res.sendStatus(204);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
next();
|
|
46
|
+
}
|
|
47
|
+
/** A fixed one-minute window per client IP, kept in this process. */
|
|
48
|
+
function rateLimit(limitPerMinute) {
|
|
49
|
+
const windows = new Map();
|
|
50
|
+
return (req, res, next) => {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
const key = req.ip || "unknown";
|
|
53
|
+
let window = windows.get(key);
|
|
54
|
+
if (!window || now - window.startedAt >= 60000) {
|
|
55
|
+
if (windows.size > 10000)
|
|
56
|
+
windows.clear();
|
|
57
|
+
window = { startedAt: now, count: 0 };
|
|
58
|
+
windows.set(key, window);
|
|
59
|
+
}
|
|
60
|
+
window.count++;
|
|
61
|
+
if (window.count > limitPerMinute) {
|
|
62
|
+
res.setHeader("Retry-After", String(Math.ceil((window.startedAt + 60000 - now) / 1000)));
|
|
63
|
+
res.status(429).json({ error: "Too many requests" });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
next();
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The tools for this request's token: its scopes and apps, narrowed by the
|
|
71
|
+
* URL options ?read_only=true&apps=id1,id2&features=objects,logs
|
|
72
|
+
*/
|
|
73
|
+
async function contextFor(req) {
|
|
74
|
+
const token = bearerToken(req.headers.authorization);
|
|
75
|
+
const info = await getTokenInfo(token);
|
|
76
|
+
const query = req.query;
|
|
77
|
+
const access = narrowAccess(accessFromTokenInfo(info, false), {
|
|
78
|
+
readOnly: query["read_only"],
|
|
79
|
+
apps: query["apps"],
|
|
80
|
+
features: query["features"],
|
|
81
|
+
});
|
|
82
|
+
return { token, ctx: createToolContext(token, access) };
|
|
83
|
+
}
|
|
84
|
+
function handleError(res, error, label) {
|
|
85
|
+
if (error instanceof AuthError) {
|
|
86
|
+
res.setHeader("WWW-Authenticate", 'Bearer error="invalid_token"');
|
|
87
|
+
jsonRpcError(res, error.statusCode, error.message);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// the details stay in the logs
|
|
91
|
+
console.error(`[MCP] ${label}:`, error instanceof Error ? error.message : error);
|
|
92
|
+
jsonRpcError(res, 500, "Internal error");
|
|
93
|
+
}
|
|
94
|
+
export function createHttpApp() {
|
|
95
|
+
const app = express();
|
|
96
|
+
app.disable("x-powered-by");
|
|
97
|
+
if (appConfig.server.trustProxy) {
|
|
98
|
+
app.set("trust proxy", true);
|
|
99
|
+
}
|
|
100
|
+
app.use(originCheck);
|
|
101
|
+
app.get("/health", async (_req, res) => {
|
|
102
|
+
res.json({
|
|
103
|
+
status: "ok",
|
|
104
|
+
server: SERVER_NAME,
|
|
105
|
+
version: SERVER_VERSION,
|
|
106
|
+
sseConnections: sseTransports.size,
|
|
107
|
+
redis: isRedisConfigured() ? { healthy: await pingRedis() } : null,
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
app.use(rateLimit(appConfig.server.rateLimitPerMinute));
|
|
111
|
+
app.use(express.json({ limit: "1mb" }));
|
|
112
|
+
// ============================================
|
|
113
|
+
// Streamable HTTP: stateless. Every request brings its token and gets a
|
|
114
|
+
// server with the tools that token allows; any instance can answer.
|
|
115
|
+
// ============================================
|
|
116
|
+
app.post("/mcp", async (req, res) => {
|
|
117
|
+
try {
|
|
118
|
+
const { ctx } = await contextFor(req);
|
|
119
|
+
const server = createServer(ctx);
|
|
120
|
+
const transport = new StreamableHTTPServerTransport({
|
|
121
|
+
sessionIdGenerator: undefined,
|
|
122
|
+
// one JSON answer per request: nothing here streams progress
|
|
123
|
+
enableJsonResponse: true,
|
|
124
|
+
});
|
|
125
|
+
res.on("close", () => {
|
|
126
|
+
transport.close().catch(() => undefined);
|
|
127
|
+
server.close().catch(() => undefined);
|
|
128
|
+
});
|
|
129
|
+
await server.connect(transport);
|
|
130
|
+
await transport.handleRequest(req, res, req.body);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
handleError(res, error, "/mcp");
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// stateless: no session to stream to or to end
|
|
137
|
+
app.get("/mcp", (_req, res) => jsonRpcError(res, 405, "Method not allowed. POST JSON-RPC messages to /mcp."));
|
|
138
|
+
app.delete("/mcp", (_req, res) => jsonRpcError(res, 405, "Method not allowed."));
|
|
139
|
+
// ============================================
|
|
140
|
+
// SSE (older clients, e.g. some n8n versions): the stream stays on the
|
|
141
|
+
// instance that opened it. Messages must come with the same token; with
|
|
142
|
+
// Redis they may arrive at another instance and are forwarded.
|
|
143
|
+
// ============================================
|
|
144
|
+
app.get("/sse", async (req, res) => {
|
|
145
|
+
try {
|
|
146
|
+
const { token, ctx } = await contextFor(req);
|
|
147
|
+
const transport = new SSEServerTransport("/sse/messages", res);
|
|
148
|
+
const sessionId = transport.sessionId;
|
|
149
|
+
sseTransports.set(sessionId, transport);
|
|
150
|
+
await registerSession(sessionId, tokenHash(token));
|
|
151
|
+
await subscribeToSession(sessionId, async (message) => {
|
|
152
|
+
try {
|
|
153
|
+
await transport.handleMessage(JSON.parse(message));
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
console.error("[SSE] forwarded message:", err instanceof Error ? err.message : err);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
transport.onclose = () => {
|
|
160
|
+
sseTransports.delete(sessionId);
|
|
161
|
+
unsubscribeFromSession(sessionId).catch(() => undefined);
|
|
162
|
+
deleteSession(sessionId).catch(() => undefined);
|
|
163
|
+
};
|
|
164
|
+
const server = createServer(ctx);
|
|
165
|
+
await server.connect(transport);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
handleError(res, error, "/sse");
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
app.post("/sse/messages", async (req, res) => {
|
|
172
|
+
try {
|
|
173
|
+
const sessionId = typeof req.query["sessionId"] === "string" ? req.query["sessionId"] : "";
|
|
174
|
+
const token = bearerToken(req.headers.authorization);
|
|
175
|
+
const session = sessionId ? await touchSession(sessionId) : null;
|
|
176
|
+
if (!session) {
|
|
177
|
+
res.status(404).json({ error: "Session not found. Connect again via GET /sse." });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// only the token that opened the session may use it
|
|
181
|
+
if (session.tokenHash !== tokenHash(token)) {
|
|
182
|
+
res.status(403).json({ error: "This session belongs to another token." });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const transport = sseTransports.get(sessionId);
|
|
186
|
+
if (transport) {
|
|
187
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (isRedisConfigured() && (await publishToSession(sessionId, JSON.stringify(req.body)))) {
|
|
191
|
+
res.status(202).json({ status: "accepted" });
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
res.status(503).json({ error: "The SSE connection is gone. Connect again via GET /sse." });
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
handleError(res, error, "/sse/messages");
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
return app;
|
|
201
|
+
}
|
|
202
|
+
export async function startHttpServer() {
|
|
203
|
+
if (isRedisConfigured()) {
|
|
204
|
+
try {
|
|
205
|
+
await getRedisClient();
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
console.error("[MCP] Redis connection failed, using in-memory sessions:", err);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const app = createHttpApp();
|
|
212
|
+
const { host, port } = appConfig.server;
|
|
213
|
+
return new Promise((_resolve, reject) => {
|
|
214
|
+
const server = app.listen(port, host, () => {
|
|
215
|
+
console.error(`[MCP] HTTP server listening on ${host}:${port}`);
|
|
216
|
+
console.error(`[MCP] POST /mcp - Streamable HTTP (stateless)`);
|
|
217
|
+
console.error(`[MCP] GET /sse - SSE`);
|
|
218
|
+
console.error(`[MCP] POST /sse/messages - SSE messages`);
|
|
219
|
+
console.error(`[MCP] GET /health - Health check`);
|
|
220
|
+
});
|
|
221
|
+
server.on("error", reject);
|
|
222
|
+
let shuttingDown = false;
|
|
223
|
+
const shutdown = async () => {
|
|
224
|
+
if (shuttingDown)
|
|
225
|
+
return;
|
|
226
|
+
shuttingDown = true;
|
|
227
|
+
console.error("\n[MCP] Shutting down...");
|
|
228
|
+
for (const transport of sseTransports.values()) {
|
|
229
|
+
await transport.close().catch(() => undefined);
|
|
230
|
+
}
|
|
231
|
+
sseTransports.clear();
|
|
232
|
+
await closePubSub();
|
|
233
|
+
await closeRedisConnection();
|
|
234
|
+
server.close(() => process.exit(0));
|
|
235
|
+
setTimeout(() => process.exit(1), 3000).unref();
|
|
236
|
+
};
|
|
237
|
+
process.on("SIGINT", shutdown);
|
|
238
|
+
process.on("SIGTERM", shutdown);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local use (Claude Desktop, Cursor, ...): the token comes from
|
|
3
|
+
* SASHIDO_ACCESS_TOKEN, and SASHIDO_READ_ONLY / SASHIDO_APPS /
|
|
4
|
+
* SASHIDO_FEATURES can narrow it. Local file and URL uploads are available.
|
|
5
|
+
*/
|
|
6
|
+
export declare function startStdioServer(): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBtD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
|
+
import { narrowAccess } from '../access.js';
|
|
3
|
+
import { accessFromTokenInfo, getTokenInfo, isAccessToken } from '../auth.js';
|
|
4
|
+
import { appConfig } from '../config.js';
|
|
5
|
+
import { createToolContext } from '../context.js';
|
|
6
|
+
import { createServer } from '../server.js';
|
|
7
|
+
/**
|
|
8
|
+
* Local use (Claude Desktop, Cursor, ...): the token comes from
|
|
9
|
+
* SASHIDO_ACCESS_TOKEN, and SASHIDO_READ_ONLY / SASHIDO_APPS /
|
|
10
|
+
* SASHIDO_FEATURES can narrow it. Local file and URL uploads are available.
|
|
11
|
+
*/
|
|
12
|
+
export async function startStdioServer() {
|
|
13
|
+
const token = appConfig.stdio.accessToken;
|
|
14
|
+
if (!token || !isAccessToken(token)) {
|
|
15
|
+
throw new Error('Set SASHIDO_ACCESS_TOKEN to a SashiDo personal access token (sashido_pat_...). ' +
|
|
16
|
+
'Create one in the dashboard: Account > Access Tokens.');
|
|
17
|
+
}
|
|
18
|
+
const info = await getTokenInfo(token);
|
|
19
|
+
const access = narrowAccess(accessFromTokenInfo(info, true), {
|
|
20
|
+
readOnly: appConfig.stdio.readOnly,
|
|
21
|
+
apps: appConfig.stdio.apps,
|
|
22
|
+
features: appConfig.stdio.features,
|
|
23
|
+
});
|
|
24
|
+
const registered = [];
|
|
25
|
+
const server = createServer(createToolContext(token, access), registered);
|
|
26
|
+
await server.connect(new StdioServerTransport());
|
|
27
|
+
console.error(`[MCP] Connected as ${info.user.username} with ${registered.length} tools`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,iFAAiF;YAC/E,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;QAC3D,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ;QAClC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI;QAC1B,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ;KACnC,CAAC,CAAC;IACH,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IAE1E,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,QAAQ,SAAS,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dart.d.ts","sourceRoot":"","sources":["../../src/typegen/dart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAyEzE,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAejE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { isIdentifier, targetName } from "./model.js";
|
|
2
|
+
// parse_server_sdk (Flutter / Dart): a ParseObject subclass per class with
|
|
3
|
+
// typed getters and setters, and clone() so queries return the subclass.
|
|
4
|
+
// Register them with Parse().initialize(..., registeredSubClassMap: {...}).
|
|
5
|
+
function dartType(field) {
|
|
6
|
+
switch (field.type) {
|
|
7
|
+
case "String":
|
|
8
|
+
case "Bytes":
|
|
9
|
+
return "String";
|
|
10
|
+
case "Number":
|
|
11
|
+
return "num";
|
|
12
|
+
case "Boolean":
|
|
13
|
+
return "bool";
|
|
14
|
+
case "Date":
|
|
15
|
+
return "DateTime";
|
|
16
|
+
case "Object":
|
|
17
|
+
return "Map<String, dynamic>";
|
|
18
|
+
case "Array":
|
|
19
|
+
return "List<dynamic>";
|
|
20
|
+
case "File":
|
|
21
|
+
return "ParseFileBase";
|
|
22
|
+
case "GeoPoint":
|
|
23
|
+
return "ParseGeoPoint";
|
|
24
|
+
case "Polygon":
|
|
25
|
+
return "List<dynamic>";
|
|
26
|
+
case "Pointer":
|
|
27
|
+
return targetName(field, "ParseObject");
|
|
28
|
+
case "ACL":
|
|
29
|
+
return "ParseACL";
|
|
30
|
+
default:
|
|
31
|
+
return "dynamic";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function accessors(field) {
|
|
35
|
+
const k = `'${field.name.replace(/'/g, "\\'")}'`;
|
|
36
|
+
const name = isIdentifier(field.name) && !/^_/.test(field.name) ? field.name : `field${field.name.replace(/[^A-Za-z0-9]/g, "")}`;
|
|
37
|
+
if (field.type === "Relation") {
|
|
38
|
+
return [` ParseRelation<${targetName(field, "ParseObject")}> get ${name} => getRelation<${targetName(field, "ParseObject")}>(${k});`];
|
|
39
|
+
}
|
|
40
|
+
const type = dartType(field);
|
|
41
|
+
return [
|
|
42
|
+
` ${type}? get ${name} => get<${type}>(${k});`,
|
|
43
|
+
` set ${name}(${type}? value) => set<${type}?>(${k}, value);`,
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
function subclass(model) {
|
|
47
|
+
const t = model.typeName;
|
|
48
|
+
const lines = model.builtIn === "User"
|
|
49
|
+
? [
|
|
50
|
+
`class ${t} extends ParseUser implements ParseCloneable {`,
|
|
51
|
+
` ${t}(String? username, String? password, String? emailAddress) : super(username, password, emailAddress);`,
|
|
52
|
+
` ${t}.clone() : this(null, null, null);`,
|
|
53
|
+
]
|
|
54
|
+
: model.builtIn === "Installation"
|
|
55
|
+
? [`class ${t} extends ParseInstallation implements ParseCloneable {`, ` ${t}() : super();`, ` ${t}.clone() : this();`]
|
|
56
|
+
: [
|
|
57
|
+
`class ${t} extends ParseObject implements ParseCloneable {`,
|
|
58
|
+
` ${t}() : super('${model.className}');`,
|
|
59
|
+
` ${t}.clone() : this();`,
|
|
60
|
+
];
|
|
61
|
+
lines.push("", " @override", ` ${t} clone(Map<String, dynamic> map) => ${t}.clone()..fromJson(map);`);
|
|
62
|
+
for (const f of model.fields) {
|
|
63
|
+
lines.push("", ...accessors(f));
|
|
64
|
+
}
|
|
65
|
+
lines.push("}");
|
|
66
|
+
return lines;
|
|
67
|
+
}
|
|
68
|
+
export function dart(models, header) {
|
|
69
|
+
const register = models
|
|
70
|
+
.filter((m) => !m.builtIn)
|
|
71
|
+
.map((m) => `'${m.className}': (_) => ${m.typeName}()`)
|
|
72
|
+
.join(", ");
|
|
73
|
+
const out = [
|
|
74
|
+
`// ${header}`,
|
|
75
|
+
`// Parse().initialize(..., registeredSubClassMap: {${register}})`,
|
|
76
|
+
"import 'package:parse_server_sdk/parse_server_sdk.dart';",
|
|
77
|
+
"",
|
|
78
|
+
];
|
|
79
|
+
for (const model of models) {
|
|
80
|
+
out.push(...subclass(model), "");
|
|
81
|
+
}
|
|
82
|
+
return out.join("\n");
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=dart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dart.js","sourceRoot":"","sources":["../../src/typegen/dart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kotlin.d.ts","sourceRoot":"","sources":["../../src/typegen/kotlin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AA2EzE,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAanE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { isIdentifier, targetName } from "./model.js";
|
|
2
|
+
// The Parse Android SDK: a ParseObject subclass per class with typed
|
|
3
|
+
// properties over get/put. Register each with ParseObject.registerSubclass
|
|
4
|
+
// before Parse.initialize.
|
|
5
|
+
const BASE = {
|
|
6
|
+
User: "ParseUser",
|
|
7
|
+
Role: "ParseRole",
|
|
8
|
+
Installation: "ParseInstallation",
|
|
9
|
+
};
|
|
10
|
+
/** [type, getter] for a field; null when only a getter makes sense */
|
|
11
|
+
function kotlinType(field) {
|
|
12
|
+
const k = JSON.stringify(field.name);
|
|
13
|
+
switch (field.type) {
|
|
14
|
+
case "String":
|
|
15
|
+
case "Bytes":
|
|
16
|
+
return { type: "String?", get: `getString(${k})`, settable: true };
|
|
17
|
+
case "Number":
|
|
18
|
+
return { type: "Number?", get: `getNumber(${k})`, settable: true };
|
|
19
|
+
case "Boolean":
|
|
20
|
+
return { type: "Boolean?", get: `if (has(${k})) getBoolean(${k}) else null`, settable: true };
|
|
21
|
+
case "Date":
|
|
22
|
+
return { type: "Date?", get: `getDate(${k})`, settable: true };
|
|
23
|
+
case "Object":
|
|
24
|
+
return { type: "Map<String, Any?>?", get: `getMap<Any?>(${k})`, settable: true };
|
|
25
|
+
case "Array":
|
|
26
|
+
return { type: "List<Any?>?", get: `getList<Any?>(${k})`, settable: true };
|
|
27
|
+
case "File":
|
|
28
|
+
return { type: "ParseFile?", get: `getParseFile(${k})`, settable: true };
|
|
29
|
+
case "GeoPoint":
|
|
30
|
+
return { type: "ParseGeoPoint?", get: `getParseGeoPoint(${k})`, settable: true };
|
|
31
|
+
case "Polygon":
|
|
32
|
+
return { type: "ParsePolygon?", get: `getParsePolygon(${k})`, settable: true };
|
|
33
|
+
case "Pointer":
|
|
34
|
+
return { type: `${targetName(field, "ParseObject")}?`, get: `getParseObject(${k}) as ${targetName(field, "ParseObject")}?`, settable: true };
|
|
35
|
+
case "Relation":
|
|
36
|
+
return { type: `ParseRelation<${targetName(field, "ParseObject")}>`, get: `getRelation(${k})`, settable: false };
|
|
37
|
+
case "ACL":
|
|
38
|
+
return { type: "ParseACL?", get: `getACL()`, settable: false };
|
|
39
|
+
default:
|
|
40
|
+
return { type: "Any?", get: `get(${k})`, settable: true };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function property(field) {
|
|
44
|
+
const { type, get, settable } = kotlinType(field);
|
|
45
|
+
const name = isIdentifier(field.name) ? field.name : `\`${field.name.replace(/`/g, "")}\``;
|
|
46
|
+
const lines = [` ${settable ? "var" : "val"} ${name}: ${type}`, ` get() = ${get}`];
|
|
47
|
+
if (settable) {
|
|
48
|
+
const k = JSON.stringify(field.name);
|
|
49
|
+
lines.push(` set(value) { if (value == null) remove(${k}) else put(${k}, value) }`);
|
|
50
|
+
}
|
|
51
|
+
return lines;
|
|
52
|
+
}
|
|
53
|
+
function subclass(model) {
|
|
54
|
+
const base = model.builtIn ? BASE[model.builtIn] : "ParseObject";
|
|
55
|
+
const lines = [`@ParseClassName(${JSON.stringify(model.className)})`];
|
|
56
|
+
if (!model.fields.length) {
|
|
57
|
+
lines.push(`class ${model.typeName} : ${base}()`);
|
|
58
|
+
return lines;
|
|
59
|
+
}
|
|
60
|
+
lines.push(`class ${model.typeName} : ${base}() {`);
|
|
61
|
+
model.fields.forEach((f, i) => {
|
|
62
|
+
if (i) {
|
|
63
|
+
lines.push("");
|
|
64
|
+
}
|
|
65
|
+
lines.push(...property(f));
|
|
66
|
+
});
|
|
67
|
+
lines.push("}");
|
|
68
|
+
return lines;
|
|
69
|
+
}
|
|
70
|
+
export function kotlin(models, header) {
|
|
71
|
+
const out = [
|
|
72
|
+
`// ${header}`,
|
|
73
|
+
"// Register before Parse.initialize: " +
|
|
74
|
+
models.map((m) => `ParseObject.registerSubclass(${m.typeName}::class.java)`).join("; "),
|
|
75
|
+
"import com.parse.*",
|
|
76
|
+
"import java.util.Date",
|
|
77
|
+
"",
|
|
78
|
+
];
|
|
79
|
+
for (const model of models) {
|
|
80
|
+
out.push(...subclass(model), "");
|
|
81
|
+
}
|
|
82
|
+
return out.join("\n");
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=kotlin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kotlin.js","sourceRoot":"","sources":["../../src/typegen/kotlin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ParseSchema } from "../client/parse.js";
|
|
2
|
+
/**
|
|
3
|
+
* An app's schema as the generators need it: classes with typed fields,
|
|
4
|
+
* the SDKs' own fields left out (objectId, createdAt, updatedAt, ACL, and
|
|
5
|
+
* the user's username, password, ...), names usable as identifiers.
|
|
6
|
+
*/
|
|
7
|
+
export type FieldType = "String" | "Number" | "Boolean" | "Date" | "Object" | "Array" | "File" | "GeoPoint" | "Polygon" | "Pointer" | "Relation" | "Bytes" | "ACL";
|
|
8
|
+
export interface Field {
|
|
9
|
+
/** As stored in Parse */
|
|
10
|
+
name: string;
|
|
11
|
+
type: FieldType;
|
|
12
|
+
/** Pointers and relations: the class they point to */
|
|
13
|
+
target?: string;
|
|
14
|
+
/** The target is among the generated classes (else: the SDK's base type) */
|
|
15
|
+
targetGenerated?: boolean;
|
|
16
|
+
required: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface ClassModel {
|
|
19
|
+
/** As stored in Parse, e.g. _User */
|
|
20
|
+
className: string;
|
|
21
|
+
/** The type's name, e.g. User */
|
|
22
|
+
typeName: string;
|
|
23
|
+
/** _User, _Role, _Installation: the SDKs' own classes */
|
|
24
|
+
builtIn?: "User" | "Role" | "Installation";
|
|
25
|
+
fields: Field[];
|
|
26
|
+
}
|
|
27
|
+
/** "my-class" -> "MyClass", "_User" -> "User" */
|
|
28
|
+
export declare function typeNameOf(className: string): string;
|
|
29
|
+
/** A field name usable as an identifier in all four languages */
|
|
30
|
+
export declare function isIdentifier(name: string): boolean;
|
|
31
|
+
export declare function buildModel(schemas: ParseSchema[], only?: string[]): ClassModel[];
|
|
32
|
+
/**
|
|
33
|
+
* The type name for a pointer or relation's target, or the SDK's base type
|
|
34
|
+
* when the target isn't generated (e.g. left out with `classes`)
|
|
35
|
+
*/
|
|
36
|
+
export declare function targetName(field: Field, base: string): string;
|
|
37
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/typegen/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,GACP,MAAM,GACN,UAAU,GACV,SAAS,GACT,SAAS,GACT,UAAU,GACV,OAAO,GACP,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAkCD,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CA8BhF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const BUILT_IN_CLASSES = {
|
|
2
|
+
_User: "User",
|
|
3
|
+
_Role: "Role",
|
|
4
|
+
_Installation: "Installation",
|
|
5
|
+
};
|
|
6
|
+
// every Parse object has these; the SDKs declare them
|
|
7
|
+
const COMMON_FIELDS = ["objectId", "createdAt", "updatedAt", "ACL"];
|
|
8
|
+
// and these on the built-in classes
|
|
9
|
+
const BUILT_IN_FIELDS = {
|
|
10
|
+
_User: ["username", "password", "email", "emailVerified", "authData"],
|
|
11
|
+
_Role: ["name", "users", "roles"],
|
|
12
|
+
_Installation: [
|
|
13
|
+
"installationId",
|
|
14
|
+
"deviceType",
|
|
15
|
+
"deviceToken",
|
|
16
|
+
"channels",
|
|
17
|
+
"badge",
|
|
18
|
+
"timeZone",
|
|
19
|
+
"localeIdentifier",
|
|
20
|
+
"appIdentifier",
|
|
21
|
+
"appName",
|
|
22
|
+
"appVersion",
|
|
23
|
+
"parseVersion",
|
|
24
|
+
"pushType",
|
|
25
|
+
"GCMSenderId",
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
// classes of the platform, not of the app's data model
|
|
29
|
+
const INTERNAL = /^_(?!User$|Role$|Installation$)/;
|
|
30
|
+
/** "my-class" -> "MyClass", "_User" -> "User" */
|
|
31
|
+
export function typeNameOf(className) {
|
|
32
|
+
const builtIn = BUILT_IN_CLASSES[className];
|
|
33
|
+
if (builtIn) {
|
|
34
|
+
return builtIn;
|
|
35
|
+
}
|
|
36
|
+
const words = className.replace(/^_+/, "").split(/[^A-Za-z0-9]+/).filter(Boolean);
|
|
37
|
+
const name = words.map((w) => w[0].toUpperCase() + w.slice(1)).join("");
|
|
38
|
+
return /^[0-9]/.test(name) ? `Class${name}` : name || "Unnamed";
|
|
39
|
+
}
|
|
40
|
+
/** A field name usable as an identifier in all four languages */
|
|
41
|
+
export function isIdentifier(name) {
|
|
42
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);
|
|
43
|
+
}
|
|
44
|
+
export function buildModel(schemas, only) {
|
|
45
|
+
const wanted = only && only.length ? new Set(only) : null;
|
|
46
|
+
const models = schemas
|
|
47
|
+
.filter((s) => (wanted ? wanted.has(s.className) : !INTERNAL.test(s.className)))
|
|
48
|
+
.map((s) => {
|
|
49
|
+
const skip = new Set([...COMMON_FIELDS, ...(BUILT_IN_FIELDS[s.className] || [])]);
|
|
50
|
+
const fields = Object.entries(s.fields)
|
|
51
|
+
.filter(([name]) => !skip.has(name))
|
|
52
|
+
.map(([name, def]) => ({
|
|
53
|
+
name,
|
|
54
|
+
type: def.type,
|
|
55
|
+
target: def.targetClass,
|
|
56
|
+
required: !!def.required,
|
|
57
|
+
}))
|
|
58
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
59
|
+
return {
|
|
60
|
+
className: s.className,
|
|
61
|
+
typeName: typeNameOf(s.className),
|
|
62
|
+
builtIn: BUILT_IN_CLASSES[s.className],
|
|
63
|
+
fields,
|
|
64
|
+
};
|
|
65
|
+
})
|
|
66
|
+
.sort((a, b) => a.typeName.localeCompare(b.typeName));
|
|
67
|
+
const generated = new Set(models.map((m) => m.className));
|
|
68
|
+
for (const model of models) {
|
|
69
|
+
for (const field of model.fields) {
|
|
70
|
+
field.targetGenerated = !!field.target && generated.has(field.target);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return models;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The type name for a pointer or relation's target, or the SDK's base type
|
|
77
|
+
* when the target isn't generated (e.g. left out with `classes`)
|
|
78
|
+
*/
|
|
79
|
+
export function targetName(field, base) {
|
|
80
|
+
return field.target && field.targetGenerated ? typeNameOf(field.target) : base;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/typegen/model.ts"],"names":[],"mappings":"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"}
|