ugly-app 0.1.44 → 0.1.45

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 (103) hide show
  1. package/README.md +141 -111
  2. package/dist/cli/initDb.d.ts.map +1 -1
  3. package/dist/cli/initDb.js +33 -1
  4. package/dist/cli/initDb.js.map +1 -1
  5. package/dist/cli/scaffold.d.ts.map +1 -1
  6. package/dist/cli/scaffold.js +6 -2
  7. package/dist/cli/scaffold.js.map +1 -1
  8. package/dist/cli/uglyBotLogin.d.ts.map +1 -1
  9. package/dist/cli/uglyBotLogin.js.map +1 -1
  10. package/dist/cli/upgrade.d.ts.map +1 -1
  11. package/dist/cli/upgrade.js +5 -5
  12. package/dist/cli/upgrade.js.map +1 -1
  13. package/dist/client/Logger.d.ts +11 -0
  14. package/dist/client/Logger.d.ts.map +1 -1
  15. package/dist/client/Logger.js +82 -22
  16. package/dist/client/Logger.js.map +1 -1
  17. package/dist/client/Router.d.ts +5 -3
  18. package/dist/client/Router.d.ts.map +1 -1
  19. package/dist/client/Router.js +25 -10
  20. package/dist/client/Router.js.map +1 -1
  21. package/dist/client/callAI.d.ts.map +1 -1
  22. package/dist/client/callAI.js +2 -3
  23. package/dist/client/callAI.js.map +1 -1
  24. package/dist/client/createHttpClient.d.ts +13 -0
  25. package/dist/client/createHttpClient.d.ts.map +1 -0
  26. package/dist/client/createHttpClient.js +24 -0
  27. package/dist/client/createHttpClient.js.map +1 -0
  28. package/dist/client/createSocket.d.ts +1 -3
  29. package/dist/client/createSocket.d.ts.map +1 -1
  30. package/dist/client/createSocket.js +0 -11
  31. package/dist/client/createSocket.js.map +1 -1
  32. package/dist/client/index.d.ts +4 -2
  33. package/dist/client/index.d.ts.map +1 -1
  34. package/dist/client/index.js +2 -1
  35. package/dist/client/index.js.map +1 -1
  36. package/dist/server/App.d.ts +4 -4
  37. package/dist/server/App.d.ts.map +1 -1
  38. package/dist/server/App.js +54 -14
  39. package/dist/server/App.js.map +1 -1
  40. package/dist/server/Auth.d.ts.map +1 -1
  41. package/dist/server/Auth.js +14 -11
  42. package/dist/server/Auth.js.map +1 -1
  43. package/dist/server/ErrorLogAdmin.d.ts +50 -0
  44. package/dist/server/ErrorLogAdmin.d.ts.map +1 -0
  45. package/dist/server/ErrorLogAdmin.js +143 -0
  46. package/dist/server/ErrorLogAdmin.js.map +1 -0
  47. package/dist/server/FeedbackReport.d.ts +2 -3
  48. package/dist/server/FeedbackReport.d.ts.map +1 -1
  49. package/dist/server/FeedbackReport.js +4 -5
  50. package/dist/server/FeedbackReport.js.map +1 -1
  51. package/dist/server/Logging.d.ts +6 -0
  52. package/dist/server/Logging.d.ts.map +1 -1
  53. package/dist/server/Logging.js +97 -45
  54. package/dist/server/Logging.js.map +1 -1
  55. package/dist/server/Router.d.ts +12 -25
  56. package/dist/server/Router.d.ts.map +1 -1
  57. package/dist/server/Router.js +66 -48
  58. package/dist/server/Router.js.map +1 -1
  59. package/dist/server/Socket.d.ts.map +1 -1
  60. package/dist/server/Socket.js +3 -1
  61. package/dist/server/Socket.js.map +1 -1
  62. package/dist/server/index.d.ts +6 -4
  63. package/dist/server/index.d.ts.map +1 -1
  64. package/dist/server/index.js +3 -2
  65. package/dist/server/index.js.map +1 -1
  66. package/dist/shared/Api.d.ts +18 -20
  67. package/dist/shared/Api.d.ts.map +1 -1
  68. package/dist/shared/Api.js +9 -9
  69. package/dist/shared/Api.js.map +1 -1
  70. package/dist/shared/DB.d.ts +29 -8
  71. package/dist/shared/DB.d.ts.map +1 -1
  72. package/dist/shared/DB.js.map +1 -1
  73. package/dist/shared/Socket.d.ts +4 -6
  74. package/dist/shared/Socket.d.ts.map +1 -1
  75. package/package.json +1 -1
  76. package/templates/CLAUDE.md +26 -7
  77. package/templates/client/App.tsx +1 -1
  78. package/templates/client/allPages.ts +12 -1
  79. package/templates/client/main.tsx +3 -3
  80. package/templates/client/pages/AITestPage.tsx +27 -10
  81. package/templates/client/pages/AuthDemoPage.tsx +34 -9
  82. package/templates/client/pages/HomePage.tsx +51 -14
  83. package/templates/client/pages/UserPage.tsx +5 -1
  84. package/templates/package.json +1 -1
  85. package/templates/server/index.ts +16 -26
  86. package/templates/shared/api.ts +22 -16
  87. package/templates/shared/collections.ts +43 -2
  88. package/templates/shared/pages.ts +12 -0
  89. package/templates/vite.config.ts +1 -0
  90. package/templates/shared/dbIndexes.ts +0 -11
  91. package/templates/shared/types.ts +0 -6
  92. /package/templates/.claude/skills/{assets.md → assets/SKILL.md} +0 -0
  93. /package/templates/.claude/skills/{check-errors.md → check-errors/SKILL.md} +0 -0
  94. /package/templates/.claude/skills/{check-feedback.md → check-feedback/SKILL.md} +0 -0
  95. /package/templates/.claude/skills/{check-perf.md → check-perf/SKILL.md} +0 -0
  96. /package/templates/.claude/skills/{create-test-users.md → create-test-users/SKILL.md} +0 -0
  97. /package/templates/.claude/skills/{extend-api.md → extend-api/SKILL.md} +0 -0
  98. /package/templates/.claude/skills/{fix-code.md → fix-code/SKILL.md} +0 -0
  99. /package/templates/.claude/skills/{fix-errors.md → fix-errors/SKILL.md} +0 -0
  100. /package/templates/.claude/skills/{fix-feedback.md → fix-feedback/SKILL.md} +0 -0
  101. /package/templates/.claude/skills/{fix-perf.md → fix-perf/SKILL.md} +0 -0
  102. /package/templates/.claude/skills/{uploads.md → uploads/SKILL.md} +0 -0
  103. /package/templates/.claude/skills/{use-ai.md → use-ai/SKILL.md} +0 -0
package/README.md CHANGED
@@ -33,41 +33,39 @@ import {
33
33
  createApp,
34
34
  createUserHelper,
35
35
  getFeedbackHandlers,
36
- type CallHandlers,
36
+ type AppConfigurator,
37
37
  type RequestHandlers,
38
- type HandlerContext,
39
38
  } from 'ugly-app';
40
39
  import { dbDefaults } from 'ugly-app/shared';
41
- import { functions, requests } from '../shared/api';
40
+ import { requests } from '../shared/api';
42
41
  import { collections } from '../shared/collections';
43
42
  import { pages } from '../shared/pages';
44
- import type { User } from '../shared/types';
43
+ import type { User } from '../shared/collections';
45
44
 
46
45
  const userHelper = createUserHelper<User>(collections.user);
47
-
48
- const calls = {
49
- ...getFeedbackHandlers(maintainBotUserId),
50
- myFunction: async (ctx: HandlerContext, input) => {
51
- return { greeting: `Hello, ${input.name}` };
52
- },
53
- } satisfies CallHandlers<typeof functions>;
54
-
55
- const reqs = {
56
- getMe: async (ctx: HandlerContext) => {
57
- const user = await userHelper.get(ctx.db, ctx.userId);
58
- return { userId: ctx.userId, email: user?.email };
46
+ const maintainBotUserId = process.env.MAINTAIN_BOT_USER_ID ?? '';
47
+
48
+ const app = createApp(
49
+ { requests },
50
+ {
51
+ ...getFeedbackHandlers(maintainBotUserId),
52
+ getMe: async (userId: string) => {
53
+ const user = await userHelper.get(app.db, userId);
54
+ return { userId, email: user?.email, phone: user?.phone };
55
+ },
56
+ } satisfies RequestHandlers<typeof requests>,
57
+ collections,
58
+ (configurator: AppConfigurator) => {
59
+ configurator.setPages({ pages });
60
+ configurator.setUserHelper(userHelper);
61
+ configurator.setOnUserCreate(async (userId, info, db) => {
62
+ await userHelper.set(db, { id: userId, ...dbDefaults(), ...info });
63
+ });
59
64
  },
60
- } satisfies RequestHandlers<typeof requests>;
65
+ );
61
66
 
62
- const app = createApp({ functions, requests }, calls, reqs, collections, (configurator) => {
63
- configurator.setPages({ pages });
64
- configurator.setUserHelper(userHelper);
65
- configurator.setOnUserCreate(async (userId, info, db) => {
66
- await userHelper.set(db, { id: userId, ...dbDefaults(), ...info });
67
- });
68
- });
69
-
70
- await app.start(3000);
67
+ const port = parseInt(process.env['PORT'] ?? '3000');
68
+ await app.start(port);
71
69
  ```
72
70
 
73
71
  **Signature:**
@@ -75,7 +73,6 @@ await app.start(3000);
75
73
  ```typescript
76
74
  function createApp<R extends AppRegistryBase, Defs extends CollectionDefRegistry>(
77
75
  registry: R,
78
- calls: Partial<CallHandlers<R['functions']>>,
79
76
  requests: Partial<RequestHandlers<R['requests']>>,
80
77
  appDefs: Defs,
81
78
  configure?: (configurator: AppConfigurator) => void,
@@ -86,7 +83,8 @@ The returned `App` object has:
86
83
  - `start(port?)` — starts the server (default port 3000)
87
84
  - `registerRoutes(fn)` — mount additional Express routes after creation
88
85
  - `httpServer` — the underlying Node.js HTTP server
89
- - `dispatch(type, name, input, userId)` invoke an RPC handler programmatically
86
+ - `db` the `TypedDB` instance for direct database access
87
+ - `dispatch(name, input, userId)` — invoke an RPC handler programmatically
90
88
 
91
89
  ### `AppConfigurator`
92
90
 
@@ -96,24 +94,23 @@ The returned `App` object has:
96
94
  | `setUserHelper(helper)` | User lookup for WebSocket auth handshake |
97
95
  | `setOnUserCreate(handler)` | Called on first login — must create the user record. `(userId, { email?, phone? }, db) => Promise<void>` |
98
96
  | `setAuth(provider)` | Custom `AuthProvider` (default: ugly.bot OAuth). Provider must implement `verify(code)` and `authUrl(origin)` |
99
- | `setContextExtensions(fn)` | Add fields to `HandlerContext` — `(base: HandlerContext) => Promise<E>` |
100
97
  | `setOnSocketMessage(handler)` | Handle raw WebSocket messages. Return `true` to consume, `false` to let the framework handle it |
101
98
  | `registerRoutes(fn)` | Mount custom Express routes — `(router: express.Router) => void` |
102
99
  | `setWorkerQueue(queue)` | Register a background worker queue with `start()` and `stop()` |
103
100
 
104
- ### Handler context (`ctx`)
101
+ ### Handler signatures
105
102
 
106
- Every RPC handler receives a `HandlerContext`:
103
+ Handlers are plain async functions — no context object, just `userId` and `input`:
107
104
 
108
- | Field | Type | Description |
109
- |-------|------|-------------|
110
- | `ctx.userId` | `string` | Authenticated user ID (always set) |
111
- | `ctx.db` | `TypedDB` | MongoDB client with typed collection methods |
112
- | `ctx.storage` | `StorageClient` | R2/S3 presigned uploads and public URLs |
113
- | `ctx.textGen` | `TextGenClient` | Text generation (see AI section) |
114
- | `ctx.imageGen` | `ImageGenClient` | Image generation |
115
- | `ctx.log` | `Logger` | Structured logging to MongoDB |
116
- | `ctx.rateLimit` | `RateLimiter` | Token-bucket rate limiting |
105
+ ```typescript
106
+ // req() — public, userId may be null
107
+ getPublicData: async (userId: string | null, input) => { ... }
108
+
109
+ // authReq() authenticated, 401 auto-enforced, userId always a string
110
+ getMe: async (userId: string, input) => { ... }
111
+ ```
112
+
113
+ Access `app.db`, storage, and AI clients directly via imports or the `app` object they are not injected into handlers.
117
114
 
118
115
  ---
119
116
 
@@ -121,31 +118,40 @@ Every RPC handler receives a `HandlerContext`:
121
118
 
122
119
  All type definitions live in `shared/` and are used by both server and client.
123
120
 
124
- ### Functions and requests (`shared/api.ts`)
121
+ ### Requests (`shared/api.ts`)
125
122
 
126
123
  ```typescript
127
- import { defineFunctions, defineRequests, fn, req, z } from 'ugly-app/shared';
124
+ import { authReq, defineRequests, req, z } from 'ugly-app/shared';
128
125
 
129
- export const functions = defineFunctions({
130
- createNote: fn({
131
- input: z.object({ title: z.string(), body: z.string() }),
132
- output: z.object({ id: z.string() }),
126
+ export const requests = defineRequests({
127
+ // Public request — handler receives (userId: string | null, input)
128
+ getPublicData: req({
129
+ input: z.object({ id: z.string() }),
130
+ output: z.object({ data: z.string() }),
133
131
  }),
134
- });
135
132
 
136
- export const requests = defineRequests({
137
- getNotes: req({
133
+ // Authenticated request handler receives (userId: string, input)
134
+ getMe: authReq({
138
135
  input: z.object({}),
139
- output: z.array(z.object({ id: z.string(), title: z.string() })),
136
+ output: z.object({ userId: z.string(), email: z.string().optional() }),
137
+ }),
138
+
139
+ // With rate limiting
140
+ submitFeedback: authReq({
141
+ input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),
142
+ output: z.object({ id: z.string() }),
143
+ rateLimit: { max: 20, window: 60 },
140
144
  }),
141
145
  });
142
146
  ```
143
147
 
144
- - `fn({ input, output })` — defines a mutation (write operation). `input` and `output` are Zod schemas.
145
- - `req({ input, output })` — defines a query (read operation).
146
- - `defineFunctions()` / `defineRequests()` — identity wrappers that preserve types. `defineCalls` is an alias for `defineFunctions`.
148
+ - `req({ input, output })` — defines a public request. Handler signature: `(userId: string | null, input: I) => Promise<O>`.
149
+ - `authReq({ input, output })` — defines an authenticated request. Handler signature: `(userId: string, input: I) => Promise<O>`. Returns 401 automatically if no token.
150
+ - `defineRequests()` — identity wrapper that preserves types.
147
151
  - `z` is re-exported from Zod for convenience.
148
152
 
153
+ Every endpoint is accessible via both WebSocket (`socket.request(name, input)`) and HTTP (`POST /api/:name { input }`).
154
+
149
155
  ### Collections (`shared/collections.ts`)
150
156
 
151
157
  ```typescript
@@ -203,11 +209,11 @@ export type AppPages = typeof pages;
203
209
  ```tsx
204
210
  import { createRoot } from 'react-dom/client';
205
211
  import { AppProvider, createSocket, LoginPopup } from 'ugly-app/client';
206
- import { functions, requests } from '../shared/api';
212
+ import { requests } from '../shared/api';
207
213
  import { RouterProvider } from './router';
208
214
  import App from './App';
209
215
 
210
- const token = (window as any).__AUTH_TOKEN__;
216
+ const token = (window as unknown as { __AUTH_TOKEN__?: string }).__AUTH_TOKEN__;
211
217
  const root = createRoot(document.getElementById('root')!);
212
218
  const loginPopup = <LoginPopup onSuccess={() => window.location.reload()} />;
213
219
 
@@ -219,7 +225,7 @@ if (!token) {
219
225
  );
220
226
  } else {
221
227
  const userId = JSON.parse(atob(token.split('.')[1]!)).sub as string;
222
- const socket = createSocket({ functions, requests, url: '/rpc' });
228
+ const socket = createSocket({ requests, url: '/rpc' });
223
229
  socket.connect(token).then((user) => {
224
230
  root.render(
225
231
  <RouterProvider fallback={<div>404</div>} loginFallback={loginPopup} isAuthenticated={() => true}>
@@ -237,7 +243,7 @@ if (!token) {
237
243
  Creates a typed WebSocket client for RPC communication.
238
244
 
239
245
  ```typescript
240
- const socket = createSocket({ functions, requests, url: '/rpc' });
246
+ const socket = createSocket({ requests, url: '/rpc' });
241
247
  await socket.connect(token); // returns UserBase
242
248
  ```
243
249
 
@@ -246,14 +252,30 @@ await socket.connect(token); // returns UserBase
246
252
  | Method | Description |
247
253
  |--------|-------------|
248
254
  | `connect(token)` | Authenticate and connect. Returns the user object |
249
- | `call(name, input)` | Invoke a function (mutation) |
250
- | `request(name, input)` | Invoke a request (query) |
255
+ | `request(name, input)` | Invoke a request (query or mutation) |
251
256
  | `getDoc(collection, id)` | Fetch a single document |
252
257
  | `trackDoc(collection, id, cb)` | Subscribe to real-time doc changes. Returns unsubscribe fn |
253
258
  | `trackDocs(collection, filter, cb, opts?)` | Subscribe to query results. Returns unsubscribe fn |
254
259
  | `uploadFile(file, key)` | Upload a file via presigned URL |
255
260
  | `disconnect()` | Close the connection |
256
261
 
262
+ ### `createHttpClient()`
263
+
264
+ Creates a typed HTTP client for RPC communication (no WebSocket needed).
265
+
266
+ ```typescript
267
+ import { createHttpClient } from 'ugly-app/client';
268
+
269
+ const client = createHttpClient({ requests, token: 'eyJ...', baseUrl: '' });
270
+ const result = await client.request('getMe', {});
271
+ ```
272
+
273
+ | Option | Description |
274
+ |--------|-------------|
275
+ | `requests` | The requests registry from `shared/api.ts` |
276
+ | `token?` | Bearer token for authenticated requests |
277
+ | `baseUrl?` | URL prefix (default: `''` — relative paths: `POST /api/:name`) |
278
+
257
279
  ### `AppProvider`
258
280
 
259
281
  Wraps your app with context for `useApp()`. Provides user info, socket access, popup management, async loading overlay, splash screen, and localization.
@@ -303,7 +325,7 @@ export const { RouterProvider, RouterView, useRouter } = createRouter({ pages, a
303
325
 
304
326
  `createRouter()` returns three things:
305
327
  - **`RouterProvider`** — wrap your app. Props: `children`, `fallback?` (shown before first route resolves), `loginFallback?` (shown for auth-guarded pages when unauthenticated), `isAuthenticated?` (function returning boolean)
306
- - **`RouterView`** — renders the active page with animated transitions. Props: `durationMs?`, `easing?`, `transitionComponent?`
328
+ - **`RouterView`** — renders the active page with animated transitions. Props: `durationMs?`, `easing?`, `transitionComponent?`, `renderPage?`
307
329
  - **`useRouter()`** — hook returning the router context
308
330
 
309
331
  #### Page map (`client/allPages.ts`)
@@ -479,57 +501,59 @@ configurator.setAuth({
479
501
 
480
502
  ## Database (`TypedDB`)
481
503
 
504
+ Access via `app.db` or by importing `createTypedDB` / `getMongoClient` from `'ugly-app'`.
505
+
482
506
  ### Writing
483
507
 
484
508
  ```typescript
485
509
  // Insert or replace a document
486
- await ctx.db.setDoc(collections.note, doc);
487
- await ctx.db.setDoc(collections.note, doc, { skipIfExists: true });
510
+ await db.setDoc(collections.note, doc);
511
+ await db.setDoc(collections.note, doc, { skipIfExists: true });
488
512
 
489
513
  // Partial update — only specified fields (supports dot-notation paths)
490
- await ctx.db.setDocFields(collections.note, id, { title: 'New title' });
514
+ await db.setDocFields(collections.note, id, { title: 'New title' });
491
515
 
492
516
  // Partial update — returns null if document doesn't exist (no error)
493
- const doc = await ctx.db.setDocFieldsOrIgnore(collections.note, id, { title });
517
+ const doc = await db.setDocFieldsOrIgnore(collections.note, id, { title });
494
518
 
495
519
  // Partial update — creates the document if it doesn't exist (obj = default doc for insert)
496
- await ctx.db.setDocFieldsOrCreate(collections.note, id, { title }, defaultDoc);
520
+ await db.setDocFieldsOrCreate(collections.note, id, { title }, defaultDoc);
497
521
 
498
522
  // MongoDB update operators ($inc, $addToSet, $pull, $unset, $set)
499
- await ctx.db.setDocOp(collections.note, id, { $inc: { views: 1 } });
500
- await ctx.db.setDocOpOrIgnore(collections.note, id, { $inc: { views: 1 } }); // no error if missing
523
+ await db.setDocOp(collections.note, id, { $inc: { views: 1 } });
524
+ await db.setDocOpOrIgnore(collections.note, id, { $inc: { views: 1 } }); // no error if missing
501
525
  ```
502
526
 
503
527
  ### Reading
504
528
 
505
529
  ```typescript
506
- const note = await ctx.db.getDoc(collections.note, id);
507
- const notes = await ctx.db.getDocs(collections.note, { userId }, { sort: { created: -1 }, limit: 20 });
530
+ const note = await db.getDoc(collections.note, id);
531
+ const notes = await db.getDocs(collections.note, { userId }, { sort: { created: -1 }, limit: 20 });
508
532
 
509
533
  // Aggregation pipeline
510
- const results = await ctx.db.getQuery<MyResult>('note', pipeline, { skip, limit });
511
- const count = await ctx.db.getQueryCount('note', pipeline);
512
- const raw = await ctx.db.getQueryRaw<T>('note', pipeline);
534
+ const results = await db.getQuery<MyResult>('note', pipeline, { skip, limit });
535
+ const count = await db.getQueryCount('note', pipeline);
536
+ const raw = await db.getQueryRaw<T>('note', pipeline);
513
537
 
514
538
  // Dynamic/untyped access (when collection name is a runtime string)
515
- const doc = await ctx.db.rawGetDoc(collectionName, id);
516
- const docs = await ctx.db.rawGetDocs(collectionName, filter);
539
+ const doc = await db.rawGetDoc(collectionName, id);
540
+ const docs = await db.rawGetDocs(collectionName, filter);
517
541
  ```
518
542
 
519
543
  ### Deleting
520
544
 
521
545
  ```typescript
522
- await ctx.db.deleteDoc(collections.note, id); // single doc (cascades via parent)
523
- await ctx.db.deleteQuery(collections.note, { userId }); // bulk delete by filter
546
+ await db.deleteDoc(collections.note, id); // single doc (cascades via parent)
547
+ await db.deleteQuery(collections.note, { userId }); // bulk delete by filter
524
548
  ```
525
549
 
526
550
  ### Caching
527
551
 
528
552
  ```typescript
529
- const cached = await ctx.db.cacheGet<MyType>(key);
530
- await ctx.db.cacheSet(key, value, ttlMs);
531
- await ctx.db.cacheDelete(key);
532
- const key = ctx.db.cacheKey('prefix', id); // generate a cache key
553
+ const cached = db.cacheGet<MyType>(key);
554
+ db.cacheSet(key, value, ttlMs);
555
+ db.cacheDelete(key);
556
+ const key = db.cacheKey('prefix', id); // generate a cache key
533
557
  ```
534
558
 
535
559
  ### Helpers
@@ -554,15 +578,21 @@ await userHelper.set(db, { id: userId, ...dbDefaults(), email });
554
578
  import { defineDbIndexes } from 'ugly-app/shared';
555
579
 
556
580
  export const dbIndexes = defineDbIndexes({
557
- note: [
558
- { key: { userId: 1, created: -1 } },
559
- { key: { title: 'text' }, type: 'search' },
560
- ],
581
+ note: {
582
+ indexes: [
583
+ { fields: { userId: 1, created: -1 } },
584
+ { fields: { title: 1 }, unique: true },
585
+ ],
586
+ searchIndexes: [
587
+ { name: 'note_search', fields: { title: 'string', body: 'string' } },
588
+ ],
589
+ vectorIndexes: [
590
+ { name: 'note_embedding', field: 'embedding', dimensions: 1536, similarity: 'cosine' },
591
+ ],
592
+ },
561
593
  });
562
594
  ```
563
595
 
564
- Index types supported: standard (`IndexDef`), text search (`SearchIndexDef`), and vector/embedding (`VectorIndexDef` with cosine, euclidean, or dotProduct similarity).
565
-
566
596
  Run `npm run db:init` to create/update indexes.
567
597
 
568
598
  ---
@@ -572,10 +602,12 @@ Run `npm run db:init` to create/update indexes.
572
602
  ### Text generation
573
603
 
574
604
  ```typescript
575
- // In a handler via ctx.textGen:
576
- const text = await ctx.textGen.generate(messages);
577
- const json = await ctx.textGen.generateJson(schema, messages); // Zod schema, retries on parse failure
578
- const result = await ctx.textGen.generateWithTools(messages, tools); // automatic tool-call loop
605
+ import { createTextGenClient } from 'ugly-app';
606
+ const textGen = createTextGenClient();
607
+
608
+ const text = await textGen.generate(messages);
609
+ const json = await textGen.generateJson(schema, messages); // Zod schema, retries on parse failure
610
+ const result = await textGen.generateWithTools(messages, tools); // automatic tool-call loop
579
611
  ```
580
612
 
581
613
  | Provider | `provider` value | JSON | Tools | Vision |
@@ -589,17 +621,13 @@ const result = await ctx.textGen.generateWithTools(messages, tools); // automati
589
621
 
590
622
  Use `provider: 'auto'` (default) to let the system pick based on requirements.
591
623
 
592
- **Standalone client (outside handlers):**
593
-
594
- ```typescript
595
- import { createTextGenClient } from 'ugly-app';
596
- const textGen = createTextGenClient();
597
- ```
598
-
599
624
  ### Image generation
600
625
 
601
626
  ```typescript
602
- const url = await ctx.imageGen.generate(prompt, { width: 1024, height: 1024 });
627
+ import { createImageGenClient } from 'ugly-app';
628
+ const imageGen = createImageGenClient();
629
+
630
+ const url = await imageGen.generate(prompt, { width: 1024, height: 1024 });
603
631
  ```
604
632
 
605
633
  | Provider | `provider` value |
@@ -609,13 +637,6 @@ const url = await ctx.imageGen.generate(prompt, { width: 1024, height: 1024 });
609
637
  | Google (Imagen 3) | `'google'` |
610
638
  | Wavespeed | `'wavespeed'` |
611
639
 
612
- **Standalone client:**
613
-
614
- ```typescript
615
- import { createImageGenClient } from 'ugly-app';
616
- const imageGen = createImageGenClient();
617
- ```
618
-
619
640
  ### Embeddings
620
641
 
621
642
  ```typescript
@@ -652,9 +673,9 @@ The client can call AI through the server proxy without managing tokens directly
652
673
  ```typescript
653
674
  import { callTextGen, callJsonGen, callImageGen } from 'ugly-app/client';
654
675
 
655
- const text = await callTextGen(messages, options);
656
- const json = await callJsonGen(schema, messages);
657
- const image = await callImageGen(prompt, options);
676
+ const text = await callTextGen(input);
677
+ const json = await callJsonGen(input);
678
+ const image = await callImageGen(input);
658
679
  ```
659
680
 
660
681
  These call `POST /ai/request` (same-origin, avoids CORS). The server verifies the user JWT and forwards to `https://ugly.bot` using the `UGLY_BOT_TOKEN` env var.
@@ -765,11 +786,18 @@ Server-side, `getFeedbackHandlers(maintainBotUserId)` provides the RPC handlers
765
786
 
766
787
  ### Rate limiting
767
788
 
789
+ Rate limiting is configured per-endpoint in the request definition:
790
+
768
791
  ```typescript
769
- // Inside a handler — always call before expensive operations
770
- await ctx.rateLimit.check();
792
+ submitFeedback: authReq({
793
+ input: z.object({ ... }),
794
+ output: z.object({ ... }),
795
+ rateLimit: { max: 20, window: 60 }, // 20 requests per 60 seconds
796
+ })
771
797
  ```
772
798
 
799
+ The framework enforces rate limits automatically before calling the handler.
800
+
773
801
  ---
774
802
 
775
803
  ## Built-in endpoints
@@ -781,8 +809,10 @@ await ctx.rateLimit.check();
781
809
  | `POST /auth/logout` | Clear the auth cookie |
782
810
  | `GET /auth/token` | Refresh and return the current token |
783
811
  | `GET /auth/url` | Get the OAuth popup URL |
812
+ | `POST /api/:name` | RPC endpoint — dispatches any registered request handler |
784
813
  | `POST /ai/request` | AI proxy — forwards to ugly.bot (requires auth) |
785
814
  | `POST /api/client-error` | Client-side error capture |
815
+ | `POST /logs/client` | Client-side log ingestion |
786
816
  | `GET /my_feedback` | User feedback history (markdown, requires auth) |
787
817
 
788
818
  ---
@@ -831,7 +861,7 @@ Run with `npm run db:migrate`. Use `npm run db:migrate -- --status` to preview p
831
861
  | Variable | Description |
832
862
  |----------|-------------|
833
863
  | `JWT_SECRET` | **Required** — signs auth tokens |
834
- | `JWT_EXPIRY_SECONDS` | Token lifetime (optional) |
864
+ | `JWT_EXPIRY_SECONDS` | Token lifetime (optional, default: 2592000 = 30 days) |
835
865
  | `MONGODB_URI` | MongoDB connection string |
836
866
  | `PORT` | Server port (default: 3000) |
837
867
  | `NODE_ENV` | `development` or `production` |
@@ -1 +1 @@
1
- {"version":3,"file":"initDb.d.ts","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"AAgCA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG/C"}
1
+ {"version":3,"file":"initDb.d.ts","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"AAuCA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA6H/C"}
@@ -16,7 +16,14 @@ async function loadDbIndexes() {
16
16
  // Built-in indexes always applied
17
17
  const BUILTIN_INDEXES = {
18
18
  user: { indexes: [{ fields: { email: 1 }, unique: true }] },
19
- errorLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
19
+ errorLog: {
20
+ timeseries: {
21
+ timeField: 'created',
22
+ metaField: 'meta',
23
+ granularity: 'seconds',
24
+ expireAfterSeconds: 7 * 24 * 60 * 60, // 7 days
25
+ },
26
+ },
20
27
  consoleLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
21
28
  perfLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
22
29
  feedbackLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
@@ -38,6 +45,31 @@ export async function runInitDb() {
38
45
  }
39
46
  for (const [collection, config] of Object.entries(allIndexes)) {
40
47
  const col = db.collection(collection);
48
+ if (config.timeseries) {
49
+ try {
50
+ await db.createCollection(collection, {
51
+ timeseries: {
52
+ timeField: config.timeseries.timeField,
53
+ ...(config.timeseries.metaField
54
+ ? { metaField: config.timeseries.metaField }
55
+ : {}),
56
+ ...(config.timeseries.granularity
57
+ ? { granularity: config.timeseries.granularity }
58
+ : {}),
59
+ },
60
+ ...(config.timeseries.expireAfterSeconds !== undefined
61
+ ? { expireAfterSeconds: config.timeseries.expireAfterSeconds }
62
+ : {}),
63
+ });
64
+ console.log(`[init-db] Time-series collection created: ${collection}`);
65
+ }
66
+ catch (e) {
67
+ const err = e;
68
+ if (err.code !== 48)
69
+ throw e; // 48 = NamespaceExists (already exists)
70
+ console.log(`[init-db] Time-series collection already exists: ${collection}`);
71
+ }
72
+ }
41
73
  for (const idx of config.indexes ?? []) {
42
74
  const opts = {};
43
75
  if (idx.unique)
@@ -1 +1 @@
1
- {"version":3,"file":"initDb.js","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"initDb.js","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAyFA,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DxE"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AA6GA,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DxE"}
@@ -44,7 +44,9 @@ function findCodeCli() {
44
44
  execSync('code --version', { stdio: 'ignore' });
45
45
  return 'code';
46
46
  }
47
- catch { /* not in PATH */ }
47
+ catch {
48
+ /* not in PATH */
49
+ }
48
50
  const candidates = process.platform === 'win32'
49
51
  ? [
50
52
  path.join(process.env['LOCALAPPDATA'] ?? '', 'Programs\\Microsoft VS Code\\bin\\code.cmd'),
@@ -74,7 +76,9 @@ async function installVsixExtension() {
74
76
  throw new Error(`HTTP ${res.status}`);
75
77
  const buf = await res.arrayBuffer();
76
78
  await fs.writeFile(vsixPath, Buffer.from(buf));
77
- execSync(`${codeCli} --install-extension "${vsixPath}"`, { stdio: 'inherit' });
79
+ execSync(`${codeCli} --install-extension "${vsixPath}"`, {
80
+ stdio: 'inherit',
81
+ });
78
82
  console.log('[ugly-app] VSCode extension installed.');
79
83
  }
80
84
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uglyBotLogin.d.ts","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CA0EtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAKtB"}
1
+ {"version":3,"file":"uglyBotLogin.d.ts","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CA0EtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAMtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"uglyBotLogin.js","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAS,GAAG,kBAAkB;IAE9B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,6DAA6D;QAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEpD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;gBACjD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBACtD,MAAM,CACJ,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAClE,CAAC;gBACF,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,GAAG;iBACA,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;iBAC/C,GAAG,CACF,8EAA8E,CAC/E,CAAC;YACJ,MAAM,CAAC,KAAK,EAAE,CAAC;YAEf,MAAM,IAAI,GAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACvD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,SAAS,kBAAkB,IAAI,UAAU,KAAK,EAAE,CAAC;YAEpE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,0CAA0C,OAAO,IAAI,CAAC,CAAC;YAEnE,mDAAmD;YACnD,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC/C,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,SAAS,OAAO,GAAG;oBACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;wBAC9B,CAAC,CAAC,aAAa,OAAO,GAAG;wBACzB,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAS,GAAG,kBAAkB;IAE9B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"uglyBotLogin.js","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAS,GAAG,kBAAkB;IAE9B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,6DAA6D;QAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEpD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;gBACjD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBACtD,MAAM,CACJ,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAClE,CAAC;gBACF,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,GAAG;iBACA,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;iBAC/C,GAAG,CACF,8EAA8E,CAC/E,CAAC;YACJ,MAAM,CAAC,KAAK,EAAE,CAAC;YAEf,MAAM,IAAI,GAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACvD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,SAAS,kBAAkB,IAAI,UAAU,KAAK,EAAE,CAAC;YAEpE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,0CAA0C,OAAO,IAAI,CAAC,CAAC;YAEnE,mDAAmD;YACnD,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC/C,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,SAAS,OAAO,GAAG;oBACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;wBAC9B,CAAC,CAAC,aAAa,OAAO,GAAG;wBACzB,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAS,GAAG,kBAAkB;IAE9B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;QACxE,OAAO,QAAQ,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/upgrade.ts"],"names":[],"mappings":"AA4BA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgIhD"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/upgrade.ts"],"names":[],"mappings":"AA4BA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAqIhD"}