@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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -2
  3. package/dist/access.d.ts +47 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +156 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/advice/format.d.ts +22 -0
  8. package/dist/advice/format.d.ts.map +1 -0
  9. package/dist/advice/format.js +70 -0
  10. package/dist/advice/format.js.map +1 -0
  11. package/dist/advice/schemaChecks.d.ts +17 -0
  12. package/dist/advice/schemaChecks.d.ts.map +1 -0
  13. package/dist/advice/schemaChecks.js +64 -0
  14. package/dist/advice/schemaChecks.js.map +1 -0
  15. package/dist/audit.d.ts +32 -0
  16. package/dist/audit.d.ts.map +1 -0
  17. package/dist/audit.js +41 -0
  18. package/dist/audit.js.map +1 -0
  19. package/dist/auth.d.ts +17 -0
  20. package/dist/auth.d.ts.map +1 -0
  21. package/dist/auth.js +72 -0
  22. package/dist/auth.js.map +1 -0
  23. package/dist/bin/login.d.ts +3 -0
  24. package/dist/bin/login.d.ts.map +1 -0
  25. package/dist/bin/login.js +16 -0
  26. package/dist/bin/login.js.map +1 -0
  27. package/dist/bin/mcp-server.d.ts +3 -0
  28. package/dist/bin/mcp-server.d.ts.map +1 -0
  29. package/dist/bin/mcp-server.js +27 -0
  30. package/dist/bin/mcp-server.js.map +1 -0
  31. package/dist/client/parse.d.ts +219 -0
  32. package/dist/client/parse.d.ts.map +1 -0
  33. package/dist/client/parse.js +414 -0
  34. package/dist/client/parse.js.map +1 -0
  35. package/dist/client/sashido.d.ts +213 -0
  36. package/dist/client/sashido.d.ts.map +1 -0
  37. package/dist/client/sashido.js +289 -0
  38. package/dist/client/sashido.js.map +1 -0
  39. package/dist/config.d.ts +27 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +70 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/context.d.ts +33 -0
  44. package/dist/context.d.ts.map +1 -0
  45. package/dist/context.js +132 -0
  46. package/dist/context.js.map +1 -0
  47. package/dist/index.d.ts +10 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +8 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/server.d.ts +13 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +60 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/session/redis-client.d.ts +23 -0
  56. package/dist/session/redis-client.d.ts.map +1 -0
  57. package/dist/session/redis-client.js +136 -0
  58. package/dist/session/redis-client.js.map +1 -0
  59. package/dist/session/session-manager.d.ts +6 -0
  60. package/dist/session/session-manager.d.ts.map +1 -0
  61. package/dist/session/session-manager.js +68 -0
  62. package/dist/session/session-manager.js.map +1 -0
  63. package/dist/session/sse-pubsub.d.ts +23 -0
  64. package/dist/session/sse-pubsub.d.ts.map +1 -0
  65. package/dist/session/sse-pubsub.js +121 -0
  66. package/dist/session/sse-pubsub.js.map +1 -0
  67. package/dist/session/types.d.ts +43 -0
  68. package/dist/session/types.d.ts.map +1 -0
  69. package/dist/session/types.js +2 -0
  70. package/dist/session/types.js.map +1 -0
  71. package/dist/tools/advisor/index.d.ts +3 -0
  72. package/dist/tools/advisor/index.d.ts.map +1 -0
  73. package/dist/tools/advisor/index.js +149 -0
  74. package/dist/tools/advisor/index.js.map +1 -0
  75. package/dist/tools/apps/index.d.ts +3 -0
  76. package/dist/tools/apps/index.d.ts.map +1 -0
  77. package/dist/tools/apps/index.js +113 -0
  78. package/dist/tools/apps/index.js.map +1 -0
  79. package/dist/tools/audit/index.d.ts +6 -0
  80. package/dist/tools/audit/index.d.ts.map +1 -0
  81. package/dist/tools/audit/index.js +69 -0
  82. package/dist/tools/audit/index.js.map +1 -0
  83. package/dist/tools/builds/index.d.ts +3 -0
  84. package/dist/tools/builds/index.d.ts.map +1 -0
  85. package/dist/tools/builds/index.js +85 -0
  86. package/dist/tools/builds/index.js.map +1 -0
  87. package/dist/tools/classes/index.d.ts +3 -0
  88. package/dist/tools/classes/index.d.ts.map +1 -0
  89. package/dist/tools/classes/index.js +223 -0
  90. package/dist/tools/classes/index.js.map +1 -0
  91. package/dist/tools/cloud-functions/index.d.ts +3 -0
  92. package/dist/tools/cloud-functions/index.d.ts.map +1 -0
  93. package/dist/tools/cloud-functions/index.js +154 -0
  94. package/dist/tools/cloud-functions/index.js.map +1 -0
  95. package/dist/tools/deployments/index.d.ts +3 -0
  96. package/dist/tools/deployments/index.d.ts.map +1 -0
  97. package/dist/tools/deployments/index.js +124 -0
  98. package/dist/tools/deployments/index.js.map +1 -0
  99. package/dist/tools/engines/index.d.ts +3 -0
  100. package/dist/tools/engines/index.d.ts.map +1 -0
  101. package/dist/tools/engines/index.js +68 -0
  102. package/dist/tools/engines/index.js.map +1 -0
  103. package/dist/tools/env/index.d.ts +3 -0
  104. package/dist/tools/env/index.d.ts.map +1 -0
  105. package/dist/tools/env/index.js +116 -0
  106. package/dist/tools/env/index.js.map +1 -0
  107. package/dist/tools/files/index.d.ts +3 -0
  108. package/dist/tools/files/index.d.ts.map +1 -0
  109. package/dist/tools/files/index.js +132 -0
  110. package/dist/tools/files/index.js.map +1 -0
  111. package/dist/tools/health/index.d.ts +3 -0
  112. package/dist/tools/health/index.d.ts.map +1 -0
  113. package/dist/tools/health/index.js +47 -0
  114. package/dist/tools/health/index.js.map +1 -0
  115. package/dist/tools/infrastructure/deployments.d.ts +23 -0
  116. package/dist/tools/infrastructure/deployments.d.ts.map +1 -0
  117. package/dist/tools/infrastructure/deployments.js +76 -0
  118. package/dist/tools/infrastructure/deployments.js.map +1 -0
  119. package/dist/tools/infrastructure/index.d.ts +9 -0
  120. package/dist/tools/infrastructure/index.d.ts.map +1 -0
  121. package/dist/tools/infrastructure/index.js +164 -0
  122. package/dist/tools/infrastructure/index.js.map +1 -0
  123. package/dist/tools/jobs/index.d.ts +3 -0
  124. package/dist/tools/jobs/index.d.ts.map +1 -0
  125. package/dist/tools/jobs/index.js +338 -0
  126. package/dist/tools/jobs/index.js.map +1 -0
  127. package/dist/tools/logs/index.d.ts +3 -0
  128. package/dist/tools/logs/index.d.ts.map +1 -0
  129. package/dist/tools/logs/index.js +133 -0
  130. package/dist/tools/logs/index.js.map +1 -0
  131. package/dist/tools/objects/index.d.ts +3 -0
  132. package/dist/tools/objects/index.d.ts.map +1 -0
  133. package/dist/tools/objects/index.js +185 -0
  134. package/dist/tools/objects/index.js.map +1 -0
  135. package/dist/tools/push/index.d.ts +3 -0
  136. package/dist/tools/push/index.d.ts.map +1 -0
  137. package/dist/tools/push/index.js +434 -0
  138. package/dist/tools/push/index.js.map +1 -0
  139. package/dist/tools/types/index.d.ts +3 -0
  140. package/dist/tools/types/index.d.ts.map +1 -0
  141. package/dist/tools/types/index.js +45 -0
  142. package/dist/tools/types/index.js.map +1 -0
  143. package/dist/tools/webhooks/index.d.ts +3 -0
  144. package/dist/tools/webhooks/index.d.ts.map +1 -0
  145. package/dist/tools/webhooks/index.js +443 -0
  146. package/dist/tools/webhooks/index.js.map +1 -0
  147. package/dist/transports/http.d.ts +4 -0
  148. package/dist/transports/http.d.ts.map +1 -0
  149. package/dist/transports/http.js +241 -0
  150. package/dist/transports/http.js.map +1 -0
  151. package/dist/transports/stdio.d.ts +7 -0
  152. package/dist/transports/stdio.d.ts.map +1 -0
  153. package/dist/transports/stdio.js +29 -0
  154. package/dist/transports/stdio.js.map +1 -0
  155. package/dist/typegen/dart.d.ts +3 -0
  156. package/dist/typegen/dart.d.ts.map +1 -0
  157. package/dist/typegen/dart.js +84 -0
  158. package/dist/typegen/dart.js.map +1 -0
  159. package/dist/typegen/kotlin.d.ts +3 -0
  160. package/dist/typegen/kotlin.d.ts.map +1 -0
  161. package/dist/typegen/kotlin.js +84 -0
  162. package/dist/typegen/kotlin.js.map +1 -0
  163. package/dist/typegen/model.d.ts +37 -0
  164. package/dist/typegen/model.d.ts.map +1 -0
  165. package/dist/typegen/model.js +82 -0
  166. package/dist/typegen/model.js.map +1 -0
  167. package/dist/typegen/swift.d.ts +3 -0
  168. package/dist/typegen/swift.d.ts.map +1 -0
  169. package/dist/typegen/swift.js +105 -0
  170. package/dist/typegen/swift.js.map +1 -0
  171. package/dist/typegen/typescript.d.ts +3 -0
  172. package/dist/typegen/typescript.d.ts.map +1 -0
  173. package/dist/typegen/typescript.js +73 -0
  174. package/dist/typegen/typescript.js.map +1 -0
  175. package/dist/upgrade/rules.d.ts +27 -0
  176. package/dist/upgrade/rules.d.ts.map +1 -0
  177. package/dist/upgrade/rules.js +133 -0
  178. package/dist/upgrade/rules.js.map +1 -0
  179. package/dist/upgrade/scan.d.ts +18 -0
  180. package/dist/upgrade/scan.d.ts.map +1 -0
  181. package/dist/upgrade/scan.js +38 -0
  182. package/dist/upgrade/scan.js.map +1 -0
  183. package/dist/upgrade/versions.d.ts +8 -0
  184. package/dist/upgrade/versions.d.ts.map +1 -0
  185. package/dist/upgrade/versions.js +25 -0
  186. package/dist/upgrade/versions.js.map +1 -0
  187. package/dist/version.d.ts +3 -0
  188. package/dist/version.d.ts.map +1 -0
  189. package/dist/version.js +3 -0
  190. package/dist/version.js.map +1 -0
  191. 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,3 @@
1
+ import { ClassModel } from "./model.js";
2
+ export declare function dart(models: ClassModel[], header: string): string;
3
+ //# sourceMappingURL=dart.d.ts.map
@@ -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,3 @@
1
+ import { ClassModel } from "./model.js";
2
+ export declare function kotlin(models: ClassModel[], header: string): string;
3
+ //# sourceMappingURL=kotlin.d.ts.map
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ import { ClassModel } from "./model.js";
2
+ export declare function swift(models: ClassModel[], header: string): string;
3
+ //# sourceMappingURL=swift.d.ts.map