@amtp/protocol 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +386 -0
  3. package/USAGE_GUIDE.md +722 -0
  4. package/bin/amtp.ts +387 -0
  5. package/dist/client/amtp-client.d.ts +164 -0
  6. package/dist/client/amtp-client.js +460 -0
  7. package/dist/client/amtp-client.js.map +1 -0
  8. package/dist/client/examples/basic-client.d.ts +6 -0
  9. package/dist/client/examples/basic-client.js +35 -0
  10. package/dist/client/examples/basic-client.js.map +1 -0
  11. package/dist/crawler/amtp-crawler.d.ts +125 -0
  12. package/dist/crawler/amtp-crawler.js +359 -0
  13. package/dist/crawler/amtp-crawler.js.map +1 -0
  14. package/dist/crawler/examples/basic-crawler.d.ts +6 -0
  15. package/dist/crawler/examples/basic-crawler.js +28 -0
  16. package/dist/crawler/examples/basic-crawler.js.map +1 -0
  17. package/dist/index.d.ts +15 -0
  18. package/dist/index.js +70 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/server/adapters/fastify-adapter.d.ts +86 -0
  21. package/dist/server/adapters/fastify-adapter.js +169 -0
  22. package/dist/server/adapters/fastify-adapter.js.map +1 -0
  23. package/dist/server/amtp-ql-executor.d.ts +24 -0
  24. package/dist/server/amtp-ql-executor.js +198 -0
  25. package/dist/server/amtp-ql-executor.js.map +1 -0
  26. package/dist/server/amtp-ql-parser.d.ts +30 -0
  27. package/dist/server/amtp-ql-parser.js +212 -0
  28. package/dist/server/amtp-ql-parser.js.map +1 -0
  29. package/dist/server/amtp-server.d.ts +183 -0
  30. package/dist/server/amtp-server.js +650 -0
  31. package/dist/server/amtp-server.js.map +1 -0
  32. package/dist/server/examples/basic-server.d.ts +6 -0
  33. package/dist/server/examples/basic-server.js +215 -0
  34. package/dist/server/examples/basic-server.js.map +1 -0
  35. package/dist/server/examples/saas-dashboard-server.d.ts +44 -0
  36. package/dist/server/examples/saas-dashboard-server.js +387 -0
  37. package/dist/server/examples/saas-dashboard-server.js.map +1 -0
  38. package/dist/server/markdown-parser.d.ts +31 -0
  39. package/dist/server/markdown-parser.js +463 -0
  40. package/dist/server/markdown-parser.js.map +1 -0
  41. package/dist/server/notifications.d.ts +40 -0
  42. package/dist/server/notifications.js +134 -0
  43. package/dist/server/notifications.js.map +1 -0
  44. package/dist/server/permissions.d.ts +40 -0
  45. package/dist/server/permissions.js +156 -0
  46. package/dist/server/permissions.js.map +1 -0
  47. package/dist/server/security.d.ts +127 -0
  48. package/dist/server/security.js +368 -0
  49. package/dist/server/security.js.map +1 -0
  50. package/dist/types/amtp.types.d.ts +720 -0
  51. package/dist/types/amtp.types.js +224 -0
  52. package/dist/types/amtp.types.js.map +1 -0
  53. package/package.json +89 -0
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * AMTP — Fastify Adapter
4
+ *
5
+ * Registers AMTP middleware on a Fastify instance: request parsing,
6
+ * session resolution, CORS, rate-limiting, body-size cap, security
7
+ * headers, and CSRF protection.
8
+ *
9
+ * Dependencies:
10
+ * npm install --save fastify
11
+ *
12
+ * Usage in your server entry point:
13
+ * import fastify from "fastify";
14
+ * import { fastifyAMTP, amtpReply, createAMTPFastifyApp } from "../src/server/adapters/fastify-adapter";
15
+ * import { AMTPResponseBuilder } from "../src/server/amtp-server";
16
+ *
17
+ * const app = fastifyAMTP.fastify({
18
+ * logger: { level: "info" },
19
+ * });
20
+ *
21
+ * await app.register(fastifyAMTP.plugin, {
22
+ * trustedOrigins: ["https://your-frontend.example.com"],
23
+ * });
24
+ *
25
+ * app.get("/hello", (req, reply) => {
26
+ * const doc = new AMTPResponseBuilder().build("# Hello\n\nWorld!");
27
+ * return reply.amtp(doc);
28
+ * });
29
+ *
30
+ * await app.listen({ port: 3000 });
31
+ */
32
+ var __importDefault = (this && this.__importDefault) || function (mod) {
33
+ return (mod && mod.__esModule) ? mod : { "default": mod };
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createAMTPFastifyApp = exports.fastifyAMTP = exports.plugin = exports.SessionManager = exports.AMTPMarkdownParser = exports.AMTPResponseBuilder = void 0;
37
+ const fastify_1 = __importDefault(require("fastify"));
38
+ const amtp_server_js_1 = require("../amtp-server.js");
39
+ Object.defineProperty(exports, "AMTPResponseBuilder", { enumerable: true, get: function () { return amtp_server_js_1.AMTPResponseBuilder; } });
40
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return amtp_server_js_1.SessionManager; } });
41
+ const markdown_parser_js_1 = require("../markdown-parser.js");
42
+ Object.defineProperty(exports, "AMTPMarkdownParser", { enumerable: true, get: function () { return markdown_parser_js_1.AMTPMarkdownParser; } });
43
+ const security_js_1 = require("../security.js");
44
+ /* ================================================================
45
+ INTERNAL MIDDLEWARE
46
+ ================================================================ */
47
+ class MiddlewareManager {
48
+ constructor(opts) {
49
+ this._parser = new amtp_server_js_1.AMTPRequestParser();
50
+ this._builder = new amtp_server_js_1.AMTPResponseBuilder();
51
+ this.sm = opts.sessionManager ?? new amtp_server_js_1.SessionManager();
52
+ this._limiter =
53
+ opts.enableRateLimit !== false
54
+ ? new security_js_1.InMemoryRateLimiter(opts.rateLimitWindowMs ?? 60000, opts.rateLimitMaxRequests ?? 60)
55
+ : null;
56
+ }
57
+ /** Patch AMTP context onto a Fastify request. */
58
+ onRequest(req) {
59
+ const r = this._parser.parse(req);
60
+ req.amtpHeaders = r.headers;
61
+ req.amtpSession = r.sessionId
62
+ ? this.sm.getSession(r.sessionId) || null
63
+ : null;
64
+ }
65
+ /** Write security headers in onSend. */
66
+ onSend(_req, reply) {
67
+ reply
68
+ .header("X-Content-Type-Options", "nosniff")
69
+ .header("X-Frame-Options", "DENY")
70
+ .header("X-XSS-Protection", "1; mode=block")
71
+ .header("Referrer-Policy", "strict-origin-when-cross-origin")
72
+ .header("Content-Security-Policy", "default-src 'none'; script-src 'none'; " +
73
+ "object-src 'none'; base-uri 'none';");
74
+ }
75
+ /** Return true when the IP has exceeded its rate limit. */
76
+ isRateLimited(ip) {
77
+ if (!this._limiter)
78
+ return false;
79
+ return !this._limiter.check(ip);
80
+ }
81
+ }
82
+ /* ================================================================
83
+ FASTIFY PLUGIN
84
+ ================================================================ */
85
+ const plugin = async (app, pluginOpts = {}) => {
86
+ const mw = new MiddlewareManager(pluginOpts);
87
+ // ---- 1. AMTP context -----
88
+ app.addHook("onRequest", async (req) => {
89
+ mw.onRequest(req);
90
+ });
91
+ // ---- 2. Body size guard ----
92
+ const bodyLimit = pluginOpts.maxRequestBodySize ?? 1048576;
93
+ app.addContentTypeParser("application/json", { bodyLimit }, function (req, payload, done) {
94
+ done();
95
+ });
96
+ // ---- 3. Security headers ----
97
+ if (pluginOpts.enableSecurityHeaders !== false) {
98
+ app.addHook("onSend", async (_req, reply) => {
99
+ mw.onSend(_req, reply);
100
+ });
101
+ }
102
+ // ---- 4. Rate limiter ----
103
+ if (mw["_limiter"]) {
104
+ app.addHook("preHandler", async (req, reply) => {
105
+ const ip = req.ip || req.socket?.remoteAddress || "unknown";
106
+ if (mw.isRateLimited(ip)) {
107
+ reply.code(429);
108
+ return { status: "error", error: { code: "RATE_LIMITED", message: "Too many requests. Try again later." } };
109
+ }
110
+ });
111
+ }
112
+ };
113
+ exports.plugin = plugin;
114
+ /**
115
+ * NAMESPACE EXPORT — use for ergonomic named import.
116
+ */
117
+ exports.fastifyAMTP = { plugin: exports.plugin, createAMTPFastifyApp };
118
+ /**
119
+ * Fastify plugin (to register with `app.register(plugin, opts)`).
120
+ */
121
+ const exportedPlugin = exports.plugin;
122
+ /* ================================================================
123
+ REPLY HELPER
124
+ ================================================================ */
125
+ /**
126
+ * Patch `reply.amtp()` onto *every* Fastify instance at runtime.
127
+ * Import and call this before you define your routes.
128
+ *
129
+ * @param app The Fastify instance to decorate.
130
+ */
131
+ function amtpReply(app) {
132
+ app.decorateReply("amtp", function (doc, sid) {
133
+ const builder = new amtp_server_js_1.AMTPResponseBuilder();
134
+ let hdrs;
135
+ let body;
136
+ if (typeof doc === "string") {
137
+ const r = builder.build(doc, sid ? { sessionId: sid } : undefined);
138
+ hdrs = r.headers;
139
+ body = r.body;
140
+ }
141
+ else {
142
+ hdrs = doc.headers;
143
+ body = doc.body;
144
+ }
145
+ for (const [k, v] of Object.entries(hdrs)) {
146
+ if (v)
147
+ this.header(k, v);
148
+ }
149
+ return this.send(body);
150
+ });
151
+ }
152
+ /* ================================================================
153
+ EAGER SERVER FACTORY
154
+ ================================================================ */
155
+ /**
156
+ * Build and return a Fastify instance with AMTP and `reply.amtp()` pre-attached.
157
+ *
158
+ * @param opts AMTP plugin options
159
+ */
160
+ function createAMTPFastifyApp(opts) {
161
+ const app = (0, fastify_1.default)({ logger: true });
162
+ amtpReply(app);
163
+ // @ts-expect-error Fastify.register() is strict about register-options types.
164
+ // 'opts' is a plain FastifyAMTPOptions object and safe at runtime.
165
+ void app.register(exports.plugin, opts);
166
+ return app;
167
+ }
168
+ exports.createAMTPFastifyApp = createAMTPFastifyApp;
169
+ //# sourceMappingURL=fastify-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify-adapter.js","sourceRoot":"","sources":["../../../src/server/adapters/fastify-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * AMTP-QL Executor
3
+ * Executes a parsed AMTPQLParsedQuery against an AMTPDocument and returns projected AMTPQLResult
4
+ */
5
+ import { AMTPDocument, AMTPQLParsedQuery, AMTPQLResult } from "../types/amtp.types";
6
+ export declare class AMTPQLExecutionError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare class AMTPQLExecutor {
10
+ /**
11
+ * Execute the parsed query against the document.
12
+ */
13
+ execute(doc: AMTPDocument, parsed: AMTPQLParsedQuery): AMTPQLResult;
14
+ private projectDocument;
15
+ private projectMetadata;
16
+ private projectPagination;
17
+ private projectActions;
18
+ private projectForms;
19
+ private projectLinks;
20
+ private projectStructuredData;
21
+ private projectNodes;
22
+ }
23
+ /** Convenience: parse + execute in one call */
24
+ export declare function executeAMTPQL(doc: AMTPDocument, rawQuery: string): AMTPQLResult;
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * AMTP-QL Executor
4
+ * Executes a parsed AMTPQLParsedQuery against an AMTPDocument and returns projected AMTPQLResult
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.executeAMTPQL = exports.AMTPQLExecutor = exports.AMTPQLExecutionError = void 0;
8
+ const amtp_ql_parser_1 = require("./amtp-ql-parser");
9
+ const MAX_DEPTH = 5;
10
+ class AMTPQLExecutionError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = "AMTPQLExecutionError";
14
+ }
15
+ }
16
+ exports.AMTPQLExecutionError = AMTPQLExecutionError;
17
+ class AMTPQLExecutor {
18
+ /**
19
+ * Execute the parsed query against the document.
20
+ */
21
+ execute(doc, parsed) {
22
+ const result = {};
23
+ for (const sel of parsed.selections) {
24
+ if (sel.field === "document") {
25
+ Object.assign(result, this.projectDocument(doc, sel, 0));
26
+ }
27
+ else {
28
+ // future: support top-level other roots
29
+ throw new AMTPQLExecutionError(`Unknown root field: ${sel.field}`);
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ projectDocument(doc, sel, depth) {
35
+ if (depth > MAX_DEPTH) {
36
+ throw new AMTPQLExecutionError("Query depth limit exceeded");
37
+ }
38
+ const out = {};
39
+ const subSels = sel.selections || [];
40
+ if (subSels.length === 0) {
41
+ // default projection if no sub-selection
42
+ out.title = doc.title;
43
+ out.actions = doc.actions;
44
+ return out;
45
+ }
46
+ for (const sub of subSels) {
47
+ switch (sub.field) {
48
+ case "title":
49
+ out.title = doc.title;
50
+ break;
51
+ case "path":
52
+ out.path = doc.path;
53
+ break;
54
+ case "version":
55
+ out.version = doc.version;
56
+ break;
57
+ case "metadata": {
58
+ const metaSel = sub.selections;
59
+ out.metadata = this.projectMetadata(doc.metadata, metaSel);
60
+ break;
61
+ }
62
+ case "pagination":
63
+ out.pagination = this.projectPagination(doc.pagination);
64
+ break;
65
+ case "actions":
66
+ out.actions = this.projectActions(doc.actions, sub.selections);
67
+ break;
68
+ case "forms":
69
+ out.forms = this.projectForms(doc.forms, sub.selections);
70
+ break;
71
+ case "links":
72
+ out.links = this.projectLinks(doc.links, sub.selections);
73
+ break;
74
+ case "structured_data":
75
+ out.structured_data = this.projectStructuredData(doc.structured_data, sub.selections);
76
+ break;
77
+ case "nodes":
78
+ out.nodes = this.projectNodes(doc.nodes, sub.arguments, sub.selections);
79
+ break;
80
+ default:
81
+ throw new AMTPQLExecutionError(`Unknown document field: ${sub.field}`);
82
+ }
83
+ }
84
+ return out;
85
+ }
86
+ projectMetadata(meta, subSels) {
87
+ if (!subSels || subSels.length === 0)
88
+ return { ...meta };
89
+ const out = {};
90
+ for (const s of subSels) {
91
+ const key = s.field;
92
+ if (key in meta)
93
+ out[key] = meta[key];
94
+ }
95
+ return out;
96
+ }
97
+ projectPagination(pag) {
98
+ return pag ? { ...pag } : undefined;
99
+ }
100
+ projectActions(actions, subSels) {
101
+ if (!subSels || subSels.length === 0) {
102
+ return actions.map(a => ({ id: a.id, description: a.description, parameters: a.parameters }));
103
+ }
104
+ return actions.map(action => {
105
+ const item = {};
106
+ for (const s of subSels) {
107
+ if (s.field === "id")
108
+ item.id = action.id;
109
+ if (s.field === "description")
110
+ item.description = action.description;
111
+ if (s.field === "parameters")
112
+ item.parameters = action.parameters;
113
+ }
114
+ return item;
115
+ });
116
+ }
117
+ projectForms(forms, subSels) {
118
+ if (!subSels || subSels.length === 0) {
119
+ return forms.map(f => ({ id: f.id, fields: f.fields }));
120
+ }
121
+ return forms.map(form => {
122
+ const item = {};
123
+ for (const s of subSels) {
124
+ if (s.field === "id")
125
+ item.id = form.id;
126
+ if (s.field === "fields")
127
+ item.fields = form.fields;
128
+ }
129
+ return item;
130
+ });
131
+ }
132
+ projectLinks(links, subSels) {
133
+ if (!subSels || subSels.length === 0) {
134
+ return links.map(l => ({ text: l.text, url: l.url, type: l.type }));
135
+ }
136
+ return links.map(link => {
137
+ const item = {};
138
+ for (const s of subSels) {
139
+ if (s.field in link)
140
+ item[s.field] = link[s.field];
141
+ }
142
+ return item;
143
+ });
144
+ }
145
+ projectStructuredData(data, subSels) {
146
+ if (!data)
147
+ return [];
148
+ if (!subSels || subSels.length === 0)
149
+ return data;
150
+ return data.map(d => {
151
+ const item = {};
152
+ for (const s of subSels) {
153
+ if (s.field === "type")
154
+ item.type = d.type;
155
+ if (s.field === "data")
156
+ item.data = d.data;
157
+ }
158
+ return item;
159
+ });
160
+ }
161
+ projectNodes(nodes, args, subSels) {
162
+ let filtered = nodes;
163
+ if (args?.type) {
164
+ const wanted = (Array.isArray(args.type) ? args.type : [args.type]).map((t) => t.toLowerCase());
165
+ filtered = filtered.filter(n => wanted.includes(String(n.type).toLowerCase()));
166
+ }
167
+ if (typeof args?.limit === "number") {
168
+ filtered = filtered.slice(0, args.limit);
169
+ }
170
+ if (!subSels || subSels.length === 0) {
171
+ return filtered.map(n => ({ type: n.type, content: n.content, description: n.description }));
172
+ }
173
+ return filtered.map(node => {
174
+ const item = {};
175
+ for (const s of subSels) {
176
+ if (s.field === "type")
177
+ item.type = node.type;
178
+ if (s.field === "content")
179
+ item.content = node.content;
180
+ if (s.field === "description")
181
+ item.description = node.description;
182
+ if (s.field === "children" && node.children) {
183
+ item.children = this.projectNodes(node.children, undefined, s.selections);
184
+ }
185
+ }
186
+ return item;
187
+ });
188
+ }
189
+ }
190
+ exports.AMTPQLExecutor = AMTPQLExecutor;
191
+ /** Convenience: parse + execute in one call */
192
+ function executeAMTPQL(doc, rawQuery) {
193
+ const parsed = (0, amtp_ql_parser_1.parseAMTPQL)(rawQuery);
194
+ const executor = new AMTPQLExecutor();
195
+ return executor.execute(doc, parsed);
196
+ }
197
+ exports.executeAMTPQL = executeAMTPQL;
198
+ //# sourceMappingURL=amtp-ql-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amtp-ql-executor.js","sourceRoot":"","sources":["../../src/server/amtp-ql-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * AMTP-QL Parser
3
+ * Parses a restricted GraphQL-like query string into AMTPQLParsedQuery AST
4
+ * Supports: document { field(args) { sub } , ... }
5
+ */
6
+ import { AMTPQLParsedQuery } from "../types/amtp.types";
7
+ export declare class AMTPQLSyntaxError extends Error {
8
+ position?: number | undefined;
9
+ constructor(message: string, position?: number | undefined);
10
+ }
11
+ export declare class AMTPQLParser {
12
+ private query;
13
+ private pos;
14
+ private len;
15
+ constructor(query: string);
16
+ parse(): AMTPQLParsedQuery;
17
+ private parseSelectionSet;
18
+ private parseArguments;
19
+ private parseValue;
20
+ private parseString;
21
+ private parseNumber;
22
+ private parseBoolean;
23
+ private parseList;
24
+ private parseObject;
25
+ private parseName;
26
+ private skipWhitespace;
27
+ private expect;
28
+ }
29
+ /** Convenience function */
30
+ export declare function parseAMTPQL(query: string): AMTPQLParsedQuery;
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * AMTP-QL Parser
4
+ * Parses a restricted GraphQL-like query string into AMTPQLParsedQuery AST
5
+ * Supports: document { field(args) { sub } , ... }
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.parseAMTPQL = exports.AMTPQLParser = exports.AMTPQLSyntaxError = void 0;
9
+ class AMTPQLSyntaxError extends Error {
10
+ constructor(message, position) {
11
+ super(message);
12
+ this.position = position;
13
+ this.name = "AMTPQLSyntaxError";
14
+ }
15
+ }
16
+ exports.AMTPQLSyntaxError = AMTPQLSyntaxError;
17
+ class AMTPQLParser {
18
+ constructor(query) {
19
+ this.pos = 0;
20
+ // Normalize: remove comments, extra whitespace
21
+ this.query = query
22
+ .replace(/#[^\n]*/g, "")
23
+ .replace(/\s+/g, " ")
24
+ .trim();
25
+ this.len = this.query.length;
26
+ }
27
+ parse() {
28
+ this.pos = 0;
29
+ this.expect("query");
30
+ this.skipWhitespace();
31
+ const selections = this.parseSelectionSet();
32
+ this.skipWhitespace();
33
+ if (this.pos < this.len) {
34
+ throw new AMTPQLSyntaxError(`Unexpected input after query at ${this.pos}`);
35
+ }
36
+ return { selections };
37
+ }
38
+ parseSelectionSet() {
39
+ this.expect("{");
40
+ const selections = [];
41
+ this.skipWhitespace();
42
+ while (this.pos < this.len && this.query[this.pos] !== "}") {
43
+ const field = this.parseName();
44
+ this.skipWhitespace();
45
+ let args;
46
+ if (this.query[this.pos] === "(") {
47
+ args = this.parseArguments();
48
+ this.skipWhitespace();
49
+ }
50
+ let subSelections;
51
+ if (this.query[this.pos] === "{") {
52
+ subSelections = this.parseSelectionSet();
53
+ this.skipWhitespace();
54
+ }
55
+ selections.push({
56
+ field,
57
+ arguments: args,
58
+ selections: subSelections,
59
+ });
60
+ this.skipWhitespace();
61
+ if (this.query[this.pos] === ",") {
62
+ this.pos++;
63
+ this.skipWhitespace();
64
+ }
65
+ }
66
+ this.expect("}");
67
+ return selections;
68
+ }
69
+ parseArguments() {
70
+ this.expect("(");
71
+ const args = {};
72
+ this.skipWhitespace();
73
+ while (this.pos < this.len && this.query[this.pos] !== ")") {
74
+ const name = this.parseName();
75
+ this.skipWhitespace();
76
+ this.expect(":");
77
+ this.skipWhitespace();
78
+ const value = this.parseValue();
79
+ args[name] = value;
80
+ this.skipWhitespace();
81
+ if (this.query[this.pos] === ",") {
82
+ this.pos++;
83
+ this.skipWhitespace();
84
+ }
85
+ }
86
+ this.expect(")");
87
+ return args;
88
+ }
89
+ parseValue() {
90
+ const ch = this.query[this.pos];
91
+ if (ch === '"') {
92
+ return this.parseString();
93
+ }
94
+ if (ch === "-" || (ch >= "0" && ch <= "9")) {
95
+ return this.parseNumber();
96
+ }
97
+ if (ch === "t" || ch === "f") {
98
+ return this.parseBoolean();
99
+ }
100
+ if (ch === "n") {
101
+ this.expect("null");
102
+ return null;
103
+ }
104
+ if (ch === "[") {
105
+ return this.parseList();
106
+ }
107
+ if (ch === "{") {
108
+ return this.parseObject();
109
+ }
110
+ // bare identifier as string (for enums etc.)
111
+ return this.parseName();
112
+ }
113
+ parseString() {
114
+ this.expect('"');
115
+ let str = "";
116
+ while (this.pos < this.len && this.query[this.pos] !== '"') {
117
+ if (this.query[this.pos] === "\\") {
118
+ this.pos++;
119
+ const esc = this.query[this.pos++];
120
+ str += esc === "n" ? "\n" : esc;
121
+ }
122
+ else {
123
+ str += this.query[this.pos++];
124
+ }
125
+ }
126
+ this.expect('"');
127
+ return str;
128
+ }
129
+ parseNumber() {
130
+ const start = this.pos;
131
+ if (this.query[this.pos] === "-")
132
+ this.pos++;
133
+ while (this.pos < this.len && /[0-9.]/.test(this.query[this.pos]))
134
+ this.pos++;
135
+ return Number(this.query.slice(start, this.pos));
136
+ }
137
+ parseBoolean() {
138
+ if (this.query.slice(this.pos, this.pos + 4) === "true") {
139
+ this.pos += 4;
140
+ return true;
141
+ }
142
+ if (this.query.slice(this.pos, this.pos + 5) === "false") {
143
+ this.pos += 5;
144
+ return false;
145
+ }
146
+ throw new AMTPQLSyntaxError("Invalid boolean", this.pos);
147
+ }
148
+ parseList() {
149
+ this.expect("[");
150
+ const list = [];
151
+ this.skipWhitespace();
152
+ while (this.pos < this.len && this.query[this.pos] !== "]") {
153
+ list.push(this.parseValue());
154
+ this.skipWhitespace();
155
+ if (this.query[this.pos] === ",") {
156
+ this.pos++;
157
+ this.skipWhitespace();
158
+ }
159
+ }
160
+ this.expect("]");
161
+ return list;
162
+ }
163
+ parseObject() {
164
+ this.expect("{");
165
+ const obj = {};
166
+ this.skipWhitespace();
167
+ while (this.pos < this.len && this.query[this.pos] !== "}") {
168
+ const key = this.parseName();
169
+ this.skipWhitespace();
170
+ this.expect(":");
171
+ this.skipWhitespace();
172
+ obj[key] = this.parseValue();
173
+ this.skipWhitespace();
174
+ if (this.query[this.pos] === ",") {
175
+ this.pos++;
176
+ this.skipWhitespace();
177
+ }
178
+ }
179
+ this.expect("}");
180
+ return obj;
181
+ }
182
+ parseName() {
183
+ const start = this.pos;
184
+ while (this.pos < this.len && /[a-zA-Z0-9_]/.test(this.query[this.pos])) {
185
+ this.pos++;
186
+ }
187
+ const name = this.query.slice(start, this.pos);
188
+ if (!name) {
189
+ throw new AMTPQLSyntaxError("Expected name", start);
190
+ }
191
+ return name;
192
+ }
193
+ skipWhitespace() {
194
+ while (this.pos < this.len && /\s/.test(this.query[this.pos]))
195
+ this.pos++;
196
+ }
197
+ expect(str) {
198
+ this.skipWhitespace();
199
+ if (this.query.slice(this.pos, this.pos + str.length) !== str) {
200
+ throw new AMTPQLSyntaxError(`Expected "${str}"`, this.pos);
201
+ }
202
+ this.pos += str.length;
203
+ }
204
+ }
205
+ exports.AMTPQLParser = AMTPQLParser;
206
+ /** Convenience function */
207
+ function parseAMTPQL(query) {
208
+ const parser = new AMTPQLParser(query);
209
+ return parser.parse();
210
+ }
211
+ exports.parseAMTPQL = parseAMTPQL;
212
+ //# sourceMappingURL=amtp-ql-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amtp-ql-parser.js","sourceRoot":"","sources":["../../src/server/amtp-ql-parser.ts"],"names":[],"mappings":"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"}