@monok/server 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md ADDED
@@ -0,0 +1,318 @@
1
+ # Implementing `@monok/server` in a host application
2
+
3
+ This file is a self-contained implementation contract for AI coding assistants
4
+ and developers integrating Monok with an Express application or CMS. Follow the
5
+ requirements below rather than inventing alternate endpoint paths or response
6
+ shapes.
7
+
8
+ ## Objective
9
+
10
+ By default, expose a public HTTPS Monok integration at these routes:
11
+
12
+ - `POST /api/monok/push`
13
+ - `GET /api/monok/info`
14
+ - `GET /api/monok/postfilter` when article discovery is supported
15
+
16
+ Use `createMonokRouter` from `@monok/server`. Mount it at `/api/monok` for the
17
+ default API base, or at an intentional custom base such as
18
+ `/something/specialAPI/monok`. When connecting the integration, enter either the
19
+ site origin to select the default or the complete custom base URL. Monok appends
20
+ `/info`, `/push`, and `/postfilter` to that base.
21
+
22
+ ## Required implementation
23
+
24
+ Install the package and Express:
25
+
26
+ ```bash
27
+ npm install @monok/server express
28
+ ```
29
+
30
+ Create one router with the same secret API key configured for the Monok
31
+ workspace:
32
+
33
+ ```ts
34
+ import express from "express";
35
+ import {
36
+ createMonokRouter,
37
+ sendMonokLinkback,
38
+ type MonokArticle,
39
+ type PostFilterQuery,
40
+ type PostFilterResult,
41
+ type SiteInfoInput
42
+ } from "@monok/server";
43
+
44
+ const app = express();
45
+
46
+ app.use(
47
+ "/api/monok",
48
+ createMonokRouter({
49
+ apiKey: process.env.MONOK_API_KEY!,
50
+ imageDir: "./uploads/monok",
51
+ getSiteInfo: async (): Promise<SiteInfoInput> => loadSiteInfo(),
52
+ searchArticles: async (
53
+ filters: PostFilterQuery
54
+ ): Promise<PostFilterResult[]> => searchPublishedArticles(filters),
55
+ onArticle: async (article, context) => {
56
+ await upsertMonokArticle(article, context);
57
+ }
58
+ })
59
+ );
60
+ ```
61
+
62
+ `onArticle` and the application's persistence work are always required.
63
+ `getSiteInfo` is optional. The router always exposes authenticated `/info`; when
64
+ the callback is omitted it returns minimal `Custom CMS` metadata so the standard
65
+ Monok dashboard connection and sync flow can still detect the installation.
66
+ `searchArticles` and `imageDir` are optional; omitting article search disables
67
+ covered-article and backlink discovery.
68
+
69
+ Do not add another JSON body parser solely for these routes. The router already
70
+ parses JSON with a 20 MB limit. A reverse proxy in front of the application must
71
+ also permit the request size.
72
+
73
+ ## Receiving and storing articles
74
+
75
+ `onArticle` receives:
76
+
77
+ ```ts
78
+ async function onArticle(
79
+ article: MonokArticle,
80
+ context: {
81
+ action?: "draft" | "publish";
82
+ saveThumbImage(fileNameBase?: string): Promise<string | undefined>;
83
+ }
84
+ ): Promise<void>
85
+ ```
86
+
87
+ The host must:
88
+
89
+ 1. Validate any application-specific constraints.
90
+ 2. Upsert by `article.id`, or enqueue an idempotent job keyed by `article.id`, so
91
+ repeated delivery cannot create duplicate content.
92
+ 3. Preserve `article.id` with the CMS record or queued job for later linkbacks
93
+ and updates.
94
+ 4. Store `article.content` as the rendered HTML body when processing the job.
95
+ 5. Apply the supplied slug, author, categories, sections, tags, language, and
96
+ CMS post type when the host supports them.
97
+ 6. Treat the requested action as draft unless `context.action === "publish"`.
98
+ 7. Before returning, await either durable CMS persistence or durable queue
99
+ acceptance. Do not acknowledge an in-memory, fire-and-forget task.
100
+ 8. Throw when persistence or durable queueing fails.
101
+
102
+ The draft/publish action normally arrives in the JSON body. The package also
103
+ supports the legacy query parameter. Do not read `article.action` directly when
104
+ deciding publication state; use the validated `context.action` value.
105
+
106
+ `onArticle` returns `void` or `Promise<void>`. It must not construct an HTTP
107
+ response. After the callback durably saves or queues the work, the package
108
+ returns:
109
+
110
+ ```json
111
+ {
112
+ "ok": true,
113
+ "status": "accepted",
114
+ "monokId": "the-article-id"
115
+ }
116
+ ```
117
+
118
+ This response acknowledges delivery only. It does not promise that a draft URL,
119
+ CMS record ID, thumbnail URL, or public canonical URL already exists. Custom CMS
120
+ implementations may render, moderate, deploy, or publish asynchronously.
121
+
122
+ Thrown errors become JSON error responses. An error with a numeric `status`
123
+ property uses that HTTP status; other errors return `500`.
124
+
125
+ ## Article payload
126
+
127
+ The important `MonokArticle` fields are:
128
+
129
+ ```ts
130
+ interface MonokArticle {
131
+ id: string | number;
132
+ title: string;
133
+ shortTitle?: string;
134
+ description?: string;
135
+ content?: string;
136
+ text?: string;
137
+ slug?: string;
138
+ action?: "draft" | "publish";
139
+ author?: { id: string | number; name: string };
140
+ categories?: Array<{ name: string; weight?: number }>;
141
+ sections?: string[];
142
+ tags?: string[] | null;
143
+ language?: string;
144
+ type?: string;
145
+ thumbnail?: string;
146
+ thumbImageData?: string;
147
+ thumbAlt?: string;
148
+ thumbImageDescription?: string;
149
+ keywords?: string[];
150
+ }
151
+ ```
152
+
153
+ Treat unknown additional fields as forward-compatible metadata. Do not reject a
154
+ payload merely because it contains fields added by a newer Monok version.
155
+
156
+ ## JPEG thumbnail handling
157
+
158
+ Monok sends `thumbImageData` as JPEG base64. It is normally raw base64, while a
159
+ legacy path can wrap it in `data:image/jpeg;base64,...`.
160
+
161
+ When `imageDir` is configured, call `await context.saveThumbImage()` to validate
162
+ and save it. The return value is the local `.jpg` path, or `undefined` when no
163
+ image directory or image data was provided. The default decoded-image limit is
164
+ 15 MiB and can be changed with `maxImageBytes`.
165
+
166
+ Saving a file is not the same as making it public. If the CMS has a media API or
167
+ object storage, the host may instead process `article.thumbImageData` itself.
168
+ Preserve `thumbAlt` or fall back to `thumbImageDescription`, then the title, for
169
+ accessible alt text.
170
+
171
+ Do not label the saved image as PNG and do not log its base64 data.
172
+
173
+ ## Site information
174
+
175
+ Implement `getSiteInfo` when Monok should offer real CMS authors, categories,
176
+ tags, post types, or languages. Return this shape:
177
+
178
+ ```ts
179
+ const info: SiteInfoInput = {
180
+ js_scripts: "Enabled",
181
+ name: "Site name",
182
+ logo: "https://example.com/logo.jpg",
183
+ categories: ["News", "Analysis"],
184
+ post_types: ["post", "page"],
185
+ tags: ["Technology", "Business"],
186
+ authors: [
187
+ {
188
+ id: "author-1",
189
+ name: "Jane Doe",
190
+ profile: "Editor",
191
+ avatar: "https://example.com/jane.jpg",
192
+ roles: ["editor"]
193
+ }
194
+ ],
195
+ languages: {
196
+ en: { name: "English", slug: "en", locale: "en_US" }
197
+ }
198
+ };
199
+ ```
200
+
201
+ Do not return `version` from `getSiteInfo`. The router always injects the
202
+ installed `@monok/server` package version into the `/info` response.
203
+
204
+ Return empty arrays when a supported collection has no entries. Values may be
205
+ loaded dynamically on every request. The router sends private no-cache headers.
206
+ If `getSiteInfo` is omitted, `/info` returns this authenticated fallback:
207
+
208
+ ```json
209
+ {
210
+ "js_scripts": "Disabled",
211
+ "version": "1.4.0",
212
+ "name": "Custom CMS",
213
+ "logo": "",
214
+ "categories": [],
215
+ "post_types": ["post"],
216
+ "tags": [],
217
+ "authors": []
218
+ }
219
+ ```
220
+
221
+ ## Article discovery with `/postfilter`
222
+
223
+ Implement `searchArticles` to expose published host content to Monok. The
224
+ callback receives normalized values:
225
+
226
+ ```ts
227
+ interface PostFilterQuery {
228
+ postType: string; // defaults to "post"
229
+ section?: string;
230
+ tag?: string;
231
+ query?: string;
232
+ amount: number; // defaults to 10
233
+ page: number; // defaults to 1
234
+ }
235
+ ```
236
+
237
+ Apply all supplied filters, return only published/public articles, and paginate
238
+ deterministically. Return an array using these exact snake-case keys:
239
+
240
+ ```ts
241
+ const result: PostFilterResult = {
242
+ canonical_url: "https://example.com/articles/example",
243
+ post_id: "cms-record-id",
244
+ title: "Example article",
245
+ description: "A short plain-text description"
246
+ };
247
+ ```
248
+
249
+ Return `[]` when nothing matches. `title` and `description` may be `null`.
250
+ Do not return drafts, private content, article bodies, credentials, or internal
251
+ metadata. If `searchArticles` is omitted, `/postfilter` returns `404`.
252
+
253
+ ## Authentication and cache behavior
254
+
255
+ The router performs authentication. The host should not duplicate it inside
256
+ callbacks.
257
+
258
+ - `/push` accepts Monok's `token` header, `X-API-Key`, or legacy `?apikey=`.
259
+ - `/info` and `/postfilter` accept `X-API-Key` or legacy `?apikey=`.
260
+ - Comparisons are timing-safe.
261
+ - `/info` and `/postfilter` responses include private no-cache headers.
262
+
263
+ Keep `MONOK_API_KEY` server-side. Never expose it to browser JavaScript, commit
264
+ it, include it in a URL shown to users, or log it. Prefer `X-API-Key` over query
265
+ authentication for custom calls because URLs are commonly logged by proxies.
266
+
267
+ ## Linkback after publication
268
+
269
+ When an article is actually published, notify Monok only after the public
270
+ canonical URL exists. This applies both to a draft published later and to an
271
+ asynchronous `action: "publish"` job:
272
+
273
+ ```ts
274
+ await sendMonokLinkback({
275
+ monokId: storedMonokId,
276
+ externalId: cmsArticleId,
277
+ url: canonicalUrl,
278
+ title,
279
+ thumbnailUrl: publicThumbnailUrl
280
+ }, {
281
+ apiKey: process.env.MONOK_API_KEY
282
+ });
283
+ ```
284
+
285
+ Call this from the host's real publication lifecycle, not merely when `/push`
286
+ returns or when a job enters a queue. The linkback is the authoritative signal
287
+ that publication completed and a canonical URL exists. A retry should be safe.
288
+ When useful, `externalId` is the stable article ID assigned by the host CMS; it
289
+ is optional because the canonical URL also identifies the publication. When
290
+ supplied, `thumbnailUrl` is the public thumbnail URL.
291
+
292
+ ## Verification checklist
293
+
294
+ Before declaring the integration complete, verify all applicable items:
295
+
296
+ - `GET /api/monok/info` returns `401` without a key.
297
+ - The same route succeeds with `X-API-Key` and with legacy `?apikey=`.
298
+ - Info responses contain `Cache-Control: no-store`.
299
+ - `POST /api/monok/push` accepts a body containing `action: "draft"`.
300
+ - A body containing `action: "publish"` is durably persisted or queued with the
301
+ requested publication intent.
302
+ - Successful pushes return `ok: true`, `status: "accepted"`, and the same
303
+ `monokId`, without requiring a canonical URL.
304
+ - Repeating the same `article.id` updates one record instead of duplicating it.
305
+ - Invalid action values return `400`.
306
+ - JPEG data saves as `.jpg`, and invalid or oversized image data is rejected.
307
+ - `/postfilter` applies search, type, section, tag, amount, and page filters.
308
+ - `/postfilter` returns exact `canonical_url`, `post_id`, `title`, and
309
+ `description` fields.
310
+ - Synchronous or asynchronous publication sends a linkback only after the public
311
+ canonical URL exists.
312
+ - The integration is reachable through its production HTTPS reverse proxy.
313
+
314
+ Do not claim completion based only on TypeScript compilation. Exercise the HTTP
315
+ routes and confirm one durable draft or draft job, one publication or publication
316
+ job, one repeated delivery, and one discovery query against the host
317
+ application's persistence layer. For asynchronous publishing, also complete one
318
+ job and verify its eventual linkback.
package/README.md CHANGED
@@ -5,6 +5,9 @@
5
5
  Monok server integration helpers for Node.js/Express.
6
6
  Easily connect your backend to Monok to receive articles, expose site info, and send linkbacks.
7
7
 
8
+ Using an AI coding assistant? Give it [`AGENTS.md`](./AGENTS.md). The guide contains
9
+ the complete host-implementation contract, response shapes, and verification checklist.
10
+
8
11
  ---
9
12
 
10
13
  ## ⚡ Quick Start
@@ -16,7 +19,7 @@ import { createMonokRouter, type MonokArticle } from "@monok/server";
16
19
  const app = express();
17
20
 
18
21
  app.use(
19
- "/monok",
22
+ "/api/monok",
20
23
  createMonokRouter({
21
24
  apiKey: process.env.MONOK_API_KEY!,
22
25
  onArticle: async (article: MonokArticle, { saveThumbImage, action }) => {
@@ -59,19 +62,21 @@ import {
59
62
  const app = express();
60
63
 
61
64
  app.use(
62
- "/monok",
65
+ "/api/monok",
63
66
  createMonokRouter({
64
67
  apiKey: process.env.MONOK_API_KEY!,
65
68
  imageDir: "./uploads", // optional
66
69
  // Optional: provide site info if you want Monok to query it
67
70
  getSiteInfo: {
68
71
  js_scripts: "Enabled",
69
- version: "1.0.0",
70
72
  name: "My Site",
71
73
  logo: "https://example.com/logo.png",
72
74
  categories: ["Content", "News Articles", "Uncategorized"],
73
75
  post_types: ["post", "page"],
74
76
  tags: ["Tech", "Health", "News"],
77
+ languages: {
78
+ en: { name: "English", slug: "en", locale: "en_US" }
79
+ },
75
80
  authors: [
76
81
  {
77
82
  name: "Jane Doe",
@@ -82,6 +87,15 @@ app.use(
82
87
  }
83
88
  ]
84
89
  },
90
+ searchArticles: async ({ postType, section, tag, query, amount, page }) => {
91
+ // Search published content in your CMS and return the requested page.
92
+ return [{
93
+ canonical_url: "https://example.com/blog/an-article",
94
+ post_id: "cms-123",
95
+ title: "An article",
96
+ description: "Article summary"
97
+ }];
98
+ },
85
99
  onArticle: async (article: MonokArticle, { saveThumbImage, action }) => {
86
100
  const imagePath = await saveThumbImage();
87
101
  console.log("Received article:", article.title);
@@ -95,9 +109,9 @@ app.use(
95
109
  // when you publish later, notify Monok:
96
110
  // await sendMonokLinkback({
97
111
  // monokId: article.id,
98
- // publicUrl: "https://example.com/blog/" + (article.slug ?? article.id),
112
+ // externalId: savedArticle.id,
113
+ // url: "https://example.com/blog/" + (article.slug ?? article.id),
99
114
  // title: article.title,
100
- // articleTextSample: article.text?.slice(0, 500),
101
115
  // thumbnailUrl: imagePath
102
116
  // ? "https://example.com/uploads/" + require("path").basename(imagePath)
103
117
  // : undefined
@@ -118,7 +132,7 @@ const { createMonokRouter } = require("@monok/server");
118
132
  const app = express();
119
133
 
120
134
  app.use(
121
- "/monok",
135
+ "/api/monok",
122
136
  createMonokRouter({
123
137
  apiKey: process.env.MONOK_API_KEY,
124
138
  onArticle: async (article, { saveThumbImage, action }) => {
@@ -141,29 +155,56 @@ app.listen(3000);
141
155
 
142
156
  ## 🔑 Endpoints
143
157
 
144
- * **`POST /monok/push[?action=draft|publish]`**
158
+ Mounting the router at `/api/monok` uses Monok's default API base. A custom or
159
+ versioned base is also supported, for example:
160
+
161
+ ```ts
162
+ app.use("/something/specialAPI/monok", createMonokRouter({ /* ... */ }));
163
+ ```
164
+
165
+ Enter that complete base URL when connecting the integration in Monok. Monok
166
+ appends `/info`, `/push`, and `/postfilter` to the configured base.
167
+
168
+ * **`POST /api/monok/push`**
145
169
  Monok pushes new article data here.
146
170
  Header: `token: <your-api-key>`
147
171
  Body: JSON payload of the article.
148
172
 
149
- * `action` query param may be `draft` or `publish` depending on GUI dropdown selection.
173
+ * `action` is read from the JSON body and may be `draft` or `publish`.
174
+ * A legacy `?action=draft|publish` query parameter is also accepted.
175
+ * After `onArticle` durably saves or queues the work, the route acknowledges
176
+ it with `{ "ok": true, "status": "accepted", "monokId": "..." }`. This
177
+ does not claim that asynchronous publication has completed.
178
+
179
+ * **`GET /api/monok/info`**
180
+ Monok fetches this to authenticate and learn your site branding, categories, tags, and authors.
181
+ If `getSiteInfo` is not provided, the route remains available and returns a
182
+ minimal `Custom CMS` response with empty metadata collections.
150
183
 
151
- * **`GET /monok/info?apikey=<your-api-key>`**
152
- If `getSiteInfo` is configured, Monok fetches this to learn your site branding, categories, tags, and authors.
153
- If `getSiteInfo` is not provided, this route responds with `404`.
184
+ * **`GET /api/monok/postfilter`**
185
+ If `searchArticles` is configured, Monok uses this route to search published
186
+ content. Supported parameters are `post_type`, `section`, `tag`, `q`, `amount`,
187
+ and `page`. If it is not configured, the route responds with `404`.
188
+
189
+ `GET /info` and `GET /postfilter` accept the API key in the `X-API-Key` header
190
+ (preferred) or the legacy `?apikey=` query parameter. Their responses include
191
+ private no-cache headers. `POST /push` also accepts Monok's `token` header.
154
192
 
155
193
  ---
156
194
 
157
195
  ## 🔗 Linkback after publishing
158
196
 
197
+ The push acknowledgement confirms delivery only. If publication is asynchronous,
198
+ send the linkback later, after the public canonical URL actually exists.
199
+
159
200
  ```ts
160
201
  import { sendMonokLinkback } from "@monok/server";
161
202
 
162
203
  await sendMonokLinkback({
163
204
  monokId: article.id,
164
- publicUrl: "https://example.com/blog/" + (article.slug ?? article.id),
205
+ externalId: cmsArticle.id,
206
+ url: "https://example.com/blog/" + (article.slug ?? article.id),
165
207
  title: article.title,
166
- articleTextSample: article.text?.slice(0, 500),
167
208
  thumbnailUrl: "https://example.com/uploads/" + imageFile
168
209
  });
169
210
  ```
@@ -176,8 +217,10 @@ await sendMonokLinkback({
176
217
  | ------------- | ----------------------------------------- | -------- | --------------------------------------------------------------------------------- |
177
218
  | `apiKey` | `string` | ✅ | Token Monok sends in headers / query. |
178
219
  | `onArticle` | `(article, ctx) => void \| Promise<void>` | ✅ | Handle new article pushes. `ctx` includes `saveThumbImage` and optional `action`. |
179
- | `getSiteInfo` | `SiteInfo \| () => SiteInfo` | ❌ | Return site info in the Monok format. If omitted, `GET /info` responds 404. |
180
- | `imageDir` | `string` | ❌ | Directory to save `thumbImageData`. |
220
+ | `getSiteInfo` | `SiteInfoInput \| () => SiteInfoInput` | ❌ | Return host metadata; the router injects its package version. A minimal fallback is used when omitted. |
221
+ | `searchArticles` | `(query) => PostFilterResult[]` | ❌ | Enables authenticated article discovery through `GET /postfilter`. |
222
+ | `imageDir` | `string` | ❌ | Directory in which validated JPEG thumbnails are saved. |
223
+ | `maxImageBytes` | `number` | ❌ | Maximum decoded JPEG size; defaults to 15 MiB. |
181
224
  | `basePath` | `string` | ❌ | Custom prefix for routes (default ""). |
182
225
 
183
226
  ---
package/dist/client.d.ts CHANGED
@@ -2,8 +2,8 @@ import type { LinkbackPayload } from "./types.js";
2
2
  /**
3
3
  * Send a linkback to Monok after you publish the article.
4
4
  */
5
- export declare function sendMonokLinkback({ monokId, publicUrl, title, articleTextSample, thumbnailUrl }: LinkbackPayload, opts?: {
5
+ export declare function sendMonokLinkback({ monokId, externalId, url, title, thumbnailUrl }: LinkbackPayload, opts?: {
6
6
  monokBaseUrl?: string;
7
- userId?: string;
7
+ apiKey?: string;
8
8
  }): Promise<void>;
9
9
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAsB,EAAE,YAAY,EAAE,EAAE,eAAe,EACpF,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,IAAI,CAAC,CAqBf"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,eAAe,EAClE,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
package/dist/client.js CHANGED
@@ -2,19 +2,24 @@ import fetch from "node-fetch";
2
2
  /**
3
3
  * Send a linkback to Monok after you publish the article.
4
4
  */
5
- export async function sendMonokLinkback({ monokId, publicUrl, title, articleTextSample = "", thumbnailUrl }, opts) {
6
- const endpoint = (opts?.monokBaseUrl ?? "https://monok.news") + "/api/v1/linkback";
5
+ export async function sendMonokLinkback({ monokId, externalId, url, title, thumbnailUrl }, opts) {
6
+ const endpoint = (opts?.monokBaseUrl ?? "https://www.monok.com") + "/api/v1/linkback";
7
7
  const payload = {
8
- puff: { title, article: articleTextSample },
8
+ puff: { title },
9
9
  id: monokId,
10
- url: publicUrl,
11
- source: new URL(publicUrl).hostname,
12
- userId: opts?.userId ?? new URL(publicUrl).hostname + "-CUSTOM",
10
+ ...(externalId !== undefined && externalId !== null
11
+ ? { externalId: String(externalId) }
12
+ : {}),
13
+ url,
14
+ source: new URL(url).hostname,
13
15
  ...(thumbnailUrl ? { thumbnail: thumbnailUrl } : {})
14
16
  };
15
17
  const resp = await fetch(endpoint, {
16
18
  method: "POST",
17
- headers: { "Content-Type": "application/json" },
19
+ headers: {
20
+ "Content-Type": "application/json",
21
+ ...(opts?.apiKey ? { "x-api-key": opts.apiKey } : {})
22
+ },
18
23
  body: JSON.stringify(payload)
19
24
  });
20
25
  if (!resp.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,GAAG,EAAE,EAAE,YAAY,EAAmB,EACpF,IAAiD;IAEjD,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,oBAAoB,CAAC,GAAG,kBAAkB,CAAC;IACnF,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE;QAC3C,EAAE,EAAE,OAAO;QACX,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ;QACnC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,GAAG,SAAS;QAC/D,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACjC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAmB,EAClE,IAAiD;IAEjD,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,uBAAuB,CAAC,GAAG,kBAAkB,CAAC;IACtF,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,EAAE,KAAK,EAAE;QACf,EAAE,EAAE,OAAO;QACX,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;YACjD,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG;QACH,MAAM,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;QAC7B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACjC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwD,MAAM,SAAS,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAA0B,MAAM,YAAY,CAAC;AAG9E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgDnE"}
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwD,MAAM,SAAS,CAAC;AAEvF,OAAO,KAAK,EACV,mBAAmB,EAKpB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAmFnE"}